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 collapsed to keep the page light
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
@@ -0,0 +1,1265 @@
1+# Glob
2+
3+Match files using the patterns the shell uses.
4+
5+The most correct and second fastest glob implementation in
6+JavaScript. (See **Comparison to Other JavaScript Glob
7+Implementations** at the bottom of this readme.)
8+
9+![a fun cartoon logo made of glob characters](https://github.com/isaacs/node-glob/raw/main/logo/glob.png)
10+
11+## Usage
12+
13+Install with npm
14+
15+```
16+npm i glob
17+```
18+
19+**Note** the npm package name is _not_ `node-glob` that's a
20+different thing that was abandoned years ago. Just `glob`.
21+
22+```js
23+// load using import
24+import { glob, globSync, globStream, globStreamSync, Glob } from 'glob'
25+// or using commonjs, that's fine, too
26+const {
27+ glob,
28+ globSync,
29+ globStream,
30+ globStreamSync,
31+ Glob,
32+} = require('glob')
33+
34+// the main glob() and globSync() resolve/return array of filenames
35+
36+// all js files, but don't look in node_modules
37+const jsfiles = await glob('**/*.js', { ignore: 'node_modules/**' })
38+
39+// pass in a signal to cancel the glob walk
40+const stopAfter100ms = await glob('**/*.css', {
41+ signal: AbortSignal.timeout(100),
42+})
43+
44+// multiple patterns supported as well
45+const images = await glob(['css/*.{png,jpeg}', 'public/*.{png,jpeg}'])
46+
47+// but of course you can do that with the glob pattern also
48+// the sync function is the same, just returns a string[] instead
49+// of Promise<string[]>
50+const imagesAlt = globSync('{css,public}/*.{png,jpeg}')
51+
52+// you can also stream them, this is a Minipass stream
53+const filesStream = globStream(['**/*.dat', 'logs/**/*.log'])
54+
55+// construct a Glob object if you wanna do it that way, which
56+// allows for much faster walks if you have to look in the same
57+// folder multiple times.
58+const g = new Glob('**/foo', {})
59+// glob objects are async iterators, can also do globIterate() or
60+// g.iterate(), same deal
61+for await (const file of g) {
62+ console.log('found a foo file:', file)
63+}
64+// pass a glob as the glob options to reuse its settings and caches
65+const g2 = new Glob('**/bar', g)
66+// sync iteration works as well
67+for (const file of g2) {
68+ console.log('found a bar file:', file)
69+}
70+
71+// you can also pass withFileTypes: true to get Path objects
72+// these are like a Dirent, but with some more added powers
73+// check out http://npm.im/path-scurry for more info on their API
74+const g3 = new Glob('**/baz/**', { withFileTypes: true })
75+g3.stream().on('data', path => {
76+ console.log(
77+ 'got a path object',
78+ path.fullpath(),
79+ path.isDirectory(),
80+ path.readdirSync().map(e => e.name),
81+ )
82+})
83+
84+// if you use stat:true and withFileTypes, you can sort results
85+// by things like modified time, filter by permission mode, etc.
86+// All Stats fields will be available in that case. Slightly
87+// slower, though.
88+// For example:
89+const results = await glob('**', { stat: true, withFileTypes: true })
90+
91+const timeSortedFiles = results
92+ .sort((a, b) => a.mtimeMs - b.mtimeMs)
93+ .map(path => path.fullpath())
94+
95+const groupReadableFiles = results
96+ .filter(path => path.mode & 0o040)
97+ .map(path => path.fullpath())
98+
99+// custom ignores can be done like this, for example by saying
100+// you'll ignore all markdown files, and all folders named 'docs'
101+const customIgnoreResults = await glob('**', {
102+ ignore: {
103+ ignored: p => /\.md$/.test(p.name),
104+ childrenIgnored: p => p.isNamed('docs'),
105+ },
106+})
107+
108+// another fun use case, only return files with the same name as
109+// their parent folder, plus either `.ts` or `.js`
110+const folderNamedModules = await glob('**/*.{ts,js}', {
111+ ignore: {
112+ ignored: p => {
113+ const pp = p.parent
114+ return !(p.isNamed(pp.name + '.ts') || p.isNamed(pp.name + '.js'))
115+ },
116+ },
117+})
118+
119+// find all files edited in the last hour, to do this, we ignore
120+// all of them that are more than an hour old
121+const newFiles = await glob('**', {
122+ // need stat so we have mtime
123+ stat: true,
124+ // only want the files, not the dirs
125+ nodir: true,
126+ ignore: {
127+ ignored: p => {
128+ return new Date() - p.mtime > 60 * 60 * 1000
129+ },
130+ // could add similar childrenIgnored here as well, but
131+ // directory mtime is inconsistent across platforms, so
132+ // probably better not to, unless you know the system
133+ // tracks this reliably.
134+ },
135+})
136+```
137+
138+**Note** Glob patterns should always use `/` as a path separator,
139+even on Windows systems, as `\` is used to escape glob
140+characters. If you wish to use `\` as a path separator _instead
141+of_ using it as an escape character on Windows platforms, you may
142+set `windowsPathsNoEscape:true` in the options. In this mode,
143+special glob characters cannot be escaped, making it impossible
144+to match a literal `*` `?` and so on in filenames.
145+
146+## Command Line Interface
147+
148+```
149+$ glob -h
150+
151+Usage:
152+ glob [options] [<pattern> [<pattern> ...]]
153+
154+Expand the positional glob expression arguments into any matching file system
155+paths found.
156+
157+ -c<command> --cmd=<command>
158+ Run the command provided, passing the glob expression
159+ matches as arguments.
160+
161+ -A --all By default, the glob cli command will not expand any
162+ arguments that are an exact match to a file on disk.
163+
164+ This prevents double-expanding, in case the shell
165+ expands an argument whose filename is a glob
166+ expression.
167+
168+ For example, if 'app/*.ts' would match 'app/[id].ts',
169+ then on Windows powershell or cmd.exe, 'glob app/*.ts'
170+ will expand to 'app/[id].ts', as expected. However, in
171+ posix shells such as bash or zsh, the shell will first
172+ expand 'app/*.ts' to a list of filenames. Then glob
173+ will look for a file matching 'app/[id].ts' (ie,
174+ 'app/i.ts' or 'app/d.ts'), which is unexpected.
175+
176+ Setting '--all' prevents this behavior, causing glob to
177+ treat ALL patterns as glob expressions to be expanded,
178+ even if they are an exact match to a file on disk.
179+
180+ When setting this option, be sure to enquote arguments
181+ so that the shell will not expand them prior to passing
182+ them to the glob command process.
183+
184+ -a --absolute Expand to absolute paths
185+ -d --dot-relative Prepend './' on relative matches
186+ -m --mark Append a / on any directories matched
187+ -x --posix Always resolve to posix style paths, using '/' as the
188+ directory separator, even on Windows. Drive letter
189+ absolute matches on Windows will be expanded to their
190+ full resolved UNC maths, eg instead of 'C:\foo\bar', it
191+ will expand to '//?/C:/foo/bar'.
192+
193+ -f --follow Follow symlinked directories when expanding '**'
194+ -R --realpath Call 'fs.realpath' on all of the results. In the case
195+ of an entry that cannot be resolved, the entry is
196+ omitted. This incurs a slight performance penalty, of
197+ course, because of the added system calls.
198+
199+ -s --stat Call 'fs.lstat' on all entries, whether required or not
200+ to determine if it's a valid match.
201+
202+ -b --match-base Perform a basename-only match if the pattern does not
203+ contain any slash characters. That is, '*.js' would be
204+ treated as equivalent to '**/*.js', matching js files
205+ in all directories.
206+
207+ --dot Allow patterns to match files/directories that start
208+ with '.', even if the pattern does not start with '.'
209+
210+ --nobrace Do not expand {...} patterns
211+ --nocase Perform a case-insensitive match. This defaults to
212+ 'true' on macOS and Windows platforms, and false on all
213+ others.
214+
215+ Note: 'nocase' should only be explicitly set when it is
216+ known that the filesystem's case sensitivity differs
217+ from the platform default. If set 'true' on
218+ case-insensitive file systems, then the walk may return
219+ more or less results than expected.
220+
221+ --nodir Do not match directories, only files.
222+
223+ Note: to *only* match directories, append a '/' at the
224+ end of the pattern.
225+
226+ --noext Do not expand extglob patterns, such as '+(a|b)'
227+ --noglobstar Do not expand '**' against multiple path portions. Ie,
228+ treat it as a normal '*' instead.
229+
230+ --windows-path-no-escape
231+ Use '\' as a path separator *only*, and *never* as an
232+ escape character. If set, all '\' characters are
233+ replaced with '/' in the pattern.
234+
235+ -D<n> --max-depth=<n> Maximum depth to traverse from the current working
236+ directory
237+
238+ -C<cwd> --cwd=<cwd> Current working directory to execute/match in
239+ -r<root> --root=<root> A string path resolved against the 'cwd', which is used
240+ as the starting point for absolute patterns that start
241+ with '/' (but not drive letters or UNC paths on
242+ Windows).
243+
244+ Note that this *doesn't* necessarily limit the walk to
245+ the 'root' directory, and doesn't affect the cwd
246+ starting point for non-absolute patterns. A pattern
247+ containing '..' will still be able to traverse out of
248+ the root directory, if it is not an actual root
249+ directory on the filesystem, and any non-absolute
250+ patterns will still be matched in the 'cwd'.
251+
252+ To start absolute and non-absolute patterns in the same
253+ path, you can use '--root=' to set it to the empty
254+ string. However, be aware that on Windows systems, a
255+ pattern like 'x:/*' or '//host/share/*' will *always*
256+ start in the 'x:/' or '//host/share/' directory,
257+ regardless of the --root setting.
258+
259+ --platform=<platform> Defaults to the value of 'process.platform' if
260+ available, or 'linux' if not. Setting --platform=win32
261+ on non-Windows systems may cause strange behavior!
262+
263+ -i<ignore> --ignore=<ignore>
264+ Glob patterns to ignore Can be set multiple times
265+ -v --debug Output a huge amount of noisy debug information about
266+ patterns as they are parsed and used to match files.
267+
268+ -h --help Show this usage information
269+```
270+
271+## `glob(pattern: string | string[], options?: GlobOptions) => Promise<string[] | Path[]>`
272+
273+Perform an asynchronous glob search for the pattern(s) specified.
274+Returns
275+[Path](https://isaacs.github.io/path-scurry/classes/PathBase)
276+objects if the `withFileTypes` option is set to `true`. See below
277+for full options field desciptions.
278+
279+## `globSync(pattern: string | string[], options?: GlobOptions) => string[] | Path[]`
280+
281+Synchronous form of `glob()`.
282+
283+Alias: `glob.sync()`
284+
285+## `globIterate(pattern: string | string[], options?: GlobOptions) => AsyncGenerator<string>`
286+
287+Return an async iterator for walking glob pattern matches.
288+
289+Alias: `glob.iterate()`
290+
291+## `globIterateSync(pattern: string | string[], options?: GlobOptions) => Generator<string>`
292+
293+Return a sync iterator for walking glob pattern matches.
294+
295+Alias: `glob.iterate.sync()`, `glob.sync.iterate()`
296+
297+## `globStream(pattern: string | string[], options?: GlobOptions) => Minipass<string | Path>`
298+
299+Return a stream that emits all the strings or `Path` objects and
300+then emits `end` when completed.
301+
302+Alias: `glob.stream()`
303+
304+## `globStreamSync(pattern: string | string[], options?: GlobOptions) => Minipass<string | Path>`
305+
306+Syncronous form of `globStream()`. Will read all the matches as
307+fast as you consume them, even all in a single tick if you
308+consume them immediately, but will still respond to backpressure
309+if they're not consumed immediately.
310+
311+Alias: `glob.stream.sync()`, `glob.sync.stream()`
312+
313+## `hasMagic(pattern: string | string[], options?: GlobOptions) => boolean`
314+
315+Returns `true` if the provided pattern contains any "magic" glob
316+characters, given the options provided.
317+
318+Brace expansion is not considered "magic" unless the
319+`magicalBraces` option is set, as brace expansion just turns one
320+string into an array of strings. So a pattern like `'x{a,b}y'`
321+would return `false`, because `'xay'` and `'xby'` both do not
322+contain any magic glob characters, and it's treated the same as
323+if you had called it on `['xay', 'xby']`. When
324+`magicalBraces:true` is in the options, brace expansion _is_
325+treated as a pattern having magic.
326+
327+## `escape(pattern: string, options?: GlobOptions) => string`
328+
329+Escape all magic characters in a glob pattern, so that it will
330+only ever match literal strings
331+
332+If the `windowsPathsNoEscape` option is used, then characters are
333+escaped by wrapping in `[]`, because a magic character wrapped in
334+a character class can only be satisfied by that exact character.
335+
336+Slashes (and backslashes in `windowsPathsNoEscape` mode) cannot
337+be escaped or unescaped.
338+
339+## `unescape(pattern: string, options?: GlobOptions) => string`
340+
341+Un-escape a glob string that may contain some escaped characters.
342+
343+If the `windowsPathsNoEscape` option is used, then square-brace
344+escapes are removed, but not backslash escapes. For example, it
345+will turn the string `'[*]'` into `*`, but it will not turn
346+`'\\*'` into `'*'`, because `\` is a path separator in
347+`windowsPathsNoEscape` mode.
348+
349+When `windowsPathsNoEscape` is not set, then both brace escapes
350+and backslash escapes are removed.
351+
352+Slashes (and backslashes in `windowsPathsNoEscape` mode) cannot
353+be escaped or unescaped.
354+
355+## Class `Glob`
356+
357+An object that can perform glob pattern traversals.
358+
359+### `const g = new Glob(pattern: string | string[], options: GlobOptions)`
360+
361+Options object is required.
362+
363+See full options descriptions below.
364+
365+Note that a previous `Glob` object can be passed as the
366+`GlobOptions` to another `Glob` instantiation to re-use settings
367+and caches with a new pattern.
368+
369+Traversal functions can be called multiple times to run the walk
370+again.
371+
372+### `g.stream()`
373+
374+Stream results asynchronously,
375+
376+### `g.streamSync()`
377+
378+Stream results synchronously.
379+
380+### `g.iterate()`
381+
382+Default async iteration function. Returns an AsyncGenerator that
383+iterates over the results.
384+
385+### `g.iterateSync()`
386+
387+Default sync iteration function. Returns a Generator that
388+iterates over the results.
389+
390+### `g.walk()`
391+
392+Returns a Promise that resolves to the results array.
393+
394+### `g.walkSync()`
395+
396+Returns a results array.
397+
398+### Properties
399+
400+All options are stored as properties on the `Glob` object.
401+
402+- `opts` The options provided to the constructor.
403+- `patterns` An array of parsed immutable `Pattern` objects.
404+
405+## Options
406+
407+Exported as `GlobOptions` TypeScript interface. A `GlobOptions`
408+object may be provided to any of the exported methods, and must
409+be provided to the `Glob` constructor.
410+
411+All options are optional, boolean, and false by default, unless
412+otherwise noted.
413+
414+All resolved options are added to the Glob object as properties.
415+
416+If you are running many `glob` operations, you can pass a Glob
417+object as the `options` argument to a subsequent operation to
418+share the previously loaded cache.
419+
420+- `cwd` String path or `file://` string or URL object. The
421+ current working directory in which to search. Defaults to
422+ `process.cwd()`. See also: "Windows, CWDs, Drive Letters, and
423+ UNC Paths", below.
424+
425+ This option may be either a string path or a `file://` URL
426+ object or string.
427+
428+- `root` A string path resolved against the `cwd` option, which
429+ is used as the starting point for absolute patterns that start
430+ with `/`, (but not drive letters or UNC paths on Windows).
431+
432+ Note that this _doesn't_ necessarily limit the walk to the
433+ `root` directory, and doesn't affect the cwd starting point for
434+ non-absolute patterns. A pattern containing `..` will still be
435+ able to traverse out of the root directory, if it is not an
436+ actual root directory on the filesystem, and any non-absolute
437+ patterns will be matched in the `cwd`. For example, the
438+ pattern `/../*` with `{root:'/some/path'}` will return all
439+ files in `/some`, not all files in `/some/path`. The pattern
440+ `*` with `{root:'/some/path'}` will return all the entries in
441+ the cwd, not the entries in `/some/path`.
442+
443+ To start absolute and non-absolute patterns in the same
444+ path, you can use `{root:''}`. However, be aware that on
445+ Windows systems, a pattern like `x:/*` or `//host/share/*` will
446+ _always_ start in the `x:/` or `//host/share` directory,
447+ regardless of the `root` setting.
448+
449+- `windowsPathsNoEscape` Use `\\` as a path separator _only_, and
450+ _never_ as an escape character. If set, all `\\` characters are
451+ replaced with `/` in the pattern.
452+
453+ Note that this makes it **impossible** to match against paths
454+ containing literal glob pattern characters, but allows matching
455+ with patterns constructed using `path.join()` and
456+ `path.resolve()` on Windows platforms, mimicking the (buggy!)
457+ behavior of Glob v7 and before on Windows. Please use with
458+ caution, and be mindful of [the caveat below about Windows
459+ paths](#windows). (For legacy reasons, this is also set if
460+ `allowWindowsEscape` is set to the exact value `false`.)
461+
462+- `dot` Include `.dot` files in normal matches and `globstar`
463+ matches. Note that an explicit dot in a portion of the pattern
464+ will always match dot files.
465+
466+- `magicalBraces` Treat brace expansion like `{a,b}` as a "magic"
467+ pattern. Has no effect if {@link nobrace} is set.
468+
469+ Only has effect on the {@link hasMagic} function, no effect on
470+ glob pattern matching itself.
471+
472+- `dotRelative` Prepend all relative path strings with `./` (or
473+ `.\` on Windows).
474+
475+ Without this option, returned relative paths are "bare", so
476+ instead of returning `'./foo/bar'`, they are returned as
477+ `'foo/bar'`.
478+
479+ Relative patterns starting with `'../'` are not prepended with
480+ `./`, even if this option is set.
481+
482+- `mark` Add a `/` character to directory matches. Note that this
483+ requires additional stat calls.
484+
485+- `nobrace` Do not expand `{a,b}` and `{1..3}` brace sets.
486+
487+- `noglobstar` Do not match `**` against multiple filenames. (Ie,
488+ treat it as a normal `*` instead.)
489+
490+- `noext` Do not match "extglob" patterns such as `+(a|b)`.
491+
492+- `nocase` Perform a case-insensitive match. This defaults to
493+ `true` on macOS and Windows systems, and `false` on all others.
494+
495+ **Note** `nocase` should only be explicitly set when it is
496+ known that the filesystem's case sensitivity differs from the
497+ platform default. If set `true` on case-sensitive file
498+ systems, or `false` on case-insensitive file systems, then the
499+ walk may return more or less results than expected.
500+
501+- `maxDepth` Specify a number to limit the depth of the directory
502+ traversal to this many levels below the `cwd`.
503+
504+- `matchBase` Perform a basename-only match if the pattern does
505+ not contain any slash characters. That is, `*.js` would be
506+ treated as equivalent to `**/*.js`, matching all js files in
507+ all directories.
508+
509+- `nodir` Do not match directories, only files. (Note: to match
510+ _only_ directories, put a `/` at the end of the pattern.)
511+
512+ Note: when `follow` and `nodir` are both set, then symbolic
513+ links to directories are also omitted.
514+
515+- `stat` Call `lstat()` on all entries, whether required or not
516+ to determine whether it's a valid match. When used with
517+ `withFileTypes`, this means that matches will include data such
518+ as modified time, permissions, and so on. Note that this will
519+ incur a performance cost due to the added system calls.
520+
521+- `ignore` string or string[], or an object with `ignore` and
522+ `ignoreChildren` methods.
523+
524+ If a string or string[] is provided, then this is treated as a
525+ glob pattern or array of glob patterns to exclude from matches.
526+ To ignore all children within a directory, as well as the entry
527+ itself, append `'/**'` to the ignore pattern.
528+
529+ **Note** `ignore` patterns are _always_ in `dot:true` mode,
530+ regardless of any other settings.
531+
532+ If an object is provided that has `ignored(path)` and/or
533+ `childrenIgnored(path)` methods, then these methods will be
534+ called to determine whether any Path is a match or if its
535+ children should be traversed, respectively.
536+
537+- `follow` Follow symlinked directories when expanding `**`
538+ patterns. This can result in a lot of duplicate references in
539+ the presence of cyclic links, and make performance quite bad.
540+
541+ By default, a `**` in a pattern will follow 1 symbolic link if
542+ it is not the first item in the pattern, or none if it is the
543+ first item in the pattern, following the same behavior as Bash.
544+
545+ Note: when `follow` and `nodir` are both set, then symbolic
546+ links to directories are also omitted.
547+
548+- `realpath` Set to true to call `fs.realpath` on all of the
549+ results. In the case of an entry that cannot be resolved, the
550+ entry is omitted. This incurs a slight performance penalty, of
551+ course, because of the added system calls.
552+
553+- `absolute` Set to true to always receive absolute paths for
554+ matched files. Set to `false` to always receive relative paths
555+ for matched files.
556+
557+ By default, when this option is not set, absolute paths are
558+ returned for patterns that are absolute, and otherwise paths
559+ are returned that are relative to the `cwd` setting.
560+
561+ This does _not_ make an extra system call to get the realpath,
562+ it only does string path resolution.
563+
564+ `absolute` may not be used along with `withFileTypes`.
565+
566+- `posix` Set to true to use `/` as the path separator in
567+ returned results. On posix systems, this has no effect. On
568+ Windows systems, this will return `/` delimited path results,
569+ and absolute paths will be returned in their full resolved UNC
570+ path form, eg insted of `'C:\\foo\\bar'`, it will return
571+ `//?/C:/foo/bar`.
572+
573+- `platform` Defaults to value of `process.platform` if
574+ available, or `'linux'` if not. Setting `platform:'win32'` on
575+ non-Windows systems may cause strange behavior.
576+
577+- `withFileTypes` Return [PathScurry](http://npm.im/path-scurry)
578+ `Path` objects instead of strings. These are similar to a
579+ NodeJS `Dirent` object, but with additional methods and
580+ properties.
581+
582+ `withFileTypes` may not be used along with `absolute`.
583+
584+- `signal` An AbortSignal which will cancel the Glob walk when
585+ triggered.
586+
587+- `fs` An override object to pass in custom filesystem methods.
588+ See [PathScurry docs](http://npm.im/path-scurry) for what can
589+ be overridden.
590+
591+- `scurry` A [PathScurry](http://npm.im/path-scurry) object used
592+ to traverse the file system. If the `nocase` option is set
593+ explicitly, then any provided `scurry` object must match this
594+ setting.
595+
596+- `includeChildMatches` boolean, default `true`. Do not match any
597+ children of any matches. For example, the pattern `**\/foo`
598+ would match `a/foo`, but not `a/foo/b/foo` in this mode.
599+
600+ This is especially useful for cases like "find all
601+ `node_modules` folders, but not the ones in `node_modules`".
602+
603+ In order to support this, the `Ignore` implementation must
604+ support an `add(pattern: string)` method. If using the default
605+ `Ignore` class, then this is fine, but if this is set to
606+ `false`, and a custom `Ignore` is provided that does not have
607+ an `add()` method, then it will throw an error.
608+
609+ **Caveat** It _only_ ignores matches that would be a descendant
610+ of a previous match, and only if that descendant is matched
611+ _after_ the ancestor is encountered. Since the file system walk
612+ happens in indeterminate order, it's possible that a match will
613+ already be added before its ancestor, if multiple or braced
614+ patterns are used.
615+
616+ For example:
617+
618+ ```js
619+ const results = await glob(
620+ [
621+ // likely to match first, since it's just a stat
622+ 'a/b/c/d/e/f',
623+
624+ // this pattern is more complicated! It must to various readdir()
625+ // calls and test the results against a regular expression, and that
626+ // is certainly going to take a little bit longer.
627+ //
628+ // So, later on, it encounters a match at 'a/b/c/d/e', but it's too
629+ // late to ignore a/b/c/d/e/f, because it's already been emitted.
630+ 'a/[bdf]/?/[a-z]/*',
631+ ],
632+ { includeChildMatches: false },
633+ )
634+ ```
635+
636+ It's best to only set this to `false` if you can be reasonably
637+ sure that no components of the pattern will potentially match
638+ one another's file system descendants, or if the occasional
639+ included child entry will not cause problems.
640+
641+## Glob Primer
642+
643+Much more information about glob pattern expansion can be found
644+by running `man bash` and searching for `Pattern Matching`.
645+
646+"Globs" are the patterns you type when you do stuff like `ls
647+*.js` on the command line, or put `build/*` in a `.gitignore`
648+file.
649+
650+Before parsing the path part patterns, braced sections are
651+expanded into a set. Braced sections start with `{` and end with
652+`}`, with 2 or more comma-delimited sections within. Braced
653+sections may contain slash characters, so `a{/b/c,bcd}` would
654+expand into `a/b/c` and `abcd`.
655+
656+The following characters have special magic meaning when used in
657+a path portion. With the exception of `**`, none of these match
658+path separators (ie, `/` on all platforms, and `\` on Windows).
659+
660+- `*` Matches 0 or more characters in a single path portion.
661+ When alone in a path portion, it must match at least 1
662+ character. If `dot:true` is not specified, then `*` will not
663+ match against a `.` character at the start of a path portion.
664+- `?` Matches 1 character. If `dot:true` is not specified, then
665+ `?` will not match against a `.` character at the start of a
666+ path portion.
667+- `[...]` Matches a range of characters, similar to a RegExp
668+ range. If the first character of the range is `!` or `^` then
669+ it matches any character not in the range. If the first
670+ character is `]`, then it will be considered the same as `\]`,
671+ rather than the end of the character class.
672+- `!(pattern|pattern|pattern)` Matches anything that does not
673+ match any of the patterns provided. May _not_ contain `/`
674+ characters. Similar to `*`, if alone in a path portion, then
675+ the path portion must have at least one character.
676+- `?(pattern|pattern|pattern)` Matches zero or one occurrence of
677+ the patterns provided. May _not_ contain `/` characters.
678+- `+(pattern|pattern|pattern)` Matches one or more occurrences of
679+ the patterns provided. May _not_ contain `/` characters.
680+- `*(a|b|c)` Matches zero or more occurrences of the patterns
681+ provided. May _not_ contain `/` characters.
682+- `@(pattern|pat*|pat?erN)` Matches exactly one of the patterns
683+ provided. May _not_ contain `/` characters.
684+- `**` If a "globstar" is alone in a path portion, then it
685+ matches zero or more directories and subdirectories searching
686+ for matches. It does not crawl symlinked directories, unless
687+ `{follow:true}` is passed in the options object. A pattern
688+ like `a/b/**` will only match `a/b` if it is a directory.
689+ Follows 1 symbolic link if not the first item in the pattern,
690+ or 0 if it is the first item, unless `follow:true` is set, in
691+ which case it follows all symbolic links.
692+
693+`[:class:]` patterns are supported by this implementation, but
694+`[=c=]` and `[.symbol.]` style class patterns are not.
695+
696+### Dots
697+
698+If a file or directory path portion has a `.` as the first
699+character, then it will not match any glob pattern unless that
700+pattern's corresponding path part also has a `.` as its first
701+character.
702+
703+For example, the pattern `a/.*/c` would match the file at
704+`a/.b/c`. However the pattern `a/*/c` would not, because `*` does
705+not start with a dot character.
706+
707+You can make glob treat dots as normal characters by setting
708+`dot:true` in the options.
709+
710+### Basename Matching
711+
712+If you set `matchBase:true` in the options, and the pattern has
713+no slashes in it, then it will seek for any file anywhere in the
714+tree with a matching basename. For example, `*.js` would match
715+`test/simple/basic.js`.
716+
717+### Empty Sets
718+
719+If no matching files are found, then an empty array is returned.
720+This differs from the shell, where the pattern itself is
721+returned. For example:
722+
723+```sh
724+$ echo a*s*d*f
725+a*s*d*f
726+```
727+
728+## Comparisons to other fnmatch/glob implementations
729+
730+While strict compliance with the existing standards is a
731+worthwhile goal, some discrepancies exist between node-glob and
732+other implementations, and are intentional.
733+
734+The double-star character `**` is supported by default, unless
735+the `noglobstar` flag is set. This is supported in the manner of
736+bsdglob and bash 5, where `**` only has special significance if
737+it is the only thing in a path part. That is, `a/**/b` will match
738+`a/x/y/b`, but `a/**b` will not.
739+
740+Note that symlinked directories are not traversed as part of a
741+`**`, though their contents may match against subsequent portions
742+of the pattern. This prevents infinite loops and duplicates and
743+the like. You can force glob to traverse symlinks with `**` by
744+setting `{follow:true}` in the options.
745+
746+There is no equivalent of the `nonull` option. A pattern that
747+does not find any matches simply resolves to nothing. (An empty
748+array, immediately ended stream, etc.)
749+
750+If brace expansion is not disabled, then it is performed before
751+any other interpretation of the glob pattern. Thus, a pattern
752+like `+(a|{b),c)}`, which would not be valid in bash or zsh, is
753+expanded **first** into the set of `+(a|b)` and `+(a|c)`, and
754+those patterns are checked for validity. Since those two are
755+valid, matching proceeds.
756+
757+The character class patterns `[:class:]` (posix standard named
758+classes) style class patterns are supported and unicode-aware,
759+but `[=c=]` (locale-specific character collation weight), and
760+`[.symbol.]` (collating symbol), are not.
761+
762+### Repeated Slashes
763+
764+Unlike Bash and zsh, repeated `/` are always coalesced into a
765+single path separator.
766+
767+### Comments and Negation
768+
769+Previously, this module let you mark a pattern as a "comment" if
770+it started with a `#` character, or a "negated" pattern if it
771+started with a `!` character.
772+
773+These options were deprecated in version 5, and removed in
774+version 6.
775+
776+To specify things that should not match, use the `ignore` option.
777+
778+## Windows
779+
780+**Please only use forward-slashes in glob expressions.**
781+
782+Though windows uses either `/` or `\` as its path separator, only
783+`/` characters are used by this glob implementation. You must use
784+forward-slashes **only** in glob expressions. Back-slashes will
785+always be interpreted as escape characters, not path separators.
786+
787+Results from absolute patterns such as `/foo/*` are mounted onto
788+the root setting using `path.join`. On windows, this will by
789+default result in `/foo/*` matching `C:\foo\bar.txt`.
790+
791+To automatically coerce all `\` characters to `/` in pattern
792+strings, **thus making it impossible to escape literal glob
793+characters**, you may set the `windowsPathsNoEscape` option to
794+`true`.
795+
796+### Windows, CWDs, Drive Letters, and UNC Paths
797+
798+On posix systems, when a pattern starts with `/`, any `cwd`
799+option is ignored, and the traversal starts at `/`, plus any
800+non-magic path portions specified in the pattern.
801+
802+On Windows systems, the behavior is similar, but the concept of
803+an "absolute path" is somewhat more involved.
804+
805+#### UNC Paths
806+
807+A UNC path may be used as the start of a pattern on Windows
808+platforms. For example, a pattern like: `//?/x:/*` will return
809+all file entries in the root of the `x:` drive. A pattern like
810+`//ComputerName/Share/*` will return all files in the associated
811+share.
812+
813+UNC path roots are always compared case insensitively.
814+
815+#### Drive Letters
816+
817+A pattern starting with a drive letter, like `c:/*`, will search
818+in that drive, regardless of any `cwd` option provided.
819+
820+If the pattern starts with `/`, and is not a UNC path, and there
821+is an explicit `cwd` option set with a drive letter, then the
822+drive letter in the `cwd` is used as the root of the directory
823+traversal.
824+
825+For example, `glob('/tmp', { cwd: 'c:/any/thing' })` will return
826+`['c:/tmp']` as the result.
827+
828+If an explicit `cwd` option is not provided, and the pattern
829+starts with `/`, then the traversal will run on the root of the
830+drive provided as the `cwd` option. (That is, it is the result of
831+`path.resolve('/')`.)
832+
833+## Race Conditions
834+
835+Glob searching, by its very nature, is susceptible to race
836+conditions, since it relies on directory walking.
837+
838+As a result, it is possible that a file that exists when glob
839+looks for it may have been deleted or modified by the time it
840+returns the result.
841+
842+By design, this implementation caches all readdir calls that it
843+makes, in order to cut down on system overhead. However, this
844+also makes it even more susceptible to races, especially if the
845+cache object is reused between glob calls.
846+
847+Users are thus advised not to use a glob result as a guarantee of
848+filesystem state in the face of rapid changes. For the vast
849+majority of operations, this is never a problem.
850+
851+### See Also:
852+
853+- `man sh`
854+- `man bash` [Pattern
855+ Matching](https://www.gnu.org/software/bash/manual/html_node/Pattern-Matching.html)
856+- `man 3 fnmatch`
857+- `man 5 gitignore`
858+- [minimatch documentation](https://github.com/isaacs/minimatch)
859+
860+## Glob Logo
861+
862+Glob's logo was created by [Tanya
863+Brassie](http://tanyabrassie.com/). Logo files can be found
864+[here](https://github.com/isaacs/node-glob/tree/master/logo).
865+
866+The logo is licensed under a [Creative Commons
867+Attribution-ShareAlike 4.0 International
868+License](https://creativecommons.org/licenses/by-sa/4.0/).
869+
870+## Contributing
871+
872+Any change to behavior (including bugfixes) must come with a
873+test.
874+
875+Patches that fail tests or reduce performance will be rejected.
876+
877+```sh
878+# to run tests
879+npm test
880+
881+# to re-generate test fixtures
882+npm run test-regen
883+
884+# run the benchmarks
885+npm run bench
886+
887+# to profile javascript
888+npm run prof
889+```
890+
891+## Comparison to Other JavaScript Glob Implementations
892+
893+**tl;dr**
894+
895+- If you want glob matching that is as faithful as possible to
896+ Bash pattern expansion semantics, and as fast as possible
897+ within that constraint, _use this module_.
898+- If you are reasonably sure that the patterns you will encounter
899+ are relatively simple, and want the absolutely fastest glob
900+ matcher out there, _use [fast-glob](http://npm.im/fast-glob)_.
901+- If you are reasonably sure that the patterns you will encounter
902+ are relatively simple, and want the convenience of
903+ automatically respecting `.gitignore` files, _use
904+ [globby](http://npm.im/globby)_.
905+
906+There are some other glob matcher libraries on npm, but these
907+three are (in my opinion, as of 2023) the best.
908+
909+---
910+
911+**full explanation**
912+
913+Every library reflects a set of opinions and priorities in the
914+trade-offs it makes. Other than this library, I can personally
915+recommend both [globby](http://npm.im/globby) and
916+[fast-glob](http://npm.im/fast-glob), though they differ in their
917+benefits and drawbacks.
918+
919+Both have very nice APIs and are reasonably fast.
920+
921+`fast-glob` is, as far as I am aware, the fastest glob
922+implementation in JavaScript today. However, there are many
923+cases where the choices that `fast-glob` makes in pursuit of
924+speed mean that its results differ from the results returned by
925+Bash and other sh-like shells, which may be surprising.
926+
927+In my testing, `fast-glob` is around 10-20% faster than this
928+module when walking over 200k files nested 4 directories
929+deep[1](#fn-webscale). However, there are some inconsistencies
930+with Bash matching behavior that this module does not suffer
931+from:
932+
933+- `**` only matches files, not directories
934+- `..` path portions are not handled unless they appear at the
935+ start of the pattern
936+- `./!(<pattern>)` will not match any files that _start_ with
937+ `<pattern>`, even if they do not match `<pattern>`. For
938+ example, `!(9).txt` will not match `9999.txt`.
939+- Some brace patterns in the middle of a pattern will result in
940+ failing to find certain matches.
941+- Extglob patterns are allowed to contain `/` characters.
942+
943+Globby exhibits all of the same pattern semantics as fast-glob,
944+(as it is a wrapper around fast-glob) and is slightly slower than
945+node-glob (by about 10-20% in the benchmark test set, or in other
946+words, anywhere from 20-50% slower than fast-glob). However, it
947+adds some API conveniences that may be worth the costs.
948+
949+- Support for `.gitignore` and other ignore files.
950+- Support for negated globs (ie, patterns starting with `!`
951+ rather than using a separate `ignore` option).
952+
953+The priority of this module is "correctness" in the sense of
954+performing a glob pattern expansion as faithfully as possible to
955+the behavior of Bash and other sh-like shells, with as much speed
956+as possible.
957+
958+Note that prior versions of `node-glob` are _not_ on this list.
959+Former versions of this module are far too slow for any cases
960+where performance matters at all, and were designed with APIs
961+that are extremely dated by current JavaScript standards.
962+
963+---
964+
965+<small id="fn-webscale">[1]: In the cases where this module
966+returns results and `fast-glob` doesn't, it's even faster, of
967+course.</small>
968+
969+![lumpy space princess saying 'oh my GLOB'](https://github.com/isaacs/node-glob/raw/main/oh-my-glob.gif)
970+
971+### Benchmark Results
972+
973+First number is time, smaller is better.
974+
975+Second number is the count of results returned.
976+
977+```
978+--- pattern: '**' ---
979+~~ sync ~~
980+node fast-glob sync 0m0.598s 200364
981+node globby sync 0m0.765s 200364
982+node current globSync mjs 0m0.683s 222656
983+node current glob syncStream 0m0.649s 222656
984+~~ async ~~
985+node fast-glob async 0m0.350s 200364
986+node globby async 0m0.509s 200364
987+node current glob async mjs 0m0.463s 222656
988+node current glob stream 0m0.411s 222656
989+
990+--- pattern: '**/..' ---
991+~~ sync ~~
992+node fast-glob sync 0m0.486s 0
993+node globby sync 0m0.769s 200364
994+node current globSync mjs 0m0.564s 2242
995+node current glob syncStream 0m0.583s 2242
996+~~ async ~~
997+node fast-glob async 0m0.283s 0
998+node globby async 0m0.512s 200364
999+node current glob async mjs 0m0.299s 2242
1000+node current glob stream 0m0.312s 2242
1001+
1002+--- pattern: './**/0/**/0/**/0/**/0/**/*.txt' ---
1003+~~ sync ~~
1004+node fast-glob sync 0m0.490s 10
1005+node globby sync 0m0.517s 10
1006+node current globSync mjs 0m0.540s 10
1007+node current glob syncStream 0m0.550s 10
1008+~~ async ~~
1009+node fast-glob async 0m0.290s 10
1010+node globby async 0m0.296s 10
1011+node current glob async mjs 0m0.278s 10
1012+node current glob stream 0m0.302s 10
1013+
1014+--- pattern: './**/[01]/**/[12]/**/[23]/**/[45]/**/*.txt' ---
1015+~~ sync ~~
1016+node fast-glob sync 0m0.500s 160
1017+node globby sync 0m0.528s 160
1018+node current globSync mjs 0m0.556s 160
1019+node current glob syncStream 0m0.573s 160
1020+~~ async ~~
1021+node fast-glob async 0m0.283s 160
1022+node globby async 0m0.301s 160
1023+node current glob async mjs 0m0.306s 160
1024+node current glob stream 0m0.322s 160
1025+
1026+--- pattern: './**/0/**/0/**/*.txt' ---
1027+~~ sync ~~
1028+node fast-glob sync 0m0.502s 5230
1029+node globby sync 0m0.527s 5230
1030+node current globSync mjs 0m0.544s 5230
1031+node current glob syncStream 0m0.557s 5230
1032+~~ async ~~
1033+node fast-glob async 0m0.285s 5230
1034+node globby async 0m0.305s 5230
1035+node current glob async mjs 0m0.304s 5230
1036+node current glob stream 0m0.310s 5230
1037+
1038+--- pattern: '**/*.txt' ---
1039+~~ sync ~~
1040+node fast-glob sync 0m0.580s 200023
1041+node globby sync 0m0.771s 200023
1042+node current globSync mjs 0m0.685s 200023
1043+node current glob syncStream 0m0.649s 200023
1044+~~ async ~~
1045+node fast-glob async 0m0.349s 200023
1046+node globby async 0m0.509s 200023
1047+node current glob async mjs 0m0.427s 200023
1048+node current glob stream 0m0.388s 200023
1049+
1050+--- pattern: '{**/*.txt,**/?/**/*.txt,**/?/**/?/**/*.txt,**/?/**/?/**/?/**/*.txt,**/?/**/?/**/?/**/?/**/*.txt}' ---
1051+~~ sync ~~
1052+node fast-glob sync 0m0.589s 200023
1053+node globby sync 0m0.771s 200023
1054+node current globSync mjs 0m0.716s 200023
1055+node current glob syncStream 0m0.684s 200023
1056+~~ async ~~
1057+node fast-glob async 0m0.351s 200023
1058+node globby async 0m0.518s 200023
1059+node current glob async mjs 0m0.462s 200023
1060+node current glob stream 0m0.468s 200023
1061+
1062+--- pattern: '**/5555/0000/*.txt' ---
1063+~~ sync ~~
1064+node fast-glob sync 0m0.496s 1000
1065+node globby sync 0m0.519s 1000
1066+node current globSync mjs 0m0.539s 1000
1067+node current glob syncStream 0m0.567s 1000
1068+~~ async ~~
1069+node fast-glob async 0m0.285s 1000
1070+node globby async 0m0.299s 1000
1071+node current glob async mjs 0m0.305s 1000
1072+node current glob stream 0m0.301s 1000
1073+
1074+--- pattern: './**/0/**/../[01]/**/0/../**/0/*.txt' ---
1075+~~ sync ~~
1076+node fast-glob sync 0m0.484s 0
1077+node globby sync 0m0.507s 0
1078+node current globSync mjs 0m0.577s 4880
1079+node current glob syncStream 0m0.586s 4880
1080+~~ async ~~
1081+node fast-glob async 0m0.280s 0
1082+node globby async 0m0.298s 0
1083+node current glob async mjs 0m0.327s 4880
1084+node current glob stream 0m0.324s 4880
1085+
1086+--- pattern: '**/????/????/????/????/*.txt' ---
1087+~~ sync ~~
1088+node fast-glob sync 0m0.547s 100000
1089+node globby sync 0m0.673s 100000
1090+node current globSync mjs 0m0.626s 100000
1091+node current glob syncStream 0m0.618s 100000
1092+~~ async ~~
1093+node fast-glob async 0m0.315s 100000
1094+node globby async 0m0.414s 100000
1095+node current glob async mjs 0m0.366s 100000
1096+node current glob stream 0m0.345s 100000
1097+
1098+--- pattern: './{**/?{/**/?{/**/?{/**/?,,,,},,,,},,,,},,,}/**/*.txt' ---
1099+~~ sync ~~
1100+node fast-glob sync 0m0.588s 100000
1101+node globby sync 0m0.670s 100000
1102+node current globSync mjs 0m0.717s 200023
1103+node current glob syncStream 0m0.687s 200023
1104+~~ async ~~
1105+node fast-glob async 0m0.343s 100000
1106+node globby async 0m0.418s 100000
1107+node current glob async mjs 0m0.519s 200023
1108+node current glob stream 0m0.451s 200023
1109+
1110+--- pattern: '**/!(0|9).txt' ---
1111+~~ sync ~~
1112+node fast-glob sync 0m0.573s 160023
1113+node globby sync 0m0.731s 160023
1114+node current globSync mjs 0m0.680s 180023
1115+node current glob syncStream 0m0.659s 180023
1116+~~ async ~~
1117+node fast-glob async 0m0.345s 160023
1118+node globby async 0m0.476s 160023
1119+node current glob async mjs 0m0.427s 180023
1120+node current glob stream 0m0.388s 180023
1121+
1122+--- pattern: './{*/**/../{*/**/../{*/**/../{*/**/../{*/**,,,,},,,,},,,,},,,,},,,,}/*.txt' ---
1123+~~ sync ~~
1124+node fast-glob sync 0m0.483s 0
1125+node globby sync 0m0.512s 0
1126+node current globSync mjs 0m0.811s 200023
1127+node current glob syncStream 0m0.773s 200023
1128+~~ async ~~
1129+node fast-glob async 0m0.280s 0
1130+node globby async 0m0.299s 0
1131+node current glob async mjs 0m0.617s 200023
1132+node current glob stream 0m0.568s 200023
1133+
1134+--- pattern: './*/**/../*/**/../*/**/../*/**/../*/**/../*/**/../*/**/../*/**/*.txt' ---
1135+~~ sync ~~
1136+node fast-glob sync 0m0.485s 0
1137+node globby sync 0m0.507s 0
1138+node current globSync mjs 0m0.759s 200023
1139+node current glob syncStream 0m0.740s 200023
1140+~~ async ~~
1141+node fast-glob async 0m0.281s 0
1142+node globby async 0m0.297s 0
1143+node current glob async mjs 0m0.544s 200023
1144+node current glob stream 0m0.464s 200023
1145+
1146+--- pattern: './*/**/../*/**/../*/**/../*/**/../*/**/*.txt' ---
1147+~~ sync ~~
1148+node fast-glob sync 0m0.486s 0
1149+node globby sync 0m0.513s 0
1150+node current globSync mjs 0m0.734s 200023
1151+node current glob syncStream 0m0.696s 200023
1152+~~ async ~~
1153+node fast-glob async 0m0.286s 0
1154+node globby async 0m0.296s 0
1155+node current glob async mjs 0m0.506s 200023
1156+node current glob stream 0m0.483s 200023
1157+
1158+--- pattern: './0/**/../1/**/../2/**/../3/**/../4/**/../5/**/../6/**/../7/**/*.txt' ---
1159+~~ sync ~~
1160+node fast-glob sync 0m0.060s 0
1161+node globby sync 0m0.074s 0
1162+node current globSync mjs 0m0.067s 0
1163+node current glob syncStream 0m0.066s 0
1164+~~ async ~~
1165+node fast-glob async 0m0.060s 0
1166+node globby async 0m0.075s 0
1167+node current glob async mjs 0m0.066s 0
1168+node current glob stream 0m0.067s 0
1169+
1170+--- pattern: './**/?/**/?/**/?/**/?/**/*.txt' ---
1171+~~ sync ~~
1172+node fast-glob sync 0m0.568s 100000
1173+node globby sync 0m0.651s 100000
1174+node current globSync mjs 0m0.619s 100000
1175+node current glob syncStream 0m0.617s 100000
1176+~~ async ~~
1177+node fast-glob async 0m0.332s 100000
1178+node globby async 0m0.409s 100000
1179+node current glob async mjs 0m0.372s 100000
1180+node current glob stream 0m0.351s 100000
1181+
1182+--- pattern: '**/*/**/*/**/*/**/*/**' ---
1183+~~ sync ~~
1184+node fast-glob sync 0m0.603s 200113
1185+node globby sync 0m0.798s 200113
1186+node current globSync mjs 0m0.730s 222137
1187+node current glob syncStream 0m0.693s 222137
1188+~~ async ~~
1189+node fast-glob async 0m0.356s 200113
1190+node globby async 0m0.525s 200113
1191+node current glob async mjs 0m0.508s 222137
1192+node current glob stream 0m0.455s 222137
1193+
1194+--- pattern: './**/*/**/*/**/*/**/*/**/*.txt' ---
1195+~~ sync ~~
1196+node fast-glob sync 0m0.622s 200000
1197+node globby sync 0m0.792s 200000
1198+node current globSync mjs 0m0.722s 200000
1199+node current glob syncStream 0m0.695s 200000
1200+~~ async ~~
1201+node fast-glob async 0m0.369s 200000
1202+node globby async 0m0.527s 200000
1203+node current glob async mjs 0m0.502s 200000
1204+node current glob stream 0m0.481s 200000
1205+
1206+--- pattern: '**/*.txt' ---
1207+~~ sync ~~
1208+node fast-glob sync 0m0.588s 200023
1209+node globby sync 0m0.771s 200023
1210+node current globSync mjs 0m0.684s 200023
1211+node current glob syncStream 0m0.658s 200023
1212+~~ async ~~
1213+node fast-glob async 0m0.352s 200023
1214+node globby async 0m0.516s 200023
1215+node current glob async mjs 0m0.432s 200023
1216+node current glob stream 0m0.384s 200023
1217+
1218+--- pattern: './**/**/**/**/**/**/**/**/*.txt' ---
1219+~~ sync ~~
1220+node fast-glob sync 0m0.589s 200023
1221+node globby sync 0m0.766s 200023
1222+node current globSync mjs 0m0.682s 200023
1223+node current glob syncStream 0m0.652s 200023
1224+~~ async ~~
1225+node fast-glob async 0m0.352s 200023
1226+node globby async 0m0.523s 200023
1227+node current glob async mjs 0m0.436s 200023
1228+node current glob stream 0m0.380s 200023
1229+
1230+--- pattern: '**/*/*.txt' ---
1231+~~ sync ~~
1232+node fast-glob sync 0m0.592s 200023
1233+node globby sync 0m0.776s 200023
1234+node current globSync mjs 0m0.691s 200023
1235+node current glob syncStream 0m0.659s 200023
1236+~~ async ~~
1237+node fast-glob async 0m0.357s 200023
1238+node globby async 0m0.513s 200023
1239+node current glob async mjs 0m0.471s 200023
1240+node current glob stream 0m0.424s 200023
1241+
1242+--- pattern: '**/*/**/*.txt' ---
1243+~~ sync ~~
1244+node fast-glob sync 0m0.585s 200023
1245+node globby sync 0m0.766s 200023
1246+node current globSync mjs 0m0.694s 200023
1247+node current glob syncStream 0m0.664s 200023
1248+~~ async ~~
1249+node fast-glob async 0m0.350s 200023
1250+node globby async 0m0.514s 200023
1251+node current glob async mjs 0m0.472s 200023
1252+node current glob stream 0m0.424s 200023
1253+
1254+--- pattern: '**/[0-9]/**/*.txt' ---
1255+~~ sync ~~
1256+node fast-glob sync 0m0.544s 100000
1257+node globby sync 0m0.636s 100000
1258+node current globSync mjs 0m0.626s 100000
1259+node current glob syncStream 0m0.621s 100000
1260+~~ async ~~
1261+node fast-glob async 0m0.322s 100000
1262+node globby async 0m0.404s 100000
1263+node current glob async mjs 0m0.360s 100000
1264+node current glob stream 0m0.352s 100000
1265+```
@@ -0,0 +1,1265 @@
1+# Glob
2+
3+Match files using the patterns the shell uses.
4+
5+The most correct and second fastest glob implementation in
6+JavaScript. (See **Comparison to Other JavaScript Glob
7+Implementations** at the bottom of this readme.)
8+
9+![a fun cartoon logo made of glob characters](https://github.com/isaacs/node-glob/raw/main/logo/glob.png)
10+
11+## Usage
12+
13+Install with npm
14+
15+```
16+npm i glob
17+```
18+
19+**Note** the npm package name is _not_ `node-glob` that's a
20+different thing that was abandoned years ago. Just `glob`.
21+
22+```js
23+// load using import
24+import { glob, globSync, globStream, globStreamSync, Glob } from 'glob'
25+// or using commonjs, that's fine, too
26+const {
27+ glob,
28+ globSync,
29+ globStream,
30+ globStreamSync,
31+ Glob,
32+} = require('glob')
33+
34+// the main glob() and globSync() resolve/return array of filenames
35+
36+// all js files, but don't look in node_modules
37+const jsfiles = await glob('**/*.js', { ignore: 'node_modules/**' })
38+
39+// pass in a signal to cancel the glob walk
40+const stopAfter100ms = await glob('**/*.css', {
41+ signal: AbortSignal.timeout(100),
42+})
43+
44+// multiple patterns supported as well
45+const images = await glob(['css/*.{png,jpeg}', 'public/*.{png,jpeg}'])
46+
47+// but of course you can do that with the glob pattern also
48+// the sync function is the same, just returns a string[] instead
49+// of Promise<string[]>
50+const imagesAlt = globSync('{css,public}/*.{png,jpeg}')
51+
52+// you can also stream them, this is a Minipass stream
53+const filesStream = globStream(['**/*.dat', 'logs/**/*.log'])
54+
55+// construct a Glob object if you wanna do it that way, which
56+// allows for much faster walks if you have to look in the same
57+// folder multiple times.
58+const g = new Glob('**/foo', {})
59+// glob objects are async iterators, can also do globIterate() or
60+// g.iterate(), same deal
61+for await (const file of g) {
62+ console.log('found a foo file:', file)
63+}
64+// pass a glob as the glob options to reuse its settings and caches
65+const g2 = new Glob('**/bar', g)
66+// sync iteration works as well
67+for (const file of g2) {
68+ console.log('found a bar file:', file)
69+}
70+
71+// you can also pass withFileTypes: true to get Path objects
72+// these are like a Dirent, but with some more added powers
73+// check out http://npm.im/path-scurry for more info on their API
74+const g3 = new Glob('**/baz/**', { withFileTypes: true })
75+g3.stream().on('data', path => {
76+ console.log(
77+ 'got a path object',
78+ path.fullpath(),
79+ path.isDirectory(),
80+ path.readdirSync().map(e => e.name),
81+ )
82+})
83+
84+// if you use stat:true and withFileTypes, you can sort results
85+// by things like modified time, filter by permission mode, etc.
86+// All Stats fields will be available in that case. Slightly
87+// slower, though.
88+// For example:
89+const results = await glob('**', { stat: true, withFileTypes: true })
90+
91+const timeSortedFiles = results
92+ .sort((a, b) => a.mtimeMs - b.mtimeMs)
93+ .map(path => path.fullpath())
94+
95+const groupReadableFiles = results
96+ .filter(path => path.mode & 0o040)
97+ .map(path => path.fullpath())
98+
99+// custom ignores can be done like this, for example by saying
100+// you'll ignore all markdown files, and all folders named 'docs'
101+const customIgnoreResults = await glob('**', {
102+ ignore: {
103+ ignored: p => /\.md$/.test(p.name),
104+ childrenIgnored: p => p.isNamed('docs'),
105+ },
106+})
107+
108+// another fun use case, only return files with the same name as
109+// their parent folder, plus either `.ts` or `.js`
110+const folderNamedModules = await glob('**/*.{ts,js}', {
111+ ignore: {
112+ ignored: p => {
113+ const pp = p.parent
114+ return !(p.isNamed(pp.name + '.ts') || p.isNamed(pp.name + '.js'))
115+ },
116+ },
117+})
118+
119+// find all files edited in the last hour, to do this, we ignore
120+// all of them that are more than an hour old
121+const newFiles = await glob('**', {
122+ // need stat so we have mtime
123+ stat: true,
124+ // only want the files, not the dirs
125+ nodir: true,
126+ ignore: {
127+ ignored: p => {
128+ return new Date() - p.mtime > 60 * 60 * 1000
129+ },
130+ // could add similar childrenIgnored here as well, but
131+ // directory mtime is inconsistent across platforms, so
132+ // probably better not to, unless you know the system
133+ // tracks this reliably.
134+ },
135+})
136+```
137+
138+**Note** Glob patterns should always use `/` as a path separator,
139+even on Windows systems, as `\` is used to escape glob
140+characters. If you wish to use `\` as a path separator _instead
141+of_ using it as an escape character on Windows platforms, you may
142+set `windowsPathsNoEscape:true` in the options. In this mode,
143+special glob characters cannot be escaped, making it impossible
144+to match a literal `*` `?` and so on in filenames.
145+
146+## Command Line Interface
147+
148+```
149+$ glob -h
150+
151+Usage:
152+ glob [options] [<pattern> [<pattern> ...]]
153+
154+Expand the positional glob expression arguments into any matching file system
155+paths found.
156+
157+ -c<command> --cmd=<command>
158+ Run the command provided, passing the glob expression
159+ matches as arguments.
160+
161+ -A --all By default, the glob cli command will not expand any
162+ arguments that are an exact match to a file on disk.
163+
164+ This prevents double-expanding, in case the shell
165+ expands an argument whose filename is a glob
166+ expression.
167+
168+ For example, if 'app/*.ts' would match 'app/[id].ts',
169+ then on Windows powershell or cmd.exe, 'glob app/*.ts'
170+ will expand to 'app/[id].ts', as expected. However, in
171+ posix shells such as bash or zsh, the shell will first
172+ expand 'app/*.ts' to a list of filenames. Then glob
173+ will look for a file matching 'app/[id].ts' (ie,
174+ 'app/i.ts' or 'app/d.ts'), which is unexpected.
175+
176+ Setting '--all' prevents this behavior, causing glob to
177+ treat ALL patterns as glob expressions to be expanded,
178+ even if they are an exact match to a file on disk.
179+
180+ When setting this option, be sure to enquote arguments
181+ so that the shell will not expand them prior to passing
182+ them to the glob command process.
183+
184+ -a --absolute Expand to absolute paths
185+ -d --dot-relative Prepend './' on relative matches
186+ -m --mark Append a / on any directories matched
187+ -x --posix Always resolve to posix style paths, using '/' as the
188+ directory separator, even on Windows. Drive letter
189+ absolute matches on Windows will be expanded to their
190+ full resolved UNC maths, eg instead of 'C:\foo\bar', it
191+ will expand to '//?/C:/foo/bar'.
192+
193+ -f --follow Follow symlinked directories when expanding '**'
194+ -R --realpath Call 'fs.realpath' on all of the results. In the case
195+ of an entry that cannot be resolved, the entry is
196+ omitted. This incurs a slight performance penalty, of
197+ course, because of the added system calls.
198+
199+ -s --stat Call 'fs.lstat' on all entries, whether required or not
200+ to determine if it's a valid match.
201+
202+ -b --match-base Perform a basename-only match if the pattern does not
203+ contain any slash characters. That is, '*.js' would be
204+ treated as equivalent to '**/*.js', matching js files
205+ in all directories.
206+
207+ --dot Allow patterns to match files/directories that start
208+ with '.', even if the pattern does not start with '.'
209+
210+ --nobrace Do not expand {...} patterns
211+ --nocase Perform a case-insensitive match. This defaults to
212+ 'true' on macOS and Windows platforms, and false on all
213+ others.
214+
215+ Note: 'nocase' should only be explicitly set when it is
216+ known that the filesystem's case sensitivity differs
217+ from the platform default. If set 'true' on
218+ case-insensitive file systems, then the walk may return
219+ more or less results than expected.
220+
221+ --nodir Do not match directories, only files.
222+
223+ Note: to *only* match directories, append a '/' at the
224+ end of the pattern.
225+
226+ --noext Do not expand extglob patterns, such as '+(a|b)'
227+ --noglobstar Do not expand '**' against multiple path portions. Ie,
228+ treat it as a normal '*' instead.
229+
230+ --windows-path-no-escape
231+ Use '\' as a path separator *only*, and *never* as an
232+ escape character. If set, all '\' characters are
233+ replaced with '/' in the pattern.
234+
235+ -D<n> --max-depth=<n> Maximum depth to traverse from the current working
236+ directory
237+
238+ -C<cwd> --cwd=<cwd> Current working directory to execute/match in
239+ -r<root> --root=<root> A string path resolved against the 'cwd', which is used
240+ as the starting point for absolute patterns that start
241+ with '/' (but not drive letters or UNC paths on
242+ Windows).
243+
244+ Note that this *doesn't* necessarily limit the walk to
245+ the 'root' directory, and doesn't affect the cwd
246+ starting point for non-absolute patterns. A pattern
247+ containing '..' will still be able to traverse out of
248+ the root directory, if it is not an actual root
249+ directory on the filesystem, and any non-absolute
250+ patterns will still be matched in the 'cwd'.
251+
252+ To start absolute and non-absolute patterns in the same
253+ path, you can use '--root=' to set it to the empty
254+ string. However, be aware that on Windows systems, a
255+ pattern like 'x:/*' or '//host/share/*' will *always*
256+ start in the 'x:/' or '//host/share/' directory,
257+ regardless of the --root setting.
258+
259+ --platform=<platform> Defaults to the value of 'process.platform' if
260+ available, or 'linux' if not. Setting --platform=win32
261+ on non-Windows systems may cause strange behavior!
262+
263+ -i<ignore> --ignore=<ignore>
264+ Glob patterns to ignore Can be set multiple times
265+ -v --debug Output a huge amount of noisy debug information about
266+ patterns as they are parsed and used to match files.
267+
268+ -h --help Show this usage information
269+```
270+
271+## `glob(pattern: string | string[], options?: GlobOptions) => Promise<string[] | Path[]>`
272+
273+Perform an asynchronous glob search for the pattern(s) specified.
274+Returns
275+[Path](https://isaacs.github.io/path-scurry/classes/PathBase)
276+objects if the `withFileTypes` option is set to `true`. See below
277+for full options field desciptions.
278+
279+## `globSync(pattern: string | string[], options?: GlobOptions) => string[] | Path[]`
280+
281+Synchronous form of `glob()`.
282+
283+Alias: `glob.sync()`
284+
285+## `globIterate(pattern: string | string[], options?: GlobOptions) => AsyncGenerator<string>`
286+
287+Return an async iterator for walking glob pattern matches.
288+
289+Alias: `glob.iterate()`
290+
291+## `globIterateSync(pattern: string | string[], options?: GlobOptions) => Generator<string>`
292+
293+Return a sync iterator for walking glob pattern matches.
294+
295+Alias: `glob.iterate.sync()`, `glob.sync.iterate()`
296+
297+## `globStream(pattern: string | string[], options?: GlobOptions) => Minipass<string | Path>`
298+
299+Return a stream that emits all the strings or `Path` objects and
300+then emits `end` when completed.
301+
302+Alias: `glob.stream()`
303+
304+## `globStreamSync(pattern: string | string[], options?: GlobOptions) => Minipass<string | Path>`
305+
306+Syncronous form of `globStream()`. Will read all the matches as
307+fast as you consume them, even all in a single tick if you
308+consume them immediately, but will still respond to backpressure
309+if they're not consumed immediately.
310+
311+Alias: `glob.stream.sync()`, `glob.sync.stream()`
312+
313+## `hasMagic(pattern: string | string[], options?: GlobOptions) => boolean`
314+
315+Returns `true` if the provided pattern contains any "magic" glob
316+characters, given the options provided.
317+
318+Brace expansion is not considered "magic" unless the
319+`magicalBraces` option is set, as brace expansion just turns one
320+string into an array of strings. So a pattern like `'x{a,b}y'`
321+would return `false`, because `'xay'` and `'xby'` both do not
322+contain any magic glob characters, and it's treated the same as
323+if you had called it on `['xay', 'xby']`. When
324+`magicalBraces:true` is in the options, brace expansion _is_
325+treated as a pattern having magic.
326+
327+## `escape(pattern: string, options?: GlobOptions) => string`
328+
329+Escape all magic characters in a glob pattern, so that it will
330+only ever match literal strings
331+
332+If the `windowsPathsNoEscape` option is used, then characters are
333+escaped by wrapping in `[]`, because a magic character wrapped in
334+a character class can only be satisfied by that exact character.
335+
336+Slashes (and backslashes in `windowsPathsNoEscape` mode) cannot
337+be escaped or unescaped.
338+
339+## `unescape(pattern: string, options?: GlobOptions) => string`
340+
341+Un-escape a glob string that may contain some escaped characters.
342+
343+If the `windowsPathsNoEscape` option is used, then square-brace
344+escapes are removed, but not backslash escapes. For example, it
345+will turn the string `'[*]'` into `*`, but it will not turn
346+`'\\*'` into `'*'`, because `\` is a path separator in
347+`windowsPathsNoEscape` mode.
348+
349+When `windowsPathsNoEscape` is not set, then both brace escapes
350+and backslash escapes are removed.
351+
352+Slashes (and backslashes in `windowsPathsNoEscape` mode) cannot
353+be escaped or unescaped.
354+
355+## Class `Glob`
356+
357+An object that can perform glob pattern traversals.
358+
359+### `const g = new Glob(pattern: string | string[], options: GlobOptions)`
360+
361+Options object is required.
362+
363+See full options descriptions below.
364+
365+Note that a previous `Glob` object can be passed as the
366+`GlobOptions` to another `Glob` instantiation to re-use settings
367+and caches with a new pattern.
368+
369+Traversal functions can be called multiple times to run the walk
370+again.
371+
372+### `g.stream()`
373+
374+Stream results asynchronously,
375+
376+### `g.streamSync()`
377+
378+Stream results synchronously.
379+
380+### `g.iterate()`
381+
382+Default async iteration function. Returns an AsyncGenerator that
383+iterates over the results.
384+
385+### `g.iterateSync()`
386+
387+Default sync iteration function. Returns a Generator that
388+iterates over the results.
389+
390+### `g.walk()`
391+
392+Returns a Promise that resolves to the results array.
393+
394+### `g.walkSync()`
395+
396+Returns a results array.
397+
398+### Properties
399+
400+All options are stored as properties on the `Glob` object.
401+
402+- `opts` The options provided to the constructor.
403+- `patterns` An array of parsed immutable `Pattern` objects.
404+
405+## Options
406+
407+Exported as `GlobOptions` TypeScript interface. A `GlobOptions`
408+object may be provided to any of the exported methods, and must
409+be provided to the `Glob` constructor.
410+
411+All options are optional, boolean, and false by default, unless
412+otherwise noted.
413+
414+All resolved options are added to the Glob object as properties.
415+
416+If you are running many `glob` operations, you can pass a Glob
417+object as the `options` argument to a subsequent operation to
418+share the previously loaded cache.
419+
420+- `cwd` String path or `file://` string or URL object. The
421+ current working directory in which to search. Defaults to
422+ `process.cwd()`. See also: "Windows, CWDs, Drive Letters, and
423+ UNC Paths", below.
424+
425+ This option may be either a string path or a `file://` URL
426+ object or string.
427+
428+- `root` A string path resolved against the `cwd` option, which
429+ is used as the starting point for absolute patterns that start
430+ with `/`, (but not drive letters or UNC paths on Windows).
431+
432+ Note that this _doesn't_ necessarily limit the walk to the
433+ `root` directory, and doesn't affect the cwd starting point for
434+ non-absolute patterns. A pattern containing `..` will still be
435+ able to traverse out of the root directory, if it is not an
436+ actual root directory on the filesystem, and any non-absolute
437+ patterns will be matched in the `cwd`. For example, the
438+ pattern `/../*` with `{root:'/some/path'}` will return all
439+ files in `/some`, not all files in `/some/path`. The pattern
440+ `*` with `{root:'/some/path'}` will return all the entries in
441+ the cwd, not the entries in `/some/path`.
442+
443+ To start absolute and non-absolute patterns in the same
444+ path, you can use `{root:''}`. However, be aware that on
445+ Windows systems, a pattern like `x:/*` or `//host/share/*` will
446+ _always_ start in the `x:/` or `//host/share` directory,
447+ regardless of the `root` setting.
448+
449+- `windowsPathsNoEscape` Use `\\` as a path separator _only_, and
450+ _never_ as an escape character. If set, all `\\` characters are
451+ replaced with `/` in the pattern.
452+
453+ Note that this makes it **impossible** to match against paths
454+ containing literal glob pattern characters, but allows matching
455+ with patterns constructed using `path.join()` and
456+ `path.resolve()` on Windows platforms, mimicking the (buggy!)
457+ behavior of Glob v7 and before on Windows. Please use with
458+ caution, and be mindful of [the caveat below about Windows
459+ paths](#windows). (For legacy reasons, this is also set if
460+ `allowWindowsEscape` is set to the exact value `false`.)
461+
462+- `dot` Include `.dot` files in normal matches and `globstar`
463+ matches. Note that an explicit dot in a portion of the pattern
464+ will always match dot files.
465+
466+- `magicalBraces` Treat brace expansion like `{a,b}` as a "magic"
467+ pattern. Has no effect if {@link nobrace} is set.
468+
469+ Only has effect on the {@link hasMagic} function, no effect on
470+ glob pattern matching itself.
471+
472+- `dotRelative` Prepend all relative path strings with `./` (or
473+ `.\` on Windows).
474+
475+ Without this option, returned relative paths are "bare", so
476+ instead of returning `'./foo/bar'`, they are returned as
477+ `'foo/bar'`.
478+
479+ Relative patterns starting with `'../'` are not prepended with
480+ `./`, even if this option is set.
481+
482+- `mark` Add a `/` character to directory matches. Note that this
483+ requires additional stat calls.
484+
485+- `nobrace` Do not expand `{a,b}` and `{1..3}` brace sets.
486+
487+- `noglobstar` Do not match `**` against multiple filenames. (Ie,
488+ treat it as a normal `*` instead.)
489+
490+- `noext` Do not match "extglob" patterns such as `+(a|b)`.
491+
492+- `nocase` Perform a case-insensitive match. This defaults to
493+ `true` on macOS and Windows systems, and `false` on all others.
494+
495+ **Note** `nocase` should only be explicitly set when it is
496+ known that the filesystem's case sensitivity differs from the
497+ platform default. If set `true` on case-sensitive file
498+ systems, or `false` on case-insensitive file systems, then the
499+ walk may return more or less results than expected.
500+
501+- `maxDepth` Specify a number to limit the depth of the directory
502+ traversal to this many levels below the `cwd`.
503+
504+- `matchBase` Perform a basename-only match if the pattern does
505+ not contain any slash characters. That is, `*.js` would be
506+ treated as equivalent to `**/*.js`, matching all js files in
507+ all directories.
508+
509+- `nodir` Do not match directories, only files. (Note: to match
510+ _only_ directories, put a `/` at the end of the pattern.)
511+
512+ Note: when `follow` and `nodir` are both set, then symbolic
513+ links to directories are also omitted.
514+
515+- `stat` Call `lstat()` on all entries, whether required or not
516+ to determine whether it's a valid match. When used with
517+ `withFileTypes`, this means that matches will include data such
518+ as modified time, permissions, and so on. Note that this will
519+ incur a performance cost due to the added system calls.
520+
521+- `ignore` string or string[], or an object with `ignore` and
522+ `ignoreChildren` methods.
523+
524+ If a string or string[] is provided, then this is treated as a
525+ glob pattern or array of glob patterns to exclude from matches.
526+ To ignore all children within a directory, as well as the entry
527+ itself, append `'/**'` to the ignore pattern.
528+
529+ **Note** `ignore` patterns are _always_ in `dot:true` mode,
530+ regardless of any other settings.
531+
532+ If an object is provided that has `ignored(path)` and/or
533+ `childrenIgnored(path)` methods, then these methods will be
534+ called to determine whether any Path is a match or if its
535+ children should be traversed, respectively.
536+
537+- `follow` Follow symlinked directories when expanding `**`
538+ patterns. This can result in a lot of duplicate references in
539+ the presence of cyclic links, and make performance quite bad.
540+
541+ By default, a `**` in a pattern will follow 1 symbolic link if
542+ it is not the first item in the pattern, or none if it is the
543+ first item in the pattern, following the same behavior as Bash.
544+
545+ Note: when `follow` and `nodir` are both set, then symbolic
546+ links to directories are also omitted.
547+
548+- `realpath` Set to true to call `fs.realpath` on all of the
549+ results. In the case of an entry that cannot be resolved, the
550+ entry is omitted. This incurs a slight performance penalty, of
551+ course, because of the added system calls.
552+
553+- `absolute` Set to true to always receive absolute paths for
554+ matched files. Set to `false` to always receive relative paths
555+ for matched files.
556+
557+ By default, when this option is not set, absolute paths are
558+ returned for patterns that are absolute, and otherwise paths
559+ are returned that are relative to the `cwd` setting.
560+
561+ This does _not_ make an extra system call to get the realpath,
562+ it only does string path resolution.
563+
564+ `absolute` may not be used along with `withFileTypes`.
565+
566+- `posix` Set to true to use `/` as the path separator in
567+ returned results. On posix systems, this has no effect. On
568+ Windows systems, this will return `/` delimited path results,
569+ and absolute paths will be returned in their full resolved UNC
570+ path form, eg insted of `'C:\\foo\\bar'`, it will return
571+ `//?/C:/foo/bar`.
572+
573+- `platform` Defaults to value of `process.platform` if
574+ available, or `'linux'` if not. Setting `platform:'win32'` on
575+ non-Windows systems may cause strange behavior.
576+
577+- `withFileTypes` Return [PathScurry](http://npm.im/path-scurry)
578+ `Path` objects instead of strings. These are similar to a
579+ NodeJS `Dirent` object, but with additional methods and
580+ properties.
581+
582+ `withFileTypes` may not be used along with `absolute`.
583+
584+- `signal` An AbortSignal which will cancel the Glob walk when
585+ triggered.
586+
587+- `fs` An override object to pass in custom filesystem methods.
588+ See [PathScurry docs](http://npm.im/path-scurry) for what can
589+ be overridden.
590+
591+- `scurry` A [PathScurry](http://npm.im/path-scurry) object used
592+ to traverse the file system. If the `nocase` option is set
593+ explicitly, then any provided `scurry` object must match this
594+ setting.
595+
596+- `includeChildMatches` boolean, default `true`. Do not match any
597+ children of any matches. For example, the pattern `**\/foo`
598+ would match `a/foo`, but not `a/foo/b/foo` in this mode.
599+
600+ This is especially useful for cases like "find all
601+ `node_modules` folders, but not the ones in `node_modules`".
602+
603+ In order to support this, the `Ignore` implementation must
604+ support an `add(pattern: string)` method. If using the default
605+ `Ignore` class, then this is fine, but if this is set to
606+ `false`, and a custom `Ignore` is provided that does not have
607+ an `add()` method, then it will throw an error.
608+
609+ **Caveat** It _only_ ignores matches that would be a descendant
610+ of a previous match, and only if that descendant is matched
611+ _after_ the ancestor is encountered. Since the file system walk
612+ happens in indeterminate order, it's possible that a match will
613+ already be added before its ancestor, if multiple or braced
614+ patterns are used.
615+
616+ For example:
617+
618+ ```js
619+ const results = await glob(
620+ [
621+ // likely to match first, since it's just a stat
622+ 'a/b/c/d/e/f',
623+
624+ // this pattern is more complicated! It must to various readdir()
625+ // calls and test the results against a regular expression, and that
626+ // is certainly going to take a little bit longer.
627+ //
628+ // So, later on, it encounters a match at 'a/b/c/d/e', but it's too
629+ // late to ignore a/b/c/d/e/f, because it's already been emitted.
630+ 'a/[bdf]/?/[a-z]/*',
631+ ],
632+ { includeChildMatches: false },
633+ )
634+ ```
635+
636+ It's best to only set this to `false` if you can be reasonably
637+ sure that no components of the pattern will potentially match
638+ one another's file system descendants, or if the occasional
639+ included child entry will not cause problems.
640+
641+## Glob Primer
642+
643+Much more information about glob pattern expansion can be found
644+by running `man bash` and searching for `Pattern Matching`.
645+
646+"Globs" are the patterns you type when you do stuff like `ls
647+*.js` on the command line, or put `build/*` in a `.gitignore`
648+file.
649+
650+Before parsing the path part patterns, braced sections are
651+expanded into a set. Braced sections start with `{` and end with
652+`}`, with 2 or more comma-delimited sections within. Braced
653+sections may contain slash characters, so `a{/b/c,bcd}` would
654+expand into `a/b/c` and `abcd`.
655+
656+The following characters have special magic meaning when used in
657+a path portion. With the exception of `**`, none of these match
658+path separators (ie, `/` on all platforms, and `\` on Windows).
659+
660+- `*` Matches 0 or more characters in a single path portion.
661+ When alone in a path portion, it must match at least 1
662+ character. If `dot:true` is not specified, then `*` will not
663+ match against a `.` character at the start of a path portion.
664+- `?` Matches 1 character. If `dot:true` is not specified, then
665+ `?` will not match against a `.` character at the start of a
666+ path portion.
667+- `[...]` Matches a range of characters, similar to a RegExp
668+ range. If the first character of the range is `!` or `^` then
669+ it matches any character not in the range. If the first
670+ character is `]`, then it will be considered the same as `\]`,
671+ rather than the end of the character class.
672+- `!(pattern|pattern|pattern)` Matches anything that does not
673+ match any of the patterns provided. May _not_ contain `/`
674+ characters. Similar to `*`, if alone in a path portion, then
675+ the path portion must have at least one character.
676+- `?(pattern|pattern|pattern)` Matches zero or one occurrence of
677+ the patterns provided. May _not_ contain `/` characters.
678+- `+(pattern|pattern|pattern)` Matches one or more occurrences of
679+ the patterns provided. May _not_ contain `/` characters.
680+- `*(a|b|c)` Matches zero or more occurrences of the patterns
681+ provided. May _not_ contain `/` characters.
682+- `@(pattern|pat*|pat?erN)` Matches exactly one of the patterns
683+ provided. May _not_ contain `/` characters.
684+- `**` If a "globstar" is alone in a path portion, then it
685+ matches zero or more directories and subdirectories searching
686+ for matches. It does not crawl symlinked directories, unless
687+ `{follow:true}` is passed in the options object. A pattern
688+ like `a/b/**` will only match `a/b` if it is a directory.
689+ Follows 1 symbolic link if not the first item in the pattern,
690+ or 0 if it is the first item, unless `follow:true` is set, in
691+ which case it follows all symbolic links.
692+
693+`[:class:]` patterns are supported by this implementation, but
694+`[=c=]` and `[.symbol.]` style class patterns are not.
695+
696+### Dots
697+
698+If a file or directory path portion has a `.` as the first
699+character, then it will not match any glob pattern unless that
700+pattern's corresponding path part also has a `.` as its first
701+character.
702+
703+For example, the pattern `a/.*/c` would match the file at
704+`a/.b/c`. However the pattern `a/*/c` would not, because `*` does
705+not start with a dot character.
706+
707+You can make glob treat dots as normal characters by setting
708+`dot:true` in the options.
709+
710+### Basename Matching
711+
712+If you set `matchBase:true` in the options, and the pattern has
713+no slashes in it, then it will seek for any file anywhere in the
714+tree with a matching basename. For example, `*.js` would match
715+`test/simple/basic.js`.
716+
717+### Empty Sets
718+
719+If no matching files are found, then an empty array is returned.
720+This differs from the shell, where the pattern itself is
721+returned. For example:
722+
723+```sh
724+$ echo a*s*d*f
725+a*s*d*f
726+```
727+
728+## Comparisons to other fnmatch/glob implementations
729+
730+While strict compliance with the existing standards is a
731+worthwhile goal, some discrepancies exist between node-glob and
732+other implementations, and are intentional.
733+
734+The double-star character `**` is supported by default, unless
735+the `noglobstar` flag is set. This is supported in the manner of
736+bsdglob and bash 5, where `**` only has special significance if
737+it is the only thing in a path part. That is, `a/**/b` will match
738+`a/x/y/b`, but `a/**b` will not.
739+
740+Note that symlinked directories are not traversed as part of a
741+`**`, though their contents may match against subsequent portions
742+of the pattern. This prevents infinite loops and duplicates and
743+the like. You can force glob to traverse symlinks with `**` by
744+setting `{follow:true}` in the options.
745+
746+There is no equivalent of the `nonull` option. A pattern that
747+does not find any matches simply resolves to nothing. (An empty
748+array, immediately ended stream, etc.)
749+
750+If brace expansion is not disabled, then it is performed before
751+any other interpretation of the glob pattern. Thus, a pattern
752+like `+(a|{b),c)}`, which would not be valid in bash or zsh, is
753+expanded **first** into the set of `+(a|b)` and `+(a|c)`, and
754+those patterns are checked for validity. Since those two are
755+valid, matching proceeds.
756+
757+The character class patterns `[:class:]` (posix standard named
758+classes) style class patterns are supported and unicode-aware,
759+but `[=c=]` (locale-specific character collation weight), and
760+`[.symbol.]` (collating symbol), are not.
761+
762+### Repeated Slashes
763+
764+Unlike Bash and zsh, repeated `/` are always coalesced into a
765+single path separator.
766+
767+### Comments and Negation
768+
769+Previously, this module let you mark a pattern as a "comment" if
770+it started with a `#` character, or a "negated" pattern if it
771+started with a `!` character.
772+
773+These options were deprecated in version 5, and removed in
774+version 6.
775+
776+To specify things that should not match, use the `ignore` option.
777+
778+## Windows
779+
780+**Please only use forward-slashes in glob expressions.**
781+
782+Though windows uses either `/` or `\` as its path separator, only
783+`/` characters are used by this glob implementation. You must use
784+forward-slashes **only** in glob expressions. Back-slashes will
785+always be interpreted as escape characters, not path separators.
786+
787+Results from absolute patterns such as `/foo/*` are mounted onto
788+the root setting using `path.join`. On windows, this will by
789+default result in `/foo/*` matching `C:\foo\bar.txt`.
790+
791+To automatically coerce all `\` characters to `/` in pattern
792+strings, **thus making it impossible to escape literal glob
793+characters**, you may set the `windowsPathsNoEscape` option to
794+`true`.
795+
796+### Windows, CWDs, Drive Letters, and UNC Paths
797+
798+On posix systems, when a pattern starts with `/`, any `cwd`
799+option is ignored, and the traversal starts at `/`, plus any
800+non-magic path portions specified in the pattern.
801+
802+On Windows systems, the behavior is similar, but the concept of
803+an "absolute path" is somewhat more involved.
804+
805+#### UNC Paths
806+
807+A UNC path may be used as the start of a pattern on Windows
808+platforms. For example, a pattern like: `//?/x:/*` will return
809+all file entries in the root of the `x:` drive. A pattern like
810+`//ComputerName/Share/*` will return all files in the associated
811+share.
812+
813+UNC path roots are always compared case insensitively.
814+
815+#### Drive Letters
816+
817+A pattern starting with a drive letter, like `c:/*`, will search
818+in that drive, regardless of any `cwd` option provided.
819+
820+If the pattern starts with `/`, and is not a UNC path, and there
821+is an explicit `cwd` option set with a drive letter, then the
822+drive letter in the `cwd` is used as the root of the directory
823+traversal.
824+
825+For example, `glob('/tmp', { cwd: 'c:/any/thing' })` will return
826+`['c:/tmp']` as the result.
827+
828+If an explicit `cwd` option is not provided, and the pattern
829+starts with `/`, then the traversal will run on the root of the
830+drive provided as the `cwd` option. (That is, it is the result of
831+`path.resolve('/')`.)
832+
833+## Race Conditions
834+
835+Glob searching, by its very nature, is susceptible to race
836+conditions, since it relies on directory walking.
837+
838+As a result, it is possible that a file that exists when glob
839+looks for it may have been deleted or modified by the time it
840+returns the result.
841+
842+By design, this implementation caches all readdir calls that it
843+makes, in order to cut down on system overhead. However, this
844+also makes it even more susceptible to races, especially if the
845+cache object is reused between glob calls.
846+
847+Users are thus advised not to use a glob result as a guarantee of
848+filesystem state in the face of rapid changes. For the vast
849+majority of operations, this is never a problem.
850+
851+### See Also:
852+
853+- `man sh`
854+- `man bash` [Pattern
855+ Matching](https://www.gnu.org/software/bash/manual/html_node/Pattern-Matching.html)
856+- `man 3 fnmatch`
857+- `man 5 gitignore`
858+- [minimatch documentation](https://github.com/isaacs/minimatch)
859+
860+## Glob Logo
861+
862+Glob's logo was created by [Tanya
863+Brassie](http://tanyabrassie.com/). Logo files can be found
864+[here](https://github.com/isaacs/node-glob/tree/master/logo).
865+
866+The logo is licensed under a [Creative Commons
867+Attribution-ShareAlike 4.0 International
868+License](https://creativecommons.org/licenses/by-sa/4.0/).
869+
870+## Contributing
871+
872+Any change to behavior (including bugfixes) must come with a
873+test.
874+
875+Patches that fail tests or reduce performance will be rejected.
876+
877+```sh
878+# to run tests
879+npm test
880+
881+# to re-generate test fixtures
882+npm run test-regen
883+
884+# run the benchmarks
885+npm run bench
886+
887+# to profile javascript
888+npm run prof
889+```
890+
891+## Comparison to Other JavaScript Glob Implementations
892+
893+**tl;dr**
894+
895+- If you want glob matching that is as faithful as possible to
896+ Bash pattern expansion semantics, and as fast as possible
897+ within that constraint, _use this module_.
898+- If you are reasonably sure that the patterns you will encounter
899+ are relatively simple, and want the absolutely fastest glob
900+ matcher out there, _use [fast-glob](http://npm.im/fast-glob)_.
901+- If you are reasonably sure that the patterns you will encounter
902+ are relatively simple, and want the convenience of
903+ automatically respecting `.gitignore` files, _use
904+ [globby](http://npm.im/globby)_.
905+
906+There are some other glob matcher libraries on npm, but these
907+three are (in my opinion, as of 2023) the best.
908+
909+---
910+
911+**full explanation**
912+
913+Every library reflects a set of opinions and priorities in the
914+trade-offs it makes. Other than this library, I can personally
915+recommend both [globby](http://npm.im/globby) and
916+[fast-glob](http://npm.im/fast-glob), though they differ in their
917+benefits and drawbacks.
918+
919+Both have very nice APIs and are reasonably fast.
920+
921+`fast-glob` is, as far as I am aware, the fastest glob
922+implementation in JavaScript today. However, there are many
923+cases where the choices that `fast-glob` makes in pursuit of
924+speed mean that its results differ from the results returned by
925+Bash and other sh-like shells, which may be surprising.
926+
927+In my testing, `fast-glob` is around 10-20% faster than this
928+module when walking over 200k files nested 4 directories
929+deep[1](#fn-webscale). However, there are some inconsistencies
930+with Bash matching behavior that this module does not suffer
931+from:
932+
933+- `**` only matches files, not directories
934+- `..` path portions are not handled unless they appear at the
935+ start of the pattern
936+- `./!(<pattern>)` will not match any files that _start_ with
937+ `<pattern>`, even if they do not match `<pattern>`. For
938+ example, `!(9).txt` will not match `9999.txt`.
939+- Some brace patterns in the middle of a pattern will result in
940+ failing to find certain matches.
941+- Extglob patterns are allowed to contain `/` characters.
942+
943+Globby exhibits all of the same pattern semantics as fast-glob,
944+(as it is a wrapper around fast-glob) and is slightly slower than
945+node-glob (by about 10-20% in the benchmark test set, or in other
946+words, anywhere from 20-50% slower than fast-glob). However, it
947+adds some API conveniences that may be worth the costs.
948+
949+- Support for `.gitignore` and other ignore files.
950+- Support for negated globs (ie, patterns starting with `!`
951+ rather than using a separate `ignore` option).
952+
953+The priority of this module is "correctness" in the sense of
954+performing a glob pattern expansion as faithfully as possible to
955+the behavior of Bash and other sh-like shells, with as much speed
956+as possible.
957+
958+Note that prior versions of `node-glob` are _not_ on this list.
959+Former versions of this module are far too slow for any cases
960+where performance matters at all, and were designed with APIs
961+that are extremely dated by current JavaScript standards.
962+
963+---
964+
965+<small id="fn-webscale">[1]: In the cases where this module
966+returns results and `fast-glob` doesn't, it's even faster, of
967+course.</small>
968+
969+![lumpy space princess saying 'oh my GLOB'](https://github.com/isaacs/node-glob/raw/main/oh-my-glob.gif)
970+
971+### Benchmark Results
972+
973+First number is time, smaller is better.
974+
975+Second number is the count of results returned.
976+
977+```
978+--- pattern: '**' ---
979+~~ sync ~~
980+node fast-glob sync 0m0.598s 200364
981+node globby sync 0m0.765s 200364
982+node current globSync mjs 0m0.683s 222656
983+node current glob syncStream 0m0.649s 222656
984+~~ async ~~
985+node fast-glob async 0m0.350s 200364
986+node globby async 0m0.509s 200364
987+node current glob async mjs 0m0.463s 222656
988+node current glob stream 0m0.411s 222656
989+
990+--- pattern: '**/..' ---
991+~~ sync ~~
992+node fast-glob sync 0m0.486s 0
993+node globby sync 0m0.769s 200364
994+node current globSync mjs 0m0.564s 2242
995+node current glob syncStream 0m0.583s 2242
996+~~ async ~~
997+node fast-glob async 0m0.283s 0
998+node globby async 0m0.512s 200364
999+node current glob async mjs 0m0.299s 2242
1000+node current glob stream 0m0.312s 2242
1001+
1002+--- pattern: './**/0/**/0/**/0/**/0/**/*.txt' ---
1003+~~ sync ~~
1004+node fast-glob sync 0m0.490s 10
1005+node globby sync 0m0.517s 10
1006+node current globSync mjs 0m0.540s 10
1007+node current glob syncStream 0m0.550s 10
1008+~~ async ~~
1009+node fast-glob async 0m0.290s 10
1010+node globby async 0m0.296s 10
1011+node current glob async mjs 0m0.278s 10
1012+node current glob stream 0m0.302s 10
1013+
1014+--- pattern: './**/[01]/**/[12]/**/[23]/**/[45]/**/*.txt' ---
1015+~~ sync ~~
1016+node fast-glob sync 0m0.500s 160
1017+node globby sync 0m0.528s 160
1018+node current globSync mjs 0m0.556s 160
1019+node current glob syncStream 0m0.573s 160
1020+~~ async ~~
1021+node fast-glob async 0m0.283s 160
1022+node globby async 0m0.301s 160
1023+node current glob async mjs 0m0.306s 160
1024+node current glob stream 0m0.322s 160
1025+
1026+--- pattern: './**/0/**/0/**/*.txt' ---
1027+~~ sync ~~
1028+node fast-glob sync 0m0.502s 5230
1029+node globby sync 0m0.527s 5230
1030+node current globSync mjs 0m0.544s 5230
1031+node current glob syncStream 0m0.557s 5230
1032+~~ async ~~
1033+node fast-glob async 0m0.285s 5230
1034+node globby async 0m0.305s 5230
1035+node current glob async mjs 0m0.304s 5230
1036+node current glob stream 0m0.310s 5230
1037+
1038+--- pattern: '**/*.txt' ---
1039+~~ sync ~~
1040+node fast-glob sync 0m0.580s 200023
1041+node globby sync 0m0.771s 200023
1042+node current globSync mjs 0m0.685s 200023
1043+node current glob syncStream 0m0.649s 200023
1044+~~ async ~~
1045+node fast-glob async 0m0.349s 200023
1046+node globby async 0m0.509s 200023
1047+node current glob async mjs 0m0.427s 200023
1048+node current glob stream 0m0.388s 200023
1049+
1050+--- pattern: '{**/*.txt,**/?/**/*.txt,**/?/**/?/**/*.txt,**/?/**/?/**/?/**/*.txt,**/?/**/?/**/?/**/?/**/*.txt}' ---
1051+~~ sync ~~
1052+node fast-glob sync 0m0.589s 200023
1053+node globby sync 0m0.771s 200023
1054+node current globSync mjs 0m0.716s 200023
1055+node current glob syncStream 0m0.684s 200023
1056+~~ async ~~
1057+node fast-glob async 0m0.351s 200023
1058+node globby async 0m0.518s 200023
1059+node current glob async mjs 0m0.462s 200023
1060+node current glob stream 0m0.468s 200023
1061+
1062+--- pattern: '**/5555/0000/*.txt' ---
1063+~~ sync ~~
1064+node fast-glob sync 0m0.496s 1000
1065+node globby sync 0m0.519s 1000
1066+node current globSync mjs 0m0.539s 1000
1067+node current glob syncStream 0m0.567s 1000
1068+~~ async ~~
1069+node fast-glob async 0m0.285s 1000
1070+node globby async 0m0.299s 1000
1071+node current glob async mjs 0m0.305s 1000
1072+node current glob stream 0m0.301s 1000
1073+
1074+--- pattern: './**/0/**/../[01]/**/0/../**/0/*.txt' ---
1075+~~ sync ~~
1076+node fast-glob sync 0m0.484s 0
1077+node globby sync 0m0.507s 0
1078+node current globSync mjs 0m0.577s 4880
1079+node current glob syncStream 0m0.586s 4880
1080+~~ async ~~
1081+node fast-glob async 0m0.280s 0
1082+node globby async 0m0.298s 0
1083+node current glob async mjs 0m0.327s 4880
1084+node current glob stream 0m0.324s 4880
1085+
1086+--- pattern: '**/????/????/????/????/*.txt' ---
1087+~~ sync ~~
1088+node fast-glob sync 0m0.547s 100000
1089+node globby sync 0m0.673s 100000
1090+node current globSync mjs 0m0.626s 100000
1091+node current glob syncStream 0m0.618s 100000
1092+~~ async ~~
1093+node fast-glob async 0m0.315s 100000
1094+node globby async 0m0.414s 100000
1095+node current glob async mjs 0m0.366s 100000
1096+node current glob stream 0m0.345s 100000
1097+
1098+--- pattern: './{**/?{/**/?{/**/?{/**/?,,,,},,,,},,,,},,,}/**/*.txt' ---
1099+~~ sync ~~
1100+node fast-glob sync 0m0.588s 100000
1101+node globby sync 0m0.670s 100000
1102+node current globSync mjs 0m0.717s 200023
1103+node current glob syncStream 0m0.687s 200023
1104+~~ async ~~
1105+node fast-glob async 0m0.343s 100000
1106+node globby async 0m0.418s 100000
1107+node current glob async mjs 0m0.519s 200023
1108+node current glob stream 0m0.451s 200023
1109+
1110+--- pattern: '**/!(0|9).txt' ---
1111+~~ sync ~~
1112+node fast-glob sync 0m0.573s 160023
1113+node globby sync 0m0.731s 160023
1114+node current globSync mjs 0m0.680s 180023
1115+node current glob syncStream 0m0.659s 180023
1116+~~ async ~~
1117+node fast-glob async 0m0.345s 160023
1118+node globby async 0m0.476s 160023
1119+node current glob async mjs 0m0.427s 180023
1120+node current glob stream 0m0.388s 180023
1121+
1122+--- pattern: './{*/**/../{*/**/../{*/**/../{*/**/../{*/**,,,,},,,,},,,,},,,,},,,,}/*.txt' ---
1123+~~ sync ~~
1124+node fast-glob sync 0m0.483s 0
1125+node globby sync 0m0.512s 0
1126+node current globSync mjs 0m0.811s 200023
1127+node current glob syncStream 0m0.773s 200023
1128+~~ async ~~
1129+node fast-glob async 0m0.280s 0
1130+node globby async 0m0.299s 0
1131+node current glob async mjs 0m0.617s 200023
1132+node current glob stream 0m0.568s 200023
1133+
1134+--- pattern: './*/**/../*/**/../*/**/../*/**/../*/**/../*/**/../*/**/../*/**/*.txt' ---
1135+~~ sync ~~
1136+node fast-glob sync 0m0.485s 0
1137+node globby sync 0m0.507s 0
1138+node current globSync mjs 0m0.759s 200023
1139+node current glob syncStream 0m0.740s 200023
1140+~~ async ~~
1141+node fast-glob async 0m0.281s 0
1142+node globby async 0m0.297s 0
1143+node current glob async mjs 0m0.544s 200023
1144+node current glob stream 0m0.464s 200023
1145+
1146+--- pattern: './*/**/../*/**/../*/**/../*/**/../*/**/*.txt' ---
1147+~~ sync ~~
1148+node fast-glob sync 0m0.486s 0
1149+node globby sync 0m0.513s 0
1150+node current globSync mjs 0m0.734s 200023
1151+node current glob syncStream 0m0.696s 200023
1152+~~ async ~~
1153+node fast-glob async 0m0.286s 0
1154+node globby async 0m0.296s 0
1155+node current glob async mjs 0m0.506s 200023
1156+node current glob stream 0m0.483s 200023
1157+
1158+--- pattern: './0/**/../1/**/../2/**/../3/**/../4/**/../5/**/../6/**/../7/**/*.txt' ---
1159+~~ sync ~~
1160+node fast-glob sync 0m0.060s 0
1161+node globby sync 0m0.074s 0
1162+node current globSync mjs 0m0.067s 0
1163+node current glob syncStream 0m0.066s 0
1164+~~ async ~~
1165+node fast-glob async 0m0.060s 0
1166+node globby async 0m0.075s 0
1167+node current glob async mjs 0m0.066s 0
1168+node current glob stream 0m0.067s 0
1169+
1170+--- pattern: './**/?/**/?/**/?/**/?/**/*.txt' ---
1171+~~ sync ~~
1172+node fast-glob sync 0m0.568s 100000
1173+node globby sync 0m0.651s 100000
1174+node current globSync mjs 0m0.619s 100000
1175+node current glob syncStream 0m0.617s 100000
1176+~~ async ~~
1177+node fast-glob async 0m0.332s 100000
1178+node globby async 0m0.409s 100000
1179+node current glob async mjs 0m0.372s 100000
1180+node current glob stream 0m0.351s 100000
1181+
1182+--- pattern: '**/*/**/*/**/*/**/*/**' ---
1183+~~ sync ~~
1184+node fast-glob sync 0m0.603s 200113
1185+node globby sync 0m0.798s 200113
1186+node current globSync mjs 0m0.730s 222137
1187+node current glob syncStream 0m0.693s 222137
1188+~~ async ~~
1189+node fast-glob async 0m0.356s 200113
1190+node globby async 0m0.525s 200113
1191+node current glob async mjs 0m0.508s 222137
1192+node current glob stream 0m0.455s 222137
1193+
1194+--- pattern: './**/*/**/*/**/*/**/*/**/*.txt' ---
1195+~~ sync ~~
1196+node fast-glob sync 0m0.622s 200000
1197+node globby sync 0m0.792s 200000
1198+node current globSync mjs 0m0.722s 200000
1199+node current glob syncStream 0m0.695s 200000
1200+~~ async ~~
1201+node fast-glob async 0m0.369s 200000
1202+node globby async 0m0.527s 200000
1203+node current glob async mjs 0m0.502s 200000
1204+node current glob stream 0m0.481s 200000
1205+
1206+--- pattern: '**/*.txt' ---
1207+~~ sync ~~
1208+node fast-glob sync 0m0.588s 200023
1209+node globby sync 0m0.771s 200023
1210+node current globSync mjs 0m0.684s 200023
1211+node current glob syncStream 0m0.658s 200023
1212+~~ async ~~
1213+node fast-glob async 0m0.352s 200023
1214+node globby async 0m0.516s 200023
1215+node current glob async mjs 0m0.432s 200023
1216+node current glob stream 0m0.384s 200023
1217+
1218+--- pattern: './**/**/**/**/**/**/**/**/*.txt' ---
1219+~~ sync ~~
1220+node fast-glob sync 0m0.589s 200023
1221+node globby sync 0m0.766s 200023
1222+node current globSync mjs 0m0.682s 200023
1223+node current glob syncStream 0m0.652s 200023
1224+~~ async ~~
1225+node fast-glob async 0m0.352s 200023
1226+node globby async 0m0.523s 200023
1227+node current glob async mjs 0m0.436s 200023
1228+node current glob stream 0m0.380s 200023
1229+
1230+--- pattern: '**/*/*.txt' ---
1231+~~ sync ~~
1232+node fast-glob sync 0m0.592s 200023
1233+node globby sync 0m0.776s 200023
1234+node current globSync mjs 0m0.691s 200023
1235+node current glob syncStream 0m0.659s 200023
1236+~~ async ~~
1237+node fast-glob async 0m0.357s 200023
1238+node globby async 0m0.513s 200023
1239+node current glob async mjs 0m0.471s 200023
1240+node current glob stream 0m0.424s 200023
1241+
1242+--- pattern: '**/*/**/*.txt' ---
1243+~~ sync ~~
1244+node fast-glob sync 0m0.585s 200023
1245+node globby sync 0m0.766s 200023
1246+node current globSync mjs 0m0.694s 200023
1247+node current glob syncStream 0m0.664s 200023
1248+~~ async ~~
1249+node fast-glob async 0m0.350s 200023
1250+node globby async 0m0.514s 200023
1251+node current glob async mjs 0m0.472s 200023
1252+node current glob stream 0m0.424s 200023
1253+
1254+--- pattern: '**/[0-9]/**/*.txt' ---
1255+~~ sync ~~
1256+node fast-glob sync 0m0.544s 100000
1257+node globby sync 0m0.636s 100000
1258+node current globSync mjs 0m0.626s 100000
1259+node current glob syncStream 0m0.621s 100000
1260+~~ async ~~
1261+node fast-glob async 0m0.322s 100000
1262+node globby async 0m0.404s 100000
1263+node current glob async mjs 0m0.360s 100000
1264+node current glob stream 0m0.352s 100000
1265+```
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