From fca2c3e7fabf46df97be42b6a119bbd8a431b1c3 Mon Sep 17 00:00:00 2001 From: Akhil Gupta Date: Fri, 3 Sep 2021 15:46:39 +0530 Subject: [PATCH 01/42] 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/42] 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/42] 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/42] 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/42] 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/42] 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/42] 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, 8 Mar 2022 13:49:11 +0100 Subject: [PATCH 08/42] Add vin field vehicle data --- server/db/dbModels.go | 1 + server/db/migrations.go | 4 ++++ server/models/vehicle.go | 1 + server/service/vehicleService.go | 1 + ui/src/router/views/createVehicle.vue | 5 +++++ 5 files changed, 12 insertions(+) diff --git a/server/db/dbModels.go b/server/db/dbModels.go index c0ac9fe..8e2df75 100644 --- a/server/db/dbModels.go +++ b/server/db/dbModels.go @@ -60,6 +60,7 @@ type Vehicle struct { Base Nickname string `json:"nickname"` Registration string `json:"registration"` + VIN string `json:"vin"` Make string `json:"make"` Model string `json:"model"` YearOfManufacture int `json:"yearOfManufacture"` diff --git a/server/db/migrations.go b/server/db/migrations.go index cddd3b3..ecd4039 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: "2022_03_08_13_16_AddVIN", + Query: "ALTER TABLE vehicles ADD COLUMN vin text", + }, } func RunMigrations() { diff --git a/server/models/vehicle.go b/server/models/vehicle.go index e81af97..4373cc3 100644 --- a/server/models/vehicle.go +++ b/server/models/vehicle.go @@ -17,6 +17,7 @@ type SubItemQuery struct { type CreateVehicleRequest struct { Nickname string `form:"nickname" json:"nickname" binding:"required"` Registration string `form:"registration" json:"registration" binding:"required"` + VIN string `form:"vin" json:"vin"` Make string `form:"make" json:"make" binding:"required"` Model string `form:"model" json:"model" binding:"required"` YearOfManufacture int `form:"yearOfManufacture" json:"yearOfManufacture"` diff --git a/server/service/vehicleService.go b/server/service/vehicleService.go index 5e853af..3cadb78 100644 --- a/server/service/vehicleService.go +++ b/server/service/vehicleService.go @@ -99,6 +99,7 @@ func UpdateVehicle(vehicleID string, model models.UpdateVehicleRequest) error { //return db.DB.Model(&toUpdate).Updates(db.Vehicle{ toUpdate.Nickname = model.Nickname toUpdate.Registration = model.Registration + toUpdate.VIN = model.VIN toUpdate.Model = model.Model toUpdate.Make = model.Make toUpdate.YearOfManufacture = model.YearOfManufacture diff --git a/ui/src/router/views/createVehicle.vue b/ui/src/router/views/createVehicle.vue index 7f25469..a408585 100644 --- a/ui/src/router/views/createVehicle.vue +++ b/ui/src/router/views/createVehicle.vue @@ -47,6 +47,7 @@ export default { fuelUnit: null, fuelType: null, registration: '', + vin: '', nickname: '', engineSize: null, make: '', @@ -58,6 +59,7 @@ export default { fuelUnit: veh.fuelUnit, fuelType: veh.fuelType, registration: veh.registration, + vin: veh.vin, nickname: veh.nickname, engineSize: veh.engineSize, make: veh.make, @@ -138,6 +140,9 @@ 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 11/42] 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 12/42] 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 13/42] 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 14/42] 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 15/42] 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 16/42] 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 17/42] 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 c00c6bc776027f239b6357d913658e4ec0b3c228 Mon Sep 17 00:00:00 2001 From: Alf Sebastian Houge Date: Thu, 28 Apr 2022 17:36:13 +0200 Subject: [PATCH 18/42] Map VIN number to db model from request model when creating vehicle --- server/service/vehicleService.go | 1 + 1 file changed, 1 insertion(+) diff --git a/server/service/vehicleService.go b/server/service/vehicleService.go index 3cadb78..fb7b5ff 100644 --- a/server/service/vehicleService.go +++ b/server/service/vehicleService.go @@ -13,6 +13,7 @@ func CreateVehicle(model models.CreateVehicleRequest, userId string) (*db.Vehicl Nickname: model.Nickname, Registration: model.Registration, Model: model.Model, + VIN: model.VIN, Make: model.Make, YearOfManufacture: model.YearOfManufacture, EngineSize: model.EngineSize, From 0b715ef8401d6ad6609dedd228b58248f15dc02c Mon Sep 17 00:00:00 2001 From: Alf Sebastian Houge Date: Thu, 28 Apr 2022 17:47:35 +0200 Subject: [PATCH 19/42] 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 20/42] 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 21/42] 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 22/42] 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 966cac280f462f0a8dcdb0b6cc892eb3248531f7 Mon Sep 17 00:00:00 2001 From: Alf Sebastian Houge Date: Sat, 15 Oct 2022 20:17:19 +0200 Subject: [PATCH 23/42] Add utils for converting imperial and metric --- server/common/utils.go | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/server/common/utils.go b/server/common/utils.go index 2be238d..ba0bb50 100644 --- a/server/common/utils.go +++ b/server/common/utils.go @@ -25,6 +25,33 @@ func RandString(n int) string { return string(b) } +// A helper to convert from litres to gallon +func LitreToGallon(litres float32) float32 { + gallonConversionFactor := 0.21997 + return litres * float32(gallonConversionFactor); +} + +// A helper to convert from gallon to litres +func GallonToLitre(gallons float32) float32 { + litreConversionFactor := 3.785412 + return gallons * float32(litreConversionFactor); +} + + +// A helper to convert from km to miles +func KmToMiles(km float32) float32 { + kmConversionFactor := 0.62137119 + return km * float32(kmConversionFactor); +} + +// A helper to convert from miles to km +func MilesToKm(miles float32) float32 { + milesConversionFactor := 1.609344 + return miles * float32(milesConversionFactor); +} + + + // A Util function to generate jwt_token which can be used in the request header func GenToken(id string, role db.Role) (string, string) { jwt_token := jwt.New(jwt.GetSigningMethod("HS256")) From 2ecb113918bbaffdc03627508ab811a001930182 Mon Sep 17 00:00:00 2001 From: Alf Sebastian Houge Date: Sat, 15 Oct 2022 20:17:41 +0200 Subject: [PATCH 24/42] Add mileage options to frontend --- ui/src/components/mileageChart.vue | 34 ++++++++++++++++++++++++------ ui/src/router/views/vehicle.vue | 31 +++++++++++++++++++++------ 2 files changed, 51 insertions(+), 14 deletions(-) diff --git a/ui/src/components/mileageChart.vue b/ui/src/components/mileageChart.vue index a917529..4b37f98 100644 --- a/ui/src/components/mileageChart.vue +++ b/ui/src/components/mileageChart.vue @@ -3,9 +3,20 @@ import { Line } from 'vue-chartjs' import axios from 'axios' import { mapState } from 'vuex' +import { string } from 'yargs' export default { extends: Line, - props: { vehicle: { type: Object, required: true }, since: { type: Date, default: '' }, user: { type: Object, required: true } }, + props: { + vehicle: { type: Object, required: true }, + since: { type: Date, default: '' }, + user: { type: Object, required: true }, + mileageOption: { type: string, default: 'litre_100km' }, + }, + data: function() { + return { + chartData: [], + } + }, computed: { ...mapState('utils', ['isMobile']), }, @@ -17,20 +28,28 @@ export default { this.fetchMileage() }, }, - data: function() { - return { - chartData: [], - } - }, mounted() { this.fetchMileage() }, methods: { showChart() { + let mileageLabel = '' + switch (this.mileageOption) { + case 'litre_100km': + mileageLabel = 'L/100km' + break + case 'km_litre': + mileageLabel = 'km/L' + break + case 'mpg': + mileageLabel = 'mpg' + break + } + var labels = this.chartData.map((x) => x.date.substr(0, 10)) var dataset = { steppedLine: true, - label: `Mileage (${this.user.distanceUnitDetail.short}/${this.vehicle.fuelUnitDetail.short})`, + label: `Mileage (${mileageLabel})`, fill: true, data: this.chartData.map((x) => x.mileage), } @@ -41,6 +60,7 @@ export default { .get(`/api/vehicles/${this.vehicle.id}/mileage`, { params: { since: this.since, + mileageOption: this.mileageOption, }, }) .then((response) => { diff --git a/ui/src/router/views/vehicle.vue b/ui/src/router/views/vehicle.vue index 101b2fc..f5ce51c 100644 --- a/ui/src/router/views/vehicle.vue +++ b/ui/src/router/views/vehicle.vue @@ -48,6 +48,12 @@ export default { { label: 'All Time', value: 'all_time' }, ], dateRangeOption: 'past_30_days', + mileageOptions: [ + { label: 'L/100km', value: 'litre_100km' }, + { label: 'km/L', value: 'km_litre' }, + { label: 'mpg', value: 'mpg' }, + ], + mileageOption: 'litre_100km', } }, computed: { @@ -529,14 +535,25 @@ export default {

Stats

- - -
+
+
+ + + +
+
+ + + +
+
+
- + From c0db2c5c1e115011462127d81c637e80ba513ab5 Mon Sep 17 00:00:00 2001 From: Alf Sebastian Houge Date: Sat, 15 Oct 2022 20:18:26 +0200 Subject: [PATCH 25/42] Calculate mileage based on mileageOption --- server/controllers/reports.go | 2 +- server/models/report.go | 3 ++- server/service/reportService.go | 43 ++++++++++++++++++++++++++++++--- 3 files changed, 42 insertions(+), 6 deletions(-) diff --git a/server/controllers/reports.go b/server/controllers/reports.go index 6284ffa..6db3f10 100644 --- a/server/controllers/reports.go +++ b/server/controllers/reports.go @@ -25,7 +25,7 @@ func getMileageForVehicle(c *gin.Context) { return } - fillups, err := service.GetMileageByVehicleId(searchByIdQuery.Id, model.Since) + fillups, err := service.GetMileageByVehicleId(searchByIdQuery.Id, model.Since, model.MileageOption) if err != nil { c.JSON(http.StatusUnprocessableEntity, common.NewError("getMileageForVehicle", err)) return diff --git a/server/models/report.go b/server/models/report.go index 40e5403..c436b84 100644 --- a/server/models/report.go +++ b/server/models/report.go @@ -14,7 +14,7 @@ type MileageModel struct { FuelQuantity float32 `form:"fuelQuantity" json:"fuelQuantity" binding:"required"` PerUnitPrice float32 `form:"perUnitPrice" json:"perUnitPrice" binding:"required"` Currency string `json:"currency"` - + DistanceUnit db.DistanceUnit `form:"distanceUnit" json:"distanceUnit"` Mileage float32 `form:"mileage" json:"mileage" binding:"mileage"` CostPerMile float32 `form:"costPerMile" json:"costPerMile" binding:"costPerMile"` OdoReading int `form:"odoReading" json:"odoReading" binding:"odoReading"` @@ -35,4 +35,5 @@ func (b *MileageModel) MarshalJSON() ([]byte, error) { type MileageQueryModel struct { Since time.Time `json:"since" query:"since" form:"since"` + MileageOption string `json:"mileageOption" query:"mileageOption" form:"mileageOption"` } diff --git a/server/service/reportService.go b/server/service/reportService.go index d58b9cd..7daf69b 100644 --- a/server/service/reportService.go +++ b/server/service/reportService.go @@ -4,11 +4,12 @@ import ( "sort" "time" + "github.com/akhilrex/hammond/common" "github.com/akhilrex/hammond/db" "github.com/akhilrex/hammond/models" ) -func GetMileageByVehicleId(vehicleId string, since time.Time) (mileage []models.MileageModel, err error) { +func GetMileageByVehicleId(vehicleId string, since time.Time, mileageOption string) (mileage []models.MileageModel, err error) { data, err := db.GetFillupsByVehicleIdSince(vehicleId, since) if err != nil { return nil, err @@ -36,14 +37,48 @@ func GetMileageByVehicleId(vehicleId string, since time.Time) (mileage []models. PerUnitPrice: currentFillup.PerUnitPrice, OdoReading: currentFillup.OdoReading, Currency: currentFillup.Currency, + DistanceUnit: currentFillup.DistanceUnit, Mileage: 0, CostPerMile: 0, } if currentFillup.IsTankFull != nil && *currentFillup.IsTankFull && (currentFillup.HasMissedFillup == nil || !(*currentFillup.HasMissedFillup)) { - distance := float32(currentFillup.OdoReading - lastFillup.OdoReading) - mileage.Mileage = distance / currentFillup.FuelQuantity - mileage.CostPerMile = distance / currentFillup.TotalAmount + currentOdoReading := float32(currentFillup.OdoReading); + lastFillupOdoReading := float32(lastFillup.OdoReading); + currentFuelQuantity := float32(currentFillup.FuelQuantity); + // If miles per gallon option and distanceUnit is km, convert from km to miles + // then check if fuel unit is litres. If it is, convert to gallons + if (mileageOption == "mpg" && mileage.DistanceUnit == db.KILOMETERS) { + currentOdoReading = common.KmToMiles(currentOdoReading); + lastFillupOdoReading = common.KmToMiles(lastFillupOdoReading); + if (mileage.FuelUnit == db.LITRE) { + currentFuelQuantity = common.LitreToGallon(currentFuelQuantity); + } + } + + // If km_litre option or litre per 100km and distanceUnit is miles, convert from miles to km + // then check if fuel unit is not litres. If it isn't, convert to litres + + if ((mileageOption == "km_litre" || mileageOption == "litre_100km") && mileage.DistanceUnit == db.MILES) { + currentOdoReading = common.MilesToKm(currentOdoReading); + lastFillupOdoReading = common.MilesToKm(lastFillupOdoReading); + + if (mileage.FuelUnit == db.US_GALLON) { + currentFuelQuantity = common.GallonToLitre(currentFuelQuantity); + } + } + + + + + distance := float32(currentOdoReading - lastFillupOdoReading); + if (mileageOption == "litre_100km") { + mileage.Mileage = currentFuelQuantity / distance * 100; + } else { + mileage.Mileage = distance / currentFuelQuantity; + } + + mileage.CostPerMile = distance / currentFillup.TotalAmount; } From afdfa31148d1e70a3f54aeefac186e2f902daa50 Mon Sep 17 00:00:00 2001 From: Alf Sebastian Houge Date: Sat, 26 Nov 2022 19:24:44 +0100 Subject: [PATCH 26/42] 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/* From 0b450dc46276852a519790f0ac0ea0ddc1af828b Mon Sep 17 00:00:00 2001 From: boerniee Date: Thu, 12 Jan 2023 21:02:40 +0100 Subject: [PATCH 27/42] added translations #80 #19 --- server/db/enums.go | 12 +- ui/package.json | 2 + ui/src/components/createQuickEntry.vue | 12 +- ui/src/components/mileageChart.vue | 2 +- ui/src/components/nav-bar.vue | 18 +-- ui/src/components/quickEntryDisplay.vue | 4 +- ui/src/components/shareVehicle.vue | 6 +- ui/src/components/statsWidget.vue | 24 +-- ui/src/i18n.js | 77 +++++++++ ui/src/locales/de.json | 193 +++++++++++++++++++++++ ui/src/locales/en.json | 200 ++++++++++++++++++++++++ ui/src/main.js | 3 + ui/src/router/views/_404.vue | 2 +- ui/src/router/views/_timeout.vue | 3 +- ui/src/router/views/createExpense.vue | 32 ++-- ui/src/router/views/createFillup.vue | 64 ++++---- ui/src/router/views/createVehicle.vue | 36 ++--- ui/src/router/views/home.vue | 35 ++--- ui/src/router/views/import.vue | 8 +- ui/src/router/views/initialize.vue | 59 +++---- ui/src/router/views/login.vue | 14 +- ui/src/router/views/profile.vue | 2 +- ui/src/router/views/quickEntries.vue | 20 +-- ui/src/router/views/settings.vue | 38 ++--- ui/src/router/views/siteSettings.vue | 16 +- ui/src/router/views/users.vue | 56 +++---- ui/src/router/views/vehicle.vue | 112 ++++++------- 27 files changed, 753 insertions(+), 297 deletions(-) create mode 100644 ui/src/i18n.js create mode 100644 ui/src/locales/de.json create mode 100644 ui/src/locales/en.json diff --git a/server/db/enums.go b/server/db/enums.go index 296d06e..723e721 100644 --- a/server/db/enums.go +++ b/server/db/enums.go @@ -59,24 +59,24 @@ type EnumDetail struct { var FuelUnitDetails map[FuelUnit]EnumDetail = map[FuelUnit]EnumDetail{ LITRE: { Short: "Lt", - Long: "Litre", + Long: "litre", }, GALLON: { Short: "Gal", - Long: "Gallon", + Long: "gallon", }, KILOGRAM: { Short: "Kg", - Long: "Kilogram", + Long: "kilogram", }, KILOWATT_HOUR: { Short: "KwH", - Long: "Kilowatt Hour", + Long: "kilowatthour", }, US_GALLON: { Short: "US Gal", - Long: "US Gallon", + Long: "usgallon", }, MINUTE: { Short: "Mins", - Long: "Minutes", + Long: "minutes", }, } diff --git a/ui/package.json b/ui/package.json index b246e38..d10ea64 100644 --- a/ui/package.json +++ b/ui/package.json @@ -41,10 +41,12 @@ "currency-formatter": "^1.5.7", "date-fns": "2.10.0", "lodash": "^4.17.21", + "node-gyp": "^9.3.1", "normalize.css": "8.0.1", "nprogress": "0.2.0", "vue": "2.6.11", "vue-chartjs": "^3.5.1", + "vue-i18n": "^8.28.2", "vue-meta": "2.3.3", "vue-router": "3.1.6", "vuex": "3.1.2" diff --git a/ui/src/components/createQuickEntry.vue b/ui/src/components/createQuickEntry.vue index fe8dc72..d535ebc 100644 --- a/ui/src/components/createQuickEntry.vue +++ b/ui/src/components/createQuickEntry.vue @@ -20,7 +20,7 @@ export default { } } else { if (this.file == null) { - return 'Upload Photo' + return this.$t('uploadphoto') } else { return '' } @@ -39,7 +39,7 @@ export default { .post(`/api/quickEntries`, formData) .then((data) => { this.$buefy.toast.open({ - message: 'Quick Entry Created Successfully', + message: this.$t('quickentrycreatedsuccessfully'), type: 'is-success', duration: 3000, }) @@ -68,9 +68,9 @@ export default {
-

Quick Entry

+

{{ $tc('quickentry',1) }}

Take a pic of the invoice or the fuel pump display to make an entry later.

{{ $t('quickentrydesc') }}

@@ -99,10 +99,10 @@ export default { native-type="submit" :disabled="tryingToCreate" type="is-primary" - value="Upload File" + :value="this.$t('uploadfile')" class="control" > - Upload File + {{ $t('uploadfile') }}
diff --git a/ui/src/components/mileageChart.vue b/ui/src/components/mileageChart.vue index a917529..33d0a6c 100644 --- a/ui/src/components/mileageChart.vue +++ b/ui/src/components/mileageChart.vue @@ -30,7 +30,7 @@ export default { var labels = this.chartData.map((x) => x.date.substr(0, 10)) var dataset = { steppedLine: true, - label: `Mileage (${this.user.distanceUnitDetail.short}/${this.vehicle.fuelUnitDetail.short})`, + label: `${this.$t('odometer')} (${this.user.distanceUnitDetail.short}/${this.vehicle.fuelUnitDetail.short})`, fill: true, data: this.chartData.map((x) => x.mileage), } diff --git a/ui/src/components/nav-bar.vue b/ui/src/components/nav-bar.vue index fbac02b..d2a7784 100644 --- a/ui/src/components/nav-bar.vue +++ b/ui/src/components/nav-bar.vue @@ -10,42 +10,42 @@ export default { persistentNavRoutes: [ { name: 'home', - title: 'Home', + title: this.$t('menu.home'), }, ], loggedInNavRoutes: [ { name: 'quickEntries', - title: () => 'Quick Entries', + title: () => this.$t('menu.quickentries'), badge: () => this.unprocessedQuickEntries.length, }, { name: 'import', - title: () => 'Import', + title: () => this.$t('menu.import'), }, { name: 'settings', - title: 'Settings', + title: this.$t('menu.settings'), }, { name: 'logout', - title: 'Log out', + title: this.$t('menu.logout'), }, ], loggedOutNavRoutes: [ { name: 'login', - title: 'Log in', + title: this.$t('menu.login'), }, ], adminNavRoutes: [ { name: 'site-settings', - title: 'Site Settings', + title: this.$t('menu.sitesettings'), }, { name: 'users', - title: 'Users', + title: this.$t('menu.users'), }, ], } @@ -72,7 +72,7 @@ export default { - + diff --git a/ui/src/components/quickEntryDisplay.vue b/ui/src/components/quickEntryDisplay.vue index 602d844..0381302 100644 --- a/ui/src/components/quickEntryDisplay.vue +++ b/ui/src/components/quickEntryDisplay.vue @@ -50,12 +50,12 @@ export default {

diff --git a/ui/src/components/shareVehicle.vue b/ui/src/components/shareVehicle.vue index d324b50..35ed5b1 100644 --- a/ui/src/components/shareVehicle.vue +++ b/ui/src/components/shareVehicle.vue @@ -55,7 +55,7 @@ export default { return } this.$buefy.dialog.confirm({ - title: 'Transfer Vehicle', + title: this.$t('transfervehicle'), message: 'Are you sure you want to do this? You will lose ownership and all editing rights if you confirm.', cancelText: 'Cancel', confirmText: 'Go Ahead', @@ -90,7 +90,7 @@ export default {

Current Version2022.04.262022.07.06
Website