Commit 55b84803 authored by Markus Scheidgen's avatar Markus Scheidgen
Browse files

Merge branch 'encyclopedia-cleanup' into 'v1.0.0'

Cleaned up remaining Encyclopedia-specific functionality.

See merge request !462
parents 8238c1b3 70bc7af9
Pipeline #115869 passed with stages
in 25 minutes and 34 seconds
......@@ -182,9 +182,6 @@
path = dependencies/parsers/tinker
url = https://github.com/nomad-coe/nomad-parser-tinker.git
branch = master
[submodule "dependencies/encyclopedia-gui"]
path = dependencies/encyclopedia-gui
url = https://gitlab.mpcdf.mpg.de/nomad-lab/encyclopedia-gui.git
[submodule "dependencies/materia"]
path = gui/materia
url = https://github.com/nomad-coe/materia
......
......@@ -94,18 +94,6 @@ COPY --from=build /install/gui/src/toolkitMetadata.json /app/src/toolkitMetadata
COPY --from=build /install/gui/src/unitsData.js /app/src/unitsData.js
RUN yarn run build
# Copy all sources and assets to the GUI build image, build it there, and then
# slim down the contents before they are copied to the final image
RUN mkdir -p /encyclopedia
WORKDIR /encyclopedia
COPY dependencies/encyclopedia-gui/client /encyclopedia/
RUN npm install webpack webpack-cli
RUN npx webpack --mode=production
RUN rm -rf /encyclopedia/node_modules
RUN rm -rf /encyclopedia/src
RUN rm -f /encyclopedia/webpack.config.js
RUN rm -f /encyclopedia/.babelrc
# Third, create a slim final image
FROM final
RUN apt-get update && apt-get install -y --no-install-recommends libgomp1 && apt-get install -y libmagic-dev curl vim zip unzip
......@@ -122,11 +110,8 @@ COPY --from=build /usr/local/bin/nomad /usr/bin/nomad
# copy the gui
RUN mkdir -p /app/gui
COPY --from=gui_build /app/build /app/nomad/app/flask/static/gui
# copy the encyclopedia gui production code
COPY --from=gui_build /encyclopedia /app/nomad/app/flask/static/encyclopedia
# remove the developer config on the gui, will be generated by run.sh from nomad.yaml
RUN rm -f /app/nomad/app/flask/static/gui/env.js
RUN rm -f /app/nomad/app/flask/static/encyclopedia/conf.js
# build the python package dist
RUN python setup.py compile
RUN python setup.py sdist
......
Subproject commit d8d3d64dc8c7a25018fc5d3aedaa8a9d3b6509d3
Subproject commit 51e2d0d8d30d29f0399bd669aa7cfbb9f12aa94b
Subproject commit 37bbeed7974adda6c53089a9c6ea073dc14a4831
......@@ -3,6 +3,7 @@ window.nomadEnv = {
'keycloakRealm': 'fairdi_nomad_test',
'keycloakClientId': 'nomad_gui_dev',
'appBase': 'http://localhost:8000/fairdi/nomad/latest',
'encyclopediaBase': 'https://nomad-lab.eu/prod/rae/encyclopedia/#',
'debug': false,
'version': {
'label': '1.0.0',
......@@ -11,7 +12,6 @@ window.nomadEnv = {
'usesBetaData': true,
'officialUrl': 'https://nomad-lab.eu/prod/rae/gui'
},
'encyclopediaEnabled': false,
'aitoolkitEnabled': false,
'oasis': false,
'servicesUploadLimit': 10
......
......@@ -19,7 +19,7 @@ import React, { useLayoutEffect, useRef, useCallback, useEffect, useState } from
import { ReactComponent as AboutSvg } from '../images/about.svg'
import PropTypes from 'prop-types'
import Markdown from './Markdown'
import { appBase, debug, aitoolkitEnabled, encyclopediaEnabled } from '../config'
import { appBase, debug, aitoolkitEnabled, encyclopediaBase } from '../config'
import packageJson from '../../package.json'
import { Grid, Card, CardContent, Typography, makeStyles, Link, Dialog, DialogTitle, DialogContent, DialogActions, Button } from '@material-ui/core'
import { Link as RouterLink, useHistory } from 'react-router-dom'
......@@ -187,13 +187,11 @@ export default function About() {
makeClickable('upload', () => {
history.push('/upload')
})
makeClickable('encyclopedia', () => {
if (encyclopediaEnabled) {
window.location.href = `${appBase}/encyclopedia`
} else {
window.location.href = 'https://encyclopedia.nomad-coe.eu/gui/#/search'
}
})
if (encyclopediaBase) {
makeClickable('encyclopedia', () => {
window.location.href = encyclopediaBase
})
}
makeClickable('toolkit', () => {
if (aitoolkitEnabled) {
history.push('/aitoolkit/main')
......
......@@ -103,7 +103,7 @@ const UnitSelector = React.memo(({
// Ordered list of controllable units. It may be smaller than the full list of
// units.
const unitNames = ['energy', 'length', 'force', 'mass', 'time', 'temperature', 'pressure']
const unitNames = ['energy', 'length', 'force', 'mass', 'time', 'temperature', 'pressure', 'angle']
const systemNames = ['SI', 'AU']
return <>
......
......@@ -26,7 +26,7 @@ import Structure from '../../visualization/Structure'
import NoData from '../../visualization/NoData'
import searchQuantities from '../../../searchQuantities'
import { toMateriaStructure } from '../../../utils'
import { encyclopediaEnabled } from '../../../config'
import { encyclopediaBase } from '../../../config'
/**
* For displaying the most descriptive chemical formula that is present in an
......@@ -105,7 +105,8 @@ const MaterialCard = React.memo(({index, properties, archive}) => {
const materialId = index.results?.material?.material_id
const structurePath = `results.properties.structures.${structureType}`
const structureSection = archive?.results?.properties?.structures?.[structureType]
let structure = structureSection && toMateriaStructure(structureSection, structureType, `${urlPrefix}/${structureType}`)
const m_path = `${urlPrefix}/${structureType}`
let structure = structureSection && toMateriaStructure(structureSection)
const handleStructureChange = useCallback((event) => {
setStructureType(event.target.value)
......@@ -158,6 +159,8 @@ const MaterialCard = React.memo(({index, properties, archive}) => {
? <Structure
data={structure}
materialType={index.results?.material?.structural_type}
structureType={structureType.split('_').pop()}
m_path={m_path}
data-testid="viewer-material"
/>
: <NoData/>}
......@@ -201,7 +204,7 @@ const MaterialCard = React.memo(({index, properties, archive}) => {
: <NoData/>}
</PropertyItem>
</PropertyGrid>
{encyclopediaEnabled && materialId &&
{encyclopediaBase && materialId &&
<PropertyCardActions>
<MaterialButton materialId={materialId}>
View in Encyclopedia
......
......@@ -55,9 +55,9 @@ export function testLatticeParameters(index) {
expectQuantity('results.properties.structures.structure_original.lattice_parameters.a', '5 Å')
expectQuantity('results.properties.structures.structure_original.lattice_parameters.b', '5 Å')
expectQuantity('results.properties.structures.structure_original.lattice_parameters.c', '5 Å')
expectQuantity('results.properties.structures.structure_original.lattice_parameters.alpha', '0.9', 'α')
expectQuantity('results.properties.structures.structure_original.lattice_parameters.beta', '0.9', 'β')
expectQuantity('results.properties.structures.structure_original.lattice_parameters.gamma', '0.9', 'γ')
expectQuantity('results.properties.structures.structure_original.lattice_parameters.alpha', '90 °', 'α')
expectQuantity('results.properties.structures.structure_original.lattice_parameters.beta', '90 °', 'β')
expectQuantity('results.properties.structures.structure_original.lattice_parameters.gamma', '90 °', 'γ')
expectQuantity('results.properties.structures.structure_original.cell_volume', '125 Å ^ 3')
}
......
......@@ -33,7 +33,7 @@ import UserdataPage, { help as userdataHelp } from '../UserdataPage'
import APIs from '../APIs'
import SearchPageEntries, {help as searchEntriesHelp} from '../search/SearchPageEntries'
import SearchPageMaterials, {help as searchMaterialsHelp} from '../search/SearchPageMaterials'
import { aitoolkitEnabled, appBase, oasis } from '../../config'
import { aitoolkitEnabled, appBase, oasis, encyclopediaBase } from '../../config'
import EntryQuery from '../entry/EntryQuery'
import ResolvePID from '../entry/ResolvePID'
import DatasetPage, { help as datasetHelp } from '../dataset/DatasetPage'
......@@ -470,7 +470,7 @@ UploadButton.propTypes = {
* @param {elementType} component The component to use to render the button. Default is Button.
*/
export const MaterialButton = ({materialId, component, tooltip, ...rest}) => {
const href = `${appBase}/encyclopedia/#/material/${materialId}`
const href = `${encyclopediaBase}/material/${materialId}`
const props = component
? {href: href, ...rest}
: {href: href, color: 'primary', ...rest}
......
......@@ -19,7 +19,7 @@ import React from 'react'
import PropTypes from 'prop-types'
import { IconButton } from '@material-ui/core'
import DetailsIcon from '@material-ui/icons/MoreHoriz'
import { encyclopediaEnabled } from '../../../config'
import { encyclopediaBase } from '../../../config'
import { MaterialButton } from '../../nav/Routes'
import {
addColumnDefaults,
......@@ -68,7 +68,7 @@ const SearchResultsMaterials = React.memo(function SearchResultsMaterials(props)
columns={columns} shownColumns={defaultSelectedColumns} {...props}
>
<DatatableToolbar title={`${pagination.total} search results`} />
<DatatableTable actions={encyclopediaEnabled && VisitMaterialAction}>
<DatatableTable actions={encyclopediaBase && VisitMaterialAction}>
<DatatableLoadMorePagination color="primary">load more</DatatableLoadMorePagination>
</DatatableTable>
</Datatable>
......
......@@ -105,6 +105,8 @@ const Structure = React.memo(({
data,
options,
materialType,
structureType,
m_path,
viewer,
captureName,
positionsOnly,
......@@ -228,38 +230,60 @@ const Structure = React.memo(({
system.cell = undefined
}
}
// Systems with non-empty cell are centered on the cell center and
// orientation is defined by the cell vectors.
const opts = {}
if (system.cell !== undefined) {
opts.layout = {
viewRotation: {
alignments: [
// Determine the orientation and view centering based on material type and
// the structure type.
let layout = {
viewCenter: 'COP',
viewRotation: {
alignments: system.cell === undefined
? undefined
: [
['up', 'c'],
['right', 'b']
],
rotations: [
[0, 1, 0, 60],
[1, 0, 0, 30]
]
}
rotations: [
[0, 1, 0, 60],
[1, 0, 0, 30]
]
}
} else {
opts.layout = {
viewRotation: {
rotations: [
[0, 1, 0, 60],
[1, 0, 0, 30]
]
}
if (structureType === 'conventional' || structureType === 'primitive') {
if (materialType === 'bulk') {
layout.viewCenter = 'COC'
layout.viewRotation.alignments = [
['up', 'c'],
['right', 'b']
]
} else if (materialType === '2D') {
layout = {
viewCenter: 'COC',
viewRotation: {
alignments: [
['right', 'a'],
['up', 'b']
],
rotations: [
[1, 0, 0, -60]
]
}
}
} else if (materialType === '1D') {
layout = {
viewCenter: 'COC',
viewRotation: {
alignments: [
['right', 'a']
],
rotations: [
[1, 0, 0, -60],
[0, 1, 0, 30],
[1, 0, 0, 30]
]
}
}
}
}
if (system.cell !== undefined && materialType === 'bulk') {
opts.layout.viewCenter = 'COC'
// Systems without cell are centered on the center of positions
} else {
opts.layout.viewCenter = 'COP'
}
const opts = {layout}
refViewer.current.setOptions(opts, false, false)
refViewer.current.load(system)
refViewer.current.fitToCanvas()
......@@ -267,7 +291,7 @@ const Structure = React.memo(({
refViewer.current.reset()
setLoading(false)
}, 0)
}, [materialType])
}, [materialType, structureType])
// Called whenever the given system changes. If positionsOnly is true, only
// updates the positions. Otherwise reloads the entire structure.
......@@ -449,8 +473,8 @@ const Structure = React.memo(({
<Action tooltip='Capture image' onClick={takeScreencapture}>
<CameraAlt/>
</Action>
{data?.m_path &&
<Action tooltip='View data in the archive' onClick={() => { history.push(data.m_path) }}>
{m_path &&
<Action tooltip='View data in the archive' onClick={() => { history.push(m_path) }}>
<ViewList/>
</Action>
}
......@@ -484,7 +508,9 @@ Structure.propTypes = {
PropTypes.object
]),
options: PropTypes.object, // Viewer options
materialType: PropTypes.string, // The material type, affects the visualization layout.
materialType: PropTypes.oneOf(['bulk', '2D', '1D', 'molecule / cluster', 'unknown']),
structureType: PropTypes.oneOf(['original', 'conventional', 'primitive']),
m_path: PropTypes.string, // Path of the structure data in the metainfo
captureName: PropTypes.string, // Name of the file that the user can download
positionsOnly: PropTypes.bool, // Whether to update only positions. This is much faster than loading the entire structure.
sizeLimit: PropTypes.number, // Maximum system size before a prompt is shown
......
......@@ -28,7 +28,7 @@ export const keycloakBase = window.nomadEnv.keycloakBase
export const keycloakRealm = window.nomadEnv.keycloakRealm
export const keycloakClientId = window.nomadEnv.keycloakClientId
export const debug = window.nomadEnv.debug || false
export const encyclopediaEnabled = window.nomadEnv.encyclopediaEnabled || false
export const encyclopediaBase = window.nomadEnv.encyclopediaBase
export const aitoolkitEnabled = window.nomadEnv.aitoolkitEnabled || false
export const oasis = window.nomadEnv.oasis || false
export const globalLoginRequired = window.nomadEnv.globalLoginRequired || false
......
......@@ -17,7 +17,7 @@ global.nomadEnv = {
'usesBetaData': true,
'officialUrl': 'https://nomad-lab.eu/prod/rae/gui'
},
'encyclopediaEnabled': true,
'encyclopediaBase': 'https://nomad-lab.eu/prod/rae/encyclopedia/#',
'aitoolkitEnabled': true,
'oasis': false
}
......
......@@ -31,6 +31,7 @@ const override = {
'length': 'angstrom',
'energy': 'electron_volt',
'pressure': 'gigapascal',
'angle': 'degree',
'system': 'custom'
}
defaults = {...defaults, ...override}
......
......@@ -187,6 +187,16 @@ export const unitMap = {
label: 'Henry',
abbreviation: 'H'
},
radian: {
dimension: 'angle',
label: 'Radian',
abbreviation: 'rad'
},
degree: {
dimension: 'angle',
label: 'Degree',
abbreviation: '\u00b0'
},
dimensionless: {
dimension: 'dimensionless',
label: 'Dimensionless',
......@@ -507,6 +517,23 @@ export const conversionMap = {
}
}
},
angle: {
dimension: 'angle',
units: [
'radian',
'degree'
],
multipliers: {
radian: {
radian: 1,
degree: 57.29577951308232
},
degree: {
radian: 0.017453292519943295,
degree: 1
}
}
},
dimensionless: {
dimension: 'dimensionless',
units: [
......@@ -537,7 +564,8 @@ export const unitSystems = {
power: 'watt',
frequency: 'hertz',
electric_potential: 'volt',
charge: 'coulomb'
charge: 'coulomb',
angle: 'radian'
}
},
AU: {
......@@ -551,7 +579,8 @@ export const unitSystems = {
temperature: 'atomic_unit_of_temperature',
force: 'atomic_unit_of_force',
energy: 'hartree',
pressure: 'atomic_unit_of_pressure'
pressure: 'atomic_unit_of_pressure',
angle: 'radian'
}
}
}
......@@ -302,7 +302,7 @@ export function getHighestOccupiedEnergy(section_k_band, scc) {
* @return {undefined|object} If the given structure cannot be converted,
* returns an empty object.
*/
export function toMateriaStructure(structure, name, m_path) {
export function toMateriaStructure(structure) {
if (!structure) {
return undefined
}
......@@ -317,9 +317,7 @@ export function toMateriaStructure(structure, name, m_path) {
cell: structure.lattice_vectors ? toUnitSystem(structure.lattice_vectors, 'meter', {length: 'angstrom'}, false) : undefined,
positions: toUnitSystem(structure.cartesian_site_positions, 'meter', {length: 'angstrom'}, false),
fractional: false,
pbc: structure.dimension_types ? structure.dimension_types.map((x) => !!x) : undefined,
name: name,
m_path: m_path
pbc: structure.dimension_types ? structure.dimension_types.map((x) => !!x) : undefined
}
return structMateria
} catch (error) {
......@@ -429,6 +427,9 @@ export function getSerializer(dtype, pretty = true) {
return value
}
if (value instanceof Quantity) {
if (isNil(value.value)) {
return value.value
}
let label
let valueConv
if (units) {
......@@ -460,7 +461,7 @@ export function getSerializer(dtype, pretty = true) {
export function serializeMetainfo(quantity, value, units) {
const dtype = getDatatype(quantity)
if (dtype === DType.Number) {
if (!(value instanceof Quantity)) {
if (!(value instanceof Quantity) && !isNil(value)) {
const unit = getUnit(quantity) || 'dimensionless'
value = new Quantity(value, unit)
}
......
......@@ -160,9 +160,9 @@ const resultsDftBulk = {
a: 5e-10,
b: 5e-10,
c: 5e-10,
alpha: 0.9,
beta: 0.9,
gamma: 0.9
alpha: Math.PI / 2,
beta: Math.PI / 2,
gamma: Math.PI / 2
},
cell_volume: 125e-30
},
......@@ -171,9 +171,9 @@ const resultsDftBulk = {
a: 5e-10,
b: 5e-10,
c: 5e-10,
alpha: 0.9,
beta: 0.9,
gamma: 0.9
alpha: Math.PI / 2,
beta: Math.PI / 2,
gamma: Math.PI / 2
},
cell_volume: 125e-37
},
......@@ -182,9 +182,9 @@ const resultsDftBulk = {
a: 5e-10,
b: 5e-10,
c: 5e-10,
alpha: 0.9,
beta: 0.9,
gamma: 0.9
alpha: Math.PI / 2,
beta: Math.PI / 2,
gamma: Math.PI / 2
},
cell_volume: 125e-30
}
......
......@@ -1235,10 +1235,10 @@
resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.8.0.tgz#bbbff68978fefdbe68ccb533bc8cbe1d1afb5413"
integrity sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==
 
"@eslint/eslintrc@^0.4.2":
version "0.4.2"
resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.2.tgz#f63d0ef06f5c0c57d76c4ab5f63d3835c51b0179"
integrity sha512-8nmGq/4ycLpIwzvhI4tNDmQztZ8sp+hI7cyG8i1nQDhkAbRzHpXPidRAHlNvCZQpJTKw5ItIpMw9RSToGF00mg==
"@eslint/eslintrc@^0.4.3":
version "0.4.3"
resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c"
integrity sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==
dependencies:
ajv "^6.12.4"
debug "^4.1.1"
......@@ -1292,6 +1292,20 @@
dependencies:
"@hapi/hoek" "^8.3.0"
 
"@humanwhocodes/config-array@^0.5.0":
version "0.5.0"
resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9"
integrity sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==
dependencies:
"@humanwhocodes/object-schema" "^1.2.0"
debug "^4.1.1"
minimatch "^3.0.4"
"@humanwhocodes/object-schema@^1.2.0":
version "1.2.1"
resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45"
integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==
"@istanbuljs/schema@^0.1.2":
version "0.1.3"
resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98"
......@@ -1979,15 +1993,16 @@
regexpp "^3.0.0"
tsutils "^3.17.1"
 
"@typescript-eslint/eslint-plugin@^4.0.1":
version "4.28.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.28.0.tgz#1a66f03b264844387beb7dc85e1f1d403bd1803f"
integrity sha512-KcF6p3zWhf1f8xO84tuBailV5cN92vhS+VT7UJsPzGBm9VnQqfI9AsiMUFUCYHTYPg1uCCo+HyiDnpDuvkAMfQ==
"@typescript-eslint/eslint-plugin@^4.33.0":
version "4.33.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz#c24dc7c8069c7706bc40d99f6fa87edcb2005276"
integrity sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg==
dependencies:
"@typescript-eslint/experimental-utils" "4.28.0"
"@typescript-eslint/scope-manager" "4.28.0"
"@typescript-eslint/experimental-utils" "4.33.0"
"@typescript-eslint/scope-manager" "4.33.0"
debug "^4.3.1"
functional-red-black-tree "^1.0.1"
ignore "^5.1.8"
regexpp "^3.1.0"
semver "^7.3.5"
tsutils "^3.21.0"
......@@ -2002,15 +2017,15 @@
eslint-scope "^5.0.0"
eslint-utils "^2.0.0"
 
"@typescript-eslint/experimental-utils@4.28.0", "@typescript-eslint/experimental-utils@^4.0.1":
version "4.28.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.28.0.tgz#13167ed991320684bdc23588135ae62115b30ee0"
integrity sha512-9XD9s7mt3QWMk82GoyUpc/Ji03vz4T5AYlHF9DcoFNfJ/y3UAclRsfGiE2gLfXtyC+JRA3trR7cR296TEb1oiQ==
"@typescript-eslint/experimental-utils@4.33.0":
version "4.33.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz#6f2a786a4209fa2222989e9380b5331b2810f7fd"
integrity sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q==
dependencies:
"@types/json-schema" "^7.0.7"
"@typescript-eslint/scope-manager" "4.28.0"
"@typescript-eslint/types" "4.28.0"
"@typescript-eslint/typescript-estree" "4.28.0"
"@typescript-eslint/scope-manager" "4.33.0"
"@typescript-eslint/types" "4.33.0"
"@typescript-eslint/typescript-estree" "4.33.0"
eslint-scope "^5.1.1"
eslint-utils "^3.0.0"
 
......@@ -2025,6 +2040,18 @@
eslint-scope "^5.0.0"
eslint-utils "^2.0.0"
 
"@typescript-eslint/experimental-utils@^4.0.1":
version "4.28.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.28.0.tgz#13167ed991320684bdc23588135ae62115b30ee0"
integrity sha512-9XD9s7mt3QWMk82GoyUpc/Ji03vz4T5AYlHF9DcoFNfJ/y3UAclRsfGiE2gLfXtyC+JRA3trR7cR296TEb1oiQ==
dependencies:
"@types/json-schema" "^7.0.7"
"@typescript-eslint/scope-manager" "4.28.0"
"@typescript-eslint/types" "4.28.0"
"@typescript-eslint/typescript-estree" "4.28.0"
eslint-scope "^5.1.1"
eslint-utils "^3.0.0"
"@typescript-eslint/parser@^2.10.0":
version "2.34.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.34.0.tgz#50252630ca319685420e9a39ca05fe185a256bc8"
......@@ -2035,14 +2062,14 @@
"@typescript-eslint/typescript-estree" "2.34.0"
eslint-visitor-keys "^1.1.0"
 
"@typescript-eslint/parser@^4.0.1":
version "4.28.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.28.0.tgz#2404c16751a28616ef3abab77c8e51d680a12caa"
integrity sha512-7x4D22oPY8fDaOCvkuXtYYTQ6mTMmkivwEzS+7iml9F9VkHGbbZ3x4fHRwxAb5KeuSkLqfnYjs46tGx2Nour4A==
"@typescript-eslint/parser@^4.33.0":
version "4.33.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.33.0.tgz#dfe797570d9694e560528d18eecad86c8c744899"
integrity sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA==
dependencies:
"@typescript-eslint/scope-manager" "4.28.0"
"@typescript-eslint/types" "4.28.0"
"@typescript-eslint/typescript-estree" "4.28.0"
"@typescript-eslint/scope-manager" "4.33.0"
"@typescript-eslint/types" "4.33.0"
"@typescript-eslint/typescript-estree" "4.33.0"
debug "^4.3.1"
 
"@typescript-eslint/scope-manager@4.28.0":
......@@ -2053,6 +2080,14 @@