From fca2c3e7fabf46df97be42b6a119bbd8a431b1c3 Mon Sep 17 00:00:00 2001 From: Akhil Gupta Date: Fri, 3 Sep 2021 15:46:39 +0530 Subject: [PATCH 01/21] start alerts --- server/db/dbModels.go | 47 +++++++++ server/db/dbfunctions.go | 33 +++++++ server/db/enums.go | 15 +++ server/models/alert.go | 21 ++++ server/service/alertSevice.go | 164 +++++++++++++++++++++++++++++++ server/service/vehicleService.go | 19 ++++ 6 files changed, 299 insertions(+) create mode 100644 server/models/alert.go create mode 100644 server/service/alertSevice.go diff --git a/server/db/dbModels.go b/server/db/dbModels.go index c0ac9fe..ce65b11 100644 --- a/server/db/dbModels.go +++ b/server/db/dbModels.go @@ -195,3 +195,50 @@ type VehicleAttachment struct { VehicleID string `gorm:"primaryKey" json:"vehicleId"` Title string `json:"title"` } + +type VehicleAlert struct { + Base + VehicleID string `json:"vehicleId"` + Vehicle Vehicle `json:"-"` + UserID string `json:"userId"` + User User `json:"user"` + Title string `json:"title"` + Comments string `json:"comments"` + StartDate time.Time `json:"date"` + StartOdoReading int `json:"startOdoReading"` + DistanceUnit DistanceUnit `json:"distanceUnit"` + AlertFrequency AlertFrequency `json:"alertFrequency"` + OdoFrequency int `json:"odoFrequency"` + DayFrequency int `json:"dayFrequency"` + AlertAllUsers bool `json:"alertAllUsers"` + IsActive bool `json:"isActive"` + EndDate *time.Time `json:"endDate"` + AlertType AlertType `json:"alertType"` +} +type AlertOccurance struct { + Base + VehicleID string `json:"vehicleId"` + Vehicle Vehicle `json:"-"` + VehicleAlertID string `json:"vehicleAlertId"` + VehicleAlert VehicleAlert `json:"-"` + UserID string `json:"userId"` + User User `json:"-"` + OdoReading int `json:"odoReading"` + Date *time.Time `json:"date"` + ProcessDate *time.Time `json:"processDate"` + AlertProcessType AlertType `json:"alertProcessType"` + CompleteDate *time.Time `json:"completeDate"` +} + +type Notification struct { + Base + Title string `json:"title"` + Content string `json:"content"` + UserID string `json:"userId"` + VehicleID string `json:"vehicleId"` + User User `json:"-"` + Date time.Time `json:"date"` + ReadDate *time.Time `json:"readDate"` + ParentID string `json:"parentId"` + ParentType string `json:"parentType"` +} diff --git a/server/db/dbfunctions.go b/server/db/dbfunctions.go index 363918d..ead5d10 100644 --- a/server/db/dbfunctions.go +++ b/server/db/dbfunctions.go @@ -160,6 +160,11 @@ func GetFillupsByVehicleId(id string) (*[]Fillup, error) { result := DB.Preload(clause.Associations).Order("date desc").Find(&obj, &Fillup{VehicleID: id}) return &obj, result.Error } +func GetLatestFillupsByVehicleId(id string) (*Fillup, error) { + var obj Fillup + result := DB.Preload(clause.Associations).Order("date desc").First(&obj, &Fillup{VehicleID: id}) + return &obj, result.Error +} func GetFillupsByVehicleIdSince(id string, since time.Time) (*[]Fillup, error) { var obj []Fillup result := DB.Where("date >= ? AND vehicle_id = ?", since, id).Preload(clause.Associations).Order("date desc").Find(&obj) @@ -190,6 +195,11 @@ func GetExpensesByVehicleId(id string) (*[]Expense, error) { result := DB.Preload(clause.Associations).Order("date desc").Find(&obj, &Expense{VehicleID: id}) return &obj, result.Error } +func GetLatestExpenseByVehicleId(id string) (*Expense, error) { + var obj Expense + result := DB.Preload(clause.Associations).Order("date desc").First(&obj, &Expense{VehicleID: id}) + return &obj, result.Error +} func GetExpenseById(id string) (*Expense, error) { var obj Expense result := DB.Preload(clause.Associations).First(&obj, "id=?", id) @@ -271,6 +281,29 @@ func GetVehicleAttachments(vehicleId string) (*[]Attachment, error) { } return &attachments, nil } +func GeAlertById(id string) (*VehicleAlert, error) { + var alert VehicleAlert + result := DB.Preload(clause.Associations).First(&alert, "id=?", id) + return &alert, result.Error +} +func GetAlertOccurenceByAlertId(id string) (*[]AlertOccurance, error) { + var alertOccurance []AlertOccurance + result := DB.Preload(clause.Associations).Order("created_at desc").Find(&alertOccurance, "vehicle_alert_id=?", id) + return &alertOccurance, result.Error +} + +func GetUnprocessedAlertOccurances() (*[]AlertOccurance, error) { + var alertOccurance []AlertOccurance + result := DB.Preload(clause.Associations).Order("created_at desc").Find(&alertOccurance, "process_date is NULL") + return &alertOccurance, result.Error +} +func MarkAlertOccuranceAsProcessed(id string, alertProcessType AlertType, date time.Time) error { + tx := DB.Debug().Model(&AlertOccurance{}).Where("id= ?", id). + Update("alert_process_type", alertProcessType). + Update("process_date", date) + return tx.Error + +} func UpdateSettings(setting *Setting) error { tx := DB.Save(&setting) diff --git a/server/db/enums.go b/server/db/enums.go index eb6cdf0..296d06e 100644 --- a/server/db/enums.go +++ b/server/db/enums.go @@ -36,6 +36,21 @@ const ( USER ) +type AlertFrequency int + +const ( + ONETIME AlertFrequency = iota + RECURRING +) + +type AlertType int + +const ( + DISTANCE AlertType = iota + TIME + BOTH +) + type EnumDetail struct { Short string `json:"short"` Long string `json:"long"` diff --git a/server/models/alert.go b/server/models/alert.go new file mode 100644 index 0000000..f33b572 --- /dev/null +++ b/server/models/alert.go @@ -0,0 +1,21 @@ +package models + +import ( + "time" + + "github.com/akhilrex/hammond/db" +) + +type CreateAlertModel struct { + Comments string `json:"comments"` + Title string `json:"title"` + StartDate time.Time `json:"date"` + StartOdoReading int `json:"startOdoReading"` + DistanceUnit *db.DistanceUnit `json:"distanceUnit"` + AlertFrequency *db.AlertFrequency `json:"alertFrequency"` + OdoFrequency int `json:"odoFrequency"` + DayFrequency int `json:"dayFrequency"` + AlertAllUsers bool `json:"alertAllUsers"` + IsActive bool `json:"isActive"` + AlertType *db.AlertType `json:"alertType"` +} diff --git a/server/service/alertSevice.go b/server/service/alertSevice.go new file mode 100644 index 0000000..2dac650 --- /dev/null +++ b/server/service/alertSevice.go @@ -0,0 +1,164 @@ +package service + +import ( + "errors" + "time" + + "github.com/akhilrex/hammond/db" + "github.com/akhilrex/hammond/models" +) + +func CreateAlert(model models.CreateAlertModel, vehicleId, userId string) (*db.VehicleAlert, error) { + alert := db.VehicleAlert{ + VehicleID: vehicleId, + UserID: userId, + Title: model.Title, + Comments: model.Comments, + StartDate: model.StartDate, + StartOdoReading: model.StartOdoReading, + DistanceUnit: *model.DistanceUnit, + AlertFrequency: *model.AlertFrequency, + OdoFrequency: model.OdoFrequency, + DayFrequency: model.DayFrequency, + AlertAllUsers: model.AlertAllUsers, + IsActive: model.IsActive, + AlertType: *model.AlertType, + } + tx := db.DB.Create(&alert) + if tx.Error != nil { + return nil, tx.Error + } + go CreateAlertInstance(alert.ID) + return &alert, nil +} + +func CreateAlertInstance(alertId string) error { + alert, err := db.GeAlertById(alertId) + if err != nil { + return err + } + existingOccurence, err := db.GetAlertOccurenceByAlertId(alertId) + var lastOccurance db.AlertOccurance + + if len(*existingOccurence) > 0 { + lastOccurance = (*existingOccurence)[0] + + if alert.AlertFrequency == db.ONETIME { + return errors.New("Only single occurance is possible for this kind of alert") + } + } + users := []string{alert.UserID} + if alert.AlertAllUsers { + allUsers, err := db.GetVehicleUsers(alert.VehicleID) + if err != nil { + return err + } + users = make([]string, len(*allUsers)) + for i, user := range *allUsers { + users[i] = user.UserID + } + } + + for _, userId := range users { + model := db.AlertOccurance{ + VehicleID: alert.VehicleID, + UserID: userId, + VehicleAlertID: alertId, + } + + if alert.AlertType == db.DISTANCE || alert.AlertType == db.BOTH { + model.OdoReading = alert.StartOdoReading + alert.OdoFrequency + if &lastOccurance != nil { + model.OdoReading = lastOccurance.OdoReading + alert.OdoFrequency + } + } + if alert.AlertType == db.TIME || alert.AlertType == db.BOTH { + date := alert.StartDate.Add(time.Duration(alert.DayFrequency) * 24 * time.Hour) + if &lastOccurance != nil { + date = lastOccurance.Date.Add(time.Duration(alert.DayFrequency) * 24 * time.Hour) + } + model.Date = &date + } + tx := db.DB.Create(&model) + if tx.Error != nil { + return tx.Error + } + } + return nil + +} + +func ProcessAlertOccurance(occurance db.AlertOccurance, today time.Time) error { + if occurance.ProcessDate != nil { + return errors.New("Alert occurence already processed") + } + alert := occurance.VehicleAlert + if !alert.IsActive { + return errors.New("Alert is not active") + } + notification := db.Notification{ + Title: alert.Title, + Content: alert.Comments, + UserID: occurance.UserID, + VehicleID: occurance.VehicleID, + Date: today, + ParentID: occurance.ID, + ParentType: "AlertOccurance", + } + var alertProcessType db.AlertType + if alert.AlertType == db.DISTANCE || alert.AlertType == db.BOTH { + odoReading, err := GetLatestOdoReadingForVehicle(occurance.VehicleID) + if err != nil { + return err + } + if odoReading >= occurance.OdoReading { + alertProcessType = db.DISTANCE + } + } + if alert.AlertType == db.TIME || alert.AlertType == db.BOTH { + if occurance.Date.Before(today) { + alertProcessType = db.TIME + } + } + + db.DB.Create(¬ification) + return db.MarkAlertOccuranceAsProcessed(occurance.ID, alertProcessType, today) + +} + +func FindAlertOccurancesToProcess(today time.Time) ([]db.AlertOccurance, error) { + occurances, err := db.GetUnprocessedAlertOccurances() + if err != nil { + return nil, err + } + if len(*occurances) == 0 { + return make([]db.AlertOccurance, 0), nil + } + + var toReturn []db.AlertOccurance + + for _, occurance := range *occurances { + alert := occurance.VehicleAlert + if !alert.IsActive { + continue + } + if alert.AlertType == db.DISTANCE || alert.AlertType == db.BOTH { + odoReading, err := GetLatestOdoReadingForVehicle(occurance.VehicleID) + if err != nil { + return nil, err + } + if odoReading >= occurance.OdoReading { + toReturn = append(toReturn, occurance) + continue + } + } + if alert.AlertType == db.TIME || alert.AlertType == db.BOTH { + if occurance.Date.Before(today) { + toReturn = append(toReturn, occurance) + continue + } + } + + } + return toReturn, nil +} diff --git a/server/service/vehicleService.go b/server/service/vehicleService.go index 5e853af..6f1ccbd 100644 --- a/server/service/vehicleService.go +++ b/server/service/vehicleService.go @@ -5,6 +5,7 @@ import ( "github.com/akhilrex/hammond/db" "github.com/akhilrex/hammond/models" + "gorm.io/gorm" "gorm.io/gorm/clause" ) @@ -243,6 +244,24 @@ func GetDistinctFuelSubtypesForVehicle(vehicleId string) ([]string, error) { return names, tx.Error } +func GetLatestOdoReadingForVehicle(vehicleId string) (int, error) { + odoReading := 0 + latestFillup, err := db.GetLatestExpenseByVehicleId(vehicleId) + if err != nil && err != gorm.ErrRecordNotFound { + return 0, err + } + odoReading = latestFillup.OdoReading + + latestExpense, err := db.GetLatestExpenseByVehicleId(vehicleId) + if err != nil && err != gorm.ErrRecordNotFound { + return 0, err + } + if latestExpense.OdoReading > odoReading { + odoReading = latestExpense.OdoReading + } + return odoReading, nil +} + func GetUserStats(userId string, model models.UserStatsQueryModel) ([]models.VehicleStatsModel, error) { vehicles, err := GetUserVehicles(userId) From 04f45fe385007821123ecd66d8bead4a3124061f Mon Sep 17 00:00:00 2001 From: MeIchthys <10717998+meichthys@users.noreply.github.com> Date: Thu, 20 Jan 2022 23:55:39 -0500 Subject: [PATCH 02/21] remove whitespace from JWT_SECRET When deploying with the whitespace around the `=`, docker complains. --- docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index d136465..31f0ea2 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -4,7 +4,7 @@ services: image: akhilrex/hammond container_name: hammond environment: - - JWT_SECRET = somethingverystrong + - JWT_SECRET=somethingverystrong volumes: - /path/to/config:/config - /path/to/data:/assets From acba47fede8ba1f9952ad77eae7f9a4590ce3fa8 Mon Sep 17 00:00:00 2001 From: Alf Sebastian Houge Date: Sat, 5 Mar 2022 19:10:35 +0100 Subject: [PATCH 03/21] Add contributing instructions --- README.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/README.md b/README.md index 1c150c3..ca7f9d4 100644 --- a/README.md +++ b/README.md @@ -35,6 +35,7 @@ - [Built With](#built-with) - [Features](#features) - [Installation](#installation) +- [Contributing](#contributing) - [License](#license) - [Roadmap](#roadmap) - [Contact](#contact) @@ -157,6 +158,31 @@ Once done you will be taken to the login page. Go through the settings page once and change relevant settings before you start adding vehicles and expenses. +## Contributing + +### Dev Setup + +If you want to contribute to the project you need to set it up +for development first. + +Fork and clone the project. Once you have it on your own machine, +open up a terminal and navigate to the `server/` directory. + +In the `server/` directory run the command `go run main.go`. +After some initial +setup, the server should be listening on at port `3000`. + +Next, open a new terminal. Navigate to the `ui/` directory and run `npm install`. +This will install all the dependencies for the frontend. +After the command is done running, run `npm run dev`. After some output, the +frontend should be accessible at `http://localhost:8080`. + +If you are sent straight to the login screen, try closing the page and opening +it again. You should be greeted with a setup wizard the first time you run the +project. + +Now, simply follow the instructions in order to set up your fresh install. + ## License Distributed under the GPL-3.0 License. See `LICENSE` for more information. From d9a99d432ce4b74cb68a73ffb67fc269e59441ed Mon Sep 17 00:00:00 2001 From: Alf Sebastian Houge Date: Mon, 7 Mar 2022 00:13:50 +0100 Subject: [PATCH 04/21] Make emails case insensitive --- server/controllers/auth.go | 3 ++- server/db/migrations.go | 4 ++++ server/service/userService.go | 4 +++- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/server/controllers/auth.go b/server/controllers/auth.go index b130739..f7acfd0 100644 --- a/server/controllers/auth.go +++ b/server/controllers/auth.go @@ -5,6 +5,7 @@ import ( "fmt" "net/http" "os" + "strings" "github.com/akhilrex/hammond/common" "github.com/akhilrex/hammond/db" @@ -91,7 +92,7 @@ func userLogin(c *gin.Context) { c.JSON(http.StatusUnprocessableEntity, common.NewValidatorError(err)) return } - user, err := db.FindOneUser(&db.User{Email: loginRequest.Email}) + user, err := db.FindOneUser(&db.User{Email: strings.ToLower(loginRequest.Email)}) if err != nil { c.JSON(http.StatusForbidden, common.NewError("login", errors.New("Not Registered email or invalid password"))) diff --git a/server/db/migrations.go b/server/db/migrations.go index cddd3b3..ded1a96 100644 --- a/server/db/migrations.go +++ b/server/db/migrations.go @@ -18,6 +18,10 @@ var migrations = []localMigration{ Name: "2021_06_24_04_42_SetUserDisabledFalse", Query: "update users set is_disabled=0", }, + { + Name: "2021_02_07_00_09_LowerCaseEmails", + Query: "update users set email=lower(email)", + }, } func RunMigrations() { diff --git a/server/service/userService.go b/server/service/userService.go index bdd568f..8a225e6 100644 --- a/server/service/userService.go +++ b/server/service/userService.go @@ -1,6 +1,8 @@ package service import ( + "strings" + "github.com/akhilrex/hammond/db" "github.com/akhilrex/hammond/models" ) @@ -8,7 +10,7 @@ import ( func CreateUser(userModel *models.RegisterRequest, role db.Role) error { setting := db.GetOrCreateSetting() toCreate := db.User{ - Email: userModel.Email, + Email: strings.ToLower(userModel.Email), Name: userModel.Name, Role: role, Currency: setting.Currency, From a729b5eb123c32590218decd9ba60595cbe46cee Mon Sep 17 00:00:00 2001 From: Alf Sebastian Houge Date: Mon, 7 Mar 2022 00:46:33 +0100 Subject: [PATCH 05/21] Add icon for mobile homescreens --- ui/public/index.html | 1 + ui/public/touch-icon.png | Bin 0 -> 2706 bytes 2 files changed, 1 insertion(+) create mode 100644 ui/public/touch-icon.png diff --git a/ui/public/index.html b/ui/public/index.html index b5daafa..06ccc59 100644 --- a/ui/public/index.html +++ b/ui/public/index.html @@ -5,6 +5,7 @@ + <%= webpackConfig.name %> diff --git a/ui/public/touch-icon.png b/ui/public/touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..c76ba00ecbf35ddca59b612d81f75a7d7a67b652 GIT binary patch literal 2706 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 literal 0 HcmV?d00001 From 1857bb05188a6451e0ce79e9b3cfc6e1fefdca93 Mon Sep 17 00:00:00 2001 From: Alf Sebastian Houge Date: Mon, 7 Mar 2022 10:41:28 +0100 Subject: [PATCH 06/21] Change icon to gas pump icon instead of text --- ui/public/touch-icon.png | Bin 2706 -> 2858 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/ui/public/touch-icon.png b/ui/public/touch-icon.png index c76ba00ecbf35ddca59b612d81f75a7d7a67b652..1afeb19e8e7760c524b5121d074a3d02349569ee 100644 GIT binary patch delta 2763 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 m@d_f7&;kvU&;kn=ApHxbg^@1mI?QVT0000 Date: Mon, 7 Mar 2022 16:53:47 +0100 Subject: [PATCH 07/21] Change favicon to match mobile icon --- ui/public/hammond.png | Bin 463 -> 895 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/ui/public/hammond.png b/ui/public/hammond.png index 537318bb42c2970963a89081856304e0f6512c05..df48b565dfdf3f8167c2e83aecc13dc63b82ee87 100644 GIT binary patch literal 895 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE0wix1Z>k4UEa{HEjtmSN`?>!lvVtU&J%W50 z7^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+@+{-G$+Qd;gjJKpuOE zr>`sfGiG*v1Je-krMrRhDxNNmAs)x)UbW5$aTGcB@&28dMV%@fo0PN;x-U}T>WYZ? zq2a{hc=41{rcUtB193Szro9n2JwG&xHT}>tZPjEEJ$QUoXVVImBN}#_lQ*8+b@T3; zotE2oo;mZ~{`qXn^1KtmIYl@0EDyd>`t_#It~u$%=IHr-kzU>{4)+AFJJoHj%U(5| zW&huKj`uV|1uB+Wm#*0MXJN5hc2(E3msb@x-I^E@{#HnTXXx=mT-m-3>005sel=g% ze7BwMyqwl<`{DTdl^0!CF4^^Gy`R*PwB;t@XKF7zPQB?76&v@c?ezlBWY>Qg`zl3O zuYR=r_P;4CSJ@u_XSiQ$@OuSghv}y@2A2Chx3iw!VF-NG+Rt~RgVS-Q?83P~9ORq9bKNZi!@>uWH zrhSXfr}28&d_EWFdF)TBsLjS3r_TI5ZC2>hUCE(w<=3fn7N2W((r#3*JR%&gb3H2j zT9nnwE9%{vH=cDZw(8xP+Rj_F<3YIZN5|jG&-AtYsl0nMS?1FFjX%q7Eq6`2!I>Ot z8+hT_jxgb)Gfyk-cisO@scF7YFV~_4AKrgkUvSr=wRWxblbf%%gif|U6Le(PUkTQG zRLC6(6*J?%@@$`*xm=|8{ZSu6`{CSzr=UEpd$~Nl7e8wMs5Z1yT$~ z21Z7@2FAJu<{^frRwfo!rpDR^237_JYOYIMP&DM`r(~v8;?@u@A@c*MA-pOiq9iD> zT%n*SKP@vSRiUJ^AXOo=pd^`rp<>SCPdprjVHz5z{7;|pd>X{Stjw*K%q^@e>^)h8 zSy;iP!Q^lXv-0K;h0`~#oH%mkh|Cf8(+wUAy!04ei3^r|ax$F?w1UCY)z4*}Q$iB} DM|q&CTZG_R6PJ@rx>mT3=S{wd zAHUhj7PfSty}}CKH2EGbbPZ0j&e(d3%$2& Date: Tue, 15 Mar 2022 14:21:17 +0100 Subject: [PATCH 08/21] Calculate mileage on odometer order instead of time --- server/service/reportService.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/server/service/reportService.go b/server/service/reportService.go index f0e7b93..d58b9cd 100644 --- a/server/service/reportService.go +++ b/server/service/reportService.go @@ -1,6 +1,7 @@ package service import ( + "sort" "time" "github.com/akhilrex/hammond/db" @@ -15,6 +16,9 @@ func GetMileageByVehicleId(vehicleId string, since time.Time) (mileage []models. fillups := make([]db.Fillup, len(*data)) copy(fillups, *data) + sort.Slice(fillups, func(i, j int) bool { + return fillups[i].OdoReading > fillups[j].OdoReading + }) var mileages []models.MileageModel From fb742f19a7b32bb5039c6eadb0014d8b9ea660f9 Mon Sep 17 00:00:00 2001 From: Alf Sebastian Houge Date: Sun, 17 Apr 2022 18:50:14 +0200 Subject: [PATCH 09/21] Change currency field from select to autocomplete --- ui/src/router/views/initialize.vue | 88 +++++++++++++----------------- ui/src/router/views/settings.vue | 32 +++++++++-- 2 files changed, 66 insertions(+), 54 deletions(-) diff --git a/ui/src/router/views/initialize.vue b/ui/src/router/views/initialize.vue index 8401a34..d389a35 100644 --- a/ui/src/router/views/initialize.vue +++ b/ui/src/router/views/initialize.vue @@ -21,13 +21,27 @@ export default { email: '', password: '', distanceUnit: 1, - currency: 'INR', + currency: '', }, } }, computed: { ...mapGetters('auth', ['isInitialized']), ...mapState('vehicles', ['currencyMasters', 'distanceUnitMasters']), + filteredCurrencyMasters() { + return this.currencyMasters.filter((option) => { + return ( + option.namePlural + .toString() + .toLowerCase() + .indexOf(this.registerModel.currency.toLowerCase()) >= 0 || + option.code + .toString() + .toLowerCase() + .indexOf(this.registerModel.currency.toLowerCase()) >= 0 + ) + }) + }, }, mounted() { store.dispatch('vehicles/fetchMasters').then((data) => {}) @@ -139,6 +153,9 @@ export default { }) .finally(() => (this.isWorking = false)) }, + formatCurrency(option) { + return `${option.namePlural} (${option.code})` + }, }, } @@ -148,15 +165,10 @@ export default {

Migrate from Clarkson

- If you have an existing Clarkson deployment and you want to migrate your data from that, - press the following button. + If you have an existing Clarkson deployment and you want to migrate your data from that, press the following button.


- - Migrate from Clarkson + Migrate from Clarkson

Fresh Install

@@ -170,21 +182,12 @@ export default {

Migrate from Clarkson

+

You need to make sure that this deployment of Hammond can access the MySQL database used by Clarkson.

+

If that is not directly possible, you can make a copy of that database somewhere accessible from this instance.

+

Once that is done, enter the connection string to the MySQL instance in the following format.

You need to make sure that this deployment of Hammond can access the MySQL database used by - Clarkson.

-

If that is not directly possible, you can make a copy of that database somewhere accessible - from this instance.

-

Once that is done, enter the connection string to the MySQL instance in the following - format.

-

All the users imported from Clarkson will have their username as their email in Clarkson - database and pasword set to hammond

All the users imported from Clarkson will have their username as their email in Clarkson database and pasword set to + hammond

user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local @@ -200,15 +203,8 @@ export default {
- Test ConnectionMigrate + Test ConnectionMigrate Cancel
@@ -222,28 +218,22 @@ export default { - + - - - + - + diff --git a/ui/src/router/views/settings.vue b/ui/src/router/views/settings.vue index 4f94c7e..856faa9 100644 --- a/ui/src/router/views/settings.vue +++ b/ui/src/router/views/settings.vue @@ -44,6 +44,20 @@ export default { return this.changePassModel.new === this.changePassModel.renew }, + filteredCurrencyMasters() { + return this.currencyMasters.filter((option) => { + return ( + option.namePlural + .toString() + .toLowerCase() + .indexOf(this.settingsModel.currency.toLowerCase()) >= 0 || + option.code + .toString() + .toLowerCase() + .indexOf(this.settingsModel.currency.toLowerCase()) >= 0 + ) + }) + }, }, methods: { changePassword() { @@ -109,6 +123,9 @@ export default { this.tryingToSave = false }) }, + formatCurrency(option) { + return `${option.namePlural} (${option.code})` + }, }, } @@ -123,11 +140,16 @@ export default { These will be used as default values whenever you create a new fillup or expense. - - - + From 43d1ca0c66e46e8e8ab8c2ee22bf0c1045a60466 Mon Sep 17 00:00:00 2001 From: Alf Sebastian Houge Date: Sun, 17 Apr 2022 17:58:54 +0200 Subject: [PATCH 10/21] Tag login email field as email type --- ui/src/router/views/login.vue | 30 ++++++++---------------------- 1 file changed, 8 insertions(+), 22 deletions(-) diff --git a/ui/src/router/views/login.vue b/ui/src/router/views/login.vue index 2b1765b..c3bb8de 100644 --- a/ui/src/router/views/login.vue +++ b/ui/src/router/views/login.vue @@ -16,7 +16,7 @@ export default { password: '', authError: null, tryingToLogIn: false, - errorMessage:'' + errorMessage: '', } }, computed: { @@ -38,7 +38,7 @@ export default { // and password they provided. tryToLogIn() { this.tryingToLogIn = true - this.errorMessage=''; + this.errorMessage = '' // Reset the authError if it existed. this.authError = null return this.logIn({ @@ -53,9 +53,9 @@ export default { // Redirect to the originally requested page, or to the home page }) .catch((error) => { - if(error.response.data?.errors?.login){ - this.errorMessage=error.response.data.errors.login - } + if (error.response.data?.errors?.login) { + this.errorMessage = error.response.data.errors.login + } this.tryingToLogIn = false this.authError = error }) @@ -67,21 +67,9 @@ export default { From dcb58bbbdba29189251321ca5bd884268049de55 Mon Sep 17 00:00:00 2001 From: Akhil Gupta Date: Tue, 26 Apr 2022 11:54:55 +0530 Subject: [PATCH 11/21] some alerting code --- server/service/alertSevice.go | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/server/service/alertSevice.go b/server/service/alertSevice.go index 2dac650..9e7462c 100644 --- a/server/service/alertSevice.go +++ b/server/service/alertSevice.go @@ -38,11 +38,15 @@ func CreateAlertInstance(alertId string) error { return err } existingOccurence, err := db.GetAlertOccurenceByAlertId(alertId) + if err != nil { + return err + } var lastOccurance db.AlertOccurance + useOccurance := false if len(*existingOccurence) > 0 { lastOccurance = (*existingOccurence)[0] - + useOccurance = true if alert.AlertFrequency == db.ONETIME { return errors.New("Only single occurance is possible for this kind of alert") } @@ -68,13 +72,13 @@ func CreateAlertInstance(alertId string) error { if alert.AlertType == db.DISTANCE || alert.AlertType == db.BOTH { model.OdoReading = alert.StartOdoReading + alert.OdoFrequency - if &lastOccurance != nil { + if useOccurance { model.OdoReading = lastOccurance.OdoReading + alert.OdoFrequency } } if alert.AlertType == db.TIME || alert.AlertType == db.BOTH { date := alert.StartDate.Add(time.Duration(alert.DayFrequency) * 24 * time.Hour) - if &lastOccurance != nil { + if useOccurance { date = lastOccurance.Date.Add(time.Duration(alert.DayFrequency) * 24 * time.Hour) } model.Date = &date @@ -162,3 +166,7 @@ func FindAlertOccurancesToProcess(today time.Time) ([]db.AlertOccurance, error) } return toReturn, nil } + +func MarkAlertOccuranceAsCompleted() { + +} From e471e80617e267f204257c50d004c4eb89364f05 Mon Sep 17 00:00:00 2001 From: Akhil Gupta Date: Tue, 26 Apr 2022 12:25:33 +0530 Subject: [PATCH 12/21] try fix breaking build --- .github/workflows/hub.yml | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/.github/workflows/hub.yml b/.github/workflows/hub.yml index afc2d93..0d48b09 100644 --- a/.github/workflows/hub.yml +++ b/.github/workflows/hub.yml @@ -8,38 +8,36 @@ jobs: multi: runs-on: ubuntu-latest steps: - - - name: Checkout + - name: Checkout uses: actions/checkout@v2 - - - name: Set up QEMU + - name: Set up QEMU + id: qemu uses: docker/setup-qemu-action@v1 - - - name: Set up Docker Buildx + with: + platforms: linux/amd64,linux/arm64,linux/arm/v7 + - name: Available platforms + run: echo ${{ steps.qemu.outputs.platforms } + - name: Set up Docker Buildx uses: docker/setup-buildx-action@v1 - - - name: Set up build cache + - name: Set up build cache uses: actions/cache@v2 with: path: /tmp/.buildx-cache key: ${{ runner.os }}-buildx-${{ github.sha }} restore-keys: | ${{ runner.os }}-buildx- - - - name: Login to DockerHub - uses: docker/login-action@v1 + - name: Login to DockerHub + uses: docker/login-action@v1 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - - - name: Login to GitHub + - name: Login to GitHub uses: docker/login-action@v1 with: registry: ghcr.io username: ${{ github.repository_owner }} password: ${{ secrets.CR_PAT }} - - - name: Build and push + - name: Build and push uses: docker/build-push-action@v2 with: context: . From 7a8916c9cd13b20bab15b16a21879fce270cbd58 Mon Sep 17 00:00:00 2001 From: Akhil Gupta Date: Tue, 26 Apr 2022 12:27:01 +0530 Subject: [PATCH 13/21] fix file --- .github/workflows/hub.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/hub.yml b/.github/workflows/hub.yml index 0d48b09..af22356 100644 --- a/.github/workflows/hub.yml +++ b/.github/workflows/hub.yml @@ -16,7 +16,7 @@ jobs: with: platforms: linux/amd64,linux/arm64,linux/arm/v7 - name: Available platforms - run: echo ${{ steps.qemu.outputs.platforms } + run: echo ${{ steps.qemu.outputs.platforms }} - name: Set up Docker Buildx uses: docker/setup-buildx-action@v1 - name: Set up build cache From 69352af9069eefe95dd53a583b64f35134509750 Mon Sep 17 00:00:00 2001 From: Akhil Gupta Date: Tue, 26 Apr 2022 12:59:31 +0530 Subject: [PATCH 14/21] build fixed --- Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 02c249f..a9b7400 100644 --- a/Dockerfile +++ b/Dockerfile @@ -9,7 +9,7 @@ RUN go mod download COPY ./server . RUN go build -o ./app ./main.go -FROM node:latest as build-stage +FROM node:14 as build-stage WORKDIR /app COPY ./ui/package*.json ./ RUN npm install @@ -36,4 +36,4 @@ COPY --from=builder /api/app . #COPY dist ./dist COPY --from=build-stage /app/dist ./dist EXPOSE 3000 -ENTRYPOINT ["./app"] \ No newline at end of file +ENTRYPOINT ["./app"] From 05bb22fe4e382604f6c6e5ae79ccbe69a85dafab Mon Sep 17 00:00:00 2001 From: Akhil Gupta Date: Tue, 26 Apr 2022 13:34:26 +0530 Subject: [PATCH 15/21] update a couple of packages and bump version --- README.md | 2 +- ui/package-lock.json | 1449 ++++++++++++++++++++++-------- ui/package.json | 6 +- ui/src/router/views/settings.vue | 2 +- 4 files changed, 1060 insertions(+), 399 deletions(-) diff --git a/README.md b/README.md index 1c150c3..152a658 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ -->

Hammond

-

Current Version - 2021.09.20

+

Current Version - 2022.04.26

A self-hosted vehicle expense tracking system with support for multiple users. diff --git a/ui/package-lock.json b/ui/package-lock.json index 577fd9e..9de2935 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -1473,65 +1473,102 @@ "dev": true }, "@soda/friendly-errors-webpack-plugin": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@soda/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.8.0.tgz", - "integrity": "sha512-RLotfx6k1+nfLacwNCenj7VnTMPxVwYKoGOcffMFoJDKM8tXzBiCN0hMHFJNnoAojduYAsxuiMm0EOMixgiRow==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@soda/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.8.1.tgz", + "integrity": "sha512-h2ooWqP8XuFqTXT+NyAFbrArzfQA7R6HTezADrvD9Re8fxMLTPPniLdqVTdDaO0eIoLaAwKT+d6w+5GeTk7Vbg==", "dev": true, "requires": { - "chalk": "^2.4.2", - "error-stack-parser": "^2.0.2", - "string-width": "^2.0.0", - "strip-ansi": "^5" + "chalk": "^3.0.0", + "error-stack-parser": "^2.0.6", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" }, "dependencies": { "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "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, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" } }, "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "requires": { - "ansi-regex": "^4.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - } + "ansi-regex": "^5.0.1" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" } } } @@ -1586,6 +1623,16 @@ "@babel/types": "^7.3.0" } }, + "@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dev": true, + "requires": { + "@types/connect": "*", + "@types/node": "*" + } + }, "@types/chart.js": { "version": "2.9.34", "resolved": "https://registry.npmjs.org/@types/chart.js/-/chart.js-2.9.34.tgz", @@ -1594,6 +1641,48 @@ "moment": "^2.10.2" } }, + "@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/connect-history-api-fallback": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", + "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", + "dev": true, + "requires": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "@types/express": { + "version": "4.17.13", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", + "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", + "dev": true, + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.18", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "@types/express-serve-static-core": { + "version": "4.17.28", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz", + "integrity": "sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, "@types/glob": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", @@ -1604,6 +1693,21 @@ "@types/node": "*" } }, + "@types/highlight.js": { + "version": "9.12.4", + "resolved": "https://registry.npmjs.org/@types/highlight.js/-/highlight.js-9.12.4.tgz", + "integrity": "sha512-t2szdkwmg2JJyuCM20e8kR2X59WCE5Zkl4bzm1u1Oukjm79zpbiAv+QjnwLnuuV0WHEcX2NgUItu0pAMKuOPww==", + "dev": true + }, + "@types/http-proxy": { + "version": "1.17.8", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.8.tgz", + "integrity": "sha512-5kPLG5BKpWYkw/LVOGWpiq3nEVqxiN32rTgI53Sk12/xHFQ2rG3ehI9IO+O3W2QoKeyB92dJkoka8SUm6BX1pA==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/istanbul-lib-coverage": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", @@ -1644,6 +1748,44 @@ "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==", "dev": true }, + "@types/linkify-it": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.2.tgz", + "integrity": "sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA==", + "dev": true + }, + "@types/markdown-it": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-10.0.3.tgz", + "integrity": "sha512-daHJk22isOUvNssVGF2zDnnSyxHhFYhtjeX4oQaKD6QzL3ZR1QSgiD1g+Q6/WSWYVogNXYDXODtbgW/WiFCtyw==", + "dev": true, + "requires": { + "@types/highlight.js": "^9.7.0", + "@types/linkify-it": "*", + "@types/mdurl": "*", + "highlight.js": "^9.7.0" + }, + "dependencies": { + "highlight.js": { + "version": "9.18.5", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.18.5.tgz", + "integrity": "sha512-a5bFyofd/BHCX52/8i8uJkjr9DYwXIPnM/plwI6W7ezItLGqzt7X2G2nXuYSfsIJdkwwj/g9DG1LkcGJI/dDoA==", + "dev": true + } + } + }, + "@types/mdurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.2.tgz", + "integrity": "sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==", + "dev": true + }, + "@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", + "dev": true + }, "@types/minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.4.tgz", @@ -1680,6 +1822,34 @@ "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==", "dev": true }, + "@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true + }, + "@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "dev": true + }, + "@types/serve-static": { + "version": "1.13.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", + "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", + "dev": true, + "requires": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "@types/source-list-map": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", + "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==", + "dev": true + }, "@types/stack-utils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", @@ -1698,6 +1868,29 @@ "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==", "dev": true }, + "@types/tapable": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.8.tgz", + "integrity": "sha512-ipixuVrh2OdNmauvtT51o3d8z12p6LtFW9in7U79der/kwejjdNchQC5UMn5u/KxNoM7VHHOs/l8KS8uHxhODQ==", + "dev": true + }, + "@types/uglify-js": { + "version": "3.13.2", + "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.13.2.tgz", + "integrity": "sha512-/xFrPIo+4zOeNGtVMbf9rUm0N+i4pDf1ynExomqtokIJmVzR3962lJ1UE+MmexMkA0cmN9oTzg5Xcbwge0Ij2Q==", + "dev": true, + "requires": { + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, "@types/unist": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.3.tgz", @@ -1724,6 +1917,130 @@ "vfile-message": "*" } }, + "@types/webpack": { + "version": "4.41.32", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.32.tgz", + "integrity": "sha512-cb+0ioil/7oz5//7tZUSwbrSAN/NWHrQylz5cW8G0dWTcF/g+/dSdMlKVZspBYuMAN1+WnwHrkxiRrLcwd0Heg==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/tapable": "^1", + "@types/uglify-js": "*", + "@types/webpack-sources": "*", + "anymatch": "^3.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "@types/webpack-dev-server": { + "version": "3.11.6", + "resolved": "https://registry.npmjs.org/@types/webpack-dev-server/-/webpack-dev-server-3.11.6.tgz", + "integrity": "sha512-XCph0RiiqFGetukCTC3KVnY1jwLcZ84illFRMbyFzCcWl90B/76ew0tSqF46oBhnLC4obNDG7dMO0JfTN0MgMQ==", + "dev": true, + "requires": { + "@types/connect-history-api-fallback": "*", + "@types/express": "*", + "@types/serve-static": "*", + "@types/webpack": "^4", + "http-proxy-middleware": "^1.0.0" + }, + "dependencies": { + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "http-proxy-middleware": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-1.3.1.tgz", + "integrity": "sha512-13eVVDYS4z79w7f1+NPllJtOQFx/FdUW4btIvVRMaRlUY9VGstAbo5MOhLEuUgZFRHn3x50ufn25zkj/boZnEg==", + "dev": true, + "requires": { + "@types/http-proxy": "^1.17.5", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + } + } + }, + "@types/webpack-sources": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-3.2.0.tgz", + "integrity": "sha512-Ft7YH3lEVRQ6ls8k4Ff1oB4jN6oy/XmU6tQISKdhfh+1mR+viZFphS6WL0IrtDOzvefmJg5a0s7ZQoRXwqTEFg==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/source-list-map": "*", + "source-map": "^0.7.3" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } + } + }, "@types/yargs": { "version": "13.0.11", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.11.tgz", @@ -2197,9 +2514,9 @@ "dev": true }, "ssri": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-7.1.0.tgz", - "integrity": "sha512-77/WrDZUWocK0mvA5NTRQyveUf+wsrIc6vyrxpS8tVvYBcX215QbafrJR3KtkpskIzoFLqqNuuYQvxaMjXJ/0g==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-7.1.1.tgz", + "integrity": "sha512-w+daCzXN89PseTL99MkA+fxJEcU3wfaE/ah0i0lnOlpG1CYLJ2ZjzEry68YBKfLs4JfoTShrTEsJkAZuNZ/stw==", "dev": true, "requires": { "figgy-pudding": "^3.5.1", @@ -2367,20 +2684,22 @@ "dev": true }, "@vuepress/core": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/@vuepress/core/-/core-1.8.2.tgz", - "integrity": "sha512-lh9BLC06k9s0wxTuWtCkiNj49fkbW87enp0XSrFZHEoyDGSGndQjZmMMErcHc5Hx7nrW1nzc33sPH1NNtJl0hw==", + "version": "1.9.7", + "resolved": "https://registry.npmjs.org/@vuepress/core/-/core-1.9.7.tgz", + "integrity": "sha512-u5eb1mfNLV8uG2UuxlvpB/FkrABxeMHqymTsixOnsOg2REziv9puEIbqaZ5BjLPvbCDvSj6rn+DwjENmBU+frQ==", "dev": true, "requires": { "@babel/core": "^7.8.4", "@vue/babel-preset-app": "^4.1.2", - "@vuepress/markdown": "1.8.2", - "@vuepress/markdown-loader": "1.8.2", - "@vuepress/plugin-last-updated": "1.8.2", - "@vuepress/plugin-register-components": "1.8.2", - "@vuepress/shared-utils": "1.8.2", + "@vuepress/markdown": "1.9.7", + "@vuepress/markdown-loader": "1.9.7", + "@vuepress/plugin-last-updated": "1.9.7", + "@vuepress/plugin-register-components": "1.9.7", + "@vuepress/shared-utils": "1.9.7", + "@vuepress/types": "1.9.7", "autoprefixer": "^9.5.1", "babel-loader": "^8.0.4", + "bundle-require": "2.1.8", "cache-loader": "^3.0.0", "chokidar": "^2.0.3", "connect-history-api-fallback": "^1.5.0", @@ -2388,6 +2707,7 @@ "core-js": "^3.6.4", "cross-spawn": "^6.0.5", "css-loader": "^2.1.1", + "esbuild": "0.14.7", "file-loader": "^3.0.1", "js-yaml": "^3.13.1", "lru-cache": "^5.1.1", @@ -2412,6 +2732,69 @@ "webpackbar": "3.2.0" }, "dependencies": { + "@vuepress/markdown": { + "version": "1.9.7", + "resolved": "https://registry.npmjs.org/@vuepress/markdown/-/markdown-1.9.7.tgz", + "integrity": "sha512-DFOjYkwV6fT3xXTGdTDloeIrT1AbwJ9pwefmrp0rMgC6zOz3XUJn6qqUwcYFO5mNBWpbiFQ3JZirCtgOe+xxBA==", + "dev": true, + "requires": { + "@vuepress/shared-utils": "1.9.7", + "markdown-it": "^8.4.1", + "markdown-it-anchor": "^5.0.2", + "markdown-it-chain": "^1.3.0", + "markdown-it-emoji": "^1.4.0", + "markdown-it-table-of-contents": "^0.4.0", + "prismjs": "^1.13.0" + } + }, + "@vuepress/markdown-loader": { + "version": "1.9.7", + "resolved": "https://registry.npmjs.org/@vuepress/markdown-loader/-/markdown-loader-1.9.7.tgz", + "integrity": "sha512-mxXF8FtX/QhOg/UYbe4Pr1j5tcf/aOEI502rycTJ3WF2XAtOmewjkGV4eAA6f6JmuM/fwzOBMZKDyy9/yo2I6Q==", + "dev": true, + "requires": { + "@vuepress/markdown": "1.9.7", + "loader-utils": "^1.1.0", + "lru-cache": "^5.1.1" + } + }, + "@vuepress/plugin-last-updated": { + "version": "1.9.7", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-last-updated/-/plugin-last-updated-1.9.7.tgz", + "integrity": "sha512-FiFBOl49dlFRjbLRnRAv77HDWfe+S/eCPtMQobq4/O3QWuL3Na5P4fCTTVzq1K7rWNO9EPsWNB2Jb26ndlQLKQ==", + "dev": true, + "requires": { + "@vuepress/types": "1.9.7", + "cross-spawn": "^6.0.5" + } + }, + "@vuepress/plugin-register-components": { + "version": "1.9.7", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-register-components/-/plugin-register-components-1.9.7.tgz", + "integrity": "sha512-l/w1nE7Dpl+LPMb8+AHSGGFYSP/t5j6H4/Wltwc2QcdzO7yqwC1YkwwhtTXvLvHOV8O7+rDg2nzvq355SFkfKA==", + "dev": true, + "requires": { + "@vuepress/shared-utils": "1.9.7", + "@vuepress/types": "1.9.7" + } + }, + "@vuepress/shared-utils": { + "version": "1.9.7", + "resolved": "https://registry.npmjs.org/@vuepress/shared-utils/-/shared-utils-1.9.7.tgz", + "integrity": "sha512-lIkO/eSEspXgVHjYHa9vuhN7DuaYvkfX1+TTJDiEYXIwgwqtvkTv55C+IOdgswlt0C/OXDlJaUe1rGgJJ1+FTw==", + "dev": true, + "requires": { + "chalk": "^2.3.2", + "escape-html": "^1.0.3", + "fs-extra": "^7.0.1", + "globby": "^9.2.0", + "gray-matter": "^4.0.1", + "hash-sum": "^1.0.2", + "semver": "^6.0.0", + "toml": "^3.0.0", + "upath": "^1.1.0" + } + }, "anymatch": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", @@ -2498,6 +2881,12 @@ "schema-utils": "^1.0.0" } }, + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true + }, "file-loader": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-3.0.1.tgz", @@ -2559,6 +2948,12 @@ } } }, + "hash-sum": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", + "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=", + "dev": true + }, "is-binary-path": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", @@ -2586,6 +2981,27 @@ "requires": { "pify": "^4.0.1", "semver": "^5.6.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "markdown-it": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.2.tgz", + "integrity": "sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "entities": "~1.1.1", + "linkify-it": "^2.0.0", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" } }, "mini-css-extract-plugin": { @@ -2701,12 +3117,6 @@ "ajv-keywords": "^3.1.0" } }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, "sort-keys": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", @@ -2728,60 +3138,13 @@ } }, "vue-router": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.5.1.tgz", - "integrity": "sha512-RRQNLT8Mzr8z7eL4p7BtKvRaTSGdCbTy2+Mm5HTJvLGYSSeG9gDzNasJPP/yOYKLy+/cLG/ftrqq5fvkFwBJEw==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.5.3.tgz", + "integrity": "sha512-FUlILrW3DGitS2h+Xaw8aRNvGTwtuaxrRkNSHWTizOfLUie7wuYwezeZ50iflRn8YPV5kxmU2LQuu3nM/b3Zsg==", "dev": true } } }, - "@vuepress/markdown": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/@vuepress/markdown/-/markdown-1.8.2.tgz", - "integrity": "sha512-zznBHVqW+iBkznF/BO/GY9RFu53khyl0Ey0PnGqvwCJpRLNan6y5EXgYumtjw2GSYn5nDTTALYxtyNBdz64PKg==", - "dev": true, - "requires": { - "@vuepress/shared-utils": "1.8.2", - "markdown-it": "^8.4.1", - "markdown-it-anchor": "^5.0.2", - "markdown-it-chain": "^1.3.0", - "markdown-it-emoji": "^1.4.0", - "markdown-it-table-of-contents": "^0.4.0", - "prismjs": "^1.13.0" - }, - "dependencies": { - "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", - "dev": true - }, - "markdown-it": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.2.tgz", - "integrity": "sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "entities": "~1.1.1", - "linkify-it": "^2.0.0", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" - } - } - } - }, - "@vuepress/markdown-loader": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/@vuepress/markdown-loader/-/markdown-loader-1.8.2.tgz", - "integrity": "sha512-mWzFXikCUcAN/chpKkqZpRYKdo0312hMv8cBea2hvrJYV6y4ODB066XKvXN8JwOcxuCjxWYJkhWGr+pXq1oTtw==", - "dev": true, - "requires": { - "@vuepress/markdown": "1.8.2", - "loader-utils": "^1.1.0", - "lru-cache": "^5.1.1" - } - }, "@vuepress/plugin-active-header-links": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/@vuepress/plugin-active-header-links/-/plugin-active-header-links-1.8.2.tgz", @@ -2791,15 +3154,6 @@ "lodash.debounce": "^4.0.8" } }, - "@vuepress/plugin-last-updated": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-last-updated/-/plugin-last-updated-1.8.2.tgz", - "integrity": "sha512-pYIRZi52huO9b6HY3JQNPKNERCLzMHejjBRt9ekdnJ1xhLs4MmRvt37BoXjI/qzvXkYtr7nmGgnKThNBVRTZuA==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.5" - } - }, "@vuepress/plugin-nprogress": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/@vuepress/plugin-nprogress/-/plugin-nprogress-1.8.2.tgz", @@ -2809,15 +3163,6 @@ "nprogress": "^0.2.0" } }, - "@vuepress/plugin-register-components": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-register-components/-/plugin-register-components-1.8.2.tgz", - "integrity": "sha512-6SUq3nHFMEh9qKFnjA8QnrNxj0kLs7+Gspq1OBU8vtu0NQmSvLFZVaMV7pzT/9zN2nO5Pld5qhsUJv1g71MrEA==", - "dev": true, - "requires": { - "@vuepress/shared-utils": "1.8.2" - } - }, "@vuepress/plugin-search": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/@vuepress/plugin-search/-/plugin-search-1.8.2.tgz", @@ -2877,6 +3222,17 @@ "vuepress-plugin-smooth-scroll": "^0.0.3" } }, + "@vuepress/types": { + "version": "1.9.7", + "resolved": "https://registry.npmjs.org/@vuepress/types/-/types-1.9.7.tgz", + "integrity": "sha512-moLQzkX3ED2o18dimLemUm7UVDKxhcrJmGt5C0Ng3xxrLPaQu7UqbROtEKB3YnMRt4P/CA91J+Ck+b9LmGabog==", + "dev": true, + "requires": { + "@types/markdown-it": "^10.0.0", + "@types/webpack-dev-server": "^3", + "webpack-chain": "^6.0.0" + } + }, "@webassemblyjs/ast": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", @@ -3274,12 +3630,6 @@ "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", "dev": true }, - "ansi-html": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", - "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", - "dev": true - }, "ansi-regex": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", @@ -3522,6 +3872,15 @@ "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", "dev": true }, + "async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, "async-each": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", @@ -3537,8 +3896,7 @@ "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, "atob": { "version": "2.1.2", @@ -3583,11 +3941,24 @@ "dev": true }, "axios": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.2.tgz", - "integrity": "sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.0.tgz", + "integrity": "sha512-XV/WrPxXfzgZ8j4lcB5i6LyaXmi90yetmV/Fem0kmglGx+mpY06CiweL3YxU6wOTNLmqLUePW4G8h45nGZ/+pA==", "requires": { - "follow-redirects": "1.5.10" + "follow-redirects": "^1.14.9", + "form-data": "^4.0.0" + }, + "dependencies": { + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + } } }, "babel-code-frame": { @@ -4696,16 +5067,36 @@ } }, "browserslist": { - "version": "4.16.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.3.tgz", - "integrity": "sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw==", + "version": "4.20.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz", + "integrity": "sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001181", - "colorette": "^1.2.1", - "electron-to-chromium": "^1.3.649", + "caniuse-lite": "^1.0.30001332", + "electron-to-chromium": "^1.4.118", "escalade": "^3.1.1", - "node-releases": "^1.1.70" + "node-releases": "^2.0.3", + "picocolors": "^1.0.0" + }, + "dependencies": { + "caniuse-lite": { + "version": "1.0.30001332", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001332.tgz", + "integrity": "sha512-10T30NYOEQtN6C11YGg411yebhvpnC6Z102+B95eAsN0oB6KUs01ivE8u+G6FMIRtIrVlYXhL+LUwQ3/hXwDWw==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.4.121", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.121.tgz", + "integrity": "sha512-N7OXhMr1p2oa9EkOhmHpmOm43DHzs55dep2FF6M7y6px5QJBheqEE3nwwZ+xJowlff+AEmMOdg3ARYGB+0kzbA==", + "dev": true + }, + "node-releases": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.3.tgz", + "integrity": "sha512-maHFz6OLqYxz+VQyCAtA3PTX4UP/53pa05fyDNc9CwjvJ0yEh6+xBwKsgCxMNhS8taUKBFYxfuiaD9U/55iFaw==", + "dev": true + } } }, "bs-logger": { @@ -4808,6 +5199,12 @@ "resolved": "https://registry.npmjs.org/bulma/-/bulma-0.9.2.tgz", "integrity": "sha512-e14EF+3VSZ488yL/lJH0tR8mFWiEQVCMi/BQUMi2TGMBOk+zrDg4wryuwm/+dRSHJw0gMawp2tsW7X1JYUCE3A==" }, + "bundle-require": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-2.1.8.tgz", + "integrity": "sha512-oOEg3A0hy/YzvNWNowtKD0pmhZKseOFweCbgyMqTIih4gRY1nJWsvrOCT27L9NbIyL5jMjTFrAUpGxxpW68Puw==", + "dev": true + }, "bytes": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", @@ -5486,18 +5883,6 @@ "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", "dev": true }, - "clipboard": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.8.tgz", - "integrity": "sha512-Y6WO0unAIQp5bLmk1zdThRhgJt/x3ks6f30s3oE3H1mgIEU33XyQjEf8gsf6DxC7NPX8Y1SsNWjUjL/ywLnnbQ==", - "dev": true, - "optional": true, - "requires": { - "good-listener": "^1.2.2", - "select": "^1.1.2", - "tiny-emitter": "^2.0.0" - } - }, "clipboardy": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-2.3.0.tgz", @@ -5684,7 +6069,6 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, "requires": { "delayed-stream": "~1.0.0" } @@ -6423,15 +6807,72 @@ "dev": true }, "cssnano": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz", - "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.11.tgz", + "integrity": "sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g==", "dev": true, "requires": { "cosmiconfig": "^5.0.0", - "cssnano-preset-default": "^4.0.7", + "cssnano-preset-default": "^4.0.8", "is-resolvable": "^1.0.0", "postcss": "^7.0.0" + }, + "dependencies": { + "cssnano-preset-default": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.8.tgz", + "integrity": "sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ==", + "dev": true, + "requires": { + "css-declaration-sorter": "^4.0.1", + "cssnano-util-raw-cache": "^4.0.1", + "postcss": "^7.0.0", + "postcss-calc": "^7.0.1", + "postcss-colormin": "^4.0.3", + "postcss-convert-values": "^4.0.1", + "postcss-discard-comments": "^4.0.2", + "postcss-discard-duplicates": "^4.0.2", + "postcss-discard-empty": "^4.0.1", + "postcss-discard-overridden": "^4.0.1", + "postcss-merge-longhand": "^4.0.11", + "postcss-merge-rules": "^4.0.3", + "postcss-minify-font-values": "^4.0.2", + "postcss-minify-gradients": "^4.0.2", + "postcss-minify-params": "^4.0.2", + "postcss-minify-selectors": "^4.0.2", + "postcss-normalize-charset": "^4.0.1", + "postcss-normalize-display-values": "^4.0.2", + "postcss-normalize-positions": "^4.0.2", + "postcss-normalize-repeat-style": "^4.0.2", + "postcss-normalize-string": "^4.0.2", + "postcss-normalize-timing-functions": "^4.0.2", + "postcss-normalize-unicode": "^4.0.1", + "postcss-normalize-url": "^4.0.1", + "postcss-normalize-whitespace": "^4.0.2", + "postcss-ordered-values": "^4.1.2", + "postcss-reduce-initial": "^4.0.3", + "postcss-reduce-transforms": "^4.0.2", + "postcss-svgo": "^4.0.3", + "postcss-unique-selectors": "^4.0.1" + } + }, + "postcss-svgo": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.3.tgz", + "integrity": "sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw==", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "svgo": "^1.0.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } } }, "cssnano-preset-default": { @@ -6636,6 +7077,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, "requires": { "ms": "2.0.0" } @@ -6812,9 +7254,9 @@ } }, "deep-extend": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.1.tgz", - "integrity": "sha512-N8vBdOa+DF7zkRrDCsaOXoCs/E2fJfx9B9MrKnnSiHNh4ws7eSys6YQE4KvT1cecKmOASYQBhbKjeuDD9lT81w==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true }, "deep-is": { @@ -7055,15 +7497,7 @@ "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "delegate": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz", - "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==", - "dev": true, - "optional": true + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, "depd": { "version": "1.1.2", @@ -7140,9 +7574,9 @@ "dev": true }, "dns-packet": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", - "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", + "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", "dev": true, "requires": { "ip": "^1.1.0", @@ -7421,12 +7855,6 @@ "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==", "dev": true }, - "electron-to-chromium": { - "version": "1.3.704", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.704.tgz", - "integrity": "sha512-6cz0jvawlUe4h5AbfQWxPzb+8LzVyswGAWiGc32EJEmfj39HTQyNPkLXirc7+L4x5I6RgRkzua8Ryu5QZqc8cA==", - "dev": true - }, "elegant-spinner": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/elegant-spinner/-/elegant-spinner-1.0.1.tgz", @@ -7613,6 +8041,150 @@ "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", "dev": true }, + "esbuild": { + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.7.tgz", + "integrity": "sha512-+u/msd6iu+HvfysUPkZ9VHm83LImmSNnecYPfFI01pQ7TTcsFR+V0BkybZX7mPtIaI7LCrse6YRj+v3eraJSgw==", + "dev": true, + "requires": { + "esbuild-android-arm64": "0.14.7", + "esbuild-darwin-64": "0.14.7", + "esbuild-darwin-arm64": "0.14.7", + "esbuild-freebsd-64": "0.14.7", + "esbuild-freebsd-arm64": "0.14.7", + "esbuild-linux-32": "0.14.7", + "esbuild-linux-64": "0.14.7", + "esbuild-linux-arm": "0.14.7", + "esbuild-linux-arm64": "0.14.7", + "esbuild-linux-mips64le": "0.14.7", + "esbuild-linux-ppc64le": "0.14.7", + "esbuild-netbsd-64": "0.14.7", + "esbuild-openbsd-64": "0.14.7", + "esbuild-sunos-64": "0.14.7", + "esbuild-windows-32": "0.14.7", + "esbuild-windows-64": "0.14.7", + "esbuild-windows-arm64": "0.14.7" + } + }, + "esbuild-android-arm64": { + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.7.tgz", + "integrity": "sha512-9/Q1NC4JErvsXzJKti0NHt+vzKjZOgPIjX/e6kkuCzgfT/GcO3FVBcGIv4HeJG7oMznE6KyKhvLrFgt7CdU2/w==", + "dev": true, + "optional": true + }, + "esbuild-darwin-64": { + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.7.tgz", + "integrity": "sha512-Z9X+3TT/Xj+JiZTVlwHj2P+8GoiSmUnGVz0YZTSt8WTbW3UKw5Pw2ucuJ8VzbD2FPy0jbIKJkko/6CMTQchShQ==", + "dev": true, + "optional": true + }, + "esbuild-darwin-arm64": { + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.7.tgz", + "integrity": "sha512-68e7COhmwIiLXBEyxUxZSSU0akgv8t3e50e2QOtKdBUE0F6KIRISzFntLe2rYlNqSsjGWsIO6CCc9tQxijjSkw==", + "dev": true, + "optional": true + }, + "esbuild-freebsd-64": { + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.7.tgz", + "integrity": "sha512-76zy5jAjPiXX/S3UvRgG85Bb0wy0zv/J2lel3KtHi4V7GUTBfhNUPt0E5bpSXJ6yMT7iThhnA5rOn+IJiUcslQ==", + "dev": true, + "optional": true + }, + "esbuild-freebsd-arm64": { + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.7.tgz", + "integrity": "sha512-lSlYNLiqyzd7qCN5CEOmLxn7MhnGHPcu5KuUYOG1i+t5A6q7LgBmfYC9ZHJBoYyow3u4CNu79AWHbvVLpE/VQQ==", + "dev": true, + "optional": true + }, + "esbuild-linux-32": { + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.7.tgz", + "integrity": "sha512-Vk28u409wVOXqTaT6ek0TnfQG4Ty1aWWfiysIaIRERkNLhzLhUf4i+qJBN8mMuGTYOkE40F0Wkbp6m+IidOp2A==", + "dev": true, + "optional": true + }, + "esbuild-linux-64": { + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.7.tgz", + "integrity": "sha512-+Lvz6x+8OkRk3K2RtZwO+0a92jy9si9cUea5Zoru4yJ/6EQm9ENX5seZE0X9DTwk1dxJbjmLsJsd3IoowyzgVg==", + "dev": true, + "optional": true + }, + "esbuild-linux-arm": { + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.7.tgz", + "integrity": "sha512-OzpXEBogbYdcBqE4uKynuSn5YSetCvK03Qv1HcOY1VN6HmReuatjJ21dCH+YPHSpMEF0afVCnNfffvsGEkxGJQ==", + "dev": true, + "optional": true + }, + "esbuild-linux-arm64": { + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.7.tgz", + "integrity": "sha512-kJd5beWSqteSAW086qzCEsH6uwpi7QRIpzYWHzEYwKKu9DiG1TwIBegQJmLpPsLp4v5RAFjea0JAmAtpGtRpqg==", + "dev": true, + "optional": true + }, + "esbuild-linux-mips64le": { + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.7.tgz", + "integrity": "sha512-mFWpnDhZJmj/h7pxqn1GGDsKwRfqtV7fx6kTF5pr4PfXe8pIaTERpwcKkoCwZUkWAOmUEjMIUAvFM72A6hMZnA==", + "dev": true, + "optional": true + }, + "esbuild-linux-ppc64le": { + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.7.tgz", + "integrity": "sha512-wM7f4M0bsQXfDL4JbbYD0wsr8cC8KaQ3RPWc/fV27KdErPW7YsqshZZSjDV0kbhzwpNNdhLItfbaRT8OE8OaKA==", + "dev": true, + "optional": true + }, + "esbuild-netbsd-64": { + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.7.tgz", + "integrity": "sha512-J/afS7woKyzGgAL5FlgvMyqgt5wQ597lgsT+xc2yJ9/7BIyezeXutXqfh05vszy2k3kSvhLesugsxIA71WsqBw==", + "dev": true, + "optional": true + }, + "esbuild-openbsd-64": { + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.7.tgz", + "integrity": "sha512-7CcxgdlCD+zAPyveKoznbgr3i0Wnh0L8BDGRCjE/5UGkm5P/NQko51tuIDaYof8zbmXjjl0OIt9lSo4W7I8mrw==", + "dev": true, + "optional": true + }, + "esbuild-sunos-64": { + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.7.tgz", + "integrity": "sha512-GKCafP2j/KUljVC3nesw1wLFSZktb2FGCmoT1+730zIF5O6hNroo0bSEofm6ZK5mNPnLiSaiLyRB9YFgtkd5Xg==", + "dev": true, + "optional": true + }, + "esbuild-windows-32": { + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.7.tgz", + "integrity": "sha512-5I1GeL/gZoUUdTPA0ws54bpYdtyeA2t6MNISalsHpY269zK8Jia/AXB3ta/KcDHv2SvNwabpImeIPXC/k0YW6A==", + "dev": true, + "optional": true + }, + "esbuild-windows-64": { + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.7.tgz", + "integrity": "sha512-CIGKCFpQOSlYsLMbxt8JjxxvVw9MlF1Rz2ABLVfFyHUF5OeqHD5fPhGrCVNaVrhO8Xrm+yFmtjcZudUGr5/WYQ==", + "dev": true, + "optional": true + }, + "esbuild-windows-arm64": { + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.7.tgz", + "integrity": "sha512-eOs1eSivOqN7cFiRIukEruWhaCf75V0N8P0zP7dh44LIhLl8y6/z++vv9qQVbkBm5/D7M7LfCfCTmt1f1wHOCw==", + "dev": true, + "optional": true + }, "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -7723,8 +8295,7 @@ }, "ansi-regex": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "resolved": "", "dev": true }, "ansi-styles": { @@ -9243,12 +9814,9 @@ } }, "follow-redirects": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", - "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", - "requires": { - "debug": "=3.1.0" - } + "version": "1.14.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", + "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==" }, "for-each": { "version": "0.3.3", @@ -9334,6 +9902,17 @@ "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", "dev": true }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, "fs-minipass": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", @@ -9556,16 +10135,6 @@ "minimist": "^1.2.5" } }, - "good-listener": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz", - "integrity": "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=", - "dev": true, - "optional": true, - "requires": { - "delegate": "^3.1.2" - } - }, "got": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", @@ -9602,12 +10171,6 @@ "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", "dev": true }, - "graceful-readlink": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", - "dev": true - }, "gray-matter": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.2.tgz", @@ -9880,9 +10443,9 @@ "dev": true }, "hosted-git-info": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", "dev": true }, "hpack.js": { @@ -11514,9 +12077,9 @@ } }, "ws": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.4.tgz", - "integrity": "sha512-Qm8k8ojNQIMx7S+Zp8u/uHOx7Qazv3Yv4q68MiWWWOJhiwG5W3x7iqmRtJo8xxrciZUY4vRxUTJCKuRnF28ZZw==", + "version": "7.5.7", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.7.tgz", + "integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==", "dev": true } } @@ -12099,12 +12662,6 @@ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -12139,9 +12696,9 @@ } }, "jsonc-parser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.2.1.tgz", - "integrity": "sha512-o6/yDBYccGvTz1+QFevz6l6OBZ2+fMVu2JZ9CIhzsYRX4mjaK5IyX9eldUdCmga16zlgQxyrj5pt9kzuj2C02w==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz", + "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==", "dev": true }, "jsonfile": { @@ -12154,15 +12711,23 @@ } }, "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", "dev": true, "requires": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", - "json-schema": "0.2.3", + "json-schema": "0.4.0", "verror": "1.10.0" + }, + "dependencies": { + "json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true + } } }, "keyv": { @@ -13014,9 +13579,9 @@ } }, "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "lodash._reinterpolate": { "version": "3.0.0", @@ -13042,18 +13607,6 @@ "integrity": "sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA==", "dev": true }, - "lodash.differencewith": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.differencewith/-/lodash.differencewith-4.5.0.tgz", - "integrity": "sha1-uvr7yRi1UVTheRdqALsK76rIVLc=", - "dev": true - }, - "lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=", - "dev": true - }, "lodash.kebabcase": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", @@ -13267,23 +13820,38 @@ "dev": true }, "markdown-it": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-10.0.0.tgz", - "integrity": "sha512-YWOP1j7UbDNz+TumYP1kpwnP0aEa711cJjrAQrzd0UXlbJfc5aAq0F/PZHjiioqDC1NKgvIMX+o+9Bk7yuM2dg==", + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", + "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==", "dev": true, "requires": { - "argparse": "^1.0.7", - "entities": "~2.0.0", - "linkify-it": "^2.0.0", + "argparse": "^2.0.1", + "entities": "~2.1.0", + "linkify-it": "^3.0.1", "mdurl": "^1.0.1", "uc.micro": "^1.0.5" }, "dependencies": { - "entities": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz", - "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==", + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true + }, + "entities": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", + "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", + "dev": true + }, + "linkify-it": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", + "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", + "dev": true, + "requires": { + "uc.micro": "^1.0.1" + } } } }, @@ -13351,72 +13919,94 @@ "dev": true }, "markdownlint": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.19.0.tgz", - "integrity": "sha512-+MsWOnYVUH4klcKM7iRx5cno9FQMDAb6FC6mWlZkeXPwIaK6Z5Vd9VkXkykPidRqmLHU2wI+MNyfUMnUCBw3pQ==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.25.1.tgz", + "integrity": "sha512-AG7UkLzNa1fxiOv5B+owPsPhtM4D6DoODhsJgiaNg1xowXovrYgOnLqAgOOFQpWOlHFVQUzjMY5ypNNTeov92g==", "dev": true, "requires": { - "markdown-it": "10.0.0" + "markdown-it": "12.3.2" } }, "markdownlint-cli": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/markdownlint-cli/-/markdownlint-cli-0.22.0.tgz", - "integrity": "sha512-qRg6tK5dXWqkaFvEstz9YSQal1ECMgofrSZgdBOaPWG8cD50pk8Hs0ZpBCJ6SCHPKF71pCdtuSL2u82sIx2XWA==", + "version": "0.31.1", + "resolved": "https://registry.npmjs.org/markdownlint-cli/-/markdownlint-cli-0.31.1.tgz", + "integrity": "sha512-keIOMwQn+Ch7MoBwA+TdkyVMuxAeZFEGmIIlvwgV0Z1TGS5MxPnRr29XCLhkNzCHU+uNKGjU+VEjLX+Z9kli6g==", "dev": true, "requires": { - "commander": "~2.9.0", - "deep-extend": "~0.5.1", - "get-stdin": "~5.0.1", - "glob": "~7.1.2", - "ignore": "~5.1.4", - "js-yaml": "~3.13.1", - "jsonc-parser": "~2.2.0", - "lodash.differencewith": "~4.5.0", - "lodash.flatten": "~4.4.0", - "markdownlint": "~0.19.0", - "markdownlint-rule-helpers": "~0.7.0", - "minimatch": "~3.0.4", - "rc": "~1.2.7" + "commander": "~9.0.0", + "get-stdin": "~9.0.0", + "glob": "~7.2.0", + "ignore": "~5.2.0", + "js-yaml": "^4.1.0", + "jsonc-parser": "~3.0.0", + "markdownlint": "~0.25.1", + "markdownlint-rule-helpers": "~0.16.0", + "minimatch": "~3.0.5", + "run-con": "~1.2.10" }, "dependencies": { - "commander": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", - "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", - "dev": true, - "requires": { - "graceful-readlink": ">= 1.0.0" - } - }, - "get-stdin": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz", - "integrity": "sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g=", + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, + "commander": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.0.0.tgz", + "integrity": "sha512-JJfP2saEKbQqvW+FI93OYUB4ByV5cizMpFMiiJI8xDbBvQvSkIk0VvQdn1CZ8mqAO8Loq2h0gYTYtDFUZUeERw==", + "dev": true + }, + "get-stdin": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-9.0.0.tgz", + "integrity": "sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==", + "dev": true + }, + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", "dev": true }, "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "argparse": "^2.0.1" + } + }, + "minimatch": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", + "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" } } } }, "markdownlint-rule-helpers": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/markdownlint-rule-helpers/-/markdownlint-rule-helpers-0.7.0.tgz", - "integrity": "sha512-xZByWJNBaCMHo7nYPv/5aO8Jt68YcMvyouFXhuXmJzbqCsQy8rfCj0kYcv22kdK5PwAgMdbHg0hyTdURbUZtJw==", + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/markdownlint-rule-helpers/-/markdownlint-rule-helpers-0.16.0.tgz", + "integrity": "sha512-oEacRUVeTJ5D5hW1UYd2qExYI0oELdYK72k1TKGvIeYJIbqQWAz476NAc7LNixSySUhcNl++d02DvX0ccDk9/w==", "dev": true }, "mathml-tag-names": { @@ -13676,14 +14266,12 @@ "mime-db": { "version": "1.46.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.46.0.tgz", - "integrity": "sha512-svXaP8UQRZ5K7or+ZmfNhg2xX3yKDMUzqadsSqi4NCH/KomcH75MAMYAGVlvXn4+b/xOPhS3I2uHKRUzvjY7BQ==", - "dev": true + "integrity": "sha512-svXaP8UQRZ5K7or+ZmfNhg2xX3yKDMUzqadsSqi4NCH/KomcH75MAMYAGVlvXn4+b/xOPhS3I2uHKRUzvjY7BQ==" }, "mime-types": { "version": "2.1.29", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.29.tgz", "integrity": "sha512-Y/jMt/S5sR9OaqteJtslsFZKWOIIqMACsJSiHghlCAyhf7jfVYjKBmLiX8OgpWeW+fjJ2b+Az69aPFPkUOY6xQ==", - "dev": true, "requires": { "mime-db": "1.46.0" } @@ -13774,9 +14362,9 @@ } }, "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, "minimist-options": { @@ -13883,9 +14471,9 @@ } }, "moment": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", - "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==" + "version": "2.29.3", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.3.tgz", + "integrity": "sha512-c6YRvhEo//6T2Jz/vVtYzqBzwvPT95JBQ+smCytzf7c50oMZRsR/a4w88aD34I+/QVSfnoAnSBFPJHItlOMJVw==" }, "move-concurrently": { "version": "1.0.1", @@ -13904,7 +14492,8 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true }, "multicast-dns": { "version": "6.2.3", @@ -14104,12 +14693,6 @@ } } }, - "node-releases": { - "version": "1.1.71", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz", - "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==", - "dev": true - }, "nopt": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", @@ -14709,8 +15292,7 @@ }, "normalize-url": { "version": "4.5.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", - "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==", + "resolved": "", "dev": true }, "p-cancelable": { @@ -14901,9 +15483,9 @@ "dev": true }, "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, "path-to-regexp": { @@ -14954,6 +15536,12 @@ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", "dev": true }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, "picomatch": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", @@ -15040,15 +15628,6 @@ "mkdirp": "^0.5.5" }, "dependencies": { - "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "dev": true, - "requires": { - "lodash": "^4.17.14" - } - }, "debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", @@ -15073,30 +15652,26 @@ "dev": true }, "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", "dev": true, "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" + "picocolors": "^0.2.1", + "source-map": "^0.6.1" }, "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } } } }, @@ -15840,13 +16415,10 @@ "dev": true }, "prismjs": { - "version": "1.23.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.23.0.tgz", - "integrity": "sha512-c29LVsqOaLbBHuIbsTxaKENh1N2EQBOHaWv7gkHN4dgRbxSREqDnDbtFJYdpPauS4YCplMSNCABQ6Eeor69bAA==", - "dev": true, - "requires": { - "clipboard": "^2.0.0" - } + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.28.0.tgz", + "integrity": "sha512-8aaXdYvl1F7iC7Xm1spqSaY/OJBpYW3v+KJ+F17iYxvdc8sfjW194COK5wVhMZX45tGteiBQgdvD/nhxcRwylw==", + "dev": true }, "process": { "version": "0.11.10", @@ -16419,16 +16991,16 @@ "dev": true }, "renderkid": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.5.tgz", - "integrity": "sha512-ccqoLg+HLOHq1vdfYNm4TBeaCDIi1FLt3wGojTDSvdewUv65oTmI3cnT2E4hRjl1gzKZIPK+KZrXzlUYKnR+vQ==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.7.tgz", + "integrity": "sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==", "dev": true, "requires": { - "css-select": "^2.0.2", - "dom-converter": "^0.2", - "htmlparser2": "^3.10.1", - "lodash": "^4.17.20", - "strip-ansi": "^3.0.0" + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^3.0.1" }, "dependencies": { "ansi-regex": { @@ -16437,12 +17009,83 @@ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + } + }, + "css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", "dev": true }, + "dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true + }, + "domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "requires": { + "domelementtype": "^2.2.0" + } + }, + "domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "nth-check": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", + "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", + "dev": true, + "requires": { + "boolbase": "^1.0.0" + } + }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", @@ -16666,6 +17309,32 @@ "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", "dev": true }, + "run-con": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/run-con/-/run-con-1.2.10.tgz", + "integrity": "sha512-n7PZpYmMM26ZO21dd8y3Yw1TRtGABjRtgPSgFS/nhzfvbJMXFtJhJVyEgayMiP+w/23craJjsnfDvx4W4ue/HQ==", + "dev": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~2.0.0", + "minimist": "^1.2.5", + "strip-json-comments": "~3.1.1" + }, + "dependencies": { + "ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "dev": true + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + } + } + }, "run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -16821,13 +17490,6 @@ "commander": "^2.8.1" } }, - "select": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz", - "integrity": "sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0=", - "dev": true, - "optional": true - }, "select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", @@ -17870,9 +18532,9 @@ }, "dependencies": { "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true } } @@ -18411,9 +19073,9 @@ } }, "trim-newlines": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.0.tgz", - "integrity": "sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", "dev": true }, "type-fest": { @@ -18937,13 +19599,6 @@ "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", "dev": true }, - "tiny-emitter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", - "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==", - "dev": true, - "optional": true - }, "title-case": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/title-case/-/title-case-2.1.1.tgz", @@ -18955,9 +19610,9 @@ } }, "tmpl": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", - "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "dev": true }, "to-arraybuffer": { @@ -19702,9 +20357,9 @@ } }, "url-parse": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.1.tgz", - "integrity": "sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q==", + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", "dev": true, "requires": { "querystringify": "^2.1.1", @@ -20512,12 +21167,12 @@ } }, "webpack-dev-server": { - "version": "3.11.2", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.2.tgz", - "integrity": "sha512-A80BkuHRQfCiNtGBS1EMf2ChTUs0x+B3wGDFmOeT4rmJOHhHTCH2naNxIHhmkr0/UillP4U3yeIyv1pNp+QDLQ==", + "version": "3.11.3", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.3.tgz", + "integrity": "sha512-3x31rjbEQWKMNzacUZRE6wXvUFuGpH7vr0lIEbYpMAG9BOxi0928QU1BBswOAP3kg3H1O4hiS+sq4YyAn6ANnA==", "dev": true, "requires": { - "ansi-html": "0.0.7", + "ansi-html-community": "0.0.8", "bonjour": "^3.5.0", "chokidar": "^2.1.8", "compression": "^1.7.4", @@ -20552,6 +21207,12 @@ "yargs": "^13.3.2" }, "dependencies": { + "ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true + }, "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", @@ -20606,9 +21267,9 @@ } }, "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -20707,9 +21368,9 @@ } }, "ws": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", - "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", + "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", "dev": true, "requires": { "async-limiter": "~1.0.0" diff --git a/ui/package.json b/ui/package.json index 3ed6b03..b246e38 100644 --- a/ui/package.json +++ b/ui/package.json @@ -34,13 +34,13 @@ "@fortawesome/fontawesome-svg-core": "^1.2.27", "@fortawesome/free-solid-svg-icons": "^5.12.1", "@fortawesome/vue-fontawesome": "0.1.9", - "axios": "0.19.2", + "axios": "^0.27.0", "buefy": "^0.9.7", "chart.js": "^2.9.4", "core-js": "3.6.4", "currency-formatter": "^1.5.7", "date-fns": "2.10.0", - "lodash": "4.17.15", + "lodash": "^4.17.21", "normalize.css": "8.0.1", "nprogress": "0.2.0", "vue": "2.6.11", @@ -70,7 +70,7 @@ "hygen": "4.0.x", "imagemin-lint-staged": "0.4.x", "lint-staged": "10.0.x", - "markdownlint-cli": "0.22.x", + "markdownlint-cli": "^0.31.1", "npm-run-all": "4.1.x", "sass": "1.26.x", "sass-loader": "8.0.x", diff --git a/ui/src/router/views/settings.vue b/ui/src/router/views/settings.vue index 856faa9..eb3db3f 100644 --- a/ui/src/router/views/settings.vue +++ b/ui/src/router/views/settings.vue @@ -203,7 +203,7 @@ export default { - + From 7cb9a43dfe99d70bc5da24a174b126863662a81a Mon Sep 17 00:00:00 2001 From: Akhil Gupta Date: Tue, 26 Apr 2022 14:26:21 +0530 Subject: [PATCH 16/21] try disable cache --- .github/workflows/hub.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/hub.yml b/.github/workflows/hub.yml index af22356..bd4d5c0 100644 --- a/.github/workflows/hub.yml +++ b/.github/workflows/hub.yml @@ -46,8 +46,8 @@ jobs: #platforms: linux/amd64,linux/arm64,linux/arm/v6,linux/arm/v7 platforms: linux/amd64,linux/arm64,linux/arm/v7 push: true - cache-from: type=local,src=/tmp/.buildx-cache - cache-to: type=local,dest=/tmp/.buildx-cache + # cache-from: type=local,src=/tmp/.buildx-cache + # cache-to: type=local,dest=/tmp/.buildx-cache tags: | akhilrex/hammond:latest akhilrex/hammond:1.0.0 From 0b715ef8401d6ad6609dedd228b58248f15dc02c Mon Sep 17 00:00:00 2001 From: Alf Sebastian Houge Date: Thu, 28 Apr 2022 17:47:35 +0200 Subject: [PATCH 17/21] Fix warnings generated by go-staticcheck --- server/controllers/auth.go | 12 ++++++------ server/controllers/middlewares.go | 4 ++-- server/controllers/setup.go | 2 +- server/controllers/vehicle.go | 2 +- server/db/dbfunctions.go | 5 ++--- server/service/fileService.go | 13 ++++++------- 6 files changed, 18 insertions(+), 20 deletions(-) diff --git a/server/controllers/auth.go b/server/controllers/auth.go index b130739..56f1bf6 100644 --- a/server/controllers/auth.go +++ b/server/controllers/auth.go @@ -94,17 +94,17 @@ func userLogin(c *gin.Context) { user, err := db.FindOneUser(&db.User{Email: loginRequest.Email}) if err != nil { - c.JSON(http.StatusForbidden, common.NewError("login", errors.New("Not Registered email or invalid password"))) + c.JSON(http.StatusForbidden, common.NewError("login", errors.New("not Registered email or invalid password"))) return } if user.CheckPassword(loginRequest.Password) != nil { - c.JSON(http.StatusForbidden, common.NewError("login", errors.New("Not Registered email or invalid password"))) + c.JSON(http.StatusForbidden, common.NewError("login", errors.New("not Registered email or invalid password"))) return } if user.IsDisabled { - c.JSON(http.StatusForbidden, common.NewError("login", errors.New("Your user has been disabled by the admin. Please contact them to get it re-enabled."))) + c.JSON(http.StatusForbidden, common.NewError("login", errors.New("your user has been disabled by the admin. Please contact them to get it re-enabled"))) return } UpdateContextUserModel(c, user.ID) @@ -170,16 +170,16 @@ func changePassword(c *gin.Context) { user, err := service.GetUserById(c.GetString("userId")) if err != nil { - c.JSON(http.StatusForbidden, common.NewError("changePassword", errors.New("Not Registered email or invalid password"))) + c.JSON(http.StatusForbidden, common.NewError("changePassword", errors.New("not Registered email or invalid password"))) return } if user.CheckPassword(request.OldPassword) != nil { - c.JSON(http.StatusForbidden, common.NewError("changePassword", errors.New("Incorrect old password"))) + c.JSON(http.StatusForbidden, common.NewError("changePassword", errors.New("incorrect old password"))) return } user.SetPassword(request.NewPassword) - success, err := service.UpdatePassword(user.ID, request.NewPassword) + success, _ := service.UpdatePassword(user.ID, request.NewPassword) c.JSON(http.StatusOK, success) } diff --git a/server/controllers/middlewares.go b/server/controllers/middlewares.go index 3c12c54..6dfede7 100644 --- a/server/controllers/middlewares.go +++ b/server/controllers/middlewares.go @@ -23,8 +23,8 @@ func stripBearerPrefixFromTokenString(tok string) (string, error) { // Extract token from Authorization header // Uses PostExtractionFilter to strip "TOKEN " prefix from header var AuthorizationHeaderExtractor = &request.PostExtractionFilter{ - request.HeaderExtractor{"Authorization"}, - stripBearerPrefixFromTokenString, + Extractor: request.HeaderExtractor{"Authorization"}, + Filter: stripBearerPrefixFromTokenString, } // Extractor for OAuth2 access tokens. Looks in 'Authorization' diff --git a/server/controllers/setup.go b/server/controllers/setup.go index b8378f3..13f1ce3 100644 --- a/server/controllers/setup.go +++ b/server/controllers/setup.go @@ -51,7 +51,7 @@ func migrate(c *gin.Context) { canMigrate, _, _ := db.CanMigrate(request.Url) if !canMigrate { - c.JSON(http.StatusBadRequest, fmt.Errorf("cannot migrate database. please check connection string.")) + c.JSON(http.StatusBadRequest, fmt.Errorf("cannot migrate database. please check connection string")) return } diff --git a/server/controllers/vehicle.go b/server/controllers/vehicle.go index d914b7c..a2c0f32 100644 --- a/server/controllers/vehicle.go +++ b/server/controllers/vehicle.go @@ -397,7 +397,7 @@ func deleteVehicle(c *gin.Context) { return } if !canDelete { - c.JSON(http.StatusUnprocessableEntity, common.NewError("shareVehicle", errors.New("You are not allowed to delete this vehicle."))) + c.JSON(http.StatusUnprocessableEntity, common.NewError("shareVehicle", errors.New("you are not allowed to delete this vehicle"))) return } err = service.DeleteVehicle(searchByIdQuery.Id) diff --git a/server/db/dbfunctions.go b/server/db/dbfunctions.go index 363918d..ab76fe4 100644 --- a/server/db/dbfunctions.go +++ b/server/db/dbfunctions.go @@ -117,7 +117,7 @@ func UnshareVehicle(vehicleId, userId string) error { return nil } if mapping.IsOwner { - return fmt.Errorf("Cannot unshare owner") + return fmt.Errorf("cannot unshare owner") } result := DB.Where("id=?", mapping.ID).Delete(&UserVehicle{}) return result.Error @@ -332,8 +332,7 @@ func UnlockMissedJobs() { if (job.Date == time.Time{}) { continue } - var duration time.Duration - duration = time.Duration(job.Duration) + var duration = time.Duration(job.Duration) d := job.Date.Add(time.Minute * duration) if d.Before(time.Now()) { fmt.Println(job.Name + " is unlocked") diff --git a/server/service/fileService.go b/server/service/fileService.go index c2d40c8..423171e 100644 --- a/server/service/fileService.go +++ b/server/service/fileService.go @@ -3,7 +3,6 @@ package service import ( "archive/tar" "compress/gzip" - "errors" "fmt" "io" "net/http" @@ -126,14 +125,14 @@ func CreateBackup() (string, error) { tarballFilePath := path.Join(folder, backupFileName) file, err := os.Create(tarballFilePath) if err != nil { - return "", errors.New(fmt.Sprintf("Could not create tarball file '%s', got error '%s'", tarballFilePath, err.Error())) + return "", fmt.Errorf("could not create tarball file '%s', got error '%s'", tarballFilePath, err.Error()) } defer file.Close() dbPath := path.Join(configPath, "hammond.db") _, err = os.Stat(dbPath) if err != nil { - return "", errors.New(fmt.Sprintf("Could not find db file '%s', got error '%s'", dbPath, err.Error())) + return "", fmt.Errorf("could not find db file '%s', got error '%s'", dbPath, err.Error()) } gzipWriter := gzip.NewWriter(file) defer gzipWriter.Close() @@ -151,13 +150,13 @@ func CreateBackup() (string, error) { func addFileToTarWriter(filePath string, tarWriter *tar.Writer) error { file, err := os.Open(filePath) if err != nil { - return errors.New(fmt.Sprintf("Could not open file '%s', got error '%s'", filePath, err.Error())) + return fmt.Errorf("could not open file '%s', got error '%s'", filePath, err.Error()) } defer file.Close() stat, err := file.Stat() if err != nil { - return errors.New(fmt.Sprintf("Could not get stat for file '%s', got error '%s'", filePath, err.Error())) + return fmt.Errorf("could not get stat for file '%s', got error '%s'", filePath, err.Error()) } header := &tar.Header{ @@ -169,12 +168,12 @@ func addFileToTarWriter(filePath string, tarWriter *tar.Writer) error { err = tarWriter.WriteHeader(header) if err != nil { - return errors.New(fmt.Sprintf("Could not write header for file '%s', got error '%s'", filePath, err.Error())) + return fmt.Errorf("could not write header for file '%s', got error '%s'", filePath, err.Error()) } _, err = io.Copy(tarWriter, file) if err != nil { - return errors.New(fmt.Sprintf("Could not copy the file '%s' data to the tarball, got error '%s'", filePath, err.Error())) + return fmt.Errorf("could not copy the file '%s' data to the tarball, got error '%s'", filePath, err.Error()) } return nil From ab94997dd6e0feffbb1b265cc22c160ef5099f9e Mon Sep 17 00:00:00 2001 From: Jonathan Gazeley Date: Tue, 17 May 2022 21:20:18 +0100 Subject: [PATCH 18/21] Add basic tests Run release pipeline on tags --- .github/workflows/hub.yml | 13 ++++++++----- .github/workflows/test-go.yml | 16 ++++++++++++++++ .github/workflows/test-npm.yml | 22 ++++++++++++++++++++++ 3 files changed, 46 insertions(+), 5 deletions(-) create mode 100644 .github/workflows/test-go.yml create mode 100644 .github/workflows/test-npm.yml diff --git a/.github/workflows/hub.yml b/.github/workflows/hub.yml index bd4d5c0..ddc1f11 100644 --- a/.github/workflows/hub.yml +++ b/.github/workflows/hub.yml @@ -1,8 +1,8 @@ -name: ci +name: Build docker image on: - push: - branches: master + release: + types: [published] jobs: multi: @@ -26,6 +26,9 @@ jobs: key: ${{ runner.os }}-buildx-${{ github.sha }} restore-keys: | ${{ runner.os }}-buildx- + - name: Parse the git tag + id: get_tag + run: echo ::set-output name=TAG::$(echo $GITHUB_REF | cut -d / -f 3) - name: Login to DockerHub uses: docker/login-action@v1 with: @@ -50,6 +53,6 @@ jobs: # cache-to: type=local,dest=/tmp/.buildx-cache tags: | akhilrex/hammond:latest - akhilrex/hammond:1.0.0 + akhilrex/hammond:${{ steps.get_tag.outputs.TAG }} ghcr.io/akhilrex/hammond:latest - ghcr.io/akhilrex/hammond:1.0.0 + ghcr.io/akhilrex/hammond:${{ steps.get_tag.outputs.TAG }} diff --git a/.github/workflows/test-go.yml b/.github/workflows/test-go.yml new file mode 100644 index 0000000..343e8ad --- /dev/null +++ b/.github/workflows/test-go.yml @@ -0,0 +1,16 @@ +on: [push, pull_request] +name: Test server +jobs: + test: + strategy: + matrix: + go-version: [1.17.x, 1.18.x] + os: [ubuntu-latest] + runs-on: ${{ matrix.os }} + steps: + - uses: actions/setup-go@v3 + with: + go-version: ${{ matrix.go-version }} + - uses: actions/checkout@v3 + - run: go test ./... + working-directory: server diff --git a/.github/workflows/test-npm.yml b/.github/workflows/test-npm.yml new file mode 100644 index 0000000..8b108ae --- /dev/null +++ b/.github/workflows/test-npm.yml @@ -0,0 +1,22 @@ +name: Test UI + +on: [push, pull_request] + +jobs: + build: + runs-on: ubuntu-latest + strategy: + matrix: + node-version: [10.x, 12.x, 14.x, 15.x] + steps: + - uses: actions/checkout@v3 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node-version }} + - run: npm ci + working-directory: ui + - run: npm run build --if-present + working-directory: ui + - run: npm test + working-directory: ui From 987f0351980d5d9cc29f1d70f49258d4250a2bf1 Mon Sep 17 00:00:00 2001 From: Akhil Gupta Date: Wed, 6 Jul 2022 11:00:09 +0530 Subject: [PATCH 19/21] fix issue #93 --- README.md | 2 +- ui/src/router/views/settings.vue | 2 +- ui/src/router/views/vehicle.vue | 13 ++++++++++--- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 152a658..10295a7 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ -->

Hammond

-

Current Version - 2022.04.26

+

Current Version - 2022.07.06

A self-hosted vehicle expense tracking system with support for multiple users. diff --git a/ui/src/router/views/settings.vue b/ui/src/router/views/settings.vue index eb3db3f..6f487b8 100644 --- a/ui/src/router/views/settings.vue +++ b/ui/src/router/views/settings.vue @@ -203,7 +203,7 @@ export default {

Current Version2021.09.202022.04.26
Website
- + diff --git a/ui/src/router/views/vehicle.vue b/ui/src/router/views/vehicle.vue index 2c1bdfc..101b2fc 100644 --- a/ui/src/router/views/vehicle.vue +++ b/ui/src/router/views/vehicle.vue @@ -199,14 +199,21 @@ export default { return } this.tryingToUpload = true + const formData = new FormData() formData.append('file', this.file, this.file.name) formData.append('title', this.title) - axios - .post(`/api/vehicles/${this.vehicle.id}/attachments`, formData) + // const config = { headers: { 'Content-Type': 'multipart/form-data; boundary=' + formData._boundary } } + fetch(`/api/vehicles/${this.vehicle.id}/attachments`, { + method: 'POST', + body: formData, + headers: { + Authorization: this.currentUser.token, + }, + }) .then((data) => { this.$buefy.toast.open({ - message: 'Quick Entry Created Successfully', + message: 'File uploaded Successfully', type: 'is-success', duration: 3000, }) From d0704c8c6aa98dd23e3aa6e081faeb14feef4b22 Mon Sep 17 00:00:00 2001 From: Eikou Date: Fri, 22 Jul 2022 15:26:17 +0200 Subject: [PATCH 20/21] Fixed issue #87: adapted start date of 'this_week' and 'this_year' stats --- ui/src/components/statsWidget.vue | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ui/src/components/statsWidget.vue b/ui/src/components/statsWidget.vue index 3cacb37..36157f8 100644 --- a/ui/src/components/statsWidget.vue +++ b/ui/src/components/statsWidget.vue @@ -106,6 +106,7 @@ export default { if (currentDayOfWeek > 1) { toSubtract = -1 * (currentDayOfWeek - 1) } + toDate.setHours(0, 0, 0, 0) return addDays(toDate, toSubtract) case 'this_month': return new Date(toDate.getFullYear(), toDate.getMonth(), 1) @@ -114,7 +115,7 @@ export default { case 'past_3_months': return addMonths(toDate, -3) case 'this_year': - return new Date(toDate.getFullYear(), 1, 1) + return new Date(toDate.getFullYear(), 0, 1) case 'all_time': return new Date(1969, 4, 20) default: From afdfa31148d1e70a3f54aeefac186e2f902daa50 Mon Sep 17 00:00:00 2001 From: Alf Sebastian Houge Date: Sat, 26 Nov 2022 19:24:44 +0100 Subject: [PATCH 21/21] Add vscode specific files to gitignore --- server/.gitignore | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/server/.gitignore b/server/.gitignore index 7f17b4d..032b3b4 100644 --- a/server/.gitignore +++ b/server/.gitignore @@ -12,6 +12,10 @@ *.out *.db +# MS VSCode +.vscode +__debug_bin + # Dependency directories (remove the comment below to include it) # vendor/ assets/*
Current Version2022.04.262022.07.06
Website