From 1199e9752217644f5fe2965e391c367ec02a5bc2 Mon Sep 17 00:00:00 2001 From: xxxAlvaDevxxx Date: Sun, 2 Jun 2024 22:03:21 -0400 Subject: [PATCH] feat: huskybc with golang code --- bun.lockb | Bin 186558 -> 0 bytes go.mod | 5 + go.sum | 2 + internal/config/options.go | 38 + internal/constants/main.go | 44 + internal/handlers/handlers_options.go | 46 + internal/user-input/add-commitlint.go | 5 + internal/user-input/package-managers.go | 46 + internal/user-input/publishToNpm.go | 5 + internal/user-input/userinput_test.go | 84 + internal/user-input/utils.go | 29 + internal/utils/commitlint.go | 81 + internal/utils/dependencies.go | 58 + internal/utils/husky-library.go | 75 + internal/utils/npm.go | 78 + internal/utils/package-json.go | 63 + internal/utils/user-os.go | 45 + internal/utils/utils.go | 84 + main.go | 9 + package.json | 13 - pnpm-lock.yaml | 3370 +++++++++++++++++++++++ src/config/cli.ts | 9 - src/config/options.ts | 27 - src/constants/commitlint.ts | 8 - src/constants/dependencies.ts | 8 - src/constants/encoding.ts | 1 - src/constants/errors.ts | 32 - src/constants/github.ts | 2 - src/constants/huskybc.ts | 3 - src/constants/lint-staged.ts | 8 - src/constants/package-mangers.ts | 1 - src/constants/regex.ts | 1 - src/constants/version.ts | 3 - src/controllers/handlers-options.ts | 73 - src/index.ts | 15 - src/types/message.d.ts | 1 - src/types/package-json.d.ts | 14 - src/types/package-manger.d.ts | 3 - src/types/version.d.ts | 1 - src/user-input/add-commitlint.ts | 28 - src/user-input/npm.ts | 28 - src/user-input/package-managers.ts | 34 - src/utils/commitlint.ts | 120 - src/utils/console.ts | 20 - src/utils/dependencies.ts | 50 - src/utils/errors.ts | 5 - src/utils/husky-library.ts | 131 - src/utils/npm.ts | 77 - src/utils/package-json.ts | 144 - src/utils/user-os.ts | 56 - tsconfig.json | 23 - vite.config.ts | 23 - 52 files changed, 4167 insertions(+), 962 deletions(-) delete mode 100644 bun.lockb create mode 100644 go.mod create mode 100644 go.sum create mode 100644 internal/config/options.go create mode 100644 internal/constants/main.go create mode 100644 internal/handlers/handlers_options.go create mode 100644 internal/user-input/add-commitlint.go create mode 100644 internal/user-input/package-managers.go create mode 100644 internal/user-input/publishToNpm.go create mode 100644 internal/user-input/userinput_test.go create mode 100644 internal/user-input/utils.go create mode 100644 internal/utils/commitlint.go create mode 100644 internal/utils/dependencies.go create mode 100644 internal/utils/husky-library.go create mode 100644 internal/utils/npm.go create mode 100644 internal/utils/package-json.go create mode 100644 internal/utils/user-os.go create mode 100644 internal/utils/utils.go create mode 100644 main.go create mode 100644 pnpm-lock.yaml delete mode 100644 src/config/cli.ts delete mode 100644 src/config/options.ts delete mode 100644 src/constants/commitlint.ts delete mode 100644 src/constants/dependencies.ts delete mode 100644 src/constants/encoding.ts delete mode 100644 src/constants/errors.ts delete mode 100644 src/constants/github.ts delete mode 100644 src/constants/huskybc.ts delete mode 100644 src/constants/lint-staged.ts delete mode 100644 src/constants/package-mangers.ts delete mode 100644 src/constants/regex.ts delete mode 100644 src/constants/version.ts delete mode 100644 src/controllers/handlers-options.ts delete mode 100644 src/index.ts delete mode 100644 src/types/message.d.ts delete mode 100644 src/types/package-json.d.ts delete mode 100644 src/types/package-manger.d.ts delete mode 100644 src/types/version.d.ts delete mode 100644 src/user-input/add-commitlint.ts delete mode 100644 src/user-input/npm.ts delete mode 100644 src/user-input/package-managers.ts delete mode 100644 src/utils/commitlint.ts delete mode 100644 src/utils/console.ts delete mode 100644 src/utils/dependencies.ts delete mode 100644 src/utils/errors.ts delete mode 100644 src/utils/husky-library.ts delete mode 100644 src/utils/npm.ts delete mode 100644 src/utils/package-json.ts delete mode 100644 src/utils/user-os.ts delete mode 100644 tsconfig.json delete mode 100644 vite.config.ts diff --git a/bun.lockb b/bun.lockb deleted file mode 100644 index 4bc2947869a434400df5b67b953de10e4936a7ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 186558 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 l?>0BXIF%3FE", constants.VERSION) + case constants.OPTION_HELP_SORT, constants.OPTION_HELP: + printOptions() + default: + printOptions() + } +} diff --git a/internal/constants/main.go b/internal/constants/main.go new file mode 100644 index 0000000..2e156ed --- /dev/null +++ b/internal/constants/main.go @@ -0,0 +1,44 @@ +package constants + +const ( + PATH_PACKAGE_JSON = "package.json" + PATH_DIR_HUSKY = ".husky" + REPOSITORY = "https://github.com/RaulCatalinas/HuskyBC" + ISSUES = REPOSITORY + "/issues" + VERSION = "1.0.0" + NPM = "npm" + YARN = "yarn" + PNPM = "pnpm" + //BUN = "bun" + UTF8_ENCODING = "UTF-8" + SPECIAL_CHARS_REGEX = "[^a-zA-Z0-9._-]" + OPTION_VERSION = "--version" + OPTION_VERSION_SORT = "-v" + OPTION_COLLABORATE = "--collaborate" + OPTION_COLLABORATE_SORT = "-co" + OPTION_BUILD = "--build" + OPTION_BUILD_SORT = "-b" + OPTION_HELP = "--help" + OPTION_HELP_SORT = "-h" +) + +var PACKAGEMANAGERS = []string{NPM, YARN, PNPM /* BUN */} + +var INSTALLATION_COMMANDS = map[string]string{ + NPM: "install", + YARN: "add", + PNPM: "add", + /* BUN: "add", */ +} + +var LINT_STAGED_CONFIG = map[string]string{ + NPM: "npx lint-staged", + YARN: "yarn dlx lint-staged", + PNPM: "pnpm dlx lint-staged", + /* BUN: "bunx lint-staged", */ +} + +var COMMITLINT_CONFIG = map[string]string{ + "npm": "#!/bin/sh\n. \"$(dirname \"$0\")/_/husky.sh\"\nnpx --no-install commitlint --edit \"$1\"\n", + "yarn": "#!/bin/sh\n. \"$(dirname \"$0\")/_/husky.sh\"\nyarn commitlint --edit \"$1\"\n", +} diff --git a/internal/handlers/handlers_options.go b/internal/handlers/handlers_options.go new file mode 100644 index 0000000..ab372ab --- /dev/null +++ b/internal/handlers/handlers_options.go @@ -0,0 +1,46 @@ +package handlers + +import ( + "os" + "time" + + "github.com/toqueteos/webbrowser" + "github.com/RaulCatalinas/HuskyBC/internal/constants" + userinput "github.com/RaulCatalinas/HuskyBC/internal/user-input" + "github.com/RaulCatalinas/HuskyBC/internal/utils" +) + +func HandlerOptionCollaborate() { + utils.WriteMessage("info", "Opening the GitHub repository...") + time.Sleep(5 * time.Millisecond) + err := webbrowser.Open(constants.REPOSITORY) + if err != nil { + utils.WriteMessage("error", utils.GetErrorMessage("Open webbrowser")) + os.Exit(1) + } +} + +func HandlerOptionBuild() { + utils.CheckinFolderOrFile(constants.PATH_PACKAGE_JSON, false) + + packageManagerToUse := userinput.GetPackageManager() + shouldPublishToNpm := userinput.ShouldPublishToNPM() + useCommitlint := userinput.AddCommitlint() + + utils.GenerateHuskyConfig( + utils.Props{ + PackageManagerToUse: packageManagerToUse, + PackageJsonPath: constants.PATH_PACKAGE_JSON, + UseCommitlint: useCommitlint, + ShouldPublishToNpm: shouldPublishToNpm, + }) + if useCommitlint { + utils.GenerateCommitlintConfig( + utils.CommitlintProps{ + PackageManagerToUse: packageManagerToUse, + PackageJsonPath: constants.PATH_PACKAGE_JSON, + ShouldPublishToNpm: shouldPublishToNpm, + }) + } + utils.WriteMessage("success", "All tasks were completed") +} diff --git a/internal/user-input/add-commitlint.go b/internal/user-input/add-commitlint.go new file mode 100644 index 0000000..d6c1c92 --- /dev/null +++ b/internal/user-input/add-commitlint.go @@ -0,0 +1,5 @@ +package userinput + +func AddCommitlint() bool { + return ConfirmationHandler("Do you wanna add commitlint?:(y,n) ") +} diff --git a/internal/user-input/package-managers.go b/internal/user-input/package-managers.go new file mode 100644 index 0000000..48ea2df --- /dev/null +++ b/internal/user-input/package-managers.go @@ -0,0 +1,46 @@ +package userinput + +import ( + "fmt" + "log" + + "github.com/RaulCatalinas/HuskyBC/internal/constants" +) + +func PrintListPackageManeger() { + for index, packageManager := range constants.PACKAGEMANAGERS { + if _, err := fmt.Printf("%d. %s\n", index, packageManager); err != nil { + log.Fatalln(err) + } + } +} + +func GetPackageManager() string { + var selectedPackageManagerNumber int + + if _, err := fmt.Println("Which package manager do you wanna use?"); err != nil { + log.Fatalln(err) + } + + PrintListPackageManeger() + + if _, err := fmt.Print("Answer: "); err != nil { + log.Fatalln(err) + } + + if _, err := fmt.Scan(&selectedPackageManagerNumber); err != nil { + log.Fatalln(err) + } + + if len(constants.PACKAGEMANAGERS) <= selectedPackageManagerNumber { + if _, err := fmt.Println(">> Please enter a valid index"); err != nil { + log.Fatalln(err) + } + + return GetPackageManager() + } + + selectedPackageManager := constants.PACKAGEMANAGERS[selectedPackageManagerNumber] + + return selectedPackageManager +} diff --git a/internal/user-input/publishToNpm.go b/internal/user-input/publishToNpm.go new file mode 100644 index 0000000..8ad73df --- /dev/null +++ b/internal/user-input/publishToNpm.go @@ -0,0 +1,5 @@ +package userinput + +func ShouldPublishToNPM() bool { + return ConfirmationHandler("Will you publish it on npm?:(y,n) ") +} diff --git a/internal/user-input/userinput_test.go b/internal/user-input/userinput_test.go new file mode 100644 index 0000000..f0bd44d --- /dev/null +++ b/internal/user-input/userinput_test.go @@ -0,0 +1,84 @@ +package userinput_test + +import ( + "bytes" + "os" + "testing" + + "github.com/RaulCatalinas/HuskyBC/internal/constants" + userinput "github.com/RaulCatalinas/HuskyBC/internal/user-input" +) + +// TestPrintListPackageManeger prueba la función PrintListPackageManeger +func TestPrintListPackageManeger(t *testing.T) { + // Guardamos la salida original de os.Stdout + oldStdout := os.Stdout + + // Creamos un pipe para capturar la salida + r, w, _ := os.Pipe() + os.Stdout = w + + // Llamamos a la función que queremos probar + userinput.PrintListPackageManeger() + + // Cerramos el writer y restauramos os.Stdout + w.Close() + os.Stdout = oldStdout + + // Leemos la salida capturada + var buf bytes.Buffer + buf.ReadFrom(r) + + // Comprobamos que la salida es la esperada + expectedOutput := "0. npm\n1. yarn\n2. pnpm\n3. bun\n" + if buf.String() != expectedOutput { + t.Errorf("Expected output %q, but got %q", expectedOutput, buf.String()) + } + // Imprimimos la salida del código principal para referencia + t.Logf("Output of PrintListPackageManeger: %q", buf.String()) +} + +// TestGetPackageManager prueba la función GetPackageManager +func TestGetPackageManager(t *testing.T) { + // Guardamos la salida original de os.Stdout y la entrada original de os.Stdin + oldStdout := os.Stdout + oldStdin := os.Stdin + + // Creamos un pipe para capturar la salida + rOut, wOut, _ := os.Pipe() + os.Stdout = wOut + + // Creamos un pipe para simular la entrada del usuario + rIn, wIn, _ := os.Pipe() + os.Stdin = rIn + + // Escribimos la entrada simulada + wIn.WriteString("2\n") + wIn.Close() + + // Llamamos a la función que queremos probar + selectedPackageManager := userinput.GetPackageManager() + + // Cerramos el writer de salida y restauramos os.Stdout y os.Stdin + wOut.Close() + os.Stdout = oldStdout + os.Stdin = oldStdin + + // Leemos la salida capturada + var bufOut bytes.Buffer + bufOut.ReadFrom(rOut) + + // Comparamos la salida con la salida esperada + expectedOutput := "Which package manager do you wanna use?\n0. npm\n1. yarn\n2. pnpm\n3. bun\n" + if bufOut.String() != expectedOutput { + t.Errorf("Expected output %q, but got %q", expectedOutput, bufOut.String()) + } + + // Imprimimos la salida del código principal para referencia + t.Logf("Output of GetPackageManager: %q", bufOut.String()) + + expectedPackageManager := constants.PNPM + if selectedPackageManager != expectedPackageManager { + t.Errorf("Expected package manager %q, but got %q", expectedPackageManager, selectedPackageManager) + } +} diff --git a/internal/user-input/utils.go b/internal/user-input/utils.go new file mode 100644 index 0000000..382f51a --- /dev/null +++ b/internal/user-input/utils.go @@ -0,0 +1,29 @@ +package userinput + +import ( + "fmt" + "log" +) + +func ConfirmationHandler(message string) bool { + var response string + + if _, err := fmt.Print(message); err != nil { + log.Fatalln(err) + } + + if _, err := fmt.Scan(&response); err != nil { + log.Fatalln(err) + } + + if response != "y" && response != "n" { + fmt.Println(">> Please enter a valid option") + return ConfirmationHandler(message) + } + + if response == "y" { + return true + } + + return false +} diff --git a/internal/utils/commitlint.go b/internal/utils/commitlint.go new file mode 100644 index 0000000..2bcaeeb --- /dev/null +++ b/internal/utils/commitlint.go @@ -0,0 +1,81 @@ +package utils + +import ( + "os" + "sync" + + "github.com/RaulCatalinas/HuskyBC/internal/constants" +) + +type CommitlintProps struct { + PackageManagerToUse string + PackageJsonPath string + ShouldPublishToNpm bool +} + +func GenerateCommitlintConfig(commitlintProps CommitlintProps) { + defer func() { + if r := recover(); r != nil { + WriteMessage("error", GetErrorMessage("Commitlint")) + os.Exit(1) + } + }() + + WriteMessage("config", "Configuring commitlint...") + + InstallDependencies(InstallProps{PackageManagerToUse: commitlintProps.PackageManagerToUse, PackagesToInstall: []string{ + "lint-staged", + "@commitlint/cli", + "@commitlint/config-conventional", + }}) + + addScript(addScriptProps{PackageJsonPath: commitlintProps.PackageJsonPath, ScriptsToAdd: []packageJsonScript{ + {Key: "lint", Value: "eslint src"}, + {Key: "lint:fix", Value: "eslint src --fix"}, + {Key: "format", Value: "prettier src --check"}, + {Key: "format:write", Value: "prettier src --write"}, + }}) + + createCommitlintConfigFiles(commitlintProps.PackageManagerToUse) + + if commitlintProps.ShouldPublishToNpm { + modifyNpmIgnore([]string{".lintstagedrc", "commitlint.config.js"}) + } + + WriteMessage("success", "commitlint's configuration generated successfully") +} + +func createCommitlintConfigFiles(packageManagerToUse string) { + WriteMessage("info", "Creating configuration files...") + + var wg sync.WaitGroup + + wg.Add(1) + go func() { + defer wg.Done() + writeFile(".husky/commit-msg", []byte(constants.COMMITLINT_CONFIG[packageManagerToUse])) + }() + + wg.Add(1) + go func() { + defer wg.Done() + content := "export default { extends: ['@commitlint/config-conventional'] }" + writeFile("commitlint.config.js", []byte(content)) + }() + + wg.Add(1) + go func() { + defer wg.Done() + content := `{ + "src/**/*.{astro,html,js,jsx,md,mdx,svelte,ts,tsx,vue}": [ + "prettier src --check", + "eslint src --max-warnings 0" + ] +}` + writeFile(".lintstagedrc", []byte(content)) + }() + + wg.Wait() + + WriteMessage("success", "Configuration files (commit-msg, commitlint.config.js and .lintstagedrc) created successfully") +} diff --git a/internal/utils/dependencies.go b/internal/utils/dependencies.go new file mode 100644 index 0000000..debba09 --- /dev/null +++ b/internal/utils/dependencies.go @@ -0,0 +1,58 @@ +package utils + +import ( + "fmt" + "os" + "os/exec" + + "github.com/RaulCatalinas/HuskyBC/internal/constants" +) + +type InstallProps struct { + PackageManagerToUse string + PackagesToInstall []string +} + +func promiseSpawn(command string, args []string) error { + cmd := exec.Command(command, args...) + + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + + return cmd.Run() +} + +func InstallDependencies(props InstallProps) { + defer func() { + if r := recover(); r != nil { + WriteMessage("error", GetErrorMessage("Dependencies")) + os.Exit(1) + } + }() + + installationCommand, exists := constants.INSTALLATION_COMMANDS[props.PackageManagerToUse] + if !exists { + WriteMessage("error", "Invalid package manager") + os.Exit(1) + } + + WriteMessage("info", fmt.Sprintf("Installing dependencies using: %s...", props.PackageManagerToUse)) + + /* FIXME: Problemas al ejecutan bun, dice esto: + error: Module not found "...\HuskyBC\node_modules\husky\bin.mjs" + error: prepare script from "" exited with 1 + + Investigacion: + con bun no se instala todo lo que necesita husky, viendo con pnpm y npm, faltan varios archivos, + hice una prueba haciendo "bun add husky" directamente y es el mismo caso, lo que quiere decir que HuskyBC no presenta problemas + el problema viene desde el mismo bun + */ + args := append([]string{installationCommand}, append(props.PackagesToInstall, "-D")...) + err := promiseSpawn(props.PackageManagerToUse, args) + if err != nil { + WriteMessage("error", GetErrorMessage(err.Error())) + os.Exit(1) + } + + WriteMessage("success", "Dependencies installed successfully") +} diff --git a/internal/utils/husky-library.go b/internal/utils/husky-library.go new file mode 100644 index 0000000..a49df5f --- /dev/null +++ b/internal/utils/husky-library.go @@ -0,0 +1,75 @@ +package utils + +import ( + "github.com/RaulCatalinas/HuskyBC/internal/constants" +) + +type Props struct { + PackageManagerToUse string + PackageJsonPath string + UseCommitlint bool + ShouldPublishToNpm bool +} + +func GenerateHuskyConfig(props Props) { + WriteMessage("info", "Generating Husky's Configuration...") + + InstallDependencies(InstallProps{PackageManagerToUse: props.PackageManagerToUse, PackagesToInstall: []string{"husky"}}) + + createHuskyConfigFiles(props.PackageManagerToUse, props.UseCommitlint) + + addNecessaryScriptsToPakageJson(props.PackageJsonPath, props.PackageManagerToUse, props.ShouldPublishToNpm) + + if props.ShouldPublishToNpm { + modifyNpmIgnore(".husky") + } + + WriteMessage("success", "Husky's configuration generated successfully") +} + +func createHuskyConfigFiles(packageManagerToUse string, useCommitlint bool) { + WriteMessage("info", "Creating configuration file...") + + CheckinFolderOrFile(constants.PATH_DIR_HUSKY, true) + + var preCommitFileValue string + if useCommitlint { + preCommitFileValue = constants.LINT_STAGED_CONFIG[packageManagerToUse] + } else { + preCommitFileValue = packageManagerToUse + "test" + } + + writeFile(constants.PATH_DIR_HUSKY+"/pre-commit", []byte(preCommitFileValue)) + + WriteMessage("info", "Configuration file (pre-commit) created successfully") +} + +type packageJsonScript struct { + Key string + Value string +} + +func addNecessaryScriptsToPakageJson(packaJsonPath string, packageManagerToUse string, sholdPublishToNpm bool) { + WriteMessage("info", "Add necessary scripts to "+packaJsonPath) + + var huskyScriptsForYarn interface{} + var scriptsToAdd interface{} + + if sholdPublishToNpm { + huskyScriptsForYarn = packageJsonScript{Key: "postintall", Value: "husky"} + } else { + huskyScriptsForYarn = []packageJsonScript{ + {Key: "postinstall", Value: "husky"}, + {Key: "prepack", Value: "pinst --disable"}, + {Key: "postpack", Value: "pinst --enable"}, + } + } + + if packageManagerToUse != "yarn" { + scriptsToAdd = packageJsonScript{Key: "prepare", Value: "husky"} + } else { + scriptsToAdd = huskyScriptsForYarn + } + + addScript(addScriptProps{ScriptsToAdd: scriptsToAdd, PackageJsonPath: packaJsonPath}) +} diff --git a/internal/utils/npm.go b/internal/utils/npm.go new file mode 100644 index 0000000..adf2606 --- /dev/null +++ b/internal/utils/npm.go @@ -0,0 +1,78 @@ +package utils + +import ( + "fmt" + "os" + "strings" +) + +func modifyNpmIgnore(filesToAdd interface{}) { + defer func() { + if r := recover(); r != nil { + WriteMessage("error", GetErrorMessage("NpmIgnoreWrite")) + os.Exit(1) + } + }() + + WriteMessage("info", "Writing in the file \".npmignore\"...") + + dir, err := os.Getwd() + if err != nil { + WriteMessage("error", "get wd") + os.Exit(1) + } + npmIgnoreFilePath := fmt.Sprintf("%s/.npmignore", dir) + + if !exists(npmIgnoreFilePath) { + createEmptyFile(".npmignore") + } + + data := readFile(npmIgnoreFilePath) + + ignoredFiles := string(data) + if ignoredFiles == "" { + var filesToWrite string + switch v := filesToAdd.(type) { + case string: + filesToWrite = v + case []string: + filesToWrite = strings.Join(v, "\n") + default: + WriteMessage("error", "Invalid type for filesToAdd") + os.Exit(1) + } + + writeFile(npmIgnoreFilePath, []byte(filesToWrite)) + + WriteMessage("info", "\".npmignore\" file modified successfully") + return + } + + ignoredFilesArray := strings.FieldsFunc(ignoredFiles, func(r rune) bool { + return r == '\n' + }) + + trimmedIgnoredFilesArray := make([]string, 0, len(ignoredFilesArray)) + for _, file := range ignoredFilesArray { + trimmedFile := strings.TrimSpace(file) + if trimmedFile != "" { + trimmedIgnoredFilesArray = append(trimmedIgnoredFilesArray, trimmedFile) + } + } + + switch v := filesToAdd.(type) { + case string: + trimmedIgnoredFilesArray = append(trimmedIgnoredFilesArray, v) + case []string: + trimmedIgnoredFilesArray = append(trimmedIgnoredFilesArray, v...) + default: + WriteMessage("error", "Invalid type for filesToAdd") + os.Exit(1) + } + + finalContent := strings.Join(trimmedIgnoredFilesArray, "\n") + + writeFile(npmIgnoreFilePath, []byte(finalContent)) + + WriteMessage("info", "\".npmignore\" file modified successfully") +} diff --git a/internal/utils/package-json.go b/internal/utils/package-json.go new file mode 100644 index 0000000..131fd62 --- /dev/null +++ b/internal/utils/package-json.go @@ -0,0 +1,63 @@ +package utils + +import ( + "os" +) + +type addScriptProps struct { + ScriptsToAdd interface{} // Puede ser packageJsonScript o []packageJsonScript + PackageJsonPath string +} + +func existsSection(packageJsonPath string, sectionToCheck string) bool { + packageJsonObj := readAndUnmarshalPackageJson(packageJsonPath) + + _, exists := packageJsonObj[sectionToCheck] + return exists +} + +func createEmptySection(packageJsonPath string, sectionToCreate string) { + packageJsonObj := readAndUnmarshalPackageJson(packageJsonPath) + + packageJsonObj[sectionToCreate] = map[string]interface{}{} + + jsonMarshalIndentAndWriteFile(packageJsonObj, packageJsonPath) +} + +func addScript(props addScriptProps) { + packageJsonPath := props.PackageJsonPath + scriptsToAdd := props.ScriptsToAdd + + defer func() { + if r := recover(); r != nil { + WriteMessage("error", GetErrorMessage("AddScript")) + os.Exit(1) + } + }() + + WriteMessage("info", "Modifying package.json...") + + if !existsSection(packageJsonPath, "scripts") { + createEmptySection(packageJsonPath, "scripts") + } + + packageJsonObj := readAndUnmarshalPackageJson(packageJsonPath) + + scriptsSection := packageJsonObj["scripts"].(map[string]interface{}) + + switch v := scriptsToAdd.(type) { + case []packageJsonScript: + for _, script := range v { + scriptsSection[script.Key] = script.Value + } + case packageJsonScript: + scriptsSection[v.Key] = v.Value + default: + WriteMessage("error", "Invalid type for scriptsToAdd") + os.Exit(1) + } + + jsonMarshalIndentAndWriteFile(packageJsonObj, packageJsonPath) + + WriteMessage("success", "Package.json modified successfully") +} diff --git a/internal/utils/user-os.go b/internal/utils/user-os.go new file mode 100644 index 0000000..aa4b834 --- /dev/null +++ b/internal/utils/user-os.go @@ -0,0 +1,45 @@ +package utils + +import ( + "os" +) + +func createFolder(name string) { + os.Mkdir(name, 0750) + + WriteMessage("info", "Created folder "+name) +} + +func createFile(name string) { + os.NewFile(0750, name) + + WriteMessage("info", "Created file "+name) +} + +func CheckinFolderOrFile(path string, folder bool) { + _, err := os.Stat(path) + + if err != nil { + + var folderType string + if folder { + folderType = "folder" + } else { + folderType = "file" + } + + WriteMessage("error", "When checking "+folderType+": "+path) + + if os.IsNotExist(err) { + WriteMessage("error", "Not found "+path) + + if folder { + createFolder(path) + } else { + createFile(path) + } + } else { + os.Exit(0) + } + } +} diff --git a/internal/utils/utils.go b/internal/utils/utils.go new file mode 100644 index 0000000..dad3e64 --- /dev/null +++ b/internal/utils/utils.go @@ -0,0 +1,84 @@ +package utils + +import ( + "encoding/json" + "fmt" + "log" + "os" +) + +func GetErrorMessage(context string) string { + return fmt.Sprintf("Error in %s", context) +} + +func WriteMessage(messageType string, message string) { + log.Printf("[%s] %s", messageType, message) +} + +func exists(filePath string) bool { + _, err := os.Stat(filePath) + + return !os.IsNotExist(err) +} + +func createEmptyFile(fileName string) { + file, err := os.Create(fileName) + if err != nil { + WriteMessage("error", GetErrorMessage("CreateFile")) + os.Exit(1) + } + defer file.Close() +} + +func readFile(filename string) []byte { + dataByte, err := os.ReadFile(filename) + if err != nil { + WriteMessage("error", GetErrorMessage("Read file "+filename)) + os.Exit(1) + } + + return dataByte +} + +func writeFile(filename string, newData []byte) { + err := os.WriteFile(filename, newData, 0644) + if err != nil { + WriteMessage("error", GetErrorMessage("Write file "+filename)) + } +} + +func jsonMarshalIndent(packageJsonObj map[string]interface{}) []byte { + newData, err := json.MarshalIndent(packageJsonObj, "", " ") + if err != nil { + WriteMessage("error", GetErrorMessage("Json marshal indent")) + os.Exit(1) + } + + return newData +} + +func jsonUnmarshal(data []byte) map[string]interface{} { + var packageJsonObj map[string]interface{} + + err := json.Unmarshal(data, &packageJsonObj) + if err != nil { + WriteMessage("error", GetErrorMessage("Json unmarshal")) + os.Exit(1) + } + + return packageJsonObj +} + +func readAndUnmarshalPackageJson(packageJsonPath string) map[string]interface{} { + dataByte := readFile(packageJsonPath) + + packageJsonObj := jsonUnmarshal(dataByte) + + return packageJsonObj +} + +func jsonMarshalIndentAndWriteFile(packageJsonObj map[string]interface{}, filename string) { + newData := jsonMarshalIndent(packageJsonObj) + + writeFile(filename, newData) +} diff --git a/main.go b/main.go new file mode 100644 index 0000000..25f8b07 --- /dev/null +++ b/main.go @@ -0,0 +1,9 @@ +package main + +import ( + "github.com/RaulCatalinas/HuskyBC/internal/config" +) + +func main() { + config.ConfigureOptions() +} diff --git a/package.json b/package.json index 38863f4..b64b58f 100644 --- a/package.json +++ b/package.json @@ -15,23 +15,10 @@ "build": "vite build", "prepublishOnly": "bun run build" }, - "dependencies": { - "@npmcli/promise-spawn": "7.0.2", - "chalk": "5.3.0", - "commander": "12.1.0", - "fs-extra": "11.2.0", - "inquirer": "9.2.22", - "opener": "1.5.2" - }, "devDependencies": { "@commitlint/cli": "19.3.0", "@commitlint/config-conventional": "19.2.2", "@eslint/js": "^9.3.0", - "@types/bun": "1.1.3", - "@types/fs-extra": "11.0.4", - "@types/inquirer": "9.0.7", - "@types/npmcli__promise-spawn": "6.0.3", - "@types/opener": "1.4.3", "eslint": "^8.0.1", "eslint-config-love": "51.0.1", "eslint-config-prettier": "9.1.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..cae76a0 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,3370 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +devDependencies: + '@commitlint/cli': + specifier: 19.3.0 + version: 19.3.0(@types/node@20.14.0)(typescript@5.4.5) + '@commitlint/config-conventional': + specifier: 19.2.2 + version: 19.2.2 + '@eslint/js': + specifier: ^9.3.0 + version: 9.4.0 + eslint: + specifier: ^8.0.1 + version: 8.57.0 + eslint-config-love: + specifier: 51.0.1 + version: 51.0.1(@typescript-eslint/parser@7.11.0)(eslint@8.57.0)(typescript@5.4.5) + eslint-config-prettier: + specifier: 9.1.0 + version: 9.1.0(eslint@8.57.0) + eslint-plugin-prettier: + specifier: 5.1.3 + version: 5.1.3(eslint-config-prettier@9.1.0)(eslint@8.57.0)(prettier@3.2.5) + husky: + specifier: 9.0.11 + version: 9.0.11 + lint-staged: + specifier: 15.2.5 + version: 15.2.5 + markdownlint: + specifier: 0.34.0 + version: 0.34.0 + prettier: + specifier: 3.2.5 + version: 3.2.5 + typescript: + specifier: 5.4.5 + version: 5.4.5 + vite: + specifier: 5.2.12 + version: 5.2.12(@types/node@20.14.0) + vite-tsconfig-paths: + specifier: 4.3.2 + version: 4.3.2(typescript@5.4.5)(vite@5.2.12) + +packages: + + /@babel/code-frame@7.24.6: + resolution: {integrity: sha512-ZJhac6FkEd1yhG2AHOmfcXG4ceoLltoCVJjN5XsWN9BifBQr+cHJbWi0h68HZuSORq+3WtJ2z0hwF2NG1b5kcA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.24.6 + picocolors: 1.0.1 + dev: true + + /@babel/helper-validator-identifier@7.24.6: + resolution: {integrity: sha512-4yA7s865JHaqUdRbnaxarZREuPTHrjpDT+pXoAZ1yhyo6uFnIEpS8VMu16siFOHDpZNKYv5BObhsB//ycbICyw==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/highlight@7.24.6: + resolution: {integrity: sha512-2YnuOp4HAk2BsBrJJvYCbItHx0zWscI1C3zgWkz+wDyD9I7GIVrfnLyrR4Y1VR+7p+chAEcrgRQYZAGIKMV7vQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.24.6 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.0.1 + dev: true + + /@commitlint/cli@19.3.0(@types/node@20.14.0)(typescript@5.4.5): + resolution: {integrity: sha512-LgYWOwuDR7BSTQ9OLZ12m7F/qhNY+NpAyPBgo4YNMkACE7lGuUnuQq1yi9hz1KA4+3VqpOYl8H1rY/LYK43v7g==} + engines: {node: '>=v18'} + hasBin: true + dependencies: + '@commitlint/format': 19.3.0 + '@commitlint/lint': 19.2.2 + '@commitlint/load': 19.2.0(@types/node@20.14.0)(typescript@5.4.5) + '@commitlint/read': 19.2.1 + '@commitlint/types': 19.0.3 + execa: 8.0.1 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - typescript + dev: true + + /@commitlint/config-conventional@19.2.2: + resolution: {integrity: sha512-mLXjsxUVLYEGgzbxbxicGPggDuyWNkf25Ht23owXIH+zV2pv1eJuzLK3t1gDY5Gp6pxdE60jZnWUY5cvgL3ufw==} + engines: {node: '>=v18'} + dependencies: + '@commitlint/types': 19.0.3 + conventional-changelog-conventionalcommits: 7.0.2 + dev: true + + /@commitlint/config-validator@19.0.3: + resolution: {integrity: sha512-2D3r4PKjoo59zBc2auodrSCaUnCSALCx54yveOFwwP/i2kfEAQrygwOleFWswLqK0UL/F9r07MFi5ev2ohyM4Q==} + engines: {node: '>=v18'} + dependencies: + '@commitlint/types': 19.0.3 + ajv: 8.14.0 + dev: true + + /@commitlint/ensure@19.0.3: + resolution: {integrity: sha512-SZEpa/VvBLoT+EFZVb91YWbmaZ/9rPH3ESrINOl0HD2kMYsjvl0tF7nMHh0EpTcv4+gTtZBAe1y/SS6/OhfZzQ==} + engines: {node: '>=v18'} + dependencies: + '@commitlint/types': 19.0.3 + lodash.camelcase: 4.3.0 + lodash.kebabcase: 4.1.1 + lodash.snakecase: 4.1.1 + lodash.startcase: 4.4.0 + lodash.upperfirst: 4.3.1 + dev: true + + /@commitlint/execute-rule@19.0.0: + resolution: {integrity: sha512-mtsdpY1qyWgAO/iOK0L6gSGeR7GFcdW7tIjcNFxcWkfLDF5qVbPHKuGATFqRMsxcO8OUKNj0+3WOHB7EHm4Jdw==} + engines: {node: '>=v18'} + dev: true + + /@commitlint/format@19.3.0: + resolution: {integrity: sha512-luguk5/aF68HiF4H23ACAfk8qS8AHxl4LLN5oxPc24H+2+JRPsNr1OS3Gaea0CrH7PKhArBMKBz5RX9sA5NtTg==} + engines: {node: '>=v18'} + dependencies: + '@commitlint/types': 19.0.3 + chalk: 5.3.0 + dev: true + + /@commitlint/is-ignored@19.2.2: + resolution: {integrity: sha512-eNX54oXMVxncORywF4ZPFtJoBm3Tvp111tg1xf4zWXGfhBPKpfKG6R+G3G4v5CPlRROXpAOpQ3HMhA9n1Tck1g==} + engines: {node: '>=v18'} + dependencies: + '@commitlint/types': 19.0.3 + semver: 7.6.2 + dev: true + + /@commitlint/lint@19.2.2: + resolution: {integrity: sha512-xrzMmz4JqwGyKQKTpFzlN0dx0TAiT7Ran1fqEBgEmEj+PU98crOFtysJgY+QdeSagx6EDRigQIXJVnfrI0ratA==} + engines: {node: '>=v18'} + dependencies: + '@commitlint/is-ignored': 19.2.2 + '@commitlint/parse': 19.0.3 + '@commitlint/rules': 19.0.3 + '@commitlint/types': 19.0.3 + dev: true + + /@commitlint/load@19.2.0(@types/node@20.14.0)(typescript@5.4.5): + resolution: {integrity: sha512-XvxxLJTKqZojCxaBQ7u92qQLFMMZc4+p9qrIq/9kJDy8DOrEa7P1yx7Tjdc2u2JxIalqT4KOGraVgCE7eCYJyQ==} + engines: {node: '>=v18'} + dependencies: + '@commitlint/config-validator': 19.0.3 + '@commitlint/execute-rule': 19.0.0 + '@commitlint/resolve-extends': 19.1.0 + '@commitlint/types': 19.0.3 + chalk: 5.3.0 + cosmiconfig: 9.0.0(typescript@5.4.5) + cosmiconfig-typescript-loader: 5.0.0(@types/node@20.14.0)(cosmiconfig@9.0.0)(typescript@5.4.5) + lodash.isplainobject: 4.0.6 + lodash.merge: 4.6.2 + lodash.uniq: 4.5.0 + transitivePeerDependencies: + - '@types/node' + - typescript + dev: true + + /@commitlint/message@19.0.0: + resolution: {integrity: sha512-c9czf6lU+9oF9gVVa2lmKaOARJvt4soRsVmbR7Njwp9FpbBgste5i7l/2l5o8MmbwGh4yE1snfnsy2qyA2r/Fw==} + engines: {node: '>=v18'} + dev: true + + /@commitlint/parse@19.0.3: + resolution: {integrity: sha512-Il+tNyOb8VDxN3P6XoBBwWJtKKGzHlitEuXA5BP6ir/3loWlsSqDr5aecl6hZcC/spjq4pHqNh0qPlfeWu38QA==} + engines: {node: '>=v18'} + dependencies: + '@commitlint/types': 19.0.3 + conventional-changelog-angular: 7.0.0 + conventional-commits-parser: 5.0.0 + dev: true + + /@commitlint/read@19.2.1: + resolution: {integrity: sha512-qETc4+PL0EUv7Q36lJbPG+NJiBOGg7SSC7B5BsPWOmei+Dyif80ErfWQ0qXoW9oCh7GTpTNRoaVhiI8RbhuaNw==} + engines: {node: '>=v18'} + dependencies: + '@commitlint/top-level': 19.0.0 + '@commitlint/types': 19.0.3 + execa: 8.0.1 + git-raw-commits: 4.0.0 + minimist: 1.2.8 + dev: true + + /@commitlint/resolve-extends@19.1.0: + resolution: {integrity: sha512-z2riI+8G3CET5CPgXJPlzftH+RiWYLMYv4C9tSLdLXdr6pBNimSKukYP9MS27ejmscqCTVA4almdLh0ODD2KYg==} + engines: {node: '>=v18'} + dependencies: + '@commitlint/config-validator': 19.0.3 + '@commitlint/types': 19.0.3 + global-directory: 4.0.1 + import-meta-resolve: 4.1.0 + lodash.mergewith: 4.6.2 + resolve-from: 5.0.0 + dev: true + + /@commitlint/rules@19.0.3: + resolution: {integrity: sha512-TspKb9VB6svklxNCKKwxhELn7qhtY1rFF8ls58DcFd0F97XoG07xugPjjbVnLqmMkRjZDbDIwBKt9bddOfLaPw==} + engines: {node: '>=v18'} + dependencies: + '@commitlint/ensure': 19.0.3 + '@commitlint/message': 19.0.0 + '@commitlint/to-lines': 19.0.0 + '@commitlint/types': 19.0.3 + execa: 8.0.1 + dev: true + + /@commitlint/to-lines@19.0.0: + resolution: {integrity: sha512-vkxWo+VQU5wFhiP9Ub9Sre0FYe019JxFikrALVoD5UGa8/t3yOJEpEhxC5xKiENKKhUkTpEItMTRAjHw2SCpZw==} + engines: {node: '>=v18'} + dev: true + + /@commitlint/top-level@19.0.0: + resolution: {integrity: sha512-KKjShd6u1aMGNkCkaX4aG1jOGdn7f8ZI8TR1VEuNqUOjWTOdcDSsmglinglJ18JTjuBX5I1PtjrhQCRcixRVFQ==} + engines: {node: '>=v18'} + dependencies: + find-up: 7.0.0 + dev: true + + /@commitlint/types@19.0.3: + resolution: {integrity: sha512-tpyc+7i6bPG9mvaBbtKUeghfyZSDgWquIDfMgqYtTbmZ9Y9VzEm2je9EYcQ0aoz5o7NvGS+rcDec93yO08MHYA==} + engines: {node: '>=v18'} + dependencies: + '@types/conventional-commits-parser': 5.0.0 + chalk: 5.3.0 + dev: true + + /@esbuild/aix-ppc64@0.20.2: + resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm64@0.20.2: + resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.20.2: + resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.20.2: + resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.20.2: + resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.20.2: + resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.20.2: + resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.20.2: + resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.20.2: + resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.20.2: + resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.20.2: + resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.20.2: + resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.20.2: + resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.20.2: + resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.20.2: + resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.20.2: + resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.20.2: + resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.20.2: + resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.20.2: + resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.20.2: + resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.20.2: + resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.20.2: + resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.20.2: + resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@eslint-community/eslint-utils@4.4.0(eslint@8.57.0): + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.57.0 + eslint-visitor-keys: 3.4.3 + dev: true + + /@eslint-community/regexpp@4.10.0: + resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: true + + /@eslint/eslintrc@2.1.4: + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.5 + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.1 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@eslint/js@8.57.0: + resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@eslint/js@9.4.0: + resolution: {integrity: sha512-fdI7VJjP3Rvc70lC4xkFXHB0fiPeojiL1PxVG6t1ZvXQrarj893PweuBTujxDUFk0Fxj4R7PIIAZ/aiiyZPZcg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dev: true + + /@humanwhocodes/config-array@0.11.14: + resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.3.5 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@humanwhocodes/module-importer@1.0.1: + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + dev: true + + /@humanwhocodes/object-schema@2.0.3: + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + dev: true + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: true + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: true + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 + dev: true + + /@pkgr/core@0.1.1: + resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + dev: true + + /@rollup/rollup-android-arm-eabi@4.18.0: + resolution: {integrity: sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-android-arm64@4.18.0: + resolution: {integrity: sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-darwin-arm64@4.18.0: + resolution: {integrity: sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-darwin-x64@4.18.0: + resolution: {integrity: sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm-gnueabihf@4.18.0: + resolution: {integrity: sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm-musleabihf@4.18.0: + resolution: {integrity: sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm64-gnu@4.18.0: + resolution: {integrity: sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm64-musl@4.18.0: + resolution: {integrity: sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-powerpc64le-gnu@4.18.0: + resolution: {integrity: sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-riscv64-gnu@4.18.0: + resolution: {integrity: sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-s390x-gnu@4.18.0: + resolution: {integrity: sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-x64-gnu@4.18.0: + resolution: {integrity: sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-x64-musl@4.18.0: + resolution: {integrity: sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-arm64-msvc@4.18.0: + resolution: {integrity: sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-ia32-msvc@4.18.0: + resolution: {integrity: sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-x64-msvc@4.18.0: + resolution: {integrity: sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@types/conventional-commits-parser@5.0.0: + resolution: {integrity: sha512-loB369iXNmAZglwWATL+WRe+CRMmmBPtpolYzIebFaX4YA3x+BEfLqhUAV9WanycKI3TG1IMr5bMJDajDKLlUQ==} + dependencies: + '@types/node': 20.14.0 + dev: true + + /@types/estree@1.0.5: + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + dev: true + + /@types/json5@0.0.29: + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + dev: true + + /@types/node@20.14.0: + resolution: {integrity: sha512-5cHBxFGJx6L4s56Bubp4fglrEpmyJypsqI6RgzMfBHWUJQGWAAi8cWcgetEbZXHYXo9C2Fa4EEds/uSyS4cxmA==} + dependencies: + undici-types: 5.26.5 + dev: true + + /@typescript-eslint/eslint-plugin@7.11.0(@typescript-eslint/parser@7.11.0)(eslint@8.57.0)(typescript@5.4.5): + resolution: {integrity: sha512-P+qEahbgeHW4JQ/87FuItjBj8O3MYv5gELDzr8QaQ7fsll1gSMTYb6j87MYyxwf3DtD7uGFB9ShwgmCJB5KmaQ==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + '@typescript-eslint/parser': ^7.0.0 + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@eslint-community/regexpp': 4.10.0 + '@typescript-eslint/parser': 7.11.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/scope-manager': 7.11.0 + '@typescript-eslint/type-utils': 7.11.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/utils': 7.11.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/visitor-keys': 7.11.0 + eslint: 8.57.0 + graphemer: 1.4.0 + ignore: 5.3.1 + natural-compare: 1.4.0 + ts-api-utils: 1.3.0(typescript@5.4.5) + typescript: 5.4.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/parser@7.11.0(eslint@8.57.0)(typescript@5.4.5): + resolution: {integrity: sha512-yimw99teuaXVWsBcPO1Ais02kwJ1jmNA1KxE7ng0aT7ndr1pT1wqj0OJnsYVGKKlc4QJai86l/025L6z8CljOg==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 7.11.0 + '@typescript-eslint/types': 7.11.0 + '@typescript-eslint/typescript-estree': 7.11.0(typescript@5.4.5) + '@typescript-eslint/visitor-keys': 7.11.0 + debug: 4.3.5 + eslint: 8.57.0 + typescript: 5.4.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/scope-manager@7.11.0: + resolution: {integrity: sha512-27tGdVEiutD4POirLZX4YzT180vevUURJl4wJGmm6TrQoiYwuxTIY98PBp6L2oN+JQxzE0URvYlzJaBHIekXAw==} + engines: {node: ^18.18.0 || >=20.0.0} + dependencies: + '@typescript-eslint/types': 7.11.0 + '@typescript-eslint/visitor-keys': 7.11.0 + dev: true + + /@typescript-eslint/type-utils@7.11.0(eslint@8.57.0)(typescript@5.4.5): + resolution: {integrity: sha512-WmppUEgYy+y1NTseNMJ6mCFxt03/7jTOy08bcg7bxJJdsM4nuhnchyBbE8vryveaJUf62noH7LodPSo5Z0WUCg==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/typescript-estree': 7.11.0(typescript@5.4.5) + '@typescript-eslint/utils': 7.11.0(eslint@8.57.0)(typescript@5.4.5) + debug: 4.3.5 + eslint: 8.57.0 + ts-api-utils: 1.3.0(typescript@5.4.5) + typescript: 5.4.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/types@7.11.0: + resolution: {integrity: sha512-MPEsDRZTyCiXkD4vd3zywDCifi7tatc4K37KqTprCvaXptP7Xlpdw0NR2hRJTetG5TxbWDB79Ys4kLmHliEo/w==} + engines: {node: ^18.18.0 || >=20.0.0} + dev: true + + /@typescript-eslint/typescript-estree@7.11.0(typescript@5.4.5): + resolution: {integrity: sha512-cxkhZ2C/iyi3/6U9EPc5y+a6csqHItndvN/CzbNXTNrsC3/ASoYQZEt9uMaEp+xFNjasqQyszp5TumAVKKvJeQ==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 7.11.0 + '@typescript-eslint/visitor-keys': 7.11.0 + debug: 4.3.5 + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.4 + semver: 7.6.2 + ts-api-utils: 1.3.0(typescript@5.4.5) + typescript: 5.4.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/utils@7.11.0(eslint@8.57.0)(typescript@5.4.5): + resolution: {integrity: sha512-xlAWwPleNRHwF37AhrZurOxA1wyXowW4PqVXZVUNCLjB48CqdPJoJWkrpH2nij9Q3Lb7rtWindtoXwxjxlKKCA==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@typescript-eslint/scope-manager': 7.11.0 + '@typescript-eslint/types': 7.11.0 + '@typescript-eslint/typescript-estree': 7.11.0(typescript@5.4.5) + eslint: 8.57.0 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/visitor-keys@7.11.0: + resolution: {integrity: sha512-7syYk4MzjxTEk0g/w3iqtgxnFQspDJfn6QKD36xMuuhTzjcxY7F8EmBLnALjVyaOF1/bVocu3bS/2/F7rXrveQ==} + engines: {node: ^18.18.0 || >=20.0.0} + dependencies: + '@typescript-eslint/types': 7.11.0 + eslint-visitor-keys: 3.4.3 + dev: true + + /@ungap/structured-clone@1.2.0: + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + dev: true + + /JSONStream@1.3.5: + resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} + hasBin: true + dependencies: + jsonparse: 1.3.1 + through: 2.3.8 + dev: true + + /acorn-jsx@5.3.2(acorn@8.11.3): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.11.3 + dev: true + + /acorn@8.11.3: + resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + dev: true + + /ajv@8.14.0: + resolution: {integrity: sha512-oYs1UUtO97ZO2lJ4bwnWeQW8/zvOIQLGKcvPTsWmvc2SYgBb+upuNS5NxoLaMU4h8Ju3Nbj6Cq8mD2LQoqVKFA==} + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + dev: true + + /ansi-escapes@6.2.1: + resolution: {integrity: sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==} + engines: {node: '>=14.16'} + dev: true + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: true + + /ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + dev: true + + /ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + dev: true + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + dev: true + + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + dev: true + + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: true + + /array-buffer-byte-length@1.0.1: + resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + is-array-buffer: 3.0.4 + dev: true + + /array-ify@1.0.0: + resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} + dev: true + + /array-includes@3.1.8: + resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + get-intrinsic: 1.2.4 + is-string: 1.0.7 + dev: true + + /array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + dev: true + + /array.prototype.findlastindex@1.2.5: + resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + es-shim-unscopables: 1.0.2 + dev: true + + /array.prototype.flat@1.3.2: + resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-shim-unscopables: 1.0.2 + dev: true + + /array.prototype.flatmap@1.3.2: + resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-shim-unscopables: 1.0.2 + dev: true + + /arraybuffer.prototype.slice@1.0.3: + resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.1 + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + is-array-buffer: 3.0.4 + is-shared-array-buffer: 1.0.3 + dev: true + + /available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + dependencies: + possible-typed-array-names: 1.0.0 + dev: true + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: true + + /brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + dependencies: + balanced-match: 1.0.2 + dev: true + + /braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.1.1 + dev: true + + /call-bind@1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + engines: {node: '>= 0.4'} + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + set-function-length: 1.2.2 + dev: true + + /callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + dev: true + + /chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + dev: true + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + dev: true + + /cli-cursor@4.0.0: + resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + restore-cursor: 4.0.0 + dev: true + + /cli-truncate@4.0.0: + resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} + engines: {node: '>=18'} + dependencies: + slice-ansi: 5.0.0 + string-width: 7.1.0 + dev: true + + /cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: true + + /color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + dev: true + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + dev: true + + /color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + dev: true + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + dev: true + + /colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + dev: true + + /commander@12.1.0: + resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} + engines: {node: '>=18'} + dev: true + + /compare-func@2.0.0: + resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} + dependencies: + array-ify: 1.0.0 + dot-prop: 5.3.0 + dev: true + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + dev: true + + /conventional-changelog-angular@7.0.0: + resolution: {integrity: sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==} + engines: {node: '>=16'} + dependencies: + compare-func: 2.0.0 + dev: true + + /conventional-changelog-conventionalcommits@7.0.2: + resolution: {integrity: sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w==} + engines: {node: '>=16'} + dependencies: + compare-func: 2.0.0 + dev: true + + /conventional-commits-parser@5.0.0: + resolution: {integrity: sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==} + engines: {node: '>=16'} + hasBin: true + dependencies: + JSONStream: 1.3.5 + is-text-path: 2.0.0 + meow: 12.1.1 + split2: 4.2.0 + dev: true + + /cosmiconfig-typescript-loader@5.0.0(@types/node@20.14.0)(cosmiconfig@9.0.0)(typescript@5.4.5): + resolution: {integrity: sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA==} + engines: {node: '>=v16'} + peerDependencies: + '@types/node': '*' + cosmiconfig: '>=8.2' + typescript: '>=4' + dependencies: + '@types/node': 20.14.0 + cosmiconfig: 9.0.0(typescript@5.4.5) + jiti: 1.21.0 + typescript: 5.4.5 + dev: true + + /cosmiconfig@9.0.0(typescript@5.4.5): + resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + env-paths: 2.2.1 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + typescript: 5.4.5 + dev: true + + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: true + + /dargs@8.1.0: + resolution: {integrity: sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==} + engines: {node: '>=12'} + dev: true + + /data-view-buffer@1.0.1: + resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + dev: true + + /data-view-byte-length@1.0.1: + resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + dev: true + + /data-view-byte-offset@1.0.0: + resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + dev: true + + /debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + dev: true + + /debug@4.3.5: + resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: true + + /deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + dev: true + + /define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + gopd: 1.0.1 + dev: true + + /define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + dev: true + + /dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + dependencies: + path-type: 4.0.0 + dev: true + + /doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /dot-prop@5.3.0: + resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} + engines: {node: '>=8'} + dependencies: + is-obj: 2.0.0 + dev: true + + /emoji-regex@10.3.0: + resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} + dev: true + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + dev: true + + /enhanced-resolve@5.16.1: + resolution: {integrity: sha512-4U5pNsuDl0EhuZpq46M5xPslstkviJuhrdobaRDBk2Jy2KO37FDAJl4lb2KlNabxT0m4MTK2UHNrsAcphE8nyw==} + engines: {node: '>=10.13.0'} + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + dev: true + + /entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + dev: true + + /env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + dev: true + + /error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + dependencies: + is-arrayish: 0.2.1 + dev: true + + /es-abstract@1.23.3: + resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.1 + arraybuffer.prototype.slice: 1.0.3 + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + data-view-buffer: 1.0.1 + data-view-byte-length: 1.0.1 + data-view-byte-offset: 1.0.0 + es-define-property: 1.0.0 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + es-set-tostringtag: 2.0.3 + es-to-primitive: 1.2.1 + function.prototype.name: 1.1.6 + get-intrinsic: 1.2.4 + get-symbol-description: 1.0.2 + globalthis: 1.0.4 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.2 + internal-slot: 1.0.7 + is-array-buffer: 3.0.4 + is-callable: 1.2.7 + is-data-view: 1.0.1 + is-negative-zero: 2.0.3 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.3 + is-string: 1.0.7 + is-typed-array: 1.1.13 + is-weakref: 1.0.2 + object-inspect: 1.13.1 + object-keys: 1.1.1 + object.assign: 4.1.5 + regexp.prototype.flags: 1.5.2 + safe-array-concat: 1.1.2 + safe-regex-test: 1.0.3 + string.prototype.trim: 1.2.9 + string.prototype.trimend: 1.0.8 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.2 + typed-array-byte-length: 1.0.1 + typed-array-byte-offset: 1.0.2 + typed-array-length: 1.0.6 + unbox-primitive: 1.0.2 + which-typed-array: 1.1.15 + dev: true + + /es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.4 + dev: true + + /es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + dev: true + + /es-object-atoms@1.0.0: + resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + dev: true + + /es-set-tostringtag@2.0.3: + resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.4 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + dev: true + + /es-shim-unscopables@1.0.2: + resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} + dependencies: + hasown: 2.0.2 + dev: true + + /es-to-primitive@1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + dependencies: + is-callable: 1.2.7 + is-date-object: 1.0.5 + is-symbol: 1.0.4 + dev: true + + /esbuild@0.20.2: + resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/aix-ppc64': 0.20.2 + '@esbuild/android-arm': 0.20.2 + '@esbuild/android-arm64': 0.20.2 + '@esbuild/android-x64': 0.20.2 + '@esbuild/darwin-arm64': 0.20.2 + '@esbuild/darwin-x64': 0.20.2 + '@esbuild/freebsd-arm64': 0.20.2 + '@esbuild/freebsd-x64': 0.20.2 + '@esbuild/linux-arm': 0.20.2 + '@esbuild/linux-arm64': 0.20.2 + '@esbuild/linux-ia32': 0.20.2 + '@esbuild/linux-loong64': 0.20.2 + '@esbuild/linux-mips64el': 0.20.2 + '@esbuild/linux-ppc64': 0.20.2 + '@esbuild/linux-riscv64': 0.20.2 + '@esbuild/linux-s390x': 0.20.2 + '@esbuild/linux-x64': 0.20.2 + '@esbuild/netbsd-x64': 0.20.2 + '@esbuild/openbsd-x64': 0.20.2 + '@esbuild/sunos-x64': 0.20.2 + '@esbuild/win32-arm64': 0.20.2 + '@esbuild/win32-ia32': 0.20.2 + '@esbuild/win32-x64': 0.20.2 + dev: true + + /escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} + dev: true + + /escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + dev: true + + /escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + dev: true + + /eslint-compat-utils@0.5.1(eslint@8.57.0): + resolution: {integrity: sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==} + engines: {node: '>=12'} + peerDependencies: + eslint: '>=6.0.0' + dependencies: + eslint: 8.57.0 + semver: 7.6.2 + dev: true + + /eslint-config-love@51.0.1(@typescript-eslint/parser@7.11.0)(eslint@8.57.0)(typescript@5.4.5): + resolution: {integrity: sha512-VO6Kxi18zuT5WffzLtM7p1T2YmrcgyYFeIy/YBRyUziNok2n6BtfW2d+A+2buh+8LQ8+jKgI4v5LOIVOOLF7XQ==} + peerDependencies: + eslint: ^8.0.1 + typescript: '*' + dependencies: + eslint: 8.57.0 + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.11.0)(eslint@8.57.0) + eslint-plugin-n: 17.7.0(eslint@8.57.0) + eslint-plugin-promise: 6.2.0(eslint@8.57.0) + typescript: 5.4.5 + typescript-eslint: 7.11.0(eslint@8.57.0)(typescript@5.4.5) + transitivePeerDependencies: + - '@typescript-eslint/parser' + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + dev: true + + /eslint-config-prettier@9.1.0(eslint@8.57.0): + resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + dependencies: + eslint: 8.57.0 + dev: true + + /eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + dependencies: + debug: 3.2.7 + is-core-module: 2.13.1 + resolve: 1.22.8 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-module-utils@2.8.1(@typescript-eslint/parser@7.11.0)(eslint-import-resolver-node@0.3.9)(eslint@8.57.0): + resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + dependencies: + '@typescript-eslint/parser': 7.11.0(eslint@8.57.0)(typescript@5.4.5) + debug: 3.2.7 + eslint: 8.57.0 + eslint-import-resolver-node: 0.3.9 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-plugin-es-x@7.6.0(eslint@8.57.0): + resolution: {integrity: sha512-I0AmeNgevgaTR7y2lrVCJmGYF0rjoznpDvqV/kIkZSZbZ8Rw3eu4cGlvBBULScfkSOCzqKbff5LR4CNrV7mZHA==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '>=8' + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@eslint-community/regexpp': 4.10.0 + eslint: 8.57.0 + eslint-compat-utils: 0.5.1(eslint@8.57.0) + dev: true + + /eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.11.0)(eslint@8.57.0): + resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + dependencies: + '@typescript-eslint/parser': 7.11.0(eslint@8.57.0)(typescript@5.4.5) + array-includes: 3.1.8 + array.prototype.findlastindex: 1.2.5 + array.prototype.flat: 1.3.2 + array.prototype.flatmap: 1.3.2 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 8.57.0 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.11.0)(eslint-import-resolver-node@0.3.9)(eslint@8.57.0) + hasown: 2.0.2 + is-core-module: 2.13.1 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.0 + semver: 6.3.1 + tsconfig-paths: 3.15.0 + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + dev: true + + /eslint-plugin-n@17.7.0(eslint@8.57.0): + resolution: {integrity: sha512-4Jg4ZKVE4VjHig2caBqPHYNW5na84RVufUuipFLJbgM/G57O6FdpUKJbHakCDJb/yjQuyqVzYWRtU3HNYaZUwg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: '>=8.23.0' + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + enhanced-resolve: 5.16.1 + eslint: 8.57.0 + eslint-plugin-es-x: 7.6.0(eslint@8.57.0) + get-tsconfig: 4.7.5 + globals: 15.3.0 + ignore: 5.3.1 + minimatch: 9.0.4 + semver: 7.6.2 + dev: true + + /eslint-plugin-prettier@5.1.3(eslint-config-prettier@9.1.0)(eslint@8.57.0)(prettier@3.2.5): + resolution: {integrity: sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + '@types/eslint': '>=8.0.0' + eslint: '>=8.0.0' + eslint-config-prettier: '*' + prettier: '>=3.0.0' + peerDependenciesMeta: + '@types/eslint': + optional: true + eslint-config-prettier: + optional: true + dependencies: + eslint: 8.57.0 + eslint-config-prettier: 9.1.0(eslint@8.57.0) + prettier: 3.2.5 + prettier-linter-helpers: 1.0.0 + synckit: 0.8.8 + dev: true + + /eslint-plugin-promise@6.2.0(eslint@8.57.0): + resolution: {integrity: sha512-QmAqwizauvnKOlifxyDj2ObfULpHQawlg/zQdgEixur9vl0CvZGv/LCJV2rtj3210QCoeGBzVMfMXqGAOr/4fA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 + dependencies: + eslint: 8.57.0 + dev: true + + /eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + dev: true + + /eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /eslint@8.57.0: + resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@eslint-community/regexpp': 4.10.0 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.57.0 + '@humanwhocodes/config-array': 0.11.14 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.2.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.5 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.24.0 + graphemer: 1.4.0 + ignore: 5.3.1 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.11.3 + acorn-jsx: 5.3.2(acorn@8.11.3) + eslint-visitor-keys: 3.4.3 + dev: true + + /esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + dependencies: + estraverse: 5.3.0 + dev: true + + /esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 + dev: true + + /estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + dev: true + + /esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + dev: true + + /eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + dev: true + + /execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + dev: true + + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + dev: true + + /fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + dev: true + + /fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.7 + dev: true + + /fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + dev: true + + /fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + dev: true + + /fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + dependencies: + reusify: 1.0.4 + dev: true + + /file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flat-cache: 3.2.0 + dev: true + + /fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: true + + /find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + dev: true + + /find-up@7.0.0: + resolution: {integrity: sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==} + engines: {node: '>=18'} + dependencies: + locate-path: 7.2.0 + path-exists: 5.0.0 + unicorn-magic: 0.1.0 + dev: true + + /flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flatted: 3.3.1 + keyv: 4.5.4 + rimraf: 3.0.2 + dev: true + + /flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + dev: true + + /for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + dependencies: + is-callable: 1.2.7 + dev: true + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: true + + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + dev: true + + /function.prototype.name@1.1.6: + resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + functions-have-names: 1.2.3 + dev: true + + /functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + dev: true + + /get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + dev: true + + /get-east-asian-width@1.2.0: + resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==} + engines: {node: '>=18'} + dev: true + + /get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.2 + dev: true + + /get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + dev: true + + /get-symbol-description@1.0.2: + resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + dev: true + + /get-tsconfig@4.7.5: + resolution: {integrity: sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==} + dependencies: + resolve-pkg-maps: 1.0.0 + dev: true + + /git-raw-commits@4.0.0: + resolution: {integrity: sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==} + engines: {node: '>=16'} + hasBin: true + dependencies: + dargs: 8.1.0 + meow: 12.1.1 + split2: 4.2.0 + dev: true + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /global-directory@4.0.1: + resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} + engines: {node: '>=18'} + dependencies: + ini: 4.1.1 + dev: true + + /globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 + dev: true + + /globals@15.3.0: + resolution: {integrity: sha512-cCdyVjIUVTtX8ZsPkq1oCsOsLmGIswqnjZYMJJTGaNApj1yHtLSymKhwH51ttirREn75z3p4k051clwg7rvNKA==} + engines: {node: '>=18'} + dev: true + + /globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + dependencies: + define-properties: 1.2.1 + gopd: 1.0.1 + dev: true + + /globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.3.1 + merge2: 1.4.1 + slash: 3.0.0 + dev: true + + /globrex@0.1.2: + resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} + dev: true + + /gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + dependencies: + get-intrinsic: 1.2.4 + dev: true + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + dev: true + + /graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + dev: true + + /has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + dev: true + + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + dev: true + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: true + + /has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + dependencies: + es-define-property: 1.0.0 + dev: true + + /has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + engines: {node: '>= 0.4'} + dev: true + + /has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + dev: true + + /has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: true + + /hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + dependencies: + function-bind: 1.1.2 + dev: true + + /human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + dev: true + + /husky@9.0.11: + resolution: {integrity: sha512-AB6lFlbwwyIqMdHYhwPe+kjOC3Oc5P3nThEoW/AaO2BX3vJDjWPFxYLxokUZOo6RNX20He3AaT8sESs9NJcmEw==} + engines: {node: '>=18'} + hasBin: true + dev: true + + /ignore@5.3.1: + resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + engines: {node: '>= 4'} + dev: true + + /import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + dev: true + + /import-meta-resolve@4.1.0: + resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} + dev: true + + /imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + dev: true + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: true + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: true + + /ini@4.1.1: + resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + + /internal-slot@1.0.7: + resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.0.6 + dev: true + + /is-array-buffer@3.0.4: + resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + dev: true + + /is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + dev: true + + /is-bigint@1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + dependencies: + has-bigints: 1.0.2 + dev: true + + /is-boolean-object@1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + dev: true + + /is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + dev: true + + /is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + dependencies: + hasown: 2.0.2 + dev: true + + /is-data-view@1.0.1: + resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} + engines: {node: '>= 0.4'} + dependencies: + is-typed-array: 1.1.13 + dev: true + + /is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.2 + dev: true + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + dev: true + + /is-fullwidth-code-point@4.0.0: + resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} + engines: {node: '>=12'} + dev: true + + /is-fullwidth-code-point@5.0.0: + resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==} + engines: {node: '>=18'} + dependencies: + get-east-asian-width: 1.2.0 + dev: true + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + dev: true + + /is-number-object@1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.2 + dev: true + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + + /is-obj@2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} + dev: true + + /is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + dev: true + + /is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + dev: true + + /is-shared-array-buffer@1.0.3: + resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + dev: true + + /is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /is-string@1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.2 + dev: true + + /is-symbol@1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: true + + /is-text-path@2.0.0: + resolution: {integrity: sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==} + engines: {node: '>=8'} + dependencies: + text-extensions: 2.4.0 + dev: true + + /is-typed-array@1.1.13: + resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} + engines: {node: '>= 0.4'} + dependencies: + which-typed-array: 1.1.15 + dev: true + + /is-weakref@1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + dependencies: + call-bind: 1.0.7 + dev: true + + /isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + dev: true + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: true + + /jiti@1.21.0: + resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} + hasBin: true + dev: true + + /js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + dev: true + + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + dev: true + + /json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + dev: true + + /json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + dev: true + + /json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + dev: true + + /json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + dev: true + + /json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + dev: true + + /json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + dependencies: + minimist: 1.2.8 + dev: true + + /jsonparse@1.3.1: + resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} + engines: {'0': node >= 0.2.0} + dev: true + + /keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + dependencies: + json-buffer: 3.0.1 + dev: true + + /levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /lilconfig@3.1.1: + resolution: {integrity: sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==} + engines: {node: '>=14'} + dev: true + + /lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + dev: true + + /linkify-it@5.0.0: + resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} + dependencies: + uc.micro: 2.1.0 + dev: true + + /lint-staged@15.2.5: + resolution: {integrity: sha512-j+DfX7W9YUvdzEZl3Rk47FhDF6xwDBV5wwsCPw6BwWZVPYJemusQmvb9bRsW23Sqsaa+vRloAWogbK4BUuU2zA==} + engines: {node: '>=18.12.0'} + hasBin: true + dependencies: + chalk: 5.3.0 + commander: 12.1.0 + debug: 4.3.5 + execa: 8.0.1 + lilconfig: 3.1.1 + listr2: 8.2.1 + micromatch: 4.0.7 + pidtree: 0.6.0 + string-argv: 0.3.2 + yaml: 2.4.3 + transitivePeerDependencies: + - supports-color + dev: true + + /listr2@8.2.1: + resolution: {integrity: sha512-irTfvpib/rNiD637xeevjO2l3Z5loZmuaRi0L0YE5LfijwVY96oyVn0DFD3o/teAok7nfobMG1THvvcHh/BP6g==} + engines: {node: '>=18.0.0'} + dependencies: + cli-truncate: 4.0.0 + colorette: 2.0.20 + eventemitter3: 5.0.1 + log-update: 6.0.0 + rfdc: 1.3.1 + wrap-ansi: 9.0.0 + dev: true + + /locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + dev: true + + /locate-path@7.2.0: + resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + p-locate: 6.0.0 + dev: true + + /lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + dev: true + + /lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + dev: true + + /lodash.kebabcase@4.1.1: + resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==} + dev: true + + /lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + dev: true + + /lodash.mergewith@4.6.2: + resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} + dev: true + + /lodash.snakecase@4.1.1: + resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} + dev: true + + /lodash.startcase@4.4.0: + resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + dev: true + + /lodash.uniq@4.5.0: + resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + dev: true + + /lodash.upperfirst@4.3.1: + resolution: {integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==} + dev: true + + /log-update@6.0.0: + resolution: {integrity: sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==} + engines: {node: '>=18'} + dependencies: + ansi-escapes: 6.2.1 + cli-cursor: 4.0.0 + slice-ansi: 7.1.0 + strip-ansi: 7.1.0 + wrap-ansi: 9.0.0 + dev: true + + /markdown-it@14.1.0: + resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} + hasBin: true + dependencies: + argparse: 2.0.1 + entities: 4.5.0 + linkify-it: 5.0.0 + mdurl: 2.0.0 + punycode.js: 2.3.1 + uc.micro: 2.1.0 + dev: true + + /markdownlint-micromark@0.1.9: + resolution: {integrity: sha512-5hVs/DzAFa8XqYosbEAEg6ok6MF2smDj89ztn9pKkCtdKHVdPQuGMH7frFfYL9mLkvfFe4pTyAMffLbjf3/EyA==} + engines: {node: '>=18'} + dev: true + + /markdownlint@0.34.0: + resolution: {integrity: sha512-qwGyuyKwjkEMOJ10XN6OTKNOVYvOIi35RNvDLNxTof5s8UmyGHlCdpngRHoRGNvQVGuxO3BJ7uNSgdeX166WXw==} + engines: {node: '>=18'} + dependencies: + markdown-it: 14.1.0 + markdownlint-micromark: 0.1.9 + dev: true + + /mdurl@2.0.0: + resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} + dev: true + + /meow@12.1.1: + resolution: {integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==} + engines: {node: '>=16.10'} + dev: true + + /merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + dev: true + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: true + + /micromatch@4.0.7: + resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + dev: true + + /mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + dev: true + + /mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + dev: true + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: true + + /minimatch@9.0.4: + resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + dev: true + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + dev: true + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: true + + /ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + dev: true + + /nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + + /natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + dev: true + + /npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + path-key: 4.0.0 + dev: true + + /object-inspect@1.13.1: + resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + dev: true + + /object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + dev: true + + /object.assign@4.1.5: + resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + has-symbols: 1.0.3 + object-keys: 1.1.1 + dev: true + + /object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + dev: true + + /object.groupby@1.0.3: + resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + dev: true + + /object.values@1.2.0: + resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + dev: true + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + dev: true + + /onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + dependencies: + mimic-fn: 2.1.0 + dev: true + + /onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + dependencies: + mimic-fn: 4.0.0 + dev: true + + /optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + dev: true + + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + dev: true + + /p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + yocto-queue: 1.0.0 + dev: true + + /p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + dev: true + + /p-locate@6.0.0: + resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + p-limit: 4.0.0 + dev: true + + /parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + dev: true + + /parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + dependencies: + '@babel/code-frame': 7.24.6 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + dev: true + + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + dev: true + + /path-exists@5.0.0: + resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + dev: true + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: true + + /path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + dev: true + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true + + /path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + dev: true + + /picocolors@1.0.1: + resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + dev: true + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: true + + /pidtree@0.6.0: + resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} + engines: {node: '>=0.10'} + hasBin: true + dev: true + + /possible-typed-array-names@1.0.0: + resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + engines: {node: '>= 0.4'} + dev: true + + /postcss@8.4.38: + resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.1 + source-map-js: 1.2.0 + dev: true + + /prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + dev: true + + /prettier-linter-helpers@1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} + dependencies: + fast-diff: 1.3.0 + dev: true + + /prettier@3.2.5: + resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} + engines: {node: '>=14'} + hasBin: true + dev: true + + /punycode.js@2.3.1: + resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} + engines: {node: '>=6'} + dev: true + + /punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + dev: true + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true + + /regexp.prototype.flags@1.5.2: + resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-errors: 1.3.0 + set-function-name: 2.0.2 + dev: true + + /require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + dev: true + + /require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + dev: true + + /resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + dev: true + + /resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + dev: true + + /resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + dev: true + + /resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /restore-cursor@4.0.0: + resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + dev: true + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true + + /rfdc@1.3.1: + resolution: {integrity: sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==} + dev: true + + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + + /rollup@4.18.0: + resolution: {integrity: sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + dependencies: + '@types/estree': 1.0.5 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.18.0 + '@rollup/rollup-android-arm64': 4.18.0 + '@rollup/rollup-darwin-arm64': 4.18.0 + '@rollup/rollup-darwin-x64': 4.18.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.18.0 + '@rollup/rollup-linux-arm-musleabihf': 4.18.0 + '@rollup/rollup-linux-arm64-gnu': 4.18.0 + '@rollup/rollup-linux-arm64-musl': 4.18.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.18.0 + '@rollup/rollup-linux-riscv64-gnu': 4.18.0 + '@rollup/rollup-linux-s390x-gnu': 4.18.0 + '@rollup/rollup-linux-x64-gnu': 4.18.0 + '@rollup/rollup-linux-x64-musl': 4.18.0 + '@rollup/rollup-win32-arm64-msvc': 4.18.0 + '@rollup/rollup-win32-ia32-msvc': 4.18.0 + '@rollup/rollup-win32-x64-msvc': 4.18.0 + fsevents: 2.3.3 + dev: true + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: true + + /safe-array-concat@1.1.2: + resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} + engines: {node: '>=0.4'} + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + has-symbols: 1.0.3 + isarray: 2.0.5 + dev: true + + /safe-regex-test@1.0.3: + resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-regex: 1.1.4 + dev: true + + /semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + dev: true + + /semver@7.6.2: + resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==} + engines: {node: '>=10'} + hasBin: true + dev: true + + /set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + dev: true + + /set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + dev: true + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + dev: true + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + dev: true + + /side-channel@1.0.6: + resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + object-inspect: 1.13.1 + dev: true + + /signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + dev: true + + /signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + dev: true + + /slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + dev: true + + /slice-ansi@5.0.0: + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 4.0.0 + dev: true + + /slice-ansi@7.1.0: + resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} + engines: {node: '>=18'} + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 5.0.0 + dev: true + + /source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} + dev: true + + /split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + dev: true + + /string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} + dev: true + + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + dev: true + + /string-width@7.1.0: + resolution: {integrity: sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==} + engines: {node: '>=18'} + dependencies: + emoji-regex: 10.3.0 + get-east-asian-width: 1.2.0 + strip-ansi: 7.1.0 + dev: true + + /string.prototype.trim@1.2.9: + resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + dev: true + + /string.prototype.trimend@1.0.8: + resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + dev: true + + /string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + dev: true + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + dev: true + + /strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.0.1 + dev: true + + /strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + dev: true + + /strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + dev: true + + /strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + dev: true + + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + dev: true + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: true + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: true + + /synckit@0.8.8: + resolution: {integrity: sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==} + engines: {node: ^14.18.0 || >=16.0.0} + dependencies: + '@pkgr/core': 0.1.1 + tslib: 2.6.2 + dev: true + + /tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + dev: true + + /text-extensions@2.4.0: + resolution: {integrity: sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==} + engines: {node: '>=8'} + dev: true + + /text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + dev: true + + /through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + dev: true + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: true + + /ts-api-utils@1.3.0(typescript@5.4.5): + resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + dependencies: + typescript: 5.4.5 + dev: true + + /tsconfck@3.1.0(typescript@5.4.5): + resolution: {integrity: sha512-CMjc5zMnyAjcS9sPLytrbFmj89st2g+JYtY/c02ug4Q+CZaAtCgbyviI0n1YvjZE/pzoc6FbNsINS13DOL1B9w==} + engines: {node: ^18 || >=20} + hasBin: true + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + dependencies: + typescript: 5.4.5 + dev: true + + /tsconfig-paths@3.15.0: + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.2 + minimist: 1.2.8 + strip-bom: 3.0.0 + dev: true + + /tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + dev: true + + /type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + dev: true + + /type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + dev: true + + /typed-array-buffer@1.0.2: + resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-typed-array: 1.1.13 + dev: true + + /typed-array-byte-length@1.0.1: + resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + dev: true + + /typed-array-byte-offset@1.0.2: + resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + dev: true + + /typed-array-length@1.0.6: + resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + possible-typed-array-names: 1.0.0 + dev: true + + /typescript-eslint@7.11.0(eslint@8.57.0)(typescript@5.4.5): + resolution: {integrity: sha512-ZKe3yHF/IS/kCUE4CGE3UgtK+Q7yRk1e9kwEI0rqm9XxMTd9P1eHe0LVVtrZ3oFuIQ2unJ9Xn0vTsLApzJ3aPw==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/eslint-plugin': 7.11.0(@typescript-eslint/parser@7.11.0)(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/parser': 7.11.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/utils': 7.11.0(eslint@8.57.0)(typescript@5.4.5) + eslint: 8.57.0 + typescript: 5.4.5 + transitivePeerDependencies: + - supports-color + dev: true + + /typescript@5.4.5: + resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} + engines: {node: '>=14.17'} + hasBin: true + dev: true + + /uc.micro@2.1.0: + resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} + dev: true + + /unbox-primitive@1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + dependencies: + call-bind: 1.0.7 + has-bigints: 1.0.2 + has-symbols: 1.0.3 + which-boxed-primitive: 1.0.2 + dev: true + + /undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + dev: true + + /unicorn-magic@0.1.0: + resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} + engines: {node: '>=18'} + dev: true + + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.3.1 + dev: true + + /vite-tsconfig-paths@4.3.2(typescript@5.4.5)(vite@5.2.12): + resolution: {integrity: sha512-0Vd/a6po6Q+86rPlntHye7F31zA2URZMbH8M3saAZ/xR9QoGN/L21bxEGfXdWmFdNkqPpRdxFT7nmNe12e9/uA==} + peerDependencies: + vite: '*' + peerDependenciesMeta: + vite: + optional: true + dependencies: + debug: 4.3.5 + globrex: 0.1.2 + tsconfck: 3.1.0(typescript@5.4.5) + vite: 5.2.12(@types/node@20.14.0) + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /vite@5.2.12(@types/node@20.14.0): + resolution: {integrity: sha512-/gC8GxzxMK5ntBwb48pR32GGhENnjtY30G4A0jemunsBkiEZFw60s8InGpN8gkhHEkjnRK1aSAxeQgwvFhUHAA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 20.14.0 + esbuild: 0.20.2 + postcss: 8.4.38 + rollup: 4.18.0 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + dependencies: + is-bigint: 1.0.4 + is-boolean-object: 1.1.2 + is-number-object: 1.0.7 + is-string: 1.0.7 + is-symbol: 1.0.4 + dev: true + + /which-typed-array@1.1.15: + resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.2 + dev: true + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + dev: true + + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /wrap-ansi@9.0.0: + resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} + engines: {node: '>=18'} + dependencies: + ansi-styles: 6.2.1 + string-width: 7.1.0 + strip-ansi: 7.1.0 + dev: true + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: true + + /y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + dev: true + + /yaml@2.4.3: + resolution: {integrity: sha512-sntgmxj8o7DE7g/Qi60cqpLBA3HG3STcDA0kO+WfB05jEKhZMbY7umNm2rBpQvsmZ16/lPXCJGW2672dgOUkrg==} + engines: {node: '>= 14'} + hasBin: true + dev: true + + /yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + dev: true + + /yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + dependencies: + cliui: 8.0.1 + escalade: 3.1.2 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + dev: true + + /yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + dev: true + + /yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + dev: true diff --git a/src/config/cli.ts b/src/config/cli.ts deleted file mode 100644 index 88f970f..0000000 --- a/src/config/cli.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { huskybc } from '@/constants/huskybc' -import { VERSION } from '@/constants/version' - -export function configureCLI() { - huskybc - .description('Command line for easy Husky configuration') - .version(VERSION) - .showHelpAfterError() -} diff --git a/src/config/options.ts b/src/config/options.ts deleted file mode 100644 index f534b80..0000000 --- a/src/config/options.ts +++ /dev/null @@ -1,27 +0,0 @@ -// Constants -import { huskybc } from '@/constants/huskybc' - -// Controllers -import { - handlerOptionBuild, - handlerOptionCollaborate -} from '@/controllers/handlers-options' - -export function configureOptions() { - huskybc - .option( - '-co, --collaborate', - 'Open GitHub repository for collaboration', - handlerOptionCollaborate - ) - .option('-b, --build', "Start Husky's configuration", handlerOptionBuild) -} - -export function configureDefaultOption() { - const options = huskybc.opts() - - // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions - if (!options.build && !options.collaborate && !options.b && !options.co) { - huskybc.help() - } -} diff --git a/src/constants/commitlint.ts b/src/constants/commitlint.ts deleted file mode 100644 index 8081543..0000000 --- a/src/constants/commitlint.ts +++ /dev/null @@ -1,8 +0,0 @@ -import type { PackageManager } from '@/types/package-manger' - -export const COMMITLINT_CONFIG: Record = { - npm: 'npx --no -- commitlint --edit $1', - pnpm: 'pnpm dlx commitlint --edit $1', - yarn: 'yarn dlx commitlint --edit $1', - bun: 'bunx commitlint --edit $1' -} diff --git a/src/constants/dependencies.ts b/src/constants/dependencies.ts deleted file mode 100644 index f948848..0000000 --- a/src/constants/dependencies.ts +++ /dev/null @@ -1,8 +0,0 @@ -import type { PackageManager } from '@/types/package-manger' - -export const INSTALLATION_COMMANDS: Record = { - npm: 'install', - yarn: 'add', - pnpm: 'add', - bun: 'add' -} diff --git a/src/constants/encoding.ts b/src/constants/encoding.ts deleted file mode 100644 index 2b596cc..0000000 --- a/src/constants/encoding.ts +++ /dev/null @@ -1 +0,0 @@ -export const UTF8_ENCODING: BufferEncoding = 'utf-8' diff --git a/src/constants/errors.ts b/src/constants/errors.ts deleted file mode 100644 index a3ba4fb..0000000 --- a/src/constants/errors.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { ISSUES } from './github' - -export const ERROR_MESSAGES = { - NotFound: "The package.json file wasn't found in the current directory.", - - Default: `Something went wrong, please try again later, if the error persists please report it on ${ISSUES}.`, - - Dependencies: `An error occurred while installing dependencies, please try again later, if the error persists please report it on ${ISSUES}.`, - - Commitlint: `An error has occurred during the Commitlint configuration process, please try again later, if the error persists please report it on ${ISSUES}.`, - Husky: `An error has occurred during the Husky configuration process, please try again later, if the error persists please report it on ${ISSUES}.`, - - PackageManagerSelection: `An error occurred while selecting the package manager, please try again later, if the error persists, please report it on ${ISSUES}.`, - - CommitlintSelection: `An error occurred while determining your choice for Commitlint, please try again later, if the error persists, please report it on ${ISSUES}.`, - - AddScript: `An error occurred while adding a script to the package.json file, please try again later, if the error persists, please report it on ${ISSUES}.`, - - CreateFolder: `An error occurred while creating the folder: {folderName}, please try again later, if the error persists, please report it on ${ISSUES}.`, - - CheckFileExists: `An error occurred while checking if the file/folder exists, please try again later, if the error persists, please report it on ${ISSUES}.`, - - PublishConfirmation: `An error occurred while confirming npm publication. Please try again later, if the error persists, please report it on ${ISSUES}.`, - - CheckSection: `An error occurred while checking for a section in package.json. Please try again later, if the error persists, please report it on ${ISSUES}.`, - - CreateSection: `An error occurred while creating a section in package.json. Please try again later, if the error persists, please report it on ${ISSUES}.`, - - NpmIgnoreWrite: `An error occurred while writing to the '.npmignore' file. Please try again later, if the error persists please report it on ${ISSUES}.`, - - EmptyFileCreate: `An error occurred while creating the empty file: {fileName}. Please try again later, if the error persists please report it on ${ISSUES}.` -} as const diff --git a/src/constants/github.ts b/src/constants/github.ts deleted file mode 100644 index 4d05e80..0000000 --- a/src/constants/github.ts +++ /dev/null @@ -1,2 +0,0 @@ -export const REPOSITORY = 'https://github.com/RaulCatalinas/HuskyBC' -export const ISSUES = `${REPOSITORY}/issues` diff --git a/src/constants/huskybc.ts b/src/constants/huskybc.ts deleted file mode 100644 index 4b15ef0..0000000 --- a/src/constants/huskybc.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { Command } from 'commander' - -export const huskybc = new Command('HuskyBC') diff --git a/src/constants/lint-staged.ts b/src/constants/lint-staged.ts deleted file mode 100644 index aa7b823..0000000 --- a/src/constants/lint-staged.ts +++ /dev/null @@ -1,8 +0,0 @@ -import type { PackageManager } from '@/types/package-manger' - -export const LINT_STAGED_CONFIG: Record = { - npm: 'npx lint-staged', - pnpm: 'pnpm dlx lint-staged', - yarn: 'yarn dlx lint-staged', - bun: 'bunx lint-staged' -} diff --git a/src/constants/package-mangers.ts b/src/constants/package-mangers.ts deleted file mode 100644 index 9435331..0000000 --- a/src/constants/package-mangers.ts +++ /dev/null @@ -1 +0,0 @@ -export const PACKAGE_MANGERS = ['npm', 'yarn', 'pnpm', 'bun'] as const diff --git a/src/constants/regex.ts b/src/constants/regex.ts deleted file mode 100644 index d05e555..0000000 --- a/src/constants/regex.ts +++ /dev/null @@ -1 +0,0 @@ -export const SPECIAL_CHARS_REGEX = /[\r\n\t\f\v]/g diff --git a/src/constants/version.ts b/src/constants/version.ts deleted file mode 100644 index 351b56d..0000000 --- a/src/constants/version.ts +++ /dev/null @@ -1,3 +0,0 @@ -import type { Version } from '@/types/version' - -export const VERSION: Version = '1.0.0' diff --git a/src/controllers/handlers-options.ts b/src/controllers/handlers-options.ts deleted file mode 100644 index 3b0cff8..0000000 --- a/src/controllers/handlers-options.ts +++ /dev/null @@ -1,73 +0,0 @@ -// Constants -import { REPOSITORY } from '@/constants/github' - -// Third-Party libraries -import opener from 'opener' - -// Utils -import { generateCommitlintConfig } from '@/utils/commitlint' -import { writeMessage } from '@/utils/console' -import { getErrorMessage } from '@/utils/errors' -import { generateHuskyConfig } from '@/utils/husky-library' -import { exists } from '@/utils/user-os' - -// NodeJS -import process from 'node:process' - -// User-Input -import { addCommitlint } from '@/user-input/add-commitlint' -import { shouldPublishToNPM } from '@/user-input/npm' -import { getPackageManger } from '@/user-input/package-managers' - -export const handlerOptionBuild = async () => { - try { - const packageJsonPath = `${process.cwd()}/package.json` - - const existPackageJsonInTheCurrentDirectory = await exists(packageJsonPath) - - if (!existPackageJsonInTheCurrentDirectory) { - writeMessage({ - type: 'error', - message: getErrorMessage('NotFound') - }) - - process.exit(1) - } - - const packageManagerToUse = await getPackageManger() - - const shouldPublishToNpm = await shouldPublishToNPM() - - const useCommitlint = await addCommitlint() - - await generateHuskyConfig({ - packageManagerToUse, - packageJsonPath, - useCommitlint, - shouldPublishToNpm - }) - - if (useCommitlint) { - await generateCommitlintConfig({ - packageManagerToUse, - packageJsonPath, - shouldPublishToNpm - }) - } - } catch { - writeMessage({ - type: 'error', - message: getErrorMessage('Default') - }) - process.exit(1) - } -} - -export const handlerOptionCollaborate = () => { - writeMessage({ - type: 'info', - message: 'Opening the GitHub repository...' - }) - - setTimeout(() => opener(REPOSITORY), 500) -} diff --git a/src/index.ts b/src/index.ts deleted file mode 100644 index 608591a..0000000 --- a/src/index.ts +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/env node - -// Config -import { configureCLI } from './config/cli' -import { configureDefaultOption, configureOptions } from './config/options' - -// Constants -import { huskybc } from './constants/huskybc' - -configureCLI() -configureOptions() - -huskybc.parse() - -configureDefaultOption() diff --git a/src/types/message.d.ts b/src/types/message.d.ts deleted file mode 100644 index eada7f8..0000000 --- a/src/types/message.d.ts +++ /dev/null @@ -1 +0,0 @@ -export type MessageType = 'success' | 'error' | 'info' | 'config' diff --git a/src/types/package-json.d.ts b/src/types/package-json.d.ts deleted file mode 100644 index c389c96..0000000 --- a/src/types/package-json.d.ts +++ /dev/null @@ -1,14 +0,0 @@ -export interface PackageJson { - name: string - module: string - type: string - version: string - scripts: Record - dependencies: Record - devDependencies: Record -} - -export interface PackageJsonScript { - key: string - value: string -} diff --git a/src/types/package-manger.d.ts b/src/types/package-manger.d.ts deleted file mode 100644 index 4578247..0000000 --- a/src/types/package-manger.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import type { PACKAGE_MANGERS } from '@/constants/package-mangers' - -export type PackageManager = (typeof PACKAGE_MANGERS)[number] diff --git a/src/types/version.d.ts b/src/types/version.d.ts deleted file mode 100644 index cdc91cd..0000000 --- a/src/types/version.d.ts +++ /dev/null @@ -1 +0,0 @@ -export type Version = `${number}.${number}.${number}` diff --git a/src/user-input/add-commitlint.ts b/src/user-input/add-commitlint.ts deleted file mode 100644 index f3b69d5..0000000 --- a/src/user-input/add-commitlint.ts +++ /dev/null @@ -1,28 +0,0 @@ -// Third-Party libraries -import inquirer from 'inquirer' - -// NodeJS -import process from 'node:process' - -// Utils -import { writeMessage } from '@/utils/console' -import { getErrorMessage } from '@/utils/errors' - -export async function addCommitlint(): Promise { - try { - const { addCommitlint } = await inquirer.prompt({ - type: 'confirm', - default: true, - name: 'addCommitlint', - message: 'Do you wanna add commitlint?:' - }) - - return addCommitlint - } catch { - writeMessage({ - type: 'error', - message: getErrorMessage('CommitlintSelection') - }) - process.exit(1) - } -} diff --git a/src/user-input/npm.ts b/src/user-input/npm.ts deleted file mode 100644 index 816d257..0000000 --- a/src/user-input/npm.ts +++ /dev/null @@ -1,28 +0,0 @@ -// Third-Party libraries -import inquirer from 'inquirer' - -// NodeJS -import process from 'node:process' - -// Utils -import { writeMessage } from '@/utils/console' -import { getErrorMessage } from '@/utils/errors' - -export async function shouldPublishToNPM(): Promise { - try { - const { shouldPublishToNPM } = await inquirer.prompt({ - type: 'confirm', - default: false, - name: 'shouldPublishToNPM', - message: 'Will you publish it on npm?:' - }) - - return shouldPublishToNPM - } catch { - writeMessage({ - type: 'error', - message: getErrorMessage('PublishConfirmation') - }) - process.exit(1) - } -} diff --git a/src/user-input/package-managers.ts b/src/user-input/package-managers.ts deleted file mode 100644 index b7f453b..0000000 --- a/src/user-input/package-managers.ts +++ /dev/null @@ -1,34 +0,0 @@ -// Constants -import { PACKAGE_MANGERS } from '@/constants/package-mangers' - -// Third-Party libraries -import inquirer from 'inquirer' - -// Types -import type { PackageManager } from '@/types/package-manger' - -// NodeJS -import process from 'node:process' - -// Utils -import { writeMessage } from '@/utils/console' -import { getErrorMessage } from '@/utils/errors' - -export async function getPackageManger(): Promise { - try { - const { packageManager } = await inquirer.prompt({ - type: 'rawlist', - choices: PACKAGE_MANGERS, - message: 'Which package manager do you wanna use?', - name: 'packageManager' - }) - - return packageManager - } catch (error) { - writeMessage({ - type: 'error', - message: getErrorMessage('PackageManagerSelection') - }) - process.exit(1) - } -} diff --git a/src/utils/commitlint.ts b/src/utils/commitlint.ts deleted file mode 100644 index 719c8c3..0000000 --- a/src/utils/commitlint.ts +++ /dev/null @@ -1,120 +0,0 @@ -// Types -import type { PackageManager } from '@/types/package-manger' - -// NodeJS -import fs from 'node:fs/promises' - -// Constants -import { COMMITLINT_CONFIG } from '@/constants/commitlint' -import { UTF8_ENCODING } from '@/constants/encoding' - -// Utils -import { writeMessage } from './console' -import { installDependencies } from './dependencies' -import { getErrorMessage } from './errors' -import { modifyNpmIgnore } from './npm' -import { addScript } from './package-json' - -interface Props { - packageManagerToUse: PackageManager - packageJsonPath: string - shouldPublishToNpm: boolean -} - -export async function generateCommitlintConfig({ - packageManagerToUse, - packageJsonPath, - shouldPublishToNpm -}: Props) { - try { - writeMessage({ - type: 'config', - message: 'Configuring commitlint...' - }) - - await Promise.all( - [ - installDependencies({ - packageManagerToUse, - packagesToInstall: [ - 'lint-staged', - '@commitlint/cli', - '@commitlint/config-conventional' - ] - }), - - addScript({ - packageJsonPath, - scriptsToAdd: [ - { key: 'lint', value: 'eslint src' }, - { key: 'lint:fix', value: 'eslint src --fix' }, - { key: 'format', value: 'prettier src --check' }, - { key: 'format:write', value: 'prettier src --write' } - ] - }), - - createCommitlintConfigFiles(packageManagerToUse), - - shouldPublishToNpm - ? modifyNpmIgnore(['.lintstagedrc', 'commitlint.config.js']) - : null - ].filter(promise => promise != null) - ) - - writeMessage({ - type: 'success', - message: "commitlint's configuration generated successfully" - }) - } catch (error) { - writeMessage({ - type: 'error', - message: getErrorMessage('Commitlint') - }) - - process.exit(1) - } -} - -async function createCommitlintConfigFiles( - packageManagerToUse: PackageManager -) { - writeMessage({ - type: 'info', - message: 'Creating configuration files...' - }) - - await Promise.all([ - fs.writeFile('.husky/commit-msg', COMMITLINT_CONFIG[packageManagerToUse], { - encoding: UTF8_ENCODING - }), - fs.writeFile( - 'commitlint.config.js', - "export default { extends: ['@commitlint/config-conventional'] }", - { - encoding: UTF8_ENCODING - } - ), - fs.writeFile( - '.lintstagedrc', - JSON.stringify( - { - 'src/**/*.{astro,html,js,jsx,md,mdx,svelte,ts,tsx,vue}': [ - 'prettier src --check', - 'eslint src --max-warnings 0' - ] - }, - null, - 2 - ), - { - encoding: UTF8_ENCODING - } - ) - ]) - - writeMessage({ - type: 'success', - message: - 'Configuration files (commit-msg, commitlint.config.js and .lintstagedrc) created successfully' - }) -} diff --git a/src/utils/console.ts b/src/utils/console.ts deleted file mode 100644 index e9e5b3d..0000000 --- a/src/utils/console.ts +++ /dev/null @@ -1,20 +0,0 @@ -// Third-Party libraries -import chalk from 'chalk' - -// Constants -import type { ERROR_MESSAGES } from '@/constants/errors' - -// Types -import type { MessageType } from '@/types/message' - -interface Props { - type: MessageType - message: typeof ERROR_MESSAGES | string -} - -export function writeMessage({ type, message }: Props) { - if (type === 'success') console.log(chalk.green(message)) - if (type === 'info') console.log(chalk.blue(message)) - if (type === 'error') console.log(chalk.red(message)) - if (type === 'config') console.log(chalk.white(message)) -} diff --git a/src/utils/dependencies.ts b/src/utils/dependencies.ts deleted file mode 100644 index c746be5..0000000 --- a/src/utils/dependencies.ts +++ /dev/null @@ -1,50 +0,0 @@ -// Types -import type { PackageManager } from '@/types/package-manger' - -// Constants -import { INSTALLATION_COMMANDS } from '@/constants/dependencies' - -// Third-Party libraries -import promiseSpawn from '@npmcli/promise-spawn' - -// NodeJS -import process from 'node:process' - -// Utils -import { writeMessage } from './console' -import { getErrorMessage } from './errors' - -interface Props { - packageManagerToUse: PackageManager - packagesToInstall: string | string[] -} - -export async function installDependencies({ - packageManagerToUse, - packagesToInstall -}: Props) { - try { - const installationCommand = INSTALLATION_COMMANDS[packageManagerToUse] - - writeMessage({ - type: 'info', - message: `Installing dependencies using: ${packageManagerToUse}...` - }) - - await promiseSpawn( - packageManagerToUse, - [installationCommand, packagesToInstall, '-D'].flat() - ) - - writeMessage({ - type: 'success', - message: 'Dependencies installed successfully' - }) - } catch (error) { - writeMessage({ - type: 'error', - message: getErrorMessage('Dependencies') - }) - process.exit(1) - } -} diff --git a/src/utils/errors.ts b/src/utils/errors.ts deleted file mode 100644 index 426b6e1..0000000 --- a/src/utils/errors.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { ERROR_MESSAGES } from '@/constants/errors' - -export function getErrorMessage(error: keyof typeof ERROR_MESSAGES) { - return ERROR_MESSAGES[error] -} diff --git a/src/utils/husky-library.ts b/src/utils/husky-library.ts deleted file mode 100644 index 9be42a8..0000000 --- a/src/utils/husky-library.ts +++ /dev/null @@ -1,131 +0,0 @@ -// Types -import type { PackageJsonScript } from '@/types/package-json' -import type { PackageManager } from '@/types/package-manger' - -// Utils -import { writeMessage } from './console' -import { installDependencies } from './dependencies' -import { getErrorMessage } from './errors' -import { modifyNpmIgnore } from './npm' -import { addScript } from './package-json' -import { createFolder, exists } from './user-os' - -// NodeJS -import fs from 'node:fs/promises' -import process from 'node:process' - -// Constants -import { UTF8_ENCODING } from '@/constants/encoding' -import { LINT_STAGED_CONFIG } from '@/constants/lint-staged' - -interface Props { - packageManagerToUse: PackageManager - packageJsonPath: string - useCommitlint: boolean - shouldPublishToNpm: boolean -} - -type AddNecessaryScriptsToPackageJsonProps = Omit -type CreateHuskyConfigFiles = Pick< - Props, - 'packageManagerToUse' | 'useCommitlint' -> - -export async function generateHuskyConfig({ - packageManagerToUse, - packageJsonPath, - useCommitlint, - shouldPublishToNpm -}: Props) { - try { - writeMessage({ - type: 'config', - message: "Generating Husky's configuration..." - }) - - await Promise.all( - [ - installDependencies({ - packageManagerToUse, - packagesToInstall: 'husky' - }), - - createHuskyConfigFiles({ packageManagerToUse, useCommitlint }), - - addNecessaryScriptsToPackageJson({ - packageJsonPath, - packageManagerToUse, - shouldPublishToNpm - }), - - shouldPublishToNpm ? modifyNpmIgnore('.husky') : null - ].filter(promise => promise != null) - ) - - writeMessage({ - type: 'success', - message: "Husky's configuration generated successfully" - }) - } catch { - writeMessage({ - type: 'error', - message: getErrorMessage('Husky') - }) - - process.exit(1) - } -} - -async function createHuskyConfigFiles({ - packageManagerToUse, - useCommitlint -}: CreateHuskyConfigFiles) { - writeMessage({ - type: 'info', - message: 'Creating configuration file...' - }) - - const existsHuskyFolder = await exists(`${process.cwd()}/.husky`) - - if (!existsHuskyFolder) { - await createFolder('.husky') - } - - const preCommitFileValue = useCommitlint - ? LINT_STAGED_CONFIG[packageManagerToUse] - : `${packageManagerToUse} test` - - await fs.writeFile('.husky/pre-commit', preCommitFileValue, { - encoding: UTF8_ENCODING - }) - - writeMessage({ - type: 'success', - message: 'Configuration file (pre-commit) created successfully' - }) -} - -async function addNecessaryScriptsToPackageJson({ - packageJsonPath, - packageManagerToUse, - shouldPublishToNpm -}: AddNecessaryScriptsToPackageJsonProps) { - const huskyScriptsForYarn: PackageJsonScript | PackageJsonScript[] = - !shouldPublishToNpm - ? { key: 'postinstall', value: 'husky' } - : [ - { key: 'postinstall', value: 'husky' }, - { key: 'prepack', value: 'pinst --disable' }, - { key: 'postpack', value: 'pinst --enable' } - ] - - const scriptsToAdd: PackageJsonScript | PackageJsonScript[] = - packageManagerToUse !== 'yarn' - ? { key: 'prepare', value: 'husky' } - : huskyScriptsForYarn - - await addScript({ - packageJsonPath, - scriptsToAdd - }) -} diff --git a/src/utils/npm.ts b/src/utils/npm.ts deleted file mode 100644 index d57075a..0000000 --- a/src/utils/npm.ts +++ /dev/null @@ -1,77 +0,0 @@ -// NodeJS -import fs from 'node:fs/promises' -import process from 'node:process' - -// Constants -import { UTF8_ENCODING } from '@/constants/encoding' -import { SPECIAL_CHARS_REGEX } from '@/constants/regex' - -// Utils -import { writeMessage } from './console' -import { getErrorMessage } from './errors' -import { createEmptyFile, exists } from './user-os' - -export async function modifyNpmIgnore(filesToAdd: string | string[]) { - try { - writeMessage({ - type: 'info', - message: 'Writing in the file ".npmignore"...' - }) - - const npmIgnoreFilePath = `${process.cwd()}/.npmignore` - - const existsNpmIgnoreFile = await exists(npmIgnoreFilePath) - - if (!existsNpmIgnoreFile) { - await createEmptyFile('.npmignore') - } - - const ignoredFiles = await fs.readFile(npmIgnoreFilePath, { - encoding: UTF8_ENCODING - }) - - if (ignoredFiles === '') { - const filesToAddIsAnArray = Array.isArray(filesToAdd) - - await fs.writeFile( - npmIgnoreFilePath, - filesToAddIsAnArray ? filesToAdd.join('\n') : filesToAdd, - { - encoding: UTF8_ENCODING - } - ) - - writeMessage({ - type: 'info', - message: '".npmignore" file modified successfully' - }) - - return - } - - const ignoredFilesArray = ignoredFiles - .split('\n') - .filter(ignoreFile => ignoreFile !== '') - .map(ignoreFile => ignoreFile.trim().replace(SPECIAL_CHARS_REGEX, '')) - - await fs.writeFile( - npmIgnoreFilePath, - ignoredFilesArray.concat(filesToAdd).join('\n'), - { - encoding: UTF8_ENCODING - } - ) - - writeMessage({ - type: 'info', - message: '".npmignore" file modified successfully' - }) - } catch { - writeMessage({ - type: 'error', - message: getErrorMessage('NpmIgnoreWrite') - }) - - process.exit(1) - } -} diff --git a/src/utils/package-json.ts b/src/utils/package-json.ts deleted file mode 100644 index 066f330..0000000 --- a/src/utils/package-json.ts +++ /dev/null @@ -1,144 +0,0 @@ -// NodeJS -import fs from 'node:fs/promises' -import process from 'node:process' - -// Constants -import { UTF8_ENCODING } from '@/constants/encoding' - -// Types -import type { PackageJson, PackageJsonScript } from '@/types/package-json' - -// Utils -import { writeMessage } from './console' -import { getErrorMessage } from './errors' - -interface Props { - packageJsonPath: string - scriptsToAdd: PackageJsonScript | PackageJsonScript[] -} - -type ExistsSectionProps = Pick & { - sectionToCheck: string -} - -type CreateEmptySectionProps = Pick & { - sectionToCreate: string -} - -export async function addScript({ scriptsToAdd, packageJsonPath }: Props) { - try { - writeMessage({ - type: 'info', - message: 'Modifying package.json...' - }) - - const existsScriptsSection = await existsSection({ - packageJsonPath, - sectionToCheck: 'scripts' - }) - - if (!existsScriptsSection) { - await createEmptySection({ packageJsonPath, sectionToCreate: 'scripts' }) - } - - const packageJsonData = await fs.readFile(packageJsonPath, { - encoding: UTF8_ENCODING - }) - - const packageJsonObj: PackageJson = JSON.parse(packageJsonData) - - const scriptsToAddIsAnArray = Array.isArray(scriptsToAdd) - - if (scriptsToAddIsAnArray) { - for (const { key, value } of scriptsToAdd) { - packageJsonObj.scripts[key] = value - } - - await fs.writeFile( - packageJsonPath, - JSON.stringify(packageJsonObj, null, 2), - { - encoding: UTF8_ENCODING - } - ) - - return - } - - const { key, value } = scriptsToAdd - - packageJsonObj.scripts[key] = value - - await fs.writeFile( - packageJsonPath, - JSON.stringify(packageJsonObj, null, 2), - { - encoding: UTF8_ENCODING - } - ) - - writeMessage({ - type: 'success', - message: 'package.json modified successfully' - }) - } catch { - writeMessage({ - type: 'error', - message: getErrorMessage('AddScript') - }) - - process.exit(1) - } -} - -async function existsSection({ - packageJsonPath, - sectionToCheck -}: ExistsSectionProps) { - try { - const packageJsonData = await fs.readFile(packageJsonPath, { - encoding: UTF8_ENCODING - }) - - const packageJsonObj = JSON.parse(packageJsonData) - - return packageJsonObj[sectionToCheck] !== undefined - } catch { - writeMessage({ - type: 'error', - message: getErrorMessage('CheckSection') - }) - - process.exit(1) - } -} - -async function createEmptySection({ - packageJsonPath, - sectionToCreate -}: CreateEmptySectionProps) { - try { - const packageJsonData = await fs.readFile(packageJsonPath, { - encoding: UTF8_ENCODING - }) - - const packageJsonObj = JSON.parse(packageJsonData) - - packageJsonObj[sectionToCreate] = {} - - await fs.writeFile( - packageJsonPath, - JSON.stringify(packageJsonObj, null, 2), - { - encoding: UTF8_ENCODING - } - ) - } catch { - writeMessage({ - type: 'error', - message: getErrorMessage('CreateSection') - }) - - process.exit(1) - } -} diff --git a/src/utils/user-os.ts b/src/utils/user-os.ts deleted file mode 100644 index 624f3fd..0000000 --- a/src/utils/user-os.ts +++ /dev/null @@ -1,56 +0,0 @@ -// NodeJS -import fs from 'node:fs/promises' -import process from 'node:process' - -// Utils -import { writeMessage } from './console' -import { getErrorMessage } from './errors' - -// Third-Party libraries -import { exists as existsFolderOrFile } from 'fs-extra' - -// Constants -import { UTF8_ENCODING } from '@/constants/encoding' - -export async function exists(path: string) { - try { - return await existsFolderOrFile(path) - } catch { - writeMessage({ - type: 'error', - message: getErrorMessage('CheckFileExists') - }) - - process.exit(1) - } -} - -export async function createFolder(name: string) { - try { - await fs.mkdir(`${process.cwd()}/${name}`) - } catch { - const errorMessage = getErrorMessage('CreateFolder') - - writeMessage({ - type: 'error', - message: errorMessage.replace('{folderName}', name) - }) - process.exit(1) - } -} - -export async function createEmptyFile(fileName: string) { - try { - await fs.writeFile(`${process.cwd()}/${fileName}`, '', { - encoding: UTF8_ENCODING - }) - } catch { - const errorMessage = getErrorMessage('EmptyFileCreate') - - writeMessage({ - type: 'error', - message: errorMessage.replace('{fileName}', fileName) - }) - process.exit(1) - } -} diff --git a/tsconfig.json b/tsconfig.json deleted file mode 100644 index 2ddef32..0000000 --- a/tsconfig.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "compilerOptions": { - // Enable latest features - "lib": ["ESNext", "DOM"], - "target": "ESNext", - "module": "ESNext", - - // Bundler mode - "moduleResolution": "bundler", - "noEmit": true, - - // Best practices - "strict": true, - "skipLibCheck": true, - "noFallthroughCasesInSwitch": true, - - // Import alias - "baseUrl": "./", - "paths": { - "@/*": ["src/*"] - } - } -} diff --git a/vite.config.ts b/vite.config.ts deleted file mode 100644 index a2c8c80..0000000 --- a/vite.config.ts +++ /dev/null @@ -1,23 +0,0 @@ -// Vite -import { defineConfig } from 'vite' - -// Plugins -import tsConfigPaths from 'vite-tsconfig-paths' - -// https://vitejs.dev/config/ -export default defineConfig({ - plugins: [tsConfigPaths()], - ssr: { - // bundle and treeshake everything - noExternal: true - }, - build: { - ssr: true, - lib: { - entry: ['src/index.ts'], - formats: ['cjs'] - }, - outDir: 'dist', - minify: true - } -})