Commit 4f70c409 authored by Pascal's avatar Pascal
Browse files

Merge branch 'master' into merge-master

parents 0d149789 b1b2d204
{
"version": "2.0.0",
"tasks": [
{
"type": "npm",
"script": "build",
"problemMatcher": [
{
"fileLocation": "absolute",
"severity": "error",
"pattern": [
{
"regexp": "\\[tsl\\] (ERROR|WARNING) in (.*)?\\((\\d+),(\\d+)\\)",
"severity": 1,
"file": 2,
"line": 3,
"column": 4
},
{
"regexp": "\\s*TS(\\d+):\\s*(.*)$",
"code": 1,
"message": 2
}
]
}
],
"group": "build",
"label": "npm: build"
},
{
"type": "npm",
"script": "start",
"problemMatcher": ["$tsc-watch"],
"label": "npm: start",
"isBackground": true
"isBackground": true,
"problemMatcher": [
{
"fileLocation": "absolute",
"severity": "error",
"pattern": [
{
"regexp": "\\[tsl\\] (ERROR|WARNING) in (.*)?\\((\\d+),(\\d+)\\)",
"severity": 1,
"file": 2,
"line": 3,
"column": 4
},
{
"regexp": "\\s*TS(\\d+):\\s*(.*)$",
"code": 1,
"message": 2
}
],
"background": {
"activeOnStart": true,
"beginsPattern": {
"regexp": "^assets by status"
},
"endsPattern": {
"regexp": "[Cc]ompiled (.*?successfully|with .*?error)|[Cc]ompilation .*?finished"
}
}
}
],
"label": "npm: start"
},
{
"type": "process",
......@@ -18,13 +72,6 @@
"cwd": "${workspaceFolder}"
},
"problemMatcher": []
},
{
"type": "npm",
"script": "build",
"problemMatcher": ["$tsc"],
"group": "build",
"label": "npm: build"
}
]
}
This diff is collapsed.
This diff is collapsed.
#!/bin/sh
cd $HOME/ical-ufr
sftp molin@master.math.univ-paris-diderot.fr <<EOF
cd licence19-23/
put -r data
EOF
#!/bin/bash
if [ "$HOSTNAME" = "pubmaster" ]; then
cd $HOME/ical-ufr
rsync -rcuz --delete data/ $HOME/publicence/lektor/assets/data/
rsync -rcuz --delete data/ wwwmaster:licence19-23/data/
else
>&2 echo "FAIL: run this on deployment machine"
fi
......@@ -4,4 +4,5 @@
host="rpubmaster:publicence"
rsync -uv dist/index.html $host/lektor/templates/calendar.html
rsync -uv dist/single-template.html $host/lektor/templates/content-edt.html
rsync -ruv dist/static/ $host/lektor/assets/static/
rsync -ruv --delete dist/static/assets/ $host/lektor/assets/static/assets/
rsync -ruv --delete dist/static/js/ $host/lektor/assets/static/js/
[
{ "code": 6552, "title": "L1MathInfo", "fiches": "6699,6700"},
{ "code": "6552,6555,7296", "title": "L1MathInfo-Gr1", "fiches": "6699"},
{ "code": "6552,6555,7301", "title": "L1MathInfo-Gr2", "fiches": "6700"},
{ "code": 6551, "title": "L1Math", "fiches": "6649,6650,6651,6658"},
{ "code": 6594, "title": "L1Miashs", "fiches": "6605,6606,6607,6608,6609,6610,6611,6612"},
{ "code": 6546, "title": "L2MathInfo", "fiches": "6736,6737,12166,12167"},
{ "code": "6546,6549,7313", "title": "L2MathInfo", "fiches": "6736"},
{ "code": "6546,6549,7314", "title": "L2MathInfo", "fiches": "6737"},
{ "code": 6541, "title": "L2Math", "fiches": "6654,6655,6656"},
{ "code": 6593, "title": "L2Miashs", "fiches": "6598,6599,6600,6601,6602,6603,6604"},
{ "code": 2418, "title": "L3MathInfo", "fiches": "7670,2426"},
......@@ -14,13 +16,19 @@
{ "code": "6922,5418,7372", "title": "L3SES-MiashsGr3", "fiches": "5423"},
{ "code": "6922,5418,7372,12448,12082", "title": "L3SES-MiashsGr4", "fiches": "12446"},
{ "code": "6922,5418,12448,12082,12077", "title": "L3SES-MiashsGr5", "fiches": "12447"},
{ "code": "5256,5258,5260,5257,5262,5263", "title": "UElibres ling", "fiches": "4557"},
{ "code": "5271,5908,7649,6789", "title": "L3SDL-Gr1", "fiches": "5909"},
{ "code": "5271,5908,7649,6790", "title": "L3SDL-Gr2", "fiches": "5910"},
{ "code": "5057", "title": "L1Socio", "fiches": "5867,5868,5869,5870,5871,5872,5873"},
{ "code": "4888", "title": "L2Socio", "fiches": "5880,5881,5882,5883,6946"},
{ "code": "4656,5664", "title": "L3Socio", "fiches": "6929,6927,6928,4373"},
{ "code": 4601, "title": "L3ProfEcoles", "fiches": "7240,7241"},
{ "code": 6343, "title": "L1Physique", "fiches": "6361,6362,6363,6371,6639,8068,8069"},
{ "code": 6345, "title": "L1EPC", "fiches": "6534"},
{ "code": 6346, "title": "L1EPC", "fiches": "6535"},
{ "code": 6347, "title": "L1CUPGE", "fiches": "6532,6533"},
{ "code": 6769, "title": "L1STEP", "fiches": "6770,6771"},
{ "code": 5259, "title": "L1Chimie", "fiches": "5633,5634,5635,5636,7920"},
{ "code": 5259, "title": "L1Chimie", "fiches": "5633,5634,5635,5636"},
{ "code": 5274, "title": "L1ChimieBio", "fiches": "5637"},
{ "code": 6539, "title": "L1Info", "fiches": "6197,6696,6292,6697,6295,6767"},
{ "code": 8226, "title": "L1InfoBio", "fiches": "6296"},
......
......@@ -2,7 +2,7 @@
#coding: utf8
import re, requests, json, datetime, time
def get_ical(code,start='2021-08-23',end='2021-12-19',year=4):
def get_ical(code,start='2021-08-23',end='2022-07-17',year=4):
url = 'https://adeprod.app.univ-paris-diderot.fr:443/jsp/custom/modules/plannings/anonymous_cal.jsp'
params = {
'calType': 'ical',
......@@ -18,10 +18,18 @@ def modifdate(m,shift):
"""
fonction auxiliaire qui corrige la chaine de deux lignes consecutives DTSTART DTEND
ADE introduit un decalage qui depend de l'heure ete/hiver.
Il y a en plus un probleme de 24h lorsque les heures voulues sont l'apres midi.
Le shift sur un etalon posé au 23/8 a 8h semble etre de -10. Il semble maintenant obsolete.
Il semble qu'il y ait 4 decalages possibles, un peu comme si la base etait etalonnée differemment
chaque semestre en plus de l'heure ete/hiver.
Il y a en plus un probleme de 24h lorsque les heures voulues sont vers l'apres midi.
- En 2021-2022 jusqu'au 15/10/21 le shift est de -10 et l'heure frontiere du jour perdu est à 12h.
!le 16/10/21 le shift d'été est passé brutalement à -9 et l'heure frontiere à 13h!
- En 2020-2021 le shift est de -11 en ete et l'heure frontiere du jour perdu est à 11h.
- En 2019-2020 le shift est de -12 en ete et l'heure frontiere du jour perdu est à 10h.
De plus les cours qui terminaient à 20h en 19-20 ne semble pas transmis par ADE...
* REMARQUE dans tous ces cas on peut maintenant deviner la formule:
heurefrontiere -shiftete = 22h
* En hiver il faut encore retrancher 1 au shift.
m est la valeur trouvee par:
......@@ -31,28 +39,57 @@ def modifdate(m,shift):
fin=datetime.datetime.strptime(m.group(2),'%Y%m%dT%H%M%SZ')
orig = "ORIGSTART:%d%02d%02dT%02d%02d%02dZ\r\nORIGEND:%d%02d%02dT%02d%02d%02dZ\r\n"%(debut.year,debut.month,debut.day,debut.hour,debut.minute,debut.second,fin.year,fin.month,fin.day,fin.hour,fin.minute,fin.second)
if shift != -10:
print("[WARNING] shift %d != -10. Votre etalon etait-t-il vraiment en aout?"%s(shift))
# PB le shift change avec l'heure d'hiver/ete:
D1 = datetime.datetime(debut.year,10,31)
D2 = datetime.datetime(debut.year,3,31)
lastdimancheoct = D1 - datetime.timedelta(days=(D1.weekday()+1)%7)
lastdimanchemars = D2 - datetime.timedelta(days=(D2.weekday()+1)%7)
decalsemestre = 0
# shift a ajouter aux heures recues en ete
#shiftete_manuel = -10 # vaut -10 au semestre 1 2021-2022, avant 21/10/2021.
shiftete_manuel = -9 # vaut -9 au 22/10/2021.
# frontiere ou le bug de jour apparait
# Remarque dans tous les exmples on a heurefrontiere = shiftete + 22
#heurefrontiere_manuel = 12 # vaut 12h au semestre 1 2021-2022, avant 21/10/2021
heurefrontiere_manuel = 13 # vaut 13, au 22/10/2021
#
# on utilise le shift etalon.
shiftete = shift
heurefrontiere = shiftete + 22
if shift != shiftete_manuel:
print("[WARNING] shift %d != %d. la valeur du shift a changé"%(shift,shiftete_manuel))
print("[WARNING] on utilise l'heurefrontiere 22+shiftete; à VERIFIER!")
if debut.month > 7:
# l'annee vaut pour aout-decembre. (Semestre 1)
decalsemestre = 0
if debut.year == 2020:
# annee 2020-2021
heurefrontiere = 11
shiftete = -11
if debut.year == 2019:
# annee 2019-2020
heurefrontiere = 10
shiftete = -12
if debut >= lastdimancheoct:
#print("hiver")
shift = -11
shift = shiftete -1
else:
#print("ete")
shift = -10
shift = shiftete
if debut.month<8:
# l'annee vaut pour janvier-juillet (Semestre2)
decalsemestre = 1
if debut.year == 2021:
# annee 2020-2021
heurefrontiere = 11
shiftete = -11
if debut.year == 2020:
#annee 2019-2020
heurefrontiere = 10
shiftete = -12
#Ces 4 reservations sont les jeudis de 10h45-12h45
#2021-04-01|21:45:00|2021-03-31|23:45:00|ALGORITHMIQUE|432C
#2021-02-11|22:45:00|2021-02-11|00:45:00|ALGORITHMIQUE|432C
......@@ -60,10 +97,10 @@ def modifdate(m,shift):
#2021-03-04|22:45:00|2021-03-04|00:45:00|ALGORITHMIQUE|432C
if debut<lastdimanchemars:
#print("hiver")
shift = - 12
shift = shiftete -1
else:
#print("ete")
shift = -11
shift = shiftete
# parfois il manque un jour a la date de fin, Exemple:
# ORIGSTART:20210915T201500Z
......@@ -86,19 +123,18 @@ def modifdate(m,shift):
#
#
# En fait il semble que si l'heure voulue etait apres:
# 12h au semestre1, et 11h au semestre2,
# 12h au semestre1 2021-2022 (13h à partir du 16/10/21), et 11h en 2020-2021,
# ADE a perdu un jour
# en voulant faire une certaine modif de decalage.
#
if debut.hour >= 12 -shift -decalsemestre or debut.hour <= 20 - shift -24:
# si l'heure voulue >= 12h et <= 20h (au semestre 1)
# (si l'heure voulue >= 11h au semestre 2)
if debut.hour >= heurefrontiere -shift or debut.hour <= 20 - shift -24:
# si l'heure voulue >= heurefrontiere et <= 20h
# dans ce cas il faut augmenter d'un jour avant d'appliquer le shift
#TODO: on peut maintenant reserver jusque 21h!
debut = debut + datetime.timedelta(hours=24)
if fin.hour >= 12 -shift -decalsemestre or fin.hour <= 20 - shift -24:
# si l'heure voulue >= 12h et <= 20h (au semestre 1)
# (si l'heure voulue >= 11h au semestre 2)
if fin.hour >= heurefrontiere -shift or fin.hour <= 20 - shift -24:
# si l'heure voulue >= heurefrontiere et <= 20h
# dans ce cas il faut augmenter d'un jour
fin = fin + datetime.timedelta(hours=24)
......@@ -173,7 +209,7 @@ def modifsalle(matchsalle):
return salle
from codesapogee import apogee
from codesapogee import apogee,filtreECUE
def modifvevent(matchevent, shift, icalname):
......@@ -238,12 +274,12 @@ def fix_timezone(ical,icalname=""):
decalageUTC=0
if not m:
shift=-10-decalageUTC
#print('[WARNING] %s: no reference for etalon 0823T, set shift to %d'%(icalname, shift))
# NB je pense que l'etalon ne sert a rien car le shift change a l'heure ete/hiver.
print('[WARNING] %s: no reference for etalon 0823T, set shift to %d'%(icalname, shift))
# NB le shift passe de -10 a -9 le 22/10/2021
else:
shift = (-decalageUTC+ 8 - int(m.group(index))) # le vrai shift sans le modulo.
if (shift != -decalageUTC -10):
print("[WARNING] %s: %s -> shift = %d != %d)"%(icalname, m.group(0),shift,-decalageUTC-10))
#if (shift != -decalageUTC -10):
# print("[WARNING] %s: %s -> shift = %d != %d)"%(icalname, m.group(0),shift,-decalageUTC-10))
#ical = rebeginend.sub(lambda m: modifdate(m,shift), ical)
ical = revevent.sub(lambda m: modifvevent(m,shift,icalname), ical)
......@@ -297,7 +333,7 @@ def cherchedeplacements(fcalen = 'calendars.json', outdir='data', oldoutdir='dat
"""
revevent=re.compile('BEGIN:VEVENT.*?END:VEVENT',re.DOTALL)
revariable = re.compile('(DTSTAMP:.*\n)|(LAST-MODIFIED:.*\n)|(CREATED:.*\n)|(SEQUENCE:.*\n)')
revariable = re.compile('(DTSTAMP:.*\n)|(LAST-MODIFIED:.*\n)|(CREATED:.*\n)|(SEQUENCE:.*\n)|(ORIGSTART:.*\n)|(ORIGEND:.*\n)')
rexeport = re.compile('\(.*?\)',re.DOTALL)
# on recupere les noms des boutons via le code, on utilise donc calendars.json
......@@ -378,9 +414,6 @@ def cherchedeplacements(fcalen = 'calendars.json', outdir='data', oldoutdir='dat
def tests():
"""
Une fonction de test pour traiter un exemple avec shift de -11h si l'on n'arrive pas
......@@ -404,31 +437,18 @@ def tests():
dest2.close()
def semestre2_2021(outdir='data', dryrun=False, verbose=False):
def annee2020_2021(outdir='data', dryrun=False, verbose=False):
"""
ajoute le second semestre du calendrier 2021 pour vérifications
charge annee 2020-21
"""
get_calendars('formations.json', outdir=outdir, dryrun=dryrun, verbose=verbose, start="2020-08-31", end="2021-07-14", year=15)
for code in calendar_list():
#on prend le nom de la derniere fiche
nomfiche = code.split(',')[-1]
fname = '%s/%s.ics'%(outdir,nomfiche)
if verbose:
print('[FETCH] %d -> %s'%(code, fname))
calendar = get_ical(code, start="2021-01-04", end="2021-05-30", year=15)
calendar = fix_timezone(calendar,nomfiche)
time.sleep(0.8)
if calendar is None:
print("PB calendrier %s vide"%code)
return
if dryrun:
print(calendar[:300])
else:
with open(fname,'w') as f:
f.write( calendar )
if verbose:
print('[DONE]')
def annee2019_2020(outdir='data', dryrun=False, verbose=False):
"""
charge annee 2019-20
"""
get_calendars('formations.json', outdir=outdir, dryrun=dryrun, verbose=verbose, start="2019-08-31", end="2020-07-14", year=6)
def calendar_list(fname = 'formations.json'):
......@@ -450,7 +470,8 @@ def calendar_list(fname = 'formations.json'):
return rep
def get_calendars(formations, outdir,
dryrun=False, verbose=False):
dryrun=False, verbose=False,
start='2021-08-23',end='2022-07-17',year=4):
for code in calendar_list(formations):
......@@ -458,9 +479,24 @@ def get_calendars(formations, outdir,
nomfiche = code.split(',')[-1]
fname = '%s/%s.ics'%(outdir,nomfiche)
if verbose:
print(f'[FETCH] {code} -> {fname}')
calendar = get_ical(code)
print('[FETCH] %s -> %s'%(code,fname))
calendar = get_ical(code,start,end,year)
# check we actually got a calendar
if not calendar.startswith('BEGIN:VCALENDAR'):
print('[ERROR] %s -> no ressource %s'%(code,calendar[:20]))
# keep old file
next
calendar = fix_timezone(calendar,nomfiche)
# Ajout de sous calendriers par ECUE dans certaines formations
if nomfiche in filtreECUE:
subcalendars = mkfiltreECUE(nomfiche, calendar, filtreECUE[nomfiche])
for sc in subcalendars:
fnamesub = "%s/%s.ics"%(outdir,sc)
tmp = subcalendars[sc]
f = open(fnamesub,'w')
f.write(tmp)
f.close()
# trop de requettes peuvent donner une erreur ??
#requests.exceptions.ConnectionError: HTTPSConnectionPool(host='adeprod.app.univ-paris-diderot.fr', port=443): Max retries exceeded with url: /jsp/custom/modules/plannings/anonymous_cal.jsp?calType=ical&firstDate=2021-08-23&lastDate=2021-12-19&resources=2769%2C6593%2C6602&projectId=4 (Caused by NewConnectionError('<urllib3.connection.VerifiedHTTPSConnection object at 0x7f87c1e449d0>: Failed to establish a new connection: [Errno -2] Name or service not known'))
......@@ -476,6 +512,41 @@ def get_calendars(formations, outdir,
if verbose:
print('[DONE]')
def mkfiltreECUE(code,ical,filtre):
"""
Une fonction pour filtrer et creer des sous calendriers à partir d'un calendrier.
code: le code du calendrier d'origine, ie num fiche ADE
calendrier: le calendrier apres corrections
filtre: un dictionnaire de filtres: code ECUE/ expression reg
"""
subcals = {}
debutcal = "BEGIN:VCALENDAR\n"
debutcal += "METHOD:REQUEST\n"
debutcal += "PRODID:-//ADE/version 6.0\n"
debutcal += "VERSION:2.0\n"
debutcal += "CALSCALE:GREGORIAN"
fincal = "\nEND:VCALENDAR"
for ecue in filtre:
tmp = str(code)+"."+ ecue
subcals[tmp]= debutcal
revevent=re.compile('BEGIN:VEVENT.*?END:VEVENT',re.DOTALL)
rechercheUE =[ re.compile(filtre[ecue],re.DOTALL) for ecue in filtre]
Levent=revevent.finditer(ical)
for mevent in Levent:
event = mevent.group(0)
event = event.replace('\r','')
for i in range(len(filtre)):
s=rechercheUE[i]
ecue=list(filtre)[i]
if s.match(event) != None:
subcals[str(code)+"."+ecue] += "\n"+event
for sc in subcals:
subcals[sc] += fincal
return subcals
def get_external(fcalen, outdir,
dryrun=False, verbose=False):
......@@ -492,7 +563,7 @@ def get_external(fcalen, outdir,
with open(fcalen) as calenfile:
for c in json.load(calenfile):
fname = f'{outdir}/{c["id"]}.ics'
fname = '%s/%s.ics'%(outdir,c['id'])
cal = curl(c['url'])
if dryrun:
print(cal[:200])
......@@ -500,7 +571,7 @@ def get_external(fcalen, outdir,
with open(fname,'w') as f:
f.write(cal)
if verbose:
print(f'[DONE {fname}]')
print('[DONE %s]'%fname)
def main(start, end,
......
......@@ -50,7 +50,6 @@
"ts-loader": "^9.2.5",
"typescript": "^4.4.2",
"webpack": "^5.51.2",
"webpack-bundle-analyzer": "^4.4.2",
"webpack-cli": "^4.8.0",
"webpack-dev-server": "^4.1.0",
"webpack-merge": "^5.8.0"
......@@ -1982,12 +1981,6 @@
"node": ">= 8"
}
},
"node_modules/@polka/url": {
"version": "1.0.0-next.17",
"resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.17.tgz",
"integrity": "sha512-0p1rCgM3LLbAdwBnc7gqgnvjHg9KpbhcSphergHShlkWz8EdPawoMJ3/VbezI0mGC5eKCDzMaPgF9Yca6cKvrg==",
"dev": true
},
"node_modules/@trysound/sax": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.1.1.tgz",
......@@ -4103,12 +4096,6 @@
"node": ">=10"
}
},
"node_modules/duplexer": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz",
"integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==",
"dev": true
},
"node_modules/ee-first": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
......@@ -5590,21 +5577,6 @@
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz",
"integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ=="
},
"node_modules/gzip-size": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz",
"integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==",
"dev": true,
"dependencies": {
"duplexer": "^0.1.2"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/handle-thing": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz",
......@@ -8329,15 +8301,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/opener": {
"version": "1.5.2",
"resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz",
"integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==",
"dev": true,
"bin": {
"opener": "bin/opener-bin.js"
}
},
"node_modules/optionator": {
"version": "0.9.1",
"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
......@@ -10373,32 +10336,6 @@
"integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==",
"dev": true
},
"node_modules/sirv": {
"version": "1.0.14",
"resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.14.tgz",
"integrity": "sha512-czTFDFjK9lXj0u9mJ3OmJoXFztoilYS+NdRPcJoT182w44wSEkHSiO7A2517GLJ8wKM4GjCm2OXE66Dhngbzjg==",
"dev": true,
"dependencies": {
"@polka/url": "^1.0.0-next.17",
"mime": "^2.3.1",
"totalist": "^1.0.0"
},
"engines": {
"node": ">= 10"
}
},
"node_modules/sirv/node_modules/mime": {
"version": "2.5.2",
"resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz",
"integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==",
"dev": true,
"bin": {
"mime": "cli.js"
},
"engines": {
"node": ">=4.0.0"
}
},
"node_modules/slash": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
......@@ -11386,15 +11323,6 @@
"node": ">=0.6"
}
},
"node_modules/totalist": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz",
"integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==",
"dev": true,
"engines": {
"node": ">=6"
}
},
"node_modules/trough": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/trough/-/trough-2.0.2.tgz",
......@@ -12121,117 +12049,6 @@
}
}
},
"node_modules/webpack-bundle-analyzer": {
"version": "4.4.2",
"resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.4.2.tgz",
"integrity": "sha512-PIagMYhlEzFfhMYOzs5gFT55DkUdkyrJi/SxJp8EF3YMWhS+T9vvs2EoTetpk5qb6VsCq02eXTlRDOydRhDFAQ==",
"dev": true,
"dependencies": {
"acorn": "^8.0.4",
"acorn-walk": "^8.0.0",
"chalk": "^4.1.0",
"commander": "^6.2.0",
"gzip-size": "^6.0.0",
"lodash": "^4.17.20",
"opener": "^1.5.2",
"sirv": "^1.0.7",
"ws": "^7.3.1"
},
"bin": {
"webpack-bundle-analyzer": "lib/bin/analyzer.js"
},
"engines": {
"node": ">= 10.13.0"
}
},
"node_modules/webpack-bundle-analyzer/node_modules/acorn-walk": {
"version": "8.1.1",
"resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.1.1.tgz",
"integrity": "sha512-FbJdceMlPHEAWJOILDk1fXD8lnTlEIWFkqtfk+MvmL5q/qlHfN7GEHcsFZWt/Tea9jRNPWUZG4G976nqAAmU9w==",
"dev": true,
"engines": {
"node": ">=0.4.0"
}
},
"node_modules/webpack-bundle-analyzer/node_modules/ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"dependencies": {
"color-convert": "^2.0.1"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"