diff --git a/.github/ISSUE_TEMPLATE/bug-report-en.yaml b/.github/ISSUE_TEMPLATE/bug-report-en.yaml index 9237abe..9a79ab6 100644 --- a/.github/ISSUE_TEMPLATE/bug-report-en.yaml +++ b/.github/ISSUE_TEMPLATE/bug-report-en.yaml @@ -59,6 +59,7 @@ body: - "1009 (HTML Error)" - "1010 (Captcha Error)" - "1011 (Start-up Error)" + - "1012 (Docker Error)" validations: required: true diff --git a/.github/ISSUE_TEMPLATE/bug-report-jp.yaml b/.github/ISSUE_TEMPLATE/bug-report-jp.yaml index db32880..4738395 100644 --- a/.github/ISSUE_TEMPLATE/bug-report-jp.yaml +++ b/.github/ISSUE_TEMPLATE/bug-report-jp.yaml @@ -60,6 +60,7 @@ body: - "1009 (HTML Error)" - "1010 (Captcha Error)" - "1011 (Start-up Error)" + - "1012 (Docker Error)" validations: required: true diff --git a/backend/app/advanced_prefs.go b/backend/app/advanced_prefs.go index c34ea1c..40a8143 100644 --- a/backend/app/advanced_prefs.go +++ b/backend/app/advanced_prefs.go @@ -116,8 +116,8 @@ func (a *App) GetFfmpegPath() string { } type UserAgentResponse struct { - UserAgent string - IsDefault bool + UserAgent string `json:"UserAgent"` + IsDefault bool `json:"IsDefault"` } func (a *App) GetUserAgent() UserAgentResponse { diff --git a/backend/app/app.go b/backend/app/app.go index 5053d0c..23686bf 100644 --- a/backend/app/app.go +++ b/backend/app/app.go @@ -1,11 +1,11 @@ package app import ( - "container/list" "context" "time" "github.com/KJHJason/Cultured-Downloader-Logic/gdrive" + "github.com/KJHJason/Cultured-Downloader-Logic/utils/threadsafe" "github.com/KJHJason/Cultured-Downloader/backend/appdata" "github.com/KJHJason/Cultured-Downloader/backend/notifier" ) @@ -15,7 +15,7 @@ type App struct { ctx context.Context appData *appdata.AppData lang string - downloadQueues list.List // doubly linked list of DownloadQueue + downloadQueues threadsafe.DoublyLinkedList[*DownloadQueue] // list.List // doubly linked list of DownloadQueue queueTicker *time.Ticker gdriveClient *gdrive.GDrive notifier notifier.Notifier diff --git a/backend/app/download.go b/backend/app/download.go index a71b609..9493ad2 100644 --- a/backend/app/download.go +++ b/backend/app/download.go @@ -1,11 +1,11 @@ package app import ( - "container/list" "context" "sync" "github.com/KJHJason/Cultured-Downloader-Logic/progress" + "github.com/KJHJason/Cultured-Downloader-Logic/utils/threadsafe" ) type Input struct { @@ -55,43 +55,69 @@ func (a *App) addNewDownloadQueue(ctx context.Context, cancelFunc context.Cancel mu: sync.Mutex{}, inputs: dlInfo.inputs, } - a.downloadQueues.PushBack(dlQueue) + a.downloadQueues.Append(dlQueue) return dlQueue } -func (a *App) getQueueEl(id int) (*list.Element, *DownloadQueue) { - if a.downloadQueues.Len() == 0 { - return nil, nil +func (a *App) getTraversalDirection(id int) (direction threadsafe.TraversalDirection, ok bool) { + queueLen := a.downloadQueues.Len() + if queueLen == 0 { + return -1, false } + onlyOneQueue := queueLen == 1 - // check if id is valid since we are using a counter based id system + // Retrieve the first and last queue firstEl := a.downloadQueues.Front() - lastEl := a.downloadQueues.Back() - firstQueue := firstEl.Value.(*DownloadQueue) - lastQueue := lastEl.Value.(*DownloadQueue) + var lastEl *threadsafe.DoublyLinkedListNode[*DownloadQueue] + if onlyOneQueue { + lastEl = firstEl // since the head and tail will point to the same node + } else { + lastEl = a.downloadQueues.Back() + } + + firstQueue, lastQueue := firstEl.Value, lastEl.Value + // check if id is valid since we are using a counter based id system if id < firstQueue.id || id > lastQueue.id { - return nil, nil + return -1, false + } + + if onlyOneQueue { // since the head and tail points to the same node... + // Just traverse from head. + return threadsafe.TraverseFromHead, true } // Decide which direction is the best to iterate through the list // by comparing the distance between the first and last element of the list - var dlQueue *list.Element - var direction int if id-firstQueue.id < lastQueue.id-id { - dlQueue = firstEl - direction = 1 + // dlQueue = firstEl + return threadsafe.TraverseFromHead, true } else { - dlQueue = lastEl - direction = -1 + // dlQueue = lastEl + return threadsafe.TraverseFromTail, true + } +} + +func (a *App) getQueueEl(id int) (*threadsafe.DoublyLinkedListNode[*DownloadQueue], *DownloadQueue) { + traversalDirection, ok := a.getTraversalDirection(id) + if !ok { + return nil, nil + } + traverseFromHead := traversalDirection == threadsafe.TraverseFromHead + + var dlQueue *threadsafe.DoublyLinkedListNode[*DownloadQueue] + if traverseFromHead { + dlQueue = a.downloadQueues.Front() + } else { + dlQueue = a.downloadQueues.Back() } for dlQueue != nil { - el := dlQueue.Value.(*DownloadQueue) + el := dlQueue.Value if el.id == id { return dlQueue, el } - if direction == 1 { + if traverseFromHead { dlQueue = dlQueue.Next() } else { dlQueue = dlQueue.Prev() @@ -101,13 +127,18 @@ func (a *App) getQueueEl(id int) (*list.Element, *DownloadQueue) { } func (a *App) DeleteQueue(id int) { - listEl, queue := a.getQueueEl(id) - if queue == nil || listEl == nil { + traversalDirection, ok := a.getTraversalDirection(id) + if !ok { return } - queue.CancelQueue() - a.downloadQueues.Remove(listEl) + a.downloadQueues.RemoveViaFn(traversalDirection, func(curValue *DownloadQueue) bool { + if curValue.id != id { + return false + } + curValue.CancelQueue() + return true + }) } func (a *App) CancelQueue(id int) { @@ -122,7 +153,7 @@ func (a *App) CancelQueue(id int) { func (a *App) startNewQueues() { // loop through the doubly linked list of download queues for e := a.downloadQueues.Front(); e != nil; e = e.Next() { - dq := e.Value.(*DownloadQueue) + dq := e.Value if active, finished := dq.GetStatus(); active || finished { continue } diff --git a/backend/app/download_frontend.go b/backend/app/download_frontend.go index af866f9..40e8bdf 100644 --- a/backend/app/download_frontend.go +++ b/backend/app/download_frontend.go @@ -4,10 +4,8 @@ import ( "fmt" "strings" - cdlConst "github.com/KJHJason/Cultured-Downloader-Logic/constants" "github.com/KJHJason/Cultured-Downloader-Logic/iofuncs" "github.com/KJHJason/Cultured-Downloader-Logic/progress" - "github.com/KJHJason/Cultured-Downloader/backend/constants" ) type FrontendDownloadQueue struct { @@ -74,40 +72,14 @@ func formatFrontendDlDetails(dlProgressBars []*progress.DownloadProgressBar) []* } } - // Reverse the sub-slice of already finished download progress bars within + // Reverse the sub-slice of already finished download progress bars within // dlDetails so that the recently finished download progress bar is at the top - for i, j := donePtr + 1, lastIdx; i <= j; i, j = i+1, j-1 { + for i, j := donePtr+1, lastIdx; i <= j; i, j = i+1, j-1 { dlDetails[i], dlDetails[j] = dlDetails[j], dlDetails[i] } return dlDetails } -func checkNestedProgBarForErrors(dlQueue *DownloadQueue) bool { - hasError := false - nestedProgBars := dlQueue.mainProgressBar.nestedProgBars - - lastElIdx := len(nestedProgBars) - 1 - for idx, nestedProgBar := range nestedProgBars { - if !hasError && nestedProgBar.HasError { - hasError = true - if dlQueue.website != constants.FANTIA { - // for those that doesn't have a captcha solver - continue - } - - if nestedProgBar.ErrMsg != cdlConst.ERR_RECAPTCHA_STR { - continue - } - - // check the next element if it has an error as the captcha error can be ignored if the next element has no error - if idx+1 <= lastElIdx && nestedProgBars[idx+1].HasError { - hasError = true - } - } - } - return hasError -} - func (a *App) GetFrontendDownloadDetails(id int) []*FrontendDownloadDetails { _, dlQueue := a.getQueueEl(id) if dlQueue == nil { @@ -120,7 +92,7 @@ func (a *App) GetFrontendDownloadDetails(id int) []*FrontendDownloadDetails { func (a *App) GetDownloadQueues() []FrontendDownloadQueue { var queues []FrontendDownloadQueue for e := a.downloadQueues.Back(); e != nil; e = e.Prev() { - val := e.Value.(*DownloadQueue) + val := e.Value msg := val.mainProgressBar.GetBaseMsg() if !val.mainProgressBar.GetIsSpinner() && strings.Contains(msg, "%d") { @@ -133,6 +105,15 @@ func (a *App) GetDownloadQueues() []FrontendDownloadQueue { errStringSlice[idx] = err.Error() } + hasError := false + nestedProgBars := val.mainProgressBar.nestedProgBars + for _, nestedProgBar := range nestedProgBars { + if nestedProgBar.HasError { + hasError = true + break + } + } + queues = append(queues, FrontendDownloadQueue{ Id: val.id, Website: val.website, @@ -140,7 +121,7 @@ func (a *App) GetDownloadQueues() []FrontendDownloadQueue { SuccessMsg: val.mainProgressBar.GetSuccessMsg(), ErrMsg: val.mainProgressBar.GetErrorMsg(), ErrSlice: errStringSlice, - HasError: checkNestedProgBarForErrors(val), + HasError: hasError, Inputs: val.inputs, ProgressBar: *val.mainProgressBar, NestedProgressBar: val.mainProgressBar.nestedProgBars, diff --git a/backend/app/fantia.go b/backend/app/fantia.go index 9e27521..66dabe7 100644 --- a/backend/app/fantia.go +++ b/backend/app/fantia.go @@ -8,6 +8,7 @@ import ( "path/filepath" cdlogic "github.com/KJHJason/Cultured-Downloader-Logic" + "github.com/KJHJason/Cultured-Downloader-Logic/api" "github.com/KJHJason/Cultured-Downloader-Logic/api/fantia" "github.com/KJHJason/Cultured-Downloader-Logic/configs" cdlconsts "github.com/KJHJason/Cultured-Downloader-Logic/constants" @@ -21,15 +22,33 @@ func validateFantiaUrls(inputs []string) (bool, []Input, *fantia.FantiaDl) { inputsForRef := make([]Input, len(inputs)) for idx, input := range inputs { if postUrlMatch := cdlconsts.FANTIA_POST_URL_REGEX.FindStringSubmatch(input); len(postUrlMatch) > 0 { - fantiaDl.PostIds = append(fantiaDl.PostIds, postUrlMatch[cdlconsts.FANTIA_POST_ID_IDX]) + fantiaDl.PostIds = append( + fantiaDl.PostIds, + postUrlMatch[cdlconsts.FANTIA_POST_ID_IDX], + ) } else if creatorUrlMatch := cdlconsts.FANTIA_CREATOR_URL_REGEX.FindStringSubmatch(input); len(creatorUrlMatch) > 0 { - fantiaDl.FanclubIds = append(fantiaDl.FanclubIds, creatorUrlMatch[cdlconsts.FANTIA_CREATOR_ID_IDX]) - fantiaDl.FanclubPageNums = append(fantiaDl.FanclubPageNums, creatorUrlMatch[cdlconsts.FANTIA_CREATOR_PAGE_NUM_IDX]) + fantiaDl.FanclubIds = append( + fantiaDl.FanclubIds, + creatorUrlMatch[cdlconsts.FANTIA_CREATOR_ID_IDX], + ) + fantiaDl.FanclubPageNums = append( + fantiaDl.FanclubPageNums, + creatorUrlMatch[cdlconsts.FANTIA_CREATOR_PAGE_NUM_IDX], + ) } else if productUrlMatch := cdlconsts.FANTIA_PRODUCT_URL_REGEX.FindStringSubmatch(input); len(productUrlMatch) > 0 { - fantiaDl.ProductIds = append(fantiaDl.ProductIds, productUrlMatch[cdlconsts.FANTIA_PRODUCT_ID_IDX]) + fantiaDl.ProductIds = append( + fantiaDl.ProductIds, + productUrlMatch[cdlconsts.FANTIA_PRODUCT_ID_IDX], + ) } else if fanclubProductUrlMatch := cdlconsts.FANTIA_FANCLUB_PRODUCT_URL_REGEX.FindStringSubmatch(input); len(fanclubProductUrlMatch) > 0 { - fantiaDl.ProductFanclubIds = append(fantiaDl.ProductFanclubIds, fanclubProductUrlMatch[cdlconsts.FANTIA_FANCLUB_PRODUCT_ID_IDX]) - fantiaDl.ProductFanclubPageNums = append(fantiaDl.ProductFanclubPageNums, fanclubProductUrlMatch[cdlconsts.FANTIA_FANCLUB_PRODUCT_PAGE_NUM_IDX]) + fantiaDl.ProductFanclubIds = append( + fantiaDl.ProductFanclubIds, + fanclubProductUrlMatch[cdlconsts.FANTIA_FANCLUB_PRODUCT_ID_IDX], + ) + fantiaDl.ProductFanclubPageNums = append( + fantiaDl.ProductFanclubPageNums, + fanclubProductUrlMatch[cdlconsts.FANTIA_FANCLUB_PRODUCT_PAGE_NUM_IDX], + ) } else { return false, nil, nil } @@ -53,7 +72,16 @@ func (a *App) ValidateFantiaUrls(inputs []string) bool { return valid } -func (a *App) parseFantiaSettingsMap(ctx context.Context, pref *Preferences) (fantiaDlOptions *fantia.FantiaDlOptions, mainProgBar *ProgressBar, err error) { +func (a *App) parseFantiaSettingsMap( + ctx context.Context, + pref *Preferences, + dlFilters Filters, +) (fantiaDlOptions *fantia.FantiaDlOptions, mainProgBar *ProgressBar, err error) { + filters, err := dlFilters.ConverToCDLFilters() + if err != nil { + return nil, nil, err + } + fantiaSession := a.appData.GetSecuredString(constants.FANTIA_COOKIE_VALUE_KEY) var fantiaSessions []*http.Cookie if fantiaSession == "" { @@ -76,31 +104,36 @@ func (a *App) parseFantiaSettingsMap(ctx context.Context, pref *Preferences) (fa mainProgBar.UpdateFolderPath(baseDlDirPath) fantiaDlOptions = &fantia.FantiaDlOptions{ - DlThumbnails: pref.DlPostThumbnail, - DlImages: pref.DlPostImages, - OrganiseImages: pref.OrganisePostImages, - DlAttachments: pref.DlPostAttachments, - DlGdrive: pref.DlGDrive, - UseCacheDb: pref.UseCacheDb, - BaseDownloadDirPath: baseDlDirPath, - - GdriveClient: a.GetGdriveClient(), - - Configs: &configs.Config{ - DownloadPath: downloadPath, - FfmpegPath: "", - OverwriteFiles: pref.OverwriteFiles, - LogUrls: pref.DetectOtherLinks, - UserAgent: userAgent, + Base: &api.BaseDl{ + DlThumbnails: pref.DlPostThumbnail, + DlImages: pref.DlPostImages, + OrganiseImages: pref.OrganisePostImages, + DlAttachments: pref.DlPostAttachments, + DlGdrive: pref.DlGDrive, + UseCacheDb: pref.UseCacheDb, + DownloadDirPath: baseDlDirPath, + + GdriveClient: a.getGdriveClient(), + + Filters: filters, + Configs: &configs.Config{ + DownloadPath: downloadPath, + FfmpegPath: "", + OverwriteFiles: pref.OverwriteFiles, + LogUrls: pref.DetectOtherLinks, + UserAgent: userAgent, + }, + + SessionCookieId: fantiaSession, + SessionCookies: fantiaSessions, + + Notifier: a.notifier, + + ProgressBarInfo: &progress.ProgressBarInfo{ + MainProgressBar: mainProgBar, + DownloadProgressBars: &[]*progress.DownloadProgressBar{}, + }, }, - - SessionCookieId: fantiaSession, - SessionCookies: fantiaSessions, - - Notifier: a.notifier, - - MainProgBar: mainProgBar, - DownloadProgressBars: &[]*progress.DownloadProgressBar{}, } fantiaDlOptions.SetContext(ctx) err = fantiaDlOptions.ValidateArgs(userAgent) @@ -110,7 +143,7 @@ func (a *App) parseFantiaSettingsMap(ctx context.Context, pref *Preferences) (fa return fantiaDlOptions, mainProgBar, nil } -func (a *App) SubmitFantiaToQueue(inputs []string, prefs *Preferences) error { +func (a *App) SubmitFantiaToQueue(inputs []string, prefs *Preferences, dlFilters Filters) error { if prefs == nil { return errors.New("preferences is nil in SubmitFantiaToQueue()") } @@ -121,7 +154,7 @@ func (a *App) SubmitFantiaToQueue(inputs []string, prefs *Preferences) error { } ctx, cancel := context.WithCancel(a.ctx) - fantiaDlOptions, mainProgBar, err := a.parseFantiaSettingsMap(ctx, prefs) + fantiaDlOptions, mainProgBar, err := a.parseFantiaSettingsMap(ctx, prefs, dlFilters) if err != nil { cancel() return err @@ -131,10 +164,14 @@ func (a *App) SubmitFantiaToQueue(inputs []string, prefs *Preferences) error { website: cdlconsts.FANTIA, inputs: inputsForRef, mainProgBar: mainProgBar, - dlProgressBars: fantiaDlOptions.DownloadProgressBars, + dlProgressBars: fantiaDlOptions.Base.DownloadProgressBars(), taskHandler: func() []error { defer cancel() - errSlice := cdlogic.FantiaDownloadProcess(fantiaDl, fantiaDlOptions) + errSlice := cdlogic.FantiaDownloadProcess( + fantiaDl, + fantiaDlOptions, + constants.CATCH_SIGINT, + ) mainProgBar.MakeLatestSnapshotMain() return errSlice }, diff --git a/backend/app/fantia_preferences.go b/backend/app/fantia_preferences.go index 8f7dae0..29bb655 100644 --- a/backend/app/fantia_preferences.go +++ b/backend/app/fantia_preferences.go @@ -3,7 +3,7 @@ package app import ( "fmt" - cdlerrors "github.com/KJHJason/Cultured-Downloader-Logic/errors" + "github.com/KJHJason/Cultured-Downloader-Logic/cdlerrors" "github.com/KJHJason/Cultured-Downloader/backend/constants" ) diff --git a/backend/app/gdrive.go b/backend/app/gdrive.go index 615bb27..f01a09e 100644 --- a/backend/app/gdrive.go +++ b/backend/app/gdrive.go @@ -13,7 +13,7 @@ import ( "github.com/wailsapp/wails/v2/pkg/runtime" ) -func (a *App) GetGdriveClient() *gdrive.GDrive { +func (a *App) getGdriveClient() *gdrive.GDrive { if a.gdriveClient != nil { return a.gdriveClient } @@ -158,8 +158,8 @@ func (a *App) GetGDriveServiceAccount() string { } type GetGDriveOauthResponse struct { - ClientJson string - TokenJson string + ClientJson string `json:"ClientJson"` + TokenJson string `json:"TokenJson"` } func (a *App) GetGDriveClientAndOauthToken() GetGDriveOauthResponse { diff --git a/backend/app/gdrive_oauth.go b/backend/app/gdrive_oauth.go index 6ced232..31f9129 100644 --- a/backend/app/gdrive_oauth.go +++ b/backend/app/gdrive_oauth.go @@ -50,7 +50,7 @@ func updateGdriveOauthErr(err error) { gdriveOauthErr = err } -func (a *App) gdriveOauthFlow(ctx context.Context) { +func (a *App) gdriveOauthFlow(ctx context.Context, port uint16) { defer func() { gdriveOauthMu.Lock() gdriveOauthCancelFunc() @@ -61,7 +61,7 @@ func (a *App) gdriveOauthFlow(ctx context.Context) { var err error var gdriveOauthToken *oauth2.Token - gdriveOauthToken, err = gdrive.StartOAuthListener(ctx, getGdriveOauthConfig()) + gdriveOauthToken, err = gdrive.StartOAuthListener(ctx, port, getGdriveOauthConfig()) if err != nil { updateGdriveOauthErr(err) return @@ -103,7 +103,7 @@ func (a *App) StartGDriveOauth() error { ctx, gdriveOauthCancelFunc = context.WithCancel(a.ctx) gdriveOauthMu.Unlock() - go a.gdriveOauthFlow(ctx) + go a.gdriveOauthFlow(ctx, 8080) return nil } diff --git a/backend/app/kemono.go b/backend/app/kemono.go index a539a18..7fa71ba 100644 --- a/backend/app/kemono.go +++ b/backend/app/kemono.go @@ -8,6 +8,7 @@ import ( "path/filepath" cdlogic "github.com/KJHJason/Cultured-Downloader-Logic" + "github.com/KJHJason/Cultured-Downloader-Logic/api" "github.com/KJHJason/Cultured-Downloader-Logic/api/kemono" "github.com/KJHJason/Cultured-Downloader-Logic/configs" cdlconsts "github.com/KJHJason/Cultured-Downloader-Logic/constants" @@ -62,7 +63,16 @@ func (a *App) ValidateKemonoInputs(inputs []string) bool { return valid } -func (a *App) parseKemonoSettingsMap(ctx context.Context, pref *Preferences) (kemonoDlOptions *kemono.KemonoDlOptions, mainProgBar *ProgressBar, err error) { +func (a *App) parseKemonoSettingsMap( + ctx context.Context, + pref *Preferences, + dlFilters Filters, +) (kemonoDlOptions *kemono.KemonoDlOptions, mainProgBar *ProgressBar, err error) { + filters, err := dlFilters.ConverToCDLFilters() + if err != nil { + return nil, nil, err + } + kemonoSession := a.appData.GetSecuredString(constants.KEMONO_COOKIE_VALUE_KEY) var kemonoSessions []*http.Cookie if kemonoSession == "" { @@ -85,28 +95,33 @@ func (a *App) parseKemonoSettingsMap(ctx context.Context, pref *Preferences) (ke mainProgBar.UpdateFolderPath(baseDlDirPath) kemonoDlOptions = &kemono.KemonoDlOptions{ - DlAttachments: pref.DlPostAttachments, - DlGdrive: pref.DlGDrive, - BaseDownloadDirPath: baseDlDirPath, - UseCacheDb: pref.UseCacheDb, - - GdriveClient: a.GetGdriveClient(), - - Configs: &configs.Config{ - DownloadPath: downloadPath, - FfmpegPath: "", - OverwriteFiles: pref.OverwriteFiles, - LogUrls: pref.DetectOtherLinks, - UserAgent: userAgent, + Base: &api.BaseDl{ + DlAttachments: pref.DlPostAttachments, + DlGdrive: pref.DlGDrive, + DownloadDirPath: baseDlDirPath, + UseCacheDb: pref.UseCacheDb, + + GdriveClient: a.getGdriveClient(), + + Filters: filters, + Configs: &configs.Config{ + DownloadPath: downloadPath, + FfmpegPath: "", + OverwriteFiles: pref.OverwriteFiles, + LogUrls: pref.DetectOtherLinks, + UserAgent: userAgent, + }, + + SessionCookieId: kemonoSession, + SessionCookies: kemonoSessions, + + Notifier: a.notifier, + + ProgressBarInfo: &progress.ProgressBarInfo{ + MainProgressBar: mainProgBar, + DownloadProgressBars: &[]*progress.DownloadProgressBar{}, + }, }, - - SessionCookieId: kemonoSession, - SessionCookies: kemonoSessions, - - Notifier: a.notifier, - - MainProgBar: mainProgBar, - DownloadProgressBars: &[]*progress.DownloadProgressBar{}, } kemonoDlOptions.SetContext(ctx) err = kemonoDlOptions.ValidateArgs(userAgent) @@ -116,7 +131,7 @@ func (a *App) parseKemonoSettingsMap(ctx context.Context, pref *Preferences) (ke return kemonoDlOptions, mainProgBar, nil } -func (a *App) SubmitKemonoToQueue(inputs []string, prefs *Preferences) error { +func (a *App) SubmitKemonoToQueue(inputs []string, prefs *Preferences, dlFilters Filters) error { if prefs == nil { return errors.New("preferences is nil in SubmitKemonoToQueue()") } @@ -127,7 +142,7 @@ func (a *App) SubmitKemonoToQueue(inputs []string, prefs *Preferences) error { } ctx, cancel := context.WithCancel(context.Background()) - kemonoDlOptions, mainProgBar, err := a.parseKemonoSettingsMap(ctx, prefs) + kemonoDlOptions, mainProgBar, err := a.parseKemonoSettingsMap(ctx, prefs, dlFilters) if err != nil { cancel() return err @@ -137,10 +152,14 @@ func (a *App) SubmitKemonoToQueue(inputs []string, prefs *Preferences) error { website: cdlconsts.KEMONO, inputs: inputsForRef, mainProgBar: mainProgBar, - dlProgressBars: kemonoDlOptions.DownloadProgressBars, + dlProgressBars: kemonoDlOptions.Base.DownloadProgressBars(), taskHandler: func() []error { defer cancel() - errSlice := cdlogic.KemonoDownloadProcess(kemonoDl, kemonoDlOptions) + errSlice := cdlogic.KemonoDownloadProcess( + kemonoDl, + kemonoDlOptions, + constants.CATCH_SIGINT, + ) mainProgBar.MakeLatestSnapshotMain() return errSlice }, diff --git a/backend/app/pixiv.go b/backend/app/pixiv.go index 252ca14..1c5c573 100644 --- a/backend/app/pixiv.go +++ b/backend/app/pixiv.go @@ -10,7 +10,9 @@ import ( "strings" cdlogic "github.com/KJHJason/Cultured-Downloader-Logic" + "github.com/KJHJason/Cultured-Downloader-Logic/api" "github.com/KJHJason/Cultured-Downloader-Logic/api/pixiv" + pixivcommon "github.com/KJHJason/Cultured-Downloader-Logic/api/pixiv/common" pixivmobile "github.com/KJHJason/Cultured-Downloader-Logic/api/pixiv/mobile" "github.com/KJHJason/Cultured-Downloader-Logic/api/pixiv/ugoira" pixivweb "github.com/KJHJason/Cultured-Downloader-Logic/api/pixiv/web" @@ -98,10 +100,19 @@ func validatePixivInputs(inputs []string) (bool, []Input, *pixiv.PixivDl) { input = tag urlForRef = "https://www.pixiv.net/tags/" + tag } else if artworkUrlMatch := cdlconsts.PIXIV_ARTWORK_URL_REGEX.FindStringSubmatch(input); len(artworkUrlMatch) > 0 { - pixivDl.ArtworkIds = append(pixivDl.ArtworkIds, artworkUrlMatch[cdlconsts.PIXIV_ARTWORK_ID_IDX]) + pixivDl.ArtworkIds = append( + pixivDl.ArtworkIds, + artworkUrlMatch[cdlconsts.PIXIV_ARTWORK_ID_IDX], + ) } else if artistUrlMatch := cdlconsts.PIXIV_ARTIST_URL_REGEX.FindStringSubmatch(input); len(artistUrlMatch) > 0 { - pixivDl.ArtistIds = append(pixivDl.ArtistIds, artistUrlMatch[cdlconsts.PIXIV_ARTIST_ID_IDX]) - pixivDl.ArtistPageNums = append(pixivDl.ArtistPageNums, artistUrlMatch[cdlconsts.PIXIV_ARTIST_PAGE_NUM_IDX]) + pixivDl.ArtistIds = append( + pixivDl.ArtistIds, + artistUrlMatch[cdlconsts.PIXIV_ARTIST_ID_IDX], + ) + pixivDl.ArtistPageNums = append( + pixivDl.ArtistPageNums, + artistUrlMatch[cdlconsts.PIXIV_ARTIST_PAGE_NUM_IDX], + ) } else { return false, nil, nil } @@ -130,7 +141,18 @@ func (a *App) ValidatePixivInputs(inputs []string) bool { return valid } -func (a *App) parsePixivMobileSettingsMap(ctx context.Context, pixivRefreshToken string, pref *Preferences) (pixivMobileDlOptions *pixivmobile.PixivMobileDlOptions, mainProgBar *ProgressBar, err error) { +func (a *App) parsePixivMobileSettingsMap( + ctx context.Context, + pixivRefreshToken string, + prefs *Preferences, + dlFilters Filters, + pixivFilters pixivcommon.PixivFilters, +) (pixivMobile *pixivmobile.PixivMobile, mainProgBar *ProgressBar, err error) { + filters, err := dlFilters.ConverToCDLFilters() + if err != nil { + return nil, nil, err + } + if pixivRefreshToken == "" { //lint:ignore ST1005 Captialised for frontend use return nil, nil, errors.New("Pixiv Refresh Token is empty") @@ -148,41 +170,52 @@ func (a *App) parsePixivMobileSettingsMap(ctx context.Context, pixivRefreshToken os.MkdirAll(baseDlDirPath, cdlconsts.DEFAULT_PERMS) mainProgBar.UpdateFolderPath(baseDlDirPath) - pixivMobileDlOptions = &pixivmobile.PixivMobileDlOptions{ - UseCacheDb: pref.UseCacheDb, - BaseDownloadDirPath: baseDlDirPath, - SortOrder: convertSortOrderForBackend(pref.SortOrder), - SearchMode: convertSearchModeForBackend(pref.SearchMode), - SearchAiMode: convertAiSearchModeForBackend(pref.AiSearchMode), - RatingMode: convertRatingModeForBackend(pref.RatingMode), - ArtworkType: convertArtworkTypeForBackend(pref.ArtworkType), + pixivMobile, err = pixivmobile.NewPixivMobile(pixivRefreshToken, 15, ctx) + if err != nil { + return nil, nil, err + } + + if err := pixivMobile.SetPixivFilters(pixivFilters); err != nil { + return nil, nil, err + } + pixivMobile.Base = &api.BaseDl{ + UseCacheDb: prefs.UseCacheDb, + DownloadDirPath: baseDlDirPath, + + Filters: filters, Configs: &configs.Config{ DownloadPath: downloadPath, FfmpegPath: a.GetFfmpegPath(), - OverwriteFiles: pref.OverwriteFiles, - LogUrls: pref.DetectOtherLinks, + OverwriteFiles: prefs.OverwriteFiles, + LogUrls: prefs.DetectOtherLinks, UserAgent: userAgent, }, - // MobileClient is initialised when ValidateArgs is called - - RefreshToken: pixivRefreshToken, - Notifier: a.notifier, - MainProgBar: mainProgBar, - DownloadProgressBars: &[]*progress.DownloadProgressBar{}, + ProgressBarInfo: &progress.ProgressBarInfo{ + MainProgressBar: mainProgBar, + DownloadProgressBars: &[]*progress.DownloadProgressBar{}, + }, } - pixivMobileDlOptions.SetContext(ctx) - err = pixivMobileDlOptions.ValidateArgs() - if err != nil { + if err := pixivMobile.ValidateArgs(); err != nil { return nil, nil, err } - return pixivMobileDlOptions, mainProgBar, nil + return pixivMobile, mainProgBar, nil } -func (a *App) parsePixivSettingsMap(ctx context.Context, pref *Preferences) (pixivWebDlOptions *pixivweb.PixivWebDlOptions, mainProgBar *ProgressBar, err error) { +func (a *App) parsePixivWebSettingsMap( + ctx context.Context, + pref *Preferences, + pixivFilters pixivcommon.PixivFilters, + dlFilters Filters, +) (pixivWebDlOptions *pixivweb.PixivWebDlOptions, mainProgBar *ProgressBar, err error) { + filters, err := dlFilters.ConverToCDLFilters() + if err != nil { + return nil, nil, err + } + pixivSession := a.appData.GetSecuredString(constants.PIXIV_COOKIE_VALUE_KEY) var pixivSessions []*http.Cookie if pixivSession == "" { @@ -205,30 +238,35 @@ func (a *App) parsePixivSettingsMap(ctx context.Context, pref *Preferences) (pix mainProgBar.UpdateFolderPath(baseDlDirPath) pixivWebDlOptions = &pixivweb.PixivWebDlOptions{ - UseCacheDb: pref.UseCacheDb, - BaseDownloadDirPath: baseDlDirPath, - SortOrder: convertSortOrderForBackend(pref.SortOrder), - SearchMode: convertSearchModeForBackend(pref.SearchMode), - SearchAiMode: convertAiSearchModeForBackend(pref.AiSearchMode), - RatingMode: convertRatingModeForBackend(pref.RatingMode), - ArtworkType: convertArtworkTypeForBackend(pref.ArtworkType), - - Configs: &configs.Config{ - DownloadPath: downloadPath, - FfmpegPath: a.GetFfmpegPath(), - OverwriteFiles: pref.OverwriteFiles, - LogUrls: pref.DetectOtherLinks, - UserAgent: userAgent, + Base: &api.BaseDl{ + UseCacheDb: pref.UseCacheDb, + DownloadDirPath: baseDlDirPath, + + Filters: filters, + Configs: &configs.Config{ + DownloadPath: downloadPath, + FfmpegPath: a.GetFfmpegPath(), + OverwriteFiles: pref.OverwriteFiles, + LogUrls: pref.DetectOtherLinks, + UserAgent: userAgent, + }, + + SessionCookieId: pixivSession, + SessionCookies: pixivSessions, + + Notifier: a.notifier, + + ProgressBarInfo: &progress.ProgressBarInfo{ + MainProgressBar: mainProgBar, + DownloadProgressBars: &[]*progress.DownloadProgressBar{}, + }, }, + } - SessionCookieId: pixivSession, - SessionCookies: pixivSessions, - - Notifier: a.notifier, - - MainProgBar: mainProgBar, - DownloadProgressBars: &[]*progress.DownloadProgressBar{}, + if err := pixivWebDlOptions.SetPixivFilters(pixivFilters); err != nil { + return nil, nil, err } + pixivWebDlOptions.SetContext(ctx) err = pixivWebDlOptions.ValidateArgs(userAgent) if err != nil { @@ -245,7 +283,7 @@ func parsePixivUgoiraSettings(pref *Preferences) *ugoira.UgoiraOptions { } } -func (a *App) SubmitPixivToQueue(inputs []string, prefs *Preferences) error { +func (a *App) SubmitPixivToQueue(inputs []string, prefs *Preferences, dlFilters Filters) error { if prefs == nil { return errors.New("preferences is nil in SubmitPixivToQueue()") } @@ -258,38 +296,67 @@ func (a *App) SubmitPixivToQueue(inputs []string, prefs *Preferences) error { ugoiraOptions := parsePixivUgoiraSettings(prefs) ctx, cancel := context.WithCancel(a.ctx) + pixivFilters := pixivcommon.PixivFilters{ + SortOrder: convertSortOrderForBackend(prefs.SortOrder), + SearchMode: convertSearchModeForBackend(prefs.SearchMode), + SearchAiMode: convertAiSearchModeForBackend(prefs.AiSearchMode), + RatingMode: convertRatingModeForBackend(prefs.RatingMode), + ArtworkType: convertArtworkTypeForBackend(prefs.ArtworkType), + } + var mainProgBar *ProgressBar var dlProgBar *[]*progress.DownloadProgressBar var fnToAddToQueue func() []error if pixivMobileRefreshToken := a.appData.GetSecuredString(constants.PIXIV_MOBILE_REFRESH_TOKEN_KEY); pixivMobileRefreshToken != "" { - pixivMobileDlOptions, mainProgBarVal, err := a.parsePixivMobileSettingsMap(ctx, pixivMobileRefreshToken, prefs) + pixivMobile, mainProgBarVal, err := a.parsePixivMobileSettingsMap( + ctx, + pixivMobileRefreshToken, + prefs, + dlFilters, + pixivFilters, + ) if err != nil { cancel() return err } mainProgBar = mainProgBarVal - dlProgBar = pixivMobileDlOptions.DownloadProgressBars + dlProgBar = pixivMobile.Base.DownloadProgressBars() fnToAddToQueue = func() []error { defer cancel() - errSlice := cdlogic.PixivMobileDownloadProcess(pixivDl, pixivMobileDlOptions, ugoiraOptions) + errSlice := cdlogic.PixivMobileDownloadProcess( + pixivDl, + pixivMobile, + ugoiraOptions, + constants.CATCH_SIGINT, + ) mainProgBar.MakeLatestSnapshotMain() return errSlice } } else { - pixivWebDlOptions, mainProgBarVal, err := a.parsePixivSettingsMap(ctx, prefs) + pixivWebDlOptions, mainProgBarVal, err := a.parsePixivWebSettingsMap( + ctx, + prefs, + pixivFilters, + dlFilters, + ) if err != nil { cancel() return err } mainProgBar = mainProgBarVal - dlProgBar = pixivWebDlOptions.DownloadProgressBars + dlProgBar = pixivWebDlOptions.Base.DownloadProgressBars() fnToAddToQueue = func() []error { defer cancel() - errSlice := cdlogic.PixivWebDownloadProcess(pixivDl, pixivWebDlOptions, ugoiraOptions) + errSlice := cdlogic.PixivWebDownloadProcess( + pixivDl, + pixivWebDlOptions, + ugoiraOptions, + constants.CATCH_SIGINT, + ) mainProgBar.MakeLatestSnapshotMain() return errSlice } diff --git a/backend/app/pixiv_preferences.go b/backend/app/pixiv_preferences.go index 15cd7d7..8889a8c 100644 --- a/backend/app/pixiv_preferences.go +++ b/backend/app/pixiv_preferences.go @@ -3,7 +3,7 @@ package app import ( "fmt" - cdlerrors "github.com/KJHJason/Cultured-Downloader-Logic/errors" + "github.com/KJHJason/Cultured-Downloader-Logic/cdlerrors" "github.com/KJHJason/Cultured-Downloader/backend/constants" ) diff --git a/backend/app/pixivfanbox.go b/backend/app/pixivfanbox.go index 9a3d7a9..64f4f03 100644 --- a/backend/app/pixivfanbox.go +++ b/backend/app/pixivfanbox.go @@ -8,6 +8,7 @@ import ( "path/filepath" cdlogic "github.com/KJHJason/Cultured-Downloader-Logic" + "github.com/KJHJason/Cultured-Downloader-Logic/api" "github.com/KJHJason/Cultured-Downloader-Logic/api/pixivfanbox" "github.com/KJHJason/Cultured-Downloader-Logic/configs" cdlconsts "github.com/KJHJason/Cultured-Downloader-Logic/constants" @@ -20,26 +21,34 @@ func validatePixivFanboxUrls(inputs []string) (bool, []Input, *pixivfanbox.Pixiv pixivFanboxDl := pixivfanbox.PixivFanboxDl{} inputsForRef := make([]Input, len(inputs)) for idx, input := range inputs { - var id string - var pageNum string if postUrl1Match := cdlconsts.PIXIV_FANBOX_POST_URL_REGEX1.FindStringSubmatch(input); len(postUrl1Match) > 0 { - id = postUrl1Match[cdlconsts.PIXIV_FANBOX_POST_ID_IDX1] - pixivFanboxDl.PostIds = append(pixivFanboxDl.PostIds, id) + pixivFanboxDl.PostIds = append( + pixivFanboxDl.PostIds, + postUrl1Match[cdlconsts.PIXIV_FANBOX_POST_ID_IDX1], + ) } else if postUrl2Match := cdlconsts.PIXIV_FANBOX_POST_URL_REGEX2.FindStringSubmatch(input); len(postUrl2Match) > 0 { - id = postUrl2Match[cdlconsts.PIXIV_FANBOX_POST_ID_IDX2] - pixivFanboxDl.PostIds = append(pixivFanboxDl.PostIds, id) + pixivFanboxDl.PostIds = append( + pixivFanboxDl.PostIds, + postUrl2Match[cdlconsts.PIXIV_FANBOX_POST_ID_IDX2], + ) } else if creatorUrl2Match := cdlconsts.PIXIV_FANBOX_CREATOR_URL_REGEX2.FindStringSubmatch(input); len(creatorUrl2Match) > 0 { - id = creatorUrl2Match[cdlconsts.PIXIV_FANBOX_CREATOR_ID_IDX2] - pageNum = creatorUrl2Match[cdlconsts.PIXIV_FANBOX_CREATOR_PAGE_NUM_IDX2] - - pixivFanboxDl.CreatorIds = append(pixivFanboxDl.CreatorIds, id) - pixivFanboxDl.CreatorPageNums = append(pixivFanboxDl.CreatorPageNums, pageNum) + pixivFanboxDl.CreatorIds = append( + pixivFanboxDl.CreatorIds, + creatorUrl2Match[cdlconsts.PIXIV_FANBOX_CREATOR_ID_IDX2], + ) + pixivFanboxDl.CreatorPageNums = append( + pixivFanboxDl.CreatorPageNums, + creatorUrl2Match[cdlconsts.PIXIV_FANBOX_CREATOR_PAGE_NUM_IDX2], + ) } else if creatorUrl1Match := cdlconsts.PIXIV_FANBOX_CREATOR_URL_REGEX1.FindStringSubmatch(input); len(creatorUrl1Match) > 0 { - id = creatorUrl1Match[cdlconsts.PIXIV_FANBOX_CREATOR_ID_IDX1] - pageNum = creatorUrl1Match[cdlconsts.PIXIV_FANBOX_CREATOR_PAGE_NUM_IDX1] - - pixivFanboxDl.CreatorIds = append(pixivFanboxDl.CreatorIds, id) - pixivFanboxDl.CreatorPageNums = append(pixivFanboxDl.CreatorPageNums, pageNum) + pixivFanboxDl.CreatorIds = append( + pixivFanboxDl.CreatorIds, + creatorUrl1Match[cdlconsts.PIXIV_FANBOX_CREATOR_ID_IDX1], + ) + pixivFanboxDl.CreatorPageNums = append( + pixivFanboxDl.CreatorPageNums, + creatorUrl1Match[cdlconsts.PIXIV_FANBOX_CREATOR_PAGE_NUM_IDX1], + ) } else { return false, nil, nil } @@ -64,7 +73,16 @@ func (a *App) ValidatePixivFanboxUrls(inputs []string) bool { return valid } -func (a *App) parsePixivFanboxSettingsMap(ctx context.Context, pref *Preferences) (pixivFanboxDlOptions *pixivfanbox.PixivFanboxDlOptions, mainProgBar *ProgressBar, err error) { +func (a *App) parsePixivFanboxSettingsMap( + ctx context.Context, + pref *Preferences, + dlFilters Filters, +) (pixivFanboxDlOptions *pixivfanbox.PixivFanboxDlOptions, mainProgBar *ProgressBar, err error) { + filters, err := dlFilters.ConverToCDLFilters() + if err != nil { + return nil, nil, err + } + pixivFanboxSession := a.appData.GetSecuredString(constants.PIXIV_FANBOX_COOKIE_VALUE_KEY) var pixivFanboxSessions []*http.Cookie if pixivFanboxSession == "" { @@ -87,30 +105,35 @@ func (a *App) parsePixivFanboxSettingsMap(ctx context.Context, pref *Preferences mainProgBar.UpdateFolderPath(baseDlDirPath) pixivFanboxDlOptions = &pixivfanbox.PixivFanboxDlOptions{ - DlThumbnails: pref.DlPostThumbnail, - DlImages: pref.DlPostImages, - DlAttachments: pref.DlPostAttachments, - DlGdrive: pref.DlGDrive, - UseCacheDb: pref.UseCacheDb, - BaseDownloadDirPath: baseDlDirPath, - - GdriveClient: a.GetGdriveClient(), - - Configs: &configs.Config{ - DownloadPath: downloadPath, - FfmpegPath: "", - OverwriteFiles: pref.OverwriteFiles, - LogUrls: pref.DetectOtherLinks, - UserAgent: userAgent, + Base: &api.BaseDl{ + DlThumbnails: pref.DlPostThumbnail, + DlImages: pref.DlPostImages, + DlAttachments: pref.DlPostAttachments, + DlGdrive: pref.DlGDrive, + UseCacheDb: pref.UseCacheDb, + DownloadDirPath: baseDlDirPath, + + GdriveClient: a.getGdriveClient(), + + Filters: filters, + Configs: &configs.Config{ + DownloadPath: downloadPath, + FfmpegPath: "", + OverwriteFiles: pref.OverwriteFiles, + LogUrls: pref.DetectOtherLinks, + UserAgent: userAgent, + }, + + SessionCookieId: pixivFanboxSession, + SessionCookies: pixivFanboxSessions, + + Notifier: a.notifier, + + ProgressBarInfo: &progress.ProgressBarInfo{ + MainProgressBar: mainProgBar, + DownloadProgressBars: &[]*progress.DownloadProgressBar{}, + }, }, - - SessionCookieId: pixivFanboxSession, - SessionCookies: pixivFanboxSessions, - - Notifier: a.notifier, - - MainProgBar: mainProgBar, - DownloadProgressBars: &[]*progress.DownloadProgressBar{}, } pixivFanboxDlOptions.SetContext(ctx) err = pixivFanboxDlOptions.ValidateArgs(userAgent) @@ -120,7 +143,7 @@ func (a *App) parsePixivFanboxSettingsMap(ctx context.Context, pref *Preferences return pixivFanboxDlOptions, mainProgBar, nil } -func (a *App) SubmitPixivFanboxToQueue(inputs []string, prefs *Preferences) error { +func (a *App) SubmitPixivFanboxToQueue(inputs []string, prefs *Preferences, dlFilters Filters) error { if prefs == nil { return errors.New("preferences is nil in SubmitFantiaToQueue()") } @@ -131,7 +154,7 @@ func (a *App) SubmitPixivFanboxToQueue(inputs []string, prefs *Preferences) erro } ctx, cancel := context.WithCancel(a.ctx) - pixivFanboxDlOptions, mainProgBar, err := a.parsePixivFanboxSettingsMap(ctx, prefs) + pixivFanboxDlOptions, mainProgBar, err := a.parsePixivFanboxSettingsMap(ctx, prefs, dlFilters) if err != nil { cancel() return err @@ -141,10 +164,14 @@ func (a *App) SubmitPixivFanboxToQueue(inputs []string, prefs *Preferences) erro website: cdlconsts.PIXIV_FANBOX, inputs: inputsForRef, mainProgBar: mainProgBar, - dlProgressBars: pixivFanboxDlOptions.DownloadProgressBars, + dlProgressBars: pixivFanboxDlOptions.Base.DownloadProgressBars(), taskHandler: func() []error { defer cancel() - errSlice := cdlogic.PixivFanboxDownloadProcess(pixivFanboxDl, pixivFanboxDlOptions) + errSlice := cdlogic.PixivFanboxDownloadProcess( + pixivFanboxDl, + pixivFanboxDlOptions, + constants.CATCH_SIGINT, + ) mainProgBar.MakeLatestSnapshotMain() return errSlice }, diff --git a/backend/app/preferences.go b/backend/app/preferences.go index 1077dcb..d717d9b 100644 --- a/backend/app/preferences.go +++ b/backend/app/preferences.go @@ -2,8 +2,12 @@ package app import ( "fmt" + "regexp" + "time" - cdlerrors "github.com/KJHJason/Cultured-Downloader-Logic/errors" + "github.com/KJHJason/Cultured-Downloader-Logic/cdlerrors" + "github.com/KJHJason/Cultured-Downloader-Logic/filters" + "github.com/KJHJason/Cultured-Downloader-Logic/logger" "github.com/KJHJason/Cultured-Downloader/backend/constants" ) @@ -15,6 +19,87 @@ func (a *App) SetDarkMode(darkMode bool) { a.appData.SetBool(constants.DARK_MODE_KEY, darkMode) } +type Filters struct { + // In bytes + MinFileSize int64 `json:"MinFileSize"` + MaxFileSize *int64 `json:"MaxFileSize"` + + FileExt []string `json:"FileExt"` + + // Unix time (ms) + StartDate *int64 `json:"StartDate"` + EndDate *int64 `json:"EndDate"` + + FileNameRegex string `json:"FileNameRegex"` +} + +func (f *Filters) ConvertUnixToTime() (startDate time.Time, endDate time.Time) { + if f.StartDate == nil { + startDate = time.Time{} + } else { + startDate = time.Unix(*f.StartDate, 0) + } + + if f.EndDate == nil { + endDate = time.Time{} + } else { + endDate = time.Unix(*f.EndDate, 0) + } + return startDate, endDate +} + +func (f *Filters) ConverToCDLFilters() (*filters.Filters, error) { + var maxFileSize int64 + if f.MaxFileSize == nil { + maxFileSize = filters.NO_MAX_FILESIZE + } else { + maxFileSize = *f.MaxFileSize + } + + startDate, endDate := f.ConvertUnixToTime() + + var fileNameFilter *regexp.Regexp + if f.FileNameRegex != "" { + var err error + fileNameFilter, err = regexp.Compile(f.FileNameRegex) + if err != nil { + fmtErr := fmt.Errorf( + "error %d: failed to parse %s into regex => %w", + cdlerrors.INPUT_ERROR, + f.FileNameRegex, + err, + ) + logger.MainLogger.Error(fmtErr.Error()) + return nil, fmtErr + } + } + + dlFilters := filters.Filters{ + MinFileSize: f.MinFileSize, + MaxFileSize: maxFileSize, + + FileExt: f.FileExt, + + StartDate: startDate, + EndDate: endDate, + + FileNameFilter: fileNameFilter, + } + dlFilters.ConvertFileSizeFromMB() + dlFilters.RemoveDuplicateFileExt() + + if err := dlFilters.ValidateArgs(); err != nil { + fmtErr := fmt.Errorf( + "error %d: download filters validations failed => %w", + cdlerrors.INPUT_ERROR, + err, + ) + logger.MainLogger.Error(fmtErr.Error()) + return nil, fmtErr + } + return &dlFilters, nil +} + type Preferences struct { DlPostThumbnail bool `json:"DlPostThumbnail"` DlPostImages bool `json:"DlPostImages"` diff --git a/backend/app/sessions.go b/backend/app/sessions.go index a8358b9..2f75ce5 100644 --- a/backend/app/sessions.go +++ b/backend/app/sessions.go @@ -8,6 +8,10 @@ import ( "path/filepath" "github.com/KJHJason/Cultured-Downloader-Logic/api" + "github.com/KJHJason/Cultured-Downloader-Logic/api/fantia" + pixivcommon "github.com/KJHJason/Cultured-Downloader-Logic/api/pixiv/common" + "github.com/KJHJason/Cultured-Downloader-Logic/api/pixivfanbox" + "github.com/KJHJason/Cultured-Downloader-Logic/cdlerrors" cdlconsts "github.com/KJHJason/Cultured-Downloader-Logic/constants" "github.com/KJHJason/Cultured-Downloader-Logic/database" "github.com/KJHJason/Cultured-Downloader-Logic/httpfuncs" @@ -40,6 +44,34 @@ func getCookieDataKeys(website string) (valKey string, txtKey string, jsonKey st } } +func (a *App) getCaptchaHandler(website, userAgent string, sessionCookies []*http.Cookie) httpfuncs.CaptchaHandler { + switch website { + case constants.FANTIA: + return fantia.NewHttpCaptchaHandler( + fantia.CaptchaOptions{ + Ctx: a.ctx, + UserAgent: userAgent, + SessionCookies: sessionCookies, + Notifier: a.notifier, + }, + ) + case constants.PIXIV_FANBOX: + return pixivfanbox.NewHttpCaptchaHandler( + a.ctx, userAgent, a.notifier, + ) + case constants.PIXIV: + return pixivcommon.NewHttpCaptchaHandler( + a.ctx, cdlconsts.PIXIV_URL, userAgent, a.notifier, + ) + case constants.KEMONO: + return httpfuncs.CaptchaHandler{} + default: + panic( + fmt.Errorf("error %d: invalid website, %q, in getCaptchaHandler", cdlerrors.DEV_ERROR, website), + ) + } +} + func (a *App) UploadCookieFile(website string) error { if err := verifyWebsiteString(website); err != nil { return err @@ -84,8 +116,16 @@ func (a *App) UploadCookieFile(website string) error { return err } - userAgent := a.appData.GetStringWithFallback(constants.USER_AGENT_KEY, httpfuncs.DEFAULT_USER_AGENT) - err = api.VerifyCookies(website, userAgent, cookies) + userAgent := a.appData.GetStringWithFallback( + constants.USER_AGENT_KEY, + httpfuncs.DEFAULT_USER_AGENT, + ) + err = api.VerifyCookies( + website, + userAgent, + cookies, + a.getCaptchaHandler(website, userAgent, cookies), + ) if err != nil { return err } @@ -121,8 +161,17 @@ func (a *App) SetSessionValue(website, session string) error { return err } + cookies := []*http.Cookie{ + api.GetCookie(session, website), + } userAgent := a.appData.GetStringWithFallback(constants.USER_AGENT_KEY, httpfuncs.DEFAULT_USER_AGENT) - if _, err := api.VerifyAndGetCookie(website, session, userAgent); err != nil { + err = api.VerifyCookies( + website, + userAgent, + cookies, + a.getCaptchaHandler(website, userAgent, cookies), + ) + if err != nil { return err } diff --git a/backend/app/shutdown.go b/backend/app/shutdown.go index aad2be0..5dd3e5b 100644 --- a/backend/app/shutdown.go +++ b/backend/app/shutdown.go @@ -11,7 +11,7 @@ func (a *App) Shutdown(ctx context.Context) { a.queueTicker.Stop() if a.downloadQueues.Len() > 0 { for dlQueue := a.downloadQueues.Front(); dlQueue != nil; dlQueue = dlQueue.Next() { - dlQueue.Value.(*DownloadQueue).CancelQueue() + dlQueue.Value.CancelQueue() } } a.notifier.Release() diff --git a/backend/app/startup.go b/backend/app/startup.go index 2576b09..60e08d9 100644 --- a/backend/app/startup.go +++ b/backend/app/startup.go @@ -10,8 +10,8 @@ import ( cdlconst "github.com/KJHJason/Cultured-Downloader-Logic/constants" "github.com/KJHJason/Cultured-Downloader-Logic/database" "github.com/KJHJason/Cultured-Downloader-Logic/iofuncs" - "github.com/KJHJason/Cultured-Downloader-Logic/language" "github.com/KJHJason/Cultured-Downloader-Logic/logger" + "github.com/KJHJason/Cultured-Downloader-Logic/startup" "github.com/KJHJason/Cultured-Downloader/backend/appdata" "github.com/KJHJason/Cultured-Downloader/backend/constants" "github.com/KJHJason/Cultured-Downloader/backend/notifier" @@ -64,17 +64,41 @@ func (a *App) initAppDb() { } } -func (a *App) initLangDb() { - language.InitLangDb(func(msg string) { - _, err := runtime.MessageDialog(a.ctx, runtime.MessageDialogOptions{ +func (a *App) checkPrerequisites() { + panicHandler := func(msg string) { + _, dialogErr := runtime.MessageDialog(a.ctx, runtime.MessageDialogOptions{ Type: runtime.ErrorDialog, - Title: "Error loading language database!", + Title: "Pre-requisites Check Failed!", Message: msg, }) - if err != nil { - logger.MainLogger.Errorf("Error encountered while trying to show error dialog: %v", err) + if dialogErr != nil { + logger.MainLogger.Errorf( + "Error encountered while trying to show pre-requisites check fail msg: %v", + dialogErr, + ) } - }) + logger.MainLogger.Fatalf("Pre-requisites check failed: %s", msg) + } + infoHandler := func(msg string) { + // Start another goroutine to show the message dialog so that + // the frontend can start up properly without crashing the program (nil pointer dereference errors) + // since the backend has yet to initialise as it is waiting for the user to click the dialog. + go func() { + _, dialogErr := runtime.MessageDialog(a.ctx, runtime.MessageDialogOptions{ + Type: runtime.InfoDialog, + Title: "Pre-requisites Check Info", + Message: msg, + }) + if dialogErr != nil { + logger.MainLogger.Errorf( + "Error encountered while trying to show pre-requisites check info msg: %v", + dialogErr, + ) + } + logger.MainLogger.Infof("Pre-requisites check info: %s", msg) + }() + } + startup.CheckPrerequisites(a.ctx, infoHandler, panicHandler) } func (a *App) loadAppData() { @@ -87,7 +111,9 @@ func (a *App) loadAppData() { }) if err != nil { logger.MainLogger.Errorf( - "Error encountered while trying to show error dialog: %v\nOriginal error: %v", err, initialLoadErr) + "Error encountered while trying to show error dialog: %v\nOriginal error: %v", + err, initialLoadErr, + ) } panic("Error loading data from file!") } @@ -105,7 +131,9 @@ func (a *App) getUserSavedDlDirPath() { }) if dialogErr != nil { logger.MainLogger.Errorf( - "Error encountered while trying to show error dialog: %v\nOriginal error: %v", dialogErr, err) + "Error encountered while trying to show error dialog: %v\nOriginal error: %v", + dialogErr, err, + ) } } else if hadToFallback { // try retrieving the old download directory path from config.json (*Cultured-Downloader-CLI) @@ -138,11 +166,11 @@ func (a *App) initQueueTicker() { func (a *App) Startup(ctx context.Context) { a.ctx = ctx a.initAppDb() - a.initLangDb() + a.checkPrerequisites() a.loadAppData() a.getUserSavedDlDirPath() - a.gdriveClient = a.GetGdriveClient() + a.gdriveClient = a.getGdriveClient() a.notifier = notifier.NewNotifier(a.ctx, constants.PROGRAM_NAME) a.lang = a.appData.GetStringWithFallback(constants.LANGUAGE_KEY, cdlconst.EN) a.initQueueTicker() diff --git a/backend/constants/constants.go b/backend/constants/constants.go index aa82e36..85b00c6 100644 --- a/backend/constants/constants.go +++ b/backend/constants/constants.go @@ -6,7 +6,8 @@ import ( const ( PROGRAM_NAME = "Cultured Downloader" - PROGRAM_VER = "5.1.0" + PROGRAM_VER = "5.2.0a" + CATCH_SIGINT = false LOCAL_USER_ASSET_DIR_NAME = "assets" LANGUAGE_KEY = "lang" HASH_OF_MASTER_PASS_HASH_KEY = "master-password-hash" diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 27613d3..56f4f81 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -8,6 +8,7 @@ "name": "cultured-downloader", "version": "0.0.0", "dependencies": { + "date-picker-svelte": "^2.13.0", "flowbite": "^2.4.1", "flowbite-svelte": "^0.46.15", "flowbite-svelte-icons": "^1.4.2", @@ -30,6 +31,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -41,6 +43,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "license": "Apache-2.0", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" @@ -49,17 +52,6 @@ "node": ">=6.0.0" } }, - "node_modules/@babel/runtime": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.6.tgz", - "integrity": "sha512-Ja18XcETdEl5mzzACGd+DKgaGJzPTCow7EglgwTmHdwokzDFYh/MHua6lU6DV/hjF2IaOJ4oX2nqnjG7RElKOw==", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@esbuild/android-arm": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", @@ -68,6 +60,7 @@ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -84,6 +77,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -100,6 +94,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -116,6 +111,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -132,6 +128,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -148,6 +145,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" @@ -164,6 +162,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" @@ -180,6 +179,7 @@ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -196,6 +196,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -212,6 +213,7 @@ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -228,6 +230,7 @@ "loong64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -244,6 +247,7 @@ "mips64el" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -260,6 +264,7 @@ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -276,6 +281,7 @@ "riscv64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -292,6 +298,7 @@ "s390x" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -308,6 +315,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -324,6 +332,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "netbsd" @@ -340,6 +349,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "openbsd" @@ -356,6 +366,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "sunos" @@ -372,6 +383,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -388,6 +400,7 @@ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -404,6 +417,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -413,31 +427,35 @@ } }, "node_modules/@floating-ui/core": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.4.tgz", - "integrity": "sha512-a4IowK4QkXl4SCWTGUR0INAfEOX3wtsYw3rKK5InQEHMGObkR8Xk44qYQD9P4r6HHw0iIfK6GUKECmY8sTkqRA==", + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.8.tgz", + "integrity": "sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==", + "license": "MIT", "dependencies": { - "@floating-ui/utils": "^0.2.4" + "@floating-ui/utils": "^0.2.8" } }, "node_modules/@floating-ui/dom": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.7.tgz", - "integrity": "sha512-wmVfPG5o2xnKDU4jx/m4w5qva9FWHcnZ8BvzEe90D/RpwsJaTAVYPEPdQ8sbr/N8zZTAHlZUTQdqg8ZUbzHmng==", + "version": "1.6.11", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.11.tgz", + "integrity": "sha512-qkMCxSR24v2vGkhYDo/UzxfJN3D4syqSjyuTFz6C7XcpU1pASPRieNI0Kj5VP3/503mOfYiGY891ugBX1GlABQ==", + "license": "MIT", "dependencies": { "@floating-ui/core": "^1.6.0", - "@floating-ui/utils": "^0.2.4" + "@floating-ui/utils": "^0.2.8" } }, "node_modules/@floating-ui/utils": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.4.tgz", - "integrity": "sha512-dWO2pw8hhi+WrXq1YJy2yCuWoL20PddgGaqTgVe4cOS9Q6qklXCiA1tJEqX6BEwRNSCP84/afac9hd4MS+zEUA==" + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.8.tgz", + "integrity": "sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==", + "license": "MIT" }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "license": "ISC", "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", @@ -454,6 +472,7 @@ "version": "0.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "license": "MIT", "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -467,6 +486,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", "engines": { "node": ">=6.0.0" } @@ -475,19 +495,22 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "license": "MIT", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.25", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -497,6 +520,7 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -509,6 +533,7 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "license": "MIT", "engines": { "node": ">= 8" } @@ -517,6 +542,7 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -529,6 +555,7 @@ "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "license": "MIT", "optional": true, "engines": { "node": ">=14" @@ -538,21 +565,21 @@ "version": "2.11.8", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/popperjs" } }, "node_modules/@rollup/plugin-node-resolve": { - "version": "15.2.3", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.2.3.tgz", - "integrity": "sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==", + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.3.0.tgz", + "integrity": "sha512-9eO5McEICxMzJpDW9OnMYSv4Sta3hmt7VtBFz5zR9273suNOydOyq/FrGeGy+KsTRFm8w0SLVhzig2ILFT63Ag==", "license": "MIT", "dependencies": { "@rollup/pluginutils": "^5.0.1", "@types/resolve": "1.20.2", "deepmerge": "^4.2.2", - "is-builtin-module": "^3.2.1", "is-module": "^1.0.0", "resolve": "^1.22.1" }, @@ -569,9 +596,9 @@ } }, "node_modules/@rollup/pluginutils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", - "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.2.tgz", + "integrity": "sha512-/FIdS3PyZ39bjZlwqFnWqCOVnW7o963LtKMwQOD0NhQqw22gSr2YY1afu3FxRip4ZCZNsD5jq6Aaz6QV3D/Njw==", "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", @@ -590,17 +617,12 @@ } } }, - "node_modules/@rollup/pluginutils/node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "license": "MIT" - }, "node_modules/@sveltejs/vite-plugin-svelte": { "version": "2.5.3", "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-2.5.3.tgz", "integrity": "sha512-erhNtXxE5/6xGZz/M9eXsmI7Pxa6MS7jyTy06zN3Ck++ldrppOnOlJwHHTsMC7DHDQdgUp4NAc4cDNQ9eGdB/w==", "dev": true, + "license": "MIT", "dependencies": { "@sveltejs/vite-plugin-svelte-inspector": "^1.0.4", "debug": "^4.3.4", @@ -623,6 +645,7 @@ "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-1.0.4.tgz", "integrity": "sha512-zjiuZ3yydBtwpF3bj0kQNV0YXe+iKE545QGZVTaylW3eAzFr+pJ/cwK8lZEaRp4JtaJXhD5DyWAV4AxLh6DgaQ==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^4.3.4" }, @@ -639,12 +662,14 @@ "version": "5.0.4", "resolved": "https://registry.npmjs.org/@tsconfig/svelte/-/svelte-5.0.4.tgz", "integrity": "sha512-BV9NplVgLmSi4mwKzD8BD/NQ8erOY/nUE/GpgWe2ckx+wIQF5RyRirn/QsSSCPeulVpc3RA/iJt6DpfTIZps0Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "license": "MIT" }, "node_modules/@types/resolve": { "version": "1.20.2", @@ -655,12 +680,14 @@ "node_modules/@yr/monotone-cubic-spline": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@yr/monotone-cubic-spline/-/monotone-cubic-spline-1.0.3.tgz", - "integrity": "sha512-FQXkOta0XBSUPHndIKON2Y9JeQz5ZeMqLYZVVK93FliNBFm7LNMIZmY6FrMEB9XPcDbE2bekMbZD6kzDkxwYjA==" + "integrity": "sha512-FQXkOta0XBSUPHndIKON2Y9JeQz5ZeMqLYZVVK93FliNBFm7LNMIZmY6FrMEB9XPcDbE2bekMbZD6kzDkxwYjA==", + "license": "MIT" }, "node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.13.0.tgz", + "integrity": "sha512-8zSiw54Oxrdym50NlZ9sUusyO1Z1ZchgRLWRaK6c86XJFClyCgFKetdowBg5bKxyp/u+CDBJG4Mpp0m3HLZl9w==", + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -669,9 +696,10 @@ } }, "node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -683,6 +711,7 @@ "version": "6.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -693,12 +722,14 @@ "node_modules/any-promise": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "license": "MIT" }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -708,9 +739,10 @@ } }, "node_modules/apexcharts": { - "version": "3.50.0", - "resolved": "https://registry.npmjs.org/apexcharts/-/apexcharts-3.50.0.tgz", - "integrity": "sha512-LJT1PNAm+NoIU3aogL2P+ViC0y/Cjik54FdzzGV54UNnGQLBoLe5ok3fxsJDTgyez45BGYT8gqNpYKqhdfy5sg==", + "version": "3.54.1", + "resolved": "https://registry.npmjs.org/apexcharts/-/apexcharts-3.54.1.tgz", + "integrity": "sha512-E4et0h/J1U3r3EwS/WlqJCQIbepKbp6wGUmaAwJOMjHUP4Ci0gxanLa7FR3okx6p9coi4st6J853/Cb1NP0vpA==", + "license": "MIT", "dependencies": { "@yr/monotone-cubic-spline": "^1.0.3", "svg.draggable.js": "^2.2.2", @@ -724,20 +756,22 @@ "node_modules/arg": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "license": "MIT" }, "node_modules/aria-query": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", - "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", - "dependencies": { - "dequal": "^2.0.3" + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" } }, "node_modules/autoprefixer": { - "version": "10.4.19", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz", - "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==", + "version": "10.4.20", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", + "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", "dev": true, "funding": [ { @@ -753,12 +787,13 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "browserslist": "^4.23.0", - "caniuse-lite": "^1.0.30001599", + "browserslist": "^4.23.3", + "caniuse-lite": "^1.0.30001646", "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", + "picocolors": "^1.0.1", "postcss-value-parser": "^4.2.0" }, "bin": { @@ -772,22 +807,25 @@ } }, "node_modules/axobject-query": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.0.0.tgz", - "integrity": "sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw==", - "dependencies": { - "dequal": "^2.0.3" + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" } }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" }, "node_modules/binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "license": "MIT", "engines": { "node": ">=8" }, @@ -799,6 +837,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } @@ -807,6 +846,7 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", "dependencies": { "fill-range": "^7.1.1" }, @@ -815,9 +855,9 @@ } }, "node_modules/browserslist": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", - "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.0.tgz", + "integrity": "sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==", "dev": true, "funding": [ { @@ -833,11 +873,12 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001587", - "electron-to-chromium": "^1.4.668", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" + "caniuse-lite": "^1.0.30001663", + "electron-to-chromium": "^1.5.28", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" }, "bin": { "browserslist": "cli.js" @@ -846,30 +887,19 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/builtin-modules": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", - "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/camelcase-css": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "license": "MIT", "engines": { "node": ">= 6" } }, "node_modules/caniuse-lite": { - "version": "1.0.30001621", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001621.tgz", - "integrity": "sha512-+NLXZiviFFKX0fk8Piwv3PfLPGtRqJeq2TiNoUff/qB5KJgwecJTvCXDpmlyP/eCI/GUEmp/h/y5j0yckiiZrA==", + "version": "1.0.30001669", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001669.tgz", + "integrity": "sha512-DlWzFDJqstqtIVx1zeSpIMLjunf5SmwOw0N2Ck/QSQdS8PLS4+9HrLaYei4w8BIAL7IB/UEDu889d8vhCTPA0w==", "dev": true, "funding": [ { @@ -884,12 +914,14 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ] + ], + "license": "CC-BY-4.0" }, "node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "license": "MIT", "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -913,6 +945,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -924,6 +957,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/code-red/-/code-red-1.0.4.tgz", "integrity": "sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==", + "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15", "@types/estree": "^1.0.1", @@ -932,10 +966,20 @@ "periscopic": "^3.1.0" } }, + "node_modules/code-red/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, "node_modules/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==", + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -946,12 +990,14 @@ "node_modules/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==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" }, "node_modules/commander": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "license": "MIT", "engines": { "node": ">= 6" } @@ -960,6 +1006,7 @@ "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -973,6 +1020,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "license": "MIT", "dependencies": { "mdn-data": "2.0.30", "source-map-js": "^1.0.1" @@ -985,6 +1033,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "license": "MIT", "bin": { "cssesc": "bin/cssesc" }, @@ -992,13 +1041,23 @@ "node": ">=4" } }, + "node_modules/date-picker-svelte": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/date-picker-svelte/-/date-picker-svelte-2.13.0.tgz", + "integrity": "sha512-A0MMma1uv+/sL8MwgGuEPv/UJnhR6CmWg5aR8XhYeAX/I8+RQmQh+jpwIL0Z3/g4CGo9OhNZn+VicHpvnNCCtA==", + "license": "MIT", + "peerDependencies": { + "svelte": "^3.24.0 || ^4.0.0" + } + }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", "dev": true, + "license": "MIT", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -1013,43 +1072,41 @@ "version": "4.3.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "engines": { - "node": ">=6" - } - }, "node_modules/didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "license": "Apache-2.0" }, "node_modules/dlv": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "license": "MIT" }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.4.783", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.783.tgz", - "integrity": "sha512-bT0jEz/Xz1fahQpbZ1D7LgmPYZ3iHVY39NcWWro1+hA2IvjiPeaXtfSqrQ+nXjApMvQRE2ASt1itSLRrebHMRQ==", - "dev": true + "version": "1.5.41", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.41.tgz", + "integrity": "sha512-dfdv/2xNjX0P8Vzme4cfzHqnPm5xsZXwsolTYr0eyW18IUmNyG08vL+fttvinTfhKfIKdRoqkDIC9e9iWQCNYQ==", + "dev": true, + "license": "ISC" }, "node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "license": "MIT" }, "node_modules/esbuild": { "version": "0.18.20", @@ -1057,6 +1114,7 @@ "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", "dev": true, "hasInstallScript": true, + "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, @@ -1089,26 +1147,26 @@ } }, "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dependencies": { - "@types/estree": "^1.0.0" - } + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" }, "node_modules/fast-glob": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -1124,6 +1182,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -1135,6 +1194,7 @@ "version": "1.17.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "license": "ISC", "dependencies": { "reusify": "^1.0.4" } @@ -1143,6 +1203,7 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -1151,9 +1212,9 @@ } }, "node_modules/flowbite": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/flowbite/-/flowbite-2.4.1.tgz", - "integrity": "sha512-I++vDsSOOlzHNuxY2OcFMNVC4CNzpPU2K14YHJ81cYrANXdzgizqniMB/1KQ219x8fqw+S0msY9Q45ZSXDqAPw==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/flowbite/-/flowbite-2.5.2.tgz", + "integrity": "sha512-kwFD3n8/YW4EG8GlY3Od9IoKND97kitO+/ejISHSqpn3vw2i5K/+ZI8Jm2V+KC4fGdnfi0XZ+TzYqQb4Q1LshA==", "license": "MIT", "dependencies": { "@popperjs/core": "^2.9.3", @@ -1172,14 +1233,15 @@ } }, "node_modules/flowbite-svelte": { - "version": "0.46.15", - "resolved": "https://registry.npmjs.org/flowbite-svelte/-/flowbite-svelte-0.46.15.tgz", - "integrity": "sha512-xWhyLDez/gafTAmQayPMPKmWj1BAoq80SoA48yHZ12Wk3Vu3hFrELLUZf0UksxnjQL9hMOKRUlYl3/IH6pHwnQ==", + "version": "0.46.23", + "resolved": "https://registry.npmjs.org/flowbite-svelte/-/flowbite-svelte-0.46.23.tgz", + "integrity": "sha512-saCqG/4cOm26+k5ECJ++AyvuyMqAHuIExPaO9ull0gvgAE3kLSsCAKc/bAeJPmMoYnm6dUDpvGKgSq73W9YTUQ==", + "license": "MIT", "dependencies": { - "@floating-ui/dom": "^1.6.7", - "apexcharts": "^3.49.2", - "flowbite": "^2.4.1", - "tailwind-merge": "^2.3.0" + "@floating-ui/dom": "^1.6.11", + "apexcharts": "^3.54.0", + "flowbite": "^2.5.2", + "tailwind-merge": "^2.5.3" }, "engines": { "node": ">=18.0.0", @@ -1190,9 +1252,10 @@ } }, "node_modules/flowbite-svelte-icons": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/flowbite-svelte-icons/-/flowbite-svelte-icons-1.6.1.tgz", - "integrity": "sha512-Kw/7BzA6fqlFq7tBNudwX0KVU4cbyyXcMcgHTraMwGBtvBQan0RKMbvWwqm4JZNvLGAvRv1BM2EF7rzo/oam1Q==", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/flowbite-svelte-icons/-/flowbite-svelte-icons-1.6.2.tgz", + "integrity": "sha512-zgG1rbFC+rxHcjBYlktTGdFlT2l1KX3I30YKiUSxjz/OXXbWP/qHAl6LTDtKhsT/2bRCb/g3CVBZFdmSkTeOdw==", + "license": "MIT", "peerDependencies": { "svelte": "^3.54.0 || ^4.0.0 || ^5.0.0", "tailwind-merge": "^2.0.0", @@ -1200,9 +1263,10 @@ } }, "node_modules/foreground-child": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "license": "ISC", "dependencies": { "cross-spawn": "^7.0.0", "signal-exit": "^4.0.1" @@ -1219,6 +1283,7 @@ "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", "dev": true, + "license": "MIT", "engines": { "node": "*" }, @@ -1232,6 +1297,7 @@ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "hasInstallScript": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -1244,27 +1310,27 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/glob": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.1.tgz", - "integrity": "sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw==", + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, "funding": { "url": "https://github.com/sponsors/isaacs" } @@ -1273,6 +1339,7 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "license": "ISC", "dependencies": { "is-glob": "^4.0.3" }, @@ -1284,6 +1351,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -1295,6 +1363,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "license": "MIT", "dependencies": { "binary-extensions": "^2.0.0" }, @@ -1302,27 +1371,16 @@ "node": ">=8" } }, - "node_modules/is-builtin-module": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", - "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", + "node_modules/is-core-module": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", "license": "MIT", "dependencies": { - "builtin-modules": "^3.3.0" + "hasown": "^2.0.2" }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dependencies": { - "hasown": "^2.0.0" + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -1332,6 +1390,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -1340,6 +1399,7 @@ "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==", + "license": "MIT", "engines": { "node": ">=8" } @@ -1348,6 +1408,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -1365,6 +1426,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", "engines": { "node": ">=0.12.0" } @@ -1373,6 +1435,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz", "integrity": "sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==", + "license": "MIT", "dependencies": { "@types/estree": "*" } @@ -1380,18 +1443,17 @@ "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" }, "node_modules/jackspeak": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.1.2.tgz", - "integrity": "sha512-kWmLKn2tRtfYMF/BakihVVRzBKOxz4gJMiL2Rj91WnAB5TPZumSH99R/Yf1qE1u4uRimvCSJfm6hnxohXeEXjQ==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" }, - "engines": { - "node": ">=14" - }, "funding": { "url": "https://github.com/sponsors/isaacs" }, @@ -1400,9 +1462,10 @@ } }, "node_modules/jiti": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", - "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", + "version": "1.21.6", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", + "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", + "license": "MIT", "bin": { "jiti": "bin/jiti.js" } @@ -1412,6 +1475,7 @@ "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -1420,6 +1484,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "license": "MIT", "engines": { "node": ">=10" } @@ -1427,46 +1492,50 @@ "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" }, "node_modules/locate-character": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz", - "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==" + "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==", + "license": "MIT" }, "node_modules/lru-cache": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", - "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", - "engines": { - "node": "14 || >=16.14" - } + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" }, "node_modules/magic-string": { - "version": "0.30.10", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", - "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==", + "version": "0.30.12", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.12.tgz", + "integrity": "sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==", + "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" + "@jridgewell/sourcemap-codec": "^1.5.0" } }, "node_modules/mdn-data": { "version": "2.0.30", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", - "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==" + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "license": "CC0-1.0" }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "license": "MIT", "engines": { "node": ">= 8" } }, "node_modules/micromatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", - "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -1479,14 +1548,16 @@ "version": "1.4.4", "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz", "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==", + "license": "MIT", "bin": { "mini-svg-data-uri": "cli.js" } }, "node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -1501,20 +1572,23 @@ "version": "7.1.2", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" } }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" }, "node_modules/mz": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "license": "MIT", "dependencies": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", @@ -1531,6 +1605,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.js" }, @@ -1539,15 +1614,17 @@ } }, "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", - "dev": true + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", + "dev": true, + "license": "MIT" }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -1557,6 +1634,7 @@ "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -1565,6 +1643,7 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -1573,14 +1652,22 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "license": "MIT", "engines": { "node": ">= 6" } }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "license": "BlueOak-1.0.0" + }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", "engines": { "node": ">=8" } @@ -1588,12 +1675,14 @@ "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" }, "node_modules/path-scurry": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "license": "BlueOak-1.0.0", "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" @@ -1609,21 +1698,33 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz", "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==", + "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^3.0.0", "is-reference": "^3.0.0" } }, + "node_modules/periscopic/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", "engines": { "node": ">=8.6" }, @@ -1635,6 +1736,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -1643,14 +1745,15 @@ "version": "4.0.6", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "license": "MIT", "engines": { "node": ">= 6" } }, "node_modules/postcss": { - "version": "8.4.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz", - "integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==", + "version": "8.4.47", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", + "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", "funding": [ { "type": "opencollective", @@ -1665,10 +1768,11 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.0.1", - "source-map-js": "^1.2.0" + "picocolors": "^1.1.0", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12 || >=14" @@ -1678,6 +1782,7 @@ "version": "15.1.0", "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.0.0", "read-cache": "^1.0.0", @@ -1694,6 +1799,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "license": "MIT", "dependencies": { "camelcase-css": "^2.0.1" }, @@ -1722,6 +1828,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "lilconfig": "^3.0.0", "yaml": "^2.3.4" @@ -1743,9 +1850,10 @@ } }, "node_modules/postcss-load-config/node_modules/lilconfig": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz", - "integrity": "sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", + "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", + "license": "MIT", "engines": { "node": ">=14" }, @@ -1754,27 +1862,35 @@ } }, "node_modules/postcss-nested": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", - "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", "dependencies": { - "postcss-selector-parser": "^6.0.11" + "postcss-selector-parser": "^6.1.1" }, "engines": { "node": ">=12.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, "peerDependencies": { "postcss": "^8.2.14" } }, "node_modules/postcss-selector-parser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.0.tgz", - "integrity": "sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "license": "MIT", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -1786,7 +1902,8 @@ "node_modules/postcss-value-parser": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "license": "MIT" }, "node_modules/postcss/node_modules/nanoid": { "version": "3.3.7", @@ -1798,6 +1915,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -1822,12 +1940,14 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "license": "MIT", "dependencies": { "pify": "^2.3.0" } @@ -1836,6 +1956,7 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "license": "MIT", "dependencies": { "picomatch": "^2.2.1" }, @@ -1843,15 +1964,11 @@ "node": ">=8.10.0" } }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" - }, "node_modules/resolve": { "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "license": "MIT", "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -1868,16 +1985,18 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "license": "MIT", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" } }, "node_modules/rollup": { - "version": "3.29.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", - "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", + "version": "3.29.5", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.5.tgz", + "integrity": "sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w==", "devOptional": true, + "license": "MIT", "bin": { "rollup": "dist/bin/rollup" }, @@ -1907,6 +2026,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } @@ -1915,6 +2035,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -1926,6 +2047,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", "engines": { "node": ">=8" } @@ -1934,6 +2056,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", "engines": { "node": ">=14" }, @@ -1942,9 +2065,10 @@ } }, "node_modules/source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -1953,6 +2077,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "license": "MIT", "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -1970,6 +2095,7 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -1983,6 +2109,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", "engines": { "node": ">=8" } @@ -1990,12 +2117,14 @@ "node_modules/string-width-cjs/node_modules/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==" + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" }, "node_modules/string-width-cjs/node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -2007,6 +2136,7 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" }, @@ -2022,6 +2152,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -2033,6 +2164,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", "engines": { "node": ">=8" } @@ -2041,6 +2173,7 @@ "version": "3.35.0", "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", @@ -2062,6 +2195,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -2070,9 +2204,9 @@ } }, "node_modules/svelte": { - "version": "4.2.18", - "resolved": "https://registry.npmjs.org/svelte/-/svelte-4.2.18.tgz", - "integrity": "sha512-d0FdzYIiAePqRJEb90WlJDkjUEx42xhivxN8muUBmfZnP+tzUgz12DJ2hRJi8sIHCME7jeK1PTMgKPSfTd8JrA==", + "version": "4.2.19", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-4.2.19.tgz", + "integrity": "sha512-IY1rnGr6izd10B0A8LqsBfmlT5OILVuZ7XsI0vdGPEvuonFV7NYEUK4dAkm9Zg2q0Um92kYjTpS1CAP3Nh/KWw==", "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.1", @@ -2099,6 +2233,7 @@ "resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.15.3.tgz", "integrity": "sha512-41snaPswvSf8TJUhlkoJBekRrABDXDMdpNpT2tfHIv4JuhgvHqLMhEPGtaQn0BmbNSTkuz2Ed20DF2eHw0SmBQ==", "dev": true, + "license": "ISC", "engines": { "node": "^12.20 || ^14.13.1 || >= 16" }, @@ -2106,10 +2241,20 @@ "svelte": "^3.19.0 || ^4.0.0" } }, + "node_modules/svelte/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, "node_modules/svg.draggable.js": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/svg.draggable.js/-/svg.draggable.js-2.2.2.tgz", "integrity": "sha512-JzNHBc2fLQMzYCZ90KZHN2ohXL0BQJGQimK1kGk6AvSeibuKcIdDX9Kr0dT9+UJ5O8nYA0RB839Lhvk4CY4MZw==", + "license": "MIT", "dependencies": { "svg.js": "^2.0.1" }, @@ -2121,6 +2266,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/svg.easing.js/-/svg.easing.js-2.0.0.tgz", "integrity": "sha512-//ctPdJMGy22YoYGV+3HEfHbm6/69LJUTAqI2/5qBvaNHZ9uUFVC82B0Pl299HzgH13rKrBgi4+XyXXyVWWthA==", + "license": "MIT", "dependencies": { "svg.js": ">=2.3.x" }, @@ -2132,6 +2278,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/svg.filter.js/-/svg.filter.js-2.0.2.tgz", "integrity": "sha512-xkGBwU+dKBzqg5PtilaTb0EYPqPfJ9Q6saVldX+5vCRy31P6TlRCP3U9NxH3HEufkKkpNgdTLBJnmhDHeTqAkw==", + "license": "MIT", "dependencies": { "svg.js": "^2.2.5" }, @@ -2142,12 +2289,14 @@ "node_modules/svg.js": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/svg.js/-/svg.js-2.7.1.tgz", - "integrity": "sha512-ycbxpizEQktk3FYvn/8BH+6/EuWXg7ZpQREJvgacqn46gIddG24tNNe4Son6omdXCnSOaApnpZw6MPCBA1dODA==" + "integrity": "sha512-ycbxpizEQktk3FYvn/8BH+6/EuWXg7ZpQREJvgacqn46gIddG24tNNe4Son6omdXCnSOaApnpZw6MPCBA1dODA==", + "license": "MIT" }, "node_modules/svg.pathmorphing.js": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/svg.pathmorphing.js/-/svg.pathmorphing.js-0.1.3.tgz", "integrity": "sha512-49HWI9X4XQR/JG1qXkSDV8xViuTLIWm/B/7YuQELV5KMOPtXjiwH4XPJvr/ghEDibmLQ9Oc22dpWpG0vUDDNww==", + "license": "MIT", "dependencies": { "svg.js": "^2.4.0" }, @@ -2159,6 +2308,7 @@ "version": "1.4.3", "resolved": "https://registry.npmjs.org/svg.resize.js/-/svg.resize.js-1.4.3.tgz", "integrity": "sha512-9k5sXJuPKp+mVzXNvxz7U0uC9oVMQrrf7cFsETznzUDDm0x8+77dtZkWdMfRlmbkEEYvUn9btKuZ3n41oNA+uw==", + "license": "MIT", "dependencies": { "svg.js": "^2.6.5", "svg.select.js": "^2.1.2" @@ -2171,6 +2321,7 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/svg.select.js/-/svg.select.js-2.1.2.tgz", "integrity": "sha512-tH6ABEyJsAOVAhwcCjF8mw4crjXSI1aa7j2VQR8ZuJ37H2MBUbyeqYr5nEO7sSN3cy9AR9DUwNg0t/962HlDbQ==", + "license": "MIT", "dependencies": { "svg.js": "^2.2.5" }, @@ -2182,6 +2333,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/svg.select.js/-/svg.select.js-3.0.1.tgz", "integrity": "sha512-h5IS/hKkuVCbKSieR9uQCj9w+zLHoPh+ce19bBYyqF53g6mnPB8sAtIbe1s9dh2S2fCmYX2xel1Ln3PJBbK4kw==", + "license": "MIT", "dependencies": { "svg.js": "^2.6.5" }, @@ -2190,30 +2342,30 @@ } }, "node_modules/sweetalert2": { - "version": "11.12.3", - "resolved": "https://registry.npmjs.org/sweetalert2/-/sweetalert2-11.12.3.tgz", - "integrity": "sha512-tgGJSgfSV/xK113JEvhjwqKAuBYLXsZf0z+tGlHKQNnsLMi4eSNuzn9tt5hUdvjOVTLSPDgo0Lc+tnjy9Uj7Og==", + "version": "11.14.4", + "resolved": "https://registry.npmjs.org/sweetalert2/-/sweetalert2-11.14.4.tgz", + "integrity": "sha512-8QMzjxCuinwm18EK5AtYvuhP+lRMRxTWVXy8om9wGlULsXSI4TD29kyih3VYrSXMMBlD4EShFvNC7slhTC7j0w==", + "license": "MIT", "funding": { "type": "individual", "url": "https://github.com/sponsors/limonte" } }, "node_modules/tailwind-merge": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.3.0.tgz", - "integrity": "sha512-vkYrLpIP+lgR0tQCG6AP7zZXCTLc1Lnv/CCRT3BqJ9CZ3ui2++GPaGb1x/ILsINIMSYqqvrpqjUFsMNLlW99EA==", - "dependencies": { - "@babel/runtime": "^7.24.1" - }, + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.5.4.tgz", + "integrity": "sha512-0q8cfZHMu9nuYP/b5Shb7Y7Sh1B7Nnl5GqNr1U+n2p6+mybvRtayrQ+0042Z5byvTA8ihjlP8Odo8/VnHbZu4Q==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/dcastil" } }, "node_modules/tailwindcss": { - "version": "3.4.6", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.6.tgz", - "integrity": "sha512-1uRHzPB+Vzu57ocybfZ4jh5Q3SdlH7XW23J5sQoM9LhE9eIOlzxer/3XPSsycvih3rboRsvt0QCmzSrqyOYUIA==", + "version": "3.4.14", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.14.tgz", + "integrity": "sha512-IcSvOcTRcUtQQ7ILQL5quRDg7Xs93PdJEk1ZLbhhvJc7uj/OAhYOnruEiwnGgBvUtaUAJ8/mhSw1o8L2jCiENA==", + "license": "MIT", "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -2250,6 +2402,7 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "license": "MIT", "dependencies": { "any-promise": "^1.0.0" } @@ -2258,6 +2411,7 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "license": "MIT", "dependencies": { "thenify": ">= 3.1.0 < 4" }, @@ -2269,6 +2423,7 @@ "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==", + "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -2279,19 +2434,22 @@ "node_modules/ts-interface-checker": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "license": "Apache-2.0" }, "node_modules/tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", - "dev": true + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.0.tgz", + "integrity": "sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==", + "dev": true, + "license": "0BSD" }, "node_modules/typescript": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.3.tgz", - "integrity": "sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==", + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", + "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", "dev": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -2301,9 +2459,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", - "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", "dev": true, "funding": [ { @@ -2319,9 +2477,10 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "escalade": "^3.1.2", - "picocolors": "^1.0.1" + "escalade": "^3.2.0", + "picocolors": "^1.1.0" }, "bin": { "update-browserslist-db": "cli.js" @@ -2333,13 +2492,15 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" }, "node_modules/vite": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.3.tgz", - "integrity": "sha512-kQL23kMeX92v3ph7IauVkXkikdDRsYMGTVl5KY2E9OY4ONLvkHf04MDTbnfo6NKxZiDLWzVpP5oTa8hQD8U3dg==", + "version": "4.5.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.5.tgz", + "integrity": "sha512-ifW3Lb2sMdX+WU91s3R0FyQlAyLxOzCSCP37ujw0+r5POeHPwe6udWVIElKQq8gk3t7b8rkmvqC6IHBpCff4GQ==", "dev": true, + "license": "MIT", "dependencies": { "esbuild": "^0.18.10", "postcss": "^8.4.27", @@ -2395,6 +2556,7 @@ "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-0.2.5.tgz", "integrity": "sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==", "dev": true, + "license": "MIT", "peerDependencies": { "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" }, @@ -2408,6 +2570,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -2422,6 +2585,7 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "license": "MIT", "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", @@ -2439,6 +2603,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -2455,6 +2620,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", "engines": { "node": ">=8" } @@ -2463,6 +2629,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -2476,12 +2643,14 @@ "node_modules/wrap-ansi-cjs/node_modules/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==" + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" }, "node_modules/wrap-ansi-cjs/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -2495,6 +2664,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -2503,9 +2673,10 @@ } }, "node_modules/yaml": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.2.tgz", - "integrity": "sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.0.tgz", + "integrity": "sha512-a6ae//JvKDEra2kdi1qzCyrJW/WZCgFi8ydDV+eXExl95t+5R+ijnqHJbz9tmMh8FUjx3iv2fCQ4dclAQlO2UQ==", + "license": "ISC", "bin": { "yaml": "bin.mjs" }, diff --git a/frontend/package.json b/frontend/package.json index 84767a8..dc6d1bd 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -17,6 +17,7 @@ "vite": "^4.4.9" }, "dependencies": { + "date-picker-svelte": "^2.13.0", "flowbite": "^2.4.1", "flowbite-svelte": "^0.46.15", "flowbite-svelte-icons": "^1.4.2", diff --git a/frontend/package.json.md5 b/frontend/package.json.md5 index 248d210..f7813c7 100644 --- a/frontend/package.json.md5 +++ b/frontend/package.json.md5 @@ -1 +1 @@ -2ed03b44cb582752e96fab0f16e38509 \ No newline at end of file +d5bc053c6c24bdbe5a480e8d8d83fa1b \ No newline at end of file diff --git a/frontend/src/lib/DownloadQueues.svelte b/frontend/src/lib/DownloadQueues.svelte index cc052b4..fb8128e 100644 --- a/frontend/src/lib/DownloadQueues.svelte +++ b/frontend/src/lib/DownloadQueues.svelte @@ -90,7 +90,7 @@ {#if downloadQueues.length === 0} - + diff --git a/frontend/src/lib/Fantia.svelte b/frontend/src/lib/Fantia.svelte index dfd9cfc..6ab8a68 100644 --- a/frontend/src/lib/Fantia.svelte +++ b/frontend/src/lib/Fantia.svelte @@ -11,8 +11,8 @@ return await ValidateFantiaUrls(urls); }; - const addToQueueFn = async (inputs: string[], options: app.Preferences): Promise => { - await SubmitFantiaToQueue(inputs, options); + const addToQueueFn = async (inputs: string[], options: app.Preferences, filters: app.Filters): Promise => { + await SubmitFantiaToQueue(inputs, options, filters); }; const checkUrlHasPageNumFilter = (inputUrl: string): boolean => { diff --git a/frontend/src/lib/Kemono.svelte b/frontend/src/lib/Kemono.svelte index eea1947..3ebdf42 100644 --- a/frontend/src/lib/Kemono.svelte +++ b/frontend/src/lib/Kemono.svelte @@ -11,8 +11,8 @@ return await ValidateKemonoInputs(urls); }; - const addToQueueFn = async (inputs: string[], options: app.Preferences): Promise => { - await SubmitKemonoToQueue(inputs, options); + const addToQueueFn = async (inputs: string[], options: app.Preferences, filters: app.Filters): Promise => { + await SubmitKemonoToQueue(inputs, options, filters); }; const creatorUrlRegex = /^https:\/\/kemono.su\/(?:patreon|fanbox|gumroad|subscribestar|dlsite|fantia|boosty)\/user\/\d+$/; diff --git a/frontend/src/lib/Pixiv.svelte b/frontend/src/lib/Pixiv.svelte index 19c6524..882c225 100644 --- a/frontend/src/lib/Pixiv.svelte +++ b/frontend/src/lib/Pixiv.svelte @@ -11,8 +11,8 @@ return await ValidatePixivInputs(urls); }; - const addToQueueFn = async (inputs: string[], options: app.Preferences): Promise => { - await SubmitPixivToQueue(inputs, options); + const addToQueueFn = async (inputs: string[], options: app.Preferences, filters: app.Filters): Promise => { + await SubmitPixivToQueue(inputs, options, filters); }; const checkUrlHasPageNumFilter = (inputUrl: string): boolean => { diff --git a/frontend/src/lib/PixivFanbox.svelte b/frontend/src/lib/PixivFanbox.svelte index 49de3ce..9252996 100644 --- a/frontend/src/lib/PixivFanbox.svelte +++ b/frontend/src/lib/PixivFanbox.svelte @@ -11,8 +11,8 @@ return await ValidatePixivFanboxUrls(urls); }; - const addToQueueFn = async (inputs: string[], options: app.Preferences): Promise => { - await SubmitPixivFanboxToQueue(inputs, options); + const addToQueueFn = async (inputs: string[], options: app.Preferences, filters: app.Filters): Promise => { + await SubmitPixivFanboxToQueue(inputs, options, filters); }; const pixivCreatorRegex1 = /^https:\/\/[\w&.-]+.fanbox.cc(\/(posts)?)?$/; diff --git a/frontend/src/lib/PlatformBase.svelte b/frontend/src/lib/PlatformBase.svelte index 8204d41..2e2a73f 100644 --- a/frontend/src/lib/PlatformBase.svelte +++ b/frontend/src/lib/PlatformBase.svelte @@ -7,9 +7,10 @@ import GeneralSettings from "./settings/GeneralSettings.svelte"; import MergedSettings from "./settings/MergedSettings.svelte"; import { GetPreferences } from "../scripts/wailsjs/go/app/App"; - import type { app } from "../scripts/wailsjs/go/models"; + import { app } from "../scripts/wailsjs/go/models"; import Translate from "./common/Translate.svelte"; import { translateText } from "../scripts/language"; + import FilterSettings from "./settings/FilterSettings.svelte"; let pixivArtworkType: number; let pixivRating: number; @@ -18,6 +19,13 @@ let pixivSortOrder: number; let pixivUgoiraFormat: number; + // Filters + let minFileSize: number = 0; + let maxFileSize: number | null = Infinity; + let postDateRange: Record = { from: null, to: null }; + let fileExtensions: string = ""; + let filenameRegex: string = ""; + let translatedPageNoPlaceholder: string; export let platformTitle: string = ""; @@ -25,7 +33,7 @@ export let inputPlaceholder: string; export let urlValidationFn: (urls: string | string[]) => Promise; export let checkUrlHasPageNumFilter: (inputUrl: string) => boolean; - export let addToQueueFn: (inputs: string[], downloadSettings: app.Preferences) => Promise; + export let addToQueueFn: (inputs: string[], downloadSettings: app.Preferences, filters: app.Filters) => Promise; if (platformTitle === "") { platformTitle = platformName; @@ -208,10 +216,18 @@ return downloadPreferences; }; + const startMoreThanEndDates = await translateText("Start Date cannot be newer than your specified End Date!"); + const addToQueueForm = document.getElementById("add-to-queue-form") as HTMLFormElement; addToQueueForm.addEventListener("submit", async (e: Event): Promise => { e.preventDefault(); + const dlFilterSettingsForm = document.getElementById("dl-filter-settings-form") as HTMLFormElement; + if (!dlFilterSettingsForm.checkValidity()) { + dlFilterSettingsForm.reportValidity(); + return; + } + const textareaInput = textareaEl.value; if (textareaInput === "") { helperEl.textContent = inputErrNoUrl; @@ -254,12 +270,46 @@ return; } + // Filter File Extensions to non-empty trimmed values + const splittedFileExtensions = fileExtensions + .split(",") + .reduce((accumulator, ext) => { + const trimmed = ext.trim(); + if (trimmed) { + accumulator.push(trimmed); + } + return accumulator; + }, [] as string[]); + const dlFilters: app.Filters = { + MinFileSize: minFileSize, + FileExt: splittedFileExtensions, + FileNameRegex: filenameRegex, + }; + if (postDateRange.from !== null) { + dlFilters.StartDate = postDateRange.from.getTime(); + } + if (postDateRange.to !== null) { + dlFilters.EndDate = postDateRange.to.getTime(); + } + if (maxFileSize !== null) { + dlFilters.MaxFileSize = maxFileSize; + } + + if (dlFilters.StartDate !== undefined && dlFilters.EndDate !== undefined && dlFilters.StartDate > dlFilters.EndDate) { + swal.fire({ + title: inputErr, + text: startMoreThanEndDates, + icon: "error", + }) + return; + } + pleaseWaitSwal.fire({ title: addingToQueue, text: queuePleaseWait, }) try { - await addToQueueFn(inputs, downloadPreferences); + await addToQueueFn(inputs, downloadPreferences, dlFilters); swal.fire({ timer: 2000, title: addedToQueue, @@ -289,7 +339,7 @@