detached 4333716

wip

commit
43337169d19d7b1090faed0c48b9ab5ffb28eb99
author
bamen · · 2025-06-02 15:05 UTC
parent
f30976a
signature
unsigned
1607 files · +178060 -7862
M .gitignore +7 -2
@@ -1,9 +1,10 @@
11 .env
2-node_modules/
2+# Node.js/Bun specific (removed)
3+# node_modules/
34 *tmp/
45 tmp/*
56 config.yml
6-bun.lockb
7+# bun.lockb
78 *.log
89 *.txt
910 *sync-conflict*
@@ -16,3 +17,7 @@ setup.sh
1617 sqlite.db
1718 .vscode/
1819 admin-ui/
20+
21+# Standalone Tailwind/DaisyUI
22+tailwindcss
23+daisyui.js
@@ -1,9 +1,10 @@
1 .env1 .env
2-node_modules/2+# Node.js/Bun specific (removed)
3+# node_modules/
3 *tmp/4 *tmp/
4 tmp/*5 tmp/*
5 config.yml6 config.yml
6-bun.lockb7+# bun.lockb
7 *.log8 *.log
8 *.txt9 *.txt
9 *sync-conflict*10 *sync-conflict*
@@ -16,3 +17,7 @@ setup.sh
16 sqlite.db17 sqlite.db
17 .vscode/18 .vscode/
18 admin-ui/19 admin-ui/
20+
21+# Standalone Tailwind/DaisyUI
22+tailwindcss
23+daisyui.js
M .goreleaser.yaml +1 -1
@@ -4,7 +4,7 @@ before:
44 hooks:
55 - go mod tidy
66 - templ generate
7- - bun run build:css
7+ - tailwindcss -i internal/webui/public/assets/css/custom.css -o internal/webui/public/assets/css/tailwind.css
88
99 release:
1010 draft: true
@@ -4,7 +4,7 @@ before:
4 hooks:4 hooks:
5 - go mod tidy5 - go mod tidy
6 - templ generate6 - templ generate
7- - bun run build:css7+ - tailwindcss -i internal/webui/public/assets/css/custom.css -o internal/webui/public/assets/css/tailwind.css
8 8
9 release:9 release:
10 draft: true10 draft: true
M Makefile +1 -1
@@ -38,7 +38,7 @@ build: build-css build-templ
3838 # Build CSS with tailwindcss
3939 build-css:
4040 @echo "Building CSS with tailwindcss..."
41- @bun run build:css
41+ @tailwindcss -i internal/webui/public/assets/css/custom.css -o internal/webui/public/assets/css/tailwind.css
4242 @echo "CSS built successfully"
4343
4444 # Generate Go code from templ templates
@@ -38,7 +38,7 @@ build: build-css build-templ
38 # Build CSS with tailwindcss38 # Build CSS with tailwindcss
39 build-css:39 build-css:
40 @echo "Building CSS with tailwindcss..."40 @echo "Building CSS with tailwindcss..."
41- @bun run build:css41+ @tailwindcss -i internal/webui/public/assets/css/custom.css -o internal/webui/public/assets/css/tailwind.css
42 @echo "CSS built successfully"42 @echo "CSS built successfully"
43 43
44 # Generate Go code from templ templates44 # Generate Go code from templ templates
M internal/httpserve/handlers/container_crud.go +34 -22
@@ -1,8 +1,8 @@
11 package handlers
22
33 import (
4+ "encoding/json"
45 "fmt"
5- "net/http"
66 "strings"
77
88 "github.com/bnema/gordon/internal/server"
@@ -126,25 +126,6 @@ func CreateContainerFullGET(c echo.Context, a *server.App) error {
126126 func CreateContainerPOST(c echo.Context, a *server.App) error {
127127 log.Debug("CreateContainerPOST handler called")
128128
129- // Retrieve the ShortID of the image from the URL
130- ShortID := c.Param("ID")
131- log.Debug("Received ShortID for container creation:", "ShortID", ShortID)
132-
133- // Convert the ShortID to a full image ID
134- imageID, err := FromShortIDToImageID(ShortID)
135- if err != nil {
136- log.Error("Error converting ShortID to full image ID:", "error", err)
137- return sendError(c, err)
138- }
139- log.Debug("Converted ShortID to full image ID:", "imageID", imageID)
140-
141- // Get the image info
142- _, err = docker.GetImageInfo(imageID)
143- if err != nil {
144- log.Error("Error getting image info:", "error", err)
145- return sendError(c, err)
146- }
147-
148129 // Retrieve all form parameters
149130 formParams, err := c.FormParams()
150131 if err != nil {
@@ -165,6 +146,22 @@ func CreateContainerPOST(c echo.Context, a *server.App) error {
165146 }
166147 }
167148
149+ // Get the full image ID directly from the sanitized form inputs
150+ imageID, ok := sanitizedInputs["image_id"]
151+ if !ok || imageID == "" {
152+ log.Error("Full image ID not found in form submission")
153+ // You might want to return a more specific error message to the user here
154+ return sendError(c, fmt.Errorf("missing image ID in form submission"))
155+ }
156+ log.Debug("Retrieved full image ID from form:", "imageID", imageID)
157+
158+ // Get the image info (Optional but good practice: verify the image ID still exists)
159+ _, err = docker.GetImageInfo(imageID)
160+ if err != nil {
161+ log.Error("Error getting image info:", "error", err)
162+ return sendError(c, err)
163+ }
164+
168165 cmdParams, err := cmdparams.FromInputsToCmdParams(sanitizedInputs, a)
169166 if err != nil {
170167 return sendError(c, err)
@@ -229,6 +226,21 @@ func CreateContainerPOST(c echo.Context, a *server.App) error {
229226 log.Info("Skipping proxy setup as requested", "container_id", containerID, "container_name", containerName)
230227 }
231228
232- // Redirect to the container list page
233- return c.Redirect(http.StatusSeeOther, fmt.Sprintf("%s/containers", a.Config.Admin.Path))
229+ // Prepare success message payload
230+ successPayload := map[string]string{
231+ "level": "success",
232+ "message": fmt.Sprintf("Container '%s' created successfully.", containerName),
233+ }
234+ jsonPayload, err := json.Marshal(successPayload)
235+ if err != nil {
236+ // Log the error, but proceed with redirect as container creation was likely successful
237+ log.Error("Failed to marshal success payload for HX-Trigger", "error", err)
238+ } else {
239+ c.Response().Header().Set("HX-Trigger", fmt.Sprintf(`{"showMessage": %s}`, string(jsonPayload)))
240+ }
241+
242+ // Render a success message fragment instead of redirecting
243+ renderer := render.NewTemplRenderer(a)
244+ successMsg := fmt.Sprintf("Container '%s' created successfully.", containerName)
245+ return renderer.RenderTempl(c, templcomponents.Success(successMsg)) // Use the correct Success component
234246 }
@@ -1,8 +1,8 @@
1 package handlers1 package handlers
2 2
3 import (3 import (
4+ "encoding/json"
4 "fmt"5 "fmt"
5- "net/http"
6 "strings"6 "strings"
7 7
8 "github.com/bnema/gordon/internal/server"8 "github.com/bnema/gordon/internal/server"
@@ -126,25 +126,6 @@ func CreateContainerFullGET(c echo.Context, a *server.App) error {
126 func CreateContainerPOST(c echo.Context, a *server.App) error {126 func CreateContainerPOST(c echo.Context, a *server.App) error {
127 log.Debug("CreateContainerPOST handler called")127 log.Debug("CreateContainerPOST handler called")
128 128
129- // Retrieve the ShortID of the image from the URL
130- ShortID := c.Param("ID")
131- log.Debug("Received ShortID for container creation:", "ShortID", ShortID)
132-
133- // Convert the ShortID to a full image ID
134- imageID, err := FromShortIDToImageID(ShortID)
135- if err != nil {
136- log.Error("Error converting ShortID to full image ID:", "error", err)
137- return sendError(c, err)
138- }
139- log.Debug("Converted ShortID to full image ID:", "imageID", imageID)
140-
141- // Get the image info
142- _, err = docker.GetImageInfo(imageID)
143- if err != nil {
144- log.Error("Error getting image info:", "error", err)
145- return sendError(c, err)
146- }
147-
148 // Retrieve all form parameters129 // Retrieve all form parameters
149 formParams, err := c.FormParams()130 formParams, err := c.FormParams()
150 if err != nil {131 if err != nil {
@@ -165,6 +146,22 @@ func CreateContainerPOST(c echo.Context, a *server.App) error {
165 }146 }
166 }147 }
167 148
149+ // Get the full image ID directly from the sanitized form inputs
150+ imageID, ok := sanitizedInputs["image_id"]
151+ if !ok || imageID == "" {
152+ log.Error("Full image ID not found in form submission")
153+ // You might want to return a more specific error message to the user here
154+ return sendError(c, fmt.Errorf("missing image ID in form submission"))
155+ }
156+ log.Debug("Retrieved full image ID from form:", "imageID", imageID)
157+
158+ // Get the image info (Optional but good practice: verify the image ID still exists)
159+ _, err = docker.GetImageInfo(imageID)
160+ if err != nil {
161+ log.Error("Error getting image info:", "error", err)
162+ return sendError(c, err)
163+ }
164+
168 cmdParams, err := cmdparams.FromInputsToCmdParams(sanitizedInputs, a)165 cmdParams, err := cmdparams.FromInputsToCmdParams(sanitizedInputs, a)
169 if err != nil {166 if err != nil {
170 return sendError(c, err)167 return sendError(c, err)
@@ -229,6 +226,21 @@ func CreateContainerPOST(c echo.Context, a *server.App) error {
229 log.Info("Skipping proxy setup as requested", "container_id", containerID, "container_name", containerName)226 log.Info("Skipping proxy setup as requested", "container_id", containerID, "container_name", containerName)
230 }227 }
231 228
232- // Redirect to the container list page229+ // Prepare success message payload
233- return c.Redirect(http.StatusSeeOther, fmt.Sprintf("%s/containers", a.Config.Admin.Path))230+ successPayload := map[string]string{
231+ "level": "success",
232+ "message": fmt.Sprintf("Container '%s' created successfully.", containerName),
233+ }
234+ jsonPayload, err := json.Marshal(successPayload)
235+ if err != nil {
236+ // Log the error, but proceed with redirect as container creation was likely successful
237+ log.Error("Failed to marshal success payload for HX-Trigger", "error", err)
238+ } else {
239+ c.Response().Header().Set("HX-Trigger", fmt.Sprintf(`{"showMessage": %s}`, string(jsonPayload)))
240+ }
241+
242+ // Render a success message fragment instead of redirecting
243+ renderer := render.NewTemplRenderer(a)
244+ successMsg := fmt.Sprintf("Container '%s' created successfully.", containerName)
245+ return renderer.RenderTempl(c, templcomponents.Success(successMsg)) // Use the correct Success component
234 }246 }
M internal/httpserve/handlers/container_management.go +101 -5
@@ -224,12 +224,108 @@ func ImageManagerPrune(c echo.Context, a *server.App) error {
224224 lastPruneResult.mutex.Unlock()
225225 }()
226226
227- // Immediately return 202 Accepted to the client
228- c.Response().Header().Set(echo.HeaderContentType, echo.MIMETextHTML) // Set appropriate content type if needed for HTMX
227+ // Immediately return a placeholder that initiates polling
228+ // Note: We need to modify imagelist.templ to handle this response properly
229+ // For now, just return 202 Accepted and indicate work started.
230+ // The actual polling trigger will be added in the template.
229231 c.Response().WriteHeader(http.StatusAccepted)
230- // Optionally, return a message or updated component indicating the process has started
231- // For now, just return a simple message in the response body
232- return c.String(http.StatusAccepted, "Image pruning started in the background.")
232+ // We'll return a small snippet that the template swap can use
233+ // This snippet should include the polling mechanism itself.
234+ // Example (needs refinement in the template):
235+ return c.HTML(http.StatusAccepted, `<div id="prune-status-poller" hx-get="/htmx/image-manager/prune-status" hx-trigger="load, every 3s" hx-target="#prune-status-poller" hx-swap="outerHTML">Pruning images in background... Checking status.</div>`)
236+}
237+
238+// ImageManagerPruneStatus checks the status of a background prune operation
239+func ImageManagerPruneStatus(c echo.Context, a *server.App) error {
240+ lastPruneResult.mutex.Lock()
241+ defer lastPruneResult.mutex.Unlock()
242+
243+ // If prune is not done, return an empty response or keep the poller active
244+ if !lastPruneResult.Done {
245+ // Returning 204 No Content will stop polling if using hx-swap="none"
246+ // However, our poller replaces itself, so we just return the same polling div
247+ // or an updated status message within it.
248+ // Let's keep the existing poller HTML but maybe update the text slightly.
249+ return c.HTML(http.StatusOK, `<div id="prune-status-poller" hx-get="/htmx/image-manager/prune-status" hx-trigger="every 3s" hx-target="#prune-status-poller" hx-swap="outerHTML">Still pruning... Checking status.</div>`)
250+ }
251+
252+ // Prune is done, prepare the final response
253+ logger.Info("Prune complete, preparing final response for poller.")
254+
255+ // Prepare JSON payload for HX-Trigger toast message
256+ var level string
257+ if lastPruneResult.Success {
258+ level = "success"
259+ } else {
260+ level = "error"
261+ }
262+ payload := map[string]string{"level": level, "message": lastPruneResult.Message}
263+ jsonPayload, marshalErr := json.Marshal(payload)
264+ if marshalErr != nil {
265+ logger.Error("Failed to marshal prune result payload for poller", "error", marshalErr)
266+ // Handle marshalling error - maybe return an error component
267+ } else {
268+ c.Response().Header().Set("HX-Trigger", fmt.Sprintf(`{"showMessage": %s}`, string(jsonPayload)))
269+ }
270+
271+ // Reset the flag *after* preparing the response
272+ lastPruneResult.Done = false
273+ message := lastPruneResult.Message // Store message before resetting if needed
274+ success := lastPruneResult.Success
275+ // Reset message/success if needed, or maybe they are only relevant for the toast
276+ // lastPruneResult.Message = ""
277+ // lastPruneResult.Success = false
278+
279+ // Fetch the updated image list (copy logic from ImageManagerComponent)
280+ images, listErr := docker.ListContainerImages()
281+ if listErr != nil {
282+ logger.Error("Failed to list images after prune for poller", "error", listErr)
283+ // Return an error FRAGMENT instead of a full page.
284+ // HX-Trigger for the prune status itself was already set.
285+ pruneStatusMsg := "Prune finished but failed to refresh list."
286+ if !success { // Add prune status detail if it also failed
287+ pruneStatusMsg = fmt.Sprintf("Prune status: %s. Failed to refresh list.", message)
288+ }
289+ return c.HTML(http.StatusOK, fmt.Sprintf("<div class='alert alert-error'>%s Error: %v. Please refresh manually.</div>", pruneStatusMsg, listErr))
290+ }
291+
292+ var humanReadableImages []components.HumanReadableImage
293+ for _, img := range images {
294+ shortID := img.ID[7:19]
295+ safelyInteractWithIDMap(Update, shortID, img.ID)
296+ createdStr := humanize.TimeAgo(time.Unix(img.Created, 0))
297+ sizeStr := humanize.BytesToReadableSize(img.Size)
298+ var repository, tag string
299+ repoTag := "<none>:<none>"
300+ if len(img.RepoTags) > 0 {
301+ repoTag = img.RepoTags[0]
302+ parts := strings.Split(repoTag, ":")
303+ if len(parts) == 2 {
304+ repository = parts[0]
305+ tag = parts[1]
306+ } else {
307+ repository = repoTag
308+ tag = "latest"
309+ }
310+ }
311+ humanReadableImages = append(humanReadableImages, components.HumanReadableImage{
312+ ID: img.ID,
313+ ShortID: shortID,
314+ Created: createdStr,
315+ Size: sizeStr,
316+ Name: repoTag,
317+ RepoDigests: img.RepoDigests,
318+ RepoTags: img.RepoTags,
319+ Repository: repository,
320+ Tag: tag,
321+ })
322+ }
323+
324+ // Render the final ImageList component to replace the poller
325+ renderer := render.NewTemplRenderer(a)
326+ component := components.ImageList(humanReadableImages)
327+ logger.Debug("Rendering final ImageList for poller")
328+ return renderer.RenderTempl(c, component)
233329 }
234330
235331 // ContainerManagerComponent handles the /container-manager route
@@ -224,12 +224,108 @@ func ImageManagerPrune(c echo.Context, a *server.App) error {
224 lastPruneResult.mutex.Unlock()224 lastPruneResult.mutex.Unlock()
225 }()225 }()
226 226
227- // Immediately return 202 Accepted to the client227+ // Immediately return a placeholder that initiates polling
228- c.Response().Header().Set(echo.HeaderContentType, echo.MIMETextHTML) // Set appropriate content type if needed for HTMX228+ // Note: We need to modify imagelist.templ to handle this response properly
229+ // For now, just return 202 Accepted and indicate work started.
230+ // The actual polling trigger will be added in the template.
229 c.Response().WriteHeader(http.StatusAccepted)231 c.Response().WriteHeader(http.StatusAccepted)
230- // Optionally, return a message or updated component indicating the process has started232+ // We'll return a small snippet that the template swap can use
231- // For now, just return a simple message in the response body233+ // This snippet should include the polling mechanism itself.
232- return c.String(http.StatusAccepted, "Image pruning started in the background.")234+ // Example (needs refinement in the template):
235+ return c.HTML(http.StatusAccepted, `<div id="prune-status-poller" hx-get="/htmx/image-manager/prune-status" hx-trigger="load, every 3s" hx-target="#prune-status-poller" hx-swap="outerHTML">Pruning images in background... Checking status.</div>`)
236+}
237+
238+// ImageManagerPruneStatus checks the status of a background prune operation
239+func ImageManagerPruneStatus(c echo.Context, a *server.App) error {
240+ lastPruneResult.mutex.Lock()
241+ defer lastPruneResult.mutex.Unlock()
242+
243+ // If prune is not done, return an empty response or keep the poller active
244+ if !lastPruneResult.Done {
245+ // Returning 204 No Content will stop polling if using hx-swap="none"
246+ // However, our poller replaces itself, so we just return the same polling div
247+ // or an updated status message within it.
248+ // Let's keep the existing poller HTML but maybe update the text slightly.
249+ return c.HTML(http.StatusOK, `<div id="prune-status-poller" hx-get="/htmx/image-manager/prune-status" hx-trigger="every 3s" hx-target="#prune-status-poller" hx-swap="outerHTML">Still pruning... Checking status.</div>`)
250+ }
251+
252+ // Prune is done, prepare the final response
253+ logger.Info("Prune complete, preparing final response for poller.")
254+
255+ // Prepare JSON payload for HX-Trigger toast message
256+ var level string
257+ if lastPruneResult.Success {
258+ level = "success"
259+ } else {
260+ level = "error"
261+ }
262+ payload := map[string]string{"level": level, "message": lastPruneResult.Message}
263+ jsonPayload, marshalErr := json.Marshal(payload)
264+ if marshalErr != nil {
265+ logger.Error("Failed to marshal prune result payload for poller", "error", marshalErr)
266+ // Handle marshalling error - maybe return an error component
267+ } else {
268+ c.Response().Header().Set("HX-Trigger", fmt.Sprintf(`{"showMessage": %s}`, string(jsonPayload)))
269+ }
270+
271+ // Reset the flag *after* preparing the response
272+ lastPruneResult.Done = false
273+ message := lastPruneResult.Message // Store message before resetting if needed
274+ success := lastPruneResult.Success
275+ // Reset message/success if needed, or maybe they are only relevant for the toast
276+ // lastPruneResult.Message = ""
277+ // lastPruneResult.Success = false
278+
279+ // Fetch the updated image list (copy logic from ImageManagerComponent)
280+ images, listErr := docker.ListContainerImages()
281+ if listErr != nil {
282+ logger.Error("Failed to list images after prune for poller", "error", listErr)
283+ // Return an error FRAGMENT instead of a full page.
284+ // HX-Trigger for the prune status itself was already set.
285+ pruneStatusMsg := "Prune finished but failed to refresh list."
286+ if !success { // Add prune status detail if it also failed
287+ pruneStatusMsg = fmt.Sprintf("Prune status: %s. Failed to refresh list.", message)
288+ }
289+ return c.HTML(http.StatusOK, fmt.Sprintf("<div class='alert alert-error'>%s Error: %v. Please refresh manually.</div>", pruneStatusMsg, listErr))
290+ }
291+
292+ var humanReadableImages []components.HumanReadableImage
293+ for _, img := range images {
294+ shortID := img.ID[7:19]
295+ safelyInteractWithIDMap(Update, shortID, img.ID)
296+ createdStr := humanize.TimeAgo(time.Unix(img.Created, 0))
297+ sizeStr := humanize.BytesToReadableSize(img.Size)
298+ var repository, tag string
299+ repoTag := "<none>:<none>"
300+ if len(img.RepoTags) > 0 {
301+ repoTag = img.RepoTags[0]
302+ parts := strings.Split(repoTag, ":")
303+ if len(parts) == 2 {
304+ repository = parts[0]
305+ tag = parts[1]
306+ } else {
307+ repository = repoTag
308+ tag = "latest"
309+ }
310+ }
311+ humanReadableImages = append(humanReadableImages, components.HumanReadableImage{
312+ ID: img.ID,
313+ ShortID: shortID,
314+ Created: createdStr,
315+ Size: sizeStr,
316+ Name: repoTag,
317+ RepoDigests: img.RepoDigests,
318+ RepoTags: img.RepoTags,
319+ Repository: repository,
320+ Tag: tag,
321+ })
322+ }
323+
324+ // Render the final ImageList component to replace the poller
325+ renderer := render.NewTemplRenderer(a)
326+ component := components.ImageList(humanReadableImages)
327+ logger.Debug("Rendering final ImageList for poller")
328+ return renderer.RenderTempl(c, component)
233 }329 }
234 330
235 // ContainerManagerComponent handles the /container-manager route331 // ContainerManagerComponent handles the /container-manager route
M internal/httpserve/handlers/container_transactions.go +9 -0
@@ -24,6 +24,15 @@ func generateOrderedYAML(infoMap map[string]interface{}) (string, error) {
2424 continue
2525 }
2626
27+ // Special handling for empty Ports and Volumes maps
28+ if key == "Ports" || key == "Volumes" {
29+ if mapVal, ok := value.(map[string]string); ok && len(mapVal) == 0 {
30+ yamlString += key + ": []\n" // Output as empty list instead of map
31+ continue // Skip normal marshalling for this key
32+ }
33+ }
34+
35+ // Default marshalling for other keys or non-empty maps
2736 yamlBytes, err := yaml.Marshal(map[string]interface{}{key: value})
2837 if err != nil {
2938 return "", err
@@ -24,6 +24,15 @@ func generateOrderedYAML(infoMap map[string]interface{}) (string, error) {
24 continue24 continue
25 }25 }
26 26
27+ // Special handling for empty Ports and Volumes maps
28+ if key == "Ports" || key == "Volumes" {
29+ if mapVal, ok := value.(map[string]string); ok && len(mapVal) == 0 {
30+ yamlString += key + ": []\n" // Output as empty list instead of map
31+ continue // Skip normal marshalling for this key
32+ }
33+ }
34+
35+ // Default marshalling for other keys or non-empty maps
27 yamlBytes, err := yaml.Marshal(map[string]interface{}{key: value})36 yamlBytes, err := yaml.Marshal(map[string]interface{}{key: value})
28 if err != nil {37 if err != nil {
29 return "", err38 return "", err
M internal/httpserve/handlers/login.go +4 -4
@@ -81,12 +81,12 @@ func StartOAuthGithub(c echo.Context, a *server.App) error {
8181 return fmt.Errorf("could not extend session expiration: %w", err)
8282 }
8383
84- // Explicitly mark the session as online since we've validated it
85- logger.Info("Marking existing session as online", "sessionID", sessionID)
84+ // Explicitly mark the session as active since we've validated it
85+ logger.Info("Marking existing session as active", "sessionID", sessionID)
8686 err = queries.MarkSessionActive(a.DB, sessionID)
8787 if err != nil {
88- logger.Error("Failed to mark session as online", "error", err, "sessionID", sessionID)
89- return fmt.Errorf("failed to mark session online: %w", err)
88+ logger.Error("Failed to mark session as active", "error", err, "sessionID", sessionID)
89+ return fmt.Errorf("failed to mark session active: %w", err)
9090 }
9191
9292 logger.Info("Session is valid and extended. Redirecting to admin panel")
@@ -81,12 +81,12 @@ func StartOAuthGithub(c echo.Context, a *server.App) error {
81 return fmt.Errorf("could not extend session expiration: %w", err)81 return fmt.Errorf("could not extend session expiration: %w", err)
82 }82 }
83 83
84- // Explicitly mark the session as online since we've validated it84+ // Explicitly mark the session as active since we've validated it
85- logger.Info("Marking existing session as online", "sessionID", sessionID)85+ logger.Info("Marking existing session as active", "sessionID", sessionID)
86 err = queries.MarkSessionActive(a.DB, sessionID)86 err = queries.MarkSessionActive(a.DB, sessionID)
87 if err != nil {87 if err != nil {
88- logger.Error("Failed to mark session as online", "error", err, "sessionID", sessionID)88+ logger.Error("Failed to mark session as active", "error", err, "sessionID", sessionID)
89- return fmt.Errorf("failed to mark session online: %w", err)89+ return fmt.Errorf("failed to mark session active: %w", err)
90 }90 }
91 91
92 logger.Info("Session is valid and extended. Redirecting to admin panel")92 logger.Info("Session is valid and extended. Redirecting to admin panel")
M internal/proxy/core.go +6 -0
@@ -218,6 +218,12 @@ func (p *Proxy) Close() {
218218
219219 // requestDomainCertificate requests a certificate for a domain
220220 func (p *Proxy) requestDomainCertificate(domainName string) error {
221+ // If certificate acquisition is globally skipped, do nothing.
222+ if p.config.SkipCertificates {
223+ logger.Debug("Skipping certificate request because SkipCertificates is true", "domain", domainName)
224+ return nil
225+ }
226+
221227 logger.Debug("Requesting certificate for domain", "domain", domainName)
222228
223229 // Check if we're already processing this domain
@@ -218,6 +218,12 @@ func (p *Proxy) Close() {
218 218
219 // requestDomainCertificate requests a certificate for a domain219 // requestDomainCertificate requests a certificate for a domain
220 func (p *Proxy) requestDomainCertificate(domainName string) error {220 func (p *Proxy) requestDomainCertificate(domainName string) error {
221+ // If certificate acquisition is globally skipped, do nothing.
222+ if p.config.SkipCertificates {
223+ logger.Debug("Skipping certificate request because SkipCertificates is true", "domain", domainName)
224+ return nil
225+ }
226+
221 logger.Debug("Requesting certificate for domain", "domain", domainName)227 logger.Debug("Requesting certificate for domain", "domain", domainName)
222 228
223 // Check if we're already processing this domain229 // Check if we're already processing this domain
M internal/proxy/middleware.go +15 -16
@@ -1,7 +1,6 @@
11 package proxy
22
33 import (
4- "fmt"
54 "net"
65 "net/http"
76 "strings"
@@ -114,7 +113,7 @@ func (p *Proxy) setupMiddleware() {
114113 }
115114
116115 // Add middleware to log incoming headers (for debugging Cloudflare detection)
117- p.httpsServer.Use(logHeadersMiddleware())
116+ // p.httpsServer.Use(logHeadersMiddleware())
118117
119118 // --- Rate Limiting Setup (Domain Only Now) ---
120119 if p.config.EnableRateLimit {
@@ -250,17 +249,17 @@ func (p *Proxy) createRequestIDMiddleware() echo.MiddlewareFunc {
250249 }
251250
252251 // logHeadersMiddleware creates a middleware function to log request headers
253-func logHeadersMiddleware() echo.MiddlewareFunc {
254- return func(next echo.HandlerFunc) echo.HandlerFunc {
255- return func(c echo.Context) error {
256- // Log all headers at DEBUG level
257- headerStrings := []string{}
258- for k, v := range c.Request().Header {
259- headerStrings = append(headerStrings, fmt.Sprintf("%s: %s", k, strings.Join(v, ",")))
260- }
261- logger.Debug("Incoming Request Headers", "request_id", c.Get(RequestIDKey), "headers", strings.Join(headerStrings, " | "))
262-
263- return next(c)
264- }
265- }
266-}
252+// func logHeadersMiddleware() echo.MiddlewareFunc {
253+// return func(next echo.HandlerFunc) echo.HandlerFunc {
254+// return func(c echo.Context) error {
255+// // Log all headers at DEBUG level
256+// headerStrings := []string{}
257+// for k, v := range c.Request().Header {
258+// headerStrings = append(headerStrings, fmt.Sprintf("%s: %s", k, strings.Join(v, ",")))
259+// }
260+// logger.Debug("Incoming Request Headers", "request_id", c.Get(RequestIDKey), "headers", strings.Join(headerStrings, " | "))
261+
262+// return next(c)
263+// }
264+// }
265+// }
@@ -1,7 +1,6 @@
1 package proxy1 package proxy
2 2
3 import (3 import (
4- "fmt"
5 "net"4 "net"
6 "net/http"5 "net/http"
7 "strings"6 "strings"
@@ -114,7 +113,7 @@ func (p *Proxy) setupMiddleware() {
114 }113 }
115 114
116 // Add middleware to log incoming headers (for debugging Cloudflare detection)115 // Add middleware to log incoming headers (for debugging Cloudflare detection)
117- p.httpsServer.Use(logHeadersMiddleware())116+ // p.httpsServer.Use(logHeadersMiddleware())
118 117
119 // --- Rate Limiting Setup (Domain Only Now) ---118 // --- Rate Limiting Setup (Domain Only Now) ---
120 if p.config.EnableRateLimit {119 if p.config.EnableRateLimit {
@@ -250,17 +249,17 @@ func (p *Proxy) createRequestIDMiddleware() echo.MiddlewareFunc {
250 }249 }
251 250
252 // logHeadersMiddleware creates a middleware function to log request headers251 // logHeadersMiddleware creates a middleware function to log request headers
253-func logHeadersMiddleware() echo.MiddlewareFunc {252+// func logHeadersMiddleware() echo.MiddlewareFunc {
254- return func(next echo.HandlerFunc) echo.HandlerFunc {253+// return func(next echo.HandlerFunc) echo.HandlerFunc {
255- return func(c echo.Context) error {254+// return func(c echo.Context) error {
256- // Log all headers at DEBUG level255+// // Log all headers at DEBUG level
257- headerStrings := []string{}256+// headerStrings := []string{}
258- for k, v := range c.Request().Header {257+// for k, v := range c.Request().Header {
259- headerStrings = append(headerStrings, fmt.Sprintf("%s: %s", k, strings.Join(v, ",")))258+// headerStrings = append(headerStrings, fmt.Sprintf("%s: %s", k, strings.Join(v, ",")))
260- }259+// }
261- logger.Debug("Incoming Request Headers", "request_id", c.Get(RequestIDKey), "headers", strings.Join(headerStrings, " | "))260+// logger.Debug("Incoming Request Headers", "request_id", c.Get(RequestIDKey), "headers", strings.Join(headerStrings, " | "))
262-261+
263- return next(c)262+// return next(c)
264- }263+// }
265- }264+// }
266-}265+// }
M internal/proxy/routes.go +38 -4
@@ -1196,19 +1196,53 @@ func (p *Proxy) StartContainerEventListener() error {
11961196 } else {
11971197 // Even if IP is the same, make sure the route is active
11981198 if !route.Active {
1199- logger.Info("Reactivating route for restarted container",
1199+ logger.Info("Attempting to reactivate route for restarted container",
12001200 "container_id", containerID,
12011201 "container_name", containerName,
12021202 "domain", domain)
12031203
1204- // Just reuse ForceUpdateRouteIP with the same IP to activate the route
1205- p.ForceUpdateRouteIP(domain, containerIP)
1204+ // --- Add Health Check Before Activation ---
1205+ target := net.JoinHostPort(containerIP, route.ContainerPort)
1206+ maxRetries := 5
1207+ retryDelay := 2 * time.Second
1208+ healthy := false
1209+ for i := 0; i < maxRetries; i++ {
1210+ conn, err := net.DialTimeout("tcp", target, 1*time.Second)
1211+ if err == nil {
1212+ conn.Close()
1213+ healthy = true
1214+ logger.Info("Container health check successful", "target", target, "attempt", i+1)
1215+ break
1216+ }
1217+ logger.Debug("Container health check failed, retrying...",
1218+ "target", target,
1219+ "attempt", i+1,
1220+ "error", err)
1221+ time.Sleep(retryDelay)
1222+ }
1223+ // --- End Health Check ---
1224+
1225+ if healthy {
1226+ logger.Info("Container is healthy, proceeding with route activation", "domain", domain)
1227+ // Just reuse ForceUpdateRouteIP with the same IP to activate the route
1228+ err := p.ForceUpdateRouteIP(domain, containerIP)
1229+ if err != nil {
1230+ logger.Error("Failed to activate route after health check",
1231+ "domain", domain,
1232+ "error", err)
1233+ }
1234+ } else {
1235+ logger.Warn("Container did not become healthy after retries, route remains inactive",
1236+ "domain", domain,
1237+ "target", target)
1238+ // Route remains inactive, periodic check might pick it up later
1239+ }
12061240 }
12071241 }
12081242 }
12091243 }
12101244
1211- // Call the standard recreation handler for additional checks
1245+ // Call the standard recreation handler for additional checks (might add the route if missing)
12121246 p.HandleContainerRecreation(containerID, containerName, containerIP)
12131247 }()
12141248 }
@@ -1196,19 +1196,53 @@ func (p *Proxy) StartContainerEventListener() error {
1196 } else {1196 } else {
1197 // Even if IP is the same, make sure the route is active1197 // Even if IP is the same, make sure the route is active
1198 if !route.Active {1198 if !route.Active {
1199- logger.Info("Reactivating route for restarted container",1199+ logger.Info("Attempting to reactivate route for restarted container",
1200 "container_id", containerID,1200 "container_id", containerID,
1201 "container_name", containerName,1201 "container_name", containerName,
1202 "domain", domain)1202 "domain", domain)
1203 1203
1204- // Just reuse ForceUpdateRouteIP with the same IP to activate the route1204+ // --- Add Health Check Before Activation ---
1205- p.ForceUpdateRouteIP(domain, containerIP)1205+ target := net.JoinHostPort(containerIP, route.ContainerPort)
1206+ maxRetries := 5
1207+ retryDelay := 2 * time.Second
1208+ healthy := false
1209+ for i := 0; i < maxRetries; i++ {
1210+ conn, err := net.DialTimeout("tcp", target, 1*time.Second)
1211+ if err == nil {
1212+ conn.Close()
1213+ healthy = true
1214+ logger.Info("Container health check successful", "target", target, "attempt", i+1)
1215+ break
1216+ }
1217+ logger.Debug("Container health check failed, retrying...",
1218+ "target", target,
1219+ "attempt", i+1,
1220+ "error", err)
1221+ time.Sleep(retryDelay)
1222+ }
1223+ // --- End Health Check ---
1224+
1225+ if healthy {
1226+ logger.Info("Container is healthy, proceeding with route activation", "domain", domain)
1227+ // Just reuse ForceUpdateRouteIP with the same IP to activate the route
1228+ err := p.ForceUpdateRouteIP(domain, containerIP)
1229+ if err != nil {
1230+ logger.Error("Failed to activate route after health check",
1231+ "domain", domain,
1232+ "error", err)
1233+ }
1234+ } else {
1235+ logger.Warn("Container did not become healthy after retries, route remains inactive",
1236+ "domain", domain,
1237+ "target", target)
1238+ // Route remains inactive, periodic check might pick it up later
1239+ }
1206 }1240 }
1207 }1241 }
1208 }1242 }
1209 }1243 }
1210 1244
1211- // Call the standard recreation handler for additional checks1245+ // Call the standard recreation handler for additional checks (might add the route if missing)
1212 p.HandleContainerRecreation(containerID, containerName, containerIP)1246 p.HandleContainerRecreation(containerID, containerName, containerIP)
1213 }()1247 }()
1214 }1248 }
M internal/templating/cmdparams/from_inputs.go +21 -2
@@ -23,6 +23,9 @@ func FromInputsToCmdParams(inputs map[string]string, a *server.App) (docker.Cont
2323 }
2424 }
2525
26+ // Retrieve proxy port from the correct input key
27+ proxyPortValue := inputs["container_port"] // Changed from proxy_port
28+
2629 params := docker.ContainerCommandParams{
2730 IsSSL: inputs["container_protocol"] == "https",
2831 ContainerName: inputs["container_name"],
@@ -31,14 +34,30 @@ func FromInputsToCmdParams(inputs map[string]string, a *server.App) (docker.Cont
3134 ImageName: inputs["image_name"],
3235 ImageID: inputs["image_id"],
3336 Restart: inputs["restart"],
34- ProxyPort: inputs["proxy_port"],
37+ ProxyPort: proxyPortValue, // Assign the retrieved value
3538 Volumes: volumeSlice,
3639 Environment: environmentSlice,
3740 Network: a.Config.ContainerEngine.Network,
3841 PortMappings: portMappings,
42+ // Labels will be populated below
43+ }
44+
45+ // Initialize Labels slice if nil
46+ if params.Labels == nil {
47+ params.Labels = []string{}
3948 }
4049
41- err = SetupProxyRoute(&params, params.ProxyPort, a)
50+ // Add standard labels and the proxy port label
51+ params.Labels = append(params.Labels,
52+ fmt.Sprintf("gordon.managed=true"),
53+ fmt.Sprintf("gordon.domain=%s.%s", params.ServiceName, params.Domain),
54+ fmt.Sprintf("gordon.proxy.ssl=%t", params.IsSSL),
55+ fmt.Sprintf("gordon.proxy.port=%s", proxyPortValue), // Add the proxy port label
56+ )
57+
58+ // SetupProxyRoute might need adjustment if it relies on params.ProxyPort directly
59+ // Assuming SetupProxyRoute uses the passed proxyPortValue or reads labels
60+ err = SetupProxyRoute(&params, proxyPortValue, a) // Pass the correct port value
4261 if err != nil {
4362 return docker.ContainerCommandParams{}, fmt.Errorf("error setting up proxy route: %w", err)
4463 }
@@ -23,6 +23,9 @@ func FromInputsToCmdParams(inputs map[string]string, a *server.App) (docker.Cont
23 }23 }
24 }24 }
25 25
26+ // Retrieve proxy port from the correct input key
27+ proxyPortValue := inputs["container_port"] // Changed from proxy_port
28+
26 params := docker.ContainerCommandParams{29 params := docker.ContainerCommandParams{
27 IsSSL: inputs["container_protocol"] == "https",30 IsSSL: inputs["container_protocol"] == "https",
28 ContainerName: inputs["container_name"],31 ContainerName: inputs["container_name"],
@@ -31,14 +34,30 @@ func FromInputsToCmdParams(inputs map[string]string, a *server.App) (docker.Cont
31 ImageName: inputs["image_name"],34 ImageName: inputs["image_name"],
32 ImageID: inputs["image_id"],35 ImageID: inputs["image_id"],
33 Restart: inputs["restart"],36 Restart: inputs["restart"],
34- ProxyPort: inputs["proxy_port"],37+ ProxyPort: proxyPortValue, // Assign the retrieved value
35 Volumes: volumeSlice,38 Volumes: volumeSlice,
36 Environment: environmentSlice,39 Environment: environmentSlice,
37 Network: a.Config.ContainerEngine.Network,40 Network: a.Config.ContainerEngine.Network,
38 PortMappings: portMappings,41 PortMappings: portMappings,
42+ // Labels will be populated below
43+ }
44+
45+ // Initialize Labels slice if nil
46+ if params.Labels == nil {
47+ params.Labels = []string{}
39 }48 }
40 49
41- err = SetupProxyRoute(&params, params.ProxyPort, a)50+ // Add standard labels and the proxy port label
51+ params.Labels = append(params.Labels,
52+ fmt.Sprintf("gordon.managed=true"),
53+ fmt.Sprintf("gordon.domain=%s.%s", params.ServiceName, params.Domain),
54+ fmt.Sprintf("gordon.proxy.ssl=%t", params.IsSSL),
55+ fmt.Sprintf("gordon.proxy.port=%s", proxyPortValue), // Add the proxy port label
56+ )
57+
58+ // SetupProxyRoute might need adjustment if it relies on params.ProxyPort directly
59+ // Assuming SetupProxyRoute uses the passed proxyPortValue or reads labels
60+ err = SetupProxyRoute(&params, proxyPortValue, a) // Pass the correct port value
42 if err != nil {61 if err != nil {
43 return docker.ContainerCommandParams{}, fmt.Errorf("error setting up proxy route: %w", err)62 return docker.ContainerCommandParams{}, fmt.Errorf("error setting up proxy route: %w", err)
44 }63 }
M internal/templating/models/templ/components/containerlist.templ +3 -3
@@ -1,14 +1,14 @@
11 package components
22
33 import (
4- "github.com/docker/docker/api/types"
4+ "github.com/docker/docker/api/types/container"
55 "strconv"
66 )
77
88 // ContainerList displays a list of containers
9-templ ContainerList(containers []types.Container, noContainer bool) {
9+templ ContainerList(containers []container.Summary, noContainer bool) {
1010 <!-- Container list using daisyUI components -->
11- <div class="card w-full bg-base-300">
11+ <div class="card w-full bg-base-100">
1212 <div class="card-body p-4">
1313
1414 <!-- Action buttons -->
@@ -1,14 +1,14 @@
1 package components1 package components
2 2
3 import (3 import (
4- "github.com/docker/docker/api/types"4+ "github.com/docker/docker/api/types/container"
5 "strconv"5 "strconv"
6 )6 )
7 7
8 // ContainerList displays a list of containers8 // ContainerList displays a list of containers
9-templ ContainerList(containers []types.Container, noContainer bool) {9+templ ContainerList(containers []container.Summary, noContainer bool) {
10 <!-- Container list using daisyUI components -->10 <!-- Container list using daisyUI components -->
11- <div class="card w-full bg-base-300">11+ <div class="card w-full bg-base-100">
12 <div class="card-body p-4">12 <div class="card-body p-4">
13 13
14 <!-- Action buttons -->14 <!-- Action buttons -->
M internal/templating/models/templ/components/containerlist_templ.go +3 -3 generated file: collapsed
M internal/templating/models/templ/components/createcontainer.templ +2 -1
@@ -21,7 +21,7 @@ type ContainerFormData struct {
2121 templ CreateContainerForm(data ContainerFormData) {
2222 <div class="flex flex-col md:flex-row space-y-4 md:space-y-0 md:space-x-4 flex-grow">
2323 <!-- Left Side: Docker Run Options -->
24- <div class="flex-grow card p-6">
24+ <div class="flex-grow card p-6 bg-base-100">
2525 <h2 class="card-title pb-4">Deploy a container based on { data.ImageName }</h2>
2626 if data.ErrorMessage != "" {
2727 <div class="alert alert-error">
@@ -36,6 +36,7 @@ templ CreateContainerForm(data ContainerFormData) {
3636 hx-swap="innerHTML"
3737 hx-target={ "#create-form-target-" + data.ShortID }>
3838 <!-- Image Name -->
39+ <input type="hidden" name="image_id" value={ data.ImageID } />
3940 <div class="grid grid-cols-1 md:grid-cols-3 gap-4 pb-4">
4041 <div class="md:col-span-1">
4142 <label class="label">
@@ -21,7 +21,7 @@ type ContainerFormData struct {
21 templ CreateContainerForm(data ContainerFormData) {21 templ CreateContainerForm(data ContainerFormData) {
22 <div class="flex flex-col md:flex-row space-y-4 md:space-y-0 md:space-x-4 flex-grow">22 <div class="flex flex-col md:flex-row space-y-4 md:space-y-0 md:space-x-4 flex-grow">
23 <!-- Left Side: Docker Run Options -->23 <!-- Left Side: Docker Run Options -->
24- <div class="flex-grow card p-6">24+ <div class="flex-grow card p-6 bg-base-100">
25 <h2 class="card-title pb-4">Deploy a container based on { data.ImageName }</h2>25 <h2 class="card-title pb-4">Deploy a container based on { data.ImageName }</h2>
26 if data.ErrorMessage != "" {26 if data.ErrorMessage != "" {
27 <div class="alert alert-error">27 <div class="alert alert-error">
@@ -36,6 +36,7 @@ templ CreateContainerForm(data ContainerFormData) {
36 hx-swap="innerHTML" 36 hx-swap="innerHTML"
37 hx-target={ "#create-form-target-" + data.ShortID }>37 hx-target={ "#create-form-target-" + data.ShortID }>
38 <!-- Image Name -->38 <!-- Image Name -->
39+ <input type="hidden" name="image_id" value={ data.ImageID } />
39 <div class="grid grid-cols-1 md:grid-cols-3 gap-4 pb-4">40 <div class="grid grid-cols-1 md:grid-cols-3 gap-4 pb-4">
40 <div class="md:col-span-1">41 <div class="md:col-span-1">
41 <label class="label">42 <label class="label">
M internal/templating/models/templ/components/createcontainer_templ.go +42 -29 generated file: collapsed
M internal/templating/models/templ/components/imagelist.templ +1 -1
@@ -21,7 +21,7 @@ type HumanReadableImage struct {
2121 // ImageList displays a list of images
2222 templ ImageList(images []HumanReadableImage) {
2323 <!-- Image list using daisyUI components -->
24- <div class="card w-full bg-base-300">
24+ <div class="card w-full bg-base-100">
2525 <div class="card-body p-4">
2626
2727 <!-- Action buttons -->
@@ -21,7 +21,7 @@ type HumanReadableImage struct {
21 // ImageList displays a list of images21 // ImageList displays a list of images
22 templ ImageList(images []HumanReadableImage) {22 templ ImageList(images []HumanReadableImage) {
23 <!-- Image list using daisyUI components -->23 <!-- Image list using daisyUI components -->
24- <div class="card w-full bg-base-300">24+ <div class="card w-full bg-base-100">
25 <div class="card-body p-4">25 <div class="card-body p-4">
26 26
27 <!-- Action buttons -->27 <!-- Action buttons -->
M internal/templating/models/templ/components/imagelist_templ.go +1 -1 generated file: collapsed
M internal/templating/models/templ/components/navbar.templ +1 -1
@@ -3,7 +3,7 @@ package components
33 // Navbar is a menu component for navigation
44 templ Navbar(buildVersion string, adminPath string, userSettingsURL string, logoutURL string) {
55 <!-- DaisyUI Navbar -->
6- <div class="navbar bg-base-200 shadow-lg fixed top-0 z-50">
6+ <div class="navbar bg-base-100 shadow-lg fixed top-0 z-50">
77 <div class="navbar-start">
88 <div class="flex items-center">
99 <h1 class="gordon-title text-2xl md:text-3xl text-primary tracking-tighter px-4">
@@ -3,7 +3,7 @@ package components
3 // Navbar is a menu component for navigation3 // Navbar is a menu component for navigation
4 templ Navbar(buildVersion string, adminPath string, userSettingsURL string, logoutURL string) {4 templ Navbar(buildVersion string, adminPath string, userSettingsURL string, logoutURL string) {
5 <!-- DaisyUI Navbar -->5 <!-- DaisyUI Navbar -->
6- <div class="navbar bg-base-200 shadow-lg fixed top-0 z-50">6+ <div class="navbar bg-base-100 shadow-lg fixed top-0 z-50">
7 <div class="navbar-start">7 <div class="navbar-start">
8 <div class="flex items-center">8 <div class="flex items-center">
9 <h1 class="gordon-title text-2xl md:text-3xl text-primary tracking-tighter px-4">9 <h1 class="gordon-title text-2xl md:text-3xl text-primary tracking-tighter px-4">
M internal/templating/models/templ/components/navbar_templ.go +1 -1 generated file: collapsed
M internal/templating/models/templ/components/success.templ +1 -1
@@ -4,7 +4,7 @@ package components
44 templ Success(message string) {
55 <div
66 id="success"
7- class="flex text-indigo-600 content-center justify-center items-center w-full h-full">
7+ class="flex text-success content-center justify-center items-center w-full h-full">
88 <p class="text-2xl text-center">
99 if message != "" {
1010 { message }
@@ -4,7 +4,7 @@ package components
4 templ Success(message string) {4 templ Success(message string) {
5 <div5 <div
6 id="success"6 id="success"
7- class="flex text-indigo-600 content-center justify-center items-center w-full h-full">7+ class="flex text-success content-center justify-center items-center w-full h-full">
8 <p class="text-2xl text-center">8 <p class="text-2xl text-center">
9 if message != "" {9 if message != "" {
10 { message }10 { message }
M internal/templating/models/templ/components/success_templ.go +1 -1 generated file: collapsed
M internal/templating/models/templ/layouts/admin_layout.templ +1 -1
@@ -7,7 +7,7 @@ templ AdminLayout(title string, buildVersion string, adminPath string, userSetti
77 <!DOCTYPE html>
88 <html lang="en" data-theme="gordon-dark">
99 @components.Header(title)
10- <body class="min-h-screen bg-base-100">
10+ <body class="min-h-screen bg-base-250">
1111 @components.Navbar(buildVersion, adminPath, userSettingsURL, logoutURL)
1212
1313 <!-- Main content starts after navbar height -->
@@ -7,7 +7,7 @@ templ AdminLayout(title string, buildVersion string, adminPath string, userSetti
7 <!DOCTYPE html>7 <!DOCTYPE html>
8 <html lang="en" data-theme="gordon-dark">8 <html lang="en" data-theme="gordon-dark">
9 @components.Header(title)9 @components.Header(title)
10- <body class="min-h-screen bg-base-100">10+ <body class="min-h-screen bg-base-250">
11 @components.Navbar(buildVersion, adminPath, userSettingsURL, logoutURL)11 @components.Navbar(buildVersion, adminPath, userSettingsURL, logoutURL)
12 12
13 <!-- Main content starts after navbar height -->13 <!-- Main content starts after navbar height -->
M internal/templating/models/templ/layouts/admin_layout_templ.go +1 -1 generated file: collapsed
M internal/templating/models/templ/layouts/base.templ +1 -1
@@ -8,7 +8,7 @@ templ Base(title string) {
88 <!DOCTYPE html>
99 <html lang="en">
1010 @components.Header(title)
11- <body class="min-h-screen bg-base-100">
11+ <body class="min-h-screen bg-base-200">
1212 { children... }
1313 @components.Footer()
1414 </body>
@@ -8,7 +8,7 @@ templ Base(title string) {
8 <!DOCTYPE html>8 <!DOCTYPE html>
9 <html lang="en">9 <html lang="en">
10 @components.Header(title)10 @components.Header(title)
11- <body class="min-h-screen bg-base-100">11+ <body class="min-h-screen bg-base-200">
12 { children... }12 { children... }
13 @components.Footer()13 @components.Footer()
14 </body>14 </body>
M internal/templating/models/templ/layouts/base_templ.go +1 -1 generated file: collapsed
M internal/templating/models/templ/pages/admin/install.templ +1 -1
@@ -13,7 +13,7 @@ templ InstallPage(title string, version string) {
1313 >
1414 <div class="circle-shadow flex justify-center w-100">
1515 <img
16- src="/assets/imgs/gordon-mascot-hq-trsp.png"
16+ src="/assets/imgs/gordon-mascot-mq-trsp.png"
1717 alt="logo"
1818 class="sm:h-24 h-32 xl:h-48"
1919 />
@@ -13,7 +13,7 @@ templ InstallPage(title string, version string) {
13 >13 >
14 <div class="circle-shadow flex justify-center w-100">14 <div class="circle-shadow flex justify-center w-100">
15 <img15 <img
16- src="/assets/imgs/gordon-mascot-hq-trsp.png"16+ src="/assets/imgs/gordon-mascot-mq-trsp.png"
17 alt="logo"17 alt="logo"
18 class="sm:h-24 h-32 xl:h-48"18 class="sm:h-24 h-32 xl:h-48"
19 />19 />
M internal/templating/models/templ/pages/admin/install_templ.go +1 -1 generated file: collapsed
M internal/templating/models/templ/pages/admin/manager.templ +2 -2
@@ -17,7 +17,7 @@ templ ManagerPage(title string, buildVersion string, adminPath string, userSetti
1717 </div>
1818
1919 <!-- Stats overview -->
20- <div class="stats shadow mb-6 w-full bg-base-300">
20+ <div class="stats shadow mb-6 w-full bg-base-100">
2121 <div class="stat">
2222 <div class="stat-figure text-primary">
2323 <span class="iconf text-3xl">󰡨</span>
@@ -38,7 +38,7 @@ templ ManagerPage(title string, buildVersion string, adminPath string, userSetti
3838 </div>
3939
4040 <!-- Tabs for containers and images -->
41- <div role="tablist" class="tabs tabs-boxed mb-4">
41+ <div role="tablist" class="tabs tabs-border mb-4">
4242 <input type="radio" name="my_tabs" role="tab" class="tab" aria-label="Containers" id="containers-tab" checked />
4343 <div role="tabpanel" class="tab-content p-0 bg-base-300">
4444 <!-- Container manager section -->
@@ -17,7 +17,7 @@ templ ManagerPage(title string, buildVersion string, adminPath string, userSetti
17 </div>17 </div>
18 18
19 <!-- Stats overview -->19 <!-- Stats overview -->
20- <div class="stats shadow mb-6 w-full bg-base-300">20+ <div class="stats shadow mb-6 w-full bg-base-100">
21 <div class="stat">21 <div class="stat">
22 <div class="stat-figure text-primary">22 <div class="stat-figure text-primary">
23 <span class="iconf text-3xl">󰡨</span>23 <span class="iconf text-3xl">󰡨</span>
@@ -38,7 +38,7 @@ templ ManagerPage(title string, buildVersion string, adminPath string, userSetti
38 </div>38 </div>
39 39
40 <!-- Tabs for containers and images -->40 <!-- Tabs for containers and images -->
41- <div role="tablist" class="tabs tabs-boxed mb-4">41+ <div role="tablist" class="tabs tabs-border mb-4">
42 <input type="radio" name="my_tabs" role="tab" class="tab" aria-label="Containers" id="containers-tab" checked />42 <input type="radio" name="my_tabs" role="tab" class="tab" aria-label="Containers" id="containers-tab" checked />
43 <div role="tabpanel" class="tab-content p-0 bg-base-300">43 <div role="tabpanel" class="tab-content p-0 bg-base-300">
44 <!-- Container manager section -->44 <!-- Container manager section -->
M internal/templating/models/templ/pages/admin/manager_templ.go +2 -2 generated file: collapsed
M internal/templating/models/templ/pages/errors/errors.templ +2 -5
@@ -16,13 +16,10 @@ templ NotFoundPage(data ErrorPageData) {
1616 @layouts.Base(data.Title) {
1717 <div class="flex flex-col items-center justify-center min-h-screen p-4">
1818 <div class="flex flex-col items-center mb-8">
19- <img src="/assets/imgs/gordon-mascot-hq-trsp.png" alt="Gordon Mascot" class="w-64 h-64 mb-4" />
19+ <img src="/assets/imgs/gordon-mascot-mq-trsp.png" alt="Gordon Mascot" class="w-64 mb-4" />
2020 <h1 class="text-4xl font-bold text-error">404</h1>
2121 <h2 class="text-2xl mb-2">Page Not Found</h2>
2222 <p class="text-center text-base-content opacity-70 max-w-md mb-8">{ data.Message }</p>
23- <a href={ templ.URL(data.AdminPath) } class="btn btn-primary">
24- <span class="iconf mr-2">🏠</span> Go Home
25- </a>
2623 </div>
2724 </div>
2825 }
@@ -33,7 +30,7 @@ templ ForbiddenPage(data ErrorPageData) {
3330 @layouts.Base(data.Title) {
3431 <div class="flex flex-col items-center justify-center min-h-screen p-4">
3532 <div class="flex flex-col items-center mb-8">
36- <img src="/assets/imgs/gordon-mascot-hq-trsp.png" alt="Gordon Mascot" class="w-64 h-64 mb-4" />
33+ <img src="/assets/imgs/gordon-mascot-mq-trsp.png" alt="Gordon Mascot" class="w-64 h-64 mb-4" />
3734 <h1 class="text-4xl font-bold text-error">403</h1>
3835 <h2 class="text-2xl mb-2">Access Forbidden</h2>
3936 <p class="text-center text-base-content opacity-70 max-w-md mb-8">{ data.Message }</p>
@@ -16,13 +16,10 @@ templ NotFoundPage(data ErrorPageData) {
16 @layouts.Base(data.Title) {16 @layouts.Base(data.Title) {
17 <div class="flex flex-col items-center justify-center min-h-screen p-4">17 <div class="flex flex-col items-center justify-center min-h-screen p-4">
18 <div class="flex flex-col items-center mb-8">18 <div class="flex flex-col items-center mb-8">
19- <img src="/assets/imgs/gordon-mascot-hq-trsp.png" alt="Gordon Mascot" class="w-64 h-64 mb-4" />19+ <img src="/assets/imgs/gordon-mascot-mq-trsp.png" alt="Gordon Mascot" class="w-64 mb-4" />
20 <h1 class="text-4xl font-bold text-error">404</h1>20 <h1 class="text-4xl font-bold text-error">404</h1>
21 <h2 class="text-2xl mb-2">Page Not Found</h2>21 <h2 class="text-2xl mb-2">Page Not Found</h2>
22 <p class="text-center text-base-content opacity-70 max-w-md mb-8">{ data.Message }</p>22 <p class="text-center text-base-content opacity-70 max-w-md mb-8">{ data.Message }</p>
23- <a href={ templ.URL(data.AdminPath) } class="btn btn-primary">
24- <span class="iconf mr-2">🏠</span> Go Home
25- </a>
26 </div>23 </div>
27 </div>24 </div>
28 }25 }
@@ -33,7 +30,7 @@ templ ForbiddenPage(data ErrorPageData) {
33 @layouts.Base(data.Title) {30 @layouts.Base(data.Title) {
34 <div class="flex flex-col items-center justify-center min-h-screen p-4">31 <div class="flex flex-col items-center justify-center min-h-screen p-4">
35 <div class="flex flex-col items-center mb-8">32 <div class="flex flex-col items-center mb-8">
36- <img src="/assets/imgs/gordon-mascot-hq-trsp.png" alt="Gordon Mascot" class="w-64 h-64 mb-4" />33+ <img src="/assets/imgs/gordon-mascot-mq-trsp.png" alt="Gordon Mascot" class="w-64 h-64 mb-4" />
37 <h1 class="text-4xl font-bold text-error">403</h1>34 <h1 class="text-4xl font-bold text-error">403</h1>
38 <h2 class="text-2xl mb-2">Access Forbidden</h2>35 <h2 class="text-2xl mb-2">Access Forbidden</h2>
39 <p class="text-center text-base-content opacity-70 max-w-md mb-8">{ data.Message }</p>36 <p class="text-center text-base-content opacity-70 max-w-md mb-8">{ data.Message }</p>
M internal/templating/models/templ/pages/errors/errors_templ.go +16 -25 generated file: collapsed
M internal/webui/public/assets/css/custom.css +22 -103
@@ -1,123 +1,42 @@
1-/**
2- * Path: internal/ui/public/assets/css/custom.css
3- *
4- * @format
5- */
6-
7-/* Embeded path : assets/css/cutsom.css */
8-
91 @import "tailwindcss";
10-@plugin "daisyui";
11-
12-/* Custom DaisyUI theme */
2+/* Custom DaisyUI theme - Defined in tailwind.config.js */
133 @plugin "daisyui/theme" {
144 name: "gordon-dark";
155 default: true;
166 prefersdark: true;
177 color-scheme: "dark";
18- --color-base-100: oklch(28% 0.091 267.935);
19- --color-base-200: oklch(20% 0.042 265.755);
20- --color-base-300: oklch(13% 0.028 261.692);
21- --color-base-content: oklch(93% 0.034 272.788);
22- --color-primary: oklch(87% 0 0);
23- --color-primary-content: oklch(14% 0 0);
24- --color-secondary: oklch(80% 0.105 251.813);
25- --color-secondary-content: oklch(28% 0.091 267.935);
26- --color-accent: oklch(80% 0.105 251.813);
27- --color-accent-content: oklch(28% 0.091 267.935);
28- --color-neutral: oklch(37% 0.034 259.733);
29- --color-neutral-content: oklch(98% 0.002 247.839);
8+ --color-base-100: oklch(14% 0 0);
9+ --color-base-200: oklch(21% 0.006 285.885);
10+ --color-base-250: oklch(21% 0.006 285.885);
11+ --color-base-300: oklch(26% 0 0);
12+ --color-base-content: oklch(97% 0.001 106.424);
13+ --color-primary: oklch(44% 0.043 257.281);
14+ --color-primary-content: oklch(98% 0.003 247.858);
15+ --color-secondary: oklch(66% 0.179 58.318);
16+ --color-secondary-content: oklch(98% 0.022 95.277);
17+ --color-accent: oklch(60% 0.118 184.704);
18+ --color-accent-content: oklch(98% 0.014 180.72);
19+ --color-neutral: oklch(42% 0.199 265.638);
20+ --color-neutral-content: oklch(98% 0.001 106.423);
3021 --color-info: oklch(68% 0.169 237.323);
3122 --color-info-content: oklch(97% 0.013 236.62);
32- --color-success: oklch(70% 0.14 182.503);
33- --color-success-content: oklch(98% 0.014 180.72);
34- --color-warning: oklch(76% 0.188 70.08);
35- --color-warning-content: oklch(98% 0.022 95.277);
23+ --color-success: oklch(69% 0.17 162.48);
24+ --color-success-content: oklch(97% 0.021 166.113);
25+ --color-warning: oklch(70% 0.213 47.604);
26+ --color-warning-content: oklch(98% 0.016 73.684);
3627 --color-error: oklch(64% 0.246 16.439);
3728 --color-error-content: oklch(96% 0.015 12.422);
38- --radius-selector: 0rem;
39- --radius-field: 0rem;
40- --radius-box: 0rem;
29+ --radius-selector: 1rem;
30+ --radius-field: 0.5rem;
31+ --radius-box: 1rem;
4132 --size-selector: 0.25rem;
42- --size-field: 0.25rem;
33+ --size-field: 0.21875rem;
4334 --border: 1px;
4435 --depth: 0;
4536 --noise: 0;
4637 }
4738
4839
49-/* Custom component classes */
50-@layer components {
51- /* Button styles */
52- .btn-primary {
53- @apply flex w-full justify-center border border-transparent bg-indigo-600 px-4 py-2 text-sm font-medium text-white hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2;
54- }
55-
56- .btn-secondary {
57- @apply flex w-full justify-center border border-secondary bg-secondary px-4 py-2 text-sm font-medium text-secondary-content hover:bg-secondary/90 focus:outline-none focus:ring-2 focus:ring-secondary focus:ring-offset-2;
58- }
59-
60- .btn-danger {
61- @apply flex w-full justify-center border border-transparent bg-red-600 px-4 py-2 text-sm font-medium text-white hover:bg-red-700 focus:outline-none focus:ring-2 focus:ring-red-500 focus:ring-offset-2;
62- }
63-
64- /* Alert styles */
65- .alert-error {
66- @apply bg-red-50 p-4 dark:bg-red-900/20;
67- }
68-
69- .alert-error-icon {
70- @apply h-5 w-5 text-red-400;
71- }
72-
73- .alert-error-text {
74- @apply text-sm font-medium text-red-800 dark:text-red-300;
75- }
76-
77- .alert-success {
78- @apply bg-green-50 p-4 dark:bg-green-900/20;
79- }
80-
81- .alert-success-icon {
82- @apply h-5 w-5 text-green-400;
83- }
84-
85- .alert-success-text {
86- @apply text-sm font-medium text-green-800 dark:text-green-300;
87- }
88-
89- /* Card styles */
90- .card {
91- @apply bg-base-100 p-4 shadow mb-4;
92- }
93-
94- .card-header {
95- @apply text-lg font-semibold text-indigo-600 mb-2;
96- }
97-
98- /* Background styles */
99- .bg-app {
100- @apply bg-base-300;
101- }
102-
103- .bg-sidebar {
104- @apply bg-indigo-900;
105- }
106-
107- .bg-card {
108- @apply bg-base-100;
109- }
110-
111- /* Text styles */
112- .text-title {
113- @apply text-indigo-600 font-semibold;
114- }
115-
116- .text-subtitle {
117- @apply text-indigo-500;
118- }
119-}
120-
12140 /* Import IBM Plex Fonts */
12241 @font-face {
12342 font-family: "IBMPlexSans-Bold";
@@ -1,123 +1,42 @@
1-/**
2- * Path: internal/ui/public/assets/css/custom.css
3- *
4- * @format
5- */
6-
7-/* Embeded path : assets/css/cutsom.css */
8-
9 @import "tailwindcss";1 @import "tailwindcss";
10-@plugin "daisyui";2+/* Custom DaisyUI theme - Defined in tailwind.config.js */
11-
12-/* Custom DaisyUI theme */
13 @plugin "daisyui/theme" {3 @plugin "daisyui/theme" {
14 name: "gordon-dark";4 name: "gordon-dark";
15 default: true;5 default: true;
16 prefersdark: true;6 prefersdark: true;
17 color-scheme: "dark";7 color-scheme: "dark";
18- --color-base-100: oklch(28% 0.091 267.935);8+ --color-base-100: oklch(14% 0 0);
19- --color-base-200: oklch(20% 0.042 265.755);9+ --color-base-200: oklch(21% 0.006 285.885);
20- --color-base-300: oklch(13% 0.028 261.692);10+ --color-base-250: oklch(21% 0.006 285.885);
21- --color-base-content: oklch(93% 0.034 272.788);11+ --color-base-300: oklch(26% 0 0);
22- --color-primary: oklch(87% 0 0);12+ --color-base-content: oklch(97% 0.001 106.424);
23- --color-primary-content: oklch(14% 0 0);13+ --color-primary: oklch(44% 0.043 257.281);
24- --color-secondary: oklch(80% 0.105 251.813);14+ --color-primary-content: oklch(98% 0.003 247.858);
25- --color-secondary-content: oklch(28% 0.091 267.935);15+ --color-secondary: oklch(66% 0.179 58.318);
26- --color-accent: oklch(80% 0.105 251.813);16+ --color-secondary-content: oklch(98% 0.022 95.277);
27- --color-accent-content: oklch(28% 0.091 267.935);17+ --color-accent: oklch(60% 0.118 184.704);
28- --color-neutral: oklch(37% 0.034 259.733);18+ --color-accent-content: oklch(98% 0.014 180.72);
29- --color-neutral-content: oklch(98% 0.002 247.839);19+ --color-neutral: oklch(42% 0.199 265.638);
20+ --color-neutral-content: oklch(98% 0.001 106.423);
30 --color-info: oklch(68% 0.169 237.323);21 --color-info: oklch(68% 0.169 237.323);
31 --color-info-content: oklch(97% 0.013 236.62);22 --color-info-content: oklch(97% 0.013 236.62);
32- --color-success: oklch(70% 0.14 182.503);23+ --color-success: oklch(69% 0.17 162.48);
33- --color-success-content: oklch(98% 0.014 180.72);24+ --color-success-content: oklch(97% 0.021 166.113);
34- --color-warning: oklch(76% 0.188 70.08);25+ --color-warning: oklch(70% 0.213 47.604);
35- --color-warning-content: oklch(98% 0.022 95.277);26+ --color-warning-content: oklch(98% 0.016 73.684);
36 --color-error: oklch(64% 0.246 16.439);27 --color-error: oklch(64% 0.246 16.439);
37 --color-error-content: oklch(96% 0.015 12.422);28 --color-error-content: oklch(96% 0.015 12.422);
38- --radius-selector: 0rem;29+ --radius-selector: 1rem;
39- --radius-field: 0rem;30+ --radius-field: 0.5rem;
40- --radius-box: 0rem;31+ --radius-box: 1rem;
41 --size-selector: 0.25rem;32 --size-selector: 0.25rem;
42- --size-field: 0.25rem;33+ --size-field: 0.21875rem;
43 --border: 1px;34 --border: 1px;
44 --depth: 0;35 --depth: 0;
45 --noise: 0;36 --noise: 0;
46 }37 }
47 38
48 39
49-/* Custom component classes */
50-@layer components {
51- /* Button styles */
52- .btn-primary {
53- @apply flex w-full justify-center border border-transparent bg-indigo-600 px-4 py-2 text-sm font-medium text-white hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2;
54- }
55-
56- .btn-secondary {
57- @apply flex w-full justify-center border border-secondary bg-secondary px-4 py-2 text-sm font-medium text-secondary-content hover:bg-secondary/90 focus:outline-none focus:ring-2 focus:ring-secondary focus:ring-offset-2;
58- }
59-
60- .btn-danger {
61- @apply flex w-full justify-center border border-transparent bg-red-600 px-4 py-2 text-sm font-medium text-white hover:bg-red-700 focus:outline-none focus:ring-2 focus:ring-red-500 focus:ring-offset-2;
62- }
63-
64- /* Alert styles */
65- .alert-error {
66- @apply bg-red-50 p-4 dark:bg-red-900/20;
67- }
68-
69- .alert-error-icon {
70- @apply h-5 w-5 text-red-400;
71- }
72-
73- .alert-error-text {
74- @apply text-sm font-medium text-red-800 dark:text-red-300;
75- }
76-
77- .alert-success {
78- @apply bg-green-50 p-4 dark:bg-green-900/20;
79- }
80-
81- .alert-success-icon {
82- @apply h-5 w-5 text-green-400;
83- }
84-
85- .alert-success-text {
86- @apply text-sm font-medium text-green-800 dark:text-green-300;
87- }
88-
89- /* Card styles */
90- .card {
91- @apply bg-base-100 p-4 shadow mb-4;
92- }
93-
94- .card-header {
95- @apply text-lg font-semibold text-indigo-600 mb-2;
96- }
97-
98- /* Background styles */
99- .bg-app {
100- @apply bg-base-300;
101- }
102-
103- .bg-sidebar {
104- @apply bg-indigo-900;
105- }
106-
107- .bg-card {
108- @apply bg-base-100;
109- }
110-
111- /* Text styles */
112- .text-title {
113- @apply text-indigo-600 font-semibold;
114- }
115-
116- .text-subtitle {
117- @apply text-indigo-500;
118- }
119-}
120-
121 /* Import IBM Plex Fonts */40 /* Import IBM Plex Fonts */
122 @font-face {41 @font-face {
123 font-family: "IBMPlexSans-Bold";42 font-family: "IBMPlexSans-Bold";
M internal/webui/public/assets/css/tailwind.css +474 -7547 large diff (8021 lines changed): collapsed
A node_modules/.bin/cssesc +1 -0 generated file: collapsed
A node_modules/.bin/glob +1 -0 generated file: collapsed
A node_modules/.bin/jiti +1 -0 generated file: collapsed
A node_modules/.bin/nanoid +1 -0 generated file: collapsed
A node_modules/.bin/node-which +1 -0 generated file: collapsed
A node_modules/.bin/prettier +1 -0 generated file: collapsed
A node_modules/.bin/resolve +1 -0 generated file: collapsed
A node_modules/.bin/sucrase +1 -0 generated file: collapsed
A node_modules/.bin/sucrase-node +1 -0 generated file: collapsed
A node_modules/.bin/tailwind +1 -0 generated file: collapsed
A node_modules/.bin/yaml +1 -0 generated file: collapsed
A node_modules/.svelte2tsx-language-server-files/svelte-native-jsx.d.ts +32 -0 generated file: collapsed
A node_modules/.svelte2tsx-language-server-files/svelte-shims-v4.d.ts +287 -0 generated file: collapsed
A node_modules/@alloc/quick-lru/index.d.ts +128 -0 generated file: collapsed
A node_modules/@alloc/quick-lru/index.js +263 -0 generated file: collapsed
A node_modules/@alloc/quick-lru/license +9 -0 generated file: collapsed
A node_modules/@alloc/quick-lru/package.json +43 -0 generated file: collapsed
A node_modules/@alloc/quick-lru/readme.md +139 -0 generated file: collapsed
A node_modules/@isaacs/cliui/README.md +143 -0 generated file: collapsed
A node_modules/@isaacs/cliui/build/index.cjs +317 -0 generated file: collapsed
A node_modules/@isaacs/cliui/build/index.d.cts +43 -0 generated file: collapsed
A node_modules/@isaacs/cliui/build/lib/index.js +302 -0 generated file: collapsed
A node_modules/@isaacs/cliui/index.mjs +14 -0 generated file: collapsed
A node_modules/@isaacs/cliui/package.json +86 -0 generated file: collapsed
A node_modules/@jridgewell/gen-mapping/LICENSE +19 -0 generated file: collapsed
A node_modules/@jridgewell/gen-mapping/README.md +227 -0 generated file: collapsed
A node_modules/@jridgewell/gen-mapping/package.json +76 -0 generated file: collapsed
A node_modules/@jridgewell/resolve-uri/LICENSE +19 -0 generated file: collapsed
A node_modules/@jridgewell/resolve-uri/README.md +40 -0 generated file: collapsed
A node_modules/@jridgewell/resolve-uri/package.json +69 -0 generated file: collapsed
A node_modules/@jridgewell/set-array/LICENSE +19 -0 generated file: collapsed
A node_modules/@jridgewell/set-array/README.md +37 -0 generated file: collapsed
A node_modules/@jridgewell/set-array/package.json +65 -0 generated file: collapsed
A node_modules/@jridgewell/sourcemap-codec/LICENSE +21 -0 generated file: collapsed
A node_modules/@jridgewell/sourcemap-codec/README.md +264 -0 generated file: collapsed
A node_modules/@jridgewell/sourcemap-codec/package.json +75 -0 generated file: collapsed
A node_modules/@jridgewell/trace-mapping/LICENSE +19 -0 generated file: collapsed
A node_modules/@jridgewell/trace-mapping/README.md +257 -0 generated file: collapsed
A node_modules/@jridgewell/trace-mapping/package.json +77 -0 generated file: collapsed
A node_modules/@nodelib/fs.scandir/LICENSE +21 -0 generated file: collapsed
A node_modules/@nodelib/fs.scandir/README.md +171 -0 generated file: collapsed
A node_modules/@nodelib/fs.scandir/out/adapters/fs.d.ts +20 -0 generated file: collapsed
A node_modules/@nodelib/fs.scandir/out/adapters/fs.js +19 -0 generated file: collapsed
A node_modules/@nodelib/fs.scandir/out/constants.d.ts +4 -0 generated file: collapsed
A node_modules/@nodelib/fs.scandir/out/constants.js +17 -0 generated file: collapsed
A node_modules/@nodelib/fs.scandir/out/index.d.ts +12 -0 generated file: collapsed
A node_modules/@nodelib/fs.scandir/out/index.js +26 -0 generated file: collapsed
A node_modules/@nodelib/fs.scandir/out/providers/async.d.ts +7 -0 generated file: collapsed
A node_modules/@nodelib/fs.scandir/out/providers/async.js +104 -0 generated file: collapsed
A node_modules/@nodelib/fs.scandir/out/providers/common.d.ts +1 -0 generated file: collapsed
A node_modules/@nodelib/fs.scandir/out/providers/common.js +13 -0 generated file: collapsed
A node_modules/@nodelib/fs.scandir/out/providers/sync.d.ts +5 -0 generated file: collapsed
A node_modules/@nodelib/fs.scandir/out/providers/sync.js +54 -0 generated file: collapsed
A node_modules/@nodelib/fs.scandir/out/settings.d.ts +20 -0 generated file: collapsed
A node_modules/@nodelib/fs.scandir/out/settings.js +24 -0 generated file: collapsed
A node_modules/@nodelib/fs.scandir/out/types/index.d.ts +20 -0 generated file: collapsed
A node_modules/@nodelib/fs.scandir/out/types/index.js +2 -0 generated file: collapsed
A node_modules/@nodelib/fs.scandir/out/utils/fs.d.ts +2 -0 generated file: collapsed
A node_modules/@nodelib/fs.scandir/out/utils/fs.js +19 -0 generated file: collapsed
A node_modules/@nodelib/fs.scandir/out/utils/index.d.ts +2 -0 generated file: collapsed
A node_modules/@nodelib/fs.scandir/out/utils/index.js +5 -0 generated file: collapsed
A node_modules/@nodelib/fs.scandir/package.json +44 -0 generated file: collapsed
A node_modules/@nodelib/fs.stat/LICENSE +21 -0 generated file: collapsed
A node_modules/@nodelib/fs.stat/README.md +126 -0 generated file: collapsed
A node_modules/@nodelib/fs.stat/out/adapters/fs.d.ts +13 -0 generated file: collapsed
A node_modules/@nodelib/fs.stat/out/adapters/fs.js +17 -0 generated file: collapsed
A node_modules/@nodelib/fs.stat/out/index.d.ts +12 -0 generated file: collapsed
A node_modules/@nodelib/fs.stat/out/index.js +26 -0 generated file: collapsed
A node_modules/@nodelib/fs.stat/out/providers/async.d.ts +4 -0 generated file: collapsed
A node_modules/@nodelib/fs.stat/out/providers/async.js +36 -0 generated file: collapsed
A node_modules/@nodelib/fs.stat/out/providers/sync.d.ts +3 -0 generated file: collapsed
A node_modules/@nodelib/fs.stat/out/providers/sync.js +23 -0 generated file: collapsed
A node_modules/@nodelib/fs.stat/out/settings.d.ts +16 -0 generated file: collapsed
A node_modules/@nodelib/fs.stat/out/settings.js +16 -0 generated file: collapsed
A node_modules/@nodelib/fs.stat/out/types/index.d.ts +4 -0 generated file: collapsed
A node_modules/@nodelib/fs.stat/out/types/index.js +2 -0 generated file: collapsed
A node_modules/@nodelib/fs.stat/package.json +37 -0 generated file: collapsed
A node_modules/@nodelib/fs.walk/LICENSE +21 -0 generated file: collapsed
A node_modules/@nodelib/fs.walk/README.md +215 -0 generated file: collapsed
A node_modules/@nodelib/fs.walk/out/index.d.ts +14 -0 generated file: collapsed
A node_modules/@nodelib/fs.walk/out/index.js +34 -0 generated file: collapsed
A node_modules/@nodelib/fs.walk/out/providers/async.d.ts +12 -0 generated file: collapsed
A node_modules/@nodelib/fs.walk/out/providers/async.js +30 -0 generated file: collapsed
A node_modules/@nodelib/fs.walk/out/providers/index.d.ts +4 -0 generated file: collapsed
A node_modules/@nodelib/fs.walk/out/providers/index.js +9 -0 generated file: collapsed
A node_modules/@nodelib/fs.walk/out/providers/stream.d.ts +12 -0 generated file: collapsed
A node_modules/@nodelib/fs.walk/out/providers/stream.js +34 -0 generated file: collapsed
A node_modules/@nodelib/fs.walk/out/providers/sync.d.ts +10 -0 generated file: collapsed
A node_modules/@nodelib/fs.walk/out/providers/sync.js +14 -0 generated file: collapsed
A node_modules/@nodelib/fs.walk/out/readers/async.d.ts +30 -0 generated file: collapsed
A node_modules/@nodelib/fs.walk/out/readers/async.js +97 -0 generated file: collapsed
A node_modules/@nodelib/fs.walk/out/readers/common.d.ts +7 -0 generated file: collapsed
A node_modules/@nodelib/fs.walk/out/readers/common.js +31 -0 generated file: collapsed
A node_modules/@nodelib/fs.walk/out/readers/reader.d.ts +6 -0 generated file: collapsed
A node_modules/@nodelib/fs.walk/out/readers/reader.js +11 -0 generated file: collapsed
A node_modules/@nodelib/fs.walk/out/readers/sync.d.ts +15 -0 generated file: collapsed
A node_modules/@nodelib/fs.walk/out/readers/sync.js +59 -0 generated file: collapsed
A node_modules/@nodelib/fs.walk/out/settings.d.ts +30 -0 generated file: collapsed
A node_modules/@nodelib/fs.walk/out/settings.js +26 -0 generated file: collapsed
A node_modules/@nodelib/fs.walk/out/types/index.d.ts +8 -0 generated file: collapsed
A node_modules/@nodelib/fs.walk/out/types/index.js +2 -0 generated file: collapsed
A node_modules/@nodelib/fs.walk/package.json +44 -0 generated file: collapsed
A node_modules/@parcel/watcher-linux-x64-glibc/LICENSE +21 -0 generated file: collapsed
A node_modules/@parcel/watcher-linux-x64-glibc/README.md +1 -0 generated file: collapsed
A node_modules/@parcel/watcher-linux-x64-glibc/package.json +33 -0 generated file: collapsed
A node_modules/@parcel/watcher-linux-x64-glibc/watcher.node +0 -0 binary file: no text diff

binary file: no text diff

A node_modules/@parcel/watcher-linux-x64-musl/LICENSE +21 -0 generated file: collapsed
A node_modules/@parcel/watcher-linux-x64-musl/README.md +1 -0 generated file: collapsed
A node_modules/@parcel/watcher-linux-x64-musl/package.json +33 -0 generated file: collapsed
A node_modules/@parcel/watcher-linux-x64-musl/watcher.node +0 -0 binary file: no text diff

binary file: no text diff

A node_modules/@parcel/watcher/LICENSE +21 -0 generated file: collapsed
A node_modules/@parcel/watcher/README.md +135 -0 generated file: collapsed
A node_modules/@parcel/watcher/binding.gyp +93 -0 generated file: collapsed
A node_modules/@parcel/watcher/index.d.ts +49 -0 generated file: collapsed
A node_modules/@parcel/watcher/index.js +41 -0 generated file: collapsed
A node_modules/@parcel/watcher/index.js.flow +48 -0 generated file: collapsed
A node_modules/@parcel/watcher/node_modules/.bin/detect-libc +1 -0 generated file: collapsed
A node_modules/@parcel/watcher/node_modules/detect-libc/.npmignore +7 -0 generated file: collapsed
A node_modules/@parcel/watcher/node_modules/detect-libc/LICENSE +201 -0 generated file: collapsed
A node_modules/@parcel/watcher/node_modules/detect-libc/README.md +78 -0 generated file: collapsed
A node_modules/@parcel/watcher/node_modules/detect-libc/bin/detect-libc.js +18 -0 generated file: collapsed
A node_modules/@parcel/watcher/node_modules/detect-libc/lib/detect-libc.js +92 -0 generated file: collapsed
A node_modules/@parcel/watcher/node_modules/detect-libc/package.json +35 -0 generated file: collapsed
A node_modules/@parcel/watcher/package.json +88 -0 generated file: collapsed
A node_modules/@parcel/watcher/scripts/build-from-source.js +13 -0 generated file: collapsed
A node_modules/@parcel/watcher/src/Backend.cc +182 -0 generated file: collapsed
A node_modules/@parcel/watcher/src/Backend.hh +37 -0 generated file: collapsed
A node_modules/@parcel/watcher/src/Debounce.cc +113 -0 generated file: collapsed
A node_modules/@parcel/watcher/src/Debounce.hh +49 -0 generated file: collapsed
A node_modules/@parcel/watcher/src/DirTree.cc +152 -0 generated file: collapsed
A node_modules/@parcel/watcher/src/DirTree.hh +50 -0 generated file: collapsed
A node_modules/@parcel/watcher/src/Event.hh +109 -0 generated file: collapsed
A node_modules/@parcel/watcher/src/Glob.cc +22 -0 generated file: collapsed
A node_modules/@parcel/watcher/src/Glob.hh +34 -0 generated file: collapsed
A node_modules/@parcel/watcher/src/PromiseRunner.hh +101 -0 generated file: collapsed
A node_modules/@parcel/watcher/src/Signal.hh +46 -0 generated file: collapsed
A node_modules/@parcel/watcher/src/Watcher.cc +237 -0 generated file: collapsed
A node_modules/@parcel/watcher/src/Watcher.hh +73 -0 generated file: collapsed
A node_modules/@parcel/watcher/src/binding.cc +268 -0 generated file: collapsed
A node_modules/@parcel/watcher/src/kqueue/KqueueBackend.cc +306 -0 generated file: collapsed
A node_modules/@parcel/watcher/src/kqueue/KqueueBackend.hh +35 -0 generated file: collapsed
A node_modules/@parcel/watcher/src/linux/InotifyBackend.cc +232 -0 generated file: collapsed
A node_modules/@parcel/watcher/src/linux/InotifyBackend.hh +34 -0 generated file: collapsed
A node_modules/@parcel/watcher/src/macos/FSEventsBackend.cc +338 -0 generated file: collapsed
A node_modules/@parcel/watcher/src/macos/FSEventsBackend.hh +20 -0 generated file: collapsed
A node_modules/@parcel/watcher/src/shared/BruteForceBackend.cc +41 -0 generated file: collapsed
A node_modules/@parcel/watcher/src/shared/BruteForceBackend.hh +25 -0 generated file: collapsed
A node_modules/@parcel/watcher/src/unix/fts.cc +50 -0 generated file: collapsed
A node_modules/@parcel/watcher/src/unix/legacy.cc +77 -0 generated file: collapsed
A node_modules/@parcel/watcher/src/wasm/WasmBackend.cc +132 -0 generated file: collapsed
A node_modules/@parcel/watcher/src/wasm/WasmBackend.hh +34 -0 generated file: collapsed
A node_modules/@parcel/watcher/src/wasm/include.h +74 -0 generated file: collapsed
A node_modules/@parcel/watcher/src/watchman/BSER.cc +302 -0 generated file: collapsed
A node_modules/@parcel/watcher/src/watchman/BSER.hh +69 -0 generated file: collapsed
A node_modules/@parcel/watcher/src/watchman/IPC.hh +175 -0 generated file: collapsed
A node_modules/@parcel/watcher/src/watchman/WatchmanBackend.cc +338 -0 generated file: collapsed
A node_modules/@parcel/watcher/src/watchman/WatchmanBackend.hh +35 -0 generated file: collapsed
A node_modules/@parcel/watcher/src/windows/WindowsBackend.cc +282 -0 generated file: collapsed
A node_modules/@parcel/watcher/src/windows/WindowsBackend.hh +18 -0 generated file: collapsed
A node_modules/@parcel/watcher/src/windows/win_utils.cc +44 -0 generated file: collapsed
A node_modules/@parcel/watcher/src/windows/win_utils.hh +11 -0 generated file: collapsed
A node_modules/@parcel/watcher/wrapper.js +77 -0 generated file: collapsed
A node_modules/@pkgjs/parseargs/.editorconfig +14 -0 generated file: collapsed
A node_modules/@pkgjs/parseargs/CHANGELOG.md +147 -0 generated file: collapsed
A node_modules/@pkgjs/parseargs/LICENSE +201 -0 generated file: collapsed
A node_modules/@pkgjs/parseargs/README.md +413 -0 generated file: collapsed
A node_modules/@pkgjs/parseargs/examples/is-default-value.js +25 -0 generated file: collapsed
A node_modules/@pkgjs/parseargs/examples/limit-long-syntax.js +35 -0 generated file: collapsed
A node_modules/@pkgjs/parseargs/examples/negate.js +43 -0 generated file: collapsed
A node_modules/@pkgjs/parseargs/examples/no-repeated-options.js +31 -0 generated file: collapsed
A node_modules/@pkgjs/parseargs/examples/ordered-options.mjs +41 -0 generated file: collapsed
A node_modules/@pkgjs/parseargs/examples/simple-hard-coded.js +26 -0 generated file: collapsed
A node_modules/@pkgjs/parseargs/index.js +396 -0 generated file: collapsed
A node_modules/@pkgjs/parseargs/internal/errors.js +47 -0 generated file: collapsed
A node_modules/@pkgjs/parseargs/internal/primordials.js +393 -0 generated file: collapsed
A node_modules/@pkgjs/parseargs/internal/util.js +14 -0 generated file: collapsed
A node_modules/@pkgjs/parseargs/internal/validators.js +89 -0 generated file: collapsed
A node_modules/@pkgjs/parseargs/package.json +36 -0 generated file: collapsed
A node_modules/@pkgjs/parseargs/utils.js +198 -0 generated file: collapsed
A node_modules/@tailwindcss/cli/LICENSE +21 -0 generated file: collapsed
A node_modules/@tailwindcss/cli/README.md +40 -0 generated file: collapsed
A node_modules/@tailwindcss/cli/package.json +41 -0 generated file: collapsed
A node_modules/@tailwindcss/node/LICENSE +21 -0 generated file: collapsed
A node_modules/@tailwindcss/node/README.md +40 -0 generated file: collapsed
A node_modules/@tailwindcss/node/node_modules/.bin/jiti +1 -0 generated file: collapsed
A node_modules/@tailwindcss/node/node_modules/jiti/LICENSE +21 -0 generated file: collapsed
A node_modules/@tailwindcss/node/node_modules/jiti/README.md +235 -0 generated file: collapsed
A node_modules/@tailwindcss/node/node_modules/jiti/lib/jiti-cli.mjs +34 -0 generated file: collapsed
A node_modules/@tailwindcss/node/node_modules/jiti/lib/jiti-hooks.mjs +117 -0 generated file: collapsed
A node_modules/@tailwindcss/node/node_modules/jiti/lib/jiti-native.mjs +121 -0 generated file: collapsed
A node_modules/@tailwindcss/node/node_modules/jiti/lib/jiti-register.d.mts +1 -0 generated file: collapsed
A node_modules/@tailwindcss/node/node_modules/jiti/lib/jiti-register.mjs +4 -0 generated file: collapsed
A node_modules/@tailwindcss/node/node_modules/jiti/lib/jiti.cjs +23 -0 generated file: collapsed
A node_modules/@tailwindcss/node/node_modules/jiti/lib/jiti.d.cts +8 -0 generated file: collapsed
A node_modules/@tailwindcss/node/node_modules/jiti/lib/jiti.d.mts +8 -0 generated file: collapsed
A node_modules/@tailwindcss/node/node_modules/jiti/lib/jiti.mjs +22 -0 generated file: collapsed
A node_modules/@tailwindcss/node/node_modules/jiti/lib/types.d.ts +260 -0 generated file: collapsed
A node_modules/@tailwindcss/node/node_modules/jiti/package.json +134 -0 generated file: collapsed
A node_modules/@tailwindcss/node/package.json +44 -0 generated file: collapsed
A node_modules/@tailwindcss/oxide-linux-x64-gnu/LICENSE +21 -0 generated file: collapsed
A node_modules/@tailwindcss/oxide-linux-x64-gnu/README.md +3 -0 generated file: collapsed
A node_modules/@tailwindcss/oxide-linux-x64-gnu/package.json +30 -0 generated file: collapsed
A node_modules/@tailwindcss/oxide-linux-x64-gnu/tailwindcss-oxide.linux-x64-gnu.node +0 -0 binary file: no text diff

binary file: no text diff

A node_modules/@tailwindcss/oxide-linux-x64-musl/LICENSE +21 -0 generated file: collapsed
A node_modules/@tailwindcss/oxide-linux-x64-musl/README.md +3 -0 generated file: collapsed
A node_modules/@tailwindcss/oxide-linux-x64-musl/package.json +30 -0 generated file: collapsed
A node_modules/@tailwindcss/oxide-linux-x64-musl/tailwindcss-oxide.linux-x64-musl.node +0 -0 binary file: no text diff

binary file: no text diff

A node_modules/@tailwindcss/oxide/LICENSE +21 -0 generated file: collapsed
A node_modules/@tailwindcss/oxide/index.d.ts +37 -0 generated file: collapsed
A node_modules/@tailwindcss/oxide/index.js +315 -0 generated file: collapsed
A node_modules/@tailwindcss/oxide/package.json +63 -0 generated file: collapsed
A node_modules/@tailwindcss/postcss/LICENSE +21 -0 generated file: collapsed
A node_modules/@tailwindcss/postcss/README.md +40 -0 generated file: collapsed
A node_modules/@tailwindcss/postcss/package.json +47 -0 generated file: collapsed
A node_modules/ansi-regex/index.d.ts +33 -0 generated file: collapsed
A node_modules/ansi-regex/index.js +10 -0 generated file: collapsed
A node_modules/ansi-regex/license +9 -0 generated file: collapsed
A node_modules/ansi-regex/package.json +61 -0 generated file: collapsed
A node_modules/ansi-regex/readme.md +60 -0 generated file: collapsed
A node_modules/ansi-styles/index.d.ts +236 -0 generated file: collapsed
A node_modules/ansi-styles/index.js +223 -0 generated file: collapsed
A node_modules/ansi-styles/license +9 -0 generated file: collapsed
A node_modules/ansi-styles/package.json +54 -0 generated file: collapsed
A node_modules/ansi-styles/readme.md +173 -0 generated file: collapsed
A node_modules/any-promise/.jshintrc +4 -0 generated file: collapsed
A node_modules/any-promise/.npmignore +7 -0 generated file: collapsed
A node_modules/any-promise/LICENSE +19 -0 generated file: collapsed
A node_modules/any-promise/README.md +161 -0 generated file: collapsed
A node_modules/any-promise/implementation.d.ts +3 -0 generated file: collapsed
A node_modules/any-promise/implementation.js +1 -0 generated file: collapsed
A node_modules/any-promise/index.d.ts +73 -0 generated file: collapsed
A node_modules/any-promise/index.js +1 -0 generated file: collapsed
A node_modules/any-promise/loader.js +78 -0 generated file: collapsed
A node_modules/any-promise/optional.js +6 -0 generated file: collapsed
A node_modules/any-promise/package.json +45 -0 generated file: collapsed
A node_modules/any-promise/register-shim.js +18 -0 generated file: collapsed
A node_modules/any-promise/register.d.ts +17 -0 generated file: collapsed
A node_modules/any-promise/register.js +94 -0 generated file: collapsed
A node_modules/any-promise/register/bluebird.d.ts +1 -0 generated file: collapsed
A node_modules/any-promise/register/bluebird.js +2 -0 generated file: collapsed
A node_modules/any-promise/register/es6-promise.d.ts +1 -0 generated file: collapsed
A node_modules/any-promise/register/es6-promise.js +2 -0 generated file: collapsed
A node_modules/any-promise/register/lie.d.ts +1 -0 generated file: collapsed
A node_modules/any-promise/register/lie.js +2 -0 generated file: collapsed
A node_modules/any-promise/register/native-promise-only.d.ts +1 -0 generated file: collapsed
A node_modules/any-promise/register/native-promise-only.js +2 -0 generated file: collapsed
A node_modules/any-promise/register/pinkie.d.ts +1 -0 generated file: collapsed
A node_modules/any-promise/register/pinkie.js +2 -0 generated file: collapsed
A node_modules/any-promise/register/promise.d.ts +1 -0 generated file: collapsed
A node_modules/any-promise/register/promise.js +2 -0 generated file: collapsed
A node_modules/any-promise/register/q.d.ts +1 -0 generated file: collapsed
A node_modules/any-promise/register/q.js +2 -0 generated file: collapsed
A node_modules/any-promise/register/rsvp.d.ts +1 -0 generated file: collapsed
A node_modules/any-promise/register/rsvp.js +2 -0 generated file: collapsed
A node_modules/any-promise/register/vow.d.ts +1 -0 generated file: collapsed
A node_modules/any-promise/register/vow.js +2 -0 generated file: collapsed
A node_modules/any-promise/register/when.d.ts +1 -0 generated file: collapsed
A node_modules/any-promise/register/when.js +2 -0 generated file: collapsed
A node_modules/anymatch/LICENSE +15 -0 generated file: collapsed
A node_modules/anymatch/README.md +87 -0 generated file: collapsed
A node_modules/anymatch/index.d.ts +20 -0 generated file: collapsed
A node_modules/anymatch/index.js +104 -0 generated file: collapsed
A node_modules/anymatch/package.json +48 -0 generated file: collapsed
A node_modules/arg/LICENSE.md +21 -0 generated file: collapsed
A node_modules/arg/README.md +317 -0 generated file: collapsed
A node_modules/arg/index.d.ts +44 -0 generated file: collapsed
A node_modules/arg/index.js +195 -0 generated file: collapsed
A node_modules/arg/package.json +28 -0 collapsed to keep the page light
A node_modules/balanced-match/.github/FUNDING.yml +2 -0 collapsed to keep the page light
A node_modules/balanced-match/LICENSE.md +21 -0 collapsed to keep the page light
A node_modules/balanced-match/README.md +97 -0 collapsed to keep the page light
A node_modules/balanced-match/index.js +62 -0 collapsed to keep the page light
A node_modules/balanced-match/package.json +48 -0 collapsed to keep the page light
A node_modules/binary-extensions/binary-extensions.json +263 -0 collapsed to keep the page light
A node_modules/binary-extensions/binary-extensions.json.d.ts +3 -0 collapsed to keep the page light
A node_modules/binary-extensions/index.d.ts +14 -0 collapsed to keep the page light
A node_modules/binary-extensions/index.js +1 -0 collapsed to keep the page light
A node_modules/binary-extensions/license +10 -0 collapsed to keep the page light
A node_modules/binary-extensions/package.json +40 -0 collapsed to keep the page light
A node_modules/binary-extensions/readme.md +25 -0 collapsed to keep the page light
A node_modules/brace-expansion/.github/FUNDING.yml +2 -0 collapsed to keep the page light
A node_modules/brace-expansion/LICENSE +21 -0 collapsed to keep the page light
A node_modules/brace-expansion/README.md +135 -0 collapsed to keep the page light
A node_modules/brace-expansion/index.js +203 -0 collapsed to keep the page light
A node_modules/brace-expansion/package.json +46 -0 collapsed to keep the page light
A node_modules/braces/LICENSE +21 -0 collapsed to keep the page light
A node_modules/braces/README.md +586 -0 collapsed to keep the page light
A node_modules/braces/index.js +170 -0 collapsed to keep the page light
A node_modules/braces/lib/compile.js +60 -0 collapsed to keep the page light
A node_modules/braces/lib/constants.js +57 -0 collapsed to keep the page light
A node_modules/braces/lib/expand.js +113 -0 collapsed to keep the page light
A node_modules/braces/lib/parse.js +331 -0 collapsed to keep the page light
A node_modules/braces/lib/stringify.js +32 -0 collapsed to keep the page light
A node_modules/braces/lib/utils.js +122 -0 collapsed to keep the page light
A node_modules/braces/package.json +77 -0 collapsed to keep the page light
A node_modules/camelcase-css/README.md +27 -0 collapsed to keep the page light
A node_modules/camelcase-css/index-es5.js +24 -0 collapsed to keep the page light
A node_modules/camelcase-css/index.js +30 -0 collapsed to keep the page light
A node_modules/camelcase-css/license +21 -0 collapsed to keep the page light
A node_modules/camelcase-css/package.json +34 -0 collapsed to keep the page light
A node_modules/caniuse-lite/LICENSE +395 -0 collapsed to keep the page light
A node_modules/caniuse-lite/README.md +6 -0 collapsed to keep the page light
A node_modules/caniuse-lite/package.json +34 -0 collapsed to keep the page light
A node_modules/chokidar/LICENSE +21 -0 collapsed to keep the page light
A node_modules/chokidar/README.md +308 -0 collapsed to keep the page light
A node_modules/chokidar/index.js +973 -0 collapsed to keep the page light
A node_modules/chokidar/lib/constants.js +66 -0 collapsed to keep the page light
A node_modules/chokidar/lib/fsevents-handler.js +526 -0 collapsed to keep the page light
A node_modules/chokidar/lib/nodefs-handler.js +654 -0 collapsed to keep the page light
A node_modules/chokidar/node_modules/glob-parent/CHANGELOG.md +110 -0 collapsed to keep the page light
A node_modules/chokidar/node_modules/glob-parent/LICENSE +15 -0 collapsed to keep the page light
A node_modules/chokidar/node_modules/glob-parent/README.md +137 -0 collapsed to keep the page light
A node_modules/chokidar/node_modules/glob-parent/index.js +42 -0 collapsed to keep the page light
A node_modules/chokidar/node_modules/glob-parent/package.json +48 -0 collapsed to keep the page light
A node_modules/chokidar/package.json +70 -0 collapsed to keep the page light
A node_modules/chokidar/types/index.d.ts +192 -0 collapsed to keep the page light
A node_modules/color-convert/CHANGELOG.md +54 -0 collapsed to keep the page light
A node_modules/color-convert/LICENSE +21 -0 collapsed to keep the page light
A node_modules/color-convert/README.md +68 -0 collapsed to keep the page light
A node_modules/color-convert/conversions.js +839 -0 collapsed to keep the page light
A node_modules/color-convert/index.js +81 -0 collapsed to keep the page light
A node_modules/color-convert/package.json +48 -0 collapsed to keep the page light
A node_modules/color-convert/route.js +97 -0 collapsed to keep the page light
A node_modules/color-name/LICENSE +8 -0 collapsed to keep the page light
A node_modules/color-name/README.md +11 -0 collapsed to keep the page light
A node_modules/color-name/index.js +152 -0 collapsed to keep the page light
A node_modules/color-name/package.json +28 -0 collapsed to keep the page light
A node_modules/commander/CHANGELOG.md +436 -0 collapsed to keep the page light
A node_modules/commander/LICENSE +22 -0 collapsed to keep the page light
A node_modules/commander/Readme.md +713 -0 collapsed to keep the page light
A node_modules/commander/index.js +1649 -0
@@ -0,0 +1,1649 @@
1+/**
2+ * Module dependencies.
3+ */
4+
5+var EventEmitter = require('events').EventEmitter;
6+var spawn = require('child_process').spawn;
7+var path = require('path');
8+var dirname = path.dirname;
9+var basename = path.basename;
10+var fs = require('fs');
11+
12+/**
13+ * Inherit `Command` from `EventEmitter.prototype`.
14+ */
15+
16+require('util').inherits(Command, EventEmitter);
17+
18+/**
19+ * Expose the root command.
20+ */
21+
22+exports = module.exports = new Command();
23+
24+/**
25+ * Expose `Command`.
26+ */
27+
28+exports.Command = Command;
29+
30+/**
31+ * Expose `Option`.
32+ */
33+
34+exports.Option = Option;
35+
36+/**
37+ * Initialize a new `Option` with the given `flags` and `description`.
38+ *
39+ * @param {String} flags
40+ * @param {String} description
41+ * @api public
42+ */
43+
44+function Option(flags, description) {
45+ this.flags = flags;
46+ this.required = flags.indexOf('<') >= 0; // A value must be supplied when the option is specified.
47+ this.optional = flags.indexOf('[') >= 0; // A value is optional when the option is specified.
48+ this.mandatory = false; // The option must have a value after parsing, which usually means it must be specified on command line.
49+ this.negate = flags.indexOf('-no-') !== -1;
50+ flags = flags.split(/[ ,|]+/);
51+ if (flags.length > 1 && !/^[[<]/.test(flags[1])) this.short = flags.shift();
52+ this.long = flags.shift();
53+ this.description = description || '';
54+}
55+
56+/**
57+ * Return option name.
58+ *
59+ * @return {String}
60+ * @api private
61+ */
62+
63+Option.prototype.name = function() {
64+ return this.long.replace(/^--/, '');
65+};
66+
67+/**
68+ * Return option name, in a camelcase format that can be used
69+ * as a object attribute key.
70+ *
71+ * @return {String}
72+ * @api private
73+ */
74+
75+Option.prototype.attributeName = function() {
76+ return camelcase(this.name().replace(/^no-/, ''));
77+};
78+
79+/**
80+ * Check if `arg` matches the short or long flag.
81+ *
82+ * @param {String} arg
83+ * @return {Boolean}
84+ * @api private
85+ */
86+
87+Option.prototype.is = function(arg) {
88+ return this.short === arg || this.long === arg;
89+};
90+
91+/**
92+ * CommanderError class
93+ * @class
94+ */
95+class CommanderError extends Error {
96+ /**
97+ * Constructs the CommanderError class
98+ * @param {Number} exitCode suggested exit code which could be used with process.exit
99+ * @param {String} code an id string representing the error
100+ * @param {String} message human-readable description of the error
101+ * @constructor
102+ */
103+ constructor(exitCode, code, message) {
104+ super(message);
105+ // properly capture stack trace in Node.js
106+ Error.captureStackTrace(this, this.constructor);
107+ this.name = this.constructor.name;
108+ this.code = code;
109+ this.exitCode = exitCode;
110+ }
111+}
112+
113+exports.CommanderError = CommanderError;
114+
115+/**
116+ * Initialize a new `Command`.
117+ *
118+ * @param {String} [name]
119+ * @api public
120+ */
121+
122+function Command(name) {
123+ this.commands = [];
124+ this.options = [];
125+ this._execs = new Set();
126+ this._allowUnknownOption = false;
127+ this._args = [];
128+ this._name = name || '';
129+ this._optionValues = {};
130+ this._storeOptionsAsProperties = true; // backwards compatible by default
131+ this._passCommandToAction = true; // backwards compatible by default
132+ this._actionResults = [];
133+
134+ this._helpFlags = '-h, --help';
135+ this._helpDescription = 'output usage information';
136+ this._helpShortFlag = '-h';
137+ this._helpLongFlag = '--help';
138+}
139+
140+/**
141+ * Define a command.
142+ *
143+ * There are two styles of command: pay attention to where to put the description.
144+ *
145+ * Examples:
146+ *
147+ * // Command implemented using action handler (description is supplied separately to `.command`)
148+ * program
149+ * .command('clone <source> [destination]')
150+ * .description('clone a repository into a newly created directory')
151+ * .action((source, destination) => {
152+ * console.log('clone command called');
153+ * });
154+ *
155+ * // Command implemented using separate executable file (description is second parameter to `.command`)
156+ * program
157+ * .command('start <service>', 'start named service')
158+ * .command('stop [service]', 'stop named service, or all if no name supplied');
159+ *
160+ * @param {string} nameAndArgs - command name and arguments, args are `<required>` or `[optional]` and last may also be `variadic...`
161+ * @param {Object|string} [actionOptsOrExecDesc] - configuration options (for action), or description (for executable)
162+ * @param {Object} [execOpts] - configuration options (for executable)
163+ * @return {Command} returns new command for action handler, or top-level command for executable command
164+ * @api public
165+ */
166+
167+Command.prototype.command = function(nameAndArgs, actionOptsOrExecDesc, execOpts) {
168+ var desc = actionOptsOrExecDesc;
169+ var opts = execOpts;
170+ if (typeof desc === 'object' && desc !== null) {
171+ opts = desc;
172+ desc = null;
173+ }
174+ opts = opts || {};
175+ var args = nameAndArgs.split(/ +/);
176+ var cmd = new Command(args.shift());
177+
178+ if (desc) {
179+ cmd.description(desc);
180+ this.executables = true;
181+ this._execs.add(cmd._name);
182+ if (opts.isDefault) this.defaultExecutable = cmd._name;
183+ }
184+ cmd._noHelp = !!opts.noHelp;
185+ cmd._helpFlags = this._helpFlags;
186+ cmd._helpDescription = this._helpDescription;
187+ cmd._helpShortFlag = this._helpShortFlag;
188+ cmd._helpLongFlag = this._helpLongFlag;
189+ cmd._exitCallback = this._exitCallback;
190+ cmd._storeOptionsAsProperties = this._storeOptionsAsProperties;
191+ cmd._passCommandToAction = this._passCommandToAction;
192+
193+ cmd._executableFile = opts.executableFile; // Custom name for executable file
194+ this.commands.push(cmd);
195+ cmd.parseExpectedArgs(args);
196+ cmd.parent = this;
197+
198+ if (desc) return this;
199+ return cmd;
200+};
201+
202+/**
203+ * Define argument syntax for the top-level command.
204+ *
205+ * @api public
206+ */
207+
208+Command.prototype.arguments = function(desc) {
209+ return this.parseExpectedArgs(desc.split(/ +/));
210+};
211+
212+/**
213+ * Add an implicit `help [cmd]` subcommand
214+ * which invokes `--help` for the given command.
215+ *
216+ * @api private
217+ */
218+
219+Command.prototype.addImplicitHelpCommand = function() {
220+ this.command('help [cmd]', 'display help for [cmd]');
221+};
222+
223+/**
224+ * Parse expected `args`.
225+ *
226+ * For example `["[type]"]` becomes `[{ required: false, name: 'type' }]`.
227+ *
228+ * @param {Array} args
229+ * @return {Command} for chaining
230+ * @api public
231+ */
232+
233+Command.prototype.parseExpectedArgs = function(args) {
234+ if (!args.length) return;
235+ var self = this;
236+ args.forEach(function(arg) {
237+ var argDetails = {
238+ required: false,
239+ name: '',
240+ variadic: false
241+ };
242+
243+ switch (arg[0]) {
244+ case '<':
245+ argDetails.required = true;
246+ argDetails.name = arg.slice(1, -1);
247+ break;
248+ case '[':
249+ argDetails.name = arg.slice(1, -1);
250+ break;
251+ }
252+
253+ if (argDetails.name.length > 3 && argDetails.name.slice(-3) === '...') {
254+ argDetails.variadic = true;
255+ argDetails.name = argDetails.name.slice(0, -3);
256+ }
257+ if (argDetails.name) {
258+ self._args.push(argDetails);
259+ }
260+ });
261+ return this;
262+};
263+
264+/**
265+ * Register callback to use as replacement for calling process.exit.
266+ *
267+ * @param {Function} [fn] optional callback which will be passed a CommanderError, defaults to throwing
268+ * @return {Command} for chaining
269+ * @api public
270+ */
271+
272+Command.prototype.exitOverride = function(fn) {
273+ if (fn) {
274+ this._exitCallback = fn;
275+ } else {
276+ this._exitCallback = function(err) {
277+ if (err.code !== 'commander.executeSubCommandAsync') {
278+ throw err;
279+ } else {
280+ // Async callback from spawn events, not useful to throw.
281+ }
282+ };
283+ }
284+ return this;
285+};
286+
287+/**
288+ * Call process.exit, and _exitCallback if defined.
289+ *
290+ * @param {Number} exitCode exit code for using with process.exit
291+ * @param {String} code an id string representing the error
292+ * @param {String} message human-readable description of the error
293+ * @return never
294+ * @api private
295+ */
296+
297+Command.prototype._exit = function(exitCode, code, message) {
298+ if (this._exitCallback) {
299+ this._exitCallback(new CommanderError(exitCode, code, message));
300+ // Expecting this line is not reached.
301+ }
302+ process.exit(exitCode);
303+};
304+
305+/**
306+ * Register callback `fn` for the command.
307+ *
308+ * Examples:
309+ *
310+ * program
311+ * .command('help')
312+ * .description('display verbose help')
313+ * .action(function() {
314+ * // output help here
315+ * });
316+ *
317+ * @param {Function} fn
318+ * @return {Command} for chaining
319+ * @api public
320+ */
321+
322+Command.prototype.action = function(fn) {
323+ var self = this;
324+ var listener = function(args, unknown) {
325+ // Parse any so-far unknown options
326+ args = args || [];
327+ unknown = unknown || [];
328+
329+ var parsed = self.parseOptions(unknown);
330+
331+ // Output help if necessary
332+ outputHelpIfRequested(self, parsed.unknown);
333+ self._checkForMissingMandatoryOptions();
334+
335+ // If there are still any unknown options, then we simply
336+ // die, unless someone asked for help, in which case we give it
337+ // to them, and then we die.
338+ if (parsed.unknown.length > 0) {
339+ self.unknownOption(parsed.unknown[0]);
340+ }
341+
342+ // Leftover arguments need to be pushed back. Fixes issue #56
343+ if (parsed.args.length) args = parsed.args.concat(args);
344+
345+ self._args.forEach(function(arg, i) {
346+ if (arg.required && args[i] == null) {
347+ self.missingArgument(arg.name);
348+ } else if (arg.variadic) {
349+ if (i !== self._args.length - 1) {
350+ self.variadicArgNotLast(arg.name);
351+ }
352+
353+ args[i] = args.splice(i);
354+ }
355+ });
356+
357+ // The .action callback takes an extra parameter which is the command itself.
358+ var expectedArgsCount = self._args.length;
359+ var actionArgs = args.slice(0, expectedArgsCount);
360+ if (self._passCommandToAction) {
361+ actionArgs[expectedArgsCount] = self;
362+ } else {
363+ actionArgs[expectedArgsCount] = self.opts();
364+ }
365+ // Add the extra arguments so available too.
366+ if (args.length > expectedArgsCount) {
367+ actionArgs.push(args.slice(expectedArgsCount));
368+ }
369+
370+ const actionResult = fn.apply(self, actionArgs);
371+ // Remember result in case it is async. Assume parseAsync getting called on root.
372+ let rootCommand = self;
373+ while (rootCommand.parent) {
374+ rootCommand = rootCommand.parent;
375+ }
376+ rootCommand._actionResults.push(actionResult);
377+ };
378+ var parent = this.parent || this;
379+ var name = parent === this ? '*' : this._name;
380+ parent.on('command:' + name, listener);
381+ if (this._alias) parent.on('command:' + this._alias, listener);
382+ return this;
383+};
384+
385+/**
386+ * Internal implementation shared by .option() and .requiredOption()
387+ *
388+ * @param {Object} config
389+ * @param {String} flags
390+ * @param {String} description
391+ * @param {Function|*} [fn] - custom option processing function or default vaue
392+ * @param {*} [defaultValue]
393+ * @return {Command} for chaining
394+ * @api private
395+ */
396+
397+Command.prototype._optionEx = function(config, flags, description, fn, defaultValue) {
398+ var self = this,
399+ option = new Option(flags, description),
400+ oname = option.name(),
401+ name = option.attributeName();
402+ option.mandatory = !!config.mandatory;
403+
404+ // default as 3rd arg
405+ if (typeof fn !== 'function') {
406+ if (fn instanceof RegExp) {
407+ // This is a bit simplistic (especially no error messages), and probably better handled by caller using custom option processing.
408+ // No longer documented in README, but still present for backwards compatibility.
409+ var regex = fn;
410+ fn = function(val, def) {
411+ var m = regex.exec(val);
412+ return m ? m[0] : def;
413+ };
414+ } else {
415+ defaultValue = fn;
416+ fn = null;
417+ }
418+ }
419+
420+ // preassign default value for --no-*, [optional], <required>, or plain flag if boolean value
421+ if (option.negate || option.optional || option.required || typeof defaultValue === 'boolean') {
422+ // when --no-foo we make sure default is true, unless a --foo option is already defined
423+ if (option.negate) {
424+ const positiveLongFlag = option.long.replace(/^--no-/, '--');
425+ defaultValue = self.optionFor(positiveLongFlag) ? self._getOptionValue(name) : true;
426+ }
427+ // preassign only if we have a default
428+ if (defaultValue !== undefined) {
429+ self._setOptionValue(name, defaultValue);
430+ option.defaultValue = defaultValue;
431+ }
432+ }
433+
434+ // register the option
435+ this.options.push(option);
436+
437+ // when it's passed assign the value
438+ // and conditionally invoke the callback
439+ this.on('option:' + oname, function(val) {
440+ // coercion
441+ if (val !== null && fn) {
442+ val = fn(val, self._getOptionValue(name) === undefined ? defaultValue : self._getOptionValue(name));
443+ }
444+
445+ // unassigned or boolean value
446+ if (typeof self._getOptionValue(name) === 'boolean' || typeof self._getOptionValue(name) === 'undefined') {
447+ // if no value, negate false, and we have a default, then use it!
448+ if (val == null) {
449+ self._setOptionValue(name, option.negate
450+ ? false
451+ : defaultValue || true);
452+ } else {
453+ self._setOptionValue(name, val);
454+ }
455+ } else if (val !== null) {
456+ // reassign
457+ self._setOptionValue(name, option.negate ? false : val);
458+ }
459+ });
460+
461+ return this;
462+};
463+
464+/**
465+ * Define option with `flags`, `description` and optional
466+ * coercion `fn`.
467+ *
468+ * The `flags` string should contain both the short and long flags,
469+ * separated by comma, a pipe or space. The following are all valid
470+ * all will output this way when `--help` is used.
471+ *
472+ * "-p, --pepper"
473+ * "-p|--pepper"
474+ * "-p --pepper"
475+ *
476+ * Examples:
477+ *
478+ * // simple boolean defaulting to undefined
479+ * program.option('-p, --pepper', 'add pepper');
480+ *
481+ * program.pepper
482+ * // => undefined
483+ *
484+ * --pepper
485+ * program.pepper
486+ * // => true
487+ *
488+ * // simple boolean defaulting to true (unless non-negated option is also defined)
489+ * program.option('-C, --no-cheese', 'remove cheese');
490+ *
491+ * program.cheese
492+ * // => true
493+ *
494+ * --no-cheese
495+ * program.cheese
496+ * // => false
497+ *
498+ * // required argument
499+ * program.option('-C, --chdir <path>', 'change the working directory');
500+ *
501+ * --chdir /tmp
502+ * program.chdir
503+ * // => "/tmp"
504+ *
505+ * // optional argument
506+ * program.option('-c, --cheese [type]', 'add cheese [marble]');
507+ *
508+ * @param {String} flags
509+ * @param {String} description
510+ * @param {Function|*} [fn] - custom option processing function or default vaue
511+ * @param {*} [defaultValue]
512+ * @return {Command} for chaining
513+ * @api public
514+ */
515+
516+Command.prototype.option = function(flags, description, fn, defaultValue) {
517+ return this._optionEx({}, flags, description, fn, defaultValue);
518+};
519+
520+/*
521+ * Add a required option which must have a value after parsing. This usually means
522+ * the option must be specified on the command line. (Otherwise the same as .option().)
523+ *
524+ * The `flags` string should contain both the short and long flags, separated by comma, a pipe or space.
525+ *
526+ * @param {String} flags
527+ * @param {String} description
528+ * @param {Function|*} [fn] - custom option processing function or default vaue
529+ * @param {*} [defaultValue]
530+ * @return {Command} for chaining
531+ * @api public
532+ */
533+
534+Command.prototype.requiredOption = function(flags, description, fn, defaultValue) {
535+ return this._optionEx({ mandatory: true }, flags, description, fn, defaultValue);
536+};
537+
538+/**
539+ * Allow unknown options on the command line.
540+ *
541+ * @param {Boolean} arg if `true` or omitted, no error will be thrown
542+ * for unknown options.
543+ * @api public
544+ */
545+Command.prototype.allowUnknownOption = function(arg) {
546+ this._allowUnknownOption = arguments.length === 0 || arg;
547+ return this;
548+};
549+
550+/**
551+ * Whether to store option values as properties on command object,
552+ * or store separately (specify false). In both cases the option values can be accessed using .opts().
553+ *
554+ * @param {boolean} value
555+ * @return {Command} Command for chaining
556+ * @api public
557+ */
558+
559+Command.prototype.storeOptionsAsProperties = function(value) {
560+ this._storeOptionsAsProperties = (value === undefined) || value;
561+ if (this.options.length) {
562+ // This is for programmer, not end user.
563+ console.error('Commander usage error: call storeOptionsAsProperties before adding options');
564+ }
565+ return this;
566+};
567+
568+/**
569+ * Whether to pass command to action handler,
570+ * or just the options (specify false).
571+ *
572+ * @param {boolean} value
573+ * @return {Command} Command for chaining
574+ * @api public
575+ */
576+
577+Command.prototype.passCommandToAction = function(value) {
578+ this._passCommandToAction = (value === undefined) || value;
579+ return this;
580+};
581+
582+/**
583+ * Store option value
584+ *
585+ * @param {String} key
586+ * @param {Object} value
587+ * @api private
588+ */
589+
590+Command.prototype._setOptionValue = function(key, value) {
591+ if (this._storeOptionsAsProperties) {
592+ this[key] = value;
593+ } else {
594+ this._optionValues[key] = value;
595+ }
596+};
597+
598+/**
599+ * Retrieve option value
600+ *
601+ * @param {String} key
602+ * @return {Object} value
603+ * @api private
604+ */
605+
606+Command.prototype._getOptionValue = function(key) {
607+ if (this._storeOptionsAsProperties) {
608+ return this[key];
609+ }
610+ return this._optionValues[key];
611+};
612+
613+/**
614+ * Parse `argv`, setting options and invoking commands when defined.
615+ *
616+ * @param {Array} argv
617+ * @return {Command} for chaining
618+ * @api public
619+ */
620+
621+Command.prototype.parse = function(argv) {
622+ // implicit help
623+ if (this.executables) this.addImplicitHelpCommand();
624+
625+ // store raw args
626+ this.rawArgs = argv;
627+
628+ // guess name
629+ this._name = this._name || basename(argv[1], '.js');
630+
631+ // github-style sub-commands with no sub-command
632+ if (this.executables && argv.length < 3 && !this.defaultExecutable) {
633+ // this user needs help
634+ argv.push(this._helpLongFlag);
635+ }
636+
637+ // process argv
638+ var normalized = this.normalize(argv.slice(2));
639+ var parsed = this.parseOptions(normalized);
640+ var args = this.args = parsed.args;
641+
642+ var result = this.parseArgs(this.args, parsed.unknown);
643+
644+ if (args[0] === 'help' && args.length === 1) this.help();
645+
646+ // Note for future: we could return early if we found an action handler in parseArgs, as none of following code needed?
647+
648+ // <cmd> --help
649+ if (args[0] === 'help') {
650+ args[0] = args[1];
651+ args[1] = this._helpLongFlag;
652+ } else {
653+ // If calling through to executable subcommand we could check for help flags before failing,
654+ // but a somewhat unlikely case since program options not passed to executable subcommands.
655+ // Wait for reports to see if check needed and what usage pattern is.
656+ this._checkForMissingMandatoryOptions();
657+ }
658+
659+ // executable sub-commands
660+ // (Debugging note for future: args[0] is not right if an action has been called)
661+ var name = result.args[0];
662+ var subCommand = null;
663+
664+ // Look for subcommand
665+ if (name) {
666+ subCommand = this.commands.find(function(command) {
667+ return command._name === name;
668+ });
669+ }
670+
671+ // Look for alias
672+ if (!subCommand && name) {
673+ subCommand = this.commands.find(function(command) {
674+ return command.alias() === name;
675+ });
676+ if (subCommand) {
677+ name = subCommand._name;
678+ args[0] = name;
679+ }
680+ }
681+
682+ // Look for default subcommand
683+ if (!subCommand && this.defaultExecutable) {
684+ name = this.defaultExecutable;
685+ args.unshift(name);
686+ subCommand = this.commands.find(function(command) {
687+ return command._name === name;
688+ });
689+ }
690+
691+ if (this._execs.has(name)) {
692+ return this.executeSubCommand(argv, args, parsed.unknown, subCommand ? subCommand._executableFile : undefined);
693+ }
694+
695+ return result;
696+};
697+
698+/**
699+ * Parse `argv`, setting options and invoking commands when defined.
700+ *
701+ * Use parseAsync instead of parse if any of your action handlers are async. Returns a Promise.
702+ *
703+ * @param {Array} argv
704+ * @return {Promise}
705+ * @api public
706+ */
707+Command.prototype.parseAsync = function(argv) {
708+ this.parse(argv);
709+ return Promise.all(this._actionResults);
710+};
711+
712+/**
713+ * Execute a sub-command executable.
714+ *
715+ * @param {Array} argv
716+ * @param {Array} args
717+ * @param {Array} unknown
718+ * @param {String} executableFile
719+ * @api private
720+ */
721+
722+Command.prototype.executeSubCommand = function(argv, args, unknown, executableFile) {
723+ args = args.concat(unknown);
724+
725+ if (!args.length) this.help();
726+
727+ var isExplicitJS = false; // Whether to use node to launch "executable"
728+
729+ // executable
730+ var pm = argv[1];
731+ // name of the subcommand, like `pm-install`
732+ var bin = basename(pm, path.extname(pm)) + '-' + args[0];
733+ if (executableFile != null) {
734+ bin = executableFile;
735+ // Check for same extensions as we scan for below so get consistent launch behaviour.
736+ var executableExt = path.extname(executableFile);
737+ isExplicitJS = executableExt === '.js' || executableExt === '.ts' || executableExt === '.mjs';
738+ }
739+
740+ // In case of globally installed, get the base dir where executable
741+ // subcommand file should be located at
742+ var baseDir;
743+
744+ var resolvedLink = fs.realpathSync(pm);
745+
746+ baseDir = dirname(resolvedLink);
747+
748+ // prefer local `./<bin>` to bin in the $PATH
749+ var localBin = path.join(baseDir, bin);
750+
751+ // whether bin file is a js script with explicit `.js` or `.ts` extension
752+ if (exists(localBin + '.js')) {
753+ bin = localBin + '.js';
754+ isExplicitJS = true;
755+ } else if (exists(localBin + '.ts')) {
756+ bin = localBin + '.ts';
757+ isExplicitJS = true;
758+ } else if (exists(localBin + '.mjs')) {
759+ bin = localBin + '.mjs';
760+ isExplicitJS = true;
761+ } else if (exists(localBin)) {
762+ bin = localBin;
763+ }
764+
765+ args = args.slice(1);
766+
767+ var proc;
768+ if (process.platform !== 'win32') {
769+ if (isExplicitJS) {
770+ args.unshift(bin);
771+ // add executable arguments to spawn
772+ args = incrementNodeInspectorPort(process.execArgv).concat(args);
773+
774+ proc = spawn(process.argv[0], args, { stdio: 'inherit' });
775+ } else {
776+ proc = spawn(bin, args, { stdio: 'inherit' });
777+ }
778+ } else {
779+ args.unshift(bin);
780+ // add executable arguments to spawn
781+ args = incrementNodeInspectorPort(process.execArgv).concat(args);
782+ proc = spawn(process.execPath, args, { stdio: 'inherit' });
783+ }
784+
785+ var signals = ['SIGUSR1', 'SIGUSR2', 'SIGTERM', 'SIGINT', 'SIGHUP'];
786+ signals.forEach(function(signal) {
787+ process.on(signal, function() {
788+ if (proc.killed === false && proc.exitCode === null) {
789+ proc.kill(signal);
790+ }
791+ });
792+ });
793+
794+ // By default terminate process when spawned process terminates.
795+ // Suppressing the exit if exitCallback defined is a bit messy and of limited use, but does allow process to stay running!
796+ const exitCallback = this._exitCallback;
797+ if (!exitCallback) {
798+ proc.on('close', process.exit.bind(process));
799+ } else {
800+ proc.on('close', () => {
801+ exitCallback(new CommanderError(process.exitCode || 0, 'commander.executeSubCommandAsync', '(close)'));
802+ });
803+ }
804+ proc.on('error', function(err) {
805+ if (err.code === 'ENOENT') {
806+ console.error('error: %s(1) does not exist, try --help', bin);
807+ } else if (err.code === 'EACCES') {
808+ console.error('error: %s(1) not executable. try chmod or run with root', bin);
809+ }
810+ if (!exitCallback) {
811+ process.exit(1);
812+ } else {
813+ const wrappedError = new CommanderError(1, 'commander.executeSubCommandAsync', '(error)');
814+ wrappedError.nestedError = err;
815+ exitCallback(wrappedError);
816+ }
817+ });
818+
819+ // Store the reference to the child process
820+ this.runningCommand = proc;
821+};
822+
823+/**
824+ * Normalize `args`, splitting joined short flags. For example
825+ * the arg "-abc" is equivalent to "-a -b -c".
826+ * This also normalizes equal sign and splits "--abc=def" into "--abc def".
827+ *
828+ * @param {Array} args
829+ * @return {Array}
830+ * @api private
831+ */
832+
833+Command.prototype.normalize = function(args) {
834+ var ret = [],
835+ arg,
836+ lastOpt,
837+ index,
838+ short,
839+ opt;
840+
841+ for (var i = 0, len = args.length; i < len; ++i) {
842+ arg = args[i];
843+ if (i > 0) {
844+ lastOpt = this.optionFor(args[i - 1]);
845+ }
846+
847+ if (arg === '--') {
848+ // Honor option terminator
849+ ret = ret.concat(args.slice(i));
850+ break;
851+ } else if (lastOpt && lastOpt.required) {
852+ ret.push(arg);
853+ } else if (arg.length > 2 && arg[0] === '-' && arg[1] !== '-') {
854+ short = arg.slice(0, 2);
855+ opt = this.optionFor(short);
856+ if (opt && (opt.required || opt.optional)) {
857+ ret.push(short);
858+ ret.push(arg.slice(2));
859+ } else {
860+ arg.slice(1).split('').forEach(function(c) {
861+ ret.push('-' + c);
862+ });
863+ }
864+ } else if (/^--/.test(arg) && ~(index = arg.indexOf('='))) {
865+ ret.push(arg.slice(0, index), arg.slice(index + 1));
866+ } else {
867+ ret.push(arg);
868+ }
869+ }
870+
871+ return ret;
872+};
873+
874+/**
875+ * Parse command `args`.
876+ *
877+ * When listener(s) are available those
878+ * callbacks are invoked, otherwise the "*"
879+ * event is emitted and those actions are invoked.
880+ *
881+ * @param {Array} args
882+ * @return {Command} for chaining
883+ * @api private
884+ */
885+
886+Command.prototype.parseArgs = function(args, unknown) {
887+ var name;
888+
889+ if (args.length) {
890+ name = args[0];
891+ if (this.listeners('command:' + name).length) {
892+ this.emit('command:' + args.shift(), args, unknown);
893+ } else {
894+ this.emit('command:*', args, unknown);
895+ }
896+ } else {
897+ outputHelpIfRequested(this, unknown);
898+
899+ // If there were no args and we have unknown options,
900+ // then they are extraneous and we need to error.
901+ if (unknown.length > 0 && !this.defaultExecutable) {
902+ this.unknownOption(unknown[0]);
903+ }
904+ if (this.commands.length === 0 &&
905+ this._args.filter(function(a) { return a.required; }).length === 0) {
906+ this.emit('command:*');
907+ }
908+ }
909+
910+ return this;
911+};
912+
913+/**
914+ * Return an option matching `arg` if any.
915+ *
916+ * @param {String} arg
917+ * @return {Option}
918+ * @api private
919+ */
920+
921+Command.prototype.optionFor = function(arg) {
922+ for (var i = 0, len = this.options.length; i < len; ++i) {
923+ if (this.options[i].is(arg)) {
924+ return this.options[i];
925+ }
926+ }
927+};
928+
929+/**
930+ * Display an error message if a mandatory option does not have a value.
931+ *
932+ * @api private
933+ */
934+
935+Command.prototype._checkForMissingMandatoryOptions = function() {
936+ // Walk up hierarchy so can call from action handler after checking for displaying help.
937+ for (var cmd = this; cmd; cmd = cmd.parent) {
938+ cmd.options.forEach((anOption) => {
939+ if (anOption.mandatory && (cmd._getOptionValue(anOption.attributeName()) === undefined)) {
940+ cmd.missingMandatoryOptionValue(anOption);
941+ }
942+ });
943+ }
944+};
945+
946+/**
947+ * Parse options from `argv` returning `argv`
948+ * void of these options.
949+ *
950+ * @param {Array} argv
951+ * @return {{args: Array, unknown: Array}}
952+ * @api public
953+ */
954+
955+Command.prototype.parseOptions = function(argv) {
956+ var args = [],
957+ len = argv.length,
958+ literal,
959+ option,
960+ arg;
961+
962+ var unknownOptions = [];
963+
964+ // parse options
965+ for (var i = 0; i < len; ++i) {
966+ arg = argv[i];
967+
968+ // literal args after --
969+ if (literal) {
970+ args.push(arg);
971+ continue;
972+ }
973+
974+ if (arg === '--') {
975+ literal = true;
976+ continue;
977+ }
978+
979+ // find matching Option
980+ option = this.optionFor(arg);
981+
982+ // option is defined
983+ if (option) {
984+ // requires arg
985+ if (option.required) {
986+ arg = argv[++i];
987+ if (arg == null) return this.optionMissingArgument(option);
988+ this.emit('option:' + option.name(), arg);
989+ // optional arg
990+ } else if (option.optional) {
991+ arg = argv[i + 1];
992+ if (arg == null || (arg[0] === '-' && arg !== '-')) {
993+ arg = null;
994+ } else {
995+ ++i;
996+ }
997+ this.emit('option:' + option.name(), arg);
998+ // flag
999+ } else {
1000+ this.emit('option:' + option.name());
1001+ }
1002+ continue;
1003+ }
1004+
1005+ // looks like an option
1006+ if (arg.length > 1 && arg[0] === '-') {
1007+ unknownOptions.push(arg);
1008+
1009+ // If the next argument looks like it might be
1010+ // an argument for this option, we pass it on.
1011+ // If it isn't, then it'll simply be ignored
1012+ if ((i + 1) < argv.length && (argv[i + 1][0] !== '-' || argv[i + 1] === '-')) {
1013+ unknownOptions.push(argv[++i]);
1014+ }
1015+ continue;
1016+ }
1017+
1018+ // arg
1019+ args.push(arg);
1020+ }
1021+
1022+ return { args: args, unknown: unknownOptions };
1023+};
1024+
1025+/**
1026+ * Return an object containing options as key-value pairs
1027+ *
1028+ * @return {Object}
1029+ * @api public
1030+ */
1031+Command.prototype.opts = function() {
1032+ if (this._storeOptionsAsProperties) {
1033+ // Preserve original behaviour so backwards compatible when still using properties
1034+ var result = {},
1035+ len = this.options.length;
1036+
1037+ for (var i = 0; i < len; i++) {
1038+ var key = this.options[i].attributeName();
1039+ result[key] = key === this._versionOptionName ? this._version : this[key];
1040+ }
1041+ return result;
1042+ }
1043+
1044+ return this._optionValues;
1045+};
1046+
1047+/**
1048+ * Argument `name` is missing.
1049+ *
1050+ * @param {String} name
1051+ * @api private
1052+ */
1053+
1054+Command.prototype.missingArgument = function(name) {
1055+ const message = `error: missing required argument '${name}'`;
1056+ console.error(message);
1057+ this._exit(1, 'commander.missingArgument', message);
1058+};
1059+
1060+/**
1061+ * `Option` is missing an argument, but received `flag` or nothing.
1062+ *
1063+ * @param {Option} option
1064+ * @param {String} [flag]
1065+ * @api private
1066+ */
1067+
1068+Command.prototype.optionMissingArgument = function(option, flag) {
1069+ let message;
1070+ if (flag) {
1071+ message = `error: option '${option.flags}' argument missing, got '${flag}'`;
1072+ } else {
1073+ message = `error: option '${option.flags}' argument missing`;
1074+ }
1075+ console.error(message);
1076+ this._exit(1, 'commander.optionMissingArgument', message);
1077+};
1078+
1079+/**
1080+ * `Option` does not have a value, and is a mandatory option.
1081+ *
1082+ * @param {Option} option
1083+ * @api private
1084+ */
1085+
1086+Command.prototype.missingMandatoryOptionValue = function(option) {
1087+ const message = `error: required option '${option.flags}' not specified`;
1088+ console.error(message);
1089+ this._exit(1, 'commander.missingMandatoryOptionValue', message);
1090+};
1091+
1092+/**
1093+ * Unknown option `flag`.
1094+ *
1095+ * @param {String} flag
1096+ * @api private
1097+ */
1098+
1099+Command.prototype.unknownOption = function(flag) {
1100+ if (this._allowUnknownOption) return;
1101+ const message = `error: unknown option '${flag}'`;
1102+ console.error(message);
1103+ this._exit(1, 'commander.unknownOption', message);
1104+};
1105+
1106+/**
1107+ * Variadic argument with `name` is not the last argument as required.
1108+ *
1109+ * @param {String} name
1110+ * @api private
1111+ */
1112+
1113+Command.prototype.variadicArgNotLast = function(name) {
1114+ const message = `error: variadic arguments must be last '${name}'`;
1115+ console.error(message);
1116+ this._exit(1, 'commander.variadicArgNotLast', message);
1117+};
1118+
1119+/**
1120+ * Set the program version to `str`.
1121+ *
1122+ * This method auto-registers the "-V, --version" flag
1123+ * which will print the version number when passed.
1124+ *
1125+ * You can optionally supply the flags and description to override the defaults.
1126+ *
1127+ * @param {String} str
1128+ * @param {String} [flags]
1129+ * @param {String} [description]
1130+ * @return {Command} for chaining
1131+ * @api public
1132+ */
1133+
1134+Command.prototype.version = function(str, flags, description) {
1135+ if (arguments.length === 0) return this._version;
1136+ this._version = str;
1137+ flags = flags || '-V, --version';
1138+ description = description || 'output the version number';
1139+ var versionOption = new Option(flags, description);
1140+ this._versionOptionName = versionOption.long.substr(2) || 'version';
1141+ this.options.push(versionOption);
1142+ var self = this;
1143+ this.on('option:' + this._versionOptionName, function() {
1144+ process.stdout.write(str + '\n');
1145+ self._exit(0, 'commander.version', str);
1146+ });
1147+ return this;
1148+};
1149+
1150+/**
1151+ * Set the description to `str`.
1152+ *
1153+ * @param {String} str
1154+ * @param {Object} [argsDescription]
1155+ * @return {String|Command}
1156+ * @api public
1157+ */
1158+
1159+Command.prototype.description = function(str, argsDescription) {
1160+ if (arguments.length === 0) return this._description;
1161+ this._description = str;
1162+ this._argsDescription = argsDescription;
1163+ return this;
1164+};
1165+
1166+/**
1167+ * Set an alias for the command
1168+ *
1169+ * @param {String} alias
1170+ * @return {String|Command}
1171+ * @api public
1172+ */
1173+
1174+Command.prototype.alias = function(alias) {
1175+ var command = this;
1176+ if (this.commands.length !== 0) {
1177+ command = this.commands[this.commands.length - 1];
1178+ }
1179+
1180+ if (arguments.length === 0) return command._alias;
1181+
1182+ if (alias === command._name) throw new Error('Command alias can\'t be the same as its name');
1183+
1184+ command._alias = alias;
1185+ return this;
1186+};
1187+
1188+/**
1189+ * Set / get the command usage `str`.
1190+ *
1191+ * @param {String} [str]
1192+ * @return {String|Command}
1193+ * @api public
1194+ */
1195+
1196+Command.prototype.usage = function(str) {
1197+ var args = this._args.map(function(arg) {
1198+ return humanReadableArgName(arg);
1199+ });
1200+
1201+ var usage = '[options]' +
1202+ (this.commands.length ? ' [command]' : '') +
1203+ (this._args.length ? ' ' + args.join(' ') : '');
1204+
1205+ if (arguments.length === 0) return this._usage || usage;
1206+ this._usage = str;
1207+
1208+ return this;
1209+};
1210+
1211+/**
1212+ * Get or set the name of the command
1213+ *
1214+ * @param {String} [str]
1215+ * @return {String|Command}
1216+ * @api public
1217+ */
1218+
1219+Command.prototype.name = function(str) {
1220+ if (arguments.length === 0) return this._name;
1221+ this._name = str;
1222+ return this;
1223+};
1224+
1225+/**
1226+ * Return prepared commands.
1227+ *
1228+ * @return {Array}
1229+ * @api private
1230+ */
1231+
1232+Command.prototype.prepareCommands = function() {
1233+ return this.commands.filter(function(cmd) {
1234+ return !cmd._noHelp;
1235+ }).map(function(cmd) {
1236+ var args = cmd._args.map(function(arg) {
1237+ return humanReadableArgName(arg);
1238+ }).join(' ');
1239+
1240+ return [
1241+ cmd._name +
1242+ (cmd._alias ? '|' + cmd._alias : '') +
1243+ (cmd.options.length ? ' [options]' : '') +
1244+ (args ? ' ' + args : ''),
1245+ cmd._description
1246+ ];
1247+ });
1248+};
1249+
1250+/**
1251+ * Return the largest command length.
1252+ *
1253+ * @return {Number}
1254+ * @api private
1255+ */
1256+
1257+Command.prototype.largestCommandLength = function() {
1258+ var commands = this.prepareCommands();
1259+ return commands.reduce(function(max, command) {
1260+ return Math.max(max, command[0].length);
1261+ }, 0);
1262+};
1263+
1264+/**
1265+ * Return the largest option length.
1266+ *
1267+ * @return {Number}
1268+ * @api private
1269+ */
1270+
1271+Command.prototype.largestOptionLength = function() {
1272+ var options = [].slice.call(this.options);
1273+ options.push({
1274+ flags: this._helpFlags
1275+ });
1276+
1277+ return options.reduce(function(max, option) {
1278+ return Math.max(max, option.flags.length);
1279+ }, 0);
1280+};
1281+
1282+/**
1283+ * Return the largest arg length.
1284+ *
1285+ * @return {Number}
1286+ * @api private
1287+ */
1288+
1289+Command.prototype.largestArgLength = function() {
1290+ return this._args.reduce(function(max, arg) {
1291+ return Math.max(max, arg.name.length);
1292+ }, 0);
1293+};
1294+
1295+/**
1296+ * Return the pad width.
1297+ *
1298+ * @return {Number}
1299+ * @api private
1300+ */
1301+
1302+Command.prototype.padWidth = function() {
1303+ var width = this.largestOptionLength();
1304+ if (this._argsDescription && this._args.length) {
1305+ if (this.largestArgLength() > width) {
1306+ width = this.largestArgLength();
1307+ }
1308+ }
1309+
1310+ if (this.commands && this.commands.length) {
1311+ if (this.largestCommandLength() > width) {
1312+ width = this.largestCommandLength();
1313+ }
1314+ }
1315+
1316+ return width;
1317+};
1318+
1319+/**
1320+ * Return help for options.
1321+ *
1322+ * @return {String}
1323+ * @api private
1324+ */
1325+
1326+Command.prototype.optionHelp = function() {
1327+ var width = this.padWidth();
1328+
1329+ var columns = process.stdout.columns || 80;
1330+ var descriptionWidth = columns - width - 4;
1331+
1332+ // Append the help information
1333+ return this.options.map(function(option) {
1334+ const fullDesc = option.description +
1335+ ((!option.negate && option.defaultValue !== undefined) ? ' (default: ' + JSON.stringify(option.defaultValue) + ')' : '');
1336+ return pad(option.flags, width) + ' ' + optionalWrap(fullDesc, descriptionWidth, width + 2);
1337+ }).concat([pad(this._helpFlags, width) + ' ' + optionalWrap(this._helpDescription, descriptionWidth, width + 2)])
1338+ .join('\n');
1339+};
1340+
1341+/**
1342+ * Return command help documentation.
1343+ *
1344+ * @return {String}
1345+ * @api private
1346+ */
1347+
1348+Command.prototype.commandHelp = function() {
1349+ if (!this.commands.length) return '';
1350+
1351+ var commands = this.prepareCommands();
1352+ var width = this.padWidth();
1353+
1354+ var columns = process.stdout.columns || 80;
1355+ var descriptionWidth = columns - width - 4;
1356+
1357+ return [
1358+ 'Commands:',
1359+ commands.map(function(cmd) {
1360+ var desc = cmd[1] ? ' ' + cmd[1] : '';
1361+ return (desc ? pad(cmd[0], width) : cmd[0]) + optionalWrap(desc, descriptionWidth, width + 2);
1362+ }).join('\n').replace(/^/gm, ' '),
1363+ ''
1364+ ].join('\n');
1365+};
1366+
1367+/**
1368+ * Return program help documentation.
1369+ *
1370+ * @return {String}
1371+ * @api private
1372+ */
1373+
1374+Command.prototype.helpInformation = function() {
1375+ var desc = [];
1376+ if (this._description) {
1377+ desc = [
1378+ this._description,
1379+ ''
1380+ ];
1381+
1382+ var argsDescription = this._argsDescription;
1383+ if (argsDescription && this._args.length) {
1384+ var width = this.padWidth();
1385+ var columns = process.stdout.columns || 80;
1386+ var descriptionWidth = columns - width - 5;
1387+ desc.push('Arguments:');
1388+ desc.push('');
1389+ this._args.forEach(function(arg) {
1390+ desc.push(' ' + pad(arg.name, width) + ' ' + wrap(argsDescription[arg.name], descriptionWidth, width + 4));
1391+ });
1392+ desc.push('');
1393+ }
1394+ }
1395+
1396+ var cmdName = this._name;
1397+ if (this._alias) {
1398+ cmdName = cmdName + '|' + this._alias;
1399+ }
1400+ var parentCmdNames = '';
1401+ for (var parentCmd = this.parent; parentCmd; parentCmd = parentCmd.parent) {
1402+ parentCmdNames = parentCmd.name() + ' ' + parentCmdNames;
1403+ }
1404+ var usage = [
1405+ 'Usage: ' + parentCmdNames + cmdName + ' ' + this.usage(),
1406+ ''
1407+ ];
1408+
1409+ var cmds = [];
1410+ var commandHelp = this.commandHelp();
1411+ if (commandHelp) cmds = [commandHelp];
1412+
1413+ var options = [
1414+ 'Options:',
1415+ '' + this.optionHelp().replace(/^/gm, ' '),
1416+ ''
1417+ ];
1418+
1419+ return usage
1420+ .concat(desc)
1421+ .concat(options)
1422+ .concat(cmds)
1423+ .join('\n');
1424+};
1425+
1426+/**
1427+ * Output help information for this command.
1428+ *
1429+ * When listener(s) are available for the helpLongFlag
1430+ * those callbacks are invoked.
1431+ *
1432+ * @api public
1433+ */
1434+
1435+Command.prototype.outputHelp = function(cb) {
1436+ if (!cb) {
1437+ cb = function(passthru) {
1438+ return passthru;
1439+ };
1440+ }
1441+ const cbOutput = cb(this.helpInformation());
1442+ if (typeof cbOutput !== 'string' && !Buffer.isBuffer(cbOutput)) {
1443+ throw new Error('outputHelp callback must return a string or a Buffer');
1444+ }
1445+ process.stdout.write(cbOutput);
1446+ this.emit(this._helpLongFlag);
1447+};
1448+
1449+/**
1450+ * You can pass in flags and a description to override the help
1451+ * flags and help description for your command.
1452+ *
1453+ * @param {String} [flags]
1454+ * @param {String} [description]
1455+ * @return {Command}
1456+ * @api public
1457+ */
1458+
1459+Command.prototype.helpOption = function(flags, description) {
1460+ this._helpFlags = flags || this._helpFlags;
1461+ this._helpDescription = description || this._helpDescription;
1462+
1463+ var splitFlags = this._helpFlags.split(/[ ,|]+/);
1464+
1465+ if (splitFlags.length > 1) this._helpShortFlag = splitFlags.shift();
1466+
1467+ this._helpLongFlag = splitFlags.shift();
1468+
1469+ return this;
1470+};
1471+
1472+/**
1473+ * Output help information and exit.
1474+ *
1475+ * @param {Function} [cb]
1476+ * @api public
1477+ */
1478+
1479+Command.prototype.help = function(cb) {
1480+ this.outputHelp(cb);
1481+ // exitCode: preserving original behaviour which was calling process.exit()
1482+ // message: do not have all displayed text available so only passing placeholder.
1483+ this._exit(process.exitCode || 0, 'commander.help', '(outputHelp)');
1484+};
1485+
1486+/**
1487+ * Camel-case the given `flag`
1488+ *
1489+ * @param {String} flag
1490+ * @return {String}
1491+ * @api private
1492+ */
1493+
1494+function camelcase(flag) {
1495+ return flag.split('-').reduce(function(str, word) {
1496+ return str + word[0].toUpperCase() + word.slice(1);
1497+ });
1498+}
1499+
1500+/**
1501+ * Pad `str` to `width`.
1502+ *
1503+ * @param {String} str
1504+ * @param {Number} width
1505+ * @return {String}
1506+ * @api private
1507+ */
1508+
1509+function pad(str, width) {
1510+ var len = Math.max(0, width - str.length);
1511+ return str + Array(len + 1).join(' ');
1512+}
1513+
1514+/**
1515+ * Wraps the given string with line breaks at the specified width while breaking
1516+ * words and indenting every but the first line on the left.
1517+ *
1518+ * @param {String} str
1519+ * @param {Number} width
1520+ * @param {Number} indent
1521+ * @return {String}
1522+ * @api private
1523+ */
1524+function wrap(str, width, indent) {
1525+ var regex = new RegExp('.{1,' + (width - 1) + '}([\\s\u200B]|$)|[^\\s\u200B]+?([\\s\u200B]|$)', 'g');
1526+ var lines = str.match(regex) || [];
1527+ return lines.map(function(line, i) {
1528+ if (line.slice(-1) === '\n') {
1529+ line = line.slice(0, line.length - 1);
1530+ }
1531+ return ((i > 0 && indent) ? Array(indent + 1).join(' ') : '') + line.trimRight();
1532+ }).join('\n');
1533+}
1534+
1535+/**
1536+ * Optionally wrap the given str to a max width of width characters per line
1537+ * while indenting with indent spaces. Do not wrap if insufficient width or
1538+ * string is manually formatted.
1539+ *
1540+ * @param {String} str
1541+ * @param {Number} width
1542+ * @param {Number} indent
1543+ * @return {String}
1544+ * @api private
1545+ */
1546+function optionalWrap(str, width, indent) {
1547+ // Detect manually wrapped and indented strings by searching for line breaks
1548+ // followed by multiple spaces/tabs.
1549+ if (str.match(/[\n]\s+/)) return str;
1550+ // Do not wrap to narrow columns (or can end up with a word per line).
1551+ const minWidth = 40;
1552+ if (width < minWidth) return str;
1553+
1554+ return wrap(str, width, indent);
1555+}
1556+
1557+/**
1558+ * Output help information if help flags specified
1559+ *
1560+ * @param {Command} cmd - command to output help for
1561+ * @param {Array} options - array of options to search for -h or --help
1562+ * @api private
1563+ */
1564+
1565+function outputHelpIfRequested(cmd, options) {
1566+ options = options || [];
1567+
1568+ for (var i = 0; i < options.length; i++) {
1569+ if (options[i] === cmd._helpLongFlag || options[i] === cmd._helpShortFlag) {
1570+ cmd.outputHelp();
1571+ // (Do not have all displayed text available so only passing placeholder.)
1572+ cmd._exit(0, 'commander.helpDisplayed', '(outputHelp)');
1573+ }
1574+ }
1575+}
1576+
1577+/**
1578+ * Takes an argument and returns its human readable equivalent for help usage.
1579+ *
1580+ * @param {Object} arg
1581+ * @return {String}
1582+ * @api private
1583+ */
1584+
1585+function humanReadableArgName(arg) {
1586+ var nameOutput = arg.name + (arg.variadic === true ? '...' : '');
1587+
1588+ return arg.required
1589+ ? '<' + nameOutput + '>'
1590+ : '[' + nameOutput + ']';
1591+}
1592+
1593+// for versions before node v0.8 when there weren't `fs.existsSync`
1594+function exists(file) {
1595+ try {
1596+ if (fs.statSync(file).isFile()) {
1597+ return true;
1598+ }
1599+ } catch (e) {
1600+ return false;
1601+ }
1602+}
1603+
1604+/**
1605+ * Scan arguments and increment port number for inspect calls (to avoid conflicts when spawning new command).
1606+ *
1607+ * @param {string[]} args - array of arguments from node.execArgv
1608+ * @returns {string[]}
1609+ * @api private
1610+ */
1611+
1612+function incrementNodeInspectorPort(args) {
1613+ // Testing for these options:
1614+ // --inspect[=[host:]port]
1615+ // --inspect-brk[=[host:]port]
1616+ // --inspect-port=[host:]port
1617+ return args.map((arg) => {
1618+ var result = arg;
1619+ if (arg.indexOf('--inspect') === 0) {
1620+ var debugOption;
1621+ var debugHost = '127.0.0.1';
1622+ var debugPort = '9229';
1623+ var match;
1624+ if ((match = arg.match(/^(--inspect(-brk)?)$/)) !== null) {
1625+ // e.g. --inspect
1626+ debugOption = match[1];
1627+ } else if ((match = arg.match(/^(--inspect(-brk|-port)?)=([^:]+)$/)) !== null) {
1628+ debugOption = match[1];
1629+ if (/^\d+$/.test(match[3])) {
1630+ // e.g. --inspect=1234
1631+ debugPort = match[3];
1632+ } else {
1633+ // e.g. --inspect=localhost
1634+ debugHost = match[3];
1635+ }
1636+ } else if ((match = arg.match(/^(--inspect(-brk|-port)?)=([^:]+):(\d+)$/)) !== null) {
1637+ // e.g. --inspect=localhost:1234
1638+ debugOption = match[1];
1639+ debugHost = match[3];
1640+ debugPort = match[4];
1641+ }
1642+
1643+ if (debugOption && debugPort !== '0') {
1644+ result = `${debugOption}=${debugHost}:${parseInt(debugPort) + 1}`;
1645+ }
1646+ }
1647+ return result;
1648+ });
1649+}
@@ -0,0 +1,1649 @@
1+/**
2+ * Module dependencies.
3+ */
4+
5+var EventEmitter = require('events').EventEmitter;
6+var spawn = require('child_process').spawn;
7+var path = require('path');
8+var dirname = path.dirname;
9+var basename = path.basename;
10+var fs = require('fs');
11+
12+/**
13+ * Inherit `Command` from `EventEmitter.prototype`.
14+ */
15+
16+require('util').inherits(Command, EventEmitter);
17+
18+/**
19+ * Expose the root command.
20+ */
21+
22+exports = module.exports = new Command();
23+
24+/**
25+ * Expose `Command`.
26+ */
27+
28+exports.Command = Command;
29+
30+/**
31+ * Expose `Option`.
32+ */
33+
34+exports.Option = Option;
35+
36+/**
37+ * Initialize a new `Option` with the given `flags` and `description`.
38+ *
39+ * @param {String} flags
40+ * @param {String} description
41+ * @api public
42+ */
43+
44+function Option(flags, description) {
45+ this.flags = flags;
46+ this.required = flags.indexOf('<') >= 0; // A value must be supplied when the option is specified.
47+ this.optional = flags.indexOf('[') >= 0; // A value is optional when the option is specified.
48+ this.mandatory = false; // The option must have a value after parsing, which usually means it must be specified on command line.
49+ this.negate = flags.indexOf('-no-') !== -1;
50+ flags = flags.split(/[ ,|]+/);
51+ if (flags.length > 1 && !/^[[<]/.test(flags[1])) this.short = flags.shift();
52+ this.long = flags.shift();
53+ this.description = description || '';
54+}
55+
56+/**
57+ * Return option name.
58+ *
59+ * @return {String}
60+ * @api private
61+ */
62+
63+Option.prototype.name = function() {
64+ return this.long.replace(/^--/, '');
65+};
66+
67+/**
68+ * Return option name, in a camelcase format that can be used
69+ * as a object attribute key.
70+ *
71+ * @return {String}
72+ * @api private
73+ */
74+
75+Option.prototype.attributeName = function() {
76+ return camelcase(this.name().replace(/^no-/, ''));
77+};
78+
79+/**
80+ * Check if `arg` matches the short or long flag.
81+ *
82+ * @param {String} arg
83+ * @return {Boolean}
84+ * @api private
85+ */
86+
87+Option.prototype.is = function(arg) {
88+ return this.short === arg || this.long === arg;
89+};
90+
91+/**
92+ * CommanderError class
93+ * @class
94+ */
95+class CommanderError extends Error {
96+ /**
97+ * Constructs the CommanderError class
98+ * @param {Number} exitCode suggested exit code which could be used with process.exit
99+ * @param {String} code an id string representing the error
100+ * @param {String} message human-readable description of the error
101+ * @constructor
102+ */
103+ constructor(exitCode, code, message) {
104+ super(message);
105+ // properly capture stack trace in Node.js
106+ Error.captureStackTrace(this, this.constructor);
107+ this.name = this.constructor.name;
108+ this.code = code;
109+ this.exitCode = exitCode;
110+ }
111+}
112+
113+exports.CommanderError = CommanderError;
114+
115+/**
116+ * Initialize a new `Command`.
117+ *
118+ * @param {String} [name]
119+ * @api public
120+ */
121+
122+function Command(name) {
123+ this.commands = [];
124+ this.options = [];
125+ this._execs = new Set();
126+ this._allowUnknownOption = false;
127+ this._args = [];
128+ this._name = name || '';
129+ this._optionValues = {};
130+ this._storeOptionsAsProperties = true; // backwards compatible by default
131+ this._passCommandToAction = true; // backwards compatible by default
132+ this._actionResults = [];
133+
134+ this._helpFlags = '-h, --help';
135+ this._helpDescription = 'output usage information';
136+ this._helpShortFlag = '-h';
137+ this._helpLongFlag = '--help';
138+}
139+
140+/**
141+ * Define a command.
142+ *
143+ * There are two styles of command: pay attention to where to put the description.
144+ *
145+ * Examples:
146+ *
147+ * // Command implemented using action handler (description is supplied separately to `.command`)
148+ * program
149+ * .command('clone <source> [destination]')
150+ * .description('clone a repository into a newly created directory')
151+ * .action((source, destination) => {
152+ * console.log('clone command called');
153+ * });
154+ *
155+ * // Command implemented using separate executable file (description is second parameter to `.command`)
156+ * program
157+ * .command('start <service>', 'start named service')
158+ * .command('stop [service]', 'stop named service, or all if no name supplied');
159+ *
160+ * @param {string} nameAndArgs - command name and arguments, args are `<required>` or `[optional]` and last may also be `variadic...`
161+ * @param {Object|string} [actionOptsOrExecDesc] - configuration options (for action), or description (for executable)
162+ * @param {Object} [execOpts] - configuration options (for executable)
163+ * @return {Command} returns new command for action handler, or top-level command for executable command
164+ * @api public
165+ */
166+
167+Command.prototype.command = function(nameAndArgs, actionOptsOrExecDesc, execOpts) {
168+ var desc = actionOptsOrExecDesc;
169+ var opts = execOpts;
170+ if (typeof desc === 'object' && desc !== null) {
171+ opts = desc;
172+ desc = null;
173+ }
174+ opts = opts || {};
175+ var args = nameAndArgs.split(/ +/);
176+ var cmd = new Command(args.shift());
177+
178+ if (desc) {
179+ cmd.description(desc);
180+ this.executables = true;
181+ this._execs.add(cmd._name);
182+ if (opts.isDefault) this.defaultExecutable = cmd._name;
183+ }
184+ cmd._noHelp = !!opts.noHelp;
185+ cmd._helpFlags = this._helpFlags;
186+ cmd._helpDescription = this._helpDescription;
187+ cmd._helpShortFlag = this._helpShortFlag;
188+ cmd._helpLongFlag = this._helpLongFlag;
189+ cmd._exitCallback = this._exitCallback;
190+ cmd._storeOptionsAsProperties = this._storeOptionsAsProperties;
191+ cmd._passCommandToAction = this._passCommandToAction;
192+
193+ cmd._executableFile = opts.executableFile; // Custom name for executable file
194+ this.commands.push(cmd);
195+ cmd.parseExpectedArgs(args);
196+ cmd.parent = this;
197+
198+ if (desc) return this;
199+ return cmd;
200+};
201+
202+/**
203+ * Define argument syntax for the top-level command.
204+ *
205+ * @api public
206+ */
207+
208+Command.prototype.arguments = function(desc) {
209+ return this.parseExpectedArgs(desc.split(/ +/));
210+};
211+
212+/**
213+ * Add an implicit `help [cmd]` subcommand
214+ * which invokes `--help` for the given command.
215+ *
216+ * @api private
217+ */
218+
219+Command.prototype.addImplicitHelpCommand = function() {
220+ this.command('help [cmd]', 'display help for [cmd]');
221+};
222+
223+/**
224+ * Parse expected `args`.
225+ *
226+ * For example `["[type]"]` becomes `[{ required: false, name: 'type' }]`.
227+ *
228+ * @param {Array} args
229+ * @return {Command} for chaining
230+ * @api public
231+ */
232+
233+Command.prototype.parseExpectedArgs = function(args) {
234+ if (!args.length) return;
235+ var self = this;
236+ args.forEach(function(arg) {
237+ var argDetails = {
238+ required: false,
239+ name: '',
240+ variadic: false
241+ };
242+
243+ switch (arg[0]) {
244+ case '<':
245+ argDetails.required = true;
246+ argDetails.name = arg.slice(1, -1);
247+ break;
248+ case '[':
249+ argDetails.name = arg.slice(1, -1);
250+ break;
251+ }
252+
253+ if (argDetails.name.length > 3 && argDetails.name.slice(-3) === '...') {
254+ argDetails.variadic = true;
255+ argDetails.name = argDetails.name.slice(0, -3);
256+ }
257+ if (argDetails.name) {
258+ self._args.push(argDetails);
259+ }
260+ });
261+ return this;
262+};
263+
264+/**
265+ * Register callback to use as replacement for calling process.exit.
266+ *
267+ * @param {Function} [fn] optional callback which will be passed a CommanderError, defaults to throwing
268+ * @return {Command} for chaining
269+ * @api public
270+ */
271+
272+Command.prototype.exitOverride = function(fn) {
273+ if (fn) {
274+ this._exitCallback = fn;
275+ } else {
276+ this._exitCallback = function(err) {
277+ if (err.code !== 'commander.executeSubCommandAsync') {
278+ throw err;
279+ } else {
280+ // Async callback from spawn events, not useful to throw.
281+ }
282+ };
283+ }
284+ return this;
285+};
286+
287+/**
288+ * Call process.exit, and _exitCallback if defined.
289+ *
290+ * @param {Number} exitCode exit code for using with process.exit
291+ * @param {String} code an id string representing the error
292+ * @param {String} message human-readable description of the error
293+ * @return never
294+ * @api private
295+ */
296+
297+Command.prototype._exit = function(exitCode, code, message) {
298+ if (this._exitCallback) {
299+ this._exitCallback(new CommanderError(exitCode, code, message));
300+ // Expecting this line is not reached.
301+ }
302+ process.exit(exitCode);
303+};
304+
305+/**
306+ * Register callback `fn` for the command.
307+ *
308+ * Examples:
309+ *
310+ * program
311+ * .command('help')
312+ * .description('display verbose help')
313+ * .action(function() {
314+ * // output help here
315+ * });
316+ *
317+ * @param {Function} fn
318+ * @return {Command} for chaining
319+ * @api public
320+ */
321+
322+Command.prototype.action = function(fn) {
323+ var self = this;
324+ var listener = function(args, unknown) {
325+ // Parse any so-far unknown options
326+ args = args || [];
327+ unknown = unknown || [];
328+
329+ var parsed = self.parseOptions(unknown);
330+
331+ // Output help if necessary
332+ outputHelpIfRequested(self, parsed.unknown);
333+ self._checkForMissingMandatoryOptions();
334+
335+ // If there are still any unknown options, then we simply
336+ // die, unless someone asked for help, in which case we give it
337+ // to them, and then we die.
338+ if (parsed.unknown.length > 0) {
339+ self.unknownOption(parsed.unknown[0]);
340+ }
341+
342+ // Leftover arguments need to be pushed back. Fixes issue #56
343+ if (parsed.args.length) args = parsed.args.concat(args);
344+
345+ self._args.forEach(function(arg, i) {
346+ if (arg.required && args[i] == null) {
347+ self.missingArgument(arg.name);
348+ } else if (arg.variadic) {
349+ if (i !== self._args.length - 1) {
350+ self.variadicArgNotLast(arg.name);
351+ }
352+
353+ args[i] = args.splice(i);
354+ }
355+ });
356+
357+ // The .action callback takes an extra parameter which is the command itself.
358+ var expectedArgsCount = self._args.length;
359+ var actionArgs = args.slice(0, expectedArgsCount);
360+ if (self._passCommandToAction) {
361+ actionArgs[expectedArgsCount] = self;
362+ } else {
363+ actionArgs[expectedArgsCount] = self.opts();
364+ }
365+ // Add the extra arguments so available too.
366+ if (args.length > expectedArgsCount) {
367+ actionArgs.push(args.slice(expectedArgsCount));
368+ }
369+
370+ const actionResult = fn.apply(self, actionArgs);
371+ // Remember result in case it is async. Assume parseAsync getting called on root.
372+ let rootCommand = self;
373+ while (rootCommand.parent) {
374+ rootCommand = rootCommand.parent;
375+ }
376+ rootCommand._actionResults.push(actionResult);
377+ };
378+ var parent = this.parent || this;
379+ var name = parent === this ? '*' : this._name;
380+ parent.on('command:' + name, listener);
381+ if (this._alias) parent.on('command:' + this._alias, listener);
382+ return this;
383+};
384+
385+/**
386+ * Internal implementation shared by .option() and .requiredOption()
387+ *
388+ * @param {Object} config
389+ * @param {String} flags
390+ * @param {String} description
391+ * @param {Function|*} [fn] - custom option processing function or default vaue
392+ * @param {*} [defaultValue]
393+ * @return {Command} for chaining
394+ * @api private
395+ */
396+
397+Command.prototype._optionEx = function(config, flags, description, fn, defaultValue) {
398+ var self = this,
399+ option = new Option(flags, description),
400+ oname = option.name(),
401+ name = option.attributeName();
402+ option.mandatory = !!config.mandatory;
403+
404+ // default as 3rd arg
405+ if (typeof fn !== 'function') {
406+ if (fn instanceof RegExp) {
407+ // This is a bit simplistic (especially no error messages), and probably better handled by caller using custom option processing.
408+ // No longer documented in README, but still present for backwards compatibility.
409+ var regex = fn;
410+ fn = function(val, def) {
411+ var m = regex.exec(val);
412+ return m ? m[0] : def;
413+ };
414+ } else {
415+ defaultValue = fn;
416+ fn = null;
417+ }
418+ }
419+
420+ // preassign default value for --no-*, [optional], <required>, or plain flag if boolean value
421+ if (option.negate || option.optional || option.required || typeof defaultValue === 'boolean') {
422+ // when --no-foo we make sure default is true, unless a --foo option is already defined
423+ if (option.negate) {
424+ const positiveLongFlag = option.long.replace(/^--no-/, '--');
425+ defaultValue = self.optionFor(positiveLongFlag) ? self._getOptionValue(name) : true;
426+ }
427+ // preassign only if we have a default
428+ if (defaultValue !== undefined) {
429+ self._setOptionValue(name, defaultValue);
430+ option.defaultValue = defaultValue;
431+ }
432+ }
433+
434+ // register the option
435+ this.options.push(option);
436+
437+ // when it's passed assign the value
438+ // and conditionally invoke the callback
439+ this.on('option:' + oname, function(val) {
440+ // coercion
441+ if (val !== null && fn) {
442+ val = fn(val, self._getOptionValue(name) === undefined ? defaultValue : self._getOptionValue(name));
443+ }
444+
445+ // unassigned or boolean value
446+ if (typeof self._getOptionValue(name) === 'boolean' || typeof self._getOptionValue(name) === 'undefined') {
447+ // if no value, negate false, and we have a default, then use it!
448+ if (val == null) {
449+ self._setOptionValue(name, option.negate
450+ ? false
451+ : defaultValue || true);
452+ } else {
453+ self._setOptionValue(name, val);
454+ }
455+ } else if (val !== null) {
456+ // reassign
457+ self._setOptionValue(name, option.negate ? false : val);
458+ }
459+ });
460+
461+ return this;
462+};
463+
464+/**
465+ * Define option with `flags`, `description` and optional
466+ * coercion `fn`.
467+ *
468+ * The `flags` string should contain both the short and long flags,
469+ * separated by comma, a pipe or space. The following are all valid
470+ * all will output this way when `--help` is used.
471+ *
472+ * "-p, --pepper"
473+ * "-p|--pepper"
474+ * "-p --pepper"
475+ *
476+ * Examples:
477+ *
478+ * // simple boolean defaulting to undefined
479+ * program.option('-p, --pepper', 'add pepper');
480+ *
481+ * program.pepper
482+ * // => undefined
483+ *
484+ * --pepper
485+ * program.pepper
486+ * // => true
487+ *
488+ * // simple boolean defaulting to true (unless non-negated option is also defined)
489+ * program.option('-C, --no-cheese', 'remove cheese');
490+ *
491+ * program.cheese
492+ * // => true
493+ *
494+ * --no-cheese
495+ * program.cheese
496+ * // => false
497+ *
498+ * // required argument
499+ * program.option('-C, --chdir <path>', 'change the working directory');
500+ *
501+ * --chdir /tmp
502+ * program.chdir
503+ * // => "/tmp"
504+ *
505+ * // optional argument
506+ * program.option('-c, --cheese [type]', 'add cheese [marble]');
507+ *
508+ * @param {String} flags
509+ * @param {String} description
510+ * @param {Function|*} [fn] - custom option processing function or default vaue
511+ * @param {*} [defaultValue]
512+ * @return {Command} for chaining
513+ * @api public
514+ */
515+
516+Command.prototype.option = function(flags, description, fn, defaultValue) {
517+ return this._optionEx({}, flags, description, fn, defaultValue);
518+};
519+
520+/*
521+ * Add a required option which must have a value after parsing. This usually means
522+ * the option must be specified on the command line. (Otherwise the same as .option().)
523+ *
524+ * The `flags` string should contain both the short and long flags, separated by comma, a pipe or space.
525+ *
526+ * @param {String} flags
527+ * @param {String} description
528+ * @param {Function|*} [fn] - custom option processing function or default vaue
529+ * @param {*} [defaultValue]
530+ * @return {Command} for chaining
531+ * @api public
532+ */
533+
534+Command.prototype.requiredOption = function(flags, description, fn, defaultValue) {
535+ return this._optionEx({ mandatory: true }, flags, description, fn, defaultValue);
536+};
537+
538+/**
539+ * Allow unknown options on the command line.
540+ *
541+ * @param {Boolean} arg if `true` or omitted, no error will be thrown
542+ * for unknown options.
543+ * @api public
544+ */
545+Command.prototype.allowUnknownOption = function(arg) {
546+ this._allowUnknownOption = arguments.length === 0 || arg;
547+ return this;
548+};
549+
550+/**
551+ * Whether to store option values as properties on command object,
552+ * or store separately (specify false). In both cases the option values can be accessed using .opts().
553+ *
554+ * @param {boolean} value
555+ * @return {Command} Command for chaining
556+ * @api public
557+ */
558+
559+Command.prototype.storeOptionsAsProperties = function(value) {
560+ this._storeOptionsAsProperties = (value === undefined) || value;
561+ if (this.options.length) {
562+ // This is for programmer, not end user.
563+ console.error('Commander usage error: call storeOptionsAsProperties before adding options');
564+ }
565+ return this;
566+};
567+
568+/**
569+ * Whether to pass command to action handler,
570+ * or just the options (specify false).
571+ *
572+ * @param {boolean} value
573+ * @return {Command} Command for chaining
574+ * @api public
575+ */
576+
577+Command.prototype.passCommandToAction = function(value) {
578+ this._passCommandToAction = (value === undefined) || value;
579+ return this;
580+};
581+
582+/**
583+ * Store option value
584+ *
585+ * @param {String} key
586+ * @param {Object} value
587+ * @api private
588+ */
589+
590+Command.prototype._setOptionValue = function(key, value) {
591+ if (this._storeOptionsAsProperties) {
592+ this[key] = value;
593+ } else {
594+ this._optionValues[key] = value;
595+ }
596+};
597+
598+/**
599+ * Retrieve option value
600+ *
601+ * @param {String} key
602+ * @return {Object} value
603+ * @api private
604+ */
605+
606+Command.prototype._getOptionValue = function(key) {
607+ if (this._storeOptionsAsProperties) {
608+ return this[key];
609+ }
610+ return this._optionValues[key];
611+};
612+
613+/**
614+ * Parse `argv`, setting options and invoking commands when defined.
615+ *
616+ * @param {Array} argv
617+ * @return {Command} for chaining
618+ * @api public
619+ */
620+
621+Command.prototype.parse = function(argv) {
622+ // implicit help
623+ if (this.executables) this.addImplicitHelpCommand();
624+
625+ // store raw args
626+ this.rawArgs = argv;
627+
628+ // guess name
629+ this._name = this._name || basename(argv[1], '.js');
630+
631+ // github-style sub-commands with no sub-command
632+ if (this.executables && argv.length < 3 && !this.defaultExecutable) {
633+ // this user needs help
634+ argv.push(this._helpLongFlag);
635+ }
636+
637+ // process argv
638+ var normalized = this.normalize(argv.slice(2));
639+ var parsed = this.parseOptions(normalized);
640+ var args = this.args = parsed.args;
641+
642+ var result = this.parseArgs(this.args, parsed.unknown);
643+
644+ if (args[0] === 'help' && args.length === 1) this.help();
645+
646+ // Note for future: we could return early if we found an action handler in parseArgs, as none of following code needed?
647+
648+ // <cmd> --help
649+ if (args[0] === 'help') {
650+ args[0] = args[1];
651+ args[1] = this._helpLongFlag;
652+ } else {
653+ // If calling through to executable subcommand we could check for help flags before failing,
654+ // but a somewhat unlikely case since program options not passed to executable subcommands.
655+ // Wait for reports to see if check needed and what usage pattern is.
656+ this._checkForMissingMandatoryOptions();
657+ }
658+
659+ // executable sub-commands
660+ // (Debugging note for future: args[0] is not right if an action has been called)
661+ var name = result.args[0];
662+ var subCommand = null;
663+
664+ // Look for subcommand
665+ if (name) {
666+ subCommand = this.commands.find(function(command) {
667+ return command._name === name;
668+ });
669+ }
670+
671+ // Look for alias
672+ if (!subCommand && name) {
673+ subCommand = this.commands.find(function(command) {
674+ return command.alias() === name;
675+ });
676+ if (subCommand) {
677+ name = subCommand._name;
678+ args[0] = name;
679+ }
680+ }
681+
682+ // Look for default subcommand
683+ if (!subCommand && this.defaultExecutable) {
684+ name = this.defaultExecutable;
685+ args.unshift(name);
686+ subCommand = this.commands.find(function(command) {
687+ return command._name === name;
688+ });
689+ }
690+
691+ if (this._execs.has(name)) {
692+ return this.executeSubCommand(argv, args, parsed.unknown, subCommand ? subCommand._executableFile : undefined);
693+ }
694+
695+ return result;
696+};
697+
698+/**
699+ * Parse `argv`, setting options and invoking commands when defined.
700+ *
701+ * Use parseAsync instead of parse if any of your action handlers are async. Returns a Promise.
702+ *
703+ * @param {Array} argv
704+ * @return {Promise}
705+ * @api public
706+ */
707+Command.prototype.parseAsync = function(argv) {
708+ this.parse(argv);
709+ return Promise.all(this._actionResults);
710+};
711+
712+/**
713+ * Execute a sub-command executable.
714+ *
715+ * @param {Array} argv
716+ * @param {Array} args
717+ * @param {Array} unknown
718+ * @param {String} executableFile
719+ * @api private
720+ */
721+
722+Command.prototype.executeSubCommand = function(argv, args, unknown, executableFile) {
723+ args = args.concat(unknown);
724+
725+ if (!args.length) this.help();
726+
727+ var isExplicitJS = false; // Whether to use node to launch "executable"
728+
729+ // executable
730+ var pm = argv[1];
731+ // name of the subcommand, like `pm-install`
732+ var bin = basename(pm, path.extname(pm)) + '-' + args[0];
733+ if (executableFile != null) {
734+ bin = executableFile;
735+ // Check for same extensions as we scan for below so get consistent launch behaviour.
736+ var executableExt = path.extname(executableFile);
737+ isExplicitJS = executableExt === '.js' || executableExt === '.ts' || executableExt === '.mjs';
738+ }
739+
740+ // In case of globally installed, get the base dir where executable
741+ // subcommand file should be located at
742+ var baseDir;
743+
744+ var resolvedLink = fs.realpathSync(pm);
745+
746+ baseDir = dirname(resolvedLink);
747+
748+ // prefer local `./<bin>` to bin in the $PATH
749+ var localBin = path.join(baseDir, bin);
750+
751+ // whether bin file is a js script with explicit `.js` or `.ts` extension
752+ if (exists(localBin + '.js')) {
753+ bin = localBin + '.js';
754+ isExplicitJS = true;
755+ } else if (exists(localBin + '.ts')) {
756+ bin = localBin + '.ts';
757+ isExplicitJS = true;
758+ } else if (exists(localBin + '.mjs')) {
759+ bin = localBin + '.mjs';
760+ isExplicitJS = true;
761+ } else if (exists(localBin)) {
762+ bin = localBin;
763+ }
764+
765+ args = args.slice(1);
766+
767+ var proc;
768+ if (process.platform !== 'win32') {
769+ if (isExplicitJS) {
770+ args.unshift(bin);
771+ // add executable arguments to spawn
772+ args = incrementNodeInspectorPort(process.execArgv).concat(args);
773+
774+ proc = spawn(process.argv[0], args, { stdio: 'inherit' });
775+ } else {
776+ proc = spawn(bin, args, { stdio: 'inherit' });
777+ }
778+ } else {
779+ args.unshift(bin);
780+ // add executable arguments to spawn
781+ args = incrementNodeInspectorPort(process.execArgv).concat(args);
782+ proc = spawn(process.execPath, args, { stdio: 'inherit' });
783+ }
784+
785+ var signals = ['SIGUSR1', 'SIGUSR2', 'SIGTERM', 'SIGINT', 'SIGHUP'];
786+ signals.forEach(function(signal) {
787+ process.on(signal, function() {
788+ if (proc.killed === false && proc.exitCode === null) {
789+ proc.kill(signal);
790+ }
791+ });
792+ });
793+
794+ // By default terminate process when spawned process terminates.
795+ // Suppressing the exit if exitCallback defined is a bit messy and of limited use, but does allow process to stay running!
796+ const exitCallback = this._exitCallback;
797+ if (!exitCallback) {
798+ proc.on('close', process.exit.bind(process));
799+ } else {
800+ proc.on('close', () => {
801+ exitCallback(new CommanderError(process.exitCode || 0, 'commander.executeSubCommandAsync', '(close)'));
802+ });
803+ }
804+ proc.on('error', function(err) {
805+ if (err.code === 'ENOENT') {
806+ console.error('error: %s(1) does not exist, try --help', bin);
807+ } else if (err.code === 'EACCES') {
808+ console.error('error: %s(1) not executable. try chmod or run with root', bin);
809+ }
810+ if (!exitCallback) {
811+ process.exit(1);
812+ } else {
813+ const wrappedError = new CommanderError(1, 'commander.executeSubCommandAsync', '(error)');
814+ wrappedError.nestedError = err;
815+ exitCallback(wrappedError);
816+ }
817+ });
818+
819+ // Store the reference to the child process
820+ this.runningCommand = proc;
821+};
822+
823+/**
824+ * Normalize `args`, splitting joined short flags. For example
825+ * the arg "-abc" is equivalent to "-a -b -c".
826+ * This also normalizes equal sign and splits "--abc=def" into "--abc def".
827+ *
828+ * @param {Array} args
829+ * @return {Array}
830+ * @api private
831+ */
832+
833+Command.prototype.normalize = function(args) {
834+ var ret = [],
835+ arg,
836+ lastOpt,
837+ index,
838+ short,
839+ opt;
840+
841+ for (var i = 0, len = args.length; i < len; ++i) {
842+ arg = args[i];
843+ if (i > 0) {
844+ lastOpt = this.optionFor(args[i - 1]);
845+ }
846+
847+ if (arg === '--') {
848+ // Honor option terminator
849+ ret = ret.concat(args.slice(i));
850+ break;
851+ } else if (lastOpt && lastOpt.required) {
852+ ret.push(arg);
853+ } else if (arg.length > 2 && arg[0] === '-' && arg[1] !== '-') {
854+ short = arg.slice(0, 2);
855+ opt = this.optionFor(short);
856+ if (opt && (opt.required || opt.optional)) {
857+ ret.push(short);
858+ ret.push(arg.slice(2));
859+ } else {
860+ arg.slice(1).split('').forEach(function(c) {
861+ ret.push('-' + c);
862+ });
863+ }
864+ } else if (/^--/.test(arg) && ~(index = arg.indexOf('='))) {
865+ ret.push(arg.slice(0, index), arg.slice(index + 1));
866+ } else {
867+ ret.push(arg);
868+ }
869+ }
870+
871+ return ret;
872+};
873+
874+/**
875+ * Parse command `args`.
876+ *
877+ * When listener(s) are available those
878+ * callbacks are invoked, otherwise the "*"
879+ * event is emitted and those actions are invoked.
880+ *
881+ * @param {Array} args
882+ * @return {Command} for chaining
883+ * @api private
884+ */
885+
886+Command.prototype.parseArgs = function(args, unknown) {
887+ var name;
888+
889+ if (args.length) {
890+ name = args[0];
891+ if (this.listeners('command:' + name).length) {
892+ this.emit('command:' + args.shift(), args, unknown);
893+ } else {
894+ this.emit('command:*', args, unknown);
895+ }
896+ } else {
897+ outputHelpIfRequested(this, unknown);
898+
899+ // If there were no args and we have unknown options,
900+ // then they are extraneous and we need to error.
901+ if (unknown.length > 0 && !this.defaultExecutable) {
902+ this.unknownOption(unknown[0]);
903+ }
904+ if (this.commands.length === 0 &&
905+ this._args.filter(function(a) { return a.required; }).length === 0) {
906+ this.emit('command:*');
907+ }
908+ }
909+
910+ return this;
911+};
912+
913+/**
914+ * Return an option matching `arg` if any.
915+ *
916+ * @param {String} arg
917+ * @return {Option}
918+ * @api private
919+ */
920+
921+Command.prototype.optionFor = function(arg) {
922+ for (var i = 0, len = this.options.length; i < len; ++i) {
923+ if (this.options[i].is(arg)) {
924+ return this.options[i];
925+ }
926+ }
927+};
928+
929+/**
930+ * Display an error message if a mandatory option does not have a value.
931+ *
932+ * @api private
933+ */
934+
935+Command.prototype._checkForMissingMandatoryOptions = function() {
936+ // Walk up hierarchy so can call from action handler after checking for displaying help.
937+ for (var cmd = this; cmd; cmd = cmd.parent) {
938+ cmd.options.forEach((anOption) => {
939+ if (anOption.mandatory && (cmd._getOptionValue(anOption.attributeName()) === undefined)) {
940+ cmd.missingMandatoryOptionValue(anOption);
941+ }
942+ });
943+ }
944+};
945+
946+/**
947+ * Parse options from `argv` returning `argv`
948+ * void of these options.
949+ *
950+ * @param {Array} argv
951+ * @return {{args: Array, unknown: Array}}
952+ * @api public
953+ */
954+
955+Command.prototype.parseOptions = function(argv) {
956+ var args = [],
957+ len = argv.length,
958+ literal,
959+ option,
960+ arg;
961+
962+ var unknownOptions = [];
963+
964+ // parse options
965+ for (var i = 0; i < len; ++i) {
966+ arg = argv[i];
967+
968+ // literal args after --
969+ if (literal) {
970+ args.push(arg);
971+ continue;
972+ }
973+
974+ if (arg === '--') {
975+ literal = true;
976+ continue;
977+ }
978+
979+ // find matching Option
980+ option = this.optionFor(arg);
981+
982+ // option is defined
983+ if (option) {
984+ // requires arg
985+ if (option.required) {
986+ arg = argv[++i];
987+ if (arg == null) return this.optionMissingArgument(option);
988+ this.emit('option:' + option.name(), arg);
989+ // optional arg
990+ } else if (option.optional) {
991+ arg = argv[i + 1];
992+ if (arg == null || (arg[0] === '-' && arg !== '-')) {
993+ arg = null;
994+ } else {
995+ ++i;
996+ }
997+ this.emit('option:' + option.name(), arg);
998+ // flag
999+ } else {
1000+ this.emit('option:' + option.name());
1001+ }
1002+ continue;
1003+ }
1004+
1005+ // looks like an option
1006+ if (arg.length > 1 && arg[0] === '-') {
1007+ unknownOptions.push(arg);
1008+
1009+ // If the next argument looks like it might be
1010+ // an argument for this option, we pass it on.
1011+ // If it isn't, then it'll simply be ignored
1012+ if ((i + 1) < argv.length && (argv[i + 1][0] !== '-' || argv[i + 1] === '-')) {
1013+ unknownOptions.push(argv[++i]);
1014+ }
1015+ continue;
1016+ }
1017+
1018+ // arg
1019+ args.push(arg);
1020+ }
1021+
1022+ return { args: args, unknown: unknownOptions };
1023+};
1024+
1025+/**
1026+ * Return an object containing options as key-value pairs
1027+ *
1028+ * @return {Object}
1029+ * @api public
1030+ */
1031+Command.prototype.opts = function() {
1032+ if (this._storeOptionsAsProperties) {
1033+ // Preserve original behaviour so backwards compatible when still using properties
1034+ var result = {},
1035+ len = this.options.length;
1036+
1037+ for (var i = 0; i < len; i++) {
1038+ var key = this.options[i].attributeName();
1039+ result[key] = key === this._versionOptionName ? this._version : this[key];
1040+ }
1041+ return result;
1042+ }
1043+
1044+ return this._optionValues;
1045+};
1046+
1047+/**
1048+ * Argument `name` is missing.
1049+ *
1050+ * @param {String} name
1051+ * @api private
1052+ */
1053+
1054+Command.prototype.missingArgument = function(name) {
1055+ const message = `error: missing required argument '${name}'`;
1056+ console.error(message);
1057+ this._exit(1, 'commander.missingArgument', message);
1058+};
1059+
1060+/**
1061+ * `Option` is missing an argument, but received `flag` or nothing.
1062+ *
1063+ * @param {Option} option
1064+ * @param {String} [flag]
1065+ * @api private
1066+ */
1067+
1068+Command.prototype.optionMissingArgument = function(option, flag) {
1069+ let message;
1070+ if (flag) {
1071+ message = `error: option '${option.flags}' argument missing, got '${flag}'`;
1072+ } else {
1073+ message = `error: option '${option.flags}' argument missing`;
1074+ }
1075+ console.error(message);
1076+ this._exit(1, 'commander.optionMissingArgument', message);
1077+};
1078+
1079+/**
1080+ * `Option` does not have a value, and is a mandatory option.
1081+ *
1082+ * @param {Option} option
1083+ * @api private
1084+ */
1085+
1086+Command.prototype.missingMandatoryOptionValue = function(option) {
1087+ const message = `error: required option '${option.flags}' not specified`;
1088+ console.error(message);
1089+ this._exit(1, 'commander.missingMandatoryOptionValue', message);
1090+};
1091+
1092+/**
1093+ * Unknown option `flag`.
1094+ *
1095+ * @param {String} flag
1096+ * @api private
1097+ */
1098+
1099+Command.prototype.unknownOption = function(flag) {
1100+ if (this._allowUnknownOption) return;
1101+ const message = `error: unknown option '${flag}'`;
1102+ console.error(message);
1103+ this._exit(1, 'commander.unknownOption', message);
1104+};
1105+
1106+/**
1107+ * Variadic argument with `name` is not the last argument as required.
1108+ *
1109+ * @param {String} name
1110+ * @api private
1111+ */
1112+
1113+Command.prototype.variadicArgNotLast = function(name) {
1114+ const message = `error: variadic arguments must be last '${name}'`;
1115+ console.error(message);
1116+ this._exit(1, 'commander.variadicArgNotLast', message);
1117+};
1118+
1119+/**
1120+ * Set the program version to `str`.
1121+ *
1122+ * This method auto-registers the "-V, --version" flag
1123+ * which will print the version number when passed.
1124+ *
1125+ * You can optionally supply the flags and description to override the defaults.
1126+ *
1127+ * @param {String} str
1128+ * @param {String} [flags]
1129+ * @param {String} [description]
1130+ * @return {Command} for chaining
1131+ * @api public
1132+ */
1133+
1134+Command.prototype.version = function(str, flags, description) {
1135+ if (arguments.length === 0) return this._version;
1136+ this._version = str;
1137+ flags = flags || '-V, --version';
1138+ description = description || 'output the version number';
1139+ var versionOption = new Option(flags, description);
1140+ this._versionOptionName = versionOption.long.substr(2) || 'version';
1141+ this.options.push(versionOption);
1142+ var self = this;
1143+ this.on('option:' + this._versionOptionName, function() {
1144+ process.stdout.write(str + '\n');
1145+ self._exit(0, 'commander.version', str);
1146+ });
1147+ return this;
1148+};
1149+
1150+/**
1151+ * Set the description to `str`.
1152+ *
1153+ * @param {String} str
1154+ * @param {Object} [argsDescription]
1155+ * @return {String|Command}
1156+ * @api public
1157+ */
1158+
1159+Command.prototype.description = function(str, argsDescription) {
1160+ if (arguments.length === 0) return this._description;
1161+ this._description = str;
1162+ this._argsDescription = argsDescription;
1163+ return this;
1164+};
1165+
1166+/**
1167+ * Set an alias for the command
1168+ *
1169+ * @param {String} alias
1170+ * @return {String|Command}
1171+ * @api public
1172+ */
1173+
1174+Command.prototype.alias = function(alias) {
1175+ var command = this;
1176+ if (this.commands.length !== 0) {
1177+ command = this.commands[this.commands.length - 1];
1178+ }
1179+
1180+ if (arguments.length === 0) return command._alias;
1181+
1182+ if (alias === command._name) throw new Error('Command alias can\'t be the same as its name');
1183+
1184+ command._alias = alias;
1185+ return this;
1186+};
1187+
1188+/**
1189+ * Set / get the command usage `str`.
1190+ *
1191+ * @param {String} [str]
1192+ * @return {String|Command}
1193+ * @api public
1194+ */
1195+
1196+Command.prototype.usage = function(str) {
1197+ var args = this._args.map(function(arg) {
1198+ return humanReadableArgName(arg);
1199+ });
1200+
1201+ var usage = '[options]' +
1202+ (this.commands.length ? ' [command]' : '') +
1203+ (this._args.length ? ' ' + args.join(' ') : '');
1204+
1205+ if (arguments.length === 0) return this._usage || usage;
1206+ this._usage = str;
1207+
1208+ return this;
1209+};
1210+
1211+/**
1212+ * Get or set the name of the command
1213+ *
1214+ * @param {String} [str]
1215+ * @return {String|Command}
1216+ * @api public
1217+ */
1218+
1219+Command.prototype.name = function(str) {
1220+ if (arguments.length === 0) return this._name;
1221+ this._name = str;
1222+ return this;
1223+};
1224+
1225+/**
1226+ * Return prepared commands.
1227+ *
1228+ * @return {Array}
1229+ * @api private
1230+ */
1231+
1232+Command.prototype.prepareCommands = function() {
1233+ return this.commands.filter(function(cmd) {
1234+ return !cmd._noHelp;
1235+ }).map(function(cmd) {
1236+ var args = cmd._args.map(function(arg) {
1237+ return humanReadableArgName(arg);
1238+ }).join(' ');
1239+
1240+ return [
1241+ cmd._name +
1242+ (cmd._alias ? '|' + cmd._alias : '') +
1243+ (cmd.options.length ? ' [options]' : '') +
1244+ (args ? ' ' + args : ''),
1245+ cmd._description
1246+ ];
1247+ });
1248+};
1249+
1250+/**
1251+ * Return the largest command length.
1252+ *
1253+ * @return {Number}
1254+ * @api private
1255+ */
1256+
1257+Command.prototype.largestCommandLength = function() {
1258+ var commands = this.prepareCommands();
1259+ return commands.reduce(function(max, command) {
1260+ return Math.max(max, command[0].length);
1261+ }, 0);
1262+};
1263+
1264+/**
1265+ * Return the largest option length.
1266+ *
1267+ * @return {Number}
1268+ * @api private
1269+ */
1270+
1271+Command.prototype.largestOptionLength = function() {
1272+ var options = [].slice.call(this.options);
1273+ options.push({
1274+ flags: this._helpFlags
1275+ });
1276+
1277+ return options.reduce(function(max, option) {
1278+ return Math.max(max, option.flags.length);
1279+ }, 0);
1280+};
1281+
1282+/**
1283+ * Return the largest arg length.
1284+ *
1285+ * @return {Number}
1286+ * @api private
1287+ */
1288+
1289+Command.prototype.largestArgLength = function() {
1290+ return this._args.reduce(function(max, arg) {
1291+ return Math.max(max, arg.name.length);
1292+ }, 0);
1293+};
1294+
1295+/**
1296+ * Return the pad width.
1297+ *
1298+ * @return {Number}
1299+ * @api private
1300+ */
1301+
1302+Command.prototype.padWidth = function() {
1303+ var width = this.largestOptionLength();
1304+ if (this._argsDescription && this._args.length) {
1305+ if (this.largestArgLength() > width) {
1306+ width = this.largestArgLength();
1307+ }
1308+ }
1309+
1310+ if (this.commands && this.commands.length) {
1311+ if (this.largestCommandLength() > width) {
1312+ width = this.largestCommandLength();
1313+ }
1314+ }
1315+
1316+ return width;
1317+};
1318+
1319+/**
1320+ * Return help for options.
1321+ *
1322+ * @return {String}
1323+ * @api private
1324+ */
1325+
1326+Command.prototype.optionHelp = function() {
1327+ var width = this.padWidth();
1328+
1329+ var columns = process.stdout.columns || 80;
1330+ var descriptionWidth = columns - width - 4;
1331+
1332+ // Append the help information
1333+ return this.options.map(function(option) {
1334+ const fullDesc = option.description +
1335+ ((!option.negate && option.defaultValue !== undefined) ? ' (default: ' + JSON.stringify(option.defaultValue) + ')' : '');
1336+ return pad(option.flags, width) + ' ' + optionalWrap(fullDesc, descriptionWidth, width + 2);
1337+ }).concat([pad(this._helpFlags, width) + ' ' + optionalWrap(this._helpDescription, descriptionWidth, width + 2)])
1338+ .join('\n');
1339+};
1340+
1341+/**
1342+ * Return command help documentation.
1343+ *
1344+ * @return {String}
1345+ * @api private
1346+ */
1347+
1348+Command.prototype.commandHelp = function() {
1349+ if (!this.commands.length) return '';
1350+
1351+ var commands = this.prepareCommands();
1352+ var width = this.padWidth();
1353+
1354+ var columns = process.stdout.columns || 80;
1355+ var descriptionWidth = columns - width - 4;
1356+
1357+ return [
1358+ 'Commands:',
1359+ commands.map(function(cmd) {
1360+ var desc = cmd[1] ? ' ' + cmd[1] : '';
1361+ return (desc ? pad(cmd[0], width) : cmd[0]) + optionalWrap(desc, descriptionWidth, width + 2);
1362+ }).join('\n').replace(/^/gm, ' '),
1363+ ''
1364+ ].join('\n');
1365+};
1366+
1367+/**
1368+ * Return program help documentation.
1369+ *
1370+ * @return {String}
1371+ * @api private
1372+ */
1373+
1374+Command.prototype.helpInformation = function() {
1375+ var desc = [];
1376+ if (this._description) {
1377+ desc = [
1378+ this._description,
1379+ ''
1380+ ];
1381+
1382+ var argsDescription = this._argsDescription;
1383+ if (argsDescription && this._args.length) {
1384+ var width = this.padWidth();
1385+ var columns = process.stdout.columns || 80;
1386+ var descriptionWidth = columns - width - 5;
1387+ desc.push('Arguments:');
1388+ desc.push('');
1389+ this._args.forEach(function(arg) {
1390+ desc.push(' ' + pad(arg.name, width) + ' ' + wrap(argsDescription[arg.name], descriptionWidth, width + 4));
1391+ });
1392+ desc.push('');
1393+ }
1394+ }
1395+
1396+ var cmdName = this._name;
1397+ if (this._alias) {
1398+ cmdName = cmdName + '|' + this._alias;
1399+ }
1400+ var parentCmdNames = '';
1401+ for (var parentCmd = this.parent; parentCmd; parentCmd = parentCmd.parent) {
1402+ parentCmdNames = parentCmd.name() + ' ' + parentCmdNames;
1403+ }
1404+ var usage = [
1405+ 'Usage: ' + parentCmdNames + cmdName + ' ' + this.usage(),
1406+ ''
1407+ ];
1408+
1409+ var cmds = [];
1410+ var commandHelp = this.commandHelp();
1411+ if (commandHelp) cmds = [commandHelp];
1412+
1413+ var options = [
1414+ 'Options:',
1415+ '' + this.optionHelp().replace(/^/gm, ' '),
1416+ ''
1417+ ];
1418+
1419+ return usage
1420+ .concat(desc)
1421+ .concat(options)
1422+ .concat(cmds)
1423+ .join('\n');
1424+};
1425+
1426+/**
1427+ * Output help information for this command.
1428+ *
1429+ * When listener(s) are available for the helpLongFlag
1430+ * those callbacks are invoked.
1431+ *
1432+ * @api public
1433+ */
1434+
1435+Command.prototype.outputHelp = function(cb) {
1436+ if (!cb) {
1437+ cb = function(passthru) {
1438+ return passthru;
1439+ };
1440+ }
1441+ const cbOutput = cb(this.helpInformation());
1442+ if (typeof cbOutput !== 'string' && !Buffer.isBuffer(cbOutput)) {
1443+ throw new Error('outputHelp callback must return a string or a Buffer');
1444+ }
1445+ process.stdout.write(cbOutput);
1446+ this.emit(this._helpLongFlag);
1447+};
1448+
1449+/**
1450+ * You can pass in flags and a description to override the help
1451+ * flags and help description for your command.
1452+ *
1453+ * @param {String} [flags]
1454+ * @param {String} [description]
1455+ * @return {Command}
1456+ * @api public
1457+ */
1458+
1459+Command.prototype.helpOption = function(flags, description) {
1460+ this._helpFlags = flags || this._helpFlags;
1461+ this._helpDescription = description || this._helpDescription;
1462+
1463+ var splitFlags = this._helpFlags.split(/[ ,|]+/);
1464+
1465+ if (splitFlags.length > 1) this._helpShortFlag = splitFlags.shift();
1466+
1467+ this._helpLongFlag = splitFlags.shift();
1468+
1469+ return this;
1470+};
1471+
1472+/**
1473+ * Output help information and exit.
1474+ *
1475+ * @param {Function} [cb]
1476+ * @api public
1477+ */
1478+
1479+Command.prototype.help = function(cb) {
1480+ this.outputHelp(cb);
1481+ // exitCode: preserving original behaviour which was calling process.exit()
1482+ // message: do not have all displayed text available so only passing placeholder.
1483+ this._exit(process.exitCode || 0, 'commander.help', '(outputHelp)');
1484+};
1485+
1486+/**
1487+ * Camel-case the given `flag`
1488+ *
1489+ * @param {String} flag
1490+ * @return {String}
1491+ * @api private
1492+ */
1493+
1494+function camelcase(flag) {
1495+ return flag.split('-').reduce(function(str, word) {
1496+ return str + word[0].toUpperCase() + word.slice(1);
1497+ });
1498+}
1499+
1500+/**
1501+ * Pad `str` to `width`.
1502+ *
1503+ * @param {String} str
1504+ * @param {Number} width
1505+ * @return {String}
1506+ * @api private
1507+ */
1508+
1509+function pad(str, width) {
1510+ var len = Math.max(0, width - str.length);
1511+ return str + Array(len + 1).join(' ');
1512+}
1513+
1514+/**
1515+ * Wraps the given string with line breaks at the specified width while breaking
1516+ * words and indenting every but the first line on the left.
1517+ *
1518+ * @param {String} str
1519+ * @param {Number} width
1520+ * @param {Number} indent
1521+ * @return {String}
1522+ * @api private
1523+ */
1524+function wrap(str, width, indent) {
1525+ var regex = new RegExp('.{1,' + (width - 1) + '}([\\s\u200B]|$)|[^\\s\u200B]+?([\\s\u200B]|$)', 'g');
1526+ var lines = str.match(regex) || [];
1527+ return lines.map(function(line, i) {
1528+ if (line.slice(-1) === '\n') {
1529+ line = line.slice(0, line.length - 1);
1530+ }
1531+ return ((i > 0 && indent) ? Array(indent + 1).join(' ') : '') + line.trimRight();
1532+ }).join('\n');
1533+}
1534+
1535+/**
1536+ * Optionally wrap the given str to a max width of width characters per line
1537+ * while indenting with indent spaces. Do not wrap if insufficient width or
1538+ * string is manually formatted.
1539+ *
1540+ * @param {String} str
1541+ * @param {Number} width
1542+ * @param {Number} indent
1543+ * @return {String}
1544+ * @api private
1545+ */
1546+function optionalWrap(str, width, indent) {
1547+ // Detect manually wrapped and indented strings by searching for line breaks
1548+ // followed by multiple spaces/tabs.
1549+ if (str.match(/[\n]\s+/)) return str;
1550+ // Do not wrap to narrow columns (or can end up with a word per line).
1551+ const minWidth = 40;
1552+ if (width < minWidth) return str;
1553+
1554+ return wrap(str, width, indent);
1555+}
1556+
1557+/**
1558+ * Output help information if help flags specified
1559+ *
1560+ * @param {Command} cmd - command to output help for
1561+ * @param {Array} options - array of options to search for -h or --help
1562+ * @api private
1563+ */
1564+
1565+function outputHelpIfRequested(cmd, options) {
1566+ options = options || [];
1567+
1568+ for (var i = 0; i < options.length; i++) {
1569+ if (options[i] === cmd._helpLongFlag || options[i] === cmd._helpShortFlag) {
1570+ cmd.outputHelp();
1571+ // (Do not have all displayed text available so only passing placeholder.)
1572+ cmd._exit(0, 'commander.helpDisplayed', '(outputHelp)');
1573+ }
1574+ }
1575+}
1576+
1577+/**
1578+ * Takes an argument and returns its human readable equivalent for help usage.
1579+ *
1580+ * @param {Object} arg
1581+ * @return {String}
1582+ * @api private
1583+ */
1584+
1585+function humanReadableArgName(arg) {
1586+ var nameOutput = arg.name + (arg.variadic === true ? '...' : '');
1587+
1588+ return arg.required
1589+ ? '<' + nameOutput + '>'
1590+ : '[' + nameOutput + ']';
1591+}
1592+
1593+// for versions before node v0.8 when there weren't `fs.existsSync`
1594+function exists(file) {
1595+ try {
1596+ if (fs.statSync(file).isFile()) {
1597+ return true;
1598+ }
1599+ } catch (e) {
1600+ return false;
1601+ }
1602+}
1603+
1604+/**
1605+ * Scan arguments and increment port number for inspect calls (to avoid conflicts when spawning new command).
1606+ *
1607+ * @param {string[]} args - array of arguments from node.execArgv
1608+ * @returns {string[]}
1609+ * @api private
1610+ */
1611+
1612+function incrementNodeInspectorPort(args) {
1613+ // Testing for these options:
1614+ // --inspect[=[host:]port]
1615+ // --inspect-brk[=[host:]port]
1616+ // --inspect-port=[host:]port
1617+ return args.map((arg) => {
1618+ var result = arg;
1619+ if (arg.indexOf('--inspect') === 0) {
1620+ var debugOption;
1621+ var debugHost = '127.0.0.1';
1622+ var debugPort = '9229';
1623+ var match;
1624+ if ((match = arg.match(/^(--inspect(-brk)?)$/)) !== null) {
1625+ // e.g. --inspect
1626+ debugOption = match[1];
1627+ } else if ((match = arg.match(/^(--inspect(-brk|-port)?)=([^:]+)$/)) !== null) {
1628+ debugOption = match[1];
1629+ if (/^\d+$/.test(match[3])) {
1630+ // e.g. --inspect=1234
1631+ debugPort = match[3];
1632+ } else {
1633+ // e.g. --inspect=localhost
1634+ debugHost = match[3];
1635+ }
1636+ } else if ((match = arg.match(/^(--inspect(-brk|-port)?)=([^:]+):(\d+)$/)) !== null) {
1637+ // e.g. --inspect=localhost:1234
1638+ debugOption = match[1];
1639+ debugHost = match[3];
1640+ debugPort = match[4];
1641+ }
1642+
1643+ if (debugOption && debugPort !== '0') {
1644+ result = `${debugOption}=${debugHost}:${parseInt(debugPort) + 1}`;
1645+ }
1646+ }
1647+ return result;
1648+ });
1649+}
A node_modules/commander/package.json +41 -0 collapsed to keep the page light
A node_modules/commander/typings/index.d.ts +311 -0 collapsed to keep the page light
A node_modules/cross-spawn/CHANGELOG.md +130 -0 collapsed to keep the page light
A node_modules/cross-spawn/LICENSE +21 -0 collapsed to keep the page light
A node_modules/cross-spawn/README.md +96 -0 collapsed to keep the page light
A node_modules/cross-spawn/index.js +39 -0 collapsed to keep the page light
A node_modules/cross-spawn/lib/enoent.js +59 -0 collapsed to keep the page light
A node_modules/cross-spawn/lib/parse.js +91 -0 collapsed to keep the page light
A node_modules/cross-spawn/lib/util/escape.js +45 -0 collapsed to keep the page light
A node_modules/cross-spawn/lib/util/readShebang.js +23 -0 collapsed to keep the page light
A node_modules/cross-spawn/lib/util/resolveCommand.js +52 -0 collapsed to keep the page light
A node_modules/cross-spawn/package.json +73 -0 collapsed to keep the page light
A node_modules/cssesc/README.md +201 -0 collapsed to keep the page light
A node_modules/cssesc/bin/cssesc +116 -0 collapsed to keep the page light
A node_modules/cssesc/cssesc.js +110 -0 collapsed to keep the page light
A node_modules/cssesc/man/cssesc.1 +70 -0 collapsed to keep the page light
A node_modules/cssesc/package.json +51 -0 collapsed to keep the page light
A node_modules/daisyui/LICENSE +21 -0 collapsed to keep the page light
A node_modules/daisyui/README.md +37 -0 collapsed to keep the page light
A node_modules/daisyui/base/properties.css +1 -0 collapsed to keep the page light
A node_modules/daisyui/base/properties/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/base/properties/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/base/reset.css +1 -0 collapsed to keep the page light
A node_modules/daisyui/base/rootcolor.css +1 -0 collapsed to keep the page light
A node_modules/daisyui/base/rootcolor/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/base/rootcolor/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/base/rootscrollgutter.css +1 -0 collapsed to keep the page light
A node_modules/daisyui/base/rootscrollgutter/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/base/rootscrollgutter/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/base/rootscrolllock.css +1 -0 collapsed to keep the page light
A node_modules/daisyui/base/rootscrolllock/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/base/rootscrolllock/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/base/scrollbar.css +1 -0 collapsed to keep the page light
A node_modules/daisyui/base/scrollbar/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/base/scrollbar/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/base/svg.css +1 -0 collapsed to keep the page light
A node_modules/daisyui/base/svg/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/base/svg/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/chunks.css +73 -0 collapsed to keep the page light
A node_modules/daisyui/colors/properties-extended.css +1 -0 collapsed to keep the page light
A node_modules/daisyui/colors/properties.css +1 -0 collapsed to keep the page light
A node_modules/daisyui/colors/responsive-extended.css +1 -0 collapsed to keep the page light
A node_modules/daisyui/colors/responsive.css +1 -0 collapsed to keep the page light
A node_modules/daisyui/colors/states-extended.css +1 -0 collapsed to keep the page light
A node_modules/daisyui/colors/states.css +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/alert.css +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/alert/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/components/alert/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/avatar.css +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/avatar/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/components/avatar/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/badge.css +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/badge/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/components/badge/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/breadcrumbs.css +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/breadcrumbs/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/components/breadcrumbs/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/button.css +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/button/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/components/button/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/calendar.css +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/calendar/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/components/calendar/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/card.css +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/card/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/components/card/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/carousel.css +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/carousel/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/components/carousel/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/chat.css +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/chat/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/components/chat/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/checkbox.css +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/checkbox/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/components/checkbox/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/collapse.css +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/collapse/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/components/collapse/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/countdown.css +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/countdown/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/components/countdown/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/diff.css +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/diff/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/components/diff/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/divider.css +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/divider/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/components/divider/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/dock.css +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/dock/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/components/dock/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/drawer.css +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/drawer/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/components/drawer/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/dropdown.css +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/dropdown/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/components/dropdown/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/fieldset.css +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/fieldset/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/components/fieldset/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/fileinput.css +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/fileinput/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/components/fileinput/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/filter.css +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/filter/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/components/filter/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/footer.css +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/footer/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/components/footer/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/hero.css +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/hero/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/components/hero/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/indicator.css +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/indicator/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/components/indicator/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/input.css +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/input/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/components/input/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/kbd.css +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/kbd/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/components/kbd/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/label.css +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/label/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/components/label/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/link.css +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/link/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/components/link/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/list.css +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/list/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/components/list/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/loading.css +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/loading/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/components/loading/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/mask.css +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/mask/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/components/mask/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/menu.css +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/menu/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/components/menu/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/mockup.css +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/mockup/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/components/mockup/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/modal.css +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/modal/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/components/modal/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/navbar.css +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/navbar/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/components/navbar/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/progress.css +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/progress/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/components/progress/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/radialprogress.css +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/radialprogress/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/components/radialprogress/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/radio.css +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/radio/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/components/radio/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/range.css +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/range/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/components/range/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/rating.css +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/rating/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/components/rating/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/select.css +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/select/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/components/select/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/skeleton.css +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/skeleton/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/components/skeleton/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/stack.css +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/stack/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/components/stack/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/stat.css +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/stat/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/components/stat/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/status.css +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/status/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/components/status/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/steps.css +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/steps/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/components/steps/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/swap.css +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/swap/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/components/swap/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/tab.css +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/tab/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/components/tab/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/table.css +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/table/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/components/table/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/textarea.css +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/textarea/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/components/textarea/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/timeline.css +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/timeline/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/components/timeline/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/toast.css +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/toast/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/components/toast/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/toggle.css +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/toggle/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/components/toggle/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/tooltip.css +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/tooltip/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/components/tooltip/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/validator.css +1 -0 collapsed to keep the page light
A node_modules/daisyui/components/validator/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/components/validator/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/daisyui.css +1 -0 collapsed to keep the page light
A node_modules/daisyui/functions/addPrefix.js +156 -0 collapsed to keep the page light
A node_modules/daisyui/functions/plugin.js +11 -0 collapsed to keep the page light
A node_modules/daisyui/functions/pluginOptionsHandler.js +86 -0 collapsed to keep the page light
A node_modules/daisyui/functions/themeOrder.js +37 -0 collapsed to keep the page light
A node_modules/daisyui/functions/variables.js +29 -0 collapsed to keep the page light
A node_modules/daisyui/imports.js +68 -0 collapsed to keep the page light
A node_modules/daisyui/index.js +51 -0 collapsed to keep the page light
A node_modules/daisyui/package.json +72 -0 collapsed to keep the page light
A node_modules/daisyui/theme/abyss.css +31 -0 collapsed to keep the page light
A node_modules/daisyui/theme/abyss/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/theme/abyss/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/theme/acid.css +31 -0 collapsed to keep the page light
A node_modules/daisyui/theme/acid/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/theme/acid/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/theme/aqua.css +31 -0 collapsed to keep the page light
A node_modules/daisyui/theme/aqua/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/theme/aqua/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/theme/autumn.css +31 -0 collapsed to keep the page light
A node_modules/daisyui/theme/autumn/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/theme/autumn/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/theme/black.css +31 -0 collapsed to keep the page light
A node_modules/daisyui/theme/black/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/theme/black/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/theme/bumblebee.css +31 -0 collapsed to keep the page light
A node_modules/daisyui/theme/bumblebee/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/theme/bumblebee/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/theme/business.css +31 -0 collapsed to keep the page light
A node_modules/daisyui/theme/business/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/theme/business/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/theme/caramellatte.css +31 -0 collapsed to keep the page light
A node_modules/daisyui/theme/caramellatte/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/theme/caramellatte/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/theme/cmyk.css +31 -0 collapsed to keep the page light
A node_modules/daisyui/theme/cmyk/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/theme/cmyk/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/theme/coffee.css +31 -0 collapsed to keep the page light
A node_modules/daisyui/theme/coffee/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/theme/coffee/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/theme/corporate.css +31 -0 collapsed to keep the page light
A node_modules/daisyui/theme/corporate/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/theme/corporate/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/theme/cupcake.css +31 -0 collapsed to keep the page light
A node_modules/daisyui/theme/cupcake/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/theme/cupcake/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/theme/cyberpunk.css +31 -0 collapsed to keep the page light
A node_modules/daisyui/theme/cyberpunk/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/theme/cyberpunk/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/theme/dark.css +31 -0 collapsed to keep the page light
A node_modules/daisyui/theme/dark/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/theme/dark/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/theme/dim.css +31 -0 collapsed to keep the page light
A node_modules/daisyui/theme/dim/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/theme/dim/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/theme/dracula.css +31 -0 collapsed to keep the page light
A node_modules/daisyui/theme/dracula/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/theme/dracula/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/theme/emerald.css +31 -0 collapsed to keep the page light
A node_modules/daisyui/theme/emerald/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/theme/emerald/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/theme/fantasy.css +31 -0 collapsed to keep the page light
A node_modules/daisyui/theme/fantasy/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/theme/fantasy/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/theme/forest.css +31 -0 collapsed to keep the page light
A node_modules/daisyui/theme/forest/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/theme/forest/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/theme/garden.css +31 -0 collapsed to keep the page light
A node_modules/daisyui/theme/garden/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/theme/garden/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/theme/halloween.css +31 -0 collapsed to keep the page light
A node_modules/daisyui/theme/halloween/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/theme/halloween/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/theme/index.js +48 -0 collapsed to keep the page light
A node_modules/daisyui/theme/lemonade.css +31 -0 collapsed to keep the page light
A node_modules/daisyui/theme/lemonade/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/theme/lemonade/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/theme/light.css +31 -0 collapsed to keep the page light
A node_modules/daisyui/theme/light/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/theme/light/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/theme/lofi.css +31 -0 collapsed to keep the page light
A node_modules/daisyui/theme/lofi/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/theme/lofi/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/theme/luxury.css +31 -0 collapsed to keep the page light
A node_modules/daisyui/theme/luxury/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/theme/luxury/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/theme/night.css +31 -0 collapsed to keep the page light
A node_modules/daisyui/theme/night/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/theme/night/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/theme/nord.css +31 -0 collapsed to keep the page light
A node_modules/daisyui/theme/nord/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/theme/nord/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/theme/object.d.ts +74 -0 collapsed to keep the page light
A node_modules/daisyui/theme/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/theme/pastel.css +31 -0 collapsed to keep the page light
A node_modules/daisyui/theme/pastel/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/theme/pastel/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/theme/retro.css +31 -0 collapsed to keep the page light
A node_modules/daisyui/theme/retro/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/theme/retro/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/theme/silk.css +31 -0 collapsed to keep the page light
A node_modules/daisyui/theme/silk/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/theme/silk/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/theme/sunset.css +31 -0 collapsed to keep the page light
A node_modules/daisyui/theme/sunset/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/theme/sunset/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/theme/synthwave.css +31 -0 collapsed to keep the page light
A node_modules/daisyui/theme/synthwave/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/theme/synthwave/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/theme/valentine.css +31 -0 collapsed to keep the page light
A node_modules/daisyui/theme/valentine/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/theme/valentine/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/theme/winter.css +31 -0 collapsed to keep the page light
A node_modules/daisyui/theme/winter/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/theme/winter/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/theme/wireframe.css +31 -0 collapsed to keep the page light
A node_modules/daisyui/theme/wireframe/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/theme/wireframe/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/themes.css +1 -0 collapsed to keep the page light
A node_modules/daisyui/utilities/glass.css +1 -0 collapsed to keep the page light
A node_modules/daisyui/utilities/glass/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/utilities/glass/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/utilities/join.css +1 -0 collapsed to keep the page light
A node_modules/daisyui/utilities/join/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/utilities/join/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/utilities/radius.css +1 -0 collapsed to keep the page light
A node_modules/daisyui/utilities/radius/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/utilities/radius/object.js +1 -0 collapsed to keep the page light
A node_modules/daisyui/utilities/typography.css +1 -0 collapsed to keep the page light
A node_modules/daisyui/utilities/typography/index.js +7 -0 collapsed to keep the page light
A node_modules/daisyui/utilities/typography/object.js +1 -0 collapsed to keep the page light
A node_modules/detect-libc/LICENSE +201 -0 collapsed to keep the page light
A node_modules/detect-libc/README.md +163 -0 collapsed to keep the page light
A node_modules/detect-libc/index.d.ts +14 -0 collapsed to keep the page light
A node_modules/detect-libc/lib/detect-libc.js +267 -0 collapsed to keep the page light
A node_modules/detect-libc/lib/filesystem.js +41 -0 collapsed to keep the page light
A node_modules/detect-libc/lib/process.js +24 -0 collapsed to keep the page light
A node_modules/detect-libc/package.json +40 -0 collapsed to keep the page light
A node_modules/didyoumean/LICENSE +14 -0 collapsed to keep the page light
A node_modules/didyoumean/README.md +134 -0 collapsed to keep the page light
A node_modules/didyoumean/didYouMean-1.2.1.js +274 -0 collapsed to keep the page light
A node_modules/didyoumean/didYouMean-1.2.1.min.js +17 -0 collapsed to keep the page light
A node_modules/didyoumean/package.json +27 -0 collapsed to keep the page light
A node_modules/dlv/README.md +76 -0 collapsed to keep the page light
A node_modules/dlv/index.js +7 -0 collapsed to keep the page light
A node_modules/dlv/package.json +30 -0 collapsed to keep the page light
A node_modules/dotenv/CHANGELOG.md +488 -0 collapsed to keep the page light
A node_modules/dotenv/LICENSE +23 -0 collapsed to keep the page light
A node_modules/dotenv/README-es.md +448 -0 collapsed to keep the page light
A node_modules/dotenv/README.md +651 -0 collapsed to keep the page light
A node_modules/dotenv/config.d.ts +1 -0 collapsed to keep the page light
A node_modules/dotenv/config.js +9 -0 collapsed to keep the page light
A node_modules/dotenv/lib/cli-options.js +11 -0 collapsed to keep the page light
A node_modules/dotenv/lib/env-options.js +24 -0 collapsed to keep the page light
A node_modules/dotenv/lib/main.d.ts +153 -0 collapsed to keep the page light
A node_modules/dotenv/lib/main.js +361 -0 collapsed to keep the page light
A node_modules/dotenv/package.json +61 -0 collapsed to keep the page light
A node_modules/eastasianwidth/README.md +32 -0 collapsed to keep the page light
A node_modules/eastasianwidth/eastasianwidth.js +311 -0 collapsed to keep the page light
A node_modules/eastasianwidth/package.json +18 -0 collapsed to keep the page light
A node_modules/emoji-regex/README.md +137 -0 collapsed to keep the page light
A node_modules/emoji-regex/RGI_Emoji.d.ts +5 -0 collapsed to keep the page light
A node_modules/emoji-regex/RGI_Emoji.js +6 -0 collapsed to keep the page light
A node_modules/emoji-regex/es2015/RGI_Emoji.d.ts +5 -0 collapsed to keep the page light
A node_modules/emoji-regex/es2015/RGI_Emoji.js +6 -0 collapsed to keep the page light
A node_modules/emoji-regex/es2015/index.d.ts +5 -0 collapsed to keep the page light
A node_modules/emoji-regex/es2015/index.js +6 -0 collapsed to keep the page light
A node_modules/emoji-regex/es2015/text.d.ts +5 -0 collapsed to keep the page light
A node_modules/emoji-regex/es2015/text.js +6 -0 collapsed to keep the page light
A node_modules/emoji-regex/index.d.ts +5 -0 collapsed to keep the page light
A node_modules/emoji-regex/index.js +6 -0 collapsed to keep the page light
A node_modules/emoji-regex/package.json +52 -0 collapsed to keep the page light
A node_modules/emoji-regex/text.d.ts +5 -0 collapsed to keep the page light
A node_modules/emoji-regex/text.js +6 -0 collapsed to keep the page light
A node_modules/enhanced-resolve/LICENSE +20 -0 collapsed to keep the page light
A node_modules/enhanced-resolve/README.md +183 -0 collapsed to keep the page light
A node_modules/enhanced-resolve/lib/AliasFieldPlugin.js +108 -0 collapsed to keep the page light
A node_modules/enhanced-resolve/lib/AliasPlugin.js +183 -0 collapsed to keep the page light
A node_modules/enhanced-resolve/lib/AppendPlugin.js +49 -0 collapsed to keep the page light
A node_modules/enhanced-resolve/lib/CachedInputFileSystem.js +664 -0 collapsed to keep the page light
A node_modules/enhanced-resolve/lib/CloneBasenamePlugin.js +53 -0 collapsed to keep the page light
A node_modules/enhanced-resolve/lib/ConditionalPlugin.js +59 -0 collapsed to keep the page light
A node_modules/enhanced-resolve/lib/DescriptionFilePlugin.js +98 -0 collapsed to keep the page light
A node_modules/enhanced-resolve/lib/DescriptionFileUtils.js +201 -0 collapsed to keep the page light
A node_modules/enhanced-resolve/lib/DirectoryExistsPlugin.js +63 -0 collapsed to keep the page light
A node_modules/enhanced-resolve/lib/ExportsFieldPlugin.js +200 -0 collapsed to keep the page light
A node_modules/enhanced-resolve/lib/ExtensionAliasPlugin.js +101 -0 collapsed to keep the page light
A node_modules/enhanced-resolve/lib/FileExistsPlugin.js +58 -0 collapsed to keep the page light
A node_modules/enhanced-resolve/lib/ImportsFieldPlugin.js +223 -0 collapsed to keep the page light
A node_modules/enhanced-resolve/lib/JoinRequestPartPlugin.js +75 -0 collapsed to keep the page light
A node_modules/enhanced-resolve/lib/JoinRequestPlugin.js +45 -0 collapsed to keep the page light
A node_modules/enhanced-resolve/lib/LogInfoPlugin.js +54 -0 collapsed to keep the page light
A node_modules/enhanced-resolve/lib/MainFieldPlugin.js +90 -0 collapsed to keep the page light
A node_modules/enhanced-resolve/lib/ModulesInHierachicDirectoriesPlugin.js +9 -0 collapsed to keep the page light
A node_modules/enhanced-resolve/lib/ModulesInHierarchicalDirectoriesPlugin.js +87 -0 collapsed to keep the page light
A node_modules/enhanced-resolve/lib/ModulesInRootPlugin.js +49 -0 collapsed to keep the page light
A node_modules/enhanced-resolve/lib/NextPlugin.js +33 -0 collapsed to keep the page light
A node_modules/enhanced-resolve/lib/ParsePlugin.js +76 -0 collapsed to keep the page light
A node_modules/enhanced-resolve/lib/PnpPlugin.js +133 -0 collapsed to keep the page light
A node_modules/enhanced-resolve/lib/Resolver.js +800 -0 collapsed to keep the page light
A node_modules/enhanced-resolve/lib/ResolverFactory.js +728 -0 collapsed to keep the page light
A node_modules/enhanced-resolve/lib/RestrictionsPlugin.js +70 -0 collapsed to keep the page light
A node_modules/enhanced-resolve/lib/ResultPlugin.js +42 -0 collapsed to keep the page light
A node_modules/enhanced-resolve/lib/RootsPlugin.js +69 -0 collapsed to keep the page light
A node_modules/enhanced-resolve/lib/SelfReferencePlugin.js +82 -0 collapsed to keep the page light
A node_modules/enhanced-resolve/lib/SymlinkPlugin.js +100 -0 collapsed to keep the page light
A node_modules/enhanced-resolve/lib/SyncAsyncFileSystemDecorator.js +220 -0 collapsed to keep the page light
A node_modules/enhanced-resolve/lib/TryNextPlugin.js +41 -0 collapsed to keep the page light
A node_modules/enhanced-resolve/lib/UnsafeCachePlugin.js +112 -0 collapsed to keep the page light
A node_modules/enhanced-resolve/lib/UseFilePlugin.js +55 -0 collapsed to keep the page light
A node_modules/enhanced-resolve/lib/createInnerContext.js +46 -0 collapsed to keep the page light
A node_modules/enhanced-resolve/lib/forEachBail.js +50 -0 collapsed to keep the page light
A node_modules/enhanced-resolve/lib/getInnerRequest.js +36 -0 collapsed to keep the page light
A node_modules/enhanced-resolve/lib/getPaths.js +45 -0 collapsed to keep the page light
A node_modules/enhanced-resolve/lib/index.js +203 -0 collapsed to keep the page light
A node_modules/enhanced-resolve/lib/util/entrypoints.js +573 -0 collapsed to keep the page light
A node_modules/enhanced-resolve/lib/util/identifier.js +69 -0 collapsed to keep the page light
A node_modules/enhanced-resolve/lib/util/module-browser.js +8 -0 collapsed to keep the page light
A node_modules/enhanced-resolve/lib/util/path.js +203 -0 collapsed to keep the page light
A node_modules/enhanced-resolve/lib/util/process-browser.js +22 -0 collapsed to keep the page light
A node_modules/enhanced-resolve/package.json +72 -0 collapsed to keep the page light
A node_modules/enhanced-resolve/types.d.ts +1135 -0 collapsed to keep the page light
A node_modules/fast-glob/LICENSE +21 -0 collapsed to keep the page light
A node_modules/fast-glob/README.md +830 -0 collapsed to keep the page light
A node_modules/fast-glob/node_modules/glob-parent/CHANGELOG.md +110 -0 collapsed to keep the page light
A node_modules/fast-glob/node_modules/glob-parent/LICENSE +15 -0 collapsed to keep the page light
A node_modules/fast-glob/node_modules/glob-parent/README.md +137 -0 collapsed to keep the page light
A node_modules/fast-glob/node_modules/glob-parent/index.js +42 -0 collapsed to keep the page light
A node_modules/fast-glob/node_modules/glob-parent/package.json +48 -0 collapsed to keep the page light
A node_modules/fast-glob/out/index.d.ts +40 -0 collapsed to keep the page light
A node_modules/fast-glob/out/index.js +102 -0 collapsed to keep the page light
A node_modules/fast-glob/out/managers/tasks.d.ts +22 -0 collapsed to keep the page light
A node_modules/fast-glob/out/managers/tasks.js +110 -0 collapsed to keep the page light
A node_modules/fast-glob/out/providers/async.d.ts +9 -0 collapsed to keep the page light
A node_modules/fast-glob/out/providers/async.js +23 -0 collapsed to keep the page light
A node_modules/fast-glob/out/providers/filters/deep.d.ts +16 -0 collapsed to keep the page light
A node_modules/fast-glob/out/providers/filters/deep.js +62 -0 collapsed to keep the page light
A node_modules/fast-glob/out/providers/filters/entry.d.ts +16 -0 collapsed to keep the page light
A node_modules/fast-glob/out/providers/filters/entry.js +63 -0 collapsed to keep the page light
A node_modules/fast-glob/out/providers/filters/error.d.ts +8 -0 collapsed to keep the page light
A node_modules/fast-glob/out/providers/filters/error.js +15 -0 collapsed to keep the page light
A node_modules/fast-glob/out/providers/matchers/matcher.d.ts +33 -0 collapsed to keep the page light
A node_modules/fast-glob/out/providers/matchers/matcher.js +45 -0 collapsed to keep the page light
A node_modules/fast-glob/out/providers/matchers/partial.d.ts +4 -0 collapsed to keep the page light
A node_modules/fast-glob/out/providers/matchers/partial.js +38 -0 collapsed to keep the page light
A node_modules/fast-glob/out/providers/provider.d.ts +19 -0 collapsed to keep the page light
A node_modules/fast-glob/out/providers/provider.js +48 -0 collapsed to keep the page light
A node_modules/fast-glob/out/providers/stream.d.ts +11 -0 collapsed to keep the page light
A node_modules/fast-glob/out/providers/stream.js +31 -0 collapsed to keep the page light
A node_modules/fast-glob/out/providers/sync.d.ts +9 -0 collapsed to keep the page light
A node_modules/fast-glob/out/providers/sync.js +23 -0 collapsed to keep the page light
A node_modules/fast-glob/out/providers/transformers/entry.d.ts +8 -0 collapsed to keep the page light
A node_modules/fast-glob/out/providers/transformers/entry.js +26 -0 collapsed to keep the page light
A node_modules/fast-glob/out/readers/async.d.ts +10 -0 collapsed to keep the page light
A node_modules/fast-glob/out/readers/async.js +35 -0 collapsed to keep the page light
A node_modules/fast-glob/out/readers/reader.d.ts +15 -0 collapsed to keep the page light
A node_modules/fast-glob/out/readers/reader.js +33 -0 collapsed to keep the page light
A node_modules/fast-glob/out/readers/stream.d.ts +14 -0 collapsed to keep the page light
A node_modules/fast-glob/out/readers/stream.js +55 -0 collapsed to keep the page light
A node_modules/fast-glob/out/readers/sync.d.ts +12 -0 collapsed to keep the page light
A node_modules/fast-glob/out/readers/sync.js +43 -0 collapsed to keep the page light
A node_modules/fast-glob/out/settings.d.ts +164 -0 collapsed to keep the page light
A node_modules/fast-glob/out/settings.js +59 -0 collapsed to keep the page light
A node_modules/fast-glob/out/types/index.d.ts +31 -0 collapsed to keep the page light
A node_modules/fast-glob/out/types/index.js +2 -0 collapsed to keep the page light
A node_modules/fast-glob/out/utils/array.d.ts +2 -0 collapsed to keep the page light
A node_modules/fast-glob/out/utils/array.js +22 -0 collapsed to keep the page light
A node_modules/fast-glob/out/utils/errno.d.ts +2 -0 collapsed to keep the page light
A node_modules/fast-glob/out/utils/errno.js +7 -0 collapsed to keep the page light
A node_modules/fast-glob/out/utils/fs.d.ts +4 -0 collapsed to keep the page light
A node_modules/fast-glob/out/utils/fs.js +19 -0 collapsed to keep the page light
A node_modules/fast-glob/out/utils/index.d.ts +8 -0 collapsed to keep the page light
A node_modules/fast-glob/out/utils/index.js +17 -0 collapsed to keep the page light
A node_modules/fast-glob/out/utils/path.d.ts +13 -0 collapsed to keep the page light
A node_modules/fast-glob/out/utils/path.js +68 -0 collapsed to keep the page light
A node_modules/fast-glob/out/utils/pattern.d.ts +47 -0 collapsed to keep the page light
A node_modules/fast-glob/out/utils/pattern.js +188 -0 collapsed to keep the page light
A node_modules/fast-glob/out/utils/stream.d.ts +4 -0 collapsed to keep the page light
A node_modules/fast-glob/out/utils/stream.js +17 -0 collapsed to keep the page light
A node_modules/fast-glob/out/utils/string.d.ts +2 -0 collapsed to keep the page light
A node_modules/fast-glob/out/utils/string.js +11 -0 collapsed to keep the page light
A node_modules/fast-glob/package.json +81 -0 collapsed to keep the page light
A node_modules/fastq/.github/dependabot.yml +11 -0 collapsed to keep the page light
A node_modules/fastq/.github/workflows/ci.yml +75 -0 collapsed to keep the page light
A node_modules/fastq/LICENSE +13 -0 collapsed to keep the page light
A node_modules/fastq/README.md +306 -0 collapsed to keep the page light
A node_modules/fastq/bench.js +66 -0 collapsed to keep the page light
A node_modules/fastq/example.js +14 -0 collapsed to keep the page light
A node_modules/fastq/example.mjs +11 -0 collapsed to keep the page light
A node_modules/fastq/index.d.ts +38 -0 collapsed to keep the page light
A node_modules/fastq/package.json +53 -0 collapsed to keep the page light
A node_modules/fastq/queue.js +311 -0 collapsed to keep the page light
A node_modules/fastq/test/example.ts +83 -0 collapsed to keep the page light
A node_modules/fastq/test/promise.js +248 -0 collapsed to keep the page light
A node_modules/fastq/test/test.js +642 -0 collapsed to keep the page light
A node_modules/fastq/test/tsconfig.json +11 -0 collapsed to keep the page light
A node_modules/fill-range/LICENSE +21 -0 collapsed to keep the page light
A node_modules/fill-range/README.md +237 -0 collapsed to keep the page light
A node_modules/fill-range/index.js +248 -0 collapsed to keep the page light
A node_modules/fill-range/package.json +74 -0 collapsed to keep the page light
A node_modules/foreground-child/LICENSE +15 -0 collapsed to keep the page light
A node_modules/foreground-child/README.md +128 -0 collapsed to keep the page light
A node_modules/foreground-child/package.json +111 -0 collapsed to keep the page light
A node_modules/function-bind/.eslintrc +21 -0 collapsed to keep the page light
A node_modules/function-bind/.github/FUNDING.yml +12 -0 collapsed to keep the page light
A node_modules/function-bind/.github/SECURITY.md +3 -0 collapsed to keep the page light
A node_modules/function-bind/.nycrc +13 -0 collapsed to keep the page light
A node_modules/function-bind/CHANGELOG.md +136 -0 collapsed to keep the page light
A node_modules/function-bind/LICENSE +20 -0 collapsed to keep the page light
A node_modules/function-bind/README.md +46 -0 collapsed to keep the page light
A node_modules/function-bind/implementation.js +84 -0 collapsed to keep the page light
A node_modules/function-bind/index.js +5 -0 collapsed to keep the page light
A node_modules/function-bind/package.json +87 -0 collapsed to keep the page light
A node_modules/function-bind/test/.eslintrc +9 -0 collapsed to keep the page light
A node_modules/function-bind/test/index.js +252 -0 collapsed to keep the page light
A node_modules/glob-parent/LICENSE +15 -0 collapsed to keep the page light
A node_modules/glob-parent/README.md +134 -0 collapsed to keep the page light
A node_modules/glob-parent/index.js +75 -0 collapsed to keep the page light
A node_modules/glob-parent/package.json +54 -0 collapsed to keep the page light
A node_modules/glob/LICENSE +15 -0 collapsed to keep the page light
A node_modules/glob/README.md +1265 -0 collapsed to keep the page light
A node_modules/glob/package.json +99 -0 collapsed to keep the page light
A node_modules/graceful-fs/LICENSE +15 -0 collapsed to keep the page light
A node_modules/graceful-fs/README.md +143 -0 collapsed to keep the page light
A node_modules/graceful-fs/clone.js +23 -0 collapsed to keep the page light
A node_modules/graceful-fs/graceful-fs.js +448 -0 collapsed to keep the page light
A node_modules/graceful-fs/legacy-streams.js +118 -0 collapsed to keep the page light
A node_modules/graceful-fs/package.json +53 -0 collapsed to keep the page light
A node_modules/graceful-fs/polyfills.js +355 -0 collapsed to keep the page light
A node_modules/hasown/.eslintrc +5 -0 collapsed to keep the page light
A node_modules/hasown/.github/FUNDING.yml +12 -0 collapsed to keep the page light
A node_modules/hasown/.nycrc +13 -0 collapsed to keep the page light
A node_modules/hasown/CHANGELOG.md +40 -0 collapsed to keep the page light
A node_modules/hasown/LICENSE +21 -0 collapsed to keep the page light
A node_modules/hasown/README.md +40 -0 collapsed to keep the page light
A node_modules/hasown/index.d.ts +3 -0 collapsed to keep the page light
A node_modules/hasown/index.js +8 -0 collapsed to keep the page light
A node_modules/hasown/package.json +92 -0 collapsed to keep the page light
A node_modules/hasown/tsconfig.json +6 -0 collapsed to keep the page light
A node_modules/is-binary-path/index.d.ts +17 -0 collapsed to keep the page light
A node_modules/is-binary-path/index.js +7 -0 collapsed to keep the page light
A node_modules/is-binary-path/license +9 -0 collapsed to keep the page light
A node_modules/is-binary-path/package.json +40 -0 collapsed to keep the page light
A node_modules/is-binary-path/readme.md +34 -0 collapsed to keep the page light
A node_modules/is-core-module/.eslintrc +18 -0 collapsed to keep the page light
A node_modules/is-core-module/.nycrc +9 -0 collapsed to keep the page light
A node_modules/is-core-module/CHANGELOG.md +205 -0 collapsed to keep the page light
A node_modules/is-core-module/LICENSE +20 -0 collapsed to keep the page light
A node_modules/is-core-module/README.md +40 -0 collapsed to keep the page light
A node_modules/is-core-module/core.json +161 -0 collapsed to keep the page light
A node_modules/is-core-module/index.js +69 -0 collapsed to keep the page light
A node_modules/is-core-module/package.json +76 -0 collapsed to keep the page light
A node_modules/is-core-module/test/index.js +154 -0 collapsed to keep the page light
A node_modules/is-extglob/LICENSE +21 -0 collapsed to keep the page light
A node_modules/is-extglob/README.md +107 -0 collapsed to keep the page light
A node_modules/is-extglob/index.js +20 -0 collapsed to keep the page light
A node_modules/is-extglob/package.json +69 -0 collapsed to keep the page light
A node_modules/is-fullwidth-code-point/index.d.ts +17 -0 collapsed to keep the page light
A node_modules/is-fullwidth-code-point/index.js +50 -0 collapsed to keep the page light
A node_modules/is-fullwidth-code-point/license +9 -0 collapsed to keep the page light
A node_modules/is-fullwidth-code-point/package.json +42 -0 collapsed to keep the page light
A node_modules/is-fullwidth-code-point/readme.md +39 -0 collapsed to keep the page light
A node_modules/is-glob/LICENSE +21 -0 collapsed to keep the page light
A node_modules/is-glob/README.md +206 -0 collapsed to keep the page light
A node_modules/is-glob/index.js +150 -0 collapsed to keep the page light
A node_modules/is-glob/package.json +81 -0 collapsed to keep the page light
A node_modules/is-number/LICENSE +21 -0 collapsed to keep the page light
A node_modules/is-number/README.md +187 -0 collapsed to keep the page light
A node_modules/is-number/index.js +18 -0 collapsed to keep the page light
A node_modules/is-number/package.json +82 -0 collapsed to keep the page light
A node_modules/isexe/.npmignore +2 -0 collapsed to keep the page light
A node_modules/isexe/LICENSE +15 -0 collapsed to keep the page light
A node_modules/isexe/README.md +51 -0 collapsed to keep the page light
A node_modules/isexe/index.js +57 -0 collapsed to keep the page light
A node_modules/isexe/mode.js +41 -0 collapsed to keep the page light
A node_modules/isexe/package.json +31 -0 collapsed to keep the page light
A node_modules/isexe/test/basic.js +221 -0 collapsed to keep the page light
A node_modules/isexe/windows.js +42 -0 collapsed to keep the page light
A node_modules/jackspeak/LICENSE.md +55 -0 collapsed to keep the page light
A node_modules/jackspeak/README.md +357 -0 collapsed to keep the page light
A node_modules/jackspeak/package.json +95 -0 collapsed to keep the page light
A node_modules/jiti/LICENSE +21 -0 collapsed to keep the page light
A node_modules/jiti/README.md +235 -0 collapsed to keep the page light
A node_modules/jiti/lib/jiti-cli.mjs +34 -0 collapsed to keep the page light
A node_modules/jiti/lib/jiti-hooks.mjs +117 -0 collapsed to keep the page light
A node_modules/jiti/lib/jiti-native.mjs +121 -0 collapsed to keep the page light
A node_modules/jiti/lib/jiti-register.d.mts +1 -0 collapsed to keep the page light
A node_modules/jiti/lib/jiti-register.mjs +4 -0 collapsed to keep the page light
A node_modules/jiti/lib/jiti.cjs +23 -0 collapsed to keep the page light
A node_modules/jiti/lib/jiti.d.cts +8 -0 collapsed to keep the page light
A node_modules/jiti/lib/jiti.d.mts +8 -0 collapsed to keep the page light
A node_modules/jiti/lib/jiti.mjs +22 -0 collapsed to keep the page light
A node_modules/jiti/lib/types.d.ts +260 -0 collapsed to keep the page light
A node_modules/jiti/package.json +134 -0 collapsed to keep the page light
A node_modules/lightningcss-linux-x64-gnu/LICENSE +373 -0 collapsed to keep the page light
A node_modules/lightningcss-linux-x64-gnu/README.md +1 -0 collapsed to keep the page light
A node_modules/lightningcss-linux-x64-gnu/lightningcss.linux-x64-gnu.node +0 -0 binary file: no text diff

binary file: no text diff

A node_modules/lightningcss-linux-x64-gnu/package.json +37 -0 collapsed to keep the page light
A node_modules/lightningcss-linux-x64-musl/LICENSE +373 -0 collapsed to keep the page light
A node_modules/lightningcss-linux-x64-musl/README.md +1 -0 collapsed to keep the page light
A node_modules/lightningcss-linux-x64-musl/lightningcss.linux-x64-musl.node +0 -0 binary file: no text diff

binary file: no text diff

A node_modules/lightningcss-linux-x64-musl/package.json +37 -0 collapsed to keep the page light
A node_modules/lightningcss/LICENSE +373 -0 collapsed to keep the page light
A node_modules/lightningcss/README.md +105 -0 collapsed to keep the page light
A node_modules/lightningcss/node/ast.d.ts +9716 -0 collapsed to keep the page light
A node_modules/lightningcss/node/ast.js.flow +10346 -0 collapsed to keep the page light
A node_modules/lightningcss/node/browserslistToTargets.js +48 -0 collapsed to keep the page light
A node_modules/lightningcss/node/composeVisitors.js +442 -0 collapsed to keep the page light
A node_modules/lightningcss/node/flags.js +28 -0 collapsed to keep the page light
A node_modules/lightningcss/node/index.d.ts +477 -0 collapsed to keep the page light
A node_modules/lightningcss/node/index.js +28 -0 collapsed to keep the page light
A node_modules/lightningcss/node/index.js.flow +824 -0 collapsed to keep the page light
A node_modules/lightningcss/node/index.mjs +4 -0 collapsed to keep the page light
A node_modules/lightningcss/node/targets.d.ts +40 -0 collapsed to keep the page light
A node_modules/lightningcss/node/targets.js.flow +39 -0 collapsed to keep the page light
A node_modules/lightningcss/package.json +109 -0 collapsed to keep the page light
A node_modules/lilconfig/LICENSE +21 -0 collapsed to keep the page light
A node_modules/lilconfig/package.json +42 -0 collapsed to keep the page light
A node_modules/lilconfig/readme.md +98 -0 collapsed to keep the page light
A node_modules/lilconfig/src/index.d.ts +54 -0 collapsed to keep the page light
A node_modules/lilconfig/src/index.js +460 -0 collapsed to keep the page light
A node_modules/lines-and-columns/LICENSE +21 -0 collapsed to keep the page light
A node_modules/lines-and-columns/README.md +33 -0 collapsed to keep the page light
A node_modules/lines-and-columns/build/index.d.ts +13 -0 collapsed to keep the page light
A node_modules/lines-and-columns/build/index.js +62 -0 collapsed to keep the page light
A node_modules/lines-and-columns/package.json +49 -0 collapsed to keep the page light
A node_modules/lru-cache/LICENSE +15 -0 collapsed to keep the page light
A node_modules/lru-cache/README.md +331 -0 collapsed to keep the page light
A node_modules/lru-cache/package.json +116 -0 collapsed to keep the page light
A node_modules/merge2/LICENSE +21 -0 collapsed to keep the page light
A node_modules/merge2/README.md +144 -0 collapsed to keep the page light
A node_modules/merge2/index.js +144 -0 collapsed to keep the page light
A node_modules/merge2/package.json +43 -0 collapsed to keep the page light
A node_modules/micromatch/LICENSE +21 -0 collapsed to keep the page light
A node_modules/micromatch/README.md +1024 -0 collapsed to keep the page light
A node_modules/micromatch/index.js +474 -0 collapsed to keep the page light
A node_modules/micromatch/package.json +119 -0 collapsed to keep the page light
A node_modules/minimatch/LICENSE +15 -0 collapsed to keep the page light
A node_modules/minimatch/README.md +454 -0 collapsed to keep the page light
A node_modules/minimatch/package.json +82 -0 collapsed to keep the page light
A node_modules/minipass/LICENSE +15 -0 collapsed to keep the page light
A node_modules/minipass/README.md +825 -0 collapsed to keep the page light
A node_modules/minipass/package.json +82 -0 collapsed to keep the page light
A node_modules/mri/index.d.ts +21 -0 collapsed to keep the page light
A node_modules/mri/lib/index.js +119 -0 collapsed to keep the page light
A node_modules/mri/lib/index.mjs +119 -0 collapsed to keep the page light
A node_modules/mri/license.md +21 -0 collapsed to keep the page light
A node_modules/mri/package.json +43 -0 collapsed to keep the page light
A node_modules/mri/readme.md +166 -0 collapsed to keep the page light
A node_modules/mz/HISTORY.md +66 -0 collapsed to keep the page light
A node_modules/mz/LICENSE +22 -0 collapsed to keep the page light
A node_modules/mz/README.md +106 -0 collapsed to keep the page light
A node_modules/mz/child_process.js +8 -0 collapsed to keep the page light
A node_modules/mz/crypto.js +9 -0 collapsed to keep the page light
A node_modules/mz/dns.js +16 -0 collapsed to keep the page light
A node_modules/mz/fs.js +62 -0 collapsed to keep the page light
A node_modules/mz/index.js +8 -0 collapsed to keep the page light
A node_modules/mz/package.json +44 -0 collapsed to keep the page light
A node_modules/mz/readline.js +64 -0 collapsed to keep the page light
A node_modules/mz/zlib.js +13 -0 collapsed to keep the page light
A node_modules/nanoid/LICENSE +20 -0 collapsed to keep the page light
A node_modules/nanoid/README.md +554 -0 collapsed to keep the page light
A node_modules/nanoid/async/index.browser.cjs +69 -0 collapsed to keep the page light
A node_modules/nanoid/async/index.browser.js +69 -0 collapsed to keep the page light
A node_modules/nanoid/async/index.cjs +71 -0 collapsed to keep the page light
A node_modules/nanoid/async/index.d.ts +56 -0 collapsed to keep the page light
A node_modules/nanoid/async/index.js +71 -0 collapsed to keep the page light
A node_modules/nanoid/async/index.native.js +57 -0 collapsed to keep the page light
A node_modules/nanoid/async/package.json +12 -0 collapsed to keep the page light
A node_modules/nanoid/bin/nanoid.cjs +55 -0 collapsed to keep the page light
A node_modules/nanoid/index.browser.cjs +72 -0 collapsed to keep the page light
A node_modules/nanoid/index.browser.js +72 -0 collapsed to keep the page light
A node_modules/nanoid/index.cjs +85 -0 collapsed to keep the page light
A node_modules/nanoid/index.d.cts +91 -0 collapsed to keep the page light
A node_modules/nanoid/index.d.ts +91 -0 collapsed to keep the page light
A node_modules/nanoid/index.js +85 -0 collapsed to keep the page light
A node_modules/nanoid/nanoid.js +1 -0 collapsed to keep the page light
A node_modules/nanoid/non-secure/index.cjs +34 -0 collapsed to keep the page light
A node_modules/nanoid/non-secure/index.d.ts +33 -0 collapsed to keep the page light
A node_modules/nanoid/non-secure/index.js +34 -0 collapsed to keep the page light
A node_modules/nanoid/non-secure/package.json +6 -0 collapsed to keep the page light
A node_modules/nanoid/package.json +88 -0 collapsed to keep the page light
A node_modules/nanoid/url-alphabet/index.cjs +7 -0 collapsed to keep the page light
A node_modules/nanoid/url-alphabet/index.js +7 -0 collapsed to keep the page light
A node_modules/nanoid/url-alphabet/package.json +6 -0 collapsed to keep the page light
A node_modules/node-addon-api/LICENSE.md +9 -0 collapsed to keep the page light
A node_modules/node-addon-api/README.md +319 -0 collapsed to keep the page light
A node_modules/node-addon-api/common.gypi +20 -0 collapsed to keep the page light
A node_modules/node-addon-api/except.gypi +25 -0 collapsed to keep the page light
A node_modules/node-addon-api/index.js +12 -0 collapsed to keep the page light
A node_modules/node-addon-api/napi-inl.deprecated.h +186 -0 collapsed to keep the page light
A node_modules/node-addon-api/napi-inl.h +6607 -0 collapsed to keep the page light
A node_modules/node-addon-api/napi.h +3201 -0 collapsed to keep the page light
A node_modules/node-addon-api/node_addon_api.gyp +32 -0 collapsed to keep the page light
A node_modules/node-addon-api/node_api.gyp +9 -0 collapsed to keep the page light
A node_modules/node-addon-api/noexcept.gypi +26 -0 collapsed to keep the page light
A node_modules/node-addon-api/nothing.c +0 -0

no textual change.

A node_modules/node-addon-api/package-support.json +21 -0 collapsed to keep the page light
A node_modules/node-addon-api/package.json +480 -0 collapsed to keep the page light
A node_modules/node-addon-api/tools/README.md +73 -0 collapsed to keep the page light
A node_modules/node-addon-api/tools/check-napi.js +99 -0 collapsed to keep the page light
A node_modules/node-addon-api/tools/clang-format.js +71 -0 collapsed to keep the page light
A node_modules/node-addon-api/tools/conversion.js +301 -0 collapsed to keep the page light
A node_modules/node-addon-api/tools/eslint-format.js +79 -0 collapsed to keep the page light
A node_modules/normalize-path/LICENSE +21 -0 collapsed to keep the page light
A node_modules/normalize-path/README.md +127 -0 collapsed to keep the page light
A node_modules/normalize-path/index.js +35 -0 collapsed to keep the page light
A node_modules/normalize-path/package.json +77 -0 collapsed to keep the page light
A node_modules/object-assign/index.js +90 -0 collapsed to keep the page light
A node_modules/object-assign/license +21 -0 collapsed to keep the page light
A node_modules/object-assign/package.json +42 -0 collapsed to keep the page light
A node_modules/object-assign/readme.md +61 -0 collapsed to keep the page light
A node_modules/object-hash/LICENSE +22 -0 collapsed to keep the page light
A node_modules/object-hash/index.js +453 -0 collapsed to keep the page light
A node_modules/object-hash/package.json +53 -0 collapsed to keep the page light
A node_modules/object-hash/readme.markdown +198 -0 collapsed to keep the page light
A node_modules/package-json-from-dist/LICENSE.md +63 -0 collapsed to keep the page light
A node_modules/package-json-from-dist/README.md +110 -0 collapsed to keep the page light
A node_modules/package-json-from-dist/package.json +68 -0 collapsed to keep the page light
A node_modules/path-key/index.d.ts +40 -0 collapsed to keep the page light
A node_modules/path-key/index.js +16 -0 collapsed to keep the page light
A node_modules/path-key/license +9 -0 collapsed to keep the page light
A node_modules/path-key/package.json +39 -0 collapsed to keep the page light
A node_modules/path-key/readme.md +61 -0 collapsed to keep the page light
A node_modules/path-parse/LICENSE +21 -0 collapsed to keep the page light
A node_modules/path-parse/README.md +42 -0 collapsed to keep the page light
A node_modules/path-parse/index.js +75 -0 collapsed to keep the page light
A node_modules/path-parse/package.json +33 -0 collapsed to keep the page light
A node_modules/path-scurry/LICENSE.md +55 -0 collapsed to keep the page light
A node_modules/path-scurry/README.md +636 -0 collapsed to keep the page light
A node_modules/path-scurry/package.json +89 -0 collapsed to keep the page light
A node_modules/picocolors/LICENSE +15 -0 collapsed to keep the page light
A node_modules/picocolors/README.md +21 -0 collapsed to keep the page light
A node_modules/picocolors/package.json +25 -0 collapsed to keep the page light
A node_modules/picocolors/picocolors.browser.js +4 -0 collapsed to keep the page light
A node_modules/picocolors/picocolors.d.ts +5 -0 collapsed to keep the page light
A node_modules/picocolors/picocolors.js +75 -0 collapsed to keep the page light
A node_modules/picocolors/types.d.ts +51 -0 collapsed to keep the page light
A node_modules/picomatch/CHANGELOG.md +136 -0 collapsed to keep the page light
A node_modules/picomatch/LICENSE +21 -0 collapsed to keep the page light
A node_modules/picomatch/README.md +708 -0 collapsed to keep the page light
A node_modules/picomatch/index.js +3 -0 collapsed to keep the page light
A node_modules/picomatch/lib/constants.js +179 -0 collapsed to keep the page light
A node_modules/picomatch/lib/parse.js +1091 -0 collapsed to keep the page light
A node_modules/picomatch/lib/picomatch.js +342 -0 collapsed to keep the page light
A node_modules/picomatch/lib/scan.js +391 -0 collapsed to keep the page light
A node_modules/picomatch/lib/utils.js +64 -0 collapsed to keep the page light
A node_modules/picomatch/package.json +81 -0 collapsed to keep the page light
A node_modules/pify/index.js +68 -0 collapsed to keep the page light
A node_modules/pify/license +21 -0 collapsed to keep the page light
A node_modules/pify/package.json +48 -0 collapsed to keep the page light
A node_modules/pify/readme.md +119 -0 collapsed to keep the page light
A node_modules/pirates/LICENSE +21 -0 collapsed to keep the page light
A node_modules/pirates/README.md +69 -0 collapsed to keep the page light
A node_modules/pirates/index.d.ts +82 -0 collapsed to keep the page light
A node_modules/pirates/lib/index.js +139 -0 collapsed to keep the page light
A node_modules/pirates/package.json +74 -0 collapsed to keep the page light
A node_modules/postcss-import/LICENSE +20 -0 collapsed to keep the page light
A node_modules/postcss-import/README.md +244 -0 collapsed to keep the page light
A node_modules/postcss-import/index.js +420 -0 collapsed to keep the page light
A node_modules/postcss-import/lib/assign-layer-names.js +17 -0 collapsed to keep the page light
A node_modules/postcss-import/lib/data-url.js +17 -0 collapsed to keep the page light
A node_modules/postcss-import/lib/join-layer.js +9 -0 collapsed to keep the page light
A node_modules/postcss-import/lib/join-media.js +28 -0 collapsed to keep the page light
A node_modules/postcss-import/lib/load-content.js +12 -0 collapsed to keep the page light
A node_modules/postcss-import/lib/parse-statements.js +172 -0 collapsed to keep the page light
A node_modules/postcss-import/lib/process-content.js +59 -0 collapsed to keep the page light
A node_modules/postcss-import/lib/resolve-id.js +42 -0 collapsed to keep the page light
A node_modules/postcss-import/package.json +65 -0 collapsed to keep the page light
A node_modules/postcss-js/LICENSE +20 -0 collapsed to keep the page light
A node_modules/postcss-js/README.md +22 -0 collapsed to keep the page light
A node_modules/postcss-js/async.js +15 -0 collapsed to keep the page light
A node_modules/postcss-js/index.js +11 -0 collapsed to keep the page light
A node_modules/postcss-js/index.mjs +8 -0 collapsed to keep the page light
A node_modules/postcss-js/objectifier.js +85 -0 collapsed to keep the page light
A node_modules/postcss-js/package.json +42 -0 collapsed to keep the page light
A node_modules/postcss-js/parser.js +104 -0 collapsed to keep the page light
A node_modules/postcss-js/process-result.js +11 -0 collapsed to keep the page light
A node_modules/postcss-js/sync.js +12 -0 collapsed to keep the page light
A node_modules/postcss-load-config/LICENSE +20 -0 collapsed to keep the page light
A node_modules/postcss-load-config/README.md +466 -0 collapsed to keep the page light
A node_modules/postcss-load-config/node_modules/lilconfig/LICENSE +21 -0 collapsed to keep the page light
A node_modules/postcss-load-config/node_modules/lilconfig/package.json +42 -0 collapsed to keep the page light
A node_modules/postcss-load-config/node_modules/lilconfig/readme.md +98 -0 collapsed to keep the page light
A node_modules/postcss-load-config/node_modules/lilconfig/src/index.d.ts +54 -0 collapsed to keep the page light
A node_modules/postcss-load-config/node_modules/lilconfig/src/index.js +457 -0 collapsed to keep the page light
A node_modules/postcss-load-config/package.json +54 -0 collapsed to keep the page light
A node_modules/postcss-load-config/src/index.d.ts +65 -0 collapsed to keep the page light
A node_modules/postcss-load-config/src/index.js +185 -0 collapsed to keep the page light
A node_modules/postcss-load-config/src/options.js +47 -0 collapsed to keep the page light
A node_modules/postcss-load-config/src/plugins.js +85 -0 collapsed to keep the page light
A node_modules/postcss-load-config/src/req.js +10 -0 collapsed to keep the page light
A node_modules/postcss-nested/LICENSE +20 -0 collapsed to keep the page light
A node_modules/postcss-nested/README.md +85 -0 collapsed to keep the page light
A node_modules/postcss-nested/index.d.ts +41 -0 collapsed to keep the page light
A node_modules/postcss-nested/index.js +361 -0 collapsed to keep the page light
A node_modules/postcss-nested/package.json +34 -0 collapsed to keep the page light
A node_modules/postcss-selector-parser/API.md +872 -0 collapsed to keep the page light
A node_modules/postcss-selector-parser/CHANGELOG.md +549 -0 collapsed to keep the page light
A node_modules/postcss-selector-parser/LICENSE-MIT +22 -0 collapsed to keep the page light
A node_modules/postcss-selector-parser/README.md +49 -0 collapsed to keep the page light
A node_modules/postcss-selector-parser/package.json +80 -0 collapsed to keep the page light
A node_modules/postcss-selector-parser/postcss-selector-parser.d.ts +555 -0 collapsed to keep the page light
A node_modules/postcss-value-parser/LICENSE +22 -0 collapsed to keep the page light
A node_modules/postcss-value-parser/README.md +263 -0 collapsed to keep the page light
A node_modules/postcss-value-parser/lib/index.d.ts +177 -0 collapsed to keep the page light
A node_modules/postcss-value-parser/lib/index.js +28 -0 collapsed to keep the page light
A node_modules/postcss-value-parser/lib/parse.js +321 -0 collapsed to keep the page light
A node_modules/postcss-value-parser/lib/stringify.js +48 -0 collapsed to keep the page light
A node_modules/postcss-value-parser/lib/unit.js +120 -0 collapsed to keep the page light
A node_modules/postcss-value-parser/lib/walk.js +22 -0 collapsed to keep the page light
A node_modules/postcss-value-parser/package.json +58 -0 collapsed to keep the page light
A node_modules/postcss/LICENSE +20 -0 collapsed to keep the page light
A node_modules/postcss/README.md +28 -0 collapsed to keep the page light
A node_modules/postcss/lib/at-rule.d.ts +140 -0 collapsed to keep the page light
A node_modules/postcss/lib/at-rule.js +25 -0 collapsed to keep the page light
A node_modules/postcss/lib/comment.d.ts +68 -0 collapsed to keep the page light
A node_modules/postcss/lib/comment.js +13 -0 collapsed to keep the page light
A node_modules/postcss/lib/container.d.ts +480 -0 collapsed to keep the page light
A node_modules/postcss/lib/container.js +447 -0 collapsed to keep the page light
A node_modules/postcss/lib/css-syntax-error.d.ts +248 -0 collapsed to keep the page light
A node_modules/postcss/lib/css-syntax-error.js +133 -0 collapsed to keep the page light
A node_modules/postcss/lib/declaration.d.ts +151 -0 collapsed to keep the page light
A node_modules/postcss/lib/declaration.js +24 -0 collapsed to keep the page light
A node_modules/postcss/lib/document.d.ts +69 -0 collapsed to keep the page light
A node_modules/postcss/lib/document.js +33 -0 collapsed to keep the page light
A node_modules/postcss/lib/fromJSON.d.ts +9 -0 collapsed to keep the page light
A node_modules/postcss/lib/fromJSON.js +54 -0 collapsed to keep the page light
A node_modules/postcss/lib/input.d.ts +206 -0 collapsed to keep the page light
A node_modules/postcss/lib/input.js +251 -0 collapsed to keep the page light
A node_modules/postcss/lib/lazy-result.d.ts +190 -0 collapsed to keep the page light
A node_modules/postcss/lib/lazy-result.js +550 -0 collapsed to keep the page light
A node_modules/postcss/lib/list.d.ts +60 -0 collapsed to keep the page light
A node_modules/postcss/lib/list.js +58 -0 collapsed to keep the page light
A node_modules/postcss/lib/map-generator.js +368 -0 collapsed to keep the page light
A node_modules/postcss/lib/no-work-result.d.ts +46 -0 collapsed to keep the page light
A node_modules/postcss/lib/no-work-result.js +138 -0 collapsed to keep the page light
A node_modules/postcss/lib/node.d.ts +541 -0 collapsed to keep the page light
A node_modules/postcss/lib/node.js +434 -0 collapsed to keep the page light
A node_modules/postcss/lib/parse.d.ts +9 -0 collapsed to keep the page light
A node_modules/postcss/lib/parse.js +42 -0 collapsed to keep the page light
A node_modules/postcss/lib/parser.js +611 -0 collapsed to keep the page light
A node_modules/postcss/lib/postcss.d.mts +69 -0 collapsed to keep the page light
A node_modules/postcss/lib/postcss.d.ts +458 -0 collapsed to keep the page light
A node_modules/postcss/lib/postcss.js +101 -0 collapsed to keep the page light
A node_modules/postcss/lib/postcss.mjs +30 -0 collapsed to keep the page light
A node_modules/postcss/lib/previous-map.d.ts +81 -0 collapsed to keep the page light
A node_modules/postcss/lib/previous-map.js +144 -0 collapsed to keep the page light
A node_modules/postcss/lib/processor.d.ts +115 -0 collapsed to keep the page light
A node_modules/postcss/lib/processor.js +67 -0 collapsed to keep the page light
A node_modules/postcss/lib/result.d.ts +205 -0 collapsed to keep the page light
A node_modules/postcss/lib/result.js +42 -0 collapsed to keep the page light
A node_modules/postcss/lib/root.d.ts +87 -0 collapsed to keep the page light
A node_modules/postcss/lib/root.js +61 -0 collapsed to keep the page light
A node_modules/postcss/lib/rule.d.ts +126 -0 collapsed to keep the page light
A node_modules/postcss/lib/rule.js +27 -0 collapsed to keep the page light
A node_modules/postcss/lib/stringifier.d.ts +46 -0 collapsed to keep the page light
A node_modules/postcss/lib/stringifier.js +353 -0 collapsed to keep the page light
A node_modules/postcss/lib/stringify.d.ts +9 -0 collapsed to keep the page light
A node_modules/postcss/lib/stringify.js +11 -0 collapsed to keep the page light
A node_modules/postcss/lib/symbols.js +5 -0 collapsed to keep the page light
A node_modules/postcss/lib/terminal-highlight.js +70 -0 collapsed to keep the page light
A node_modules/postcss/lib/tokenize.js +266 -0 collapsed to keep the page light
A node_modules/postcss/lib/warn-once.js +13 -0 collapsed to keep the page light
A node_modules/postcss/lib/warning.d.ts +147 -0 collapsed to keep the page light
A node_modules/postcss/lib/warning.js +37 -0 collapsed to keep the page light
A node_modules/postcss/package.json +88 -0 collapsed to keep the page light
A node_modules/prettier-plugin-tailwindcss/LICENSE +21 -0 collapsed to keep the page light
A node_modules/prettier-plugin-tailwindcss/README.md +174 -0 collapsed to keep the page light
A node_modules/prettier-plugin-tailwindcss/package.json +144 -0 collapsed to keep the page light
A node_modules/prettier/LICENSE +7 -0 collapsed to keep the page light
A node_modules/prettier/README.md +108 -0 collapsed to keep the page light
A node_modules/prettier/THIRD-PARTY-NOTICES.md +4416 -0 collapsed to keep the page light
A node_modules/prettier/bin/prettier.cjs +68 -0 collapsed to keep the page light
A node_modules/prettier/doc.d.ts +254 -0 collapsed to keep the page light
A node_modules/prettier/doc.js +1261 -0 collapsed to keep the page light
A node_modules/prettier/doc.mjs +1233 -0 collapsed to keep the page light
A node_modules/prettier/index.cjs +682 -0 collapsed to keep the page light
A node_modules/prettier/index.d.ts +956 -0 collapsed to keep the page light
A node_modules/prettier/index.mjs +22242 -0 collapsed to keep the page light
A node_modules/prettier/internal/cli.mjs +4873 -0 collapsed to keep the page light
A node_modules/prettier/package.json +200 -0 collapsed to keep the page light
A node_modules/prettier/plugins/acorn.d.ts +6 -0 collapsed to keep the page light
A node_modules/prettier/plugins/acorn.js +15 -0 collapsed to keep the page light
A node_modules/prettier/plugins/acorn.mjs +15 -0 collapsed to keep the page light
A node_modules/prettier/plugins/angular.d.ts +8 -0 collapsed to keep the page light
A node_modules/prettier/plugins/angular.js +2 -0 collapsed to keep the page light
A node_modules/prettier/plugins/angular.mjs +2 -0 collapsed to keep the page light
A node_modules/prettier/plugins/babel.d.ts +18 -0 collapsed to keep the page light
A node_modules/prettier/plugins/babel.js +15 -0 collapsed to keep the page light
A node_modules/prettier/plugins/babel.mjs +15 -0 collapsed to keep the page light
A node_modules/prettier/plugins/estree.d.ts +1 -0 collapsed to keep the page light
A node_modules/prettier/plugins/estree.js +36 -0 collapsed to keep the page light
A node_modules/prettier/plugins/estree.mjs +36 -0 collapsed to keep the page light
A node_modules/prettier/plugins/flow.d.ts +5 -0 collapsed to keep the page light
A node_modules/prettier/plugins/flow.js +19 -0 collapsed to keep the page light
A node_modules/prettier/plugins/flow.mjs +19 -0 collapsed to keep the page light
A node_modules/prettier/plugins/glimmer.d.ts +5 -0 collapsed to keep the page light
A node_modules/prettier/plugins/glimmer.js +30 -0 collapsed to keep the page light
A node_modules/prettier/plugins/glimmer.mjs +30 -0 collapsed to keep the page light
A node_modules/prettier/plugins/graphql.d.ts +5 -0 collapsed to keep the page light
A node_modules/prettier/plugins/graphql.js +29 -0 collapsed to keep the page light
A node_modules/prettier/plugins/graphql.mjs +29 -0 collapsed to keep the page light
A node_modules/prettier/plugins/html.d.ts +8 -0 collapsed to keep the page light
A node_modules/prettier/plugins/html.js +22 -0 collapsed to keep the page light
A node_modules/prettier/plugins/html.mjs +22 -0 collapsed to keep the page light
A node_modules/prettier/plugins/markdown.d.ts +7 -0 collapsed to keep the page light
A node_modules/prettier/plugins/markdown.js +63 -0 collapsed to keep the page light
A node_modules/prettier/plugins/markdown.mjs +63 -0 collapsed to keep the page light
A node_modules/prettier/plugins/meriyah.d.ts +5 -0 collapsed to keep the page light
A node_modules/prettier/plugins/meriyah.js +4 -0 collapsed to keep the page light
A node_modules/prettier/plugins/meriyah.mjs +4 -0 collapsed to keep the page light
A node_modules/prettier/plugins/postcss.d.ts +7 -0 collapsed to keep the page light
A node_modules/prettier/plugins/postcss.js +54 -0 collapsed to keep the page light
A node_modules/prettier/plugins/postcss.mjs +54 -0 collapsed to keep the page light
A node_modules/prettier/plugins/typescript.d.ts +5 -0 collapsed to keep the page light
A node_modules/prettier/plugins/typescript.js +20 -0 collapsed to keep the page light
A node_modules/prettier/plugins/typescript.mjs +20 -0 collapsed to keep the page light
A node_modules/prettier/plugins/yaml.d.ts +5 -0 collapsed to keep the page light
A node_modules/prettier/plugins/yaml.js +161 -0 collapsed to keep the page light
A node_modules/prettier/plugins/yaml.mjs +161 -0 collapsed to keep the page light
A node_modules/prettier/standalone.d.ts +33 -0 collapsed to keep the page light
A node_modules/prettier/standalone.js +39 -0 collapsed to keep the page light
A node_modules/prettier/standalone.mjs +39 -0 collapsed to keep the page light
A node_modules/queue-microtask/LICENSE +20 -0 collapsed to keep the page light
A node_modules/queue-microtask/README.md +90 -0 collapsed to keep the page light
A node_modules/queue-microtask/index.d.ts +2 -0 collapsed to keep the page light
A node_modules/queue-microtask/index.js +9 -0 collapsed to keep the page light
A node_modules/queue-microtask/package.json +55 -0 collapsed to keep the page light
A node_modules/read-cache/LICENSE +20 -0 collapsed to keep the page light
A node_modules/read-cache/README.md +46 -0 collapsed to keep the page light
A node_modules/read-cache/index.js +78 -0 collapsed to keep the page light
A node_modules/read-cache/package.json +34 -0 collapsed to keep the page light
A node_modules/readdirp/LICENSE +21 -0 collapsed to keep the page light
A node_modules/readdirp/README.md +122 -0 collapsed to keep the page light
A node_modules/readdirp/index.d.ts +43 -0 collapsed to keep the page light
A node_modules/readdirp/index.js +287 -0 collapsed to keep the page light
A node_modules/readdirp/package.json +122 -0 collapsed to keep the page light
A node_modules/resolve/.editorconfig +37 -0 collapsed to keep the page light
A node_modules/resolve/.eslintrc +65 -0 collapsed to keep the page light
A node_modules/resolve/.github/FUNDING.yml +12 -0 collapsed to keep the page light
A node_modules/resolve/LICENSE +21 -0 collapsed to keep the page light
A node_modules/resolve/SECURITY.md +3 -0 collapsed to keep the page light
A node_modules/resolve/async.js +3 -0 collapsed to keep the page light
A node_modules/resolve/bin/resolve +50 -0 collapsed to keep the page light
A node_modules/resolve/example/async.js +5 -0 collapsed to keep the page light
A node_modules/resolve/example/sync.js +3 -0 collapsed to keep the page light
A node_modules/resolve/index.js +6 -0 collapsed to keep the page light
A node_modules/resolve/lib/async.js +329 -0 collapsed to keep the page light
A node_modules/resolve/lib/caller.js +8 -0 collapsed to keep the page light
A node_modules/resolve/lib/core.js +12 -0 collapsed to keep the page light
A node_modules/resolve/lib/core.json +158 -0 collapsed to keep the page light
A node_modules/resolve/lib/homedir.js +24 -0 collapsed to keep the page light
A node_modules/resolve/lib/is-core.js +5 -0 collapsed to keep the page light
A node_modules/resolve/lib/node-modules-paths.js +42 -0 collapsed to keep the page light
A node_modules/resolve/lib/normalize-options.js +10 -0 collapsed to keep the page light
A node_modules/resolve/lib/sync.js +208 -0 collapsed to keep the page light
A node_modules/resolve/package.json +72 -0 collapsed to keep the page light
A node_modules/resolve/readme.markdown +301 -0 collapsed to keep the page light
A node_modules/resolve/sync.js +3 -0 collapsed to keep the page light
A node_modules/resolve/test/core.js +88 -0 collapsed to keep the page light
A node_modules/resolve/test/dotdot.js +29 -0 collapsed to keep the page light
A node_modules/resolve/test/dotdot/abc/index.js +2 -0 collapsed to keep the page light
A node_modules/resolve/test/dotdot/index.js +1 -0 collapsed to keep the page light
A node_modules/resolve/test/faulty_basedir.js +29 -0 collapsed to keep the page light
A node_modules/resolve/test/filter.js +34 -0 collapsed to keep the page light
A node_modules/resolve/test/filter_sync.js +33 -0 collapsed to keep the page light
A node_modules/resolve/test/home_paths.js +127 -0 collapsed to keep the page light
A node_modules/resolve/test/home_paths_sync.js +114 -0 collapsed to keep the page light
A node_modules/resolve/test/mock.js +315 -0 collapsed to keep the page light
A node_modules/resolve/test/mock_sync.js +214 -0 collapsed to keep the page light
A node_modules/resolve/test/module_dir.js +56 -0 collapsed to keep the page light
A node_modules/resolve/test/module_dir/xmodules/aaa/index.js +1 -0 collapsed to keep the page light
A node_modules/resolve/test/module_dir/ymodules/aaa/index.js +1 -0 collapsed to keep the page light
A node_modules/resolve/test/module_dir/zmodules/bbb/main.js +1 -0 collapsed to keep the page light
A node_modules/resolve/test/module_dir/zmodules/bbb/package.json +3 -0 collapsed to keep the page light
A node_modules/resolve/test/node-modules-paths.js +143 -0 collapsed to keep the page light
A node_modules/resolve/test/node_path.js +70 -0 collapsed to keep the page light
A node_modules/resolve/test/node_path/x/aaa/index.js +1 -0 collapsed to keep the page light
A node_modules/resolve/test/node_path/x/ccc/index.js +1 -0 collapsed to keep the page light
A node_modules/resolve/test/node_path/y/bbb/index.js +1 -0 collapsed to keep the page light
A node_modules/resolve/test/node_path/y/ccc/index.js +1 -0 collapsed to keep the page light
A node_modules/resolve/test/nonstring.js +9 -0 collapsed to keep the page light
A node_modules/resolve/test/pathfilter.js +75 -0 collapsed to keep the page light
A node_modules/resolve/test/pathfilter/deep_ref/main.js +0 -0

no textual change.

A node_modules/resolve/test/precedence.js +23 -0 collapsed to keep the page light
A node_modules/resolve/test/precedence/aaa.js +1 -0 collapsed to keep the page light
A node_modules/resolve/test/precedence/aaa/index.js +1 -0 collapsed to keep the page light
A node_modules/resolve/test/precedence/aaa/main.js +1 -0 collapsed to keep the page light
A node_modules/resolve/test/precedence/bbb.js +1 -0 collapsed to keep the page light
A node_modules/resolve/test/precedence/bbb/main.js +1 -0 collapsed to keep the page light
A node_modules/resolve/test/resolver.js +597 -0 collapsed to keep the page light
A node_modules/resolve/test/resolver/baz/doom.js +0 -0

no textual change.

A node_modules/resolve/test/resolver/baz/package.json +4 -0 collapsed to keep the page light
A node_modules/resolve/test/resolver/baz/quux.js +1 -0 collapsed to keep the page light
A node_modules/resolve/test/resolver/browser_field/a.js +0 -0

no textual change.

A node_modules/resolve/test/resolver/browser_field/b.js +0 -0

no textual change.

A node_modules/resolve/test/resolver/browser_field/package.json +5 -0 collapsed to keep the page light
A node_modules/resolve/test/resolver/cup.coffee +1 -0 collapsed to keep the page light
A node_modules/resolve/test/resolver/dot_main/index.js +1 -0 collapsed to keep the page light
A node_modules/resolve/test/resolver/dot_main/package.json +3 -0 collapsed to keep the page light
A node_modules/resolve/test/resolver/dot_slash_main/index.js +1 -0 collapsed to keep the page light
A node_modules/resolve/test/resolver/dot_slash_main/package.json +3 -0 collapsed to keep the page light
A node_modules/resolve/test/resolver/false_main/index.js +0 -0

no textual change.

A node_modules/resolve/test/resolver/false_main/package.json +4 -0 collapsed to keep the page light
A node_modules/resolve/test/resolver/foo.js +1 -0 collapsed to keep the page light
A node_modules/resolve/test/resolver/incorrect_main/index.js +2 -0 collapsed to keep the page light
A node_modules/resolve/test/resolver/incorrect_main/package.json +3 -0 collapsed to keep the page light
A node_modules/resolve/test/resolver/invalid_main/package.json +7 -0 collapsed to keep the page light
A node_modules/resolve/test/resolver/mug.coffee +0 -0

no textual change.

A node_modules/resolve/test/resolver/mug.js +0 -0

no textual change.

A node_modules/resolve/test/resolver/multirepo/lerna.json +6 -0 collapsed to keep the page light
A node_modules/resolve/test/resolver/multirepo/package.json +20 -0 collapsed to keep the page light
A node_modules/resolve/test/resolver/multirepo/packages/package-a/index.js +35 -0 collapsed to keep the page light
A node_modules/resolve/test/resolver/multirepo/packages/package-a/package.json +14 -0 collapsed to keep the page light
A node_modules/resolve/test/resolver/multirepo/packages/package-b/index.js +0 -0

no textual change.

A node_modules/resolve/test/resolver/multirepo/packages/package-b/package.json +14 -0 collapsed to keep the page light
A node_modules/resolve/test/resolver/nested_symlinks/mylib/async.js +26 -0 collapsed to keep the page light
A node_modules/resolve/test/resolver/nested_symlinks/mylib/package.json +15 -0 collapsed to keep the page light
A node_modules/resolve/test/resolver/nested_symlinks/mylib/sync.js +12 -0 collapsed to keep the page light
A node_modules/resolve/test/resolver/other_path/lib/other-lib.js +0 -0

no textual change.

A node_modules/resolve/test/resolver/other_path/root.js +0 -0

no textual change.

A node_modules/resolve/test/resolver/quux/foo/index.js +1 -0 collapsed to keep the page light
A node_modules/resolve/test/resolver/same_names/foo.js +1 -0 collapsed to keep the page light
A node_modules/resolve/test/resolver/same_names/foo/index.js +1 -0 collapsed to keep the page light
A node_modules/resolve/test/resolver/symlinked/_/node_modules/foo.js +0 -0

no textual change.

A node_modules/resolve/test/resolver/symlinked/_/symlink_target/.gitkeep +0 -0

no textual change.

A node_modules/resolve/test/resolver/symlinked/package/bar.js +1 -0 collapsed to keep the page light
A node_modules/resolve/test/resolver/symlinked/package/package.json +3 -0 collapsed to keep the page light
A node_modules/resolve/test/resolver/without_basedir/main.js +5 -0 collapsed to keep the page light
A node_modules/resolve/test/resolver_sync.js +730 -0 collapsed to keep the page light
A node_modules/resolve/test/shadowed_core.js +54 -0 collapsed to keep the page light
A node_modules/resolve/test/shadowed_core/node_modules/util/index.js +0 -0

no textual change.

A node_modules/resolve/test/subdirs.js +13 -0 collapsed to keep the page light
A node_modules/resolve/test/symlinks.js +176 -0 collapsed to keep the page light
A node_modules/reusify/.coveralls.yml +1 -0 collapsed to keep the page light
A node_modules/reusify/.travis.yml +28 -0 collapsed to keep the page light
A node_modules/reusify/LICENSE +22 -0 collapsed to keep the page light
A node_modules/reusify/README.md +145 -0 collapsed to keep the page light
A node_modules/reusify/benchmarks/createNoCodeFunction.js +30 -0 collapsed to keep the page light
A node_modules/reusify/benchmarks/fib.js +13 -0 collapsed to keep the page light
A node_modules/reusify/benchmarks/reuseNoCodeFunction.js +38 -0 collapsed to keep the page light
A node_modules/reusify/package.json +45 -0 collapsed to keep the page light
A node_modules/reusify/reusify.js +33 -0 collapsed to keep the page light
A node_modules/reusify/test.js +66 -0 collapsed to keep the page light
A node_modules/run-parallel/LICENSE +20 -0 collapsed to keep the page light
A node_modules/run-parallel/README.md +85 -0 collapsed to keep the page light
A node_modules/run-parallel/index.js +51 -0 collapsed to keep the page light
A node_modules/run-parallel/package.json +58 -0 collapsed to keep the page light
A node_modules/shebang-command/index.js +19 -0 collapsed to keep the page light
A node_modules/shebang-command/license +9 -0 collapsed to keep the page light
A node_modules/shebang-command/package.json +34 -0 collapsed to keep the page light
A node_modules/shebang-command/readme.md +34 -0 collapsed to keep the page light
A node_modules/shebang-regex/index.d.ts +22 -0 collapsed to keep the page light
A node_modules/shebang-regex/index.js +2 -0 collapsed to keep the page light
A node_modules/shebang-regex/license +9 -0 collapsed to keep the page light
A node_modules/shebang-regex/package.json +35 -0 collapsed to keep the page light
A node_modules/shebang-regex/readme.md +33 -0 collapsed to keep the page light
A node_modules/signal-exit/README.md +74 -0 collapsed to keep the page light
A node_modules/signal-exit/package.json +106 -0 collapsed to keep the page light
A node_modules/source-map-js/LICENSE +28 -0 collapsed to keep the page light
A node_modules/source-map-js/README.md +765 -0 collapsed to keep the page light
A node_modules/source-map-js/lib/array-set.js +121 -0 collapsed to keep the page light
A node_modules/source-map-js/lib/base64-vlq.js +140 -0 collapsed to keep the page light
A node_modules/source-map-js/lib/base64.js +67 -0 collapsed to keep the page light
A node_modules/source-map-js/lib/binary-search.js +111 -0 collapsed to keep the page light
A node_modules/source-map-js/lib/mapping-list.js +79 -0 collapsed to keep the page light
A node_modules/source-map-js/lib/quick-sort.js +132 -0 collapsed to keep the page light
A node_modules/source-map-js/lib/source-map-consumer.d.ts +1 -0 collapsed to keep the page light
A node_modules/source-map-js/lib/source-map-consumer.js +1188 -0 collapsed to keep the page light
A node_modules/source-map-js/lib/source-map-generator.d.ts +1 -0 collapsed to keep the page light
A node_modules/source-map-js/lib/source-map-generator.js +444 -0 collapsed to keep the page light
A node_modules/source-map-js/lib/source-node.d.ts +1 -0 collapsed to keep the page light
A node_modules/source-map-js/lib/source-node.js +413 -0 collapsed to keep the page light
A node_modules/source-map-js/lib/util.js +594 -0 collapsed to keep the page light
A node_modules/source-map-js/package.json +71 -0 collapsed to keep the page light
A node_modules/source-map-js/source-map.d.ts +104 -0 collapsed to keep the page light
A node_modules/source-map-js/source-map.js +8 -0 collapsed to keep the page light
A node_modules/string-width-cjs/index.d.ts +29 -0 collapsed to keep the page light
A node_modules/string-width-cjs/index.js +47 -0 collapsed to keep the page light
A node_modules/string-width-cjs/license +9 -0 collapsed to keep the page light
A node_modules/string-width-cjs/node_modules/emoji-regex/README.md +73 -0 collapsed to keep the page light
A node_modules/string-width-cjs/node_modules/emoji-regex/es2015/index.js +6 -0 collapsed to keep the page light
A node_modules/string-width-cjs/node_modules/emoji-regex/es2015/text.js +6 -0 collapsed to keep the page light
A node_modules/string-width-cjs/node_modules/emoji-regex/index.d.ts +23 -0 collapsed to keep the page light
A node_modules/string-width-cjs/node_modules/emoji-regex/index.js +6 -0 collapsed to keep the page light
A node_modules/string-width-cjs/node_modules/emoji-regex/package.json +50 -0 collapsed to keep the page light
A node_modules/string-width-cjs/node_modules/emoji-regex/text.js +6 -0 collapsed to keep the page light
A node_modules/string-width-cjs/node_modules/strip-ansi/index.d.ts +17 -0 collapsed to keep the page light
A node_modules/string-width-cjs/node_modules/strip-ansi/index.js +4 -0 collapsed to keep the page light
A node_modules/string-width-cjs/node_modules/strip-ansi/license +9 -0 collapsed to keep the page light
A node_modules/string-width-cjs/node_modules/strip-ansi/node_modules/ansi-regex/index.d.ts +37 -0 collapsed to keep the page light
A node_modules/string-width-cjs/node_modules/strip-ansi/node_modules/ansi-regex/index.js +10 -0 collapsed to keep the page light
A node_modules/string-width-cjs/node_modules/strip-ansi/node_modules/ansi-regex/license +9 -0 collapsed to keep the page light
A node_modules/string-width-cjs/node_modules/strip-ansi/node_modules/ansi-regex/package.json +55 -0 collapsed to keep the page light
A node_modules/string-width-cjs/node_modules/strip-ansi/node_modules/ansi-regex/readme.md +78 -0 collapsed to keep the page light
A node_modules/string-width-cjs/node_modules/strip-ansi/package.json +54 -0 collapsed to keep the page light
A node_modules/string-width-cjs/node_modules/strip-ansi/readme.md +46 -0 collapsed to keep the page light
A node_modules/string-width-cjs/package.json +56 -0 collapsed to keep the page light
A node_modules/string-width-cjs/readme.md +50 -0 collapsed to keep the page light
A node_modules/string-width/index.d.ts +29 -0 collapsed to keep the page light
A node_modules/string-width/index.js +54 -0 collapsed to keep the page light
A node_modules/string-width/license +9 -0 collapsed to keep the page light
A node_modules/string-width/package.json +59 -0 collapsed to keep the page light
A node_modules/string-width/readme.md +67 -0 collapsed to keep the page light
A node_modules/strip-ansi-cjs/index.d.ts +17 -0 collapsed to keep the page light
A node_modules/strip-ansi-cjs/index.js +4 -0 collapsed to keep the page light
A node_modules/strip-ansi-cjs/license +9 -0 collapsed to keep the page light
A node_modules/strip-ansi-cjs/node_modules/ansi-regex/index.d.ts +37 -0 collapsed to keep the page light
A node_modules/strip-ansi-cjs/node_modules/ansi-regex/index.js +10 -0 collapsed to keep the page light
A node_modules/strip-ansi-cjs/node_modules/ansi-regex/license +9 -0 collapsed to keep the page light
A node_modules/strip-ansi-cjs/node_modules/ansi-regex/package.json +55 -0 collapsed to keep the page light
A node_modules/strip-ansi-cjs/node_modules/ansi-regex/readme.md +78 -0 collapsed to keep the page light
A node_modules/strip-ansi-cjs/package.json +54 -0 collapsed to keep the page light
A node_modules/strip-ansi-cjs/readme.md +46 -0 collapsed to keep the page light
A node_modules/strip-ansi/index.d.ts +15 -0 collapsed to keep the page light
A node_modules/strip-ansi/index.js +14 -0 collapsed to keep the page light
A node_modules/strip-ansi/license +9 -0 collapsed to keep the page light
A node_modules/strip-ansi/package.json +57 -0 collapsed to keep the page light
A node_modules/strip-ansi/readme.md +41 -0 collapsed to keep the page light
A node_modules/sucrase/LICENSE +21 -0 collapsed to keep the page light
A node_modules/sucrase/README.md +295 -0 collapsed to keep the page light
A node_modules/sucrase/bin/sucrase +3 -0 collapsed to keep the page light
A node_modules/sucrase/bin/sucrase-node +18 -0 collapsed to keep the page light
A node_modules/sucrase/package.json +88 -0 collapsed to keep the page light
A node_modules/sucrase/register/index.js +1 -0 collapsed to keep the page light
A node_modules/sucrase/register/js.js +1 -0 collapsed to keep the page light
A node_modules/sucrase/register/jsx.js +1 -0 collapsed to keep the page light
A node_modules/sucrase/register/ts-legacy-module-interop.js +1 -0 collapsed to keep the page light
A node_modules/sucrase/register/ts.js +1 -0 collapsed to keep the page light
A node_modules/sucrase/register/tsx-legacy-module-interop.js +1 -0 collapsed to keep the page light
A node_modules/sucrase/register/tsx.js +1 -0 collapsed to keep the page light
A node_modules/sucrase/ts-node-plugin/index.js +83 -0 collapsed to keep the page light
A node_modules/supports-preserve-symlinks-flag/.eslintrc +14 -0 collapsed to keep the page light
A node_modules/supports-preserve-symlinks-flag/.github/FUNDING.yml +12 -0 collapsed to keep the page light
A node_modules/supports-preserve-symlinks-flag/.nycrc +9 -0 collapsed to keep the page light
A node_modules/supports-preserve-symlinks-flag/CHANGELOG.md +22 -0 collapsed to keep the page light
A node_modules/supports-preserve-symlinks-flag/LICENSE +21 -0 collapsed to keep the page light
A node_modules/supports-preserve-symlinks-flag/README.md +42 -0 collapsed to keep the page light
A node_modules/supports-preserve-symlinks-flag/browser.js +3 -0 collapsed to keep the page light
A node_modules/supports-preserve-symlinks-flag/index.js +9 -0 collapsed to keep the page light
A node_modules/supports-preserve-symlinks-flag/package.json +70 -0 collapsed to keep the page light
A node_modules/supports-preserve-symlinks-flag/test/index.js +29 -0 collapsed to keep the page light
A node_modules/tapable/LICENSE +21 -0 collapsed to keep the page light
A node_modules/tapable/README.md +296 -0 collapsed to keep the page light
A node_modules/tapable/lib/AsyncParallelBailHook.js +85 -0 collapsed to keep the page light
A node_modules/tapable/lib/AsyncParallelHook.js +37 -0 collapsed to keep the page light
A node_modules/tapable/lib/AsyncSeriesBailHook.js +42 -0 collapsed to keep the page light
A node_modules/tapable/lib/AsyncSeriesHook.js +37 -0 collapsed to keep the page light
A node_modules/tapable/lib/AsyncSeriesLoopHook.js +37 -0 collapsed to keep the page light
A node_modules/tapable/lib/AsyncSeriesWaterfallHook.js +47 -0 collapsed to keep the page light
A node_modules/tapable/lib/Hook.js +175 -0 collapsed to keep the page light
A node_modules/tapable/lib/HookCodeFactory.js +468 -0 collapsed to keep the page light
A node_modules/tapable/lib/HookMap.js +61 -0 collapsed to keep the page light
A node_modules/tapable/lib/MultiHook.js +54 -0 collapsed to keep the page light
A node_modules/tapable/lib/SyncBailHook.js +51 -0 collapsed to keep the page light
A node_modules/tapable/lib/SyncHook.js +46 -0 collapsed to keep the page light
A node_modules/tapable/lib/SyncLoopHook.js +46 -0 collapsed to keep the page light
A node_modules/tapable/lib/SyncWaterfallHook.js +57 -0 collapsed to keep the page light
A node_modules/tapable/lib/index.js +19 -0 collapsed to keep the page light
A node_modules/tapable/lib/util-browser.js +16 -0 collapsed to keep the page light
A node_modules/tapable/package.json +44 -0 collapsed to keep the page light
A node_modules/tapable/tapable.d.ts +116 -0 collapsed to keep the page light
A node_modules/thenify-all/History.md +11 -0 collapsed to keep the page light
A node_modules/thenify-all/LICENSE +22 -0 collapsed to keep the page light
A node_modules/thenify-all/README.md +66 -0 collapsed to keep the page light
A node_modules/thenify-all/index.js +73 -0 collapsed to keep the page light
A node_modules/thenify-all/package.json +34 -0 collapsed to keep the page light
A node_modules/thenify/History.md +11 -0 collapsed to keep the page light
A node_modules/thenify/LICENSE +22 -0 collapsed to keep the page light
A node_modules/thenify/README.md +120 -0 collapsed to keep the page light
A node_modules/thenify/index.js +77 -0 collapsed to keep the page light
A node_modules/thenify/package.json +31 -0 collapsed to keep the page light
A node_modules/to-regex-range/LICENSE +21 -0 collapsed to keep the page light
A node_modules/to-regex-range/README.md +305 -0 collapsed to keep the page light
A node_modules/to-regex-range/index.js +288 -0 collapsed to keep the page light
A node_modules/to-regex-range/package.json +88 -0 collapsed to keep the page light
A node_modules/ts-interface-checker/LICENSE +201 -0 collapsed to keep the page light
A node_modules/ts-interface-checker/README.md +185 -0 collapsed to keep the page light
A node_modules/ts-interface-checker/package.json +60 -0 collapsed to keep the page light
A node_modules/util-deprecate/History.md +16 -0 collapsed to keep the page light
A node_modules/util-deprecate/LICENSE +24 -0 collapsed to keep the page light
A node_modules/util-deprecate/README.md +53 -0 collapsed to keep the page light
A node_modules/util-deprecate/browser.js +67 -0 collapsed to keep the page light
A node_modules/util-deprecate/node.js +6 -0 collapsed to keep the page light
A node_modules/util-deprecate/package.json +27 -0 collapsed to keep the page light
A node_modules/which/CHANGELOG.md +166 -0 collapsed to keep the page light
A node_modules/which/LICENSE +15 -0 collapsed to keep the page light
A node_modules/which/README.md +54 -0 collapsed to keep the page light
A node_modules/which/bin/node-which +52 -0 collapsed to keep the page light
A node_modules/which/package.json +43 -0 collapsed to keep the page light
A node_modules/which/which.js +125 -0 collapsed to keep the page light
A node_modules/wrap-ansi-cjs/index.js +216 -0 collapsed to keep the page light
A node_modules/wrap-ansi-cjs/license +9 -0 collapsed to keep the page light
A node_modules/wrap-ansi-cjs/node_modules/ansi-styles/index.d.ts +345 -0 collapsed to keep the page light
A node_modules/wrap-ansi-cjs/node_modules/ansi-styles/index.js +163 -0 collapsed to keep the page light
A node_modules/wrap-ansi-cjs/node_modules/ansi-styles/license +9 -0 collapsed to keep the page light
A node_modules/wrap-ansi-cjs/node_modules/ansi-styles/package.json +56 -0 collapsed to keep the page light
A node_modules/wrap-ansi-cjs/node_modules/ansi-styles/readme.md +152 -0 collapsed to keep the page light
A node_modules/wrap-ansi-cjs/node_modules/string-width/index.d.ts +29 -0 collapsed to keep the page light
A node_modules/wrap-ansi-cjs/node_modules/string-width/index.js +47 -0 collapsed to keep the page light
A node_modules/wrap-ansi-cjs/node_modules/string-width/license +9 -0 collapsed to keep the page light
A node_modules/wrap-ansi-cjs/node_modules/string-width/node_modules/emoji-regex/README.md +73 -0 collapsed to keep the page light
A node_modules/wrap-ansi-cjs/node_modules/string-width/node_modules/emoji-regex/es2015/index.js +6 -0 collapsed to keep the page light
A node_modules/wrap-ansi-cjs/node_modules/string-width/node_modules/emoji-regex/es2015/text.js +6 -0 collapsed to keep the page light
A node_modules/wrap-ansi-cjs/node_modules/string-width/node_modules/emoji-regex/index.d.ts +23 -0 collapsed to keep the page light
A node_modules/wrap-ansi-cjs/node_modules/string-width/node_modules/emoji-regex/index.js +6 -0 collapsed to keep the page light
A node_modules/wrap-ansi-cjs/node_modules/string-width/node_modules/emoji-regex/package.json +50 -0 collapsed to keep the page light
A node_modules/wrap-ansi-cjs/node_modules/string-width/node_modules/emoji-regex/text.js +6 -0 collapsed to keep the page light
A node_modules/wrap-ansi-cjs/node_modules/string-width/package.json +56 -0 collapsed to keep the page light
A node_modules/wrap-ansi-cjs/node_modules/string-width/readme.md +50 -0 collapsed to keep the page light
A node_modules/wrap-ansi-cjs/node_modules/strip-ansi/index.d.ts +17 -0 collapsed to keep the page light
A node_modules/wrap-ansi-cjs/node_modules/strip-ansi/index.js +4 -0 collapsed to keep the page light
A node_modules/wrap-ansi-cjs/node_modules/strip-ansi/license +9 -0 collapsed to keep the page light
A node_modules/wrap-ansi-cjs/node_modules/strip-ansi/node_modules/ansi-regex/index.d.ts +37 -0 collapsed to keep the page light
A node_modules/wrap-ansi-cjs/node_modules/strip-ansi/node_modules/ansi-regex/index.js +10 -0 collapsed to keep the page light
A node_modules/wrap-ansi-cjs/node_modules/strip-ansi/node_modules/ansi-regex/license +9 -0 collapsed to keep the page light
A node_modules/wrap-ansi-cjs/node_modules/strip-ansi/node_modules/ansi-regex/package.json +55 -0 collapsed to keep the page light
A node_modules/wrap-ansi-cjs/node_modules/strip-ansi/node_modules/ansi-regex/readme.md +78 -0 collapsed to keep the page light
A node_modules/wrap-ansi-cjs/node_modules/strip-ansi/package.json +54 -0 collapsed to keep the page light
A node_modules/wrap-ansi-cjs/node_modules/strip-ansi/readme.md +46 -0 collapsed to keep the page light
A node_modules/wrap-ansi-cjs/package.json +62 -0 collapsed to keep the page light
A node_modules/wrap-ansi-cjs/readme.md +91 -0 collapsed to keep the page light
A node_modules/wrap-ansi/index.d.ts +41 -0 collapsed to keep the page light
A node_modules/wrap-ansi/index.js +214 -0 collapsed to keep the page light
A node_modules/wrap-ansi/license +9 -0 collapsed to keep the page light
A node_modules/wrap-ansi/package.json +69 -0 collapsed to keep the page light
A node_modules/wrap-ansi/readme.md +91 -0 collapsed to keep the page light
A node_modules/yaml/LICENSE +13 -0 collapsed to keep the page light
A node_modules/yaml/README.md +169 -0 collapsed to keep the page light
A node_modules/yaml/bin.mjs +11 -0 collapsed to keep the page light
A node_modules/yaml/browser/index.js +5 -0 collapsed to keep the page light
A node_modules/yaml/browser/package.json +3 -0 collapsed to keep the page light
A node_modules/yaml/package.json +96 -0 collapsed to keep the page light
A node_modules/yaml/util.js +2 -0 collapsed to keep the page light
D package.json +0 -17 collapsed to keep the page light
M tailwind.config.js +9 -56 collapsed to keep the page light

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 7

Tags 106

↑↓ moveenter openesc close