diff --git a/.gitignore b/.gitignore
index 29059e39..ecfad040 100644
--- a/.gitignore
+++ b/.gitignore
@@ -28,3 +28,5 @@ tmp
# Logs
logs/
mise.log
+
+curl
\ No newline at end of file
diff --git a/README.md b/README.md
new file mode 100644
index 00000000..135eaefc
--- /dev/null
+++ b/README.md
@@ -0,0 +1,70 @@
+# Niki
+
+---
+
+## Prerequisites
+
+- **Go 1.25.4** (Ensure your Go version matches this requirement)
+- **Docker 20.10+** (or higher)
+- **Git**
+
+---
+
+## Installation
+
+### 1. Configure Go Module Mirror
+
+To accelerate dependency downloads, set the Go module mirror to **Megan** (Iranian Go mirror):
+
+```url
+https://megan.ir/hub/go
+```
+
+### 2. Install Dependencies
+
+```bash
+go mod tidy
+go mod vendor
+```
+
+### 3. Configure Environment
+
+Copy the example environment file and customize it:
+
+```bash
+cp .env.example .env
+```
+
+---
+
+## Running the Application
+
+### 1. Start Services
+
+Launch the database and Redis services using Docker Compose:
+
+```bash
+docker compose up -d
+```
+
+> 🌐 *Docker images are sourced from [Arvan Cloud's Docker repositories](https://www.arvancloud.ir/fa/dev/docker). Ensure
+your environment has access to these repositories.*
+
+### 2. Apply Database Migrations
+
+Initialize the database schema:
+
+```bash
+go run main.go --migrate
+```
+
+### 3. Start the Application
+
+Run the application in development mode:
+
+```bash
+go run main.go
+```
+
+> ✨ **Alternative**: Use the provided `Makefile` for streamlined execution:
+> [Makefile](Makefile)
diff --git a/benefactorapp/app.go b/benefactorapp/app.go
new file mode 100644
index 00000000..3a01a26f
--- /dev/null
+++ b/benefactorapp/app.go
@@ -0,0 +1,8 @@
+package benefactorapp
+
+import "net/http"
+
+type Application struct {
+ Config Config
+ HTTPServer *http.Server
+}
diff --git a/benefactorapp/config.go b/benefactorapp/config.go
new file mode 100644
index 00000000..de3d3f88
--- /dev/null
+++ b/benefactorapp/config.go
@@ -0,0 +1,11 @@
+package benefactorapp
+
+type Config struct {
+ // HTTP server config
+
+ // Database config
+
+ // Logger config
+
+ // Service config
+}
diff --git a/benefactorapp/delivery/http/handler.go b/benefactorapp/delivery/http/handler.go
new file mode 100644
index 00000000..e9549c3c
--- /dev/null
+++ b/benefactorapp/delivery/http/handler.go
@@ -0,0 +1,17 @@
+package http
+
+import (
+ "net/http"
+
+ "github.com/labstack/echo/v4"
+)
+
+type Handler struct{}
+
+func NewHandler() *Handler {
+ return &Handler{}
+}
+
+func (h Handler) HealthCheck(c echo.Context) error {
+ return c.JSON(http.StatusOK, map[string]string{"status": "ok"})
+}
diff --git a/benefactorapp/delivery/http/route.go b/benefactorapp/delivery/http/route.go
new file mode 100644
index 00000000..d02cfda6
--- /dev/null
+++ b/benefactorapp/delivery/http/route.go
@@ -0,0 +1 @@
+package http
diff --git a/benefactorapp/delivery/http/server.go b/benefactorapp/delivery/http/server.go
new file mode 100644
index 00000000..c5adfb44
--- /dev/null
+++ b/benefactorapp/delivery/http/server.go
@@ -0,0 +1,23 @@
+package http
+
+import httpserver "git.gocasts.ir/ebhomengo/niki/delivery/http_server"
+
+type Server struct {
+ HTTPServer *httpserver.Server
+ Handler *Handler
+}
+
+func NewServer(httpserver *httpserver.Server) *Server {
+ return &Server{
+ HTTPServer: httpserver,
+ Handler: NewHandler(),
+ }
+}
+
+func (s *Server) Serve() {
+
+}
+
+func (s *Server) Stop() {}
+
+func (s *Server) RegisterRoutes() {}
diff --git a/benefactorapp/repository/database/db.go b/benefactorapp/repository/database/db.go
new file mode 100644
index 00000000..5d07c611
--- /dev/null
+++ b/benefactorapp/repository/database/db.go
@@ -0,0 +1,13 @@
+package database
+
+import "git.gocasts.ir/ebhomengo/niki/repository/mysql"
+
+type DB struct {
+ conn *mysql.DB
+}
+
+func New(conn *mysql.DB) *DB {
+ return &DB{
+ conn: conn,
+ }
+}
diff --git a/benefactorapp/service/entity.go b/benefactorapp/service/entity.go
new file mode 100644
index 00000000..6d43c336
--- /dev/null
+++ b/benefactorapp/service/entity.go
@@ -0,0 +1 @@
+package service
diff --git a/benefactorapp/service/param.go b/benefactorapp/service/param.go
new file mode 100644
index 00000000..6d43c336
--- /dev/null
+++ b/benefactorapp/service/param.go
@@ -0,0 +1 @@
+package service
diff --git a/benefactorapp/service/service.go b/benefactorapp/service/service.go
new file mode 100644
index 00000000..6d43c336
--- /dev/null
+++ b/benefactorapp/service/service.go
@@ -0,0 +1 @@
+package service
diff --git a/benefactorapp/service/validator.go b/benefactorapp/service/validator.go
new file mode 100644
index 00000000..6d43c336
--- /dev/null
+++ b/benefactorapp/service/validator.go
@@ -0,0 +1 @@
+package service
diff --git a/deploy/benefactor/development/.env.example b/deploy/benefactor/development/.env.example
new file mode 100644
index 00000000..e69de29b
diff --git a/deploy/benefactor/development/Dockerfile b/deploy/benefactor/development/Dockerfile
new file mode 100644
index 00000000..e69de29b
diff --git a/deploy/benefactor/development/config.yml b/deploy/benefactor/development/config.yml
new file mode 100644
index 00000000..e69de29b
diff --git a/deploy/benefactor/development/docker-compose.yml b/deploy/benefactor/development/docker-compose.yml
new file mode 100644
index 00000000..e69de29b
diff --git a/docker-compose.yaml b/docker-compose.yaml
index 0d75fc25..b5d7f03a 100644
--- a/docker-compose.yaml
+++ b/docker-compose.yaml
@@ -19,7 +19,7 @@ services:
# - "niki-redis"
niki-mariadb:
- image: docker.io/bitnami/mariadb:11.1
+ image: bitnami/mariadb:11.1
container_name: niki-mariadb
restart: always
ports:
diff --git a/go.mod b/go.mod
index 1fa1a6bc..42258236 100644
--- a/go.mod
+++ b/go.mod
@@ -1,24 +1,24 @@
module git.gocasts.ir/ebhomengo/niki
-go 1.23
+go 1.25.4
require (
- github.com/brianvoe/gofakeit/v7 v7.1.2
+ github.com/brianvoe/gofakeit/v7 v7.14.1
github.com/go-ozzo/ozzo-validation v3.6.0+incompatible
github.com/go-ozzo/ozzo-validation/v4 v4.3.0
- github.com/go-sql-driver/mysql v1.8.1
- github.com/golang-jwt/jwt/v4 v4.5.0
- github.com/kavenegar/kavenegar-go v0.0.0-20221124112814-40341057b5ca
+ github.com/go-sql-driver/mysql v1.9.3
+ github.com/golang-jwt/jwt/v4 v4.5.2
+ github.com/kavenegar/kavenegar-go v0.0.0-20240205151018-77039f51467d
github.com/knadh/koanf v1.5.0
- github.com/labstack/echo-jwt/v4 v4.2.0
- github.com/labstack/echo/v4 v4.12.0
- github.com/ory/dockertest/v3 v3.11.0
- github.com/redis/go-redis/v9 v9.4.0
- github.com/rubenv/sql-migrate v1.6.0
- github.com/stretchr/testify v1.9.0
- github.com/swaggo/echo-swagger v1.4.1
- github.com/swaggo/swag v1.16.3
- golang.org/x/crypto v0.23.0
+ github.com/labstack/echo-jwt/v4 v4.4.0
+ github.com/labstack/echo/v4 v4.15.1
+ github.com/ory/dockertest/v3 v3.12.0
+ github.com/redis/go-redis/v9 v9.18.0
+ github.com/rubenv/sql-migrate v1.8.1
+ github.com/stretchr/testify v1.11.1
+ github.com/swaggo/echo-swagger v1.5.2
+ github.com/swaggo/swag v1.16.6
+ golang.org/x/crypto v0.46.0
gopkg.in/natefinch/lumberjack.v2 v2.2.1
)
@@ -31,54 +31,60 @@ require (
github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 // indirect
github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496 // indirect
github.com/cenkalti/backoff/v4 v4.3.0 // indirect
- github.com/cespare/xxhash/v2 v2.2.0 // indirect
- github.com/containerd/continuity v0.4.3 // indirect
+ github.com/cespare/xxhash/v2 v2.3.0 // indirect
+ github.com/containerd/continuity v0.4.5 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
- github.com/docker/cli v26.1.4+incompatible // indirect
+ github.com/docker/cli v27.4.1+incompatible // indirect
github.com/docker/docker v27.1.1+incompatible // indirect
github.com/docker/go-connections v0.5.0 // indirect
github.com/docker/go-units v0.5.0 // indirect
github.com/fatih/structs v1.1.0 // indirect
- github.com/fsnotify/fsnotify v1.7.0 // indirect
- github.com/ghodss/yaml v1.0.0 // indirect
+ github.com/fsnotify/fsnotify v1.4.9 // indirect
github.com/go-gorp/gorp/v3 v3.1.0 // indirect
- github.com/go-openapi/jsonpointer v0.21.0 // indirect
- github.com/go-openapi/jsonreference v0.21.0 // indirect
- github.com/go-openapi/spec v0.21.0 // indirect
- github.com/go-openapi/swag v0.23.0 // indirect
+ github.com/go-openapi/jsonpointer v0.19.6 // indirect
+ github.com/go-openapi/jsonreference v0.20.2 // indirect
+ github.com/go-openapi/spec v0.20.9 // indirect
+ github.com/go-openapi/swag v0.22.3 // indirect
+ github.com/go-viper/mapstructure/v2 v2.1.0 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
- github.com/golang-jwt/jwt v3.2.2+incompatible // indirect
- github.com/golang-jwt/jwt/v5 v5.0.0 // indirect
+ github.com/golang-jwt/jwt/v5 v5.3.0 // indirect
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect
github.com/josharian/intern v1.0.0 // indirect
github.com/labstack/gommon v0.4.2 // indirect
github.com/mailru/easyjson v0.7.7 // indirect
- github.com/mattn/go-colorable v0.1.13 // indirect
+ github.com/mattn/go-colorable v0.1.14 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/mitchellh/copystructure v1.2.0 // indirect
github.com/mitchellh/mapstructure v1.5.0 // indirect
github.com/mitchellh/reflectwalk v1.0.2 // indirect
github.com/moby/docker-image-spec v1.3.1 // indirect
+ github.com/moby/sys/user v0.3.0 // indirect
github.com/moby/term v0.5.0 // indirect
github.com/opencontainers/go-digest v1.0.0 // indirect
github.com/opencontainers/image-spec v1.1.0 // indirect
- github.com/opencontainers/runc v1.1.13 // indirect
+ github.com/opencontainers/runc v1.2.3 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/sirupsen/logrus v1.9.3 // indirect
github.com/stretchr/objx v0.5.2 // indirect
+ github.com/sv-tools/openapi v0.2.1 // indirect
github.com/swaggo/files/v2 v2.0.0 // indirect
+ github.com/swaggo/swag/v2 v2.0.0-rc4 // indirect
github.com/valyala/bytebufferpool v1.0.0 // indirect
github.com/valyala/fasttemplate v1.2.2 // indirect
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect
github.com/xeipuuv/gojsonschema v1.2.0 // indirect
- golang.org/x/net v0.25.0 // indirect
- golang.org/x/sys v0.21.0 // indirect
- golang.org/x/text v0.15.0 // indirect
- golang.org/x/time v0.5.0 // indirect
- golang.org/x/tools v0.21.0 // indirect
+ go.uber.org/atomic v1.11.0 // indirect
+ golang.org/x/mod v0.30.0 // indirect
+ golang.org/x/net v0.48.0 // indirect
+ golang.org/x/sync v0.19.0 // indirect
+ golang.org/x/sys v0.39.0 // indirect
+ golang.org/x/text v0.32.0 // indirect
+ golang.org/x/time v0.14.0 // indirect
+ golang.org/x/tools v0.39.0 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
+ sigs.k8s.io/yaml v1.3.0 // indirect
)
diff --git a/go.sum b/go.sum
index 91d3d30c..940950dd 100644
--- a/go.sum
+++ b/go.sum
@@ -39,8 +39,8 @@ github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
-github.com/brianvoe/gofakeit/v7 v7.1.2 h1:vSKaVScNhWVpf1rlyEKSvO8zKZfuDtGqoIHT//iNNb8=
-github.com/brianvoe/gofakeit/v7 v7.1.2/go.mod h1:QXuPeBw164PJCzCUZVmgpgHJ3Llj49jSLVkKPMtxtxA=
+github.com/brianvoe/gofakeit/v7 v7.14.1 h1:a7fe3fonbj0cW3wgl5VwIKfZtiH9C3cLnwcIXWT7sow=
+github.com/brianvoe/gofakeit/v7 v7.14.1/go.mod h1:QXuPeBw164PJCzCUZVmgpgHJ3Llj49jSLVkKPMtxtxA=
github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=
github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=
github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=
@@ -49,15 +49,16 @@ github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK3
github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
-github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
-github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
+github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
+github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
-github.com/containerd/continuity v0.4.3 h1:6HVkalIp+2u1ZLH1J/pYX2oBVXlJZvh1X1A7bEZ9Su8=
-github.com/containerd/continuity v0.4.3/go.mod h1:F6PTNCKepoxEaXLQp3wDAjygEnImnZ/7o4JzpodfroQ=
+github.com/containerd/continuity v0.4.5 h1:ZRoN1sXq9u7V6QoHMcVWGhOwDFqZ4B9i5H6un1Wh0x4=
+github.com/containerd/continuity v0.4.5/go.mod h1:/lNJvtJKUQStBzpVQ1+rasXO1LAWtUQssk28EZvJ3nE=
github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
+github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY=
github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@@ -65,8 +66,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=
-github.com/docker/cli v26.1.4+incompatible h1:I8PHdc0MtxEADqYJZvhBrW9bo8gawKwwenxRM7/rLu8=
-github.com/docker/cli v26.1.4+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=
+github.com/docker/cli v27.4.1+incompatible h1:VzPiUlRJ/xh+otB75gva3r05isHMo5wXDfPRi5/b4hI=
+github.com/docker/cli v27.4.1+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=
github.com/docker/docker v27.1.1+incompatible h1:hO/M4MtV36kzKldqnA37IWhebRA+LnqqcqDja6kVaKY=
github.com/docker/docker v27.1.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c=
@@ -83,10 +84,8 @@ github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5Kwzbycv
github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=
github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo=
github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M=
+github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
-github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
-github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
-github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk=
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
github.com/go-gorp/gorp/v3 v3.1.0 h1:ItKF/Vbuj31dmV4jxA1qblpSwkl9g1typ24xoe70IGs=
github.com/go-gorp/gorp/v3 v3.1.0/go.mod h1:dLEjIyyRNiXvNZ8PSmzpt1GsWAUK8kjVhEpjH8TixEw=
@@ -97,32 +96,37 @@ github.com/go-ldap/ldap v3.0.2+incompatible/go.mod h1:qfd9rJvER9Q0/D/Sqn1DfHRoBp
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
-github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ=
-github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY=
-github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ=
-github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4=
-github.com/go-openapi/spec v0.21.0 h1:LTVzPc3p/RzRnkQqLRndbAzjY0d0BCL72A6j3CdL9ZY=
-github.com/go-openapi/spec v0.21.0/go.mod h1:78u6VdPw81XU44qEWGhtr982gJ5BWg2c0I5XwVMotYk=
-github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE=
-github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ=
+github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
+github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
+github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE=
+github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs=
+github.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo=
+github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE=
+github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k=
+github.com/go-openapi/spec v0.20.9 h1:xnlYNQAwKd2VQRRfwTEI0DcK+2cbuvI/0c7jx3gA8/8=
+github.com/go-openapi/spec v0.20.9/go.mod h1:2OpW+JddWPrpXSCIX8eOx7lZ5iyuWj3RYR6VaaBKcWA=
+github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
+github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ=
+github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g=
+github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14=
github.com/go-ozzo/ozzo-validation v3.6.0+incompatible h1:msy24VGS42fKO9K1vLz82/GeYW1cILu7Nuuj1N3BBkE=
github.com/go-ozzo/ozzo-validation v3.6.0+incompatible/go.mod h1:gsEKFIVnabGBt6mXmxK0MoFy+cZoTJY6mu5Ll3LVLBU=
github.com/go-ozzo/ozzo-validation/v4 v4.3.0 h1:byhDUpfEwjsVQb1vBunvIjh2BHQ9ead57VkAEY4V+Es=
github.com/go-ozzo/ozzo-validation/v4 v4.3.0/go.mod h1:2NKgrcHl3z6cJs+3Oo940FPRiTzuqKbvfrL2RxCj6Ew=
-github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y=
-github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg=
+github.com/go-sql-driver/mysql v1.9.3 h1:U/N249h2WzJ3Ukj8SowVFjdtZKfu9vlLZxjPXV1aweo=
+github.com/go-sql-driver/mysql v1.9.3/go.mod h1:qn46aNg1333BRMNU69Lq93t8du/dwxI64Gl8i5p1WMU=
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
github.com/go-test/deep v1.0.2-0.20181118220953-042da051cf31/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA=
+github.com/go-viper/mapstructure/v2 v2.1.0 h1:gHnMa2Y/pIxElCH2GlZZ1lZSsn6XMtufpGyP1XxdC/w=
+github.com/go-viper/mapstructure/v2 v2.1.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM=
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
-github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY=
-github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I=
-github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg=
-github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
-github.com/golang-jwt/jwt/v5 v5.0.0 h1:1n1XNM9hk7O9mnQoNBGolZvzebBQ7p93ULHRc28XJUE=
-github.com/golang-jwt/jwt/v5 v5.0.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk=
+github.com/golang-jwt/jwt/v4 v4.5.2 h1:YtQM7lnr8iZ+j5q71MGKkNw9Mn7AjHM68uc9g5fXeUI=
+github.com/golang-jwt/jwt/v4 v4.5.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
+github.com/golang-jwt/jwt/v5 v5.3.0 h1:pv4AsKCKKZuqlgs5sUmn4x8UlGa0kEVt/puTpKx9vvo=
+github.com/golang-jwt/jwt/v5 v5.3.0/go.mod h1:fxCRLWMO43lRc8nhHWY6LGqRcf+1gQWArsqaEUEa5bE=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
@@ -206,10 +210,12 @@ github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/
github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
-github.com/kavenegar/kavenegar-go v0.0.0-20221124112814-40341057b5ca h1:aEyiDaExheG7fNpEYcILCVGgM7jlLzTVgxEQAGaepeM=
-github.com/kavenegar/kavenegar-go v0.0.0-20221124112814-40341057b5ca/go.mod h1:CRhvvr4KNAyrg+ewrutOf+/QoHs7lztSoLjp+GqhYlA=
+github.com/kavenegar/kavenegar-go v0.0.0-20240205151018-77039f51467d h1:5yPyBSS28Nojbr7pAkiXADGj6VpTXx73o6SsprKbSoo=
+github.com/kavenegar/kavenegar-go v0.0.0-20240205151018-77039f51467d/go.mod h1:CRhvvr4KNAyrg+ewrutOf+/QoHs7lztSoLjp+GqhYlA=
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
+github.com/klauspost/cpuid/v2 v2.0.9 h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4=
+github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
github.com/knadh/koanf v1.5.0 h1:q2TSd/3Pyc/5yP9ldIrSdIz26MCcyNQzW0pEAugLPNs=
github.com/knadh/koanf v1.5.0/go.mod h1:Hgyjp4y8v44hpZtPzs7JZfRAW5AhN7KfZcwv1RYggDs=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
@@ -217,37 +223,40 @@ github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxv
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
+github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
-github.com/labstack/echo-jwt/v4 v4.2.0 h1:odSISV9JgcSCuhgQSV/6Io3i7nUmfM/QkBeR5GVJj5c=
-github.com/labstack/echo-jwt/v4 v4.2.0/go.mod h1:MA2RqdXdEn4/uEglx0HcUOgQSyBaTh5JcaHIan3biwU=
-github.com/labstack/echo/v4 v4.12.0 h1:IKpw49IMryVB2p1a4dzwlhP1O2Tf2E0Ir/450lH+kI0=
-github.com/labstack/echo/v4 v4.12.0/go.mod h1:UP9Cr2DJXbOK3Kr9ONYzNowSh7HP0aG0ShAyycHSJvM=
+github.com/labstack/echo-jwt/v4 v4.4.0 h1:nrXaEnJupfc2R4XChcLRDyghhMZup77F8nIzHnBK19U=
+github.com/labstack/echo-jwt/v4 v4.4.0/go.mod h1:kYXWgWms9iFqI3ldR+HAEj/Zfg5rZtR7ePOgktG4Hjg=
+github.com/labstack/echo/v4 v4.15.1 h1:S9keusg26gZpjMmPqB5hOEvNKnmd1lNmcHrbbH2lnFs=
+github.com/labstack/echo/v4 v4.15.1/go.mod h1:xmw1clThob0BSVRX1CRQkGQ/vjwcpOMjQZSZa9fKA/c=
github.com/labstack/gommon v0.4.2 h1:F8qTUNXgG1+6WQmqoUWnz8WiEU60mXVVw0P4ht1WRA0=
github.com/labstack/gommon v0.4.2/go.mod h1:QlUFxVM+SNXhDL/Z7YhocGIBYOiwB0mXm1+1bAPHPyU=
github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw=
github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
+github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
+github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
+github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
-github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
-github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
+github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE=
+github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8=
github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=
github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
-github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
-github.com/mattn/go-sqlite3 v1.14.15 h1:vfoHhTN1af61xCRSWzFIWzx2YskyMTwHLrExkBOjvxI=
-github.com/mattn/go-sqlite3 v1.14.15/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg=
+github.com/mattn/go-sqlite3 v1.14.19 h1:fhGleo2h1p8tVChob4I9HpmVFIAkKGpiukdrgQbWfGI=
+github.com/mattn/go-sqlite3 v1.14.19/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg=
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=
github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=
@@ -269,6 +278,8 @@ github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zx
github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw=
github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0=
github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo=
+github.com/moby/sys/user v0.3.0 h1:9ni5DlcW5an3SvRSx4MouotOygvzaXbaSrc/wGDFWPo=
+github.com/moby/sys/user v0.3.0/go.mod h1:bG+tYYYJgaMtRKgEmuueC0hJEAZWwtIbZTB+85uoHjs=
github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0=
github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
@@ -277,16 +288,17 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lN
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
+github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
github.com/npillmayer/nestext v0.1.3/go.mod h1:h2lrijH8jpicr25dFY+oAJLyzlya6jhnuG+zWp9L0Uk=
github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA=
github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug=
github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM=
-github.com/opencontainers/runc v1.1.13 h1:98S2srgG9vw0zWcDpFMn5TRrh8kLxa/5OFUstuUhmRs=
-github.com/opencontainers/runc v1.1.13/go.mod h1:R016aXacfp/gwQBYw2FDGa9m+n6atbLWrYY8hNMT/sA=
-github.com/ory/dockertest/v3 v3.11.0 h1:OiHcxKAvSDUwsEVh2BjxQQc/5EHz9n0va9awCtNGuyA=
-github.com/ory/dockertest/v3 v3.11.0/go.mod h1:VIPxS1gwT9NpPOrfD3rACs8Y9Z7yhzO4SB194iUDnUI=
+github.com/opencontainers/runc v1.2.3 h1:fxE7amCzfZflJO2lHXf4y/y8M1BoAqp+FVmG19oYB80=
+github.com/opencontainers/runc v1.2.3/go.mod h1:nSxcWUydXrsBZVYNSkTjoQ/N6rcyTtn+1SD5D4+kRIM=
+github.com/ory/dockertest/v3 v3.12.0 h1:3oV9d0sDzlSQfHtIaB5k6ghUCVMVLpAY8hwrqoCyRCw=
+github.com/ory/dockertest/v3 v3.12.0/go.mod h1:aKNDTva3cp8dwOWwb9cWuX84aH5akkxXRvO7KCwWVjE=
github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
github.com/pelletier/go-toml v1.7.0 h1:7utD74fnzVc/cpcyy8sjrlFr5vYpypUixARcHIMIGuI=
@@ -317,14 +329,14 @@ github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R
github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
-github.com/redis/go-redis/v9 v9.4.0 h1:Yzoz33UZw9I/mFhx4MNrB6Fk+XHO1VukNcCa1+lwyKk=
-github.com/redis/go-redis/v9 v9.4.0/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=
+github.com/redis/go-redis/v9 v9.18.0 h1:pMkxYPkEbMPwRdenAzUNyFNrDgHx9U+DrBabWNfSRQs=
+github.com/redis/go-redis/v9 v9.18.0/go.mod h1:k3ufPphLU5YXwNTUcCRXGxUoF1fqxnhFQmscfkCoDA0=
github.com/rhnvrm/simples3 v0.6.1/go.mod h1:Y+3vYm2V7Y4VijFoJHHTrja6OgPrJ2cBti8dPGkC3sA=
github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
-github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M=
-github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA=
-github.com/rubenv/sql-migrate v1.6.0 h1:IZpcTlAx/VKXphWEpwWJ7BaMq05tYtE80zYz+8a5Il8=
-github.com/rubenv/sql-migrate v1.6.0/go.mod h1:m3ilnKP7sNb4eYkLsp6cGdPOl4OBcXM6rcbzU+Oqc5k=
+github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
+github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
+github.com/rubenv/sql-migrate v1.8.1 h1:EPNwCvjAowHI3TnZ+4fQu3a915OpnQoPAjTXCGOy2U0=
+github.com/rubenv/sql-migrate v1.8.1/go.mod h1:BTIKBORjzyxZDS6dzoiw6eAFYJ1iNlGAtjn4LGeVjS8=
github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc=
@@ -338,21 +350,31 @@ github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
+github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=
github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
+github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
-github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
-github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
-github.com/swaggo/echo-swagger v1.4.1 h1:Yf0uPaJWp1uRtDloZALyLnvdBeoEL5Kc7DtnjzO/TUk=
-github.com/swaggo/echo-swagger v1.4.1/go.mod h1:C8bSi+9yH2FLZsnhqMZLIZddpUxZdBYuNHbtaS1Hljc=
+github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
+github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
+github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
+github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
+github.com/sv-tools/openapi v0.2.1 h1:ES1tMQMJFGibWndMagvdoo34T1Vllxr1Nlm5wz6b1aA=
+github.com/sv-tools/openapi v0.2.1/go.mod h1:k5VuZamTw1HuiS9p2Wl5YIDWzYnHG6/FgPOSFXLAhGg=
+github.com/swaggo/echo-swagger v1.5.2 h1:KUM4QuEO1r/maky6Ybb9wS5MFEkJUpXwPbK4wwBe5Uk=
+github.com/swaggo/echo-swagger v1.5.2/go.mod h1:nt3Z+SlyzXNIQ4odFNlPzRdcNOFvkPJHf+t4sMLhNu4=
github.com/swaggo/files/v2 v2.0.0 h1:hmAt8Dkynw7Ssz46F6pn8ok6YmGZqHSVLZ+HQM7i0kw=
github.com/swaggo/files/v2 v2.0.0/go.mod h1:24kk2Y9NYEJ5lHuCra6iVwkMjIekMCaFq/0JQj66kyM=
-github.com/swaggo/swag v1.16.3 h1:PnCYjPCah8FK4I26l2F/KQ4yz3sILcVUN3cTlBFA9Pg=
-github.com/swaggo/swag v1.16.3/go.mod h1:DImHIuOFXKpMFAQjcC7FG4m3Dg4+QuUgUzJmKjI/gRk=
+github.com/swaggo/swag v1.16.6 h1:qBNcx53ZaX+M5dxVyTrgQ0PJ/ACK+NzhwcbieTt+9yI=
+github.com/swaggo/swag v1.16.6/go.mod h1:ngP2etMK5a0P3QBizic5MEwpRmluJZPHjXcMoj4Xesg=
+github.com/swaggo/swag/v2 v2.0.0-rc4 h1:SZ8cK68gcV6cslwrJMIOqPkJELRwq4gmjvk77MrvHvY=
+github.com/swaggo/swag/v2 v2.0.0-rc4/go.mod h1:Ow7Y8gF16BTCDn8YxZbyKn8FkMLRUHekv1kROJZpbvE=
github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo=
@@ -367,10 +389,14 @@ github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQ
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
+github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0=
+github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA=
go.etcd.io/etcd/api/v3 v3.5.4/go.mod h1:5GB2vv4A4AOn3yk7MftYGHkUfGtDHnEraIjym4dYz5A=
go.etcd.io/etcd/client/pkg/v3 v3.5.4/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g=
go.etcd.io/etcd/client/v3 v3.5.4/go.mod h1:ZaRkVgBZC+L+dLCjTcF1hRXpgZXQPOvnA/Ak/gq3kiY=
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
+go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE=
+go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0=
go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo=
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
@@ -378,8 +404,8 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk
golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI=
-golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8=
+golang.org/x/crypto v0.46.0 h1:cKRW/pmt1pKAfetfu+RCEvjvZkA9RimPbh7bhFjGVBU=
+golang.org/x/crypto v0.46.0/go.mod h1:Evb/oLKmMraqjZ2iQTwDwvCtJkczlDuTmdJXoZVzqU0=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
@@ -389,8 +415,8 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
-golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA=
-golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
+golang.org/x/mod v0.30.0 h1:fDEXFVZ/fmCKProc/yAXXUijritrDzahmwwefnjoPFk=
+golang.org/x/mod v0.30.0/go.mod h1:lAsf5O2EvJeSFMiBxXDki7sCgAxEUcZHXoXMKT4GJKc=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -408,8 +434,8 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=
-golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac=
-golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM=
+golang.org/x/net v0.48.0 h1:zyQRTTrjc33Lhh0fBgT/H3oZq9WuvRR5gPC70xpDiQU=
+golang.org/x/net v0.48.0/go.mod h1:+ndRgGjkh8FGtu1w1FGbEC31if4VrNVMuKTgcAAnQRY=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -422,8 +448,8 @@ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJ
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M=
-golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
+golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4=
+golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -456,10 +482,9 @@ golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws=
-golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.39.0 h1:CvCKL8MeisomCi6qNZ+wbb0DN9E5AATixKsvNtMoMFk=
+golang.org/x/sys v0.39.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20181227161524-e6919f6577db/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
@@ -467,11 +492,11 @@ golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
-golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk=
-golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
+golang.org/x/text v0.32.0 h1:ZD01bjUt1FQ9WJ0ClOL5vxgxOI/sVCNgX1YtKwcY0mU=
+golang.org/x/text v0.32.0/go.mod h1:o/rUWzghvpD5TXrTIBuJU77MTaN0ljMWE47kxGJQ7jY=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk=
-golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
+golang.org/x/time v0.14.0 h1:MRx4UaLrDotUKUdCIqzPC48t1Y9hANFKIRpNx+Te8PI=
+golang.org/x/time v0.14.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
@@ -483,8 +508,8 @@ golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapK
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
-golang.org/x/tools v0.21.0 h1:qc0xYgIbsSDt9EyWz05J5wfa7LOVW0YTLOXrqdLAWIw=
-golang.org/x/tools v0.21.0/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk=
+golang.org/x/tools v0.39.0 h1:ik4ho21kwuQln40uelmciQPp9SipgNDdrafrYA4TmQQ=
+golang.org/x/tools v0.39.0/go.mod h1:JnefbkDPyD8UU2kI5fuf8ZX4/yUeh9W877ZeBONxUqQ=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@@ -519,7 +544,9 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d/go.mod h1:cuepJuh7vyXfUyUwEgHQXw849cJrilpS5NeIjOWESAw=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=
@@ -535,6 +562,7 @@ gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
@@ -543,3 +571,5 @@ gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU=
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=
+sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo=
+sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8=
diff --git a/repository/mysql/migration/1730029129_add_update_benefactor_access.sql b/repository/mysql/migration/1730029129_add_update_benefactor_access.sql
index 9ea7d774..41d468d2 100644
--- a/repository/mysql/migration/1730029129_add_update_benefactor_access.sql
+++ b/repository/mysql/migration/1730029129_add_update_benefactor_access.sql
@@ -1,36 +1,36 @@
-- +migrate Up
-ALTER TABLE `admin_access_controls` MODIFY COLUMN `permission`
- enum (
- 'admin-register',
- 'kindboxreq-accept',
- 'kindboxreq-reject',
- 'kindboxreq-getall',
- 'kindboxreq-deliver',
- 'kindboxreq-assign_sender_agent',
- 'admin-getall_agent',
- 'kindboxreq-get_awaiting_delivery',
- 'kindbox-get',
- 'kindboxreq-add',
- 'kindbox-assign_receiver_agent',
- 'kindbox-getall',
- 'kindboxreq-update',
- 'kindboxreq-get',
- 'kindbox-get_awaiting_return',
- 'kindbox-return',
- 'kindbox-enumerate',
- 'kindbox-update',
- 'benefactor-getall',
- 'benefactor-get',
- 'benefactor-update',
- 'benefactor-update-status'
- ) NOT NULL;
+ALTER TABLE `admin_access_controls`
+ MODIFY COLUMN `permission`
+ enum (
+ 'admin-register',
+ 'kindboxreq-accept',
+ 'kindboxreq-reject',
+ 'kindboxreq-getall',
+ 'kindboxreq-deliver',
+ 'kindboxreq-assign_sender_agent',
+ 'admin-getall_agent',
+ 'kindboxreq-get_awaiting_delivery',
+ 'kindbox-get',
+ 'kindboxreq-add',
+ 'kindbox-assign_receiver_agent',
+ 'kindbox-getall',
+ 'kindboxreq-update',
+ 'kindboxreq-get',
+ 'kindbox-get_awaiting_return',
+ 'kindbox-return',
+ 'kindbox-enumerate',
+ 'kindbox-update',
+ 'benefactor-getall',
+ 'benefactor-get',
+ 'benefactor-update',
+ 'benefactor-update-status'
+ ) NOT NULL;
INSERT INTO `admin_access_controls` (`actor_id`, `actor_type`, `permission`)
VALUES (1, 'role', 'benefactor-update'),
-VALUES (2, 'role', 'benefactor-update'),
-VALUES (1, 'role', 'benefactor-update-status'),
-VALUES (2, 'role', 'benefactor-update-status');
-
+ (2, 'role', 'benefactor-update'),
+ (1, 'role', 'benefactor-update-status'),
+ (2, 'role', 'benefactor-update-status');
-- +migrate Down
DELETE
FROM `admin_access_controls`;
\ No newline at end of file
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/BENCHMARKS.md b/vendor/github.com/brianvoe/gofakeit/v7/BENCHMARKS.md
index 0f6776c5..35e5c815 100644
--- a/vendor/github.com/brianvoe/gofakeit/v7/BENCHMARKS.md
+++ b/vendor/github.com/brianvoe/gofakeit/v7/BENCHMARKS.md
@@ -7,317 +7,356 @@ Table generated with tablesgenerator.com/markdown_tables File->Paste table data
| Benchmark | Ops | CPU | MEM | MEM alloc |
|---------------------------------------|----------|----------------|--------------|------------------|
-| BenchmarkAddress-10 | 1369538 | 874.7 ns/op | 195 B/op | 5 allocs/op |
-| BenchmarkStreet-10 | 3438403 | 347.9 ns/op | 25 B/op | 2 allocs/op |
-| BenchmarkStreetNumber-10 | 8601847 | 138.2 ns/op | 4 B/op | 1 allocs/op |
-| BenchmarkStreetPrefix-10 | 19814623 | 60.26 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkStreetName-10 | 19633909 | 60.78 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkStreetSuffix-10 | 19717612 | 60.19 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkCity-10 | 20219280 | 58.88 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkState-10 | 19526760 | 60.85 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkStateAbr-10 | 19634631 | 60.79 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkZip-10 | 7521580 | 157.7 ns/op | 5 B/op | 1 allocs/op |
-| BenchmarkCountry-10 | 19451166 | 61.29 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkCountryAbr-10 | 19585867 | 60.82 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkLatitude-10 | 72309668 | 16.22 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkLongitude-10 | 72334910 | 16.23 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkLatitudeInRange-10 | 65830375 | 17.77 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkLongitudeInRange-10 | 66400602 | 17.77 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkPetName-10 | 30391768 | 39.19 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkAnimal-10 | 28761544 | 41.22 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkAnimalType-10 | 26955640 | 44.13 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkFarmAnimal-10 | 22307872 | 53.39 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkCat-10 | 24226416 | 49.13 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkDog-10 | 19702195 | 60.53 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkBird-10 | 17095884 | 70.22 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkAppName-10 | 3805696 | 314.4 ns/op | 25 B/op | 1 allocs/op |
-| BenchmarkAppVersion-10 | 10250247 | 116.4 ns/op | 7 B/op | 1 allocs/op |
-| BenchmarkAppAuthor-10 | 11592895 | 101.2 ns/op | 8 B/op | 0 allocs/op |
-| BenchmarkUsername-10 | 8975020 | 132.9 ns/op | 16 B/op | 2 allocs/op |
-| BenchmarkPassword-10 | 322147 | 3647 ns/op | 1656 B/op | 60 allocs/op |
-| BenchmarkBeerName-10 | 27986706 | 42.27 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkBeerStyle-10 | 19460616 | 60.99 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkBeerHop-10 | 26915132 | 44.35 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkBeerYeast-10 | 24840991 | 47.98 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkBeerMalt-10 | 20806075 | 57.18 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkBeerIbu-10 | 41349307 | 28.99 ns/op | 8 B/op | 1 allocs/op |
-| BenchmarkBeerAlcohol-10 | 6054163 | 197.8 ns/op | 28 B/op | 2 allocs/op |
-| BenchmarkBeerBlg-10 | 5825622 | 205.6 ns/op | 37 B/op | 2 allocs/op |
-| BenchmarkBook-10 | 6927696 | 171.9 ns/op | 48 B/op | 1 allocs/op |
-| BenchmarkBookTitle-10 | 31594431 | 37.36 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkBookAuthor-10 | 29969000 | 39.91 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkBookGenre-10 | 24269676 | 48.77 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkCar-10 | 3795943 | 316.3 ns/op | 96 B/op | 1 allocs/op |
-| BenchmarkCarType-10 | 26309082 | 43.81 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkCarFuelType-10 | 26414821 | 45.18 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkCarTransmissionType-10 | 24309171 | 48.83 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkCarMaker-10 | 23505099 | 51.01 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkCarModel-10 | 19055469 | 62.82 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkCelebrityActor-10 | 19915483 | 57.84 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkCelebrityBusiness-10 | 20186090 | 67.55 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkCelebritySport-10 | 14223360 | 84.47 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkColor-10 | 21535978 | 54.16 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkNiceColors-10 | 71414755 | 16.16 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkSafeColor-10 | 24683570 | 46.53 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkHexColor-10 | 4815675 | 250.3 ns/op | 24 B/op | 3 allocs/op |
-| BenchmarkRGBColor-10 | 19453399 | 61.67 ns/op | 24 B/op | 1 allocs/op |
-| BenchmarkCompany-10 | 25604892 | 46.66 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkCompanySuffix-10 | 24647574 | 48.83 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkBlurb-10 | 20634126 | 58.88 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkBuzzWord-10 | 23034157 | 51.84 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkBS-10 | 21803314 | 55.08 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkJob-10 | 4121804 | 292.0 ns/op | 64 B/op | 1 allocs/op |
-| BenchmarkJobTitle-10 | 24344308 | 47.51 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkJobDescriptor-10 | 24049240 | 50.12 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkJobLevel-10 | 19349389 | 62.45 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkSlogan-10 | 4499653 | 263.1 ns/op | 41 B/op | 1 allocs/op |
-| BenchmarkCSVLookup100-10 | 1184 | 1014597 ns/op | 713620 B/op | 9923 allocs/op |
-| BenchmarkEmoji-10 | 24200866 | 49.72 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkEmojiDescription-10 | 22978600 | 52.18 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkEmojiCategory-10 | 21228057 | 56.57 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkEmojiAlias-10 | 17616240 | 68.45 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkEmojiTag-10 | 19253190 | 62.21 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkError-10 | 1637725 | 736.5 ns/op | 288 B/op | 8 allocs/op |
-| BenchmarkErrorObject-10 | 6755540 | 177.7 ns/op | 32 B/op | 3 allocs/op |
-| BenchmarkErrorDatabase-10 | 5794706 | 200.2 ns/op | 63 B/op | 3 allocs/op |
-| BenchmarkErrorGRPC-10 | 6063802 | 196.8 ns/op | 64 B/op | 3 allocs/op |
-| BenchmarkErrorHTTP-10 | 3956130 | 302.2 ns/op | 158 B/op | 4 allocs/op |
-| BenchmarkErrorHTTPClient-10 | 6025258 | 196.4 ns/op | 52 B/op | 3 allocs/op |
-| BenchmarkErrorHTTPServer-10 | 5969395 | 202.1 ns/op | 59 B/op | 3 allocs/op |
-| BenchmarkErrorRuntime-10 | 4786108 | 248.3 ns/op | 150 B/op | 3 allocs/op |
-| BenchmarkErrorValidation-10 | 1811821 | 667.8 ns/op | 277 B/op | 7 allocs/op |
-| BenchmarkFileMimeType-10 | 26273320 | 45.47 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkFileExtension-10 | 22216770 | 53.94 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkCusip-10 | 6778542 | 176.4 ns/op | 16 B/op | 1 allocs/op |
-| BenchmarkIsin-10 | 1844566 | 652.1 ns/op | 525 B/op | 7 allocs/op |
-| BenchmarkFruit-10 | 20381516 | 58.81 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkVegetable-10 | 19638996 | 61.11 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkBreakfast-10 | 9425649 | 127.2 ns/op | 32 B/op | 1 allocs/op |
-| BenchmarkLunch-10 | 8996594 | 133.6 ns/op | 34 B/op | 1 allocs/op |
-| BenchmarkDinner-10 | 9427389 | 126.6 ns/op | 36 B/op | 1 allocs/op |
-| BenchmarkDrink-10 | 8552294 | 140.4 ns/op | 7 B/op | 2 allocs/op |
-| BenchmarkSnack-10 | 7678719 | 156.7 ns/op | 32 B/op | 1 allocs/op |
-| BenchmarkDessert-10 | 8907098 | 134.0 ns/op | 31 B/op | 2 allocs/op |
-| BenchmarkGamertag-10 | 2474312 | 483.9 ns/op | 83 B/op | 5 allocs/op |
-| BenchmarkDice-10 | 47727080 | 25.22 ns/op | 8 B/op | 1 allocs/op |
-| BenchmarkGenerate/package-10 | 423741 | 2822 ns/op | 1187 B/op | 29 allocs/op |
-| BenchmarkGenerate/Complex-10 | 138112 | 8653 ns/op | 4553 B/op | 80 allocs/op |
-| BenchmarkFixedWidthLookup100-10 | 2072 | 583512 ns/op | 489975 B/op | 8701 allocs/op |
-| BenchmarkRegex-10 | 633699 | 1914 ns/op | 1632 B/op | 27 allocs/op |
-| BenchmarkRegexEmail-10 | 205447 | 5893 ns/op | 4084 B/op | 90 allocs/op |
-| BenchmarkMap-10 | 337576 | 3596 ns/op | 1111 B/op | 16 allocs/op |
-| BenchmarkHackerPhrase-10 | 166683 | 7209 ns/op | 3107 B/op | 50 allocs/op |
-| BenchmarkHackerAbbreviation-10 | 25295019 | 47.33 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkHackerAdjective-10 | 24022460 | 49.76 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkHackerNoun-10 | 22496308 | 53.31 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkHackerVerb-10 | 18546052 | 64.53 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkHackeringVerb-10 | 20298242 | 59.05 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkReplaceWithNumbers-10 | 1402717 | 852.8 ns/op | 296 B/op | 10 allocs/op |
-| BenchmarkHipsterWord-10 | 25151432 | 47.83 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkHipsterSentence-10 | 1314279 | 907.8 ns/op | 288 B/op | 3 allocs/op |
-| BenchmarkHipsterParagraph-10 | 67437 | 17682 ns/op | 10521 B/op | 48 allocs/op |
-| BenchmarkInputName-10 | 20759898 | 57.98 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkSvg-10 | 225738 | 5181 ns/op | 8876 B/op | 52 allocs/op |
-| BenchmarkImageURL-10 | 15524359 | 77.15 ns/op | 38 B/op | 3 allocs/op |
-| BenchmarkImage-10 | 63 | 18773091 ns/op | 2457691 B/op | 307202 allocs/op |
-| BenchmarkImageJpeg-10 | 39 | 29498291 ns/op | 2982478 B/op | 307217 allocs/op |
-| BenchmarkImagePng-10 | 16 | 68552771 ns/op | 5899010 B/op | 307270 allocs/op |
-| BenchmarkDomainName-10 | 3001479 | 402.2 ns/op | 95 B/op | 5 allocs/op |
-| BenchmarkDomainSuffix-10 | 21476332 | 56.03 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkURL-10 | 1289262 | 934.6 ns/op | 277 B/op | 10 allocs/op |
-| BenchmarkHTTPMethod-10 | 19895946 | 60.56 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkIPv4Address-10 | 6088518 | 196.5 ns/op | 16 B/op | 1 allocs/op |
-| BenchmarkIPv6Address-10 | 2580320 | 462.0 ns/op | 111 B/op | 8 allocs/op |
-| BenchmarkMacAddress-10 | 3281300 | 364.7 ns/op | 24 B/op | 1 allocs/op |
-| BenchmarkHTTPStatusCode-10 | 16597051 | 72.18 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkHTTPStatusCodeSimple-10 | 17250238 | 69.52 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkLogLevel-10 | 20608036 | 58.20 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkUserAgent-10 | 1946059 | 615.5 ns/op | 298 B/op | 5 allocs/op |
-| BenchmarkChromeUserAgent-10 | 2619324 | 458.2 ns/op | 184 B/op | 5 allocs/op |
-| BenchmarkFirefoxUserAgent-10 | 1601706 | 753.8 ns/op | 362 B/op | 6 allocs/op |
-| BenchmarkSafariUserAgent-10 | 1569805 | 764.4 ns/op | 551 B/op | 7 allocs/op |
-| BenchmarkOperaUserAgent-10 | 2378972 | 504.7 ns/op | 212 B/op | 5 allocs/op |
-| BenchmarkJSONLookup100-10 | 928 | 1276230 ns/op | 813725 B/op | 12134 allocs/op |
-| BenchmarkLanguage-10 | 23873984 | 50.34 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkLanguageAbbreviation-10 | 25025524 | 47.93 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkLanguageBCP-10 | 21895112 | 54.74 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkProgrammingLanguage-10 | 21169636 | 56.70 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkLoremIpsumWord-10 | 23980356 | 49.92 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkLoremIpsumSentence-10 | 1344384 | 894.8 ns/op | 219 B/op | 2 allocs/op |
-| BenchmarkLoremIpsumParagraph-10 | 66643 | 17916 ns/op | 8483 B/op | 40 allocs/op |
-| BenchmarkMinecraftOre-10 | 15077451 | 79.85 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkMinecraftWood-10 | 14422303 | 83.44 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkMinecraftArmorTier-10 | 15262417 | 78.70 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkMinecraftArmorPart-10 | 15340200 | 78.11 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkMinecraftWeapon-10 | 15107792 | 79.78 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkMinecraftTool-10 | 14428170 | 83.15 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkMinecraftDye-10 | 14657188 | 81.95 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkMinecraftFood-10 | 14860236 | 81.01 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkMinecraftAnimal-10 | 15281302 | 78.35 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkMinecraftVillagerJob-10 | 14586627 | 82.14 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkMinecraftVillagerStation-10 | 14678592 | 81.82 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkMinecraftVillagerLevel-10 | 14314164 | 83.76 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkMinecraftMobPassive-10 | 15132750 | 79.32 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkMinecraftMobNeutral-10 | 13802880 | 87.23 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkMinecraftMobHostile-10 | 13141233 | 91.06 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkMinecraftMobBoss-10 | 15245322 | 78.79 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkMinecraftBiome-10 | 14943789 | 79.86 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkMinecraftWeather-10 | 12681386 | 94.55 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkBool-10 | 73596490 | 16.18 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkUUID-10 | 4128735 | 288.7 ns/op | 48 B/op | 1 allocs/op |
-| BenchmarkShuffleAnySlice-10 | 3149857 | 380.0 ns/op | 24 B/op | 1 allocs/op |
-| BenchmarkFlipACoin-10 | 74457853 | 16.17 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkMovie-10 | 9234234 | 129.3 ns/op | 32 B/op | 1 allocs/op |
-| BenchmarkMovieName-10 | 25314163 | 47.82 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkMovieGenre-10 | 24570799 | 48.81 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkNumber-10 | 74087221 | 16.21 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkUint8-10 | 73790145 | 16.35 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkUint16-10 | 74334474 | 16.27 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkUint32-10 | 71804154 | 16.72 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkUint64-10 | 71385904 | 16.64 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkUintRange-10 | 73982353 | 16.13 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkInt8-10 | 73927286 | 16.14 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkInt16-10 | 74022668 | 16.19 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkInt32-10 | 72009002 | 16.64 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkInt64-10 | 72375081 | 16.59 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkIntRange-10 | 74396306 | 16.20 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkFloat32-10 | 73950822 | 16.20 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkFloat32Range-10 | 73622833 | 16.18 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkFloat64-10 | 73076970 | 16.31 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkFloat64Range-10 | 73385329 | 16.33 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkShuffleInts-10 | 9151563 | 131.8 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkRandomInt-10 | 72188592 | 16.63 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkRandomUint-10 | 72293332 | 16.64 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkHexUint-10 | 14888452 | 80.93 ns/op | 16 B/op | 2 allocs/op |
-| BenchmarkCurrency-10 | 14366668 | 83.15 ns/op | 32 B/op | 1 allocs/op |
-| BenchmarkCurrencyShort-10 | 24445954 | 48.68 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkCurrencyLong-10 | 23560556 | 50.65 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkPrice-10 | 73693664 | 16.33 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkCreditCard-10 | 1000000 | 1153 ns/op | 264 B/op | 15 allocs/op |
-| BenchmarkCreditCardType-10 | 32410167 | 36.93 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkCreditCardNumber-10 | 1511084 | 799.1 ns/op | 183 B/op | 10 allocs/op |
-| BenchmarkCreditCardExp-10 | 11014600 | 108.5 ns/op | 5 B/op | 1 allocs/op |
-| BenchmarkCreditCardCvv-10 | 20325733 | 59.31 ns/op | 3 B/op | 1 allocs/op |
-| BenchmarkAchRouting-10 | 7338657 | 164.0 ns/op | 16 B/op | 1 allocs/op |
-| BenchmarkAchAccount-10 | 5646235 | 212.0 ns/op | 16 B/op | 1 allocs/op |
-| BenchmarkBitcoinAddress-10 | 517399 | 2306 ns/op | 715 B/op | 37 allocs/op |
-| BenchmarkBitcoinPrivateKey-10 | 1276884 | 943.2 ns/op | 184 B/op | 5 allocs/op |
-| BenchmarkName-10 | 7771977 | 152.6 ns/op | 16 B/op | 1 allocs/op |
-| BenchmarkFirstName-10 | 23523357 | 50.98 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkMiddleName-10 | 17589612 | 68.17 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkLastName-10 | 20825980 | 57.63 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkNamePrefix-10 | 25542308 | 46.65 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkNameSuffix-10 | 21972974 | 54.56 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkSSN-10 | 31829850 | 37.71 ns/op | 16 B/op | 1 allocs/op |
-| BenchmarkGender-10 | 73621140 | 16.25 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkHobby-10 | 17347129 | 69.06 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkPerson-10 | 317911 | 3693 ns/op | 837 B/op | 33 allocs/op |
-| BenchmarkContact-10 | 1843221 | 650.8 ns/op | 136 B/op | 6 allocs/op |
-| BenchmarkPhone-10 | 6786794 | 176.2 ns/op | 16 B/op | 1 allocs/op |
-| BenchmarkPhoneFormatted-10 | 4674930 | 256.2 ns/op | 16 B/op | 1 allocs/op |
-| BenchmarkEmail-10 | 2794358 | 431.1 ns/op | 88 B/op | 4 allocs/op |
-| BenchmarkTeams-10 | 1576238 | 763.8 ns/op | 672 B/op | 10 allocs/op |
-| BenchmarkProduct-10 | 206918 | 5813 ns/op | 1069 B/op | 31 allocs/op |
-| BenchmarkProductName-10 | 2313364 | 517.4 ns/op | 103 B/op | 5 allocs/op |
-| BenchmarkProductDescription-10 | 348346 | 3434 ns/op | 549 B/op | 8 allocs/op |
-| BenchmarkProductCategory-10 | 25139860 | 47.73 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkProductFeature-10 | 21264922 | 56.46 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkProductMaterial-10 | 18142828 | 66.24 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkProductUPC-10 | 1399148 | 859.1 ns/op | 96 B/op | 11 allocs/op |
-| BenchmarkSchool-10 | 4161710 | 287.6 ns/op | 34 B/op | 1 allocs/op |
-| BenchmarkLetter-10 | 73457020 | 16.29 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkLetterN-10 | 5060271 | 238.8 ns/op | 64 B/op | 2 allocs/op |
-| BenchmarkVowel-10 | 58685206 | 20.87 ns/op | 4 B/op | 1 allocs/op |
-| BenchmarkDigit-10 | 73944177 | 16.20 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkDigitN-10 | 5051070 | 236.6 ns/op | 64 B/op | 2 allocs/op |
-| BenchmarkNumerify-10 | 6794545 | 176.4 ns/op | 16 B/op | 1 allocs/op |
-| BenchmarkLexify-10 | 11113212 | 108.3 ns/op | 8 B/op | 1 allocs/op |
-| BenchmarkShuffleStrings-10 | 9924429 | 121.0 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkRandomString-10 | 73420688 | 16.34 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkTemplate-10 | 2488 | 477349 ns/op | 280877 B/op | 4611 allocs/op |
-| BenchmarkDate-10 | 10292476 | 116.2 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkPastDate-10 | 18285830 | 65.48 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkFutureDate-10 | 18399240 | 65.13 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkDateRange-10 | 8406979 | 142.7 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkMonth-10 | 74105902 | 16.26 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkMonthString-10 | 73647870 | 16.26 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkWeekDay-10 | 73990911 | 16.24 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkDay-10 | 73435291 | 16.21 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkYear-10 | 73950066 | 16.21 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkHour-10 | 74219916 | 16.21 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkMinute-10 | 74349634 | 16.21 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkSecond-10 | 73787313 | 16.29 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkNanoSecond-10 | 74299380 | 16.15 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkTimeZone-10 | 19105237 | 62.83 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkTimeZoneFull-10 | 16170054 | 74.27 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkTimeZoneAbv-10 | 20725029 | 58.23 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkTimeZoneOffset-10 | 14597666 | 81.13 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkTimeZoneRegion-10 | 15733551 | 76.25 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkWeighted-10 | 28507484 | 40.42 ns/op | 16 B/op | 1 allocs/op |
-| BenchmarkAdjective-10 | 6726474 | 178.3 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkAdjectiveDescriptive-10 | 16486224 | 73.39 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkAdjectiveQuantitative-10 | 15290762 | 78.51 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkAdjectiveProper-10 | 16535046 | 72.42 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkAdjectiveDemonstrative-10 | 16448917 | 73.41 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkAdjectivePossessive-10 | 15715839 | 73.22 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkAdjectiveInterrogative-10 | 15543478 | 77.43 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkAdjectiveIndefinite-10 | 16306894 | 73.50 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkAdverb-10 | 7139924 | 168.7 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkAdverbManner-10 | 17139112 | 70.37 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkAdverbDegree-10 | 16213138 | 73.70 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkAdverbPlace-10 | 17268267 | 69.67 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkAdverbTimeDefinite-10 | 16273309 | 73.70 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkAdverbTimeIndefinite-10 | 15822297 | 74.26 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkAdverbFrequencyDefinite-10 | 16344181 | 73.30 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkAdverbFrequencyIndefinite-10 | 16118569 | 74.27 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkComment-10 | 1000000 | 1146 ns/op | 258 B/op | 6 allocs/op |
-| BenchmarkConnective-10 | 7132710 | 168.3 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkConnectiveTime-10 | 15339457 | 78.08 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkConnectiveComparative-10 | 16188842 | 74.04 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkConnectiveComplaint-10 | 14127903 | 85.00 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkConnectiveListing-10 | 16073437 | 74.65 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkConnectiveCasual-10 | 13771904 | 87.06 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkConnectiveExamplify-10 | 15763296 | 76.03 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkWord-10 | 8047610 | 148.5 ns/op | 3 B/op | 0 allocs/op |
-| BenchmarkSentenceSimple-10 | 682924 | 1707 ns/op | 590 B/op | 11 allocs/op |
-| BenchmarkInterjection-10 | 16295702 | 73.50 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkNoun-10 | 6711976 | 179.3 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkNounCommon-10 | 17117466 | 69.83 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkNounConcrete-10 | 17144979 | 69.81 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkNounAbstract-10 | 16839790 | 71.16 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkNounCollectivePeople-10 | 16360652 | 73.24 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkNounCollectiveAnimal-10 | 16453287 | 72.79 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkNounCollectiveThing-10 | 16397232 | 72.97 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkNounCountable-10 | 17171895 | 69.78 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkNounUncountable-10 | 17193412 | 69.75 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkNounProper-10 | 10644372 | 112.0 ns/op | 7 B/op | 0 allocs/op |
-| BenchmarkNounDeterminer-10 | 17003730 | 70.44 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkPhrase-10 | 23481584 | 51.12 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkPhraseNoun-10 | 2961691 | 405.1 ns/op | 104 B/op | 2 allocs/op |
-| BenchmarkPhraseVerb-10 | 1422132 | 845.1 ns/op | 232 B/op | 6 allocs/op |
-| BenchmarkPhraseAdverb-10 | 7617193 | 153.3 ns/op | 9 B/op | 0 allocs/op |
-| BenchmarkPhrasePreposition-10 | 2336155 | 513.3 ns/op | 123 B/op | 3 allocs/op |
-| BenchmarkPreposition-10 | 9244665 | 129.9 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkPrepositionSimple-10 | 16397623 | 73.11 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkPrepositionDouble-10 | 16107751 | 74.19 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkPrepositionCompound-10 | 16364900 | 73.10 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkPronoun-10 | 6436707 | 186.4 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkPronounPersonal-10 | 16997427 | 70.53 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkPronounObject-10 | 15303380 | 78.27 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkPronounPossessive-10 | 15323908 | 78.10 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkPronounReflective-10 | 15258552 | 78.45 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkPronounIndefinite-10 | 16053780 | 74.69 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkPronounDemonstrative-10 | 16476726 | 72.73 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkPronounInterrogative-10 | 15526576 | 77.15 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkPronounRelative-10 | 14159284 | 84.64 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkSentence-10 | 721934 | 1642 ns/op | 219 B/op | 3 allocs/op |
-| BenchmarkParagraph-10 | 39356 | 30481 ns/op | 6687 B/op | 53 allocs/op |
-| BenchmarkQuestion-10 | 1757269 | 683.1 ns/op | 243 B/op | 3 allocs/op |
-| BenchmarkQuote-10 | 1522988 | 787.2 ns/op | 261 B/op | 3 allocs/op |
-| BenchmarkVerb-10 | 8924802 | 127.6 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkVerbAction-10 | 17150564 | 69.83 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkVerbTransitive-10 | 17328488 | 69.21 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkVerbIntransitive-10 | 16427985 | 72.98 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkVerbLinking-10 | 17754280 | 67.52 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkVerbHelping-10 | 17118238 | 70.31 ns/op | 0 B/op | 0 allocs/op |
-| BenchmarkXMLLookup100-10 | 937 | 1279022 ns/op | 862536 B/op | 11370 allocs/op |
\ No newline at end of file
+| BenchmarkAddress-10 | 1103170 | 1084 ns/op | 223 B/op | 6 allocs/op |
+| BenchmarkStreet-10 | 2678632 | 426.1 ns/op | 25 B/op | 2 allocs/op |
+| BenchmarkStreetNumber-10 | 7752144 | 154.4 ns/op | 4 B/op | 1 allocs/op |
+| BenchmarkStreetPrefix-10 | 14321246 | 84.29 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkStreetName-10 | 14315438 | 84.03 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkStreetSuffix-10 | 13827625 | 83.90 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkUnit-10 | 7394977 | 162.7 ns/op | 14 B/op | 2 allocs/op |
+| BenchmarkCity-10 | 14257396 | 84.31 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkState-10 | 14311333 | 83.57 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkStateAbr-10 | 14235634 | 84.14 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkZip-10 | 7180789 | 166.8 ns/op | 5 B/op | 1 allocs/op |
+| BenchmarkCountry-10 | 14644250 | 82.44 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkCountryAbr-10 | 14065713 | 83.73 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkLatitude-10 | 74722898 | 16.06 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkLongitude-10 | 74551914 | 16.04 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkLatitudeInRange-10 | 68917987 | 17.34 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkLongitudeInRange-10 | 68985835 | 17.37 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkAirlineAircraftType-10 | 13969006 | 85.89 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkAirlineAirplane-10 | 14245006 | 84.17 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkAirlineAirport-10 | 14062609 | 84.47 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkAirlineAirportIATA-10 | 14078275 | 85.46 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkAirlineFlightNumber-10 | 8181994 | 147.6 ns/op | 45 B/op | 4 allocs/op |
+| BenchmarkAirlineRecordLocator-10 | 8466958 | 142.1 ns/op | 23 B/op | 1 allocs/op |
+| BenchmarkAirlineSeat-10 | 14182210 | 84.84 ns/op | 19 B/op | 2 allocs/op |
+| BenchmarkPetName-10 | 14235944 | 82.89 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkAnimal-10 | 14401180 | 83.02 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkAnimalType-10 | 14429384 | 82.93 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkFarmAnimal-10 | 14249454 | 83.95 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkCat-10 | 14469751 | 83.29 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkDog-10 | 14395026 | 82.36 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkBird-10 | 14887028 | 82.10 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkAppName-10 | 3364251 | 351.7 ns/op | 25 B/op | 1 allocs/op |
+| BenchmarkAppVersion-10 | 10653699 | 112.7 ns/op | 7 B/op | 1 allocs/op |
+| BenchmarkAppAuthor-10 | 7753665 | 155.4 ns/op | 8 B/op | 0 allocs/op |
+| BenchmarkUsername-10 | 1387273 | 910.2 ns/op | 822 B/op | 13 allocs/op |
+| BenchmarkPassword-10 | 452104 | 2519 ns/op | 128 B/op | 2 allocs/op |
+| BenchmarkBeerName-10 | 14425518 | 82.98 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkBeerStyle-10 | 14450242 | 83.06 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkBeerHop-10 | 14424109 | 83.10 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkBeerYeast-10 | 14369450 | 84.90 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkBeerMalt-10 | 14445836 | 83.21 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkBeerIbu-10 | 43577666 | 27.39 ns/op | 8 B/op | 1 allocs/op |
+| BenchmarkBeerAlcohol-10 | 6503149 | 184.8 ns/op | 4 B/op | 1 allocs/op |
+| BenchmarkBeerBlg-10 | 6394459 | 187.2 ns/op | 13 B/op | 1 allocs/op |
+| BenchmarkBook-10 | 4396315 | 272.0 ns/op | 48 B/op | 1 allocs/op |
+| BenchmarkBookTitle-10 | 14470020 | 84.03 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkBookAuthor-10 | 14473611 | 83.25 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkBookGenre-10 | 14471212 | 83.33 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkCar-10 | 2628781 | 456.6 ns/op | 96 B/op | 1 allocs/op |
+| BenchmarkCarType-10 | 14205280 | 84.16 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkCarFuelType-10 | 14108670 | 83.96 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkCarTransmissionType-10 | 13697488 | 88.10 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkCarMaker-10 | 14143714 | 84.80 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkCarModel-10 | 14127410 | 84.76 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkCelebrityActor-10 | 13975066 | 85.48 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkCelebrityBusiness-10 | 14261449 | 84.07 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkCelebritySport-10 | 14069204 | 85.40 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkColor-10 | 14250574 | 84.13 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkNiceColors-10 | 100000000 | 11.42 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkSafeColor-10 | 14290966 | 84.07 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkHexColor-10 | 6276794 | 190.9 ns/op | 24 B/op | 3 allocs/op |
+| BenchmarkRGBColor-10 | 28464741 | 42.39 ns/op | 24 B/op | 1 allocs/op |
+| BenchmarkCompany-10 | 13964258 | 86.33 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkCompanySuffix-10 | 13848536 | 86.55 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkBlurb-10 | 13809465 | 88.33 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkBuzzWord-10 | 13909864 | 86.45 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkBS-10 | 13955137 | 86.23 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkJob-10 | 3353815 | 357.2 ns/op | 64 B/op | 1 allocs/op |
+| BenchmarkJobTitle-10 | 14383609 | 83.58 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkJobDescriptor-10 | 14196513 | 84.28 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkJobLevel-10 | 14159757 | 84.76 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkSlogan-10 | 3303717 | 340.9 ns/op | 41 B/op | 1 allocs/op |
+| BenchmarkCSVLookup100-10 | 1672 | 706289 ns/op | 831725 B/op | 10251 allocs/op |
+| BenchmarkDate-10 | 14483701 | 83.01 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkPastDate-10 | 24398281 | 49.04 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkFutureDate-10 | 24536008 | 48.87 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkDateRange-10 | 9339344 | 128.1 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkMonth-10 | 100000000 | 11.42 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkMonthString-10 | 98138764 | 12.11 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkWeekDay-10 | 98253607 | 12.13 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkDay-10 | 100000000 | 11.43 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkYear-10 | 100000000 | 11.44 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkHour-10 | 100000000 | 11.46 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkMinute-10 | 100000000 | 11.48 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkSecond-10 | 100000000 | 11.43 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkNanoSecond-10 | 100000000 | 11.55 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkTimeZone-10 | 14662479 | 81.60 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkTimeZoneFull-10 | 14709021 | 81.05 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkTimeZoneAbv-10 | 14627991 | 81.31 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkTimeZoneOffset-10 | 12801638 | 93.70 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkTimeZoneRegion-10 | 14714446 | 81.50 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkEmoji-10 | 10143355 | 118.7 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkEmojiCategory-10 | 14940362 | 81.38 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkEmojiAlias-10 | 14637633 | 82.16 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkEmojiTag-10 | 14625763 | 82.15 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkEmojiFlag-10 | 14470842 | 82.81 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkEmojiAnimal-10 | 14617693 | 82.11 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkEmojiFood-10 | 14477235 | 82.84 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkEmojiPlant-10 | 14502708 | 82.58 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkEmojiMusic-10 | 14580860 | 82.40 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkEmojiSentence-10 | 2058350 | 583.2 ns/op | 450 B/op | 7 allocs/op |
+| BenchmarkError-10 | 2990094 | 399.0 ns/op | 282 B/op | 6 allocs/op |
+| BenchmarkErrorObject-10 | 7202356 | 165.3 ns/op | 32 B/op | 3 allocs/op |
+| BenchmarkErrorDatabase-10 | 6873763 | 173.0 ns/op | 63 B/op | 3 allocs/op |
+| BenchmarkErrorGRPC-10 | 6894307 | 171.9 ns/op | 64 B/op | 3 allocs/op |
+| BenchmarkErrorHTTP-10 | 5222224 | 229.4 ns/op | 158 B/op | 4 allocs/op |
+| BenchmarkErrorHTTPClient-10 | 6889472 | 175.2 ns/op | 52 B/op | 3 allocs/op |
+| BenchmarkErrorHTTPServer-10 | 6682477 | 177.1 ns/op | 59 B/op | 3 allocs/op |
+| BenchmarkErrorRuntime-10 | 5930980 | 206.6 ns/op | 150 B/op | 3 allocs/op |
+| BenchmarkErrorValidation-10 | 3319014 | 358.1 ns/op | 274 B/op | 5 allocs/op |
+| BenchmarkFileMimeType-10 | 14300468 | 83.87 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkFileExtension-10 | 14363823 | 83.48 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkCusip-10 | 9081240 | 131.9 ns/op | 16 B/op | 1 allocs/op |
+| BenchmarkIsin-10 | 2656158 | 451.8 ns/op | 469 B/op | 4 allocs/op |
+| BenchmarkFruit-10 | 14394954 | 83.51 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkVegetable-10 | 14364404 | 83.47 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkBreakfast-10 | 10058257 | 117.5 ns/op | 39 B/op | 1 allocs/op |
+| BenchmarkLunch-10 | 10161496 | 118.3 ns/op | 41 B/op | 1 allocs/op |
+| BenchmarkDinner-10 | 10117947 | 117.6 ns/op | 43 B/op | 1 allocs/op |
+| BenchmarkDrink-10 | 10450734 | 113.9 ns/op | 16 B/op | 2 allocs/op |
+| BenchmarkSnack-10 | 10065492 | 119.0 ns/op | 39 B/op | 1 allocs/op |
+| BenchmarkDessert-10 | 10256098 | 118.2 ns/op | 38 B/op | 2 allocs/op |
+| BenchmarkGamertag-10 | 2809584 | 429.9 ns/op | 81 B/op | 5 allocs/op |
+| BenchmarkDice-10 | 69207811 | 17.31 ns/op | 8 B/op | 1 allocs/op |
+| BenchmarkGenerate/simple_single_function-10 | 3665461 | 325.1 ns/op | 270 B/op | 6 allocs/op |
+| BenchmarkGenerate/simple_multiple_functions-10 | 944131 | 1298 ns/op | 882 B/op | 16 allocs/op |
+| BenchmarkGenerate/function_with_params-10 | 1730911 | 691.4 ns/op | 1144 B/op | 16 allocs/op |
+| BenchmarkGenerate/multiple_functions_with_params-10 | 537613 | 2206 ns/op | 2721 B/op | 37 allocs/op |
+| BenchmarkGenerate/mixed_letters_numbers-10 | 9572214 | 125.2 ns/op | 32 B/op | 2 allocs/op |
+| BenchmarkGenerate/complex_mixed-10 | 543666 | 2158 ns/op | 2310 B/op | 32 allocs/op |
+| BenchmarkGenerate/no_replacements-10 | 12480820 | 95.38 ns/op | 192 B/op | 4 allocs/op |
+| BenchmarkGenerate/many_functions-10 | 233031 | 5238 ns/op | 3486 B/op | 54 allocs/op |
+| BenchmarkGenerate/nested_params-10 | 1316234 | 906.3 ns/op | 1373 B/op | 23 allocs/op |
+| BenchmarkGenerate/nested_complex-10 | 1000000 | 1068 ns/op | 1745 B/op | 25 allocs/op |
+| BenchmarkGenerate/bio_template-10 | 733396 | 1648 ns/op | 1472 B/op | 20 allocs/op |
+| BenchmarkGenerate/sentence_template-10 | 3021042 | 407.2 ns/op | 488 B/op | 8 allocs/op |
+| BenchmarkGenerate/long_string_many_replacements-10 | 306052 | 3878 ns/op | 3586 B/op | 44 allocs/op |
+| BenchmarkFixedWidthLookup100-10 | 3188 | 368023 ns/op | 453353 B/op | 6099 allocs/op |
+| BenchmarkRegex-10 | 1000000 | 1179 ns/op | 1632 B/op | 27 allocs/op |
+| BenchmarkRegexEmail-10 | 288193 | 4169 ns/op | 4084 B/op | 90 allocs/op |
+| BenchmarkMap-10 | 411193 | 2769 ns/op | 1112 B/op | 16 allocs/op |
+| BenchmarkHackerPhrase-10 | 492094 | 2459 ns/op | 2452 B/op | 26 allocs/op |
+| BenchmarkHackerAbbreviation-10 | 14372289 | 83.53 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkHackerAdjective-10 | 14220135 | 84.27 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkHackerNoun-10 | 14309001 | 83.26 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkHackerVerb-10 | 14295102 | 84.19 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkHackeringVerb-10 | 14516464 | 82.27 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkReplaceWithNumbers-10 | 2076896 | 579.9 ns/op | 264 B/op | 9 allocs/op |
+| BenchmarkHipsterWord-10 | 14007025 | 85.50 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkHipsterSentence-10 | 1501389 | 797.2 ns/op | 701 B/op | 11 allocs/op |
+| BenchmarkHipsterParagraph-10 | 409591 | 2942 ns/op | 2625 B/op | 43 allocs/op |
+| BenchmarkInputName-10 | 14354660 | 83.41 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkSvg-10 | 311258 | 3814 ns/op | 8868 B/op | 52 allocs/op |
+| BenchmarkID-10 | 32851885 | 36.10 ns/op | 24 B/op | 1 allocs/op |
+| BenchmarkUUID-10 | 26154878 | 45.74 ns/op | 48 B/op | 1 allocs/op |
+| BenchmarkImage-10 | 87 | 13643686 ns/op | 2457691 B/op | 307202 allocs/op |
+| BenchmarkImageJpeg-10 | 51 | 22983315 ns/op | 2982473 B/op | 307217 allocs/op |
+| BenchmarkImagePng-10 | 20 | 55524785 ns/op | 5898540 B/op | 307239 allocs/op |
+| BenchmarkDomainName-10 | 2861862 | 418.8 ns/op | 95 B/op | 5 allocs/op |
+| BenchmarkDomainSuffix-10 | 14735926 | 81.42 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkUrlSlug-10 | 2498754 | 480.0 ns/op | 81 B/op | 2 allocs/op |
+| BenchmarkURL-10 | 1328094 | 904.6 ns/op | 265 B/op | 10 allocs/op |
+| BenchmarkHTTPMethod-10 | 14741282 | 81.47 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkIPv4Address-10 | 7809050 | 154.2 ns/op | 16 B/op | 1 allocs/op |
+| BenchmarkIPv6Address-10 | 3424746 | 351.1 ns/op | 111 B/op | 8 allocs/op |
+| BenchmarkMacAddress-10 | 4204674 | 283.4 ns/op | 24 B/op | 1 allocs/op |
+| BenchmarkHTTPStatusCode-10 | 15362457 | 78.36 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkHTTPStatusCodeSimple-10 | 15321136 | 78.45 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkLogLevel-10 | 13574922 | 88.47 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkUserAgent-10 | 2095276 | 575.4 ns/op | 297 B/op | 5 allocs/op |
+| BenchmarkChromeUserAgent-10 | 2614332 | 456.8 ns/op | 184 B/op | 5 allocs/op |
+| BenchmarkFirefoxUserAgent-10 | 1735813 | 693.0 ns/op | 362 B/op | 6 allocs/op |
+| BenchmarkSafariUserAgent-10 | 1836490 | 673.5 ns/op | 551 B/op | 7 allocs/op |
+| BenchmarkOperaUserAgent-10 | 2413814 | 526.1 ns/op | 212 B/op | 5 allocs/op |
+| BenchmarkJSONLookup100-10 | 1254 | 931207 ns/op | 918187 B/op | 12418 allocs/op |
+| BenchmarkLanguage-10 | 14730628 | 81.42 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkLanguageAbbreviation-10 | 14698053 | 81.49 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkLanguageBCP-10 | 14691934 | 82.75 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkProgrammingLanguage-10 | 14665668 | 81.63 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkMinecraftOre-10 | 14312521 | 83.79 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkMinecraftWood-10 | 14329014 | 83.67 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkMinecraftArmorTier-10 | 14261343 | 84.36 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkMinecraftArmorPart-10 | 14111434 | 84.73 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkMinecraftWeapon-10 | 14238732 | 83.65 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkMinecraftTool-10 | 14331830 | 83.64 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkMinecraftDye-10 | 14355182 | 84.94 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkMinecraftFood-10 | 14337074 | 83.67 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkMinecraftAnimal-10 | 14324002 | 83.56 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkMinecraftVillagerJob-10 | 14366955 | 83.59 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkMinecraftVillagerStation-10 | 14775799 | 81.52 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkMinecraftVillagerLevel-10 | 14433811 | 83.97 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkMinecraftMobPassive-10 | 14265412 | 83.62 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkMinecraftMobNeutral-10 | 14339287 | 83.59 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkMinecraftMobHostile-10 | 14349654 | 83.63 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkMinecraftMobBoss-10 | 14802699 | 81.51 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkMinecraftBiome-10 | 14390689 | 84.08 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkMinecraftWeather-10 | 14607906 | 82.08 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkBool-10 | 98531938 | 11.99 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkShuffleAnySlice-10 | 3848493 | 313.9 ns/op | 24 B/op | 1 allocs/op |
+| BenchmarkFlipACoin-10 | 100000000 | 11.89 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkMovie-10 | 5639511 | 190.9 ns/op | 32 B/op | 1 allocs/op |
+| BenchmarkMovieName-10 | 14299531 | 84.06 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkMovieGenre-10 | 14346801 | 83.66 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkNumber-10 | 100000000 | 11.46 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkUint8-10 | 99954187 | 11.95 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkUint16-10 | 100000000 | 11.98 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkUint32-10 | 100000000 | 11.51 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkUint64-10 | 100000000 | 11.52 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkUintRange-10 | 100000000 | 11.40 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkInt8-10 | 97158124 | 12.11 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkInt16-10 | 98414097 | 12.44 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkInt32-10 | 100000000 | 11.53 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkInt64-10 | 100000000 | 11.53 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkIntRange-10 | 100000000 | 11.41 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkFloat32-10 | 100000000 | 11.43 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkFloat32Range-10 | 100000000 | 11.56 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkFloat64-10 | 100000000 | 11.57 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkFloat64Range-10 | 100000000 | 11.65 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkShuffleInts-10 | 12829964 | 93.72 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkRandomInt-10 | 100000000 | 11.42 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkRandomUint-10 | 100000000 | 11.39 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkHexUint-10 | 23160154 | 51.70 ns/op | 8 B/op | 1 allocs/op |
+| BenchmarkCurrency-10 | 13259960 | 87.44 ns/op | 32 B/op | 1 allocs/op |
+| BenchmarkCurrencyShort-10 | 14788378 | 81.25 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkCurrencyLong-10 | 14777679 | 81.77 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkPrice-10 | 100000000 | 11.55 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkCreditCard-10 | 1269178 | 929.1 ns/op | 274 B/op | 15 allocs/op |
+| BenchmarkCreditCardType-10 | 43169155 | 27.39 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkCreditCardNumber-10 | 1920832 | 623.8 ns/op | 185 B/op | 10 allocs/op |
+| BenchmarkCreditCardExp-10 | 11255587 | 106.8 ns/op | 5 B/op | 1 allocs/op |
+| BenchmarkCreditCardCvv-10 | 28679431 | 41.74 ns/op | 3 B/op | 1 allocs/op |
+| BenchmarkAchRouting-10 | 10390467 | 115.0 ns/op | 16 B/op | 1 allocs/op |
+| BenchmarkAchAccount-10 | 8082610 | 148.6 ns/op | 16 B/op | 1 allocs/op |
+| BenchmarkBitcoinAddress-10 | 919413 | 1315 ns/op | 145 B/op | 3 allocs/op |
+| BenchmarkBitcoinPrivateKey-10 | 1843315 | 650.5 ns/op | 184 B/op | 5 allocs/op |
+| BenchmarkBankName-10 | 14444061 | 83.06 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkBankType-10 | 14377713 | 83.89 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkName-10 | 5686338 | 210.6 ns/op | 16 B/op | 1 allocs/op |
+| BenchmarkFirstName-10 | 14735256 | 81.63 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkMiddleName-10 | 14506162 | 82.00 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkLastName-10 | 14682049 | 81.70 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkNamePrefix-10 | 14524393 | 82.38 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkNameSuffix-10 | 14671279 | 81.88 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkSSN-10 | 42014109 | 28.54 ns/op | 16 B/op | 1 allocs/op |
+| BenchmarkEIN-10 | 3682759 | 294.6 ns/op | 80 B/op | 14 allocs/op |
+| BenchmarkGender-10 | 100000000 | 11.99 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkHobby-10 | 14439556 | 82.81 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkSocialMedia-10 | 1478293 | 815.7 ns/op | 430 B/op | 11 allocs/op |
+| BenchmarkBio-10 | 938670 | 1282 ns/op | 1190 B/op | 15 allocs/op |
+| BenchmarkPerson-10 | 349646 | 3466 ns/op | 818 B/op | 31 allocs/op |
+| BenchmarkContact-10 | 1817460 | 678.4 ns/op | 136 B/op | 6 allocs/op |
+| BenchmarkPhone-10 | 9426168 | 127.4 ns/op | 16 B/op | 1 allocs/op |
+| BenchmarkPhoneFormatted-10 | 5080152 | 236.4 ns/op | 16 B/op | 1 allocs/op |
+| BenchmarkEmail-10 | 2392788 | 500.2 ns/op | 88 B/op | 4 allocs/op |
+| BenchmarkTeams-10 | 2302561 | 517.0 ns/op | 672 B/op | 10 allocs/op |
+| BenchmarkProduct-10 | 218653 | 5445 ns/op | 3088 B/op | 46 allocs/op |
+| BenchmarkProductName-10 | 2300114 | 522.6 ns/op | 103 B/op | 5 allocs/op |
+| BenchmarkProductDescription-10 | 461224 | 2594 ns/op | 2465 B/op | 23 allocs/op |
+| BenchmarkProductCategory-10 | 14565750 | 82.60 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkProductFeature-10 | 14421858 | 82.71 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkProductMaterial-10 | 14525638 | 82.69 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkProductUPC-10 | 1704061 | 721.7 ns/op | 96 B/op | 11 allocs/op |
+| BenchmarkProductAudience-10 | 6250908 | 190.6 ns/op | 32 B/op | 1 allocs/op |
+| BenchmarkProductDimension-10 | 14143437 | 84.98 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkProductUseCase-10 | 14313904 | 82.51 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkProductBenefit-10 | 14576446 | 82.46 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkProductSuffix-10 | 14219770 | 84.26 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkProductISBN-10 | 5517997 | 200.1 ns/op | 32 B/op | 3 allocs/op |
+| BenchmarkSchool-10 | 4244638 | 283.1 ns/op | 34 B/op | 1 allocs/op |
+| BenchmarkSong-10 | 4338772 | 277.3 ns/op | 48 B/op | 1 allocs/op |
+| BenchmarkSongName-10 | 14409870 | 83.61 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkSongArtist-10 | 14364440 | 83.60 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkSongGenre-10 | 14394457 | 85.02 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkLetter-10 | 100000000 | 11.51 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkLetterN-10 | 7059724 | 168.8 ns/op | 64 B/op | 2 allocs/op |
+| BenchmarkVowel-10 | 81354326 | 14.79 ns/op | 4 B/op | 1 allocs/op |
+| BenchmarkDigit-10 | 100000000 | 11.42 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkDigitN-10 | 7008775 | 168.7 ns/op | 64 B/op | 2 allocs/op |
+| BenchmarkNumerify-10 | 9234306 | 129.6 ns/op | 16 B/op | 1 allocs/op |
+| BenchmarkLexify-10 | 15390994 | 78.03 ns/op | 8 B/op | 1 allocs/op |
+| BenchmarkShuffleStrings-10 | 14075007 | 85.33 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkRandomString-10 | 100000000 | 11.51 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkTemplate-10 | 3873 | 311023 ns/op | 248973 B/op | 3083 allocs/op |
+| BenchmarkComment-10 | 1331073 | 903.1 ns/op | 583 B/op | 9 allocs/op |
+| BenchmarkPhrase-10 | 14345750 | 84.65 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkPhraseNoun-10 | 3605448 | 333.1 ns/op | 88 B/op | 1 allocs/op |
+| BenchmarkPhraseVerb-10 | 1643992 | 733.3 ns/op | 196 B/op | 4 allocs/op |
+| BenchmarkPhraseAdverb-10 | 7439331 | 161.1 ns/op | 9 B/op | 0 allocs/op |
+| BenchmarkPhrasePreposition-10 | 2622950 | 455.8 ns/op | 107 B/op | 2 allocs/op |
+| BenchmarkSentence-10 | 1243213 | 969.4 ns/op | 895 B/op | 12 allocs/op |
+| BenchmarkParagraph-10 | 336364 | 3553 ns/op | 3322 B/op | 46 allocs/op |
+| BenchmarkQuestion-10 | 1708732 | 702.1 ns/op | 549 B/op | 10 allocs/op |
+| BenchmarkQuote-10 | 1638612 | 731.6 ns/op | 569 B/op | 10 allocs/op |
+| BenchmarkLoremIpsumSentence-10 | 1000000 | 1064 ns/op | 219 B/op | 2 allocs/op |
+| BenchmarkLoremIpsumParagraph-10 | 59647 | 20014 ns/op | 8480 B/op | 40 allocs/op |
+| BenchmarkWeighted-10 | 53570133 | 22.38 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkAdjective-10 | 7898755 | 151.5 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkAdjectiveDescriptive-10 | 14585032 | 82.31 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkAdjectiveQuantitative-10 | 14615534 | 82.15 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkAdjectiveProper-10 | 14826856 | 81.02 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkAdjectiveDemonstrative-10 | 14628786 | 82.13 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkAdjectivePossessive-10 | 14488378 | 82.17 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkAdjectiveInterrogative-10 | 14578668 | 82.15 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkAdjectiveIndefinite-10 | 14588925 | 82.19 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkAdverb-10 | 7883319 | 152.4 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkAdverbManner-10 | 14757386 | 83.12 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkAdverbDegree-10 | 12683223 | 81.75 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkAdverbPlace-10 | 14620564 | 81.22 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkAdverbTimeDefinite-10 | 14570636 | 82.21 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkAdverbTimeIndefinite-10 | 14585497 | 82.29 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkAdverbFrequencyDefinite-10 | 14568910 | 83.32 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkAdverbFrequencyIndefinite-10 | 14624752 | 82.14 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkConnective-10 | 8215815 | 146.0 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkConnectiveTime-10 | 14964218 | 80.41 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkConnectiveComparative-10 | 14394342 | 83.41 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkConnectiveComplaint-10 | 14189211 | 81.65 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkConnectiveListing-10 | 14673902 | 81.97 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkConnectiveCasual-10 | 14582056 | 82.15 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkConnectiveExamplify-10 | 14361904 | 83.44 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkWord-10 | 9736791 | 123.2 ns/op | 3 B/op | 0 allocs/op |
+| BenchmarkInterjection-10 | 14839546 | 82.93 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkLoremIpsumWord-10 | 14265787 | 84.27 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkNoun-10 | 7625799 | 157.4 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkNounCommon-10 | 14696373 | 81.43 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkNounConcrete-10 | 14775216 | 81.41 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkNounAbstract-10 | 14736424 | 81.55 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkNounCollectivePeople-10 | 14574639 | 82.05 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkNounCollectiveAnimal-10 | 14297954 | 82.31 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkNounCollectiveThing-10 | 14612716 | 82.48 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkNounCountable-10 | 14706775 | 81.53 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkNounUncountable-10 | 14912088 | 80.10 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkNounProper-10 | 10122214 | 118.6 ns/op | 7 B/op | 0 allocs/op |
+| BenchmarkNounDeterminer-10 | 15038943 | 80.18 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkPreposition-10 | 9446143 | 127.1 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkPrepositionSimple-10 | 14623304 | 82.20 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkPrepositionDouble-10 | 14616758 | 82.33 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkPrepositionCompound-10 | 14646828 | 82.19 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkPronoun-10 | 7619226 | 157.1 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkPronounPersonal-10 | 15007472 | 80.06 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkPronounObject-10 | 14734660 | 81.50 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkPronounPossessive-10 | 14589732 | 82.16 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkPronounReflective-10 | 14572369 | 82.18 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkPronounIndefinite-10 | 14549400 | 81.99 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkPronounDemonstrative-10 | 14405077 | 83.21 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkPronounInterrogative-10 | 14522790 | 82.20 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkPronounRelative-10 | 15074666 | 80.10 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkVerb-10 | 9462745 | 127.1 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkVerbAction-10 | 14725183 | 81.37 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkVerbTransitive-10 | 15013738 | 80.16 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkVerbIntransitive-10 | 14609581 | 82.23 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkVerbLinking-10 | 14814585 | 81.20 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkVerbHelping-10 | 14679265 | 81.18 ns/op | 0 B/op | 0 allocs/op |
+| BenchmarkXMLLookup100-10 | 1240 | 992659 ns/op | 978256 B/op | 11687 allocs/op |
\ No newline at end of file
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/README.md b/vendor/github.com/brianvoe/gofakeit/v7/README.md
index 246bb9c0..964f8c44 100644
--- a/vendor/github.com/brianvoe/gofakeit/v7/README.md
+++ b/vendor/github.com/brianvoe/gofakeit/v7/README.md
@@ -4,9 +4,13 @@
Random data generator written in go
-[](https://ko-fi.com/G2G0R5EJT)
+## Support
-
+[](https://ko-fi.com/G2G0R5EJT)
+
+## Merch
+
+[](https://gofakeit-buy-shop.fourthwall.com)
## Features
@@ -41,17 +45,17 @@ go get github.com/brianvoe/gofakeit/v7
```go
import "github.com/brianvoe/gofakeit/v7"
-gofakeit.Name() // Markus Moen
-gofakeit.Email() // alaynawuckert@kozey.biz
-gofakeit.Phone() // (570)245-7485
-gofakeit.BS() // front-end
-gofakeit.BeerName() // Duvel
-gofakeit.Color() // MediumOrchid
-gofakeit.Company() // Moen, Pagac and Wuckert
-gofakeit.CreditCardNumber() // 4287271570245748
-gofakeit.HackerPhrase() // Connecting the array won't do anything, we need to generate the haptic COM driver!
-gofakeit.JobTitle() // Director
-gofakeit.CurrencyShort() // USD
+gofakeit.Name() // Markus Moen
+gofakeit.Email() // alaynawuckert@kozey.biz
+gofakeit.Phone() // (570)245-7485
+gofakeit.BS() // front-end
+gofakeit.BeerName() // Duvel
+gofakeit.Color() // MediumOrchid
+gofakeit.Company() // Moen, Pagac and Wuckert
+gofakeit.CreditCardNumber(nil) // 4287271570245748
+gofakeit.HackerPhrase() // Connecting the array won't do anything, we need to generate the haptic COM driver!
+gofakeit.JobTitle() // Director
+gofakeit.CurrencyShort() // USD
```
[See full list of functions](#functions)
@@ -91,7 +95,7 @@ import (
faker := gofakeit.New(0)
// NewFaker takes in a source and whether or not it should be thread safe
-faker := gofakeit.NewFaker(source rand.Source, threadSafe bool)
+faker := gofakeit.NewFaker(src rand.Source, lock bool)
// PCG Pseudo
faker := gofakeit.NewFaker(rand.NewPCG(11, 11), true)
@@ -142,7 +146,7 @@ type Foo struct {
Int int
Pointer *int
Name string `fake:"{firstname}"` // Any available function all lowercase
- Sentence string `fake:"{sentence:3}"` // Can call with parameters
+ Sentence string `fake:"{sentence}"`
RandStr string `fake:"{randomstring:[hello,world]}"`
Number string `fake:"{number:1,10}"` // Comma separated for multiple values
Regex string `fake:"{regex:[abcdef]{5}}"` // Generate string from regex
@@ -171,7 +175,7 @@ fmt.Println(f.Int) // -7825289004089916589
fmt.Println(*f.Pointer) // -343806609094473732
fmt.Println(f.Name) // fred
fmt.Println(f.Sentence) // Record river mind.
-fmt.Println(fStr) // world
+fmt.Println(f.RandStr) // world
fmt.Println(f.Number) // 4
fmt.Println(f.Regex) // cbdfc
fmt.Println(f.Map) // map[PxLIo:52 lxwnqhqc:846]
@@ -210,7 +214,7 @@ func (c *Friend) Fake(f *gofakeit.Faker) (any, error) {
type Age time.Time
func (c *Age) Fake(f *gofakeit.Faker) (any, error) {
- return f.DateRange(time.Now().AddDate(-100, 0, 0), time.Now().AddDate(-18, 0, 0)), nil
+ return Age(f.DateRange(time.Now().AddDate(-100, 0, 0), time.Now().AddDate(-18, 0, 0))), nil
}
// This is the struct that we cannot modify to add struct tags
@@ -221,8 +225,8 @@ type User struct {
var u User
gofakeit.Struct(&u)
-fmt.Printf("%s", f.Name) // billy
-fmt.Printf("%s", f.Age) // 1990-12-07 04:14:25.685339029 +0000 UTC
+fmt.Println(u.Name) // billy
+fmt.Println(time.Time(*u.Age)) // 1990-12-07 04:14:25.685339029 +0000 UTC
```
## Custom Functions
@@ -240,7 +244,7 @@ gofakeit.AddFuncLookup("friendname", gofakeit.Info{
Description: "Random friend name",
Example: "bill",
Output: "string",
- Generate: func(f *Faker, m *gofakeit.MapParams, info *gofakeit.Info) (any, error) {
+ Generate: func(f *gofakeit.Faker, m *gofakeit.MapParams, info *gofakeit.Info) (any, error) {
return f.RandomString([]string{"bill", "bob", "sally"}), nil
},
})
@@ -254,7 +258,7 @@ gofakeit.AddFuncLookup("jumbleword", gofakeit.Info{
Params: []gofakeit.Param{
{Field: "word", Type: "string", Description: "Word you want to jumble"},
},
- Generate: func(f *Faker, m *gofakeit.MapParams, info *gofakeit.Info) (any, error) {
+ Generate: func(f *gofakeit.Faker, m *gofakeit.MapParams, info *gofakeit.Info) (any, error) {
word, err := info.GetString(m, "word")
if err != nil {
return nil, err
@@ -273,8 +277,8 @@ type Foo struct {
var f Foo
gofakeit.Struct(&f)
-fmt.Printf("%s", f.FriendName) // bill
-fmt.Printf("%s", f.JumbleWord) // loredlowlh
+fmt.Println(f.FriendName) // bill
+fmt.Println(f.JumbleWord) // loredlowlh
```
## Templates
@@ -328,17 +332,17 @@ func main() {
{{RandomString (SliceString "Warm regards" "Best wishes" "Sincerely")}}
{{$person:=Person}}
{{$person.FirstName}} {{$person.LastName}}
- {{$person.Email}}
- {{$person.Phone}}
+ {{$person.Contact.Email}}
+ {{$person.Contact.Phone}}
`
- value, err := gofakeit.Template(template, &TemplateOptions{Data: 5})
+ value, err := gofakeit.Template(template, &gofakeit.TemplateOptions{Data: 5})
if err != nil {
fmt.Println(err)
}
- fmt.Println(string(value))
+ fmt.Println(value)
}
```
@@ -353,6 +357,7 @@ Greetings!
Quia voluptatem voluptatem voluptatem. Quia voluptatem voluptatem voluptatem. Quia voluptatem voluptatem voluptatem.
Warm regards
+
Kaitlyn Krajcik
kaitlynkrajcik@krajcik
570-245-7485
@@ -385,8 +390,14 @@ EmailText(co *EmailOptions) (string, error)
FixedWidth(co *FixedWidthOptions) (string, error)
```
-### Product
+### ID
+```go
+ID() string
+UUID() string
+```
+
+### Product
```go
Product() *ProductInfo
@@ -401,6 +412,7 @@ ProductDimension() string
ProductUseCase() string
ProductBenefit() string
ProductSuffix() string
+ProductISBN(opts *ISBNOptions) string
```
@@ -415,7 +427,10 @@ FirstName() string
MiddleName() string
LastName() string
Gender() string
+Age() int
+Ethnicity() string
SSN() string
+EIN() string
Hobby() string
Contact() *ContactInfo
Email() string
@@ -455,6 +470,7 @@ StreetName() string
StreetNumber() string
StreetPrefix() string
StreetSuffix() string
+Unit() string
Zip() string
Latitude() float64
LatitudeInRange(min, max float64) (float64, error)
@@ -561,9 +577,9 @@ ConnectiveExamplify() string
// Words
Word() string
-// Sentences
-Sentence(wordCount int) string
-Paragraph(paragraphCount int, sentenceCount int, wordCount int, separator string) string
+// Text
+Sentence() string
+Paragraph() string
LoremIpsumWord() string
LoremIpsumSentence(wordCount int) string
LoremIpsumParagraph(paragraphCount int, sentenceCount int, wordCount int, separator string) string
@@ -588,7 +604,6 @@ Dessert() string
```go
Bool() bool
-UUID() string
Weighted(options []any, weights []float32) (any, error)
FlipACoin() string
RandomMapKey(mapI any) any
@@ -617,6 +632,7 @@ ImagePng(width int, height int) []byte
```go
URL() string
+UrlSlug(words int) string
DomainName() string
DomainSuffix() string
IPv4Address() string
@@ -632,6 +648,7 @@ ChromeUserAgent() string
FirefoxUserAgent() string
OperaUserAgent() string
SafariUserAgent() string
+APIUserAgent() string
```
### HTML
@@ -680,6 +697,8 @@ AchRouting() string
AchAccount() string
BitcoinAddress() string
BitcoinPrivateKey() string
+BankName() string
+BankType() string
```
### Finance
@@ -719,8 +738,8 @@ HackerVerb() string
```go
HipsterWord() string
-HipsterSentence(wordCount int) string
-HipsterParagraph(paragraphCount int, sentenceCount int, wordCount int, separator string) string
+HipsterSentence() string
+HipsterParagraph() string
```
### App
@@ -747,10 +766,29 @@ Bird() string
```go
Emoji() string
-EmojiDescription() string
EmojiCategory() string
EmojiAlias() string
EmojiTag() string
+EmojiFlag() string
+EmojiAnimal() string
+EmojiFood() string
+EmojiPlant() string
+EmojiMusic() string
+EmojiVehicle() string
+EmojiSport() string
+EmojiFace() string
+EmojiHand() string
+EmojiClothing() string
+EmojiLandmark() string
+EmojiElectronics() string
+EmojiGame() string
+EmojiTools() string
+EmojiWeather() string
+EmojiJob() string
+EmojiPerson() string
+EmojiGesture() string
+EmojiCostume() string
+EmojiSentence() string
```
### Language
@@ -759,7 +797,6 @@ EmojiTag() string
Language() string
LanguageAbbreviation() string
ProgrammingLanguage() string
-ProgrammingLanguageBest() string
```
### Number
@@ -857,7 +894,6 @@ ErrorGRPC() error
ErrorHTTP() error
ErrorHTTPClient() error
ErrorHTTPServer() error
-ErrorInput() error
ErrorRuntime() error
```
@@ -866,3 +902,12 @@ ErrorRuntime() error
```go
School() string
```
+
+### Song
+
+```go
+Song() *SongInfo
+SongName() string
+SongArtist() string
+SongGenre() string
+```
\ No newline at end of file
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/address.go b/vendor/github.com/brianvoe/gofakeit/v7/address.go
index f8e4e7b8..c894e591 100644
--- a/vendor/github.com/brianvoe/gofakeit/v7/address.go
+++ b/vendor/github.com/brianvoe/gofakeit/v7/address.go
@@ -9,6 +9,7 @@ import (
type AddressInfo struct {
Address string `json:"address" xml:"address"`
Street string `json:"street" xml:"street"`
+ Unit string `json:"unit" xml:"unit"`
City string `json:"city" xml:"city"`
State string `json:"state" xml:"state"`
Zip string `json:"zip" xml:"zip"`
@@ -29,9 +30,20 @@ func address(f *Faker) *AddressInfo {
state := state(f)
zip := zip(f)
+ // 30% chance to include a unit in the address
+ var unitStr string
+ var unitField string
+ if randIntRange(f, 1, 10) <= 3 {
+ unitStr = ", " + unit(f)
+ unitField = unit(f)
+ }
+
+ addressStr := street + unitStr + ", " + city + ", " + state + " " + zip
+
return &AddressInfo{
- Address: street + ", " + city + ", " + state + " " + zip,
+ Address: addressStr,
Street: street,
+ Unit: unitField,
City: city,
State: state,
Zip: zip,
@@ -93,6 +105,18 @@ func (f *Faker) StreetSuffix() string { return streetSuffix(f) }
func streetSuffix(f *Faker) string { return getRandValue(f, []string{"address", "street_suffix"}) }
+// Unit will generate a random unit string
+func Unit() string { return unit(GlobalFaker) }
+
+// Unit will generate a random unit string
+func (f *Faker) Unit() string { return unit(f) }
+
+func unit(f *Faker) string {
+ unitType := getRandValue(f, []string{"address", "unit"})
+ unitNumber := replaceWithNumbers(f, "###")
+ return unitType + " " + unitNumber
+}
+
// City will generate a random city string
func City() string { return city(GlobalFaker) }
@@ -199,8 +223,9 @@ func addAddressLookup() {
Category: "address",
Description: "Residential location including street, city, state, country and postal code",
Example: `{
- "address": "364 Unionsville, Norfolk, Ohio 99536",
+ "address": "364 Unionsville, Apt 123, Norfolk, Ohio 99536",
"street": "364 Unionsville",
+ "apartment": "Apt 123",
"city": "Norfolk",
"state": "Ohio",
"zip": "99536",
@@ -210,6 +235,8 @@ func addAddressLookup() {
}`,
Output: "map[string]any",
ContentType: "application/json",
+ Aliases: []string{"full address", "residential address", "mailing address", "street address", "home address"},
+ Keywords: []string{"residential", "location", "street", "city", "state", "country", "postal", "code", "mailing", "home", "house", "apartment", "zipcode", "coordinates"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return address(f), nil
},
@@ -221,6 +248,8 @@ func addAddressLookup() {
Description: "Part of a country with significant population, often a central hub for culture and commerce",
Example: "Marcelside",
Output: "string",
+ Aliases: []string{"city name", "urban area", "municipality name", "town name", "metropolitan area"},
+ Keywords: []string{"town", "municipality", "urban", "area", "population", "hub", "culture", "commerce", "metropolitan", "settlement", "community", "district"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return city(f), nil
},
@@ -232,6 +261,8 @@ func addAddressLookup() {
Description: "Nation with its own government and defined territory",
Example: "United States of America",
Output: "string",
+ Aliases: []string{"country name", "nation name", "sovereign state", "national territory", "independent country"},
+ Keywords: []string{"nation", "government", "territory", "sovereign", "independent", "state", "republic", "kingdom", "empire", "federation", "commonwealth"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return country(f), nil
},
@@ -243,6 +274,8 @@ func addAddressLookup() {
Description: "Shortened 2-letter form of a country's name",
Example: "US",
Output: "string",
+ Aliases: []string{"country code", "iso alpha-2", "iso3166-1 alpha-2", "two-letter country", "country short code"},
+ Keywords: []string{"country", "abbreviation", "shortened", "2-letter", "nation", "iso", "code", "alpha-2", "iso3166-1", "standard", "international", "identifier"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return countryAbr(f), nil
},
@@ -254,6 +287,8 @@ func addAddressLookup() {
Description: "Governmental division within a country, often having its own laws and government",
Example: "Illinois",
Output: "string",
+ Aliases: []string{"state name", "province name", "region name", "administrative division", "territory name"},
+ Keywords: []string{"province", "region", "division", "governmental", "territory", "area", "laws", "government", "administrative", "subdivision", "district", "county"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return state(f), nil
},
@@ -262,9 +297,11 @@ func addAddressLookup() {
AddFuncLookup("stateabr", Info{
Display: "State Abbreviation",
Category: "address",
- Description: "Shortened 2-letter form of a country's state",
+ Description: "Shortened 2-letter form of a state or province",
Example: "IL",
Output: "string",
+ Aliases: []string{"state code", "province code", "region code", "usps code", "iso3166-2 code"},
+ Keywords: []string{"state", "abbreviation", "shortened", "2-letter", "region", "province", "country", "code", "usps", "iso3166-2", "identifier"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return stateAbr(f), nil
},
@@ -276,6 +313,8 @@ func addAddressLookup() {
Description: "Public road in a city or town, typically with houses and buildings on each side",
Example: "364 East Rapidsborough",
Output: "string",
+ Aliases: []string{"street address", "shipping address", "billing address", "mailing address", "address line 1", "line 1", "road address", "avenue address", "drive address", "thoroughfare address"},
+ Keywords: []string{"address", "road", "avenue", "drive", "lane", "way", "public", "thoroughfare", "boulevard", "court", "place", "circle", "terrace", "highway"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return street(f), nil
},
@@ -287,6 +326,8 @@ func addAddressLookup() {
Description: "Name given to a specific road or street",
Example: "View",
Output: "string",
+ Aliases: []string{"street title", "road name", "avenue name", "drive name", "thoroughfare name"},
+ Keywords: []string{"street", "name", "road", "avenue", "drive", "lane", "way", "thoroughfare", "specific", "title", "designation", "label", "identifier"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return streetName(f), nil
},
@@ -298,6 +339,8 @@ func addAddressLookup() {
Description: "Numerical identifier assigned to a street",
Example: "13645",
Output: "string",
+ Aliases: []string{"house number", "building number", "address number", "street identifier", "numerical address"},
+ Keywords: []string{"street", "number", "identifier", "numerical", "address", "location", "building", "assigned", "house", "digit", "numeric", "sequence", "position"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return streetNumber(f), nil
},
@@ -306,9 +349,11 @@ func addAddressLookup() {
AddFuncLookup("streetprefix", Info{
Display: "Street Prefix",
Category: "address",
- Description: "Directional or descriptive term preceding a street name, like 'East' or 'Main'",
- Example: "Lake",
+ Description: "Directional or descriptive term preceding a street name (e.g., 'East', 'N')",
+ Example: "East",
Output: "string",
+ Aliases: []string{"directional prefix", "street prefix", "name prefix", "road prefix", "thoroughfare prefix"},
+ Keywords: []string{"street", "prefix", "directional", "north", "south", "east", "west", "n", "s", "e", "w"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return streetPrefix(f), nil
},
@@ -317,20 +362,37 @@ func addAddressLookup() {
AddFuncLookup("streetsuffix", Info{
Display: "Street Suffix",
Category: "address",
- Description: "Designation at the end of a street name indicating type, like 'Avenue' or 'Street'",
- Example: "land",
+ Description: "Designation at the end of a street name indicating type (e.g., 'Ave', 'St')",
+ Example: "Ave",
Output: "string",
+ Aliases: []string{"street type", "road type", "avenue suffix", "thoroughfare suffix", "street ending"},
+ Keywords: []string{"street", "suffix", "designation", "type", "ave", "st", "rd", "dr", "ln", "blvd", "ct", "pl", "cir", "ter", "hwy"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return streetSuffix(f), nil
},
})
+ AddFuncLookup("unit", Info{
+ Display: "Unit",
+ Category: "address",
+ Description: "Unit identifier within a building, such as apartment number, suite, or office",
+ Example: "Apt 123",
+ Output: "string",
+ Aliases: []string{"apartment unit", "suite number", "office number", "building unit", "room number", "address line 2", "line 2"},
+ Keywords: []string{"apartment", "suite", "office", "identifier", "building", "number", "within", "room", "floor", "level", "section", "compartment"},
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
+ return unit(f), nil
+ },
+ })
+
AddFuncLookup("zip", Info{
Display: "Zip",
Category: "address",
Description: "Numerical code for postal address sorting, specific to a geographic area",
Example: "13645",
Output: "string",
+ Aliases: []string{"zip code", "postal code", "mail code", "delivery code"},
+ Keywords: []string{"postal", "postcode", "code", "address", "sorting", "geographic", "area", "numerical", "mailing", "delivery", "zone", "district", "region", "identifier"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return zip(f), nil
},
@@ -342,6 +404,8 @@ func addAddressLookup() {
Description: "Geographic coordinate specifying north-south position on Earth's surface",
Example: "-73.534056",
Output: "float",
+ Aliases: []string{"lat coordinate", "north-south coordinate", "geographic latitude", "earth latitude", "position latitude"},
+ Keywords: []string{"lat", "coordinate", "north-south", "degrees", "gps", "wgs84", "geodesy", "parallel", "equator", "pole"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return latitude(f), nil
},
@@ -353,6 +417,8 @@ func addAddressLookup() {
Description: "Latitude number between the given range (default min=0, max=90)",
Example: "22.921026",
Output: "float",
+ Aliases: []string{"latitude bounds", "lat range", "north-south range", "geographic bounds", "coordinate range"},
+ Keywords: []string{"lat", "range", "min", "max", "degrees", "gps", "wgs84", "bounds", "interval"},
Params: []Param{
{Field: "min", Display: "Min", Type: "float", Default: "0", Description: "Minimum range"},
{Field: "max", Display: "Max", Type: "float", Default: "90", Description: "Maximum range"},
@@ -362,18 +428,11 @@ func addAddressLookup() {
if err != nil {
return nil, err
}
-
max, err := info.GetFloat64(m, "max")
if err != nil {
return nil, err
}
-
- rangeOut, err := latitudeInRange(f, min, max)
- if err != nil {
- return nil, err
- }
-
- return rangeOut, nil
+ return latitudeInRange(f, min, max)
},
})
@@ -383,6 +442,8 @@ func addAddressLookup() {
Description: "Geographic coordinate indicating east-west position on Earth's surface",
Example: "-147.068112",
Output: "float",
+ Aliases: []string{"long coordinate", "east-west coordinate", "geographic longitude", "earth longitude", "position longitude"},
+ Keywords: []string{"lon", "coordinate", "east-west", "degrees", "gps", "wgs84", "geodesy", "meridian", "idl"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return longitude(f), nil
},
@@ -394,6 +455,8 @@ func addAddressLookup() {
Description: "Longitude number between the given range (default min=0, max=180)",
Example: "-8.170450",
Output: "float",
+ Aliases: []string{"longitude bounds", "long range", "east-west range", "geographic bounds", "coordinate range"},
+ Keywords: []string{"longitude", "lon", "range", "min", "max", "degrees", "gps", "wgs84", "bounds", "interval"},
Params: []Param{
{Field: "min", Display: "Min", Type: "float", Default: "0", Description: "Minimum range"},
{Field: "max", Display: "Max", Type: "float", Default: "180", Description: "Maximum range"},
@@ -403,18 +466,12 @@ func addAddressLookup() {
if err != nil {
return nil, err
}
-
max, err := info.GetFloat64(m, "max")
if err != nil {
return nil, err
}
-
- rangeOut, err := longitudeInRange(f, min, max)
- if err != nil {
- return nil, err
- }
-
- return rangeOut, nil
+ return longitudeInRange(f, min, max)
},
})
+
}
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/airline.go b/vendor/github.com/brianvoe/gofakeit/v7/airline.go
new file mode 100644
index 00000000..9446e497
--- /dev/null
+++ b/vendor/github.com/brianvoe/gofakeit/v7/airline.go
@@ -0,0 +1,176 @@
+package gofakeit
+
+import (
+ "fmt"
+ "strings"
+)
+
+// AirlineAircraftType will generate a random aircraft type
+func AirlineAircraftType() string { return airlineAircraftType(GlobalFaker) }
+
+// AirlineAircraftType will generate a random aircraft type
+func (f *Faker) AirlineAircraftType() string { return airlineAircraftType(f) }
+
+func airlineAircraftType(f *Faker) string {
+ return getRandValue(f, []string{"airline", "aircraft_type"})
+}
+
+// AirlineAirplane will generate a random airplane model
+func AirlineAirplane() string { return airlineAirplane(GlobalFaker) }
+
+// AirlineAirplane will generate a random airplane model
+func (f *Faker) AirlineAirplane() string { return airlineAirplane(f) }
+
+func airlineAirplane(f *Faker) string {
+ return getRandValue(f, []string{"airline", "airplane"})
+}
+
+// AirlineAirport will generate a random airport name
+func AirlineAirport() string { return airlineAirport(GlobalFaker) }
+
+// AirlineAirport will generate a random airport name
+func (f *Faker) AirlineAirport() string { return airlineAirport(f) }
+
+func airlineAirport(f *Faker) string {
+ return getRandValue(f, []string{"airline", "airport"})
+}
+
+// AirlineAirportIATA will generate a random airport IATA code
+func AirlineAirportIATA() string { return airlineAirportIATA(GlobalFaker) }
+
+// AirlineAirportIATA will generate a random airport IATA code
+func (f *Faker) AirlineAirportIATA() string { return airlineAirportIATA(f) }
+
+func airlineAirportIATA(f *Faker) string {
+ return getRandValue(f, []string{"airline", "iata"})
+}
+
+// AirlineFlightNumber will generate a random flight number
+func AirlineFlightNumber() string { return airlineFlightNumber(GlobalFaker) }
+
+// AirlineFlightNumber will generate a random flight number
+func (f *Faker) AirlineFlightNumber() string { return airlineFlightNumber(f) }
+
+func airlineFlightNumber(f *Faker) string {
+ // Generate a 2-letter airline code followed by 1-4 digit flight number
+ return fmt.Sprintf("%s%d", strings.ToUpper(letterN(f, 2)), f.Number(1, 9999))
+}
+
+// AirlineRecordLocator will generate a random record locator (booking reference)
+func AirlineRecordLocator() string { return airlineRecordLocator(GlobalFaker) }
+
+// AirlineRecordLocator will generate a random record locator (booking reference)
+func (f *Faker) AirlineRecordLocator() string { return airlineRecordLocator(f) }
+
+func airlineRecordLocator(f *Faker) string {
+ // Generate a 6-character uppercase alphanumeric record locator
+ return strings.ToUpper(letterN(f, 6))
+}
+
+// AirlineSeat will generate a random seat assignment
+func AirlineSeat() string { return airlineSeat(GlobalFaker) }
+
+// AirlineSeat will generate a random seat assignment
+func (f *Faker) AirlineSeat() string { return airlineSeat(f) }
+
+func airlineSeat(f *Faker) string {
+ // Generate seat like "12A", "23F", etc.
+ // Row: 1-60, Seat: A-K (excluding I)
+ row := f.Number(1, 60)
+ seats := []string{"A", "B", "C", "D", "E", "F", "G", "H", "J", "K"}
+ seat := seats[f.Number(0, len(seats)-1)]
+ return fmt.Sprintf("%d%s", row, seat)
+}
+
+func addAirlineLookup() {
+ AddFuncLookup("airlineaircrafttype", Info{
+ Display: "Airline Aircraft Type",
+ Category: "airline",
+ Description: "Distinct category that defines the particular model or series of an aircraft",
+ Example: "narrowbody",
+ Output: "string",
+ Aliases: []string{"aircraft category", "plane type", "airplane classification"},
+ Keywords: []string{"airline", "aircraft", "type", "category", "narrowbody", "widebody", "regional", "plane", "airplane"},
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
+ return airlineAircraftType(f), nil
+ },
+ })
+
+ AddFuncLookup("airlineairplane", Info{
+ Display: "Airline Airplane",
+ Category: "airline",
+ Description: "Specific model and manufacturer of an aircraft used for air travel",
+ Example: "Airbus A320",
+ Output: "string",
+ Aliases: []string{"aircraft model", "plane model", "airplane name"},
+ Keywords: []string{"airline", "airplane", "aircraft", "model", "airbus", "boeing", "embraer", "bombardier", "manufacturer"},
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
+ return airlineAirplane(f), nil
+ },
+ })
+
+ AddFuncLookup("airlineairport", Info{
+ Display: "Airline Airport",
+ Category: "airline",
+ Description: "Facility where aircraft take off and land, including terminals and runways",
+ Example: "Hartsfield-Jackson Atlanta International Airport",
+ Output: "string",
+ Aliases: []string{"airport name", "aerodrome", "airfield"},
+ Keywords: []string{"airline", "airport", "facility", "terminal", "runway", "international", "travel", "aviation"},
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
+ return airlineAirport(f), nil
+ },
+ })
+
+ AddFuncLookup("airlineairportiata", Info{
+ Display: "Airline Airport IATA",
+ Category: "airline",
+ Description: "Three-letter code assigned to airports by the International Air Transport Association",
+ Example: "ATL",
+ Output: "string",
+ Aliases: []string{"airport code", "iata code", "airport abbreviation"},
+ Keywords: []string{"airline", "airport", "iata", "code", "three-letter", "abbreviation", "international", "aviation"},
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
+ return airlineAirportIATA(f), nil
+ },
+ })
+
+ AddFuncLookup("airlineflightnumber", Info{
+ Display: "Airline Flight Number",
+ Category: "airline",
+ Description: "Unique identifier for a specific flight operated by an airline",
+ Example: "AA1234",
+ Output: "string",
+ Aliases: []string{"flight code", "flight identifier", "flight designation"},
+ Keywords: []string{"airline", "flight", "number", "identifier", "code", "designation", "aviation", "travel"},
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
+ return airlineFlightNumber(f), nil
+ },
+ })
+
+ AddFuncLookup("airlinerecordlocator", Info{
+ Display: "Airline Record Locator",
+ Category: "airline",
+ Description: "Unique alphanumeric code used to identify and retrieve a flight booking",
+ Example: "ABCDEF",
+ Output: "string",
+ Aliases: []string{"booking reference", "confirmation code", "reservation code", "pnr"},
+ Keywords: []string{"airline", "record", "locator", "booking", "reference", "confirmation", "reservation", "code", "alphanumeric"},
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
+ return airlineRecordLocator(f), nil
+ },
+ })
+
+ AddFuncLookup("airlineseat", Info{
+ Display: "Airline Seat",
+ Category: "airline",
+ Description: "Designated location within an aircraft assigned to a passenger",
+ Example: "12A",
+ Output: "string",
+ Aliases: []string{"seat assignment", "seat number", "seat location"},
+ Keywords: []string{"airline", "seat", "assignment", "location", "passenger", "aircraft", "row", "position"},
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
+ return airlineSeat(f), nil
+ },
+ })
+}
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/animal.go b/vendor/github.com/brianvoe/gofakeit/v7/animal.go
index b70438b6..91615077 100644
--- a/vendor/github.com/brianvoe/gofakeit/v7/animal.go
+++ b/vendor/github.com/brianvoe/gofakeit/v7/animal.go
@@ -105,6 +105,8 @@ func addAnimalLookup() {
Description: "Affectionate nickname given to a pet",
Example: "Ozzy Pawsborne",
Output: "string",
+ Aliases: []string{"pet nickname", "animal name", "companion name", "friendly name", "affectionate name"},
+ Keywords: []string{"pet", "name", "nickname", "affectionate", "animal", "companion", "friendly", "cute", "funny", "playful", "loving", "adorable"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return petName(f), nil
},
@@ -116,6 +118,8 @@ func addAnimalLookup() {
Description: "Living creature with the ability to move, eat, and interact with its environment",
Example: "elk",
Output: "string",
+ Aliases: []string{"wild animal", "living creature", "wildlife species", "animal species", "creature name"},
+ Keywords: []string{"creature", "living", "move", "eat", "environment", "wildlife", "species", "fauna", "beast", "organism", "vertebrate", "invertebrate"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return animal(f), nil
},
@@ -127,6 +131,8 @@ func addAnimalLookup() {
Description: "Type of animal, such as mammals, birds, reptiles, etc.",
Example: "amphibians",
Output: "string",
+ Aliases: []string{"animal classification", "species type", "taxonomic group", "animal category", "biological class"},
+ Keywords: []string{"animal", "type", "mammals", "birds", "reptiles", "amphibians", "classification", "taxonomy", "phylum", "class", "order", "family", "genus", "species"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return animalType(f), nil
},
@@ -138,6 +144,8 @@ func addAnimalLookup() {
Description: "Animal name commonly found on a farm",
Example: "Chicken",
Output: "string",
+ Aliases: []string{"livestock animal", "barnyard animal", "agricultural animal", "domestic animal", "farm livestock"},
+ Keywords: []string{"farm", "animal", "livestock", "domestic", "agriculture", "commonly", "cattle", "barnyard", "herd", "poultry", "swine", "sheep", "goat", "horse", "pig"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return farmAnimal(f), nil
},
@@ -149,6 +157,8 @@ func addAnimalLookup() {
Description: "Various breeds that define different cats",
Example: "Chausie",
Output: "string",
+ Aliases: []string{"cat breed", "feline breed", "domestic cat", "pet cat", "kitty breed"},
+ Keywords: []string{"breed", "feline", "pet", "domestic", "various", "persian", "siamese", "maine", "coon", "tabby", "calico", "tuxedo", "kitten"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return cat(f), nil
},
@@ -160,6 +170,8 @@ func addAnimalLookup() {
Description: "Various breeds that define different dogs",
Example: "Norwich Terrier",
Output: "string",
+ Aliases: []string{"dog breed", "canine breed", "domestic dog", "pet dog", "fido breed"},
+ Keywords: []string{"breed", "canine", "pet", "domestic", "various", "labrador", "retriever", "terrier", "shepherd", "bulldog", "poodle", "puppy", "hound"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return dog(f), nil
},
@@ -171,6 +183,8 @@ func addAnimalLookup() {
Description: "Distinct species of birds",
Example: "goose",
Output: "string",
+ Aliases: []string{"bird species", "avian species", "feathered animal", "winged creature", "bird type"},
+ Keywords: []string{"species", "avian", "feather", "wing", "distinct", "sparrow", "eagle", "hawk", "owl", "duck", "goose", "parrot", "finch", "robin"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return bird(f), nil
},
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/app.go b/vendor/github.com/brianvoe/gofakeit/v7/app.go
index 9c66cd5c..44c414f9 100644
--- a/vendor/github.com/brianvoe/gofakeit/v7/app.go
+++ b/vendor/github.com/brianvoe/gofakeit/v7/app.go
@@ -67,6 +67,8 @@ func addAppLookup() {
Description: "Software program designed for a specific purpose or task on a computer or mobile device",
Example: "Parkrespond",
Output: "string",
+ Aliases: []string{"software name", "application name", "mobile app name", "program title", "app title"},
+ Keywords: []string{"app", "name", "software", "program", "application", "mobile", "device", "computer", "ios", "android", "desktop", "web", "platform", "title"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return appName(f), nil
},
@@ -78,6 +80,8 @@ func addAppLookup() {
Description: "Particular release of an application in Semantic Versioning format",
Example: "1.12.14",
Output: "string",
+ Aliases: []string{"semantic version", "app release", "software version", "version number", "release version"},
+ Keywords: []string{"app", "version", "release", "semantic", "versioning", "application", "major", "minor", "patch", "build", "number", "format", "tag"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return appVersion(f), nil
},
@@ -89,6 +93,8 @@ func addAppLookup() {
Description: "Person or group creating and developing an application",
Example: "Qado Energy, Inc.",
Output: "string",
+ Aliases: []string{"app developer", "software author", "application creator", "program developer", "app creator"},
+ Keywords: []string{"app", "author", "developer", "creator", "person", "company", "group", "creating", "programmer", "coder", "engineer", "team", "organization", "studio", "publisher"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return appAuthor(f), nil
},
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/auth.go b/vendor/github.com/brianvoe/gofakeit/v7/auth.go
index 53afa3e5..e89fa751 100644
--- a/vendor/github.com/brianvoe/gofakeit/v7/auth.go
+++ b/vendor/github.com/brianvoe/gofakeit/v7/auth.go
@@ -11,7 +11,13 @@ func (f *Faker) Username() string {
}
func username(f *Faker) string {
- return getRandValue(f, []string{"person", "last"}) + replaceWithNumbers(f, "####")
+ username := getRandValue(f, []string{"auth", "username"})
+ username, err := generate(f, username)
+ if err != nil {
+ return username // fallback to raw template if generation fails
+ }
+
+ return username
}
// Password will generate a random password.
@@ -32,55 +38,91 @@ func password(f *Faker, lower bool, upper bool, numeric bool, special bool, spac
num = 5
}
- // Setup weights
- items := make([]any, 0)
- weights := make([]float32, 0)
- if lower {
- items = append(items, "l")
- weights = append(weights, 4)
- }
- if upper {
- items = append(items, "u")
- weights = append(weights, 4)
- }
- if numeric {
- items = append(items, "n")
- weights = append(weights, 3)
- }
- if special {
- items = append(items, "e")
- weights = append(weights, 2)
- }
- if space {
- items = append(items, "a")
- weights = append(weights, 1)
+ type charGroup struct {
+ chars string
+ weight int
+ isSpace bool
}
+ defaultNonSpace := [...]charGroup{
+ {chars: lowerStr, weight: 4},
+ {chars: upperStr, weight: 4},
+ {chars: numericStr, weight: 3},
+ }
+ const defaultNonSpaceWeight = 4 + 4 + 3
+
+ var (
+ activeBuf [5]charGroup
+ nonSpaceBuf [5]charGroup
+ active []charGroup
+ totalWeight int
+ nonSpace []charGroup
+ nonSpaceWeight int
+ )
+
+ appendGroup := func(enabled bool, chars string, weight int, isSpace bool) {
+ if !enabled {
+ return
+ }
+ active = append(active, charGroup{chars: chars, weight: weight, isSpace: isSpace})
+ totalWeight += weight
+ if !isSpace {
+ nonSpace = append(nonSpace, charGroup{chars: chars, weight: weight})
+ nonSpaceWeight += weight
+ }
+ }
+
+ active = activeBuf[:0]
+ nonSpace = nonSpaceBuf[:0]
+ appendGroup(lower, lowerStr, 4, false)
+ appendGroup(upper, upperStr, 4, false)
+ appendGroup(numeric, numericStr, 3, false)
+ appendGroup(special, specialSafeStr, 2, false)
+ appendGroup(space, spaceStr, 1, true)
+
// If no items are selected then default to lower, upper, numeric
- if len(items) == 0 {
- items = append(items, "l", "u", "n")
- weights = append(weights, 4, 4, 3)
+ if len(active) == 0 {
+ active = defaultNonSpace[:]
+ totalWeight = defaultNonSpaceWeight
+ nonSpace = active
+ nonSpaceWeight = totalWeight
+ } else if nonSpaceWeight == 0 {
+ // No non-space characters were added (only spaces); fall back to defaults.
+ nonSpace = defaultNonSpace[:]
+ nonSpaceWeight = defaultNonSpaceWeight
+ }
+
+ draw := func(groups []charGroup, total int) byte {
+ if total <= 0 {
+ groups = defaultNonSpace[:]
+ total = defaultNonSpaceWeight
+ }
+
+ r := f.IntN(total)
+ for _, g := range groups {
+ if r < g.weight {
+ return g.chars[f.IntN(len(g.chars))]
+ }
+ r -= g.weight
+ }
+
+ // Should never be reached, but fall back to the last group just in case.
+ g := groups[len(groups)-1]
+ return g.chars[f.IntN(len(g.chars))]
}
// Create byte slice
b := make([]byte, num)
- for i := 0; i <= num-1; i++ {
- // Run weighted
- weight, _ := weighted(f, items, weights)
+ // Guarantee at least one character from each enabled non-space group so
+ // the password always satisfies the requested character-set criteria.
+ for i, g := range nonSpace {
+ b[i] = g.chars[f.IntN(len(g.chars))]
+ }
- switch weight.(string) {
- case "l":
- b[i] = lowerStr[f.Int64()%int64(len(lowerStr))]
- case "u":
- b[i] = upperStr[f.Int64()%int64(len(upperStr))]
- case "n":
- b[i] = numericStr[f.Int64()%int64(len(numericStr))]
- case "e":
- b[i] = specialSafeStr[f.Int64()%int64(len(specialSafeStr))]
- case "a":
- b[i] = spaceStr[f.Int64()%int64(len(spaceStr))]
- }
+ // Fill the remaining positions randomly from all active groups.
+ for i := len(nonSpace); i < num; i++ {
+ b[i] = draw(active, totalWeight)
}
// Shuffle bytes
@@ -91,10 +133,10 @@ func password(f *Faker, lower bool, upper bool, numeric bool, special bool, spac
// Replace first or last character if it's a space, and other options are available
if b[0] == ' ' {
- b[0] = password(f, lower, upper, numeric, special, false, 1)[0]
+ b[0] = draw(nonSpace, nonSpaceWeight)
}
if b[len(b)-1] == ' ' {
- b[len(b)-1] = password(f, lower, upper, numeric, special, false, 1)[0]
+ b[len(b)-1] = draw(nonSpace, nonSpaceWeight)
}
return string(b)
@@ -107,6 +149,18 @@ func addAuthLookup() {
Description: "Unique identifier assigned to a user for accessing an account or system",
Example: "Daniel1364",
Output: "string",
+ Aliases: []string{
+ "user name",
+ "login name",
+ "account username",
+ "account login",
+ "screen name",
+ "user handle",
+ },
+ Keywords: []string{
+ "login", "handle", "userid", "screenname",
+ "user", "account", "credential", "signin", "alias", "profile", "uid",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return username(f), nil
},
@@ -118,6 +172,19 @@ func addAuthLookup() {
Description: "Secret word or phrase used to authenticate access to a system or account",
Example: "EEP+wwpk 4lU-eHNXlJZ4n K9%v&TZ9e",
Output: "string",
+ Aliases: []string{
+ "user password",
+ "account password",
+ "login password",
+ "secret phrase",
+ "auth secret",
+ },
+ Keywords: []string{
+ "passphrase", "pwd", "secret",
+ "credential", "authentication", "auth",
+ "security", "signin", "login",
+ "access", "key", "token", "hash", "encryption",
+ },
Params: []Param{
{Field: "lower", Display: "Lower", Type: "bool", Default: "true", Description: "Whether or not to add lower case characters"},
{Field: "upper", Display: "Upper", Type: "bool", Default: "true", Description: "Whether or not to add upper case characters"},
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/beer.go b/vendor/github.com/brianvoe/gofakeit/v7/beer.go
index a6bc493e..9b407d70 100644
--- a/vendor/github.com/brianvoe/gofakeit/v7/beer.go
+++ b/vendor/github.com/brianvoe/gofakeit/v7/beer.go
@@ -123,6 +123,8 @@ func addBeerLookup() {
Description: "Specific brand or variety of beer",
Example: "Duvel",
Output: "string",
+ Aliases: []string{"brand", "brewery", "label", "craft", "microbrew"},
+ Keywords: []string{"beer", "name", "variety", "specific", "alcoholic", "beverage", "lager", "ale", "stout", "pilsner", "ipa"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return beerName(f), nil
},
@@ -134,6 +136,8 @@ func addBeerLookup() {
Description: "Distinct characteristics and flavors of beer",
Example: "European Amber Lager",
Output: "string",
+ Aliases: []string{"style", "type", "category", "classification", "variety"},
+ Keywords: []string{"beer", "characteristics", "flavors", "distinct", "lager", "ale", "stout", "pilsner", "porter", "wheat", "amber"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return beerStyle(f), nil
},
@@ -145,6 +149,8 @@ func addBeerLookup() {
Description: "The flower used in brewing to add flavor, aroma, and bitterness to beer",
Example: "Glacier",
Output: "string",
+ Aliases: []string{"hop", "flower", "plant", "cone", "vine"},
+ Keywords: []string{"beer", "brewing", "flavor", "aroma", "bitterness", "ingredient", "humulus", "lupulus", "cascade", "citra", "mosaic"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return beerHop(f), nil
},
@@ -156,6 +162,8 @@ func addBeerLookup() {
Description: "Microorganism used in brewing to ferment sugars, producing alcohol and carbonation in beer",
Example: "1388 - Belgian Strong Ale",
Output: "string",
+ Aliases: []string{"yeast", "fungus", "microorganism", "culture", "strain"},
+ Keywords: []string{"beer", "brewing", "ferment", "sugars", "alcohol", "carbonation", "ingredient", "saccharomyces", "cerevisiae", "belgian", "ale"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return beerYeast(f), nil
},
@@ -167,6 +175,8 @@ func addBeerLookup() {
Description: "Processed barley or other grains, provides sugars for fermentation and flavor to beer",
Example: "Munich",
Output: "string",
+ Aliases: []string{"malt", "barley", "grain", "cereal", "kernel"},
+ Keywords: []string{"beer", "sugars", "fermentation", "flavor", "processed", "ingredient", "munich", "pale", "crystal", "roasted", "wheat", "rye"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return beerMalt(f), nil
},
@@ -178,6 +188,8 @@ func addBeerLookup() {
Description: "Measures the alcohol content in beer",
Example: "2.7%",
Output: "string",
+ Aliases: []string{"alcohol", "abv", "strength", "proof", "percentage"},
+ Keywords: []string{"beer", "content", "measure", "volume", "concentration", "level", "degree", "potency"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return beerAlcohol(f), nil
},
@@ -189,6 +201,8 @@ func addBeerLookup() {
Description: "Scale measuring bitterness of beer from hops",
Example: "29 IBU",
Output: "string",
+ Aliases: []string{"ibu", "bitterness", "scale", "units", "measurement"},
+ Keywords: []string{"beer", "hops", "measuring", "international", "bittering", "alpha", "acid", "level", "intensity"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return beerIbu(f), nil
},
@@ -200,6 +214,8 @@ func addBeerLookup() {
Description: "Scale indicating the concentration of extract in worts",
Example: "6.4°Blg",
Output: "string",
+ Aliases: []string{"blg", "density", "gravity", "extract", "concentration"},
+ Keywords: []string{"beer", "worts", "scale", "indicating", "balling", "plato", "sugar", "soluble", "solids", "degree"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return beerBlg(f), nil
},
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/book.go b/vendor/github.com/brianvoe/gofakeit/v7/book.go
index fd8e0910..4125524a 100644
--- a/vendor/github.com/brianvoe/gofakeit/v7/book.go
+++ b/vendor/github.com/brianvoe/gofakeit/v7/book.go
@@ -48,6 +48,8 @@ func addBookLookup() {
}`,
Output: "map[string]string",
ContentType: "application/json",
+ Aliases: []string{"printed", "pages", "bound", "subjects", "stories", "literature", "text"},
+ Keywords: []string{"written", "work", "consisting", "anna", "karenina", "toni", "morrison", "thriller"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return book(f), nil
},
@@ -59,6 +61,8 @@ func addBookLookup() {
Description: "The specific name given to a book",
Example: "Hamlet",
Output: "string",
+ Aliases: []string{"title", "name", "specific", "given", "heading"},
+ Keywords: []string{"book", "identification", "hamlet", "naming", "designation", "label", "caption"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return bookTitle(f), nil
},
@@ -70,6 +74,8 @@ func addBookLookup() {
Description: "The individual who wrote or created the content of a book",
Example: "Mark Twain",
Output: "string",
+ Aliases: []string{"author", "writer", "creator", "individual", "content", "literary"},
+ Keywords: []string{"book", "wrote", "created", "mark", "twain", "composer", "originator", "penned"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return bookAuthor(f), nil
},
@@ -81,6 +87,8 @@ func addBookLookup() {
Description: "Category or type of book defined by its content, style, or form",
Example: "Adventure",
Output: "string",
+ Aliases: []string{"type", "content", "style", "form", "literature", "classification"},
+ Keywords: []string{"book", "category", "defined", "adventure", "fiction", "non-fiction", "mystery", "romance", "sci-fi"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return bookGenre(f), nil
},
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/car.go b/vendor/github.com/brianvoe/gofakeit/v7/car.go
index def82dc4..6f8760db 100644
--- a/vendor/github.com/brianvoe/gofakeit/v7/car.go
+++ b/vendor/github.com/brianvoe/gofakeit/v7/car.go
@@ -84,6 +84,8 @@ func addCarLookup() {
}`,
Output: "map[string]any",
ContentType: "application/json",
+ Aliases: []string{"vehicle", "automobile", "transportation", "motor", "wheeled"},
+ Keywords: []string{"used", "passenger", "mini", "gasoline", "automatic", "fiat", "freestyle", "fwd"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return car(f), nil
},
@@ -95,6 +97,8 @@ func addCarLookup() {
Description: "Classification of cars based on size, use, or body style",
Example: "Passenger car mini",
Output: "string",
+ Aliases: []string{"classification", "size", "body", "style", "vehicle", "category"},
+ Keywords: []string{"car", "based", "passenger", "mini", "suv", "sedan", "hatchback", "convertible", "coupe"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return carType(f), nil
},
@@ -106,6 +110,8 @@ func addCarLookup() {
Description: "Type of energy source a car uses",
Example: "CNG",
Output: "string",
+ Aliases: []string{"energy", "source", "power", "vehicle"},
+ Keywords: []string{"car", "fuel", "uses", "cng", "gasoline", "diesel", "electric", "hybrid", "hydrogen", "ethanol"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return carFuelType(f), nil
},
@@ -117,6 +123,8 @@ func addCarLookup() {
Description: "Mechanism a car uses to transmit power from the engine to the wheels",
Example: "Manual",
Output: "string",
+ Aliases: []string{"mechanism", "power", "engine", "wheels", "vehicle"},
+ Keywords: []string{"car", "transmission", "transmit", "manual", "automatic", "cvt", "semi-automatic", "gearbox", "clutch"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return carTransmissionType(f), nil
},
@@ -128,6 +136,8 @@ func addCarLookup() {
Description: "Company or brand that manufactures and designs cars",
Example: "Nissan",
Output: "string",
+ Aliases: []string{"company", "brand", "manufacturer", "designer", "vehicle", "producer"},
+ Keywords: []string{"car", "maker", "manufactures", "nissan", "toyota", "honda", "ford", "bmw", "mercedes", "audi"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return carMaker(f), nil
},
@@ -139,6 +149,19 @@ func addCarLookup() {
Description: "Specific design or version of a car produced by a manufacturer",
Example: "Aveo",
Output: "string",
+ Aliases: []string{
+ "vehicle model",
+ "auto model",
+ "car type",
+ "car version",
+ "automobile model",
+ },
+ Keywords: []string{
+ "car", "model", "vehicle", "auto", "automobile",
+ "type", "edition", "variant", "series",
+ "sedan", "suv", "hatchback", "coupe", "convertible",
+ "civic", "camry", "accord", "corolla", "mustang", "prius",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return carModel(f), nil
},
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/celebrity.go b/vendor/github.com/brianvoe/gofakeit/v7/celebrity.go
index b00036d8..74b525ab 100644
--- a/vendor/github.com/brianvoe/gofakeit/v7/celebrity.go
+++ b/vendor/github.com/brianvoe/gofakeit/v7/celebrity.go
@@ -33,6 +33,8 @@ func addCelebrityLookup() {
Description: "Famous person known for acting in films, television, or theater",
Example: "Brad Pitt",
Output: "string",
+ Aliases: []string{"actor", "famous", "films", "television", "theater", "entertainment"},
+ Keywords: []string{"celebrity", "known", "brad", "pitt", "hollywood", "movie", "star", "performer", "artist"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return celebrityActor(f), nil
},
@@ -44,6 +46,8 @@ func addCelebrityLookup() {
Description: "High-profile individual known for significant achievements in business or entrepreneurship",
Example: "Elon Musk",
Output: "string",
+ Aliases: []string{"business", "entrepreneur", "high-profile", "achievements", "executive"},
+ Keywords: []string{"celebrity", "significant", "elon", "musk", "ceo", "founder", "investor", "tycoon", "magnate"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return celebrityBusiness(f), nil
},
@@ -55,6 +59,8 @@ func addCelebrityLookup() {
Description: "Famous athlete known for achievements in a particular sport",
Example: "Michael Phelps",
Output: "string",
+ Aliases: []string{"athlete", "famous", "achievements", "competition", "athletic", "player"},
+ Keywords: []string{"celebrity", "particular", "michael", "phelps", "olympics", "champion", "medalist", "record", "holder"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return celebritySport(f), nil
},
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/color.go b/vendor/github.com/brianvoe/gofakeit/v7/color.go
index fd8d2568..ca817806 100644
--- a/vendor/github.com/brianvoe/gofakeit/v7/color.go
+++ b/vendor/github.com/brianvoe/gofakeit/v7/color.go
@@ -63,6 +63,8 @@ func addColorLookup() {
Description: "Hue seen by the eye, returns the name of the color like red or blue",
Example: "MediumOrchid",
Output: "string",
+ Aliases: []string{"color name", "hue name", "visual color", "shade name", "color label"},
+ Keywords: []string{"hue", "chroma", "shade", "tone", "css", "name", "visual", "appearance", "pigment", "spectrum", "palette", "tint", "saturation", "brightness", "rgb", "hex"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return color(f), nil
},
@@ -71,10 +73,12 @@ func addColorLookup() {
AddFuncLookup("nicecolors", Info{
Display: "Nice Colors",
Category: "color",
- Description: "Attractive and appealing combinations of colors, returns an list of color hex codes",
+ Description: "Attractive and appealing combinations of colors, returns a list of color hex codes",
Example: `["#cfffdd","#b4dec1","#5c5863","#a85163","#ff1f4c"]`,
Output: "[]string",
ContentType: "application/json",
+ Aliases: []string{"color palette", "nice palette", "harmonious colors", "aesthetic palette", "design colors"},
+ Keywords: []string{"nice", "colors", "palette", "array", "hex", "design", "aesthetic", "beautiful", "harmonious", "scheme", "ui", "ux"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return niceColors(f), nil
},
@@ -86,6 +90,8 @@ func addColorLookup() {
Description: "Colors displayed consistently on different web browsers and devices",
Example: "black",
Output: "string",
+ Aliases: []string{"web safe color", "browser safe", "cross platform color", "universal color", "standard color"},
+ Keywords: []string{"safe", "color", "cross-platform", "css", "html", "compatible", "browser", "device", "universal", "stable", "standard"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return safeColor(f), nil
},
@@ -94,9 +100,11 @@ func addColorLookup() {
AddFuncLookup("hexcolor", Info{
Display: "Hex Color",
Category: "color",
- Description: "Six-digit code representing a color in the color model",
+ Description: "Six-digit hexadecimal code representing a color in the RGB color model",
Example: "#a99fb4",
Output: "string",
+ Aliases: []string{"hex color code", "css hex", "html hex", "web hex", "hexadecimal color"},
+ Keywords: []string{"hex", "hexcolor", "color", "rgb", "six-digit", "web", "css", "html", "design", "hexadecimal", "hash", "code"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return hexColor(f), nil
},
@@ -109,8 +117,11 @@ func addColorLookup() {
Example: "[85, 224, 195]",
Output: "[]int",
ContentType: "application/json",
+ Aliases: []string{"rgb triplet", "rgb array", "rgb value", "red green blue", "rgb color code"},
+ Keywords: []string{"rgb", "color", "red", "green", "blue", "triplet", "digital", "screen", "display", "primary", "additive", "value", "css"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return rgbColor(f), nil
},
})
+
}
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/company.go b/vendor/github.com/brianvoe/gofakeit/v7/company.go
index 64167295..fc628f63 100644
--- a/vendor/github.com/brianvoe/gofakeit/v7/company.go
+++ b/vendor/github.com/brianvoe/gofakeit/v7/company.go
@@ -117,6 +117,18 @@ func addCompanyLookup() {
Description: "Designated official name of a business or organization",
Example: "Moen, Pagac and Wuckert",
Output: "string",
+ Aliases: []string{
+ "business name",
+ "company name",
+ "organization name",
+ "corporate name",
+ "legal entity",
+ },
+ Keywords: []string{
+ "business", "organization", "corporation",
+ "enterprise", "firm", "entity", "brand",
+ "employer", "vendor", "partner",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return company(f), nil
},
@@ -128,6 +140,19 @@ func addCompanyLookup() {
Description: "Suffix at the end of a company name, indicating business structure, like 'Inc.' or 'LLC'",
Example: "Inc",
Output: "string",
+ Aliases: []string{
+ "business suffix",
+ "legal suffix",
+ "company ending",
+ "corporate suffix",
+ "entity suffix",
+ },
+ Keywords: []string{
+ "suffix", "ending", "company", "business", "entity",
+ "inc", "incorporated", "llc", "ltd", "limited",
+ "corp", "corporation", "plc", "gmbh", "sarl",
+ "legal", "structure", "designation",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return companySuffix(f), nil
},
@@ -139,6 +164,18 @@ func addCompanyLookup() {
Description: "Random bs company word",
Example: "front-end",
Output: "string",
+ Aliases: []string{
+ "business jargon",
+ "corporate jargon",
+ "marketing buzzword",
+ "tech buzzword",
+ "consulting speak",
+ },
+ Keywords: []string{
+ "jargon", "buzzwords", "synergy", "leverage",
+ "disrupt", "innovate", "scalable", "agile", "optimize",
+ "pipeline", "roadmap", "vision", "strategy", "corporate",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return bs(f), nil
},
@@ -150,6 +187,19 @@ func addCompanyLookup() {
Description: "Brief description or summary of a company's purpose, products, or services",
Example: "word",
Output: "string",
+ Aliases: []string{
+ "company blurb",
+ "company summary",
+ "company description",
+ "short overview",
+ "about text",
+ },
+ Keywords: []string{
+ "summary", "overview", "description",
+ "company", "profile", "about", "intro",
+ "purpose", "mission", "vision", "statement",
+ "services", "products", "offerings",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return blurb(f), nil
},
@@ -161,6 +211,19 @@ func addCompanyLookup() {
Description: "Trendy or overused term often used in business to sound impressive",
Example: "disintermediate",
Output: "string",
+ Aliases: []string{
+ "business buzzword",
+ "corporate buzzword",
+ "trendy term",
+ "catchphrase",
+ "marketing phrase",
+ },
+ Keywords: []string{
+ "jargon", "hype", "trend", "phrase",
+ "term", "corporate", "management", "marketing",
+ "innovation", "paradigm", "disruptive", "visionary",
+ "fashionable", "impressive",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return buzzWord(f), nil
},
@@ -169,7 +232,7 @@ func addCompanyLookup() {
AddFuncLookup("job", Info{
Display: "Job",
Category: "company",
- Description: "Position or role in employment, involving specific tasks and responsibilities",
+ Description: "Occupation or role in employment, involving specific tasks and responsibilities",
Example: `{
"company": "ClearHealthCosts",
"title": "Agent",
@@ -178,6 +241,22 @@ func addCompanyLookup() {
}`,
Output: "map[string]string",
ContentType: "application/json",
+ Aliases: []string{
+ "job role",
+ "job position",
+ "employment role",
+ "work role",
+ "career role",
+ "occupation",
+ "occupation role",
+ "occupation job",
+ },
+ Keywords: []string{
+ "role", "position", "employment", "work",
+ "career", "profession", "title",
+ "responsibilities", "tasks", "duties",
+ "staff", "employee", "hiring", "positioning",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return job(f), nil
},
@@ -189,6 +268,18 @@ func addCompanyLookup() {
Description: "Specific title for a position or role within a company or organization",
Example: "Director",
Output: "string",
+ Aliases: []string{
+ "job designation",
+ "position title",
+ "role title",
+ "employment title",
+ "official title",
+ },
+ Keywords: []string{
+ "job", "title", "designation", "position", "role",
+ "occupation", "profession", "career",
+ "company", "organization", "staff", "employee",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return jobTitle(f), nil
},
@@ -200,6 +291,18 @@ func addCompanyLookup() {
Description: "Word used to describe the duties, requirements, and nature of a job",
Example: "Central",
Output: "string",
+ Aliases: []string{
+ "job modifier",
+ "job adjective",
+ "role descriptor",
+ "title descriptor",
+ "position descriptor",
+ },
+ Keywords: []string{
+ "descriptor", "modifier", "adjective", "qualifier",
+ "job", "role", "title", "position",
+ "label", "term", "descriptive", "characterization",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return jobDescriptor(f), nil
},
@@ -211,6 +314,20 @@ func addCompanyLookup() {
Description: "Random job level",
Example: "Assurance",
Output: "string",
+ Aliases: []string{
+ "seniority level",
+ "career level",
+ "position level",
+ "role level",
+ "job grade",
+ "job band",
+ },
+ Keywords: []string{
+ "level", "seniority", "rank", "tier", "grade", "band",
+ "entry", "junior", "associate", "mid", "senior",
+ "lead", "staff", "principal", "manager", "director",
+ "executive",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return jobLevel(f), nil
},
@@ -222,6 +339,19 @@ func addCompanyLookup() {
Description: "Catchphrase or motto used by a company to represent its brand or values",
Example: "Universal seamless Focus, interactive.",
Output: "string",
+ Aliases: []string{
+ "company slogan",
+ "brand slogan",
+ "brand tagline",
+ "company motto",
+ "advertising slogan",
+ },
+ Keywords: []string{
+ "tagline", "motto", "catchphrase",
+ "brand", "company", "marketing", "advertising",
+ "identity", "values", "mission", "vision",
+ "strapline", "promo", "campaign",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return slogan(f), nil
},
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/csv.go b/vendor/github.com/brianvoe/gofakeit/v7/csv.go
index 7f31ec2f..dff0df90 100644
--- a/vendor/github.com/brianvoe/gofakeit/v7/csv.go
+++ b/vendor/github.com/brianvoe/gofakeit/v7/csv.go
@@ -46,7 +46,7 @@ func csvFunc(f *Faker, co *CSVOptions) ([]byte, error) {
}
// Check fields
- if co.Fields == nil || len(co.Fields) <= 0 {
+ if len(co.Fields) <= 0 {
return nil, errors.New("must pass fields in order to build json object(s)")
}
@@ -134,6 +134,12 @@ func addFileCSVLookup() {
2,Osborne,Hilll,XPJ9OVNbs5lm`,
Output: "[]byte",
ContentType: "text/csv",
+ Aliases: []string{
+ "comma separated", "csv file", "data table", "flat file", "spreadsheet format", "tabular data",
+ },
+ Keywords: []string{
+ "comma", "separated", "values", "format", "data", "spreadsheet", "entries", "rows", "columns", "dataset", "records",
+ },
Params: []Param{
{Field: "delimiter", Display: "Delimiter", Type: "string", Default: ",", Description: "Separator in between row values"},
{Field: "rowcount", Display: "Row Count", Type: "int", Default: "100", Description: "Number of rows"},
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/data/address.go b/vendor/github.com/brianvoe/gofakeit/v7/data/address.go
index 98d88e82..b8861109 100644
--- a/vendor/github.com/brianvoe/gofakeit/v7/data/address.go
+++ b/vendor/github.com/brianvoe/gofakeit/v7/data/address.go
@@ -6,6 +6,7 @@ var Address = map[string][]string{
"street_prefix": {"North", "East", "West", "South", "New", "Lake", "Port"},
"street_name": {"Alley", "Avenue", "Branch", "Bridge", "Brook", "Brooks", "Burg", "Burgs", "Bypass", "Camp", "Canyon", "Cape", "Causeway", "Center", "Centers", "Circle", "Circles", "Cliff", "Cliffs", "Club", "Common", "Corner", "Corners", "Course", "Court", "Courts", "Cove", "Coves", "Creek", "Crescent", "Crest", "Crossing", "Crossroad", "Curve", "Dale", "Dam", "Divide", "Drive", "Drive", "Drives", "Estate", "Estates", "Expressway", "Extension", "Extensions", "Fall", "Falls", "Ferry", "Field", "Fields", "Flat", "Flats", "Ford", "Fords", "Forest", "Forge", "Forges", "Fork", "Forks", "Fort", "Freeway", "Garden", "Gardens", "Gateway", "Glen", "Glens", "Green", "Greens", "Grove", "Groves", "Harbor", "Harbors", "Haven", "Heights", "Highway", "Hill", "Hills", "Hollow", "Inlet", "Inlet", "Island", "Island", "Islands", "Islands", "Isle", "Isle", "Junction", "Junctions", "Key", "Keys", "Knoll", "Knolls", "Lake", "Lakes", "Land", "Landing", "Lane", "Light", "Lights", "Loaf", "Lock", "Locks", "Locks", "Lodge", "Lodge", "Loop", "Mall", "Manor", "Manors", "Meadow", "Meadows", "Mews", "Mill", "Mills", "Mission", "Mission", "Motorway", "Mount", "Mountain", "Mountain", "Mountains", "Mountains", "Neck", "Orchard", "Oval", "Overpass", "Park", "Parks", "Parkway", "Parkways", "Pass", "Passage", "Path", "Pike", "Pine", "Pines", "Place", "Plain", "Plains", "Plains", "Plaza", "Plaza", "Point", "Points", "Port", "Port", "Ports", "Ports", "Prairie", "Prairie", "Radial", "Ramp", "Ranch", "Rapid", "Rapids", "Rest", "Ridge", "Ridges", "River", "Road", "Road", "Roads", "Roads", "Route", "Row", "Rue", "Run", "Shoal", "Shoals", "Shore", "Shores", "Skyway", "Spring", "Springs", "Springs", "Spur", "Spurs", "Square", "Square", "Squares", "Squares", "Station", "Station", "Stravenue", "Stravenue", "Stream", "Stream", "Street", "Street", "Streets", "Summit", "Summit", "Terrace", "Throughway", "Trace", "Track", "Trafficway", "Trail", "Trail", "Tunnel", "Tunnel", "Turnpike", "Turnpike", "Underpass", "Union", "Unions", "Valley", "Valleys", "Via", "Viaduct", "View", "Views", "Village", "Village", "Villages", "Ville", "Vista", "Vista", "Walk", "Walks", "Wall", "Way", "Ways", "Well", "Wells"},
"street_suffix": {"town", "ton", "land", "ville", "berg", "burgh", "borough", "bury", "view", "port", "mouth", "stad", "furt", "chester", "mouth", "fort", "haven", "side", "shire"},
+ "unit": {"Apt", "Apartment", "Suite", "Ste", "Unit", "Floor", "Fl", "Room", "Rm", "Office", "Ofc", "Studio", "Loft", "Penthouse", "Ph"},
"city": {"New York City", "Los Angeles", "Chicago", "Houston", "Philadelphia", "Phoenix", "San Antonio", "San Diego", "Dallas", "San Jose", "Austin", "Jacksonville", "Indianapolis", "San Francisco", "Columbus", "Fort Worth", "Charlotte", "Detroit", "El Paso", "Memphis", "Boston", "Seattle", "Denver", "Washington", "Nashville-Davidson", "Baltimore", "Louisville/Jefferson", "Portland", "Oklahoma", "Milwaukee", "Las Vegas", "Albuquerque", "Tucson", "Fresno", "Sacramento", "Long Beach", "Kansas", "Mesa", "Virginia Beach", "Atlanta", "Colorado Springs", "Raleigh", "Omaha", "Miami", "Oakland", "Tulsa", "Minneapolis", "Cleveland", "Wichita", "Arlington", "New Orleans", "Bakersfield", "Tampa", "Honolulu", "Anaheim", "Aurora", "Santa Ana", "St. Louis", "Riverside", "Corpus Christi", "Pittsburgh", "Lexington-Fayette", "Stockton", "Cincinnati", "St. Paul", "Toledo", "Newark", "Greensboro", "Plano", "Henderson", "Lincoln", "Buffalo", "Fort Wayne", "Jersey", "Chula Vista", "Orlando", "St. Petersburg", "Norfolk", "Chandler", "Laredo", "Madison", "Durham", "Lubbock", "Winston-Salem", "Garland", "Glendale", "Hialeah", "Reno", "Baton Rouge", "Irvine", "Chesapeake", "Irving", "Scottsdale", "North Las Vegas", "Fremont", "San Bernardino", "Boise", "Birmingham"},
"state": {"Alabama", "Alaska", "Arizona", "Arkansas", "California", "Colorado", "Connecticut", "Delaware", "Florida", "Georgia", "Hawaii", "Idaho", "Illinois", "Indiana", "Iowa", "Kansas", "Kentucky", "Louisiana", "Maine", "Maryland", "Massachusetts", "Michigan", "Minnesota", "Mississippi", "Missouri", "Montana", "Nebraska", "Nevada", "New Hampshire", "New Jersey", "New Mexico", "New York", "North Carolina", "North Dakota", "Ohio", "Oklahoma", "Oregon", "Pennsylvania", "Rhode Island", "South Carolina", "South Dakota", "Tennessee", "Texas", "Utah", "Vermont", "Virginia", "Washington", "West Virginia", "Wisconsin", "Wyoming"},
"state_abr": {"AL", "AK", "AZ", "AR", "CA", "CO", "CT", "DE", "FL", "GA", "HI", "ID", "IL", "IN", "IA", "KS", "KY", "LA", "ME", "MD", "MA", "MI", "MN", "MS", "MO", "MT", "NE", "NV", "NH", "NJ", "NM", "NY", "NC", "ND", "OH", "OK", "OR", "PA", "RI", "SC", "SD", "TN", "TX", "UT", "VT", "VA", "WA", "WV", "WI", "WY", "AE", "AA", "AP"},
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/data/airline.go b/vendor/github.com/brianvoe/gofakeit/v7/data/airline.go
new file mode 100644
index 00000000..1b21ee4d
--- /dev/null
+++ b/vendor/github.com/brianvoe/gofakeit/v7/data/airline.go
@@ -0,0 +1,120 @@
+package data
+
+// Airline consists of various airline information
+var Airline = map[string][]string{
+ "aircraft_type": {
+ "narrowbody",
+ "widebody",
+ "regional",
+ },
+ "airplane": {
+ "Airbus A220", "Airbus A319", "Airbus A320", "Airbus A321", "Airbus A330",
+ "Airbus A340", "Airbus A350", "Airbus A380",
+ "Boeing 717", "Boeing 737", "Boeing 747", "Boeing 757", "Boeing 767",
+ "Boeing 777", "Boeing 787",
+ "Embraer E170", "Embraer E175", "Embraer E190", "Embraer E195",
+ "Bombardier CRJ200", "Bombardier CRJ700", "Bombardier CRJ900", "Bombardier CRJ1000",
+ "ATR 42", "ATR 72",
+ "De Havilland Dash 8",
+ "McDonnell Douglas MD-80", "McDonnell Douglas MD-90",
+ },
+ "airport": {
+ "Hartsfield-Jackson Atlanta International Airport",
+ "Los Angeles International Airport",
+ "O'Hare International Airport",
+ "Dallas/Fort Worth International Airport",
+ "Denver International Airport",
+ "John F. Kennedy International Airport",
+ "San Francisco International Airport",
+ "Seattle-Tacoma International Airport",
+ "McCarran International Airport",
+ "Orlando International Airport",
+ "Miami International Airport",
+ "Charlotte Douglas International Airport",
+ "Newark Liberty International Airport",
+ "Phoenix Sky Harbor International Airport",
+ "George Bush Intercontinental Airport",
+ "Minneapolis-St Paul International Airport",
+ "Detroit Metropolitan Airport",
+ "Boston Logan International Airport",
+ "Fort Lauderdale-Hollywood International Airport",
+ "Philadelphia International Airport",
+ "LaGuardia Airport",
+ "Baltimore/Washington International Airport",
+ "Salt Lake City International Airport",
+ "Ronald Reagan Washington National Airport",
+ "Midway International Airport",
+ "San Diego International Airport",
+ "Tampa International Airport",
+ "Portland International Airport",
+ "Honolulu International Airport",
+ "Austin-Bergstrom International Airport",
+ "Nashville International Airport",
+ "Raleigh-Durham International Airport",
+ "Sacramento International Airport",
+ "Kansas City International Airport",
+ "Cleveland Hopkins International Airport",
+ "Indianapolis International Airport",
+ "San Jose International Airport",
+ "Cincinnati/Northern Kentucky International Airport",
+ "Pittsburgh International Airport",
+ "St. Louis Lambert International Airport",
+ "Heathrow Airport",
+ "Charles de Gaulle Airport",
+ "Dubai International Airport",
+ "Tokyo Haneda Airport",
+ "Los Angeles International Airport",
+ "Frankfurt Airport",
+ "Istanbul Airport",
+ "Guangzhou Baiyun International Airport",
+ "Amsterdam Airport Schiphol",
+ "Hong Kong International Airport",
+ "Singapore Changi Airport",
+ "Incheon International Airport",
+ "Shanghai Pudong International Airport",
+ "Munich Airport",
+ "Barcelona-El Prat Airport",
+ "Sydney Kingsford Smith Airport",
+ "Toronto Pearson International Airport",
+ "Vancouver International Airport",
+ "Zurich Airport",
+ "Vienna International Airport",
+ "Brussels Airport",
+ "Copenhagen Airport",
+ "Stockholm Arlanda Airport",
+ "Oslo Airport",
+ "Helsinki-Vantaa Airport",
+ "Athens International Airport",
+ "Rome Fiumicino Airport",
+ "Milan Malpensa Airport",
+ "Madrid-Barajas Airport",
+ "Lisbon Portela Airport",
+ "Dublin Airport",
+ "Manchester Airport",
+ "Edinburgh Airport",
+ "Melbourne Airport",
+ "Brisbane Airport",
+ "Auckland Airport",
+ "Johannesburg O.R. Tambo International Airport",
+ "Cairo International Airport",
+ "Nairobi Jomo Kenyatta International Airport",
+ "São Paulo-Guarulhos International Airport",
+ "Mexico City International Airport",
+ "Buenos Aires Ezeiza International Airport",
+ "Santiago International Airport",
+ "Lima Jorge Chávez International Airport",
+ "Bogotá El Dorado International Airport",
+ "Panama City Tocumen International Airport",
+ },
+ "iata": {
+ "ATL", "LAX", "ORD", "DFW", "DEN", "JFK", "SFO", "SEA", "LAS", "MCO",
+ "MIA", "CLT", "EWR", "PHX", "IAH", "MSP", "DTW", "BOS", "FLL", "PHL",
+ "LGA", "BWI", "SLC", "DCA", "MDW", "SAN", "TPA", "PDX", "HNL", "AUS",
+ "BNA", "RDU", "SMF", "MCI", "CLE", "IND", "SJC", "CVG", "PIT", "STL",
+ "LHR", "CDG", "DXB", "HND", "FRA", "IST", "CAN", "AMS", "HKG", "SIN",
+ "ICN", "PVG", "MUC", "BCN", "SYD", "YYZ", "YVR", "ZRH", "VIE", "BRU",
+ "CPH", "ARN", "OSL", "HEL", "ATH", "FCO", "MXP", "MAD", "LIS", "DUB",
+ "MAN", "EDI", "MEL", "BNE", "AKL", "JNB", "CAI", "NBO", "GRU", "MEX",
+ "EZE", "SCL", "LIM", "BOG", "PTY",
+ },
+}
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/data/auth.go b/vendor/github.com/brianvoe/gofakeit/v7/data/auth.go
new file mode 100644
index 00000000..2a3bcdde
--- /dev/null
+++ b/vendor/github.com/brianvoe/gofakeit/v7/data/auth.go
@@ -0,0 +1,35 @@
+package data
+
+// Aut
+var Auth = map[string][]string{
+ "username": {
+ "{firstname}{number:0,9999}",
+ "{lastname}{number:0,9999}",
+ "{firstname}.{lastname}",
+ "{firstname}_{lastname}",
+ "{adjective}{animal}",
+ "{color}{animal}",
+ "{firstname}{lastname}",
+ "the{lastname}",
+ "mr{lastname}",
+ "ms{lastname}",
+ "dr{lastname}",
+ "{petname}{number:0,999}",
+ "{noun}{number:0,999}",
+ "{adjective}_{noun}",
+ "{color}_{noun}",
+ "{animal}_{number:10,99}",
+ "{animal}.{number:10,99}",
+ "{gamertag}",
+ "{gamertag}{number:0,99}",
+ "{firstname}{adjective}",
+ "{adjective}{firstname}",
+ "{firstname}{color}",
+ "{city}{number:0,99}",
+ "{programminglanguage}{number:0,999}",
+ "{jobtitle}{number:0,999}",
+ "{firstname}###",
+ "{lastname}_???",
+ "{firstname}.{number:10,99}",
+ },
+}
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/data/bank.go b/vendor/github.com/brianvoe/gofakeit/v7/data/bank.go
new file mode 100644
index 00000000..47e81b26
--- /dev/null
+++ b/vendor/github.com/brianvoe/gofakeit/v7/data/bank.go
@@ -0,0 +1,67 @@
+package data
+
+var Bank = map[string][]string{
+ "name": {
+ "Agricultural Bank of China",
+ "BNP Paribas",
+ "Banco Bilbao Vizcaya Argentaria",
+ "Banco Santander",
+ "Bank of America",
+ "Bank of China",
+ "Bank of Communications",
+ "Barclays",
+ "Capital One Financial Corporation",
+ "China Citic Bank",
+ "China Construction Bank Corporation",
+ "China Everbright Bank",
+ "China Merchants Bank",
+ "China Minsheng Bank",
+ "Citigroup",
+ "Commonwealth Bank Group",
+ "Credit Agricole Group",
+ "Credit Mutuel",
+ "Deutsche Bank",
+ "Goldman Sachs",
+ "Groupe BPCE",
+ "HDFC Bank",
+ "HSBC Holdings",
+ "Hua Xia Bank",
+ "ING Group",
+ "Industrial Bank",
+ "Industrial and Commercial Bank of China",
+ "Intesa Sanpaolo",
+ "JP Morgan Chase & Co",
+ "Lloyds Banking Group",
+ "Mitsubishi UFJ Financial Group",
+ "Mizuho Financial Group",
+ "Morgan Stanley",
+ "PNC Financial Services Group",
+ "Ping An Bank",
+ "Postal Savings Bank of China",
+ "Rabobank Group",
+ "Royal Bank of Canada",
+ "Sberbank",
+ "Scotiabank",
+ "Shanghai Pudong Development Bank",
+ "Societe Generale",
+ "State Bank of India",
+ "Sumitomo Mitsui Financial Group",
+ "Toronto Dominion Bank",
+ "Truist Bank",
+ "UBS",
+ "US Bancorp",
+ "UniCredit",
+ "Wells Fargo & Co",
+ },
+ "type": {
+ "Central Bank",
+ "Commercial Bank",
+ "Cooperative Bank",
+ "Investment Bank",
+ "Online Bank",
+ "Policy Bank",
+ "Private Bank",
+ "Retail Bank",
+ "Savings Bank",
+ },
+}
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/data/currency.go b/vendor/github.com/brianvoe/gofakeit/v7/data/currency.go
index 13b80199..792fc710 100644
--- a/vendor/github.com/brianvoe/gofakeit/v7/data/currency.go
+++ b/vendor/github.com/brianvoe/gofakeit/v7/data/currency.go
@@ -2,6 +2,6 @@ package data
// Currency consists of currency information
var Currency = map[string][]string{
- "short": {"AED", "AFN", "ALL", "AMD", "ANG", "AOA", "ARS", "AUD", "AWG", "AZN", "BAM", "BBD", "BDT", "BGN", "BHD", "BIF", "BMD", "BND", "BOB", "BRL", "BSD", "BTN", "BWP", "BYR", "BZD", "CAD", "CDF", "CHF", "CLP", "CNY", "COP", "CRC", "CUC", "CUP", "CVE", "CZK", "DJF", "DKK", "DOP", "DZD", "EGP", "ERN", "ETB", "EUR", "FJD", "FKP", "GBP", "GEL", "GGP", "GHS", "GIP", "GMD", "GNF", "GTQ", "GYD", "HKD", "HNL", "HRK", "HTG", "HUF", "IDR", "ILS", "IMP", "INR", "IQD", "IRR", "ISK", "JEP", "JMD", "JOD", "JPY", "KES", "KGS", "KHR", "KMF", "KPW", "KRW", "KWD", "KYD", "KZT", "LAK", "LBP", "LKR", "LRD", "LSL", "LTL", "LYD", "MAD", "MDL", "MGA", "MKD", "MMK", "MNT", "MOP", "MRO", "MUR", "MVR", "MWK", "MXN", "MYR", "MZN", "NAD", "NGN", "NIO", "NOK", "NPR", "NZD", "OMR", "PAB", "PEN", "PGK", "PHP", "PKR", "PLN", "PYG", "QAR", "RON", "RSD", "RUB", "RWF", "SAR", "SBD", "SCR", "SDG", "SEK", "SGD", "SHP", "SLL", "SOS", "SPL", "SRD", "STD", "SVC", "SYP", "SZL", "THB", "TJS", "TMT", "TND", "TOP", "TRY", "TTD", "TVD", "TWD", "TZS", "UAH", "UGX", "USD", "UYU", "UZS", "VEF", "VND", "VUV", "WST", "XAF", "XCD", "XDR", "XOF", "XPF", "YER", "ZAR", "ZMW", "ZWD"},
- "long": {"United Arab Emirates Dirham", "Afghanistan Afghani", "Albania Lek", "Armenia Dram", "Netherlands Antilles Guilder", "Angola Kwanza", "Argentina Peso", "Australia Dollar", "Aruba Guilder", "Azerbaijan New Manat", "Bosnia and Herzegovina Convertible Marka", "Barbados Dollar", "Bangladesh Taka", "Bulgaria Lev", "Bahrain Dinar", "Burundi Franc", "Bermuda Dollar", "Brunei Darussalam Dollar", "Bolivia Boliviano", "Brazil Real", "Bahamas Dollar", "Bhutan Ngultrum", "Botswana Pula", "Belarus Ruble", "Belize Dollar", "Canada Dollar", "Congo/Kinshasa Franc", "Switzerland Franc", "Chile Peso", "China Yuan Renminbi", "Colombia Peso", "Costa Rica Colon", "Cuba Convertible Peso", "Cuba Peso", "Cape Verde Escudo", "Czech Republic Koruna", "Djibouti Franc", "Denmark Krone", "Dominican Republic Peso", "Algeria Dinar", "Egypt Pound", "Eritrea Nakfa", "Ethiopia Birr", "Euro Member Countries", "Fiji Dollar", "Falkland Islands (Malvinas) Pound", "United Kingdom Pound", "Georgia Lari", "Guernsey Pound", "Ghana Cedi", "Gibraltar Pound", "Gambia Dalasi", "Guinea Franc", "Guatemala Quetzal", "Guyana Dollar", "Hong Kong Dollar", "Honduras Lempira", "Croatia Kuna", "Haiti Gourde", "Hungary Forint", "Indonesia Rupiah", "Israel Shekel", "Isle of Man Pound", "India Rupee", "Iraq Dinar", "Iran Rial", "Iceland Krona", "Jersey Pound", "Jamaica Dollar", "Jordan Dinar", "Japan Yen", "Kenya Shilling", "Kyrgyzstan Som", "Cambodia Riel", "Comoros Franc", "Korea (North) Won", "Korea (South) Won", "Kuwait Dinar", "Cayman Islands Dollar", "Kazakhstan Tenge", "Laos Kip", "Lebanon Pound", "Sri Lanka Rupee", "Liberia Dollar", "Lesotho Loti", "Lithuania Litas", "Libya Dinar", "Morocco Dirham", "Moldova Leu", "Madagascar Ariary", "Macedonia Denar", "Myanmar (Burma) Kyat", "Mongolia Tughrik", "Macau Pataca", "Mauritania Ouguiya", "Mauritius Rupee", "Maldives (Maldive Islands) Rufiyaa", "Malawi Kwacha", "Mexico Peso", "Malaysia Ringgit", "Mozambique Metical", "Namibia Dollar", "Nigeria Naira", "Nicaragua Cordoba", "Norway Krone", "Nepal Rupee", "New Zealand Dollar", "Oman Rial", "Panama Balboa", "Peru Nuevo Sol", "Papua New Guinea Kina", "Philippines Peso", "Pakistan Rupee", "Poland Zloty", "Paraguay Guarani", "Qatar Riyal", "Romania New Leu", "Serbia Dinar", "Russia Ruble", "Rwanda Franc", "Saudi Arabia Riyal", "Solomon Islands Dollar", "Seychelles Rupee", "Sudan Pound", "Sweden Krona", "Singapore Dollar", "Saint Helena Pound", "Sierra Leone Leone", "Somalia Shilling", "Seborga Luigino", "Suriname Dollar", "São Tomé and Príncipe Dobra", "El Salvador Colon", "Syria Pound", "Swaziland Lilangeni", "Thailand Baht", "Tajikistan Somoni", "Turkmenistan Manat", "Tunisia Dinar", "Tonga Pa'anga", "Turkey Lira", "Trinidad and Tobago Dollar", "Tuvalu Dollar", "Taiwan New Dollar", "Tanzania Shilling", "Ukraine Hryvnia", "Uganda Shilling", "United States Dollar", "Uruguay Peso", "Uzbekistan Som", "Venezuela Bolivar", "Viet Nam Dong", "Vanuatu Vatu", "Samoa Tala", "Communauté Financière Africaine (BEAC) CFA Franc BEAC", "East Caribbean Dollar", "International Monetary Fund (IMF) Special Drawing Rights", "Communauté Financière Africaine (BCEAO) Franc", "Comptoirs Français du Pacifique (CFP) Franc", "Yemen Rial", "South Africa Rand", "Zambia Kwacha", "Zimbabwe Dollar"},
+ "short": {"AED", "AFN", "ALL", "AMD", "ANG", "AOA", "ARS", "AUD", "AWG", "AZN", "BAM", "BBD", "BDT", "BGN", "BHD", "BIF", "BMD", "BND", "BOB", "BRL", "BSD", "BTN", "BWP", "BYN", "BZD", "CAD", "CDF", "CHF", "CLP", "CNY", "COP", "CRC", "CUC", "CUP", "CVE", "CZK", "DJF", "DKK", "DOP", "DZD", "EGP", "ERN", "ETB", "EUR", "FJD", "FKP", "GBP", "GEL", "GHS", "GIP", "GMD", "GNF", "GTQ", "GYD", "HKD", "HNL", "HTG", "HUF", "IDR", "ILS", "INR", "IQD", "IRR", "ISK", "JMD", "JOD", "JPY", "KES", "KGS", "KHR", "KMF", "KPW", "KRW", "KWD", "KYD", "KZT", "LAK", "LBP", "LKR", "LRD", "LSL", "LYD", "MAD", "MDL", "MGA", "MKD", "MMK", "MNT", "MOP", "MRU", "MUR", "MVR", "MWK", "MXN", "MYR", "MZN", "NAD", "NGN", "NIO", "NOK", "NPR", "NZD", "OMR", "PAB", "PEN", "PGK", "PHP", "PKR", "PLN", "PYG", "QAR", "RON", "RSD", "RUB", "RWF", "SAR", "SBD", "SCR", "SDG", "SEK", "SGD", "SHP", "SLL", "SOS", "SRD", "STN", "SVC", "SYP", "SZL", "THB", "TJS", "TMT", "TND", "TOP", "TRY", "TTD", "TWD", "TZS", "UAH", "UGX", "USD", "UYU", "UZS", "VES", "VND", "VUV", "WST", "XAF", "XCD", "XDR", "XOF", "XPF", "YER", "ZAR", "ZMW", "ZWL"},
+ "long": {"United Arab Emirates Dirham", "Afghanistan Afghani", "Albania Lek", "Armenia Dram", "Netherlands Antilles Guilder", "Angola Kwanza", "Argentina Peso", "Australia Dollar", "Aruba Guilder", "Azerbaijan New Manat", "Bosnia and Herzegovina Convertible Marka", "Barbados Dollar", "Bangladesh Taka", "Bulgaria Lev", "Bahrain Dinar", "Burundi Franc", "Bermuda Dollar", "Brunei Darussalam Dollar", "Bolivia Boliviano", "Brazil Real", "Bahamas Dollar", "Bhutan Ngultrum", "Botswana Pula", "Belarus Ruble", "Belize Dollar", "Canada Dollar", "Congo/Kinshasa Franc", "Switzerland Franc", "Chile Peso", "China Yuan Renminbi", "Colombia Peso", "Costa Rica Colon", "Cuba Convertible Peso", "Cuba Peso", "Cape Verde Escudo", "Czech Republic Koruna", "Djibouti Franc", "Denmark Krone", "Dominican Republic Peso", "Algeria Dinar", "Egypt Pound", "Eritrea Nakfa", "Ethiopia Birr", "Euro Member Countries", "Fiji Dollar", "Falkland Islands (Malvinas) Pound", "United Kingdom Pound", "Georgia Lari", "Ghana Cedi", "Gibraltar Pound", "Gambia Dalasi", "Guinea Franc", "Guatemala Quetzal", "Guyana Dollar", "Hong Kong Dollar", "Honduras Lempira", "Haiti Gourde", "Hungary Forint", "Indonesia Rupiah", "Israel Shekel", "India Rupee", "Iraq Dinar", "Iran Rial", "Iceland Krona", "Jamaica Dollar", "Jordan Dinar", "Japan Yen", "Kenya Shilling", "Kyrgyzstan Som", "Cambodia Riel", "Comoros Franc", "Korea (North) Won", "Korea (South) Won", "Kuwait Dinar", "Cayman Islands Dollar", "Kazakhstan Tenge", "Laos Kip", "Lebanon Pound", "Sri Lanka Rupee", "Liberia Dollar", "Lesotho Loti", "Libya Dinar", "Morocco Dirham", "Moldova Leu", "Madagascar Ariary", "Macedonia Denar", "Myanmar (Burma) Kyat", "Mongolia Tughrik", "Macau Pataca", "Mauritania Ouguiya", "Mauritius Rupee", "Maldives (Maldive Islands) Rufiyaa", "Malawi Kwacha", "Mexico Peso", "Malaysia Ringgit", "Mozambique Metical", "Namibia Dollar", "Nigeria Naira", "Nicaragua Cordoba", "Norway Krone", "Nepal Rupee", "New Zealand Dollar", "Oman Rial", "Panama Balboa", "Peru Nuevo Sol", "Papua New Guinea Kina", "Philippines Peso", "Pakistan Rupee", "Poland Zloty", "Paraguay Guarani", "Qatar Riyal", "Romania New Leu", "Serbia Dinar", "Russia Ruble", "Rwanda Franc", "Saudi Arabia Riyal", "Solomon Islands Dollar", "Seychelles Rupee", "Sudan Pound", "Sweden Krona", "Singapore Dollar", "Saint Helena Pound", "Sierra Leone Leone", "Somalia Shilling", "Suriname Dollar", "São Tomé and Príncipe Dobra", "El Salvador Colon", "Syria Pound", "Swaziland Lilangeni", "Thailand Baht", "Tajikistan Somoni", "Turkmenistan Manat", "Tunisia Dinar", "Tonga Pa'anga", "Turkey Lira", "Trinidad and Tobago Dollar", "Taiwan New Dollar", "Tanzania Shilling", "Ukraine Hryvnia", "Uganda Shilling", "United States Dollar", "Uruguay Peso", "Uzbekistan Som", "Venezuela Bolivar", "Viet Nam Dong", "Vanuatu Vatu", "Samoa Tala", "Communauté Financière Africaine (BEAC) CFA Franc BEAC", "East Caribbean Dollar", "International Monetary Fund (IMF) Special Drawing Rights", "Communauté Financière Africaine (BCEAO) Franc", "Comptoirs Français du Pacifique (CFP) Franc", "Yemen Rial", "South Africa Rand", "Zambia Kwacha", "Zimbabwe Dollar"},
}
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/data/data.go b/vendor/github.com/brianvoe/gofakeit/v7/data/data.go
index 51a4f496..9a85e1b6 100644
--- a/vendor/github.com/brianvoe/gofakeit/v7/data/data.go
+++ b/vendor/github.com/brianvoe/gofakeit/v7/data/data.go
@@ -3,7 +3,9 @@ package data
// Data consists of the main set of fake information
var Data = map[string]map[string][]string{
"person": Person,
+ "auth": Auth,
"address": Address,
+ "airline": Airline,
"company": Company,
"job": Job,
"lorem": Lorem,
@@ -22,7 +24,7 @@ var Data = map[string]map[string][]string{
"car": Car,
"emoji": Emoji,
"word": Word,
- "sentence": Sentence,
+ "text": Text,
"food": Food,
"minecraft": Minecraft,
"celebrity": Celebrity,
@@ -31,7 +33,9 @@ var Data = map[string]map[string][]string{
"book": Books,
"movie": Movies,
"school": School,
+ "song": Songs,
"product": Product,
+ "bank": Bank,
}
func List() map[string][]string {
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/data/emoji.go b/vendor/github.com/brianvoe/gofakeit/v7/data/emoji.go
index 8f8ce80f..74a13bba 100644
--- a/vendor/github.com/brianvoe/gofakeit/v7/data/emoji.go
+++ b/vendor/github.com/brianvoe/gofakeit/v7/data/emoji.go
@@ -4,3537 +4,158 @@ package data
// Emoji consists of emoji information
var Emoji = map[string][]string{
- "emoji": {
- "😀",
- "😃",
- "😄",
- "😁",
- "😆",
- "😅",
- "🤣",
- "😂",
- "🙂",
- "🙃",
- "😉",
- "😊",
- "😇",
- "🥰",
- "😍",
- "🤩",
- "😘",
- "😗",
- "☺️",
- "😚",
- "😙",
- "😋",
- "😛",
- "😜",
- "🤪",
- "😝",
- "🤑",
- "🤗",
- "🤭",
- "🤫",
- "🤔",
- "🤐",
- "🤨",
- "😐",
- "😑",
- "😶",
- "😏",
- "😒",
- "🙄",
- "😬",
- "🤥",
- "😌",
- "😔",
- "😪",
- "🤤",
- "😴",
- "😷",
- "🤒",
- "🤕",
- "🤢",
- "🤮",
- "🤧",
- "🥵",
- "🥶",
- "🥴",
- "😵",
- "🤯",
- "🤠",
- "🥳",
- "😎",
- "🤓",
- "🧐",
- "😕",
- "😟",
- "🙁",
- "☹️",
- "😮",
- "😯",
- "😲",
- "😳",
- "🥺",
- "😦",
- "😧",
- "😨",
- "😰",
- "😥",
- "😢",
- "😭",
- "😱",
- "😖",
- "😣",
- "😞",
- "😓",
- "😩",
- "😫",
- "🥱",
- "😤",
- "😡",
- "😠",
- "🤬",
- "😈",
- "👿",
- "💀",
- "☠️",
- "💩",
- "🤡",
- "👹",
- "👺",
- "👻",
- "👽",
- "👾",
- "🤖",
- "😺",
- "😸",
- "😹",
- "😻",
- "😼",
- "😽",
- "🙀",
- "😿",
- "😾",
- "🙈",
- "🙉",
- "🙊",
- "💋",
- "💌",
- "💘",
- "💝",
- "💖",
- "💗",
- "💓",
- "💞",
- "💕",
- "💟",
- "❣️",
- "💔",
- "❤️",
- "🧡",
- "💛",
- "💚",
- "💙",
- "💜",
- "🤎",
- "🖤",
- "🤍",
- "💯",
- "💢",
- "💥",
- "💫",
- "💦",
- "💨",
- "🕳️",
- "💣",
- "💬",
- "🗨️",
- "🗯️",
- "💭",
- "💤",
- "👋",
- "🤚",
- "🖐️",
- "✋",
- "🖖",
- "👌",
- "🤏",
- "✌️",
- "🤞",
- "🤟",
- "🤘",
- "🤙",
- "👈",
- "👉",
- "👆",
- "🖕",
- "👇",
- "☝️",
- "👍",
- "👎",
- "✊",
- "👊",
- "🤛",
- "🤜",
- "👏",
- "🙌",
- "👐",
- "🤲",
- "🤝",
- "🙏",
- "✍️",
- "💅",
- "🤳",
- "💪",
- "🦾",
- "🦿",
- "🦵",
- "🦶",
- "👂",
- "🦻",
- "👃",
- "🧠",
- "🦷",
- "🦴",
- "👀",
- "👁️",
- "👅",
- "👄",
- "👶",
- "🧒",
- "👦",
- "👧",
- "🧑",
- "👱",
- "👨",
- "🧔",
- "👨🦰",
- "👨🦱",
- "👨🦳",
- "👨🦲",
- "👩",
- "👩🦰",
- "🧑🦰",
- "👩🦱",
- "🧑🦱",
- "👩🦳",
- "🧑🦳",
- "👩🦲",
- "🧑🦲",
- "👱♀️",
- "👱♂️",
- "🧓",
- "👴",
- "👵",
- "🙍",
- "🙍♂️",
- "🙍♀️",
- "🙎",
- "🙎♂️",
- "🙎♀️",
- "🙅",
- "🙅♂️",
- "🙅♀️",
- "🙆",
- "🙆♂️",
- "🙆♀️",
- "💁",
- "💁♂️",
- "💁♀️",
- "🙋",
- "🙋♂️",
- "🙋♀️",
- "🧏",
- "🧏♂️",
- "🧏♀️",
- "🙇",
- "🙇♂️",
- "🙇♀️",
- "🤦",
- "🤦♂️",
- "🤦♀️",
- "🤷",
- "🤷♂️",
- "🤷♀️",
- "🧑⚕️",
- "👨⚕️",
- "👩⚕️",
- "🧑🎓",
- "👨🎓",
- "👩🎓",
- "🧑🏫",
- "👨🏫",
- "👩🏫",
- "🧑⚖️",
- "👨⚖️",
- "👩⚖️",
- "🧑🌾",
- "👨🌾",
- "👩🌾",
- "🧑🍳",
- "👨🍳",
- "👩🍳",
- "🧑🔧",
- "👨🔧",
- "👩🔧",
- "🧑🏭",
- "👨🏭",
- "👩🏭",
- "🧑💼",
- "👨💼",
- "👩💼",
- "🧑🔬",
- "👨🔬",
- "👩🔬",
- "🧑💻",
- "👨💻",
- "👩💻",
- "🧑🎤",
- "👨🎤",
- "👩🎤",
- "🧑🎨",
- "👨🎨",
- "👩🎨",
- "🧑✈️",
- "👨✈️",
- "👩✈️",
- "🧑🚀",
- "👨🚀",
- "👩🚀",
- "🧑🚒",
- "👨🚒",
- "👩🚒",
- "👮",
- "👮♂️",
- "👮♀️",
- "🕵️",
- "💂",
- "💂♂️",
- "💂♀️",
- "👷",
- "👷♂️",
- "👷♀️",
- "🤴",
- "👸",
- "👳",
- "👳♂️",
- "👳♀️",
- "👲",
- "🧕",
- "🤵",
- "🤵♂️",
- "🤵♀️",
- "👰",
- "👰♂️",
- "👰♀️",
- "🤰",
- "🤱",
- "👩🍼",
- "👨🍼",
- "🧑🍼",
- "👼",
- "🎅",
- "🤶",
- "🧑🎄",
- "🦸",
- "🦸♂️",
- "🦸♀️",
- "🦹",
- "🦹♂️",
- "🦹♀️",
- "🧙",
- "🧙♂️",
- "🧙♀️",
- "🧚",
- "🧚♂️",
- "🧚♀️",
- "🧛",
- "🧛♂️",
- "🧛♀️",
- "🧜",
- "🧜♂️",
- "🧜♀️",
- "🧝",
- "🧝♂️",
- "🧝♀️",
- "🧞",
- "🧞♂️",
- "🧞♀️",
- "🧟",
- "🧟♂️",
- "🧟♀️",
- "💆",
- "💆♂️",
- "💆♀️",
- "💇",
- "💇♂️",
- "💇♀️",
- "🚶",
- "🚶♂️",
- "🚶♀️",
- "🧍",
- "🧍♂️",
- "🧍♀️",
- "🧎",
- "🧎♂️",
- "🧎♀️",
- "🧑🦯",
- "👨🦯",
- "👩🦯",
- "🧑🦼",
- "👨🦼",
- "👩🦼",
- "🧑🦽",
- "👨🦽",
- "👩🦽",
- "🏃",
- "🏃♂️",
- "🏃♀️",
- "💃",
- "🕺",
- "🕴️",
- "👯",
- "👯♂️",
- "👯♀️",
- "🧖",
- "🧖♂️",
- "🧖♀️",
- "🧗",
- "🧗♂️",
- "🧗♀️",
- "🤺",
- "🏇",
- "⛷️",
- "🏂",
- "🏌️",
- "🏄",
- "🚣",
- "🚣♂️",
- "🚣♀️",
- "🏊",
- "⛹️",
- "🏋️",
- "🚴",
- "🚴♂️",
- "🚴♀️",
- "🚵",
- "🚵♂️",
- "🚵♀️",
- "🤸",
- "🤸♂️",
- "🤸♀️",
- "🤼",
- "🤼♂️",
- "🤼♀️",
- "🤽",
- "🤽♂️",
- "🤽♀️",
- "🤾",
- "🤾♂️",
- "🤾♀️",
- "🤹",
- "🤹♂️",
- "🤹♀️",
- "🧘",
- "🧘♂️",
- "🧘♀️",
- "🛀",
- "🛌",
- "🧑🤝🧑",
- "👭",
- "👫",
- "👬",
- "💏",
- "👪",
- "👨👩👦",
- "👨👩👧",
- "👨👩👧👦",
- "👨👩👦👦",
- "👨👩👧👧",
- "👨👨👦",
- "👨👨👧",
- "👨👨👧👦",
- "👨👨👦👦",
- "👨👨👧👧",
- "👩👩👦",
- "👩👩👧",
- "👩👩👧👦",
- "👩👩👦👦",
- "👩👩👧👧",
- "👨👦",
- "👨👦👦",
- "👨👧",
- "👨👧👦",
- "👨👧👧",
- "👩👦",
- "👩👦👦",
- "👩👧",
- "👩👧👦",
- "👩👧👧",
- "🗣️",
- "👤",
- "👥",
- "👣",
- "🐵",
- "🐒",
- "🦍",
- "🦧",
- "🐶",
- "🐕",
- "🦮",
- "🐩",
- "🐺",
- "🦊",
- "🦝",
- "🐱",
- "🐈",
- "🐈⬛",
- "🦁",
- "🐯",
- "🐅",
- "🐆",
- "🐴",
- "🐎",
- "🦄",
- "🦓",
- "🦌",
- "🐮",
- "🐂",
- "🐃",
- "🐄",
- "🐷",
- "🐖",
- "🐗",
- "🐽",
- "🐏",
- "🐑",
- "🐐",
- "🐪",
- "🐫",
- "🦙",
- "🦒",
- "🐘",
- "🦏",
- "🦛",
- "🐭",
- "🐁",
- "🐀",
- "🐹",
- "🐰",
- "🐇",
- "🐿️",
- "🦔",
- "🦇",
- "🐻",
- "🐻❄️",
- "🐨",
- "🐼",
- "🦥",
- "🦦",
- "🦨",
- "🦘",
- "🦡",
- "🐾",
- "🦃",
- "🐔",
- "🐓",
- "🐣",
- "🐤",
- "🐥",
- "🐦",
- "🐧",
- "🕊️",
- "🦅",
- "🦆",
- "🦢",
- "🦉",
- "🦩",
- "🦚",
- "🦜",
- "🐸",
- "🐊",
- "🐢",
- "🦎",
- "🐍",
- "🐲",
- "🐉",
- "🦕",
- "🦖",
- "🐳",
- "🐋",
- "🐬",
- "🐟",
- "🐠",
- "🐡",
- "🦈",
- "🐙",
- "🐚",
- "🐌",
- "🦋",
- "🐛",
- "🐜",
- "🐝",
- "🐞",
- "🦗",
- "🕷️",
- "🕸️",
- "🦂",
- "🦟",
- "🦠",
- "💐",
- "🌸",
- "💮",
- "🏵️",
- "🌹",
- "🥀",
- "🌺",
- "🌻",
- "🌼",
- "🌷",
- "🌱",
- "🌲",
- "🌳",
- "🌴",
- "🌵",
- "🌾",
- "🌿",
- "☘️",
- "🍀",
- "🍁",
- "🍂",
- "🍃",
- "🍇",
- "🍈",
- "🍉",
- "🍊",
- "🍋",
- "🍌",
- "🍍",
- "🥭",
- "🍎",
- "🍏",
- "🍐",
- "🍑",
- "🍒",
- "🍓",
- "🥝",
- "🍅",
- "🥥",
- "🥑",
- "🍆",
- "🥔",
- "🥕",
- "🌽",
- "🌶️",
- "🥒",
- "🥬",
- "🥦",
- "🧄",
- "🧅",
- "🍄",
- "🥜",
- "🌰",
- "🍞",
- "🥐",
- "🥖",
- "🥨",
- "🥯",
- "🥞",
- "🧇",
- "🧀",
- "🍖",
- "🍗",
- "🥩",
- "🥓",
- "🍔",
- "🍟",
- "🍕",
- "🌭",
- "🥪",
- "🌮",
- "🌯",
- "🥙",
- "🧆",
- "🥚",
- "🍳",
- "🥘",
- "🍲",
- "🥣",
- "🥗",
- "🍿",
- "🧈",
- "🧂",
- "🥫",
- "🍱",
- "🍘",
- "🍙",
- "🍚",
- "🍛",
- "🍜",
- "🍝",
- "🍠",
- "🍢",
- "🍣",
- "🍤",
- "🍥",
- "🥮",
- "🍡",
- "🥟",
- "🥠",
- "🥡",
- "🦀",
- "🦞",
- "🦐",
- "🦑",
- "🦪",
- "🍦",
- "🍧",
- "🍨",
- "🍩",
- "🍪",
- "🎂",
- "🍰",
- "🧁",
- "🥧",
- "🍫",
- "🍬",
- "🍭",
- "🍮",
- "🍯",
- "🍼",
- "🥛",
- "🍵",
- "🍶",
- "🍾",
- "🍷",
- "🍸",
- "🍹",
- "🍺",
- "🍻",
- "🥂",
- "🥃",
- "🥤",
- "🧃",
- "🧉",
- "🧊",
- "🥢",
- "🍽️",
- "🍴",
- "🥄",
- "🔪",
- "🏺",
- "🌍",
- "🌎",
- "🌏",
- "🌐",
- "🗺️",
- "🗾",
- "🧭",
- "🏔️",
- "⛰️",
- "🌋",
- "🗻",
- "🏕️",
- "🏖️",
- "🏜️",
- "🏝️",
- "🏞️",
- "🏟️",
- "🏛️",
- "🏗️",
- "🧱",
- "🏘️",
- "🏚️",
- "🏠",
- "🏡",
- "🏢",
- "🏣",
- "🏤",
- "🏥",
- "🏦",
- "🏨",
- "🏩",
- "🏪",
- "🏫",
- "🏬",
- "🏭",
- "🏯",
- "🏰",
- "💒",
- "🗼",
- "🗽",
- "⛪",
- "🕌",
- "🛕",
- "🕍",
- "⛩️",
- "🕋",
- "⛲",
- "⛺",
- "🌁",
- "🌃",
- "🏙️",
- "🌄",
- "🌅",
- "🌆",
- "🌇",
- "🌉",
- "♨️",
- "🎠",
- "🎡",
- "🎢",
- "💈",
- "🎪",
- "🚂",
- "🚃",
- "🚄",
- "🚅",
- "🚆",
- "🚇",
- "🚈",
- "🚉",
- "🚊",
- "🚝",
- "🚞",
- "🚋",
- "🚌",
- "🚍",
- "🚎",
- "🚐",
- "🚑",
- "🚒",
- "🚓",
- "🚔",
- "🚕",
- "🚖",
- "🚗",
- "🚘",
- "🚙",
- "🚚",
- "🚛",
- "🚜",
- "🏎️",
- "🏍️",
- "🛵",
- "🦽",
- "🦼",
- "🛺",
- "🚲",
- "🛴",
- "🛹",
- "🚏",
- "🛣️",
- "🛤️",
- "🛢️",
- "⛽",
- "🚨",
- "🚥",
- "🚦",
- "🛑",
- "🚧",
- "⚓",
- "⛵",
- "🛶",
- "🚤",
- "🛳️",
- "⛴️",
- "🛥️",
- "🚢",
- "✈️",
- "🛩️",
- "🛫",
- "🛬",
- "🪂",
- "💺",
- "🚁",
- "🚟",
- "🚠",
- "🚡",
- "🛰️",
- "🚀",
- "🛸",
- "🛎️",
- "🧳",
- "⌛",
- "⏳",
- "⌚",
- "⏰",
- "⏱️",
- "⏲️",
- "🕰️",
- "🕛",
- "🕧",
- "🕐",
- "🕜",
- "🕑",
- "🕝",
- "🕒",
- "🕞",
- "🕓",
- "🕟",
- "🕔",
- "🕠",
- "🕕",
- "🕡",
- "🕖",
- "🕢",
- "🕗",
- "🕣",
- "🕘",
- "🕤",
- "🕙",
- "🕥",
- "🕚",
- "🕦",
- "🌑",
- "🌒",
- "🌓",
- "🌔",
- "🌕",
- "🌖",
- "🌗",
- "🌘",
- "🌙",
- "🌚",
- "🌛",
- "🌜",
- "🌡️",
- "☀️",
- "🌝",
- "🌞",
- "🪐",
- "⭐",
- "🌟",
- "🌠",
- "🌌",
- "☁️",
- "⛅",
- "⛈️",
- "🌤️",
- "🌥️",
- "🌦️",
- "🌧️",
- "🌨️",
- "🌩️",
- "🌪️",
- "🌫️",
- "🌬️",
- "🌀",
- "🌈",
- "🌂",
- "☂️",
- "☔",
- "⛱️",
- "⚡",
- "❄️",
- "☃️",
- "⛄",
- "☄️",
- "🔥",
- "💧",
- "🌊",
- "🎃",
- "🎄",
- "🎆",
- "🎇",
- "🧨",
- "✨",
- "🎈",
- "🎉",
- "🎊",
- "🎋",
- "🎍",
- "🎎",
- "🎏",
- "🎐",
- "🎑",
- "🧧",
- "🎀",
- "🎁",
- "🎗️",
- "🎟️",
- "🎫",
- "🎖️",
- "🏆",
- "🏅",
- "🥇",
- "🥈",
- "🥉",
- "⚽",
- "⚾",
- "🥎",
- "🏀",
- "🏐",
- "🏈",
- "🏉",
- "🎾",
- "🥏",
- "🎳",
- "🏏",
- "🏑",
- "🏒",
- "🥍",
- "🏓",
- "🏸",
- "🥊",
- "🥋",
- "🥅",
- "⛳",
- "⛸️",
- "🎣",
- "🤿",
- "🎽",
- "🎿",
- "🛷",
- "🥌",
- "🎯",
- "🪀",
- "🪁",
- "🎱",
- "🔮",
- "🧿",
- "🎮",
- "🕹️",
- "🎰",
- "🎲",
- "🧩",
- "🧸",
- "♠️",
- "♥️",
- "♦️",
- "♣️",
- "♟️",
- "🃏",
- "🀄",
- "🎴",
- "🎭",
- "🖼️",
- "🎨",
- "🧵",
- "🧶",
- "👓",
- "🕶️",
- "🥽",
- "🥼",
- "🦺",
- "👔",
- "👕",
- "👖",
- "🧣",
- "🧤",
- "🧥",
- "🧦",
- "👗",
- "👘",
- "🥻",
- "🩱",
- "🩲",
- "🩳",
- "👙",
- "👚",
- "👛",
- "👜",
- "👝",
- "🛍️",
- "🎒",
- "👞",
- "👟",
- "🥾",
- "🥿",
- "👠",
- "👡",
- "🩰",
- "👢",
- "👑",
- "👒",
- "🎩",
- "🎓",
- "🧢",
- "⛑️",
- "📿",
- "💄",
- "💍",
- "💎",
- "🔇",
- "🔈",
- "🔉",
- "🔊",
- "📢",
- "📣",
- "📯",
- "🔔",
- "🔕",
- "🎼",
- "🎵",
- "🎶",
- "🎙️",
- "🎚️",
- "🎛️",
- "🎤",
- "🎧",
- "📻",
- "🎷",
- "🎸",
- "🎹",
- "🎺",
- "🎻",
- "🪕",
- "🥁",
- "📱",
- "📲",
- "☎️",
- "📞",
- "📟",
- "📠",
- "🔋",
- "🔌",
- "💻",
- "🖥️",
- "🖨️",
- "⌨️",
- "🖱️",
- "🖲️",
- "💽",
- "💾",
- "💿",
- "📀",
- "🧮",
- "🎥",
- "🎞️",
- "📽️",
- "🎬",
- "📺",
- "📷",
- "📸",
- "📹",
- "📼",
- "🔍",
- "🔎",
- "🕯️",
- "💡",
- "🔦",
- "🏮",
- "🪔",
- "📔",
- "📕",
- "📖",
- "📗",
- "📘",
- "📙",
- "📚",
- "📓",
- "📒",
- "📃",
- "📜",
- "📄",
- "📰",
- "🗞️",
- "📑",
- "🔖",
- "🏷️",
- "💰",
- "💴",
- "💵",
- "💶",
- "💷",
- "💸",
- "💳",
- "🧾",
- "💹",
- "✉️",
- "📧",
- "📨",
- "📩",
- "📤",
- "📥",
- "📦",
- "📫",
- "📪",
- "📬",
- "📭",
- "📮",
- "🗳️",
- "✏️",
- "✒️",
- "🖋️",
- "🖊️",
- "🖌️",
- "🖍️",
- "📝",
- "💼",
- "📁",
- "📂",
- "🗂️",
- "📅",
- "📆",
- "🗒️",
- "🗓️",
- "📇",
- "📈",
- "📉",
- "📊",
- "📋",
- "📌",
- "📍",
- "📎",
- "🖇️",
- "📏",
- "📐",
- "✂️",
- "🗃️",
- "🗄️",
- "🗑️",
- "🔒",
- "🔓",
- "🔏",
- "🔐",
- "🔑",
- "🗝️",
- "🔨",
- "🪓",
- "⛏️",
- "⚒️",
- "🛠️",
- "🗡️",
- "⚔️",
- "🔫",
- "🏹",
- "🛡️",
- "🔧",
- "🔩",
- "⚙️",
- "🗜️",
- "⚖️",
- "🦯",
- "🔗",
- "⛓️",
- "🧰",
- "🧲",
- "⚗️",
- "🧪",
- "🧫",
- "🧬",
- "🔬",
- "🔭",
- "📡",
- "💉",
- "🩸",
- "💊",
- "🩹",
- "🩺",
- "🚪",
- "🛏️",
- "🛋️",
- "🪑",
- "🚽",
- "🚿",
- "🛁",
- "🪒",
- "🧴",
- "🧷",
- "🧹",
- "🧺",
- "🧻",
- "🧼",
- "🧽",
- "🧯",
- "🛒",
- "🚬",
- "⚰️",
- "⚱️",
- "🗿",
- "🏧",
- "🚮",
- "🚰",
- "♿",
- "🚹",
- "🚺",
- "🚻",
- "🚼",
- "🚾",
- "🛂",
- "🛃",
- "🛄",
- "🛅",
- "⚠️",
- "🚸",
- "⛔",
- "🚫",
- "🚳",
- "🚭",
- "🚯",
- "🚱",
- "🚷",
- "📵",
- "🔞",
- "☢️",
- "☣️",
- "⬆️",
- "↗️",
- "➡️",
- "↘️",
- "⬇️",
- "↙️",
- "⬅️",
- "↖️",
- "↕️",
- "↔️",
- "↩️",
- "↪️",
- "⤴️",
- "⤵️",
- "🔃",
- "🔄",
- "🔙",
- "🔚",
- "🔛",
- "🔜",
- "🔝",
- "🛐",
- "⚛️",
- "🕉️",
- "✡️",
- "☸️",
- "☯️",
- "✝️",
- "☦️",
- "☪️",
- "☮️",
- "🕎",
- "🔯",
- "♈",
- "♉",
- "♊",
- "♋",
- "♌",
- "♍",
- "♎",
- "♏",
- "♐",
- "♑",
- "♒",
- "♓",
- "⛎",
- "🔀",
- "🔁",
- "🔂",
- "▶️",
- "⏩",
- "⏭️",
- "⏯️",
- "◀️",
- "⏪",
- "⏮️",
- "🔼",
- "⏫",
- "🔽",
- "⏬",
- "⏸️",
- "⏹️",
- "⏺️",
- "⏏️",
- "🎦",
- "🔅",
- "🔆",
- "📶",
- "📳",
- "📴",
- "♀️",
- "♂️",
- "⚧️",
- "✖️",
- "➕",
- "➖",
- "➗",
- "♾️",
- "‼️",
- "⁉️",
- "❓",
- "❔",
- "❕",
- "❗",
- "〰️",
- "💱",
- "💲",
- "⚕️",
- "♻️",
- "⚜️",
- "🔱",
- "📛",
- "🔰",
- "⭕",
- "✅",
- "☑️",
- "✔️",
- "❌",
- "❎",
- "➰",
- "➿",
- "〽️",
- "✳️",
- "✴️",
- "❇️",
- "©️",
- "®️",
- "™️",
- "#️⃣",
- "*️⃣",
- "0️⃣",
- "1️⃣",
- "2️⃣",
- "3️⃣",
- "4️⃣",
- "5️⃣",
- "6️⃣",
- "7️⃣",
- "8️⃣",
- "9️⃣",
- "🔟",
- "🔠",
- "🔡",
- "🔢",
- "🔣",
- "🔤",
- "🅰️",
- "🆎",
- "🅱️",
- "🆑",
- "🆒",
- "🆓",
- "ℹ️",
- "🆔",
- "Ⓜ️",
- "🆕",
- "🆖",
- "🅾️",
- "🆗",
- "🅿️",
- "🆘",
- "🆙",
- "🆚",
- "🈁",
- "🈂️",
- "🈷️",
- "🈶",
- "🈯",
- "🉐",
- "🈹",
- "🈚",
- "🈲",
- "🉑",
- "🈸",
- "🈴",
- "🈳",
- "㊗️",
- "㊙️",
- "🈺",
- "🈵",
- "🔴",
- "🟠",
- "🟡",
- "🟢",
- "🔵",
- "🟣",
- "🟤",
- "⚫",
- "⚪",
- "🟥",
- "🟧",
- "🟨",
- "🟩",
- "🟦",
- "🟪",
- "🟫",
- "⬛",
- "⬜",
- "◼️",
- "◻️",
- "◾",
- "◽",
- "▪️",
- "▫️",
- "🔶",
- "🔷",
- "🔸",
- "🔹",
- "🔺",
- "🔻",
- "💠",
- "🔘",
- "🔳",
- "🔲",
- "🏁",
- "🚩",
- "🎌",
- "🏴",
- "🏳️",
- "🏴☠️",
- "🇦🇨",
- "🇦🇩",
- "🇦🇪",
- "🇦🇫",
- "🇦🇬",
- "🇦🇮",
- "🇦🇱",
- "🇦🇲",
- "🇦🇴",
- "🇦🇶",
- "🇦🇷",
- "🇦🇸",
- "🇦🇹",
- "🇦🇺",
- "🇦🇼",
- "🇦🇽",
- "🇦🇿",
- "🇧🇦",
- "🇧🇧",
- "🇧🇩",
- "🇧🇪",
- "🇧🇫",
- "🇧🇬",
- "🇧🇭",
- "🇧🇮",
- "🇧🇯",
- "🇧🇱",
- "🇧🇲",
- "🇧🇳",
- "🇧🇴",
- "🇧🇶",
- "🇧🇷",
- "🇧🇸",
- "🇧🇹",
- "🇧🇻",
- "🇧🇼",
- "🇧🇾",
- "🇧🇿",
- "🇨🇦",
- "🇨🇨",
- "🇨🇩",
- "🇨🇫",
- "🇨🇬",
- "🇨🇭",
- "🇨🇮",
- "🇨🇰",
- "🇨🇱",
- "🇨🇲",
- "🇨🇳",
- "🇨🇴",
- "🇨🇵",
- "🇨🇷",
- "🇨🇺",
- "🇨🇻",
- "🇨🇼",
- "🇨🇽",
- "🇨🇾",
- "🇨🇿",
- "🇩🇪",
- "🇩🇬",
- "🇩🇯",
- "🇩🇰",
- "🇩🇲",
- "🇩🇴",
- "🇩🇿",
- "🇪🇦",
- "🇪🇨",
- "🇪🇪",
- "🇪🇬",
- "🇪🇭",
- "🇪🇷",
- "🇪🇸",
- "🇪🇹",
- "🇪🇺",
- "🇫🇮",
- "🇫🇯",
- "🇫🇰",
- "🇫🇲",
- "🇫🇴",
- "🇫🇷",
- "🇬🇦",
- "🇬🇧",
- "🇬🇩",
- "🇬🇪",
- "🇬🇫",
- "🇬🇬",
- "🇬🇭",
- "🇬🇮",
- "🇬🇱",
- "🇬🇲",
- "🇬🇳",
- "🇬🇵",
- "🇬🇶",
- "🇬🇷",
- "🇬🇸",
- "🇬🇹",
- "🇬🇺",
- "🇬🇼",
- "🇬🇾",
- "🇭🇰",
- "🇭🇲",
- "🇭🇳",
- "🇭🇷",
- "🇭🇹",
- "🇭🇺",
- "🇮🇨",
- "🇮🇩",
- "🇮🇪",
- "🇮🇱",
- "🇮🇲",
- "🇮🇳",
- "🇮🇴",
- "🇮🇶",
- "🇮🇷",
- "🇮🇸",
- "🇮🇹",
- "🇯🇪",
- "🇯🇲",
- "🇯🇴",
- "🇯🇵",
- "🇰🇪",
- "🇰🇬",
- "🇰🇭",
- "🇰🇮",
- "🇰🇲",
- "🇰🇳",
- "🇰🇵",
- "🇰🇷",
- "🇰🇼",
- "🇰🇾",
- "🇰🇿",
- "🇱🇦",
- "🇱🇧",
- "🇱🇨",
- "🇱🇮",
- "🇱🇰",
- "🇱🇷",
- "🇱🇸",
- "🇱🇹",
- "🇱🇺",
- "🇱🇻",
- "🇱🇾",
- "🇲🇦",
- "🇲🇨",
- "🇲🇩",
- "🇲🇪",
- "🇲🇫",
- "🇲🇬",
- "🇲🇭",
- "🇲🇰",
- "🇲🇱",
- "🇲🇲",
- "🇲🇳",
- "🇲🇴",
- "🇲🇵",
- "🇲🇶",
- "🇲🇷",
- "🇲🇸",
- "🇲🇹",
- "🇲🇺",
- "🇲🇻",
- "🇲🇼",
- "🇲🇽",
- "🇲🇾",
- "🇲🇿",
- "🇳🇦",
- "🇳🇨",
- "🇳🇪",
- "🇳🇫",
- "🇳🇬",
- "🇳🇮",
- "🇳🇱",
- "🇳🇴",
- "🇳🇵",
- "🇳🇷",
- "🇳🇺",
- "🇳🇿",
- "🇴🇲",
- "🇵🇦",
- "🇵🇪",
- "🇵🇫",
- "🇵🇬",
- "🇵🇭",
- "🇵🇰",
- "🇵🇱",
- "🇵🇲",
- "🇵🇳",
- "🇵🇷",
- "🇵🇸",
- "🇵🇹",
- "🇵🇼",
- "🇵🇾",
- "🇶🇦",
- "🇷🇪",
- "🇷🇴",
- "🇷🇸",
- "🇷🇺",
- "🇷🇼",
- "🇸🇦",
- "🇸🇧",
- "🇸🇨",
- "🇸🇩",
- "🇸🇪",
- "🇸🇬",
- "🇸🇭",
- "🇸🇮",
- "🇸🇯",
- "🇸🇰",
- "🇸🇱",
- "🇸🇲",
- "🇸🇳",
- "🇸🇴",
- "🇸🇷",
- "🇸🇸",
- "🇸🇹",
- "🇸🇻",
- "🇸🇽",
- "🇸🇾",
- "🇸🇿",
- "🇹🇦",
- "🇹🇨",
- "🇹🇩",
- "🇹🇫",
- "🇹🇬",
- "🇹🇭",
- "🇹🇯",
- "🇹🇰",
- "🇹🇱",
- "🇹🇲",
- "🇹🇳",
- "🇹🇴",
- "🇹🇷",
- "🇹🇹",
- "🇹🇻",
- "🇹🇼",
- "🇹🇿",
- "🇺🇦",
- "🇺🇬",
- "🇺🇲",
- "🇺🇳",
- "🇺🇸",
- "🇺🇾",
- "🇺🇿",
- "🇻🇦",
- "🇻🇨",
- "🇻🇪",
- "🇻🇬",
- "🇻🇮",
- "🇻🇳",
- "🇻🇺",
- "🇼🇫",
- "🇼🇸",
- "🇽🇰",
- "🇾🇪",
- "🇾🇹",
- "🇿🇦",
- "🇿🇲",
- "🇿🇼",
+ "animal": {
+ "🐵", "🐒", "🦍", "🦧", "🐶", "🐕", "🦮", "🐩", "🐺", "🦊",
+ "🦝", "🐱", "🐈", "🐈⬛", "🦁", "🐯", "🐅", "🐆", "🐴", "🐎",
+ "🦄", "🦓", "🦌", "🐮", "🐂", "🐃", "🐄", "🐷", "🐖", "🐗",
+ "🐽", "🐏", "🐑", "🐐", "🐪", "🐫", "🦙", "🦒", "🐘", "🦏",
+ "🦛", "🐭", "🐁", "🐀", "🐹", "🐰", "🐇", "🐿️", "🦔", "🦇",
+ "🐻", "🐻❄️", "🐨", "🐼", "🦥", "🦦", "🦨", "🦘", "🦡", "🐾",
+ "🦃", "🐔", "🐓", "🐣", "🐤", "🐥", "🐦", "🐧", "🕊️", "🦅",
+ "🦆", "🦢", "🦉", "🦩", "🦚", "🦜", "🐸", "🐊", "🐢", "🦎",
+ "🐍", "🐲", "🐉", "🦕", "🦖", "🐳", "🐋", "🐬", "🐟", "🐠",
+ "🐡", "🦈", "🐙", "🐚", "🐌", "🦋", "🐛", "🐜", "🐝", "🐞",
+ "🦗", "🕷️", "🕸️", "🦂", "🦟", "🦠",
},
- "description": {
- "grinning face",
- "grinning face with big eyes",
- "grinning face with smiling eyes",
- "beaming face with smiling eyes",
- "grinning squinting face",
- "grinning face with sweat",
- "rolling on the floor laughing",
- "face with tears of joy",
- "slightly smiling face",
- "upside-down face",
- "winking face",
- "smiling face with smiling eyes",
- "smiling face with halo",
- "smiling face with hearts",
- "smiling face with heart-eyes",
- "star-struck",
- "face blowing a kiss",
- "kissing face",
- "smiling face",
- "kissing face with closed eyes",
- "kissing face with smiling eyes",
- "smiling face with tear",
- "face savoring food",
- "face with tongue",
- "winking face with tongue",
- "zany face",
- "squinting face with tongue",
- "money-mouth face",
- "hugging face",
- "face with hand over mouth",
- "shushing face",
- "thinking face",
- "zipper-mouth face",
- "face with raised eyebrow",
- "neutral face",
- "expressionless face",
- "face without mouth",
- "smirking face",
- "unamused face",
- "face with rolling eyes",
- "grimacing face",
- "lying face",
- "relieved face",
- "pensive face",
- "sleepy face",
- "drooling face",
- "sleeping face",
- "face with medical mask",
- "face with thermometer",
- "face with head-bandage",
- "nauseated face",
- "face vomiting",
- "sneezing face",
- "hot face",
- "cold face",
- "woozy face",
- "dizzy face",
- "exploding head",
- "cowboy hat face",
- "partying face",
- "disguised face",
- "smiling face with sunglasses",
- "nerd face",
- "face with monocle",
- "confused face",
- "worried face",
- "slightly frowning face",
- "frowning face",
- "face with open mouth",
- "hushed face",
- "astonished face",
- "flushed face",
- "pleading face",
- "frowning face with open mouth",
- "anguished face",
- "fearful face",
- "anxious face with sweat",
- "sad but relieved face",
- "crying face",
- "loudly crying face",
- "face screaming in fear",
- "confounded face",
- "persevering face",
- "disappointed face",
- "downcast face with sweat",
- "weary face",
- "tired face",
- "yawning face",
- "face with steam from nose",
- "pouting face",
- "angry face",
- "face with symbols on mouth",
- "smiling face with horns",
- "angry face with horns",
- "skull",
- "skull and crossbones",
- "pile of poo",
- "clown face",
- "ogre",
- "goblin",
- "ghost",
- "alien",
- "alien monster",
- "robot",
- "grinning cat",
- "grinning cat with smiling eyes",
- "cat with tears of joy",
- "smiling cat with heart-eyes",
- "cat with wry smile",
- "kissing cat",
- "weary cat",
- "crying cat",
- "pouting cat",
- "see-no-evil monkey",
- "hear-no-evil monkey",
- "speak-no-evil monkey",
- "kiss mark",
- "love letter",
- "heart with arrow",
- "heart with ribbon",
- "sparkling heart",
- "growing heart",
- "beating heart",
- "revolving hearts",
- "two hearts",
- "heart decoration",
- "heart exclamation",
- "broken heart",
- "red heart",
- "orange heart",
- "yellow heart",
- "green heart",
- "blue heart",
- "purple heart",
- "brown heart",
- "black heart",
- "white heart",
- "hundred points",
- "anger symbol",
- "collision",
- "dizzy",
- "sweat droplets",
- "dashing away",
- "hole",
- "bomb",
- "speech balloon",
- "eye in speech bubble",
- "left speech bubble",
- "right anger bubble",
- "thought balloon",
- "zzz",
- "waving hand",
- "raised back of hand",
- "hand with fingers splayed",
- "raised hand",
- "vulcan salute",
- "OK hand",
- "pinched fingers",
- "pinching hand",
- "victory hand",
- "crossed fingers",
- "love-you gesture",
- "sign of the horns",
- "call me hand",
- "backhand index pointing left",
- "backhand index pointing right",
- "backhand index pointing up",
- "middle finger",
- "backhand index pointing down",
- "index pointing up",
- "thumbs up",
- "thumbs down",
- "raised fist",
- "oncoming fist",
- "left-facing fist",
- "right-facing fist",
- "clapping hands",
- "raising hands",
- "open hands",
- "palms up together",
- "handshake",
- "folded hands",
- "writing hand",
- "nail polish",
- "selfie",
- "flexed biceps",
- "mechanical arm",
- "mechanical leg",
- "leg",
- "foot",
- "ear",
- "ear with hearing aid",
- "nose",
- "brain",
- "anatomical heart",
- "lungs",
- "tooth",
- "bone",
- "eyes",
- "eye",
- "tongue",
- "mouth",
- "baby",
- "child",
- "boy",
- "girl",
- "person",
- "person: blond hair",
- "man",
- "man: beard",
- "man: red hair",
- "man: curly hair",
- "man: white hair",
- "man: bald",
- "woman",
- "woman: red hair",
- "person: red hair",
- "woman: curly hair",
- "person: curly hair",
- "woman: white hair",
- "person: white hair",
- "woman: bald",
- "person: bald",
- "woman: blond hair",
- "man: blond hair",
- "older person",
- "old man",
- "old woman",
- "person frowning",
- "man frowning",
- "woman frowning",
- "person pouting",
- "man pouting",
- "woman pouting",
- "person gesturing NO",
- "man gesturing NO",
- "woman gesturing NO",
- "person gesturing OK",
- "man gesturing OK",
- "woman gesturing OK",
- "person tipping hand",
- "man tipping hand",
- "woman tipping hand",
- "person raising hand",
- "man raising hand",
- "woman raising hand",
- "deaf person",
- "deaf man",
- "deaf woman",
- "person bowing",
- "man bowing",
- "woman bowing",
- "person facepalming",
- "man facepalming",
- "woman facepalming",
- "person shrugging",
- "man shrugging",
- "woman shrugging",
- "health worker",
- "man health worker",
- "woman health worker",
- "student",
- "man student",
- "woman student",
- "teacher",
- "man teacher",
- "woman teacher",
- "judge",
- "man judge",
- "woman judge",
- "farmer",
- "man farmer",
- "woman farmer",
- "cook",
- "man cook",
- "woman cook",
- "mechanic",
- "man mechanic",
- "woman mechanic",
- "factory worker",
- "man factory worker",
- "woman factory worker",
- "office worker",
- "man office worker",
- "woman office worker",
- "scientist",
- "man scientist",
- "woman scientist",
- "technologist",
- "man technologist",
- "woman technologist",
- "singer",
- "man singer",
- "woman singer",
- "artist",
- "man artist",
- "woman artist",
- "pilot",
- "man pilot",
- "woman pilot",
- "astronaut",
- "man astronaut",
- "woman astronaut",
- "firefighter",
- "man firefighter",
- "woman firefighter",
- "police officer",
- "man police officer",
- "woman police officer",
- "detective",
- "man detective",
- "woman detective",
- "guard",
- "man guard",
- "woman guard",
- "ninja",
- "construction worker",
- "man construction worker",
- "woman construction worker",
- "prince",
- "princess",
- "person wearing turban",
- "man wearing turban",
- "woman wearing turban",
- "person with skullcap",
- "woman with headscarf",
- "person in tuxedo",
- "man in tuxedo",
- "woman in tuxedo",
- "person with veil",
- "man with veil",
- "woman with veil",
- "pregnant woman",
- "breast-feeding",
- "woman feeding baby",
- "man feeding baby",
- "person feeding baby",
- "baby angel",
- "Santa Claus",
- "Mrs. Claus",
- "mx claus",
- "superhero",
- "man superhero",
- "woman superhero",
- "supervillain",
- "man supervillain",
- "woman supervillain",
- "mage",
- "man mage",
- "woman mage",
- "fairy",
- "man fairy",
- "woman fairy",
- "vampire",
- "man vampire",
- "woman vampire",
- "merperson",
- "merman",
- "mermaid",
- "elf",
- "man elf",
- "woman elf",
- "genie",
- "man genie",
- "woman genie",
- "zombie",
- "man zombie",
- "woman zombie",
- "person getting massage",
- "man getting massage",
- "woman getting massage",
- "person getting haircut",
- "man getting haircut",
- "woman getting haircut",
- "person walking",
- "man walking",
- "woman walking",
- "person standing",
- "man standing",
- "woman standing",
- "person kneeling",
- "man kneeling",
- "woman kneeling",
- "person with white cane",
- "man with white cane",
- "woman with white cane",
- "person in motorized wheelchair",
- "man in motorized wheelchair",
- "woman in motorized wheelchair",
- "person in manual wheelchair",
- "man in manual wheelchair",
- "woman in manual wheelchair",
- "person running",
- "man running",
- "woman running",
- "woman dancing",
- "man dancing",
- "person in suit levitating",
- "people with bunny ears",
- "men with bunny ears",
- "women with bunny ears",
- "person in steamy room",
- "man in steamy room",
- "woman in steamy room",
- "person climbing",
- "man climbing",
- "woman climbing",
- "person fencing",
- "horse racing",
- "skier",
- "snowboarder",
- "person golfing",
- "man golfing",
- "woman golfing",
- "person surfing",
- "man surfing",
- "woman surfing",
- "person rowing boat",
- "man rowing boat",
- "woman rowing boat",
- "person swimming",
- "man swimming",
- "woman swimming",
- "person bouncing ball",
- "man bouncing ball",
- "woman bouncing ball",
- "person lifting weights",
- "man lifting weights",
- "woman lifting weights",
- "person biking",
- "man biking",
- "woman biking",
- "person mountain biking",
- "man mountain biking",
- "woman mountain biking",
- "person cartwheeling",
- "man cartwheeling",
- "woman cartwheeling",
- "people wrestling",
- "men wrestling",
- "women wrestling",
- "person playing water polo",
- "man playing water polo",
- "woman playing water polo",
- "person playing handball",
- "man playing handball",
- "woman playing handball",
- "person juggling",
- "man juggling",
- "woman juggling",
- "person in lotus position",
- "man in lotus position",
- "woman in lotus position",
- "person taking bath",
- "person in bed",
- "people holding hands",
- "women holding hands",
- "woman and man holding hands",
- "men holding hands",
- "kiss",
- "kiss: woman, man",
- "kiss: man, man",
- "kiss: woman, woman",
- "couple with heart",
- "couple with heart: woman, man",
- "couple with heart: man, man",
- "couple with heart: woman, woman",
- "family",
- "family: man, woman, boy",
- "family: man, woman, girl",
- "family: man, woman, girl, boy",
- "family: man, woman, boy, boy",
- "family: man, woman, girl, girl",
- "family: man, man, boy",
- "family: man, man, girl",
- "family: man, man, girl, boy",
- "family: man, man, boy, boy",
- "family: man, man, girl, girl",
- "family: woman, woman, boy",
- "family: woman, woman, girl",
- "family: woman, woman, girl, boy",
- "family: woman, woman, boy, boy",
- "family: woman, woman, girl, girl",
- "family: man, boy",
- "family: man, boy, boy",
- "family: man, girl",
- "family: man, girl, boy",
- "family: man, girl, girl",
- "family: woman, boy",
- "family: woman, boy, boy",
- "family: woman, girl",
- "family: woman, girl, boy",
- "family: woman, girl, girl",
- "speaking head",
- "bust in silhouette",
- "busts in silhouette",
- "people hugging",
- "footprints",
- "monkey face",
- "monkey",
- "gorilla",
- "orangutan",
- "dog face",
- "dog",
- "guide dog",
- "service dog",
- "poodle",
- "wolf",
- "fox",
- "raccoon",
- "cat face",
- "cat",
- "black cat",
- "lion",
- "tiger face",
- "tiger",
- "leopard",
- "horse face",
- "horse",
- "unicorn",
- "zebra",
- "deer",
- "bison",
- "cow face",
- "ox",
- "water buffalo",
- "cow",
- "pig face",
- "pig",
- "boar",
- "pig nose",
- "ram",
- "ewe",
- "goat",
- "camel",
- "two-hump camel",
- "llama",
- "giraffe",
- "elephant",
- "mammoth",
- "rhinoceros",
- "hippopotamus",
- "mouse face",
- "mouse",
- "rat",
- "hamster",
- "rabbit face",
- "rabbit",
- "chipmunk",
- "beaver",
- "hedgehog",
- "bat",
- "bear",
- "polar bear",
- "koala",
- "panda",
- "sloth",
- "otter",
- "skunk",
- "kangaroo",
- "badger",
- "paw prints",
- "turkey",
- "chicken",
- "rooster",
- "hatching chick",
- "baby chick",
- "front-facing baby chick",
- "bird",
- "penguin",
- "dove",
- "eagle",
- "duck",
- "swan",
- "owl",
- "dodo",
- "feather",
- "flamingo",
- "peacock",
- "parrot",
- "frog",
- "crocodile",
- "turtle",
- "lizard",
- "snake",
- "dragon face",
- "dragon",
- "sauropod",
- "T-Rex",
- "spouting whale",
- "whale",
- "dolphin",
- "seal",
- "fish",
- "tropical fish",
- "blowfish",
- "shark",
- "octopus",
- "spiral shell",
- "snail",
- "butterfly",
- "bug",
- "ant",
- "honeybee",
- "beetle",
- "lady beetle",
- "cricket",
- "cockroach",
- "spider",
- "spider web",
- "scorpion",
- "mosquito",
- "fly",
- "worm",
- "microbe",
- "bouquet",
- "cherry blossom",
- "white flower",
- "rosette",
- "rose",
- "wilted flower",
- "hibiscus",
- "sunflower",
- "blossom",
- "tulip",
- "seedling",
- "potted plant",
- "evergreen tree",
- "deciduous tree",
- "palm tree",
- "cactus",
- "sheaf of rice",
- "herb",
- "shamrock",
- "four leaf clover",
- "maple leaf",
- "fallen leaf",
- "leaf fluttering in wind",
- "grapes",
- "melon",
- "watermelon",
- "tangerine",
- "lemon",
- "banana",
- "pineapple",
- "mango",
- "red apple",
- "green apple",
- "pear",
- "peach",
- "cherries",
- "strawberry",
- "blueberries",
- "kiwi fruit",
- "tomato",
- "olive",
- "coconut",
- "avocado",
- "eggplant",
- "potato",
- "carrot",
- "ear of corn",
- "hot pepper",
- "bell pepper",
- "cucumber",
- "leafy green",
- "broccoli",
- "garlic",
- "onion",
- "mushroom",
- "peanuts",
- "chestnut",
- "bread",
- "croissant",
- "baguette bread",
- "flatbread",
- "pretzel",
- "bagel",
- "pancakes",
- "waffle",
- "cheese wedge",
- "meat on bone",
- "poultry leg",
- "cut of meat",
- "bacon",
- "hamburger",
- "french fries",
- "pizza",
- "hot dog",
- "sandwich",
- "taco",
- "burrito",
- "tamale",
- "stuffed flatbread",
- "falafel",
- "egg",
- "cooking",
- "shallow pan of food",
- "pot of food",
- "fondue",
- "bowl with spoon",
- "green salad",
- "popcorn",
- "butter",
- "salt",
- "canned food",
- "bento box",
- "rice cracker",
- "rice ball",
- "cooked rice",
- "curry rice",
- "steaming bowl",
- "spaghetti",
- "roasted sweet potato",
- "oden",
- "sushi",
- "fried shrimp",
- "fish cake with swirl",
- "moon cake",
- "dango",
- "dumpling",
- "fortune cookie",
- "takeout box",
- "crab",
- "lobster",
- "shrimp",
- "squid",
- "oyster",
- "soft ice cream",
- "shaved ice",
- "ice cream",
- "doughnut",
- "cookie",
- "birthday cake",
- "shortcake",
- "cupcake",
- "pie",
- "chocolate bar",
- "candy",
- "lollipop",
- "custard",
- "honey pot",
- "baby bottle",
- "glass of milk",
- "hot beverage",
- "teapot",
- "teacup without handle",
- "sake",
- "bottle with popping cork",
- "wine glass",
- "cocktail glass",
- "tropical drink",
- "beer mug",
- "clinking beer mugs",
- "clinking glasses",
- "tumbler glass",
- "cup with straw",
- "bubble tea",
- "beverage box",
- "mate",
- "ice",
- "chopsticks",
- "fork and knife with plate",
- "fork and knife",
- "spoon",
- "kitchen knife",
- "amphora",
- "globe showing Europe-Africa",
- "globe showing Americas",
- "globe showing Asia-Australia",
- "globe with meridians",
- "world map",
- "map of Japan",
- "compass",
- "snow-capped mountain",
- "mountain",
- "volcano",
- "mount fuji",
- "camping",
- "beach with umbrella",
- "desert",
- "desert island",
- "national park",
- "stadium",
- "classical building",
- "building construction",
- "brick",
- "rock",
- "wood",
- "hut",
- "houses",
- "derelict house",
- "house",
- "house with garden",
- "office building",
- "Japanese post office",
- "post office",
- "hospital",
- "bank",
- "hotel",
- "love hotel",
- "convenience store",
- "school",
- "department store",
- "factory",
- "Japanese castle",
- "castle",
- "wedding",
- "Tokyo tower",
- "Statue of Liberty",
- "church",
- "mosque",
- "hindu temple",
- "synagogue",
- "shinto shrine",
- "kaaba",
- "fountain",
- "tent",
- "foggy",
- "night with stars",
- "cityscape",
- "sunrise over mountains",
- "sunrise",
- "cityscape at dusk",
- "sunset",
- "bridge at night",
- "hot springs",
- "carousel horse",
- "ferris wheel",
- "roller coaster",
- "barber pole",
- "circus tent",
- "locomotive",
- "railway car",
- "high-speed train",
- "bullet train",
- "train",
- "metro",
- "light rail",
- "station",
- "tram",
- "monorail",
- "mountain railway",
- "tram car",
- "bus",
- "oncoming bus",
- "trolleybus",
- "minibus",
- "ambulance",
- "fire engine",
- "police car",
- "oncoming police car",
- "taxi",
- "oncoming taxi",
- "automobile",
- "oncoming automobile",
- "sport utility vehicle",
- "pickup truck",
- "delivery truck",
- "articulated lorry",
- "tractor",
- "racing car",
- "motorcycle",
- "motor scooter",
- "manual wheelchair",
- "motorized wheelchair",
- "auto rickshaw",
- "bicycle",
- "kick scooter",
- "skateboard",
- "roller skate",
- "bus stop",
- "motorway",
- "railway track",
- "oil drum",
- "fuel pump",
- "police car light",
- "horizontal traffic light",
- "vertical traffic light",
- "stop sign",
- "construction",
- "anchor",
- "sailboat",
- "canoe",
- "speedboat",
- "passenger ship",
- "ferry",
- "motor boat",
- "ship",
- "airplane",
- "small airplane",
- "airplane departure",
- "airplane arrival",
- "parachute",
- "seat",
- "helicopter",
- "suspension railway",
- "mountain cableway",
- "aerial tramway",
- "satellite",
- "rocket",
- "flying saucer",
- "bellhop bell",
- "luggage",
- "hourglass done",
- "hourglass not done",
- "watch",
- "alarm clock",
- "stopwatch",
- "timer clock",
- "mantelpiece clock",
- "twelve o’clock",
- "twelve-thirty",
- "one o’clock",
- "one-thirty",
- "two o’clock",
- "two-thirty",
- "three o’clock",
- "three-thirty",
- "four o’clock",
- "four-thirty",
- "five o’clock",
- "five-thirty",
- "six o’clock",
- "six-thirty",
- "seven o’clock",
- "seven-thirty",
- "eight o’clock",
- "eight-thirty",
- "nine o’clock",
- "nine-thirty",
- "ten o’clock",
- "ten-thirty",
- "eleven o’clock",
- "eleven-thirty",
- "new moon",
- "waxing crescent moon",
- "first quarter moon",
- "waxing gibbous moon",
- "full moon",
- "waning gibbous moon",
- "last quarter moon",
- "waning crescent moon",
- "crescent moon",
- "new moon face",
- "first quarter moon face",
- "last quarter moon face",
- "thermometer",
- "sun",
- "full moon face",
- "sun with face",
- "ringed planet",
- "star",
- "glowing star",
- "shooting star",
- "milky way",
- "cloud",
- "sun behind cloud",
- "cloud with lightning and rain",
- "sun behind small cloud",
- "sun behind large cloud",
- "sun behind rain cloud",
- "cloud with rain",
- "cloud with snow",
- "cloud with lightning",
- "tornado",
- "fog",
- "wind face",
- "cyclone",
- "rainbow",
- "closed umbrella",
- "umbrella",
- "umbrella with rain drops",
- "umbrella on ground",
- "high voltage",
- "snowflake",
- "snowman",
- "snowman without snow",
- "comet",
- "fire",
- "droplet",
- "water wave",
- "jack-o-lantern",
- "Christmas tree",
- "fireworks",
- "sparkler",
- "firecracker",
- "sparkles",
- "balloon",
- "party popper",
- "confetti ball",
- "tanabata tree",
- "pine decoration",
- "Japanese dolls",
- "carp streamer",
- "wind chime",
- "moon viewing ceremony",
- "red envelope",
- "ribbon",
- "wrapped gift",
- "reminder ribbon",
- "admission tickets",
- "ticket",
- "military medal",
- "trophy",
- "sports medal",
- "1st place medal",
- "2nd place medal",
- "3rd place medal",
- "soccer ball",
- "baseball",
- "softball",
- "basketball",
- "volleyball",
- "american football",
- "rugby football",
- "tennis",
- "flying disc",
- "bowling",
- "cricket game",
- "field hockey",
- "ice hockey",
- "lacrosse",
- "ping pong",
- "badminton",
- "boxing glove",
- "martial arts uniform",
- "goal net",
- "flag in hole",
- "ice skate",
- "fishing pole",
- "diving mask",
- "running shirt",
- "skis",
- "sled",
- "curling stone",
- "direct hit",
- "yo-yo",
- "kite",
- "pool 8 ball",
- "crystal ball",
- "magic wand",
- "nazar amulet",
- "video game",
- "joystick",
- "slot machine",
- "game die",
- "puzzle piece",
- "teddy bear",
- "piñata",
- "nesting dolls",
- "spade suit",
- "heart suit",
- "diamond suit",
- "club suit",
- "chess pawn",
- "joker",
- "mahjong red dragon",
- "flower playing cards",
- "performing arts",
- "framed picture",
- "artist palette",
- "thread",
- "sewing needle",
- "yarn",
- "knot",
- "glasses",
- "sunglasses",
- "goggles",
- "lab coat",
- "safety vest",
- "necktie",
- "t-shirt",
- "jeans",
- "scarf",
- "gloves",
- "coat",
- "socks",
- "dress",
- "kimono",
- "sari",
- "one-piece swimsuit",
- "briefs",
- "shorts",
- "bikini",
- "woman’s clothes",
- "purse",
- "handbag",
- "clutch bag",
- "shopping bags",
- "backpack",
- "thong sandal",
- "man’s shoe",
- "running shoe",
- "hiking boot",
- "flat shoe",
- "high-heeled shoe",
- "woman’s sandal",
- "ballet shoes",
- "woman’s boot",
- "crown",
- "woman’s hat",
- "top hat",
- "graduation cap",
- "billed cap",
- "military helmet",
- "rescue worker’s helmet",
- "prayer beads",
- "lipstick",
- "ring",
- "gem stone",
- "muted speaker",
- "speaker low volume",
- "speaker medium volume",
- "speaker high volume",
- "loudspeaker",
- "megaphone",
- "postal horn",
- "bell",
- "bell with slash",
- "musical score",
- "musical note",
- "musical notes",
- "studio microphone",
- "level slider",
- "control knobs",
- "microphone",
- "headphone",
- "radio",
- "saxophone",
- "accordion",
- "guitar",
- "musical keyboard",
- "trumpet",
- "violin",
- "banjo",
- "drum",
- "long drum",
- "mobile phone",
- "mobile phone with arrow",
- "telephone",
- "telephone receiver",
- "pager",
- "fax machine",
- "battery",
- "electric plug",
- "laptop",
- "desktop computer",
- "printer",
- "keyboard",
- "computer mouse",
- "trackball",
- "computer disk",
- "floppy disk",
- "optical disk",
- "dvd",
- "abacus",
- "movie camera",
- "film frames",
- "film projector",
- "clapper board",
- "television",
- "camera",
- "camera with flash",
- "video camera",
- "videocassette",
- "magnifying glass tilted left",
- "magnifying glass tilted right",
- "candle",
- "light bulb",
- "flashlight",
- "red paper lantern",
- "diya lamp",
- "notebook with decorative cover",
- "closed book",
- "open book",
- "green book",
- "blue book",
- "orange book",
- "books",
- "notebook",
- "ledger",
- "page with curl",
- "scroll",
- "page facing up",
- "newspaper",
- "rolled-up newspaper",
- "bookmark tabs",
- "bookmark",
- "label",
- "money bag",
- "coin",
- "yen banknote",
- "dollar banknote",
- "euro banknote",
- "pound banknote",
- "money with wings",
- "credit card",
- "receipt",
- "chart increasing with yen",
- "envelope",
- "e-mail",
- "incoming envelope",
- "envelope with arrow",
- "outbox tray",
- "inbox tray",
- "package",
- "closed mailbox with raised flag",
- "closed mailbox with lowered flag",
- "open mailbox with raised flag",
- "open mailbox with lowered flag",
- "postbox",
- "ballot box with ballot",
- "pencil",
- "black nib",
- "fountain pen",
- "pen",
- "paintbrush",
- "crayon",
- "memo",
- "briefcase",
- "file folder",
- "open file folder",
- "card index dividers",
- "calendar",
- "tear-off calendar",
- "spiral notepad",
- "spiral calendar",
- "card index",
- "chart increasing",
- "chart decreasing",
- "bar chart",
- "clipboard",
- "pushpin",
- "round pushpin",
- "paperclip",
- "linked paperclips",
- "straight ruler",
- "triangular ruler",
- "scissors",
- "card file box",
- "file cabinet",
- "wastebasket",
- "locked",
- "unlocked",
- "locked with pen",
- "locked with key",
- "key",
- "old key",
- "hammer",
- "axe",
- "pick",
- "hammer and pick",
- "hammer and wrench",
- "dagger",
- "crossed swords",
- "pistol",
- "boomerang",
- "bow and arrow",
- "shield",
- "carpentry saw",
- "wrench",
- "screwdriver",
- "nut and bolt",
- "gear",
- "clamp",
- "balance scale",
- "white cane",
- "link",
- "chains",
- "hook",
- "toolbox",
- "magnet",
- "ladder",
- "alembic",
- "test tube",
- "petri dish",
- "dna",
- "microscope",
- "telescope",
- "satellite antenna",
- "syringe",
- "drop of blood",
- "pill",
- "adhesive bandage",
- "stethoscope",
- "door",
- "elevator",
- "mirror",
- "window",
- "bed",
- "couch and lamp",
- "chair",
- "toilet",
- "plunger",
- "shower",
- "bathtub",
- "mouse trap",
- "razor",
- "lotion bottle",
- "safety pin",
- "broom",
- "basket",
- "roll of paper",
- "bucket",
- "soap",
- "toothbrush",
- "sponge",
- "fire extinguisher",
- "shopping cart",
- "cigarette",
- "coffin",
- "headstone",
- "funeral urn",
- "moai",
- "placard",
- "ATM sign",
- "litter in bin sign",
- "potable water",
- "wheelchair symbol",
- "men’s room",
- "women’s room",
- "restroom",
- "baby symbol",
- "water closet",
- "passport control",
- "customs",
- "baggage claim",
- "left luggage",
- "warning",
- "children crossing",
- "no entry",
- "prohibited",
- "no bicycles",
- "no smoking",
- "no littering",
- "non-potable water",
- "no pedestrians",
- "no mobile phones",
- "no one under eighteen",
- "radioactive",
- "biohazard",
- "up arrow",
- "up-right arrow",
- "right arrow",
- "down-right arrow",
- "down arrow",
- "down-left arrow",
- "left arrow",
- "up-left arrow",
- "up-down arrow",
- "left-right arrow",
- "right arrow curving left",
- "left arrow curving right",
- "right arrow curving up",
- "right arrow curving down",
- "clockwise vertical arrows",
- "counterclockwise arrows button",
- "BACK arrow",
- "END arrow",
- "ON! arrow",
- "SOON arrow",
- "TOP arrow",
- "place of worship",
- "atom symbol",
- "om",
- "star of David",
- "wheel of dharma",
- "yin yang",
- "latin cross",
- "orthodox cross",
- "star and crescent",
- "peace symbol",
- "menorah",
- "dotted six-pointed star",
- "Aries",
- "Taurus",
- "Gemini",
- "Cancer",
- "Leo",
- "Virgo",
- "Libra",
- "Scorpio",
- "Sagittarius",
- "Capricorn",
- "Aquarius",
- "Pisces",
- "Ophiuchus",
- "shuffle tracks button",
- "repeat button",
- "repeat single button",
- "play button",
- "fast-forward button",
- "next track button",
- "play or pause button",
- "reverse button",
- "fast reverse button",
- "last track button",
- "upwards button",
- "fast up button",
- "downwards button",
- "fast down button",
- "pause button",
- "stop button",
- "record button",
- "eject button",
- "cinema",
- "dim button",
- "bright button",
- "antenna bars",
- "vibration mode",
- "mobile phone off",
- "female sign",
- "male sign",
- "transgender symbol",
- "multiply",
- "plus",
- "minus",
- "divide",
- "infinity",
- "double exclamation mark",
- "exclamation question mark",
- "question mark",
- "white question mark",
- "white exclamation mark",
- "exclamation mark",
- "wavy dash",
- "currency exchange",
- "heavy dollar sign",
- "medical symbol",
- "recycling symbol",
- "fleur-de-lis",
- "trident emblem",
- "name badge",
- "Japanese symbol for beginner",
- "hollow red circle",
- "check mark button",
- "check box with check",
- "check mark",
- "cross mark",
- "cross mark button",
- "curly loop",
- "double curly loop",
- "part alternation mark",
- "eight-spoked asterisk",
- "eight-pointed star",
- "sparkle",
- "copyright",
- "registered",
- "trade mark",
- "keycap: #",
- "keycap: *",
- "keycap: 0",
- "keycap: 1",
- "keycap: 2",
- "keycap: 3",
- "keycap: 4",
- "keycap: 5",
- "keycap: 6",
- "keycap: 7",
- "keycap: 8",
- "keycap: 9",
- "keycap: 10",
- "input latin uppercase",
- "input latin lowercase",
- "input numbers",
- "input symbols",
- "input latin letters",
- "A button (blood type)",
- "AB button (blood type)",
- "B button (blood type)",
- "CL button",
- "COOL button",
- "FREE button",
- "information",
- "ID button",
- "circled M",
- "NEW button",
- "NG button",
- "O button (blood type)",
- "OK button",
- "P button",
- "SOS button",
- "UP! button",
- "VS button",
- "Japanese “here” button",
- "Japanese “service charge” button",
- "Japanese “monthly amount” button",
- "Japanese “not free of charge” button",
- "Japanese “reserved” button",
- "Japanese “bargain” button",
- "Japanese “discount” button",
- "Japanese “free of charge” button",
- "Japanese “prohibited” button",
- "Japanese “acceptable” button",
- "Japanese “application” button",
- "Japanese “passing grade” button",
- "Japanese “vacancy” button",
- "Japanese “congratulations” button",
- "Japanese “secret” button",
- "Japanese “open for business” button",
- "Japanese “no vacancy” button",
- "red circle",
- "orange circle",
- "yellow circle",
- "green circle",
- "blue circle",
- "purple circle",
- "brown circle",
- "black circle",
- "white circle",
- "red square",
- "orange square",
- "yellow square",
- "green square",
- "blue square",
- "purple square",
- "brown square",
- "black large square",
- "white large square",
- "black medium square",
- "white medium square",
- "black medium-small square",
- "white medium-small square",
- "black small square",
- "white small square",
- "large orange diamond",
- "large blue diamond",
- "small orange diamond",
- "small blue diamond",
- "red triangle pointed up",
- "red triangle pointed down",
- "diamond with a dot",
- "radio button",
- "white square button",
- "black square button",
- "chequered flag",
- "triangular flag",
- "crossed flags",
- "black flag",
- "white flag",
- "rainbow flag",
- "transgender flag",
- "pirate flag",
- "flag: Ascension Island",
- "flag: Andorra",
- "flag: United Arab Emirates",
- "flag: Afghanistan",
- "flag: Antigua & Barbuda",
- "flag: Anguilla",
- "flag: Albania",
- "flag: Armenia",
- "flag: Angola",
- "flag: Antarctica",
- "flag: Argentina",
- "flag: American Samoa",
- "flag: Austria",
- "flag: Australia",
- "flag: Aruba",
- "flag: Åland Islands",
- "flag: Azerbaijan",
- "flag: Bosnia & Herzegovina",
- "flag: Barbados",
- "flag: Bangladesh",
- "flag: Belgium",
- "flag: Burkina Faso",
- "flag: Bulgaria",
- "flag: Bahrain",
- "flag: Burundi",
- "flag: Benin",
- "flag: St. Barthélemy",
- "flag: Bermuda",
- "flag: Brunei",
- "flag: Bolivia",
- "flag: Caribbean Netherlands",
- "flag: Brazil",
- "flag: Bahamas",
- "flag: Bhutan",
- "flag: Bouvet Island",
- "flag: Botswana",
- "flag: Belarus",
- "flag: Belize",
- "flag: Canada",
- "flag: Cocos (Keeling) Islands",
- "flag: Congo - Kinshasa",
- "flag: Central African Republic",
- "flag: Congo - Brazzaville",
- "flag: Switzerland",
- "flag: Côte d’Ivoire",
- "flag: Cook Islands",
- "flag: Chile",
- "flag: Cameroon",
- "flag: China",
- "flag: Colombia",
- "flag: Clipperton Island",
- "flag: Costa Rica",
- "flag: Cuba",
- "flag: Cape Verde",
- "flag: Curaçao",
- "flag: Christmas Island",
- "flag: Cyprus",
- "flag: Czechia",
- "flag: Germany",
- "flag: Diego Garcia",
- "flag: Djibouti",
- "flag: Denmark",
- "flag: Dominica",
- "flag: Dominican Republic",
- "flag: Algeria",
- "flag: Ceuta & Melilla",
- "flag: Ecuador",
- "flag: Estonia",
- "flag: Egypt",
- "flag: Western Sahara",
- "flag: Eritrea",
- "flag: Spain",
- "flag: Ethiopia",
- "flag: European Union",
- "flag: Finland",
- "flag: Fiji",
- "flag: Falkland Islands",
- "flag: Micronesia",
- "flag: Faroe Islands",
- "flag: France",
- "flag: Gabon",
- "flag: United Kingdom",
- "flag: Grenada",
- "flag: Georgia",
- "flag: French Guiana",
- "flag: Guernsey",
- "flag: Ghana",
- "flag: Gibraltar",
- "flag: Greenland",
- "flag: Gambia",
- "flag: Guinea",
- "flag: Guadeloupe",
- "flag: Equatorial Guinea",
- "flag: Greece",
- "flag: South Georgia & South Sandwich Islands",
- "flag: Guatemala",
- "flag: Guam",
- "flag: Guinea-Bissau",
- "flag: Guyana",
- "flag: Hong Kong SAR China",
- "flag: Heard & McDonald Islands",
- "flag: Honduras",
- "flag: Croatia",
- "flag: Haiti",
- "flag: Hungary",
- "flag: Canary Islands",
- "flag: Indonesia",
- "flag: Ireland",
- "flag: Israel",
- "flag: Isle of Man",
- "flag: India",
- "flag: British Indian Ocean Territory",
- "flag: Iraq",
- "flag: Iran",
- "flag: Iceland",
- "flag: Italy",
- "flag: Jersey",
- "flag: Jamaica",
- "flag: Jordan",
- "flag: Japan",
- "flag: Kenya",
- "flag: Kyrgyzstan",
- "flag: Cambodia",
- "flag: Kiribati",
- "flag: Comoros",
- "flag: St. Kitts & Nevis",
- "flag: North Korea",
- "flag: South Korea",
- "flag: Kuwait",
- "flag: Cayman Islands",
- "flag: Kazakhstan",
- "flag: Laos",
- "flag: Lebanon",
- "flag: St. Lucia",
- "flag: Liechtenstein",
- "flag: Sri Lanka",
- "flag: Liberia",
- "flag: Lesotho",
- "flag: Lithuania",
- "flag: Luxembourg",
- "flag: Latvia",
- "flag: Libya",
- "flag: Morocco",
- "flag: Monaco",
- "flag: Moldova",
- "flag: Montenegro",
- "flag: St. Martin",
- "flag: Madagascar",
- "flag: Marshall Islands",
- "flag: North Macedonia",
- "flag: Mali",
- "flag: Myanmar (Burma)",
- "flag: Mongolia",
- "flag: Macao SAR China",
- "flag: Northern Mariana Islands",
- "flag: Martinique",
- "flag: Mauritania",
- "flag: Montserrat",
- "flag: Malta",
- "flag: Mauritius",
- "flag: Maldives",
- "flag: Malawi",
- "flag: Mexico",
- "flag: Malaysia",
- "flag: Mozambique",
- "flag: Namibia",
- "flag: New Caledonia",
- "flag: Niger",
- "flag: Norfolk Island",
- "flag: Nigeria",
- "flag: Nicaragua",
- "flag: Netherlands",
- "flag: Norway",
- "flag: Nepal",
- "flag: Nauru",
- "flag: Niue",
- "flag: New Zealand",
- "flag: Oman",
- "flag: Panama",
- "flag: Peru",
- "flag: French Polynesia",
- "flag: Papua New Guinea",
- "flag: Philippines",
- "flag: Pakistan",
- "flag: Poland",
- "flag: St. Pierre & Miquelon",
- "flag: Pitcairn Islands",
- "flag: Puerto Rico",
- "flag: Palestinian Territories",
- "flag: Portugal",
- "flag: Palau",
- "flag: Paraguay",
- "flag: Qatar",
- "flag: Réunion",
- "flag: Romania",
- "flag: Serbia",
- "flag: Russia",
- "flag: Rwanda",
- "flag: Saudi Arabia",
- "flag: Solomon Islands",
- "flag: Seychelles",
- "flag: Sudan",
- "flag: Sweden",
- "flag: Singapore",
- "flag: St. Helena",
- "flag: Slovenia",
- "flag: Svalbard & Jan Mayen",
- "flag: Slovakia",
- "flag: Sierra Leone",
- "flag: San Marino",
- "flag: Senegal",
- "flag: Somalia",
- "flag: Suriname",
- "flag: South Sudan",
- "flag: São Tomé & Príncipe",
- "flag: El Salvador",
- "flag: Sint Maarten",
- "flag: Syria",
- "flag: Eswatini",
- "flag: Tristan da Cunha",
- "flag: Turks & Caicos Islands",
- "flag: Chad",
- "flag: French Southern Territories",
- "flag: Togo",
- "flag: Thailand",
- "flag: Tajikistan",
- "flag: Tokelau",
- "flag: Timor-Leste",
- "flag: Turkmenistan",
- "flag: Tunisia",
- "flag: Tonga",
- "flag: Turkey",
- "flag: Trinidad & Tobago",
- "flag: Tuvalu",
- "flag: Taiwan",
- "flag: Tanzania",
- "flag: Ukraine",
- "flag: Uganda",
- "flag: U.S. Outlying Islands",
- "flag: United Nations",
- "flag: United States",
- "flag: Uruguay",
- "flag: Uzbekistan",
- "flag: Vatican City",
- "flag: St. Vincent & Grenadines",
- "flag: Venezuela",
- "flag: British Virgin Islands",
- "flag: U.S. Virgin Islands",
- "flag: Vietnam",
- "flag: Vanuatu",
- "flag: Wallis & Futuna",
- "flag: Samoa",
- "flag: Kosovo",
- "flag: Yemen",
- "flag: Mayotte",
- "flag: South Africa",
- "flag: Zambia",
- "flag: Zimbabwe",
- "flag: England",
- "flag: Scotland",
- "flag: Wales",
+ "food": {
+ "🍇", "🍈", "🍉", "🍊", "🍋", "🍌", "🍍", "🥭", "🍎", "🍏",
+ "🍐", "🍑", "🍒", "🍓", "🥝", "🍅", "🥥", "🥑", "🍆", "🥔",
+ "🥕", "🌽", "🌶️", "🥒", "🥬", "🥦", "🧄", "🧅", "🍄", "🥜",
+ "🌰", "🍞", "🥐", "🥖", "🥨", "🥯", "🥞", "🧇", "🧀", "🍖",
+ "🍗", "🥩", "🥓", "🍔", "🍟", "🍕", "🌭", "🥪", "🌮", "🌯",
+ "🥙", "🧆", "🥚", "🍳", "🥘", "🍲", "🥣", "🥗", "🍿", "🧈",
+ "🧂", "🥫", "🍱", "🍘", "🍙", "🍚", "🍛", "🍜", "🍝", "🍠",
+ "🍢", "🍣", "🍤", "🍥", "🥮", "🍡", "🥟", "🥠", "🥡", "🦀",
+ "🦞", "🦐", "🦑", "🦪", "🍦", "🍧", "🍨", "🍩", "🍪", "🎂",
+ "🍰", "🧁", "🥧", "🍫", "🍬", "🍭", "🍮", "🍯", "🍼", "🥛",
+ "☕", "🍵", "🍶", "🍾", "🍷", "🍸", "🍹", "🍺", "🍻", "🥂",
+ "🥃", "🥤", "🧃", "🧉", "🧊",
+ },
+ "plant": {
+ "💐", "🌸", "💮", "🏵️", "🌹", "🥀", "🌺", "🌻", "🌼", "🌷",
+ "🌱", "🪴", "🌲", "🌳", "🌴", "🌵", "🌾", "🌿", "☘️", "🍀",
+ "🍁", "🍂", "🍃",
+ },
+ "face": {
+ "😀", "😃", "😄", "😁", "😆", "😅", "🤣", "😂", "🙂", "🙃", "😉", "😊", "😇", "🥰", "😍", "🤩",
+ "😘", "😗", "☺️", "😚", "😙", "😋", "😛", "😜", "🤪", "😝", "🤑", "🤗", "🤭", "🤫", "🤔", "🤐",
+ "🤨", "😐", "😑", "😶", "😏", "😒", "🙄", "😬", "🤥", "😌", "😔", "😪", "🤤", "😴", "😷", "🤒",
+ "🤕", "🤢", "🤮", "🤧", "🥵", "🥶", "🥴", "😵", "🤯", "🤠", "🥳", "😎", "🤓", "🧐", "😕", "😟",
+ "🙁", "☹️", "😮", "😯", "😲", "😳", "🥺", "😦", "😧", "😨", "😰", "😥", "😢", "😭", "😱", "😖",
+ "😣", "😞", "😓", "😩", "😫", "🥱", "😤", "😡", "😠", "🤬", "😈", "👿", "💀", "☠️", "💩", "🤡",
+ "👹", "👺", "👻", "👽", "👾", "🤖", "😺", "😸", "😹", "😻", "😼", "😽", "🙀", "😿", "😾", "🙈",
+ "🙉", "🙊",
+ },
+ "hand": {
+ "👋", "🤚", "🖐️", "✋", "🖖", "👌", "🤏", "✌️", "🤞", "🤟", "🤘", "🤙",
+ "👈", "👉", "👆", "🖕", "👇", "☝️", "👍", "👎", "✊", "👊", "🤛", "🤜",
+ "👏", "🙌", "👐", "🤲", "🤝", "🙏", "✍️", "💅", "🤳", "💪",
+ },
+ "clothing": {
+ "🧵", "🧶", "👓", "🕶️", "🥽", "🥼", "🦺", "👔", "👕", "👖",
+ "🧣", "🧤", "🧥", "🧦", "👗", "👘", "🥻", "🩱", "🩲", "🩳",
+ "👙", "👚", "👛", "👜", "👝", "🛍️", "🎒", "👞", "👟", "🥾",
+ "🥿", "👠", "👡", "🩰", "👢", "👑", "👒", "🎩", "🎓", "🧢",
+ "⛑️", "📿", "💄", "💍", "💎",
+ },
+ "landmark": {
+ "🗺️", "🗾", "🧭", "🏔️", "⛰️", "🌋", "🗻", "🏕️", "🏖️", "🏜️", "🏝️",
+ "🏟️", "🏛️", "🏗️", "🧱", "🏘️", "🏚️", "🏠", "🏡", "🏢", "🏣", "🏤", "🏥",
+ "🏦", "🏨", "🏩", "🏪", "🏫", "🏬", "🏭", "🏯", "🏰", "💒", "🗼", "🗽",
+ "⛪", "🕌", "🛕", "🕍", "⛩️", "🕋", "⛲", "⛺", "🎠", "🎡", "🎢", "💈", "🎪",
+ },
+ "electronics": {
+ "📱", "📲", "☎️", "📞", "📟", "📠", "🔋", "🔌", "💻", "🖥️", "🖨️",
+ "⌨️", "🖱️", "🖲️", "💽", "💾", "💿", "📀", "🧮", "🎥", "🎞️", "📽️",
+ "🎬", "📺", "📷", "📸", "📹", "📼", "📡",
+ },
+ "game": {
+ "🔮", "🧿", "🎮", "🕹️", "🎰", "🎲", "🧩", "🧸", "♠️", "♥️", "♦️",
+ "♣️", "♟️", "🃏", "🀄", "🎴",
+ },
+ "tools": {
+ "🔨", "🪓", "⛏️", "⚒️", "🛠️", "🗡️", "⚔️", "🔫", "🏹", "🛡️",
+ "🔧", "🔩", "⚙️", "🗜️", "⚖️", "🦯", "🔗", "⛓️", "🧰", "🧲",
+ },
+ "weather": {
+ "🌙", "🌚", "🌛", "🌡️", "☀️", "🌝", "🌞", "🪐", "⭐", "☁️", "⛅",
+ "⛈️", "🌤️", "🌥️", "🌦️", "🌧️", "🌨️", "🌩️", "🌪️", "🌫️", "🌬️", "🌀", "🌈",
+ },
+ "job": {
+ "🧑⚕️", "👨⚕️", "👩⚕️", "🧑🎓", "👨🎓", "👩🎓", "🧑🏫", "👨🏫", "👩🏫",
+ "🧑⚖️", "👨⚖️", "👩⚖️", "🧑🌾", "👨🌾", "👩🌾", "🧑🍳", "👨🍳", "👩🍳",
+ "🧑🔧", "👨🔧", "👩🔧", "🧑🏭", "👨🏭", "👩🏭", "🧑💼", "👨💼", "👩💼",
+ "🧑🔬", "👨🔬", "👩🔬", "🧑💻", "👨💻", "👩💻", "🧑🎤", "👨🎤", "👩🎤",
+ "🧑🎨", "👨🎨", "👩🎨", "🧑✈️", "👨✈️", "👩✈️", "🧑🚀", "👨🚀", "👩🚀",
+ "🧑🚒", "👨🚒", "👩🚒", "👮", "👮♂️", "👮♀️", "🕵️", "💂", "💂♂️", "💂♀️",
+ "👷", "👷♂️", "👷♀️",
+ },
+ "person": {
+ "👶", "🧒", "👦", "👧", "🧑", "👱", "👨", "🧔", "👨🦰", "👨🦱", "👨🦳", "👨🦲",
+ "👩", "👩🦰", "🧑🦰", "👩🦱", "🧑🦱", "👩🦳", "🧑🦳", "👩🦲", "🧑🦲", "👱♀️", "👱♂️",
+ "🧓", "👴", "👵",
+ },
+ "gesture": {
+ "🙍", "🙍♂️", "🙍♀️", "🙎", "🙎♂️", "🙎♀️", "🙅", "🙅♂️", "🙅♀️", "🙆", "🙆♂️", "🙆♀️",
+ "💁", "💁♂️", "💁♀️", "🙋", "🙋♂️", "🙋♀️", "🧏", "🧏♂️", "🧏♀️", "🙇", "🙇♂️", "🙇♀️",
+ "🤦", "🤦♂️", "🤦♀️", "🤷", "🤷♂️", "🤷♀️",
+ },
+ "costume": {
+ "🤴", "👸", "👳", "👳♂️", "👳♀️", "👲", "🧕", "🤵", "🤵♂️", "🤵♀️", "👰", "👰♂️", "👰♀️",
+ "🤰", "🤱", "👩🍼", "👨🍼", "🧑🍼", "👼", "🎅", "🤶", "🧑🎄", "🦸", "🦸♂️", "🦸♀️",
+ "🦹", "🦹♂️", "🦹♀️", "🧙", "🧙♂️", "🧙♀️", "🧚", "🧚♂️", "🧚♀️", "🧛", "🧛♂️", "🧛♀️",
+ "🧜", "🧜♂️", "🧜♀️", "🧝", "🧝♂️", "🧝♀️", "🧞", "🧞♂️", "🧞♀️", "🧟", "🧟♂️", "🧟♀️",
+ },
+ "music": {
+ "🎼", "🎵", "🎶", "🎙️", "🎚️", "🎛️", "🎤", "🎧", "📻", "🎷",
+ "🎸", "🎹", "🎺", "🎻", "🪕", "🥁",
+ },
+ "sport": {
+ "🏆", "🏅", "🥇", "🥈", "🥉",
+ "⚽", "⚾", "🥎", "🏀", "🏐", "🏈", "🏉", "🎾", "🥏", "🎳",
+ "🏏", "🏑", "🏒", "🥍", "🏓", "🏸", "🥊", "🥋", "🥅", "⛳", "⛸️",
+ "🎣", "🤿", "🎽", "🎿", "🛷", "🥌", "🎯", "🪀", "🪁", "🎱",
+ "🧗", "🧗♂️", "🧗♀️", "🤺", "🏇", "⛷️", "🏂", "🏌️", "🏄",
+ "🚣", "🚣♂️", "🚣♀️", "🏊", "⛹️", "🏋️", "🚴", "🚴♂️", "🚴♀️",
+ "🚵", "🚵♂️", "🚵♀️", "🤸", "🤸♂️", "🤸♀️", "🤼", "🤼♂️", "🤼♀️",
+ "🤽", "🤽♂️", "🤽♀️", "🤾", "🤾♂️", "🤾♀️", "🧘", "🧘♂️", "🧘♀️",
+ },
+ "vehicle": {
+ "🚂", "🚃", "🚄", "🚅", "🚆", "🚇", "🚈", "🚉", "🚊", "🚝",
+ "🚞", "🚋", "🚌", "🚍", "🚎", "🚐", "🚑", "🚒", "🚓", "🚔",
+ "🚕", "🚖", "🚗", "🚘", "🚙", "🚚", "🚛", "🚜", "🏎️", "🏍️",
+ "🛵", "🦽", "🦼", "🛺", "🚲", "🛴", "🛹", "⛵", "🛶", "🚤",
+ "🛳️", "⛴️", "🛥️", "🚢", "✈️", "🛩️", "🛫", "🛬", "🚁", "🚟",
+ "🚠", "🚡", "🚀", "🛸",
+ },
+ "flag": {
+ "🏴", "🏳️", "🏴☠️",
+ "🇦🇨", "🇦🇩", "🇦🇪", "🇦🇫", "🇦🇬", "🇦🇮", "🇦🇱", "🇦🇲", "🇦🇴", "🇦🇶",
+ "🇦🇷", "🇦🇸", "🇦🇹", "🇦🇺", "🇦🇼", "🇦🇽", "🇦🇿", "🇧🇦", "🇧🇧", "🇧🇩",
+ "🇧🇪", "🇧🇫", "🇧🇬", "🇧🇭", "🇧🇮", "🇧🇯", "🇧🇱", "🇧🇲", "🇧🇳", "🇧🇴",
+ "🇧🇶", "🇧🇷", "🇧🇸", "🇧🇹", "🇧🇻", "🇧🇼", "🇧🇾", "🇧🇿", "🇨🇦", "🇨🇨",
+ "🇨🇩", "🇨🇫", "🇨🇬", "🇨🇭", "🇨🇮", "🇨🇰", "🇨🇱", "🇨🇲", "🇨🇳", "🇨🇴",
+ "🇨🇵", "🇨🇷", "🇨🇺", "🇨🇻", "🇨🇼", "🇨🇽", "🇨🇾", "🇨🇿", "🇩🇪", "🇩🇬",
+ "🇩🇯", "🇩🇰", "🇩🇲", "🇩🇴", "🇩🇿", "🇪🇦", "🇪🇨", "🇪🇪", "🇪🇬", "🇪🇭",
+ "🇪🇷", "🇪🇸", "🇪🇹", "🇪🇺", "🇫🇮", "🇫🇯", "🇫🇰", "🇫🇲", "🇫🇴", "🇫🇷",
+ "🇬🇦", "🇬🇧", "🇬🇩", "🇬🇪", "🇬🇫", "🇬🇬", "🇬🇭", "🇬🇮", "🇬🇱", "🇬🇲",
+ "🇬🇳", "🇬🇵", "🇬🇶", "🇬🇷", "🇬🇸", "🇬🇹", "🇬🇺", "🇬🇼", "🇬🇾", "🇭🇰",
+ "🇭🇲", "🇭🇳", "🇭🇷", "🇭🇹", "🇭🇺", "🇮🇨", "🇮🇩", "🇮🇪", "🇮🇱", "🇮🇲",
+ "🇮🇳", "🇮🇴", "🇮🇶", "🇮🇷", "🇮🇸", "🇮🇹", "🇯🇪", "🇯🇲", "🇯🇴", "🇯🇵",
+ "🇰🇪", "🇰🇬", "🇰🇭", "🇰🇮", "🇰🇲", "🇰🇳", "🇰🇵", "🇰🇷", "🇰🇼", "🇰🇾",
+ "🇰🇿", "🇱🇦", "🇱🇧", "🇱🇨", "🇱🇮", "🇱🇰", "🇱🇷", "🇱🇸", "🇱🇹", "🇱🇺",
+ "🇱🇻", "🇱🇾", "🇲🇦", "🇲🇨", "🇲🇩", "🇲🇪", "🇲🇫", "🇲🇬", "🇲🇭", "🇲🇰",
+ "🇲🇱", "🇲🇲", "🇲🇳", "🇲🇴", "🇲🇵", "🇲🇶", "🇲🇷", "🇲🇸", "🇲🇹", "🇲🇺",
+ "🇲🇻", "🇲🇼", "🇲🇽", "🇲🇾", "🇲🇿", "🇳🇦", "🇳🇨", "🇳🇪", "🇳🇫", "🇳🇬",
+ "🇳🇮", "🇳🇱", "🇳🇴", "🇳🇵", "🇳🇷", "🇳🇺", "🇳🇿", "🇴🇲", "🇵🇦", "🇵🇪",
+ "🇵🇫", "🇵🇬", "🇵🇭", "🇵🇰", "🇵🇱", "🇵🇲", "🇵🇳", "🇵🇷", "🇵🇸", "🇵🇹",
+ "🇵🇼", "🇵🇾", "🇶🇦", "🇷🇪", "🇷🇴", "🇷🇸", "🇷🇺", "🇷🇼", "🇸🇦", "🇸🇧",
+ "🇸🇨", "🇸🇩", "🇸🇪", "🇸🇬", "🇸🇭", "🇸🇮", "🇸🇯", "🇸🇰", "🇸🇱", "🇸🇲",
+ "🇸🇳", "🇸🇴", "🇸🇷", "🇸🇸", "🇸🇹", "🇸🇻", "🇸🇽", "🇸🇾", "🇸🇿", "🇹🇦",
+ "🇹🇨", "🇹🇩", "🇹🇫", "🇹🇬", "🇹🇭", "🇹🇯", "🇹🇰", "🇹🇱", "🇹🇲", "🇹🇳",
+ "🇹🇴", "🇹🇷", "🇹🇹", "🇹🇻", "🇹🇼", "🇹🇿", "🇺🇦", "🇺🇬", "🇺🇲", "🇺🇳",
+ "🇺🇸", "🇺🇾", "🇺🇿", "🇻🇦", "🇻🇨", "🇻🇪", "🇻🇬", "🇻🇮", "🇻🇳", "🇻🇺",
+ "🇼🇫", "🇼🇸", "🇽🇰", "🇾🇪", "🇾🇹", "🇿🇦", "🇿🇲", "🇿🇼",
},
"category": {
"Smileys & Emotion",
@@ -3548,2302 +169,612 @@ var Emoji = map[string][]string{
"Flags",
},
"alias": {
- "grinning",
- "smiley",
- "smile",
- "grin",
- "laughing",
- "satisfied",
- "sweat_smile",
- "rofl",
- "joy",
- "slightly_smiling_face",
- "upside_down_face",
- "wink",
- "blush",
- "innocent",
- "smiling_face_with_three_hearts",
- "heart_eyes",
- "star_struck",
- "kissing_heart",
- "kissing",
- "relaxed",
- "kissing_closed_eyes",
- "kissing_smiling_eyes",
- "smiling_face_with_tear",
- "yum",
- "stuck_out_tongue",
- "stuck_out_tongue_winking_eye",
- "zany_face",
- "stuck_out_tongue_closed_eyes",
- "money_mouth_face",
- "hugs",
- "hand_over_mouth",
- "shushing_face",
- "thinking",
- "zipper_mouth_face",
- "raised_eyebrow",
- "neutral_face",
- "expressionless",
- "no_mouth",
- "smirk",
- "unamused",
- "roll_eyes",
- "grimacing",
- "lying_face",
- "relieved",
- "pensive",
- "sleepy",
- "drooling_face",
- "sleeping",
- "mask",
- "face_with_thermometer",
- "face_with_head_bandage",
- "nauseated_face",
- "vomiting_face",
- "sneezing_face",
- "hot_face",
- "cold_face",
- "woozy_face",
- "dizzy_face",
- "exploding_head",
- "cowboy_hat_face",
- "partying_face",
- "disguised_face",
- "sunglasses",
- "nerd_face",
- "monocle_face",
- "confused",
- "worried",
- "slightly_frowning_face",
- "frowning_face",
- "open_mouth",
- "hushed",
- "astonished",
- "flushed",
- "pleading_face",
- "frowning",
- "anguished",
- "fearful",
- "cold_sweat",
- "disappointed_relieved",
- "cry",
- "sob",
- "scream",
- "confounded",
- "persevere",
- "disappointed",
- "sweat",
- "weary",
- "tired_face",
- "yawning_face",
- "triumph",
- "rage",
- "pout",
- "angry",
- "cursing_face",
- "smiling_imp",
- "imp",
- "skull",
- "skull_and_crossbones",
- "hankey",
- "poop",
- "shit",
- "clown_face",
- "japanese_ogre",
- "japanese_goblin",
- "ghost",
- "alien",
- "space_invader",
- "robot",
- "smiley_cat",
- "smile_cat",
- "joy_cat",
- "heart_eyes_cat",
- "smirk_cat",
- "kissing_cat",
- "scream_cat",
- "crying_cat_face",
- "pouting_cat",
- "see_no_evil",
- "hear_no_evil",
- "speak_no_evil",
- "kiss",
- "love_letter",
- "cupid",
- "gift_heart",
- "sparkling_heart",
- "heartpulse",
- "heartbeat",
- "revolving_hearts",
- "two_hearts",
- "heart_decoration",
- "heavy_heart_exclamation",
- "broken_heart",
- "heart",
- "orange_heart",
- "yellow_heart",
- "green_heart",
- "blue_heart",
- "purple_heart",
- "brown_heart",
- "black_heart",
+ // Faces and emotions
+ "grinning", "smiley", "smile", "grin", "laughing",
+ "satisfied", "sweat_smile", "rofl", "joy", "slightly_smiling_face",
+ "upside_down_face", "wink", "blush", "innocent", "smiling_face_with_three_hearts",
+ "heart_eyes", "star_struck", "kissing_heart", "kissing", "relaxed",
+ "kissing_closed_eyes", "kissing_smiling_eyes", "smiling_face_with_tear", "yum", "stuck_out_tongue",
+ "stuck_out_tongue_winking_eye", "zany_face", "stuck_out_tongue_closed_eyes", "money_mouth_face", "hugs",
+ "hand_over_mouth", "shushing_face", "thinking", "zipper_mouth_face", "raised_eyebrow",
+ "neutral_face", "expressionless", "no_mouth", "smirk", "unamused",
+ "roll_eyes", "grimacing", "lying_face", "relieved", "pensive",
+ "sleepy", "drooling_face", "sleeping", "mask", "face_with_thermometer",
+ "face_with_head_bandage", "nauseated_face", "vomiting_face", "sneezing_face", "hot_face",
+ "cold_face", "woozy_face", "dizzy_face", "exploding_head", "cowboy_hat_face",
+ "partying_face", "disguised_face", "sunglasses", "nerd_face", "monocle_face",
+ "confused", "worried", "slightly_frowning_face", "frowning_face", "open_mouth",
+ "hushed", "astonished", "flushed", "pleading_face", "frowning",
+ "anguished", "fearful", "cold_sweat", "disappointed_relieved", "cry",
+ "sob", "scream", "confounded", "persevere", "disappointed",
+ "sweat", "weary", "tired_face", "yawning_face", "triumph",
+ "rage", "pout", "angry", "cursing_face",
+ // Creatures and cat/monkey
+ "smiling_imp", "imp", "skull", "skull_and_crossbones", "hankey",
+ "poop", "shit", "clown_face", "japanese_ogre", "japanese_goblin",
+ "ghost", "alien", "space_invader", "robot",
+ // Cat faces
+ "smiley_cat", "smile_cat", "joy_cat", "heart_eyes_cat", "smirk_cat",
+ "kissing_cat", "scream_cat", "crying_cat_face", "pouting_cat",
+ // Three wise monkeys
+ "see_no_evil", "hear_no_evil", "speak_no_evil",
+ // Hearts and love symbols
+ "kiss", "love_letter", "cupid", "gift_heart", "sparkling_heart",
+ "heartpulse", "heartbeat", "revolving_hearts", "two_hearts", "heart_decoration",
+ "heavy_heart_exclamation", "broken_heart", "heart", "orange_heart", "yellow_heart",
+ "green_heart", "blue_heart", "purple_heart", "brown_heart", "black_heart",
"white_heart",
- "100",
- "anger",
- "boom",
- "collision",
- "dizzy",
- "sweat_drops",
- "dash",
- "hole",
- "bomb",
- "speech_balloon",
- "eye_speech_bubble",
- "left_speech_bubble",
- "right_anger_bubble",
- "thought_balloon",
- "zzz",
- "wave",
- "raised_back_of_hand",
- "raised_hand_with_fingers_splayed",
- "hand",
- "raised_hand",
- "vulcan_salute",
- "ok_hand",
- "pinched_fingers",
- "pinching_hand",
- "v",
- "crossed_fingers",
- "love_you_gesture",
- "metal",
- "call_me_hand",
- "point_left",
- "point_right",
- "point_up_2",
- "middle_finger",
- "fu",
- "point_down",
- "point_up",
- "+1",
- "thumbsup",
- "-1",
- "thumbsdown",
- "fist_raised",
- "fist",
- "fist_oncoming",
- "facepunch",
- "punch",
- "fist_left",
- "fist_right",
- "clap",
- "raised_hands",
- "open_hands",
- "palms_up_together",
- "handshake",
- "pray",
- "writing_hand",
- "nail_care",
- "selfie",
- "muscle",
- "mechanical_arm",
- "mechanical_leg",
- "leg",
- "foot",
- "ear",
- "ear_with_hearing_aid",
- "nose",
- "brain",
- "anatomical_heart",
- "lungs",
- "tooth",
- "bone",
- "eyes",
- "eye",
- "tongue",
- "lips",
- "baby",
- "child",
- "boy",
- "girl",
- "adult",
- "blond_haired_person",
- "man",
- "bearded_person",
- "red_haired_man",
- "curly_haired_man",
- "white_haired_man",
- "bald_man",
- "woman",
- "red_haired_woman",
- "person_red_hair",
- "curly_haired_woman",
- "person_curly_hair",
- "white_haired_woman",
- "person_white_hair",
- "bald_woman",
- "person_bald",
- "blond_haired_woman",
- "blonde_woman",
- "blond_haired_man",
- "older_adult",
- "older_man",
- "older_woman",
- "frowning_person",
- "frowning_man",
- "frowning_woman",
- "pouting_face",
- "pouting_man",
- "pouting_woman",
- "no_good",
- "no_good_man",
- "ng_man",
- "no_good_woman",
- "ng_woman",
- "ok_person",
- "ok_man",
- "ok_woman",
- "tipping_hand_person",
- "information_desk_person",
- "tipping_hand_man",
- "sassy_man",
- "tipping_hand_woman",
- "sassy_woman",
- "raising_hand",
- "raising_hand_man",
- "raising_hand_woman",
- "deaf_person",
- "deaf_man",
- "deaf_woman",
- "bow",
- "bowing_man",
- "bowing_woman",
- "facepalm",
- "man_facepalming",
- "woman_facepalming",
- "shrug",
- "man_shrugging",
- "woman_shrugging",
- "health_worker",
- "man_health_worker",
- "woman_health_worker",
- "student",
- "man_student",
- "woman_student",
- "teacher",
- "man_teacher",
- "woman_teacher",
- "judge",
- "man_judge",
- "woman_judge",
- "farmer",
- "man_farmer",
- "woman_farmer",
- "cook",
- "man_cook",
- "woman_cook",
- "mechanic",
- "man_mechanic",
- "woman_mechanic",
- "factory_worker",
- "man_factory_worker",
- "woman_factory_worker",
- "office_worker",
- "man_office_worker",
- "woman_office_worker",
- "scientist",
- "man_scientist",
- "woman_scientist",
- "technologist",
- "man_technologist",
- "woman_technologist",
- "singer",
- "man_singer",
- "woman_singer",
- "artist",
- "man_artist",
- "woman_artist",
- "pilot",
- "man_pilot",
- "woman_pilot",
- "astronaut",
- "man_astronaut",
- "woman_astronaut",
- "firefighter",
- "man_firefighter",
- "woman_firefighter",
- "police_officer",
- "cop",
- "policeman",
- "policewoman",
- "detective",
- "male_detective",
- "female_detective",
- "guard",
- "guardsman",
- "guardswoman",
- "ninja",
- "construction_worker",
- "construction_worker_man",
- "construction_worker_woman",
- "prince",
- "princess",
- "person_with_turban",
- "man_with_turban",
- "woman_with_turban",
- "man_with_gua_pi_mao",
- "woman_with_headscarf",
- "person_in_tuxedo",
- "man_in_tuxedo",
- "woman_in_tuxedo",
- "person_with_veil",
- "man_with_veil",
- "woman_with_veil",
- "bride_with_veil",
- "pregnant_woman",
- "breast_feeding",
- "woman_feeding_baby",
- "man_feeding_baby",
- "person_feeding_baby",
- "angel",
- "santa",
- "mrs_claus",
- "mx_claus",
- "superhero",
- "superhero_man",
- "superhero_woman",
- "supervillain",
- "supervillain_man",
- "supervillain_woman",
- "mage",
- "mage_man",
- "mage_woman",
- "fairy",
- "fairy_man",
- "fairy_woman",
- "vampire",
- "vampire_man",
- "vampire_woman",
- "merperson",
- "merman",
- "mermaid",
- "elf",
- "elf_man",
- "elf_woman",
- "genie",
- "genie_man",
- "genie_woman",
- "zombie",
- "zombie_man",
- "zombie_woman",
- "massage",
- "massage_man",
- "massage_woman",
- "haircut",
- "haircut_man",
- "haircut_woman",
- "walking",
- "walking_man",
- "walking_woman",
- "standing_person",
- "standing_man",
- "standing_woman",
- "kneeling_person",
- "kneeling_man",
- "kneeling_woman",
- "person_with_probing_cane",
- "man_with_probing_cane",
- "woman_with_probing_cane",
- "person_in_motorized_wheelchair",
- "man_in_motorized_wheelchair",
- "woman_in_motorized_wheelchair",
- "person_in_manual_wheelchair",
- "man_in_manual_wheelchair",
- "woman_in_manual_wheelchair",
- "runner",
- "running",
- "running_man",
- "running_woman",
- "woman_dancing",
- "dancer",
- "man_dancing",
- "business_suit_levitating",
- "dancers",
- "dancing_men",
- "dancing_women",
- "sauna_person",
- "sauna_man",
- "sauna_woman",
- "climbing",
- "climbing_man",
- "climbing_woman",
- "person_fencing",
- "horse_racing",
- "skier",
- "snowboarder",
- "golfing",
- "golfing_man",
- "golfing_woman",
- "surfer",
- "surfing_man",
- "surfing_woman",
- "rowboat",
- "rowing_man",
- "rowing_woman",
- "swimmer",
- "swimming_man",
- "swimming_woman",
- "bouncing_ball_person",
- "bouncing_ball_man",
- "basketball_man",
- "bouncing_ball_woman",
- "basketball_woman",
- "weight_lifting",
- "weight_lifting_man",
- "weight_lifting_woman",
- "bicyclist",
- "biking_man",
- "biking_woman",
- "mountain_bicyclist",
- "mountain_biking_man",
- "mountain_biking_woman",
- "cartwheeling",
- "man_cartwheeling",
- "woman_cartwheeling",
- "wrestling",
- "men_wrestling",
- "women_wrestling",
- "water_polo",
- "man_playing_water_polo",
- "woman_playing_water_polo",
- "handball_person",
- "man_playing_handball",
- "woman_playing_handball",
- "juggling_person",
- "man_juggling",
- "woman_juggling",
- "lotus_position",
- "lotus_position_man",
- "lotus_position_woman",
- "bath",
- "sleeping_bed",
- "people_holding_hands",
- "two_women_holding_hands",
- "couple",
- "two_men_holding_hands",
- "couplekiss",
- "couplekiss_man_woman",
- "couplekiss_man_man",
- "couplekiss_woman_woman",
- "couple_with_heart",
- "couple_with_heart_woman_man",
- "couple_with_heart_man_man",
- "couple_with_heart_woman_woman",
- "family",
- "family_man_woman_boy",
- "family_man_woman_girl",
- "family_man_woman_girl_boy",
- "family_man_woman_boy_boy",
- "family_man_woman_girl_girl",
- "family_man_man_boy",
- "family_man_man_girl",
- "family_man_man_girl_boy",
- "family_man_man_boy_boy",
- "family_man_man_girl_girl",
- "family_woman_woman_boy",
- "family_woman_woman_girl",
- "family_woman_woman_girl_boy",
- "family_woman_woman_boy_boy",
- "family_woman_woman_girl_girl",
- "family_man_boy",
- "family_man_boy_boy",
- "family_man_girl",
- "family_man_girl_boy",
- "family_man_girl_girl",
- "family_woman_boy",
- "family_woman_boy_boy",
- "family_woman_girl",
- "family_woman_girl_boy",
- "family_woman_girl_girl",
- "speaking_head",
- "bust_in_silhouette",
- "busts_in_silhouette",
- "people_hugging",
- "footprints",
- "monkey_face",
- "monkey",
- "gorilla",
- "orangutan",
- "dog",
- "dog2",
- "guide_dog",
- "service_dog",
- "poodle",
- "wolf",
- "fox_face",
- "raccoon",
- "cat",
- "cat2",
- "black_cat",
- "lion",
- "tiger",
- "tiger2",
- "leopard",
- "horse",
- "racehorse",
- "unicorn",
- "zebra",
- "deer",
- "bison",
- "cow",
- "ox",
- "water_buffalo",
- "cow2",
- "pig",
- "pig2",
- "boar",
- "pig_nose",
- "ram",
- "sheep",
- "goat",
- "dromedary_camel",
- "camel",
- "llama",
- "giraffe",
- "elephant",
- "mammoth",
- "rhinoceros",
- "hippopotamus",
- "mouse",
- "mouse2",
- "rat",
- "hamster",
- "rabbit",
- "rabbit2",
- "chipmunk",
- "beaver",
- "hedgehog",
- "bat",
- "bear",
- "polar_bear",
- "koala",
- "panda_face",
- "sloth",
- "otter",
- "skunk",
- "kangaroo",
+ // Symbols and comic effects
+ "100", "anger", "boom", "collision", "dizzy",
+ "sweat_drops", "dash", "hole", "bomb", "speech_balloon",
+ "eye_speech_bubble", "left_speech_bubble", "right_anger_bubble", "thought_balloon", "zzz",
+ // Hand gestures
+ "wave", "raised_back_of_hand", "raised_hand_with_fingers_splayed", "hand", "raised_hand",
+ "vulcan_salute", "ok_hand", "pinched_fingers", "pinching_hand", "v",
+ "crossed_fingers", "love_you_gesture", "metal", "call_me_hand", "point_left",
+ "point_right", "point_up_2", "middle_finger", "fu", "point_down",
+ "point_up", "+1", "thumbsup", "-1", "thumbsdown",
+ "fist_raised", "fist", "fist_oncoming", "facepunch", "punch",
+ "fist_left", "fist_right", "clap", "raised_hands", "open_hands",
+ "palms_up_together", "handshake", "pray", "writing_hand", "nail_care", "selfie",
+ // People variants and roles
+ "baby", "child", "boy", "girl", "adult",
+ "blond_haired_person", "man", "bearded_person", "red_haired_man", "curly_haired_man",
+ "white_haired_man", "bald_man", "woman", "red_haired_woman", "person_red_hair",
+ "person_curly_hair", "white_haired_woman", "person_white_hair", "person_bald", "blond_haired_woman",
+ "older_adult", "frowning_person", "pouting_face", "no_good", "ok_person",
+ "tipping_hand_person", "information_desk_person",
+ // Gestures and actions
+ "raising_hand", "deaf_person", "bow", "facepalm", "shrug",
+ // Occupations
+ "health_worker", "student", "teacher", "judge", "farmer",
+ "cook", "mechanic", "factory_worker", "office_worker", "scientist",
+ "technologist", "singer", "artist", "pilot", "astronaut",
+ "firefighter", "police_officer", "cop", "detective", "guard",
+ "ninja", "construction_worker",
+ // Costumes and fantasy
+ "prince", "princess", "person_with_turban", "person_in_tuxedo", "bride_with_veil",
+ "pregnant_woman", "woman_feeding_baby", "angel", "santa", "superhero",
+ "supervillain", "mage", "mage_man", "mage_woman", "fairy",
+ "vampire", "merperson", "elf", "genie", "zombie",
+ // Activities, sports, and relationships
+ "massage", "haircut", "walking", "standing_person", "kneeling_person",
+ "person_with_probing_cane", "person_in_motorized_wheelchair", "person_in_manual_wheelchair", "runner", "running",
+ "woman_dancing", "dancer", "man_dancing", "business_suit_levitating", "dancers",
+ "sauna_person", "climbing", "person_fencing", "horse_racing", "skier",
+ "snowboarder", "golfing", "surfer", "rowboat", "swimmer",
+ "bouncing_ball_person", "weight_lifting", "bicyclist", "mountain_bicyclist", "cartwheeling",
+ "man_cartwheeling", "woman_cartwheeling", "wrestling", "men_wrestling", "women_wrestling",
+ "water_polo", "man_playing_water_polo", "woman_playing_water_polo", "handball_person", "man_playing_handball",
+ "woman_playing_handball", "juggling_person", "man_juggling", "woman_juggling", "lotus_position",
+ "bath", "sleeping_bed", "people_holding_hands", "two_women_holding_hands", "couple", "family",
+ // People and silhouettes
+ "speaking_head", "bust_in_silhouette", "busts_in_silhouette", "people_hugging", "footprints",
+ // Mammals and land animals
+ "monkey_face", "monkey", "gorilla", "orangutan", "dog",
+ "guide_dog", "service_dog", "poodle", "wolf", "fox_face",
+ "raccoon", "cat", "black_cat", "lion", "tiger",
+ "leopard", "horse", "racehorse", "unicorn", "zebra",
+ "deer", "bison", "cow", "ox", "water_buffalo",
+ "pig", "boar", "pig_nose", "ram", "sheep",
+ "goat", "dromedary_camel", "camel", "llama", "giraffe",
+ "elephant", "mammoth", "rhinoceros", "hippopotamus", "mouse",
+ "rat", "hamster", "rabbit", "chipmunk", "beaver",
+ "hedgehog", "bat", "bear", "polar_bear", "koala",
+ "panda_face", "sloth", "otter", "skunk", "kangaroo",
"badger",
- "feet",
- "paw_prints",
- "turkey",
- "chicken",
- "rooster",
- "hatching_chick",
- "baby_chick",
- "hatched_chick",
- "bird",
- "penguin",
- "dove",
- "eagle",
- "duck",
- "swan",
- "owl",
- "dodo",
- "feather",
- "flamingo",
- "peacock",
- "parrot",
- "frog",
- "crocodile",
- "turtle",
- "lizard",
- "snake",
- "dragon_face",
- "dragon",
- "sauropod",
- "t-rex",
- "whale",
- "whale2",
- "dolphin",
- "flipper",
- "seal",
- "fish",
- "tropical_fish",
- "blowfish",
- "shark",
- "octopus",
- "shell",
- "snail",
- "butterfly",
- "bug",
- "ant",
- "bee",
- "honeybee",
- "beetle",
- "lady_beetle",
- "cricket",
- "cockroach",
- "spider",
- "spider_web",
- "scorpion",
- "mosquito",
- "fly",
- "worm",
- "microbe",
- "bouquet",
- "cherry_blossom",
- "white_flower",
- "rosette",
- "rose",
- "wilted_flower",
- "hibiscus",
- "sunflower",
- "blossom",
- "tulip",
- "seedling",
- "potted_plant",
- "evergreen_tree",
- "deciduous_tree",
- "palm_tree",
- "cactus",
- "ear_of_rice",
- "herb",
- "shamrock",
- "four_leaf_clover",
- "maple_leaf",
- "fallen_leaf",
- "leaves",
- "grapes",
- "melon",
- "watermelon",
- "tangerine",
- "orange",
- "mandarin",
- "lemon",
- "banana",
- "pineapple",
- "mango",
- "apple",
- "green_apple",
- "pear",
- "peach",
- "cherries",
- "strawberry",
- "blueberries",
- "kiwi_fruit",
- "tomato",
- "olive",
- "coconut",
- "avocado",
- "eggplant",
- "potato",
- "carrot",
- "corn",
- "hot_pepper",
- "bell_pepper",
- "cucumber",
- "leafy_green",
- "broccoli",
- "garlic",
- "onion",
- "mushroom",
- "peanuts",
+ // Birds and amphibians
+ "feet", "paw_prints", "turkey", "chicken", "rooster",
+ "hatching_chick", "baby_chick", "hatched_chick", "bird", "penguin",
+ "dove", "eagle", "duck", "swan", "owl",
+ "dodo", "feather", "flamingo", "peacock", "parrot",
+ "frog", "crocodile",
+ // Animals - reptiles, fish, invertebrates
+ "turtle", "lizard", "snake", "dragon_face", "dragon",
+ "sauropod", "t-rex", "whale", "whale2", "dolphin",
+ "flipper", "seal", "fish", "tropical_fish", "blowfish",
+ "shark", "octopus", "shell", "snail", "butterfly",
+ "bug", "ant", "bee", "honeybee", "beetle",
+ "lady_beetle", "cricket", "cockroach", "spider", "spider_web",
+ "scorpion", "mosquito", "fly", "worm", "microbe",
+ // Plants and nature
+ "bouquet", "cherry_blossom", "white_flower", "rosette", "rose",
+ "wilted_flower", "hibiscus", "sunflower", "blossom", "tulip",
+ "seedling", "potted_plant", "evergreen_tree", "deciduous_tree", "palm_tree",
+ "cactus", "ear_of_rice", "herb", "shamrock", "four_leaf_clover",
+ "maple_leaf", "fallen_leaf", "leaves",
+ // Food - fruits and vegetables
+ "grapes", "melon", "watermelon", "tangerine", "orange",
+ "mandarin", "lemon", "banana", "pineapple", "mango",
+ "apple", "green_apple", "pear", "peach", "cherries",
+ "strawberry", "blueberries", "kiwi_fruit", "tomato", "olive",
+ "coconut", "avocado", "eggplant", "potato", "carrot",
+ "corn", "hot_pepper", "bell_pepper", "cucumber", "leafy_green",
+ "broccoli", "garlic", "onion", "mushroom", "peanuts",
"chestnut",
- "bread",
- "croissant",
- "baguette_bread",
- "flatbread",
- "pretzel",
- "bagel",
- "pancakes",
- "waffle",
- "cheese",
- "meat_on_bone",
- "poultry_leg",
- "cut_of_meat",
- "bacon",
- "hamburger",
- "fries",
- "pizza",
- "hotdog",
- "sandwich",
- "taco",
- "burrito",
- "tamale",
- "stuffed_flatbread",
- "falafel",
- "egg",
- "fried_egg",
- "shallow_pan_of_food",
- "stew",
- "fondue",
- "bowl_with_spoon",
- "green_salad",
- "popcorn",
- "butter",
- "salt",
- "canned_food",
- "bento",
- "rice_cracker",
- "rice_ball",
- "rice",
- "curry",
- "ramen",
- "spaghetti",
- "sweet_potato",
- "oden",
- "sushi",
- "fried_shrimp",
- "fish_cake",
- "moon_cake",
- "dango",
- "dumpling",
- "fortune_cookie",
+ // Food - staples and dishes
+ "bread", "croissant", "baguette_bread", "flatbread", "pretzel",
+ "bagel", "pancakes", "waffle", "cheese", "meat_on_bone",
+ "poultry_leg", "cut_of_meat", "bacon", "hamburger", "fries",
+ "pizza", "hotdog", "sandwich", "taco", "burrito",
+ "tamale", "stuffed_flatbread", "falafel", "egg", "fried_egg",
+ "shallow_pan_of_food", "stew", "fondue", "bowl_with_spoon", "green_salad",
+ "popcorn", "butter", "salt", "canned_food", "bento",
+ "rice_cracker", "rice_ball", "rice", "curry", "ramen",
+ "spaghetti", "sweet_potato", "oden", "sushi", "fried_shrimp",
+ "fish_cake", "moon_cake", "dango", "dumpling", "fortune_cookie",
"takeout_box",
- "crab",
- "lobster",
- "shrimp",
- "squid",
- "oyster",
- "icecream",
- "shaved_ice",
- "ice_cream",
- "doughnut",
- "cookie",
- "birthday",
- "cake",
- "cupcake",
- "pie",
- "chocolate_bar",
- "candy",
- "lollipop",
- "custard",
- "honey_pot",
- "baby_bottle",
- "milk_glass",
- "coffee",
- "teapot",
- "tea",
- "sake",
- "champagne",
- "wine_glass",
- "cocktail",
- "tropical_drink",
- "beer",
- "beers",
- "clinking_glasses",
- "tumbler_glass",
- "cup_with_straw",
- "bubble_tea",
- "beverage_box",
- "mate",
- "ice_cube",
- "chopsticks",
- "plate_with_cutlery",
- "fork_and_knife",
- "spoon",
- "hocho",
- "knife",
- "amphora",
- "earth_africa",
- "earth_americas",
- "earth_asia",
- "globe_with_meridians",
- "world_map",
- "japan",
- "compass",
- "mountain_snow",
- "mountain",
- "volcano",
- "mount_fuji",
- "camping",
- "beach_umbrella",
- "desert",
- "desert_island",
- "national_park",
- "stadium",
- "classical_building",
- "building_construction",
- "bricks",
- "rock",
- "wood",
- "hut",
- "houses",
- "derelict_house",
- "house",
- "house_with_garden",
- "office",
- "post_office",
- "european_post_office",
- "hospital",
- "bank",
- "hotel",
- "love_hotel",
- "convenience_store",
- "school",
- "department_store",
- "factory",
- "japanese_castle",
- "european_castle",
- "wedding",
- "tokyo_tower",
- "statue_of_liberty",
- "church",
- "mosque",
- "hindu_temple",
- "synagogue",
- "shinto_shrine",
+ // Food - seafood, desserts, beverages, utensils
+ "crab", "lobster", "shrimp", "squid", "oyster",
+ "icecream", "shaved_ice", "ice_cream", "doughnut", "cookie",
+ "birthday", "cake", "cupcake", "pie", "chocolate_bar",
+ "candy", "lollipop", "custard", "honey_pot", "baby_bottle",
+ "milk_glass", "coffee", "teapot", "tea", "sake",
+ "champagne", "wine_glass", "cocktail", "tropical_drink", "beer",
+ "beers", "clinking_glasses", "tumbler_glass", "cup_with_straw", "bubble_tea",
+ "beverage_box", "mate", "ice_cube", "chopsticks", "plate_with_cutlery",
+ "fork_and_knife", "spoon", "hocho", "knife", "amphora",
+ // Travel & Places - globe and maps
+ "earth_africa", "earth_americas", "earth_asia", "globe_with_meridians", "world_map",
+ "japan", "compass",
+ // Travel & Places - natural landscapes
+ "mountain_snow", "mountain", "volcano", "mount_fuji", "camping",
+ "beach_umbrella", "desert", "desert_island", "national_park",
+ // Travel & Places - landmarks and buildings
+ "stadium", "classical_building", "building_construction", "bricks", "rock",
+ "wood", "hut", "houses", "derelict_house", "house",
+ "house_with_garden", "office", "post_office", "european_post_office", "hospital",
+ "bank", "hotel", "love_hotel", "convenience_store", "school",
+ "department_store", "factory", "japanese_castle", "european_castle", "wedding",
+ "tokyo_tower", "statue_of_liberty", "church", "mosque", "hindu_temple",
+ "synagogue", "shinto_shrine",
"kaaba",
- "fountain",
- "tent",
- "foggy",
- "night_with_stars",
- "cityscape",
- "sunrise_over_mountains",
- "sunrise",
- "city_sunset",
- "city_sunrise",
- "bridge_at_night",
- "hotsprings",
- "carousel_horse",
- "ferris_wheel",
- "roller_coaster",
- "barber",
- "circus_tent",
- "steam_locomotive",
- "railway_car",
- "bullettrain_side",
- "bullettrain_front",
- "train2",
- "metro",
- "light_rail",
- "station",
- "tram",
- "monorail",
- "mountain_railway",
- "train",
- "bus",
- "oncoming_bus",
- "trolleybus",
- "minibus",
- "ambulance",
- "fire_engine",
- "police_car",
- "oncoming_police_car",
- "taxi",
- "oncoming_taxi",
- "car",
- "red_car",
- "oncoming_automobile",
- "blue_car",
- "pickup_truck",
- "truck",
- "articulated_lorry",
- "tractor",
- "racing_car",
- "motorcycle",
- "motor_scooter",
- "manual_wheelchair",
- "motorized_wheelchair",
- "auto_rickshaw",
- "bike",
- "kick_scooter",
- "skateboard",
- "roller_skate",
- "busstop",
- "motorway",
- "railway_track",
- "oil_drum",
- "fuelpump",
- "rotating_light",
- "traffic_light",
- "vertical_traffic_light",
- "stop_sign",
- "construction",
- "anchor",
- "boat",
- "sailboat",
- "canoe",
- "speedboat",
- "passenger_ship",
- "ferry",
- "motor_boat",
- "ship",
- "airplane",
- "small_airplane",
- "flight_departure",
- "flight_arrival",
- "parachute",
- "seat",
- "helicopter",
- "suspension_railway",
- "mountain_cableway",
- "aerial_tramway",
- "artificial_satellite",
- "rocket",
- "flying_saucer",
- "bellhop_bell",
- "luggage",
- "hourglass",
- "hourglass_flowing_sand",
- "watch",
- "alarm_clock",
- "stopwatch",
- "timer_clock",
- "mantelpiece_clock",
- "clock12",
- "clock1230",
- "clock1",
- "clock130",
- "clock2",
- "clock230",
- "clock3",
- "clock330",
- "clock4",
- "clock430",
- "clock5",
- "clock530",
- "clock6",
- "clock630",
- "clock7",
- "clock730",
- "clock8",
- "clock830",
- "clock9",
- "clock930",
- "clock10",
- "clock1030",
- "clock11",
- "clock1130",
- "new_moon",
- "waxing_crescent_moon",
- "first_quarter_moon",
- "moon",
- "waxing_gibbous_moon",
- "full_moon",
- "waning_gibbous_moon",
- "last_quarter_moon",
- "waning_crescent_moon",
- "crescent_moon",
- "new_moon_with_face",
- "first_quarter_moon_with_face",
- "last_quarter_moon_with_face",
- "thermometer",
- "sunny",
- "full_moon_with_face",
- "sun_with_face",
- "ringed_planet",
- "star",
- "star2",
- "stars",
- "milky_way",
- "cloud",
- "partly_sunny",
- "cloud_with_lightning_and_rain",
- "sun_behind_small_cloud",
- "sun_behind_large_cloud",
- "sun_behind_rain_cloud",
- "cloud_with_rain",
- "cloud_with_snow",
- "cloud_with_lightning",
- "tornado",
- "fog",
- "wind_face",
- "cyclone",
- "rainbow",
- "closed_umbrella",
- "open_umbrella",
- "umbrella",
- "parasol_on_ground",
- "zap",
- "snowflake",
- "snowman_with_snow",
- "snowman",
- "comet",
- "fire",
- "droplet",
- "ocean",
- "jack_o_lantern",
- "christmas_tree",
- "fireworks",
- "sparkler",
- "firecracker",
- "sparkles",
- "balloon",
- "tada",
- "confetti_ball",
- "tanabata_tree",
- "bamboo",
- "dolls",
- "flags",
- "wind_chime",
- "rice_scene",
- "red_envelope",
- "ribbon",
- "gift",
- "reminder_ribbon",
- "tickets",
- "ticket",
- "medal_military",
- "trophy",
- "medal_sports",
- "1st_place_medal",
- "2nd_place_medal",
- "3rd_place_medal",
- "soccer",
- "baseball",
- "softball",
- "basketball",
- "volleyball",
- "football",
- "rugby_football",
- "tennis",
- "flying_disc",
- "bowling",
- "cricket_game",
- "field_hockey",
- "ice_hockey",
- "lacrosse",
- "ping_pong",
- "badminton",
- "boxing_glove",
- "martial_arts_uniform",
- "goal_net",
- "golf",
- "ice_skate",
- "fishing_pole_and_fish",
- "diving_mask",
- "running_shirt_with_sash",
- "ski",
- "sled",
- "curling_stone",
- "dart",
- "yo_yo",
- "kite",
- "8ball",
- "crystal_ball",
- "magic_wand",
- "nazar_amulet",
- "video_game",
- "joystick",
- "slot_machine",
- "game_die",
- "jigsaw",
- "teddy_bear",
- "pi_ata",
- "nesting_dolls",
- "spades",
- "hearts",
- "diamonds",
- "clubs",
- "chess_pawn",
- "black_joker",
- "mahjong",
- "flower_playing_cards",
- "performing_arts",
- "framed_picture",
- "art",
- "thread",
- "sewing_needle",
- "yarn",
- "knot",
- "eyeglasses",
- "dark_sunglasses",
- "goggles",
- "lab_coat",
- "safety_vest",
- "necktie",
- "shirt",
- "tshirt",
- "jeans",
- "scarf",
- "gloves",
- "coat",
- "socks",
- "dress",
- "kimono",
- "sari",
- "one_piece_swimsuit",
- "swim_brief",
- "shorts",
- "bikini",
- "womans_clothes",
- "purse",
- "handbag",
- "pouch",
- "shopping",
- "school_satchel",
- "thong_sandal",
- "mans_shoe",
- "shoe",
- "athletic_shoe",
- "hiking_boot",
- "flat_shoe",
- "high_heel",
- "sandal",
- "ballet_shoes",
- "boot",
- "crown",
- "womans_hat",
- "tophat",
- "mortar_board",
- "billed_cap",
- "military_helmet",
- "rescue_worker_helmet",
- "prayer_beads",
- "lipstick",
- "ring",
- "gem",
- "mute",
- "speaker",
- "sound",
- "loud_sound",
- "loudspeaker",
- "mega",
- "postal_horn",
- "bell",
- "no_bell",
- "musical_score",
- "musical_note",
- "notes",
- "studio_microphone",
- "level_slider",
- "control_knobs",
- "microphone",
- "headphones",
- "radio",
- "saxophone",
- "accordion",
- "guitar",
- "musical_keyboard",
- "trumpet",
- "violin",
- "banjo",
- "drum",
- "long_drum",
- "iphone",
- "calling",
- "phone",
- "telephone",
- "telephone_receiver",
- "pager",
- "fax",
- "battery",
- "electric_plug",
- "computer",
- "desktop_computer",
- "printer",
- "keyboard",
- "computer_mouse",
- "trackball",
- "minidisc",
- "floppy_disk",
- "cd",
- "dvd",
- "abacus",
- "movie_camera",
- "film_strip",
- "film_projector",
- "clapper",
- "tv",
- "camera",
- "camera_flash",
- "video_camera",
- "vhs",
- "mag",
- "mag_right",
- "candle",
- "bulb",
- "flashlight",
- "izakaya_lantern",
- "lantern",
- "diya_lamp",
- "notebook_with_decorative_cover",
- "closed_book",
- "book",
- "open_book",
- "green_book",
- "blue_book",
- "orange_book",
- "books",
- "notebook",
- "ledger",
- "page_with_curl",
- "scroll",
- "page_facing_up",
- "newspaper",
- "newspaper_roll",
- "bookmark_tabs",
- "bookmark",
- "label",
- "moneybag",
- "coin",
- "yen",
- "dollar",
- "euro",
- "pound",
- "money_with_wings",
- "credit_card",
- "receipt",
- "chart",
- "email",
- "envelope",
- "e-mail",
- "incoming_envelope",
- "envelope_with_arrow",
- "outbox_tray",
- "inbox_tray",
- "package",
- "mailbox",
- "mailbox_closed",
- "mailbox_with_mail",
- "mailbox_with_no_mail",
- "postbox",
- "ballot_box",
- "pencil2",
- "black_nib",
- "fountain_pen",
- "pen",
- "paintbrush",
- "crayon",
- "memo",
- "pencil",
- "briefcase",
- "file_folder",
- "open_file_folder",
- "card_index_dividers",
- "date",
- "calendar",
- "spiral_notepad",
- "spiral_calendar",
- "card_index",
- "chart_with_upwards_trend",
- "chart_with_downwards_trend",
- "bar_chart",
- "clipboard",
- "pushpin",
- "round_pushpin",
- "paperclip",
- "paperclips",
- "straight_ruler",
- "triangular_ruler",
- "scissors",
- "card_file_box",
- "file_cabinet",
- "wastebasket",
- "lock",
- "unlock",
- "lock_with_ink_pen",
- "closed_lock_with_key",
- "key",
- "old_key",
- "hammer",
- "axe",
- "pick",
- "hammer_and_pick",
- "hammer_and_wrench",
- "dagger",
- "crossed_swords",
- "gun",
- "boomerang",
- "bow_and_arrow",
- "shield",
- "carpentry_saw",
- "wrench",
- "screwdriver",
- "nut_and_bolt",
- "gear",
- "clamp",
- "balance_scale",
- "probing_cane",
- "link",
- "chains",
- "hook",
- "toolbox",
- "magnet",
- "ladder",
- "alembic",
- "test_tube",
- "petri_dish",
- "dna",
- "microscope",
- "telescope",
- "satellite",
- "syringe",
- "drop_of_blood",
- "pill",
- "adhesive_bandage",
- "stethoscope",
- "door",
- "elevator",
- "mirror",
- "window",
- "bed",
- "couch_and_lamp",
- "chair",
- "toilet",
- "plunger",
- "shower",
- "bathtub",
- "mouse_trap",
- "razor",
- "lotion_bottle",
- "safety_pin",
- "broom",
- "basket",
- "roll_of_paper",
- "bucket",
- "soap",
- "toothbrush",
- "sponge",
- "fire_extinguisher",
- "shopping_cart",
- "smoking",
- "coffin",
- "headstone",
- "funeral_urn",
- "moyai",
- "placard",
- "atm",
- "put_litter_in_its_place",
- "potable_water",
- "wheelchair",
- "mens",
- "womens",
- "restroom",
- "baby_symbol",
- "wc",
- "passport_control",
- "customs",
- "baggage_claim",
- "left_luggage",
- "warning",
- "children_crossing",
- "no_entry",
- "no_entry_sign",
- "no_bicycles",
- "no_smoking",
- "do_not_litter",
- "non-potable_water",
- "no_pedestrians",
- "no_mobile_phones",
- "underage",
- "radioactive",
- "biohazard",
- "arrow_up",
- "arrow_upper_right",
- "arrow_right",
- "arrow_lower_right",
- "arrow_down",
- "arrow_lower_left",
- "arrow_left",
- "arrow_upper_left",
- "arrow_up_down",
- "left_right_arrow",
- "leftwards_arrow_with_hook",
- "arrow_right_hook",
- "arrow_heading_up",
- "arrow_heading_down",
- "arrows_clockwise",
- "arrows_counterclockwise",
- "back",
- "end",
- "on",
- "soon",
- "top",
- "place_of_worship",
- "atom_symbol",
- "om",
- "star_of_david",
- "wheel_of_dharma",
- "yin_yang",
- "latin_cross",
- "orthodox_cross",
- "star_and_crescent",
- "peace_symbol",
- "menorah",
- "six_pointed_star",
- "aries",
- "taurus",
- "gemini",
- "cancer",
- "leo",
- "virgo",
- "libra",
- "scorpius",
- "sagittarius",
- "capricorn",
- "aquarius",
- "pisces",
- "ophiuchus",
- "twisted_rightwards_arrows",
- "repeat",
- "repeat_one",
- "arrow_forward",
- "fast_forward",
- "next_track_button",
- "play_or_pause_button",
- "arrow_backward",
- "rewind",
- "previous_track_button",
- "arrow_up_small",
- "arrow_double_up",
- "arrow_down_small",
- "arrow_double_down",
- "pause_button",
- "stop_button",
- "record_button",
- "eject_button",
- "cinema",
- "low_brightness",
- "high_brightness",
- "signal_strength",
- "vibration_mode",
- "mobile_phone_off",
- "female_sign",
- "male_sign",
- "transgender_symbol",
- "heavy_multiplication_x",
- "heavy_plus_sign",
- "heavy_minus_sign",
- "heavy_division_sign",
- "infinity",
- "bangbang",
- "interrobang",
- "question",
- "grey_question",
- "grey_exclamation",
- "exclamation",
- "heavy_exclamation_mark",
- "wavy_dash",
- "currency_exchange",
- "heavy_dollar_sign",
- "medical_symbol",
- "recycle",
- "fleur_de_lis",
- "trident",
- "name_badge",
- "beginner",
- "o",
- "white_check_mark",
- "ballot_box_with_check",
- "heavy_check_mark",
- "x",
- "negative_squared_cross_mark",
- "curly_loop",
- "loop",
- "part_alternation_mark",
- "eight_spoked_asterisk",
- "eight_pointed_black_star",
- "sparkle",
- "copyright",
- "registered",
- "tm",
- "hash",
- "asterisk",
- "zero",
- "one",
- "two",
- "three",
- "four",
- "five",
- "six",
- "seven",
- "eight",
- "nine",
- "keycap_ten",
- "capital_abcd",
- "abcd",
- "1234",
- "symbols",
- "abc",
- "a",
- "ab",
- "b",
- "cl",
- "cool",
- "free",
- "information_source",
- "id",
- "m",
- "new",
- "ng",
- "o2",
- "ok",
- "parking",
- "sos",
- "up",
- "vs",
- "koko",
- "sa",
- "u6708",
- "u6709",
- "u6307",
- "ideograph_advantage",
- "u5272",
- "u7121",
- "u7981",
- "accept",
- "u7533",
- "u5408",
- "u7a7a",
- "congratulations",
- "secret",
- "u55b6",
- "u6e80",
- "red_circle",
- "orange_circle",
- "yellow_circle",
- "green_circle",
- "large_blue_circle",
- "purple_circle",
- "brown_circle",
- "black_circle",
- "white_circle",
- "red_square",
- "orange_square",
- "yellow_square",
- "green_square",
- "blue_square",
- "purple_square",
- "brown_square",
- "black_large_square",
- "white_large_square",
- "black_medium_square",
- "white_medium_square",
- "black_medium_small_square",
- "white_medium_small_square",
- "black_small_square",
- "white_small_square",
- "large_orange_diamond",
- "large_blue_diamond",
- "small_orange_diamond",
- "small_blue_diamond",
- "small_red_triangle",
- "small_red_triangle_down",
- "diamond_shape_with_a_dot_inside",
- "radio_button",
- "white_square_button",
- "black_square_button",
- "checkered_flag",
- "triangular_flag_on_post",
- "crossed_flags",
- "black_flag",
- "white_flag",
- "rainbow_flag",
- "transgender_flag",
- "pirate_flag",
- "ascension_island",
- "andorra",
- "united_arab_emirates",
- "afghanistan",
- "antigua_barbuda",
- "anguilla",
- "albania",
- "armenia",
- "angola",
- "antarctica",
- "argentina",
- "american_samoa",
- "austria",
- "australia",
- "aruba",
- "aland_islands",
- "azerbaijan",
- "bosnia_herzegovina",
- "barbados",
- "bangladesh",
- "belgium",
- "burkina_faso",
- "bulgaria",
- "bahrain",
- "burundi",
- "benin",
- "st_barthelemy",
- "bermuda",
- "brunei",
- "bolivia",
- "caribbean_netherlands",
- "brazil",
- "bahamas",
- "bhutan",
- "bouvet_island",
- "botswana",
- "belarus",
- "belize",
- "canada",
- "cocos_islands",
- "congo_kinshasa",
- "central_african_republic",
- "congo_brazzaville",
- "switzerland",
- "cote_divoire",
- "cook_islands",
- "chile",
- "cameroon",
- "cn",
- "colombia",
- "clipperton_island",
- "costa_rica",
- "cuba",
- "cape_verde",
- "curacao",
- "christmas_island",
- "cyprus",
- "czech_republic",
- "de",
- "diego_garcia",
- "djibouti",
- "denmark",
- "dominica",
- "dominican_republic",
- "algeria",
- "ceuta_melilla",
- "ecuador",
- "estonia",
- "egypt",
- "western_sahara",
- "eritrea",
- "es",
- "ethiopia",
- "eu",
- "european_union",
- "finland",
- "fiji",
- "falkland_islands",
- "micronesia",
- "faroe_islands",
- "fr",
- "gabon",
- "gb",
- "uk",
- "grenada",
- "georgia",
- "french_guiana",
- "guernsey",
- "ghana",
- "gibraltar",
- "greenland",
- "gambia",
- "guinea",
- "guadeloupe",
- "equatorial_guinea",
- "greece",
- "south_georgia_south_sandwich_islands",
- "guatemala",
- "guam",
- "guinea_bissau",
- "guyana",
- "hong_kong",
- "heard_mcdonald_islands",
- "honduras",
- "croatia",
- "haiti",
- "hungary",
- "canary_islands",
- "indonesia",
- "ireland",
- "israel",
- "isle_of_man",
- "india",
- "british_indian_ocean_territory",
- "iraq",
- "iran",
- "iceland",
- "it",
- "jersey",
- "jamaica",
- "jordan",
- "jp",
- "kenya",
- "kyrgyzstan",
- "cambodia",
- "kiribati",
- "comoros",
- "st_kitts_nevis",
- "north_korea",
- "kr",
- "kuwait",
- "cayman_islands",
- "kazakhstan",
- "laos",
- "lebanon",
- "st_lucia",
- "liechtenstein",
- "sri_lanka",
- "liberia",
- "lesotho",
- "lithuania",
- "luxembourg",
- "latvia",
- "libya",
- "morocco",
- "monaco",
- "moldova",
- "montenegro",
- "st_martin",
- "madagascar",
- "marshall_islands",
- "macedonia",
- "mali",
- "myanmar",
- "mongolia",
- "macau",
- "northern_mariana_islands",
- "martinique",
- "mauritania",
- "montserrat",
- "malta",
- "mauritius",
- "maldives",
- "malawi",
- "mexico",
- "malaysia",
- "mozambique",
- "namibia",
- "new_caledonia",
- "niger",
- "norfolk_island",
- "nigeria",
- "nicaragua",
- "netherlands",
- "norway",
- "nepal",
- "nauru",
- "niue",
- "new_zealand",
- "oman",
- "panama",
- "peru",
- "french_polynesia",
- "papua_new_guinea",
- "philippines",
- "pakistan",
- "poland",
- "st_pierre_miquelon",
- "pitcairn_islands",
- "puerto_rico",
- "palestinian_territories",
- "portugal",
- "palau",
- "paraguay",
- "qatar",
- "reunion",
- "romania",
- "serbia",
- "ru",
- "rwanda",
- "saudi_arabia",
- "solomon_islands",
- "seychelles",
- "sudan",
- "sweden",
- "singapore",
- "st_helena",
- "slovenia",
- "svalbard_jan_mayen",
- "slovakia",
- "sierra_leone",
- "san_marino",
- "senegal",
- "somalia",
- "suriname",
- "south_sudan",
- "sao_tome_principe",
- "el_salvador",
- "sint_maarten",
- "syria",
- "swaziland",
- "tristan_da_cunha",
- "turks_caicos_islands",
- "chad",
- "french_southern_territories",
- "togo",
- "thailand",
- "tajikistan",
- "tokelau",
- "timor_leste",
- "turkmenistan",
- "tunisia",
- "tonga",
- "tr",
- "trinidad_tobago",
- "tuvalu",
- "taiwan",
- "tanzania",
- "ukraine",
- "uganda",
- "us_outlying_islands",
- "united_nations",
- "us",
- "uruguay",
- "uzbekistan",
- "vatican_city",
- "st_vincent_grenadines",
- "venezuela",
- "british_virgin_islands",
- "us_virgin_islands",
- "vietnam",
- "vanuatu",
- "wallis_futuna",
- "samoa",
- "kosovo",
- "yemen",
- "mayotte",
- "south_africa",
- "zambia",
- "zimbabwe",
- "england",
- "scotland",
- "wales",
+ // Travel scenes & attractions
+ "fountain", "tent", "foggy", "night_with_stars", "cityscape",
+ "sunrise_over_mountains", "sunrise", "city_sunset", "city_sunrise", "bridge_at_night",
+ "hotsprings", "carousel_horse", "ferris_wheel", "roller_coaster", "barber", "circus_tent",
+ // Rail transport
+ "steam_locomotive", "railway_car", "bullettrain_side", "bullettrain_front", "train2",
+ "metro", "light_rail", "station", "tram", "monorail",
+ "mountain_railway", "train",
+ // Road vehicles
+ "bus", "oncoming_bus", "trolleybus", "minibus", "ambulance",
+ "fire_engine", "police_car", "oncoming_police_car", "taxi", "oncoming_taxi",
+ "car", "red_car", "oncoming_automobile", "blue_car", "pickup_truck",
+ "truck", "articulated_lorry", "tractor", "racing_car", "motorcycle", "motor_scooter",
+ // Personal mobility
+ "manual_wheelchair", "motorized_wheelchair", "auto_rickshaw", "bike", "kick_scooter",
+ "skateboard", "roller_skate",
+ // Transport infrastructure
+ "busstop", "motorway", "railway_track", "oil_drum", "fuelpump",
+ "rotating_light", "traffic_light", "vertical_traffic_light", "stop_sign", "construction",
+ // Water transport
+ "anchor", "boat", "sailboat", "canoe", "speedboat",
+ "passenger_ship", "ferry", "motor_boat", "ship",
+ // Air and space travel
+ "airplane", "small_airplane", "flight_departure", "flight_arrival", "parachute",
+ "seat", "helicopter", "suspension_railway", "mountain_cableway", "aerial_tramway",
+ "artificial_satellite", "rocket", "flying_saucer",
+ // Hotel and timepieces
+ "bellhop_bell", "luggage", "hourglass", "hourglass_flowing_sand", "watch",
+ "alarm_clock", "stopwatch", "timer_clock", "mantelpiece_clock", "clock130",
+ // Moon phases
+ "new_moon", "waxing_crescent_moon", "first_quarter_moon", "moon", "waxing_gibbous_moon",
+ "full_moon", "waning_gibbous_moon", "last_quarter_moon", "waning_crescent_moon", "crescent_moon",
+ "new_moon_with_face", "first_quarter_moon_with_face", "last_quarter_moon_with_face",
+ // Weather and celestial
+ "thermometer", "sunny", "full_moon_with_face", "sun_with_face", "ringed_planet",
+ "star", "star2", "stars", "milky_way", "cloud",
+ "partly_sunny", "cloud_with_lightning_and_rain", "sun_behind_small_cloud", "sun_behind_large_cloud", "sun_behind_rain_cloud",
+ "cloud_with_rain", "cloud_with_snow", "cloud_with_lightning", "tornado", "fog",
+ "wind_face", "cyclone", "rainbow", "closed_umbrella", "open_umbrella",
+ "umbrella", "parasol_on_ground", "zap", "snowflake", "snowman_with_snow",
+ "snowman", "comet", "fire", "droplet", "ocean",
+ // Events and decorations
+ "jack_o_lantern", "christmas_tree", "fireworks", "sparkler", "firecracker",
+ "sparkles", "balloon", "tada", "confetti_ball", "tanabata_tree",
+ "bamboo", "dolls", "flags", "wind_chime", "rice_scene",
+ "red_envelope", "ribbon", "gift", "reminder_ribbon", "tickets",
+ "ticket", "medal_military", "trophy", "medal_sports", "1st_place_medal",
+ "2nd_place_medal", "3rd_place_medal",
+ // Sports
+ "soccer", "baseball", "softball", "basketball", "volleyball",
+ "football", "rugby_football", "tennis", "flying_disc", "bowling",
+ "cricket_game", "field_hockey", "ice_hockey", "lacrosse", "ping_pong",
+ "badminton", "boxing_glove", "martial_arts_uniform", "goal_net", "golf",
+ "ice_skate", "fishing_pole_and_fish", "diving_mask", "running_shirt_with_sash", "ski",
+ "sled", "curling_stone", "dart", "yo_yo", "kite",
+ // Games & leisure
+ "8ball", "crystal_ball", "magic_wand", "nazar_amulet", "video_game",
+ "joystick", "slot_machine", "game_die", "jigsaw", "teddy_bear",
+ "pi_ata", "nesting_dolls",
+ // Cards and board
+ "spades", "hearts", "diamonds", "clubs", "chess_pawn",
+ "black_joker", "mahjong", "flower_playing_cards",
+ // Arts & media
+ "performing_arts", "framed_picture", "art",
+ // Clothing & accessories
+ "thread", "sewing_needle", "yarn", "knot", "eyeglasses",
+ "dark_sunglasses", "goggles", "lab_coat", "safety_vest", "necktie",
+ "shirt", "tshirt", "jeans", "scarf", "gloves",
+ "coat", "socks", "dress", "kimono", "sari",
+ "one_piece_swimsuit", "swim_brief", "shorts", "bikini", "womans_clothes",
+ "purse", "handbag", "pouch", "shopping", "school_satchel",
+ "thong_sandal", "mans_shoe", "shoe", "athletic_shoe", "hiking_boot",
+ "flat_shoe", "high_heel", "sandal", "ballet_shoes", "boot",
+ "crown", "womans_hat", "tophat", "mortar_board", "billed_cap",
+ "military_helmet", "rescue_worker_helmet", "prayer_beads", "lipstick", "ring", "gem",
+ // Sound & music
+ "mute", "speaker", "sound", "loud_sound", "loudspeaker",
+ "mega", "postal_horn", "bell", "no_bell", "musical_score",
+ "musical_note", "notes", "studio_microphone", "level_slider", "control_knobs",
+ "microphone", "headphones", "radio", "saxophone", "accordion",
+ "guitar", "musical_keyboard", "trumpet", "violin", "banjo",
+ "drum", "long_drum",
+ // Electronics & media
+ "iphone", "calling", "phone", "telephone", "pager",
+ "fax", "battery", "electric_plug", "computer", "desktop_computer",
+ "printer", "keyboard", "computer_mouse", "trackball", "minidisc",
+ "floppy_disk", "cd", "dvd", "abacus", "movie_camera",
+ "film_strip", "film_projector", "clapper", "tv", "camera",
+ "camera_flash", "video_camera", "vhs", "mag", "mag_right",
+ // Lighting & stationary
+ "candle", "bulb", "flashlight", "izakaya_lantern", "lantern", "diya_lamp",
+ // Stationery and books
+ "notebook_with_decorative_cover", "closed_book", "book", "notebook", "ledger",
+ "page_with_curl", "scroll", "page_facing_up", "newspaper", "bookmark", "label",
+ // Money and office
+ "moneybag", "coin", "yen", "dollar", "euro",
+ "pound", "money_with_wings", "credit_card", "receipt", "chart",
+ // Mail and packages
+ "email", "envelope", "e-mail", "incoming_envelope", "envelope_with_arrow",
+ "outbox_tray", "inbox_tray", "package", "mailbox", "postbox", "ballot_box",
+ // Writing tools
+ "pencil2", "black_nib", "fountain_pen", "pen", "paintbrush",
+ "crayon", "memo", "pencil",
+ // Office items
+ "briefcase", "file_folder", "open_file_folder", "card_index_dividers", "date",
+ "calendar", "spiral_notepad", "spiral_calendar", "card_index", "chart_with_upwards_trend",
+ "chart_with_downwards_trend", "bar_chart", "clipboard", "pushpin", "round_pushpin",
+ "paperclip", "paperclips", "straight_ruler", "triangular_ruler", "scissors",
+ "card_file_box", "file_cabinet", "wastebasket",
+ // Locks and keys
+ "lock", "unlock", "lock_with_ink_pen", "closed_lock_with_key", "key", "old_key",
+ // Tools & weapons
+ "hammer", "axe", "pick", "hammer_and_pick", "hammer_and_wrench",
+ "dagger", "crossed_swords", "gun", "boomerang", "bow_and_arrow",
+ "shield", "carpentry_saw", "wrench", "screwdriver", "nut_and_bolt",
+ "gear", "clamp", "balance_scale", "probing_cane", "link",
+ "chains", "hook", "toolbox", "magnet", "ladder",
+ // Science & lab
+ "alembic", "test_tube", "petri_dish", "dna", "microscope",
+ "telescope", "satellite",
+ // Medical
+ "syringe", "drop_of_blood", "pill", "adhesive_bandage", "stethoscope",
+ // Household & furniture
+ "door", "elevator", "mirror", "window", "bed",
+ "couch_and_lamp", "chair", "toilet", "plunger", "shower",
+ "bathtub", "mouse_trap", "razor", "lotion_bottle", "safety_pin",
+ "broom", "basket", "roll_of_paper", "bucket", "soap",
+ "toothbrush", "sponge", "fire_extinguisher", "shopping_cart",
+ // Signs & facilities
+ "smoking", "coffin", "headstone", "funeral_urn", "moyai",
+ "placard", "atm", "put_litter_in_its_place", "potable_water", "wheelchair",
+ "mens", "womens", "restroom", "baby_symbol", "passport_control",
+ "customs", "baggage_claim", "left_luggage", "warning", "children_crossing",
+ "underage", "radioactive", "biohazard",
+ // UI symbols
+ "back", "end", "on", "soon", "top",
+ // Religion & philosophy
+ "place_of_worship", "atom_symbol", "wheel_of_dharma", "yin_yang", "star_and_crescent",
+ "peace_symbol", "menorah", "six_pointed_star",
+ // Zodiac
+ "aries", "taurus", "gemini", "cancer", "leo",
+ "virgo", "libra", "scorpius", "sagittarius", "capricorn",
+ "aquarius", "pisces", "ophiuchus",
+ // Playback & device status
+ "twisted_rightwards_arrows", "repeat", "cinema", "low_brightness", "high_brightness",
+ "signal_strength", "vibration_mode", "mobile_phone_off", "infinity", "bangbang", "interrobang",
},
"tag": {
- "smile",
- "happy",
- "joy",
- "haha",
- "laugh",
- "pleased",
- "hot",
- "lol",
- "laughing",
- "tears",
- "flirt",
- "proud",
- "angel",
- "love",
- "crush",
- "eyes",
- "blush",
- "tongue",
- "lick",
- "prank",
- "silly",
- "goofy",
- "wacky",
- "rich",
- "quiet",
- "whoops",
- "silence",
- "hush",
- "suspicious",
- "meh",
- "mute",
- "smug",
- "liar",
- "whew",
- "tired",
- "zzz",
- "sick",
- "ill",
- "hurt",
- "barf",
- "disgusted",
+ // Emotions - positive and laughter
+ "smile", "happy", "joy", "haha", "laugh",
+ "pleased", "hot", "lol", "laughing", "tears",
+ "flirt", "proud", "angel", "love", "crush",
+ "eyes", "blush", "tongue", "lick", "prank",
+ "silly", "goofy", "wacky",
+ // Emotions - misc states
+ "rich", "quiet", "whoops", "silence", "hush",
+ "suspicious", "meh", "mute", "smug", "liar",
+ "whew", "tired", "zzz",
+ // Health - illness and discomfort
+ "sick", "ill", "hurt", "barf", "disgusted",
"achoo",
- "heat",
- "sweating",
- "freezing",
- "ice",
- "groggy",
- "mind",
- "blown",
- "celebration",
- "birthday",
- "cool",
- "geek",
- "glasses",
- "nervous",
- "surprise",
- "impressed",
- "wow",
- "speechless",
- "amazed",
- "gasp",
- "puppy",
- "stunned",
- "scared",
- "shocked",
- "oops",
- "phew",
- "sweat",
- "sad",
- "tear",
- "cry",
- "bawling",
- "horror",
- "struggling",
- "upset",
- "whine",
- "angry",
- "mad",
- "annoyed",
- "foul",
- "devil",
- "evil",
- "horns",
- "dead",
- "danger",
- "poison",
- "pirate",
- "crap",
- "monster",
- "halloween",
- "ufo",
- "game",
- "retro",
- "monkey",
- "blind",
- "ignore",
- "deaf",
- "lipstick",
- "email",
- "envelope",
- "heart",
- "chocolates",
- "score",
- "perfect",
- "explode",
- "star",
- "water",
- "workout",
- "wind",
- "blow",
- "fast",
- "boom",
- "comment",
- "thinking",
- "sleeping",
- "goodbye",
- "highfive",
- "stop",
- "prosper",
- "spock",
- "victory",
- "peace",
- "luck",
- "hopeful",
- "approve",
- "ok",
- "disapprove",
- "bury",
- "power",
- "attack",
- "praise",
- "applause",
- "hooray",
- "deal",
- "please",
- "hope",
- "wish",
- "beauty",
- "manicure",
- "flex",
- "bicep",
- "strong",
- "hear",
- "sound",
- "listen",
- "smell",
- "look",
- "see",
- "watch",
- "taste",
- "kiss",
- "child",
- "newborn",
- "mustache",
- "father",
- "dad",
- "girls",
- "halt",
- "denied",
- "information",
- "respect",
- "thanks",
- "doctor",
- "nurse",
- "graduation",
- "school",
- "professor",
- "justice",
- "chef",
- "business",
- "research",
- "coder",
- "rockstar",
- "painter",
- "space",
- "law",
- "cop",
- "sleuth",
- "helmet",
- "crown",
- "royal",
- "hijab",
- "groom",
- "marriage",
- "wedding",
- "nursing",
- "christmas",
- "santa",
- "wizard",
- "spa",
- "exercise",
- "marathon",
- "dress",
- "dancer",
- "bunny",
- "steamy",
- "bouldering",
- "basketball",
- "gym",
- "meditation",
- "shower",
- "couple",
- "date",
- "home",
- "parents",
- "user",
- "users",
- "group",
- "team",
- "feet",
- "tracks",
- "pet",
- "dog",
- "speed",
- "desert",
- "thanksgiving",
- "slow",
- "dinosaur",
- "sea",
- "beach",
- "bug",
- "germ",
- "flowers",
- "flower",
- "spring",
- "plant",
- "wood",
- "canada",
- "autumn",
- "leaf",
- "fruit",
- "aubergine",
- "spicy",
- "toast",
- "meat",
- "chicken",
- "burger",
- "breakfast",
- "paella",
- "curry",
- "noodle",
- "pasta",
- "tempura",
- "party",
- "dessert",
- "sweet",
- "milk",
- "cafe",
+ // Temperature and exclamations
+ "heat", "sweating", "freezing", "ice", "groggy",
+ "mind", "blown",
+ // Reactions & surprise
+ "celebration", "birthday", "cool", "geek", "glasses",
+ "nervous", "surprise", "impressed", "wow", "speechless",
+ "amazed", "gasp",
+ // Reactions - fear/shock/sadness
+ "puppy", "stunned", "scared", "shocked", "oops",
+ "phew", "sweat", "sad", "tear", "cry",
+ "bawling", "horror", "struggling", "upset", "whine",
+ // Negative emotions & danger
+ "angry", "mad", "annoyed", "foul", "devil",
+ "evil", "horns", "dead", "danger", "poison",
+ // Characters & fun
+ "pirate", "crap", "monster", "halloween", "ufo",
+ // Misc reactions & concepts
+ "game", "retro", "monkey", "blind", "ignore",
+ "deaf", "lipstick", "email", "envelope", "heart",
+ "chocolates", "score", "perfect", "explode", "star",
+ "water", "workout", "wind", "blow", "fast",
+ "boom", "comment", "thinking", "sleeping", "goodbye",
+ "highfive", "stop", "prosper", "spock", "victory",
+ "peace", "luck", "hopeful", "approve", "ok",
+ "disapprove", "bury", "power", "attack", "praise",
+ "applause", "hooray", "deal", "please", "hope",
+ "wish", "beauty", "manicure", "flex", "bicep",
+ "strong", "hear", "sound", "listen", "smell",
+ "look", "see", "watch", "taste", "kiss",
+ "child", "newborn", "mustache", "father", "dad",
+ "girls", "halt", "denied", "information", "respect",
+ "thanks", "doctor", "nurse", "graduation", "school",
+ "professor", "justice", "chef", "business", "research",
+ "coder", "rockstar", "painter", "space", "law",
+ "cop", "sleuth", "helmet", "crown", "royal",
+ "hijab", "groom", "marriage", "wedding", "nursing",
+ "christmas", "santa", "wizard", "spa", "exercise",
+ "marathon", "dress", "dancer", "bunny", "steamy",
+ "bouldering", "basketball", "gym", "meditation", "shower",
+ "couple", "date", "home", "parents", "user",
+ "users", "group", "team", "feet", "tracks",
+ "pet", "dog",
+ // Nature & food
+ "wood", "canada", "autumn", "leaf", "fruit",
+ "aubergine", "spicy", "toast", "meat", "chicken",
+ "burger", "breakfast", "paella", "curry", "noodle",
+ "pasta", "tempura",
+ "flowers", "flower", "spring", "plant", "bug",
+ "germ", "dinosaur",
+ // Drinks & dining
+ "party", "dessert", "sweet", "milk", "cafe",
"espresso",
- "green",
- "bottle",
- "bubbly",
- "drink",
- "summer",
- "vacation",
- "drinks",
- "cheers",
- "whisky",
- "dining",
- "dinner",
- "cutlery",
- "cut",
- "chop",
- "globe",
- "world",
- "international",
- "global",
- "travel",
- "camping",
- "karl",
- "skyline",
- "train",
- "bicycle",
- "911",
- "emergency",
- "semaphore",
- "wip",
- "ship",
- "cruise",
- "flight",
- "orbit",
- "launch",
- "time",
- "morning",
- "night",
- "weather",
- "cloud",
- "swirl",
- "rain",
- "beach_umbrella",
- "lightning",
- "thunder",
- "winter",
- "cold",
- "burn",
- "festival",
- "shiny",
- "present",
- "award",
- "contest",
- "winner",
- "gold",
- "silver",
- "bronze",
- "sports",
- "skating",
- "target",
- "pool",
- "billiards",
- "fortune",
- "play",
- "controller",
- "console",
- "dice",
- "gambling",
- "theater",
- "drama",
- "design",
- "paint",
- "shirt",
- "formal",
- "pants",
- "bag",
- "bags",
- "sneaker",
- "sport",
- "running",
- "shoe",
- "king",
- "queen",
- "hat",
- "classy",
- "education",
- "college",
- "university",
- "makeup",
- "engaged",
+ "green", "bottle", "bubbly", "drink", "summer",
+ "vacation", "drinks", "cheers", "whisky", "dining",
+ "dinner", "cutlery", "cut", "chop",
+ // Travel & world
+ "globe", "world", "international", "global", "travel",
+ "camping", "karl", "skyline", "train", "bicycle",
+ "911", "emergency", "semaphore", "wip", "ship",
+ "cruise", "flight", "orbit", "launch", "time",
+ "morning", "night", "weather", "cloud", "swirl",
+ "rain", "beach_umbrella", "lightning", "thunder", "winter",
+ "cold", "burn", "desert", "sea", "beach",
+ // Events & awards
+ "festival", "shiny", "present", "award", "contest",
+ "winner", "gold", "silver", "bronze", "thanksgiving",
+ // Sports & arts
+ "sports", "skating", "target", "pool", "billiards",
+ "fortune", "play", "controller", "console", "dice",
+ "gambling", "theater", "drama", "design", "paint",
+ // Apparel & style
+ "shirt", "formal", "pants", "bag", "bags",
+ "sneaker", "sport", "running", "shoe", "king",
+ "queen", "hat", "classy",
+ // Education & occasions
+ "education", "college", "university", "makeup", "engaged",
"diamond",
- "volume",
- "announcement",
- "notification",
- "off",
- "music",
- "podcast",
- "sing",
- "earphones",
- "rock",
- "piano",
- "smartphone",
- "mobile",
- "call",
- "incoming",
- "phone",
- "desktop",
- "screen",
- "save",
- "film",
- "video",
- "photo",
- "search",
- "zoom",
- "idea",
- "light",
- "library",
- "document",
- "press",
- "tag",
- "dollar",
- "cream",
- "money",
- "subscription",
- "letter",
- "shipping",
- "note",
- "directory",
- "calendar",
- "schedule",
- "graph",
- "metrics",
- "stats",
- "location",
- "trash",
- "security",
- "private",
- "lock",
+ // Audio & music
+ "volume", "announcement", "notification", "off", "music",
+ "podcast", "sing", "earphones", "rock", "piano",
+ // Devices, media & ideas
+ "smartphone", "mobile", "call", "incoming", "phone",
+ "desktop", "screen", "save", "film", "video",
+ "photo", "search", "zoom", "idea", "light",
+ "library", "document", "press", "tag", "dollar",
+ // Finance & logistics
+ "cream", "money", "subscription", "letter", "shipping",
+ "note", "directory", "calendar", "schedule", "graph",
+ "metrics", "stats",
+ // Location & security
+ "location", "trash", "security", "private", "lock",
"password",
- "tool",
- "shoot",
- "weapon",
- "archery",
- "science",
- "laboratory",
- "investigate",
- "signal",
- "health",
- "hospital",
- "needle",
- "medicine",
- "wc",
- "bath",
- "toilet",
- "cigarette",
- "funeral",
- "stone",
- "accessibility",
- "restroom",
- "airport",
- "limit",
- "block",
- "forbidden",
- "return",
- "sync",
- "shuffle",
- "loop",
- "movie",
- "wifi",
- "confused",
- "bang",
- "environment",
- "trademark",
- "number",
- "letters",
- "numbers",
- "alphabet",
- "fresh",
- "yes",
- "help",
- "milestone",
- "finish",
- "pride",
- "keeling",
- "ivory",
- "china",
- "flag",
- "germany",
- "spain",
- "france",
- "french",
- "british",
- "italy",
- "japan",
- "korea",
- "burma",
- "russia",
- "turkey",
- "united",
- "america",
+ // Tools & actions
+ "tool", "shoot", "weapon", "archery", "science",
+ "laboratory", "investigate", "signal", "health", "hospital",
+ "needle", "medicine",
+ // Facilities & warnings
+ "wc", "bath", "toilet", "cigarette", "funeral",
+ "stone", "accessibility", "restroom", "airport", "limit",
+ "block", "forbidden", "return", "sync", "shuffle",
+ "loop", "movie", "wifi", "confused", "bang",
+ // Misc tail
+ "environment", "trademark", "number", "letters", "numbers",
+ "alphabet", "fresh", "help", "milestone", "finish",
+ "keeling", "ivory",
+ },
+ "sentence": {
+ // Micro / reactions (emoji varies in position)
+ "Nice {emoji}!",
+ "Mood {emoji}.",
+ "Same {emoji}.",
+ "Oof {emoji}.",
+ "Yikes {emoji}.",
+ "Winning! {emoji}",
+ "Noted {emoji}.",
+ "Done {emoji}.",
+ "Verified {emoji}.",
+ "Approved {emoji}.",
+
+ // Short combos (start/middle/end mixed)
+ "Good morning {emoji}.",
+ "{emoji} Good night.",
+ "Let’s go {emoji}!",
+ "Nailed it {emoji}{emoji}.",
+ "Ship it {emoji}.",
+ "One more? {emoji}",
+ "Be right back {emoji}.",
+ "On my way {emoji}.",
+ "Almost there… {emoji}",
+ "Thank you! {emoji}",
+
+ // Sequences with light prose
+ "{emoji} Big win today.",
+ "Coffee first {emoji} {emoji}.",
+ "Focus mode {emoji}.",
+ "Teamwork! {emoji} {emoji}",
+ "Weekend vibes {emoji}.",
+ "Deep work now {emoji}.",
+ "Daily standup time {emoji}.",
+ "Heads down {emoji}.",
+ "Let’s eat {emoji}.",
+ "Back online {emoji}.",
+
+ // Declarative statements
+ "Progress looks {adjectivedescriptive} {emoji}.",
+ "Shipping the {nouncommon} today {emoji}.",
+ "Great energy in {city}! {emoji}",
+ "The {nouncommon} feels {adjectivedescriptive} {emoji}.",
+ "Small steps, steady pace {emoji}.",
+ "Clean code, clear minds {emoji}.",
+ "New {productfeature} behind a flag {emoji}.",
+ "Reduced noise, increased signal {emoji}.",
+ "Fewer bugs, happier users {emoji}.",
+ "Results landed in the dashboard {emoji}.",
+
+ // Imperatives
+ "Keep it simple {emoji}.",
+ "Please review the PR {emoji}.",
+ "Take a quick break {emoji}.",
+ "Document the change {emoji}.",
+ "Test before you ship {emoji}.",
+ "Name things clearly {emoji}.",
+ "Measure what matters {emoji}.",
+ "Mind the latency budget {emoji}.",
+ "Protect the happy path {emoji}.",
+ "Celebrate small wins! {emoji}",
+
+ // Questions
+ "Ready to roll {emoji}?",
+ "Any blockers {emoji}?",
+ "Does this scale {emoji}?",
+ "Who owns this {emoji}?",
+ "What’s next {emoji}?",
+ "Can we simplify {emoji}?",
+ "Is this necessary {emoji}?",
+ "What did we learn {emoji}?",
+ "Are we aligned {emoji}?",
+ "Time for lunch {emoji}?",
+
+ // Status / standup style
+ "Today: {verbaction} the {nouncommon}, then review {emoji}.",
+ "Blocked by {nouncommon}; asking for help {emoji}.",
+ "Done: tests, docs, and cleanup {emoji}.",
+ "Next: rollout to {company} {emoji}.",
+ "Risks: unknown {nouncommon} under load {emoji}.",
+ "Win: latency down {number:5,60}% {emoji}.",
+ "FYI: feature flag toggled in {city} {emoji}.",
+ "Heads-up: deploy at {time} {emoji}.",
+ "Reminder: write the changelog {emoji}.",
+ "Note: {nouncommon} is now optional {emoji}.",
+
+ // Food / break
+ "Coffee break! {emoji}",
+ "Hydrate and stretch {emoji}.",
+ "Quick snack, back soon {emoji}.",
+ "Lunch run—brb {emoji}.",
+ "Treat yourself today {emoji}.",
+ "Tea time, then tasks {emoji}.",
+ "Dinner after the deploy {emoji}.",
+ "Dessert to celebrate! {emoji}",
+ "Refuel and refocus {emoji}.",
+ "Brunch plans confirmed {emoji}.",
+
+ // Fitness / wellness
+ "Breathe in, breathe out {emoji}.",
+ "Walk and think {emoji}.",
+ "Posture check {emoji}!",
+ "Micro break—eyes off screen {emoji}.",
+ "Stand, stretch, reset {emoji}.",
+ "Quick workout complete {emoji}.",
+ "Calm mind, sharp code {emoji}.",
+ "Water break—now {emoji}.",
+ "Sleep early tonight {emoji}.",
+ "Wellness first, always {emoji}.",
+
+ // Celebration / gratitude
+ "Thank you, team! {emoji}",
+ "Amazing work today {emoji}!",
+ "Proud of this release {emoji}.",
+ "You crushed it {emoji}!",
+ "Confetti for the crew! {emoji}{emoji}",
+ "Another milestone reached {emoji}.",
+ "Great feedback from users {emoji}.",
+ "High-five across time zones {emoji}!",
+ "Shipped and shining {emoji}.",
+ "Champagne later {emoji}?",
+
+ // Caution / alerts
+ "Heads-up: incidents possible {emoji}.",
+ "Careful with that change {emoji}.",
+ "Review the diff twice {emoji}.",
+ "Watch your step here {emoji}.",
+ "Rate limit enabled {emoji}.",
+ "Safeguards in place {emoji}.",
+ "Proceed with caution {emoji}.",
+ "Rollback plan ready {emoji}.",
+ "Pager is quiet—for now {emoji}.",
+ "Triage starts now {emoji}.",
+
+ // Travel / logistics
+ "Boarding soon {emoji}.",
+ "Wheels up {emoji}.",
+ "Landing shortly {emoji}.",
+ "Gate changed—move! {emoji}",
+ "Bags on carousel {number:1,12} {emoji}.",
+ "Seat {number:3,28}{letter} {emoji}.",
+ "Terminal {number:1,8}, group {number:1,5} {emoji}.",
+ "Delayed, will update {emoji}.",
+ "Taxi to the hotel {emoji}.",
+ "Home safe {emoji}.",
+
+ // Tiny stories (emoji sprinkled)
+ "Started small, grew fast {emoji}.",
+ "Found the bug, fixed it {emoji}.",
+ "Drew the map, took the path {emoji}.",
+ "Built, tested, shipped {emoji}.",
+ "Asked, listened, learned {emoji}.",
+ "Slowed down to speed up {emoji}.",
+ "Cut scope, kept quality {emoji}.",
+ "Weathered the storm {emoji}{emoji}.",
+ "Saved the day {emoji}.",
+ "Onward {emoji}.",
+
+ // Labels / tags with emoji anchors
+ "Priority: High {emoji}.",
+ "Status: In progress {emoji}.",
+ "Owner: {firstname} {lastname} {emoji}.",
+ "Location: {city}, {country} {emoji}.",
+ "Category: {emojicategory} {emoji}.",
+ "Tag: #{emojitag} {emoji}.",
+ "Version: {appversion} {emoji}.",
+ "Channel: {company} {emoji}.",
+ "Ref: {uuid} {emoji}.",
+ "Due: {date} {emoji}.",
+
+ // Mixed fun
+ "Plot twist: it worked {emoji}.",
+ "Calm is a superpower {emoji}.",
+ "Curiosity unlocked {emoji}.",
+ "Details matter {emoji}.",
+ "Less, but better {emoji}.",
+ "Momentum beats motivation {emoji}.",
+ "Consistency compounds {emoji}.",
+ "Kindness scales {emoji}.",
+ "Taste takes time {emoji}.",
+ "Simplicity wins {emoji}.",
},
}
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/data/hipster.go b/vendor/github.com/brianvoe/gofakeit/v7/data/hipster.go
index f036f463..8f913ec5 100644
--- a/vendor/github.com/brianvoe/gofakeit/v7/data/hipster.go
+++ b/vendor/github.com/brianvoe/gofakeit/v7/data/hipster.go
@@ -3,4 +3,117 @@ package data
// Hipster consists of random hipster words
var Hipster = map[string][]string{
"word": {"Wes Anderson", "chicharrones", "narwhal", "food truck", "marfa", "aesthetic", "keytar", "art party", "sustainable", "forage", "mlkshk", "gentrify", "locavore", "swag", "hoodie", "microdosing", "VHS", "before they sold out", "pabst", "plaid", "Thundercats", "freegan", "scenester", "hella", "occupy", "truffaut", "raw denim", "beard", "post-ironic", "photo booth", "twee", "90's", "pitchfork", "cray", "cornhole", "kale chips", "pour-over", "yr", "five dollar toast", "kombucha", "you probably haven't heard of them", "mustache", "fixie", "try-hard", "franzen", "kitsch", "austin", "stumptown", "keffiyeh", "whatever", "tumblr", "DIY", "shoreditch", "biodiesel", "vegan", "pop-up", "banjo", "kogi", "cold-pressed", "letterpress", "chambray", "butcher", "synth", "trust fund", "hammock", "farm-to-table", "intelligentsia", "loko", "ugh", "offal", "poutine", "gastropub", "Godard", "jean shorts", "sriracha", "dreamcatcher", "leggings", "fashion axe", "church-key", "meggings", "tote bag", "disrupt", "readymade", "helvetica", "flannel", "meh", "roof", "hashtag", "knausgaard", "cronut", "schlitz", "green juice", "waistcoat", "normcore", "viral", "ethical", "actually", "fingerstache", "humblebrag", "deep v", "wayfarers", "tacos", "taxidermy", "selvage", "put a bird on it", "ramps", "portland", "retro", "kickstarter", "bushwick", "brunch", "distillery", "migas", "flexitarian", "XOXO", "small batch", "messenger bag", "heirloom", "tofu", "bicycle rights", "bespoke", "salvia", "wolf", "selfies", "echo", "park", "listicle", "craft beer", "chartreuse", "sartorial", "pinterest", "mumblecore", "kinfolk", "vinyl", "etsy", "umami", "8-bit", "polaroid", "banh mi", "crucifix", "bitters", "brooklyn", "PBR&B", "drinking", "vinegar", "squid", "tattooed", "skateboard", "vice", "authentic", "literally", "lomo", "celiac", "health", "goth", "artisan", "chillwave", "blue bottle", "pickled", "next level", "neutra", "organic", "Yuccie", "paleo", "blog", "single-origin coffee", "seitan", "street", "gluten-free", "mixtape", "venmo", "irony", "everyday", "carry", "slow-carb", "3 wolf moon", "direct trade", "lo-fi", "tousled", "tilde", "semiotics", "cred", "chia", "master", "cleanse", "ennui", "quinoa", "pug", "iPhone", "fanny pack", "cliche", "cardigan", "asymmetrical", "meditation", "YOLO", "typewriter", "pork belly", "shabby chic", "+1", "lumbersexual", "williamsburg"},
+ "sentence": {
+ // ultra-short / taglines
+ "{hipsterword} vibes only.",
+ "deeply {hipsterword}.",
+ "casually {hipsterword}.",
+ "endlessly {hipsterword}.",
+ "pure {hipsterword} energy.",
+ "very {hipsterword}, very {hipsterword}.",
+ "{hipsterword} meets {hipsterword}.",
+ "low-fi {hipsterword}.",
+ "post-{hipsterword} mood.",
+ "tastefully {hipsterword}.",
+
+ // one-liners
+ "living that {hipsterword} life.",
+ "another day, another {hipsterword}.",
+ "strictly {hipsterword} palettes.",
+ "hand-picked {hipsterword}.",
+ "soft {hipsterword} glow in {city}.",
+ "from {city} with {hipsterword}.",
+ "born in {city}, raised on {hipsterword}.",
+ "powered by {hipsterword} and {hipsterword}.",
+ "mildly obsessed with {hipsterword}.",
+ "just add {hipsterword}.",
+
+ // comparisons / mashups
+ "{hipsterword} meets {hipsterword} in {city}.",
+ "{hipsterword}, but make it {hipsterword}.",
+ "{hipsterword} × {hipsterword}, minimal edition.",
+ "{hipsterword} on the outside, {hipsterword} at heart.",
+ "somewhere between {hipsterword} and {hipsterword}.",
+ "{hipsterword} layered over {hipsterword}.",
+ "{hipsterword} with a hint of {hipsterword}.",
+ "heavy on {hipsterword}, light on {hipsterword}.",
+ "{hipsterword} > {hipsterword}, discuss.",
+
+ // scene setters
+ "weekends are for {hipsterword} and {beerstyle}.",
+ "late nights, {hipsterword} playlists, {songgenre} loops.",
+ "mornings in {city}, afternoons in {hipsterword}.",
+ "slow afternoons, {hipsterword} everything.",
+ "back alley {hipsterword}, side-door {hipsterword}.",
+ "under neon {color}, pure {hipsterword}.",
+ "rooftop in {city}, whispering {hipsterword}.",
+ "{hipsterword} at golden hour in {city}.",
+ "between {hipsterword} stalls and {hipsterword} pop-ups.",
+
+ // lifestyle / verbs
+ "{verb} through {hipsterword} alleys.",
+ "{verb} {noun} with {hipsterword} flair.",
+ "{verb} the {noun}, keep it {hipsterword}.",
+ "{verb} slowly; trust the {hipsterword}.",
+ "{verb} toward {hipsterword} minimalism.",
+ "{verb} and {verb}, always {hipsterword}.",
+ "let it be {hipsterword}, let it be {adjective}.",
+
+ // craft / food / drink
+ "small-batch {hipsterword} in {city}.",
+ "single-origin {hipsterword}, double {adjective}.",
+ "farm-to-table {hipsterword} and {noun}.",
+ "house {hipsterword} with a {adjective} finish.",
+ "cold {hipsterword}, warm {hipsterword}.",
+ "locally sourced {hipsterword}, globally {adjective}.",
+ "{hipsterword} tasting notes: {adjective}, {adjective}, {adjective}.",
+ "pairing {hipsterword} with {beerstyle}.",
+
+ // fashion / objects
+ "{color} threads, {hipsterword} cuts.",
+ "{hipsterword} layers over {adjective} basics.",
+ "{hipsterword} silhouettes, {adjective} textures.",
+ "{hipsterword} frames and {color} accents.",
+ "{hipsterword} tote with {noun} inside.",
+ "imperfect by design, perfectly {hipsterword}.",
+
+ // travel / place
+ "lost in {city}, found in {hipsterword}.",
+ "passport full of {hipsterword}.",
+ "{hipsterword} maps and {language} menus.",
+ "backstreets of {city}, front row {hipsterword}.",
+ "from {country} to {city}, chasing {hipsterword}.",
+ "tiny studio in {city}, big {hipsterword} dreams.",
+
+ // meta / attitude
+ "ironically {hipsterword}, sincerely {adjective}.",
+ "intentionally {hipsterword}.",
+ "unapologetically {hipsterword}.",
+ "quietly {hipsterword} since {number:2001,2020}.",
+ "probably too {hipsterword} for this.",
+ "you probably haven’t tried this {hipsterword}.",
+ "subtly {hipsterword}, never loud.",
+
+ // maker / work
+ "built with {hipsterword} and {hobby}.",
+ "shipping {hipsterword} from {city}.",
+ "{programminglanguage} by day, {hipsterword} by night.",
+ "{company} meets {hipsterword} ethos.",
+ "{productcategory} with {hipsterword} edges.",
+ "designing around {hipsterword} constraints.",
+
+ // music / film / culture
+ "{songgenre} loops with {hipsterword} undertones.",
+ "cinema nights, strictly {hipsterword}.",
+ "{hipsterword} soundtrack on repeat.",
+ "scored in {hipsterword}, mixed {adverb}.",
+ "director’s cut: more {hipsterword}.",
+
+ // social / shareable
+ "tag it {hipsterword}, keep it {adjective}.",
+ "overheard in {city}: very {hipsterword}.",
+ "sent from a {hipsterword} corner of {city}.",
+ "friends don’t let friends skip {hipsterword}.",
+ "if you know, it’s {hipsterword}.",
+ },
}
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/data/internet.go b/vendor/github.com/brianvoe/gofakeit/v7/data/internet.go
index ae7561af..d546d6d4 100644
--- a/vendor/github.com/brianvoe/gofakeit/v7/data/internet.go
+++ b/vendor/github.com/brianvoe/gofakeit/v7/data/internet.go
@@ -8,4 +8,5 @@ var Internet = map[string][]string{
"http_version": {"HTTP/1.0", "HTTP/1.1", "HTTP/2.0"},
"http_status_simple": {"200", "301", "302", "400", "404", "500"},
"http_status_general": {"100", "200", "201", "203", "204", "205", "301", "302", "304", "400", "401", "403", "404", "405", "406", "416", "500", "501", "502", "503", "504"},
+ "api": {"curl/#.#.#", "python-requests/#.#.#", "PostmanRuntime/#.#.#", "Go-http-client/#.#", "Java/#.#.#_###", "node-fetch/#.#.#", "okhttp/#.#.#", "axios/#.#.#", "rest-client/#.#.#", "httpie/#.#.#", "wget/#.#.#", "apache-httpclient/#.#.##", "ruby/#.#.#", "php/#.#.#", "swift/#.#.#", "dotnet/#.#.#", "insomnia/####.#.#", "httpie-go/#.#.#", "httpx/#.##.#", "urllib3/#.##.##"},
}
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/data/isbn.go b/vendor/github.com/brianvoe/gofakeit/v7/data/isbn.go
new file mode 100644
index 00000000..ba9fd3ee
--- /dev/null
+++ b/vendor/github.com/brianvoe/gofakeit/v7/data/isbn.go
@@ -0,0 +1,58 @@
+package data
+
+// Prefixes for ISBN standards
+const (
+ ISBN13Prefix = "978"
+ ISBN10Prefix = "979"
+)
+
+// ISBNRule defines a registrant rule range and its length
+type ISBNRule struct {
+ Min string
+ Max string
+ Length int
+}
+
+// ISBNRules maps prefix -> registration group -> registrant rules
+var ISBNRules = map[string]map[string][]ISBNRule{
+ ISBN13Prefix: {
+ "0": {
+ {Min: "0000000", Max: "1999999", Length: 2},
+ {Min: "2000000", Max: "2279999", Length: 3},
+ {Min: "2280000", Max: "2289999", Length: 4},
+ {Min: "2290000", Max: "6479999", Length: 3},
+ {Min: "6480000", Max: "6489999", Length: 7},
+ {Min: "6490000", Max: "6999999", Length: 3},
+ {Min: "7000000", Max: "8499999", Length: 4},
+ {Min: "8500000", Max: "8999999", Length: 5},
+ {Min: "9000000", Max: "9499999", Length: 6},
+ {Min: "9500000", Max: "9999999", Length: 7},
+ },
+ "1": {
+ {Min: "0000000", Max: "0999999", Length: 2},
+ {Min: "1000000", Max: "3999999", Length: 3},
+ {Min: "4000000", Max: "5499999", Length: 4},
+ {Min: "5500000", Max: "7319999", Length: 5},
+ {Min: "7320000", Max: "7399999", Length: 7},
+ {Min: "7400000", Max: "8697999", Length: 5},
+ {Min: "8698000", Max: "9729999", Length: 6},
+ {Min: "9730000", Max: "9877999", Length: 4},
+ {Min: "9878000", Max: "9989999", Length: 6},
+ {Min: "9990000", Max: "9999999", Length: 7},
+ },
+ },
+ ISBN10Prefix: {
+ "8": {
+ {Min: "0000000", Max: "1999999", Length: 2},
+ {Min: "2000000", Max: "2279999", Length: 3},
+ {Min: "2280000", Max: "2289999", Length: 4},
+ {Min: "2290000", Max: "6479999", Length: 3},
+ {Min: "6480000", Max: "6489999", Length: 7},
+ {Min: "6490000", Max: "6999999", Length: 3},
+ {Min: "7000000", Max: "8499999", Length: 4},
+ {Min: "8500000", Max: "8999999", Length: 5},
+ {Min: "9000000", Max: "9499999", Length: 6},
+ {Min: "9500000", Max: "9999999", Length: 7},
+ },
+ },
+}
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/data/job.go b/vendor/github.com/brianvoe/gofakeit/v7/data/job.go
index 905dd74e..726f1df2 100644
--- a/vendor/github.com/brianvoe/gofakeit/v7/data/job.go
+++ b/vendor/github.com/brianvoe/gofakeit/v7/data/job.go
@@ -2,7 +2,66 @@ package data
// Job consists of job data
var Job = map[string][]string{
- "title": {"Administrator", "Agent", "Analyst", "Architect", "Assistant", "Associate", "Consultant", "Coordinator", "Designer", "Developer", "Director", "Engineer", "Executive", "Facilitator", "Liaison", "Manager", "Officer", "Orchestrator", "Planner", "Producer", "Representative", "Specialist", "Strategist", "Supervisor", "Technician"},
- "descriptor": {"Central", "Chief", "Corporate", "Customer", "Direct", "District", "Dynamic", "Dynamic", "Forward", "Future", "Global", "Human", "Internal", "International", "Investor", "Lead", "Legacy", "National", "Principal", "Product", "Regional", "Senior"},
- "level": {"Accountability", "Accounts", "Applications", "Assurance", "Brand", "Branding", "Communications", "Configuration", "Creative", "Data", "Directives", "Division", "Factors", "Functionality", "Group", "Identity", "Implementation", "Infrastructure", "Integration", "Interactions", "Intranet", "Marketing", "Markets", "Metrics", "Mobility", "Operations", "Optimization", "Paradigm", "Program", "Quality", "Research", "Response", "Security", "Solutions", "Tactics", "Usability", "Web"},
+ "title": {
+ "Accountant", "Actor", "Acrobat", "Administrative Assistant", "Administrator",
+ "Animator", "Analyst", "Anesthesiologist", "Archaeologist", "Architect",
+ "Artist", "Astronomer", "Athletic Trainer", "Attorney", "Auditor",
+ "Baker", "Banker", "Barber", "Bartender", "Barista",
+ "Bellhop", "Biologist", "Blacksmith", "Bookkeeper", "Bouncer",
+ "Broker", "Bus Driver", "Butcher", "Camera Operator", "Carpenter",
+ "Cashier", "Chef", "Chemist", "Cleaner", "Coach",
+ "Comedian", "Computer Programmer", "Concierge", "Construction Worker", "Consultant",
+ "Contractor", "Cook", "Counselor", "Court Reporter", "Curator",
+ "Custodian", "Dancer", "Data Scientist", "Delivery Driver", "Dentist",
+ "Designer", "Detective", "Developer", "Dietitian", "Director",
+ "DJ", "Doctor", "Dog Walker", "Driver", "Electrician",
+ "Engineer", "Esthetician", "Executive", "Farmer", "Financial Advisor",
+ "Financial Planner", "Firefighter", "Fisher", "Flight Attendant", "Florist",
+ "Garbage Collector", "Gardener", "Geologist", "Graphic Designer", "Groundskeeper",
+ "Hairdresser", "Handyman", "Hostess", "Hotel Manager", "HVAC Technician",
+ "Illustrator", "Insurance Agent", "Interpreter", "Janitor", "Journalist",
+ "Judge", "Landscaper", "Lawyer", "Legal Assistant", "Librarian",
+ "Lifeguard", "Line Cook", "Loan Officer", "Mail Carrier", "Manager",
+ "Mason", "Massage Therapist", "Mechanic", "Musician", "Nail Technician",
+ "Network Administrator", "Nurse", "Nutritionist", "Occupational Therapist", "Optometrist",
+ "Painter", "Paralegal", "Paramedic", "Pharmacist", "Photographer",
+ "Physical Therapist", "Physician", "Pilot", "Plumber", "Police Officer",
+ "Principal", "Professor", "Programmer", "Psychologist", "Radiologist",
+ "Real Estate Agent", "Receptionist", "Referee", "Reporter", "Researcher",
+ "Retail Associate", "Roofer", "Sailor", "Sales Representative", "Scientist",
+ "Scrum Master", "Sculptor", "Secretary", "Security Guard", "Server",
+ "Singer", "Social Media Influencer", "Social Worker", "Software Engineer", "Sommelier",
+ "Sound Engineer", "Speech Therapist", "Stage Manager", "Statistician", "Steamer",
+ "Stock Clerk", "Store Manager", "Storyteller", "Stunt Performer", "Stylist",
+ "Substitute Teacher", "Surgeon", "Surveyor", "System Administrator", "Systems Analyst",
+ "Tailor", "Tattoo Artist", "Tax Preparer", "Taxi Driver", "Teacher",
+ "Technician", "Telemarketer", "Therapist", "Tiler", "Tour Guide",
+ "Toy Maker", "Traffic Controller", "Train Conductor", "Translator", "Travel Agent",
+ "Tutor", "Umpire", "Upholsterer", "Usher", "Valet",
+ "Vendor", "Veterinarian", "Video Editor", "Voice Actor", "Waiter",
+ "Watchmaker", "Web Developer", "Welder", "Window Washer", "Writer",
+ "Zookeeper",
+ },
+ "descriptor": {
+ "Assistant", "Associate", "Brand", "Business", "Central",
+ "Chief", "Client", "Corporate", "Customer", "Deputy",
+ "Direct", "District", "Division", "Dynamic", "Executive",
+ "Finance", "Financial", "Forward", "Future", "Global",
+ "Group", "Head", "Human", "Internal", "International",
+ "Investor", "Junior", "Lead", "Legacy", "Main",
+ "Marketing", "National", "Operations", "Primary", "Principal",
+ "Product", "Public", "Regional", "Sales", "Senior",
+ "Staff", "Strategic", "Systems", "Technical", "Technology",
+ "Vice",
+ },
+ "level": {
+ "Accountability", "Accounts", "Applications", "Assurance", "Brand",
+ "Branding", "Communications", "Configuration", "Creative", "Data",
+ "Directives", "Division", "Factors", "Functionality", "Group",
+ "Identity", "Implementation", "Infrastructure", "Integration", "Interactions",
+ "Intranet", "Marketing", "Markets", "Metrics", "Mobility",
+ "Operations", "Optimization", "Paradigm", "Program", "Quality",
+ "Research", "Response", "Security", "Solutions", "Tactics",
+ "Usability", "Web",
+ },
}
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/data/person.go b/vendor/github.com/brianvoe/gofakeit/v7/data/person.go
index 8f65a16b..2eb101e8 100644
--- a/vendor/github.com/brianvoe/gofakeit/v7/data/person.go
+++ b/vendor/github.com/brianvoe/gofakeit/v7/data/person.go
@@ -2,11 +2,664 @@ package data
// Person consists of a slice of people information
var Person = map[string][]string{
- "prefix": {"Mr.", "Mrs.", "Ms.", "Miss", "Dr."},
- "suffix": {"Jr.", "Sr.", "I", "II", "III", "IV", "V", "MD", "DDS", "PhD", "DVM"},
- "first": {"Aaliyah", "Aaron", "Abagail", "Abbey", "Abbie", "Abbigail", "Abby", "Abdiel", "Abdul", "Abdullah", "Abe", "Abel", "Abelardo", "Abigail", "Abigale", "Abigayle", "Abner", "Abraham", "Ada", "Adah", "Adalberto", "Adaline", "Adam", "Adan", "Addie", "Addison", "Adela", "Adelbert", "Adele", "Adelia", "Adeline", "Adell", "Adella", "Adelle", "Aditya", "Adolf", "Adolfo", "Adolph", "Adolphus", "Adonis", "Adrain", "Adrian", "Adriana", "Adrianna", "Adriel", "Adrien", "Adrienne", "Afton", "Aglae", "Agnes", "Agustin", "Agustina", "Ahmad", "Ahmed", "Aida", "Aidan", "Aiden", "Aileen", "Aimee", "Aisha", "Aiyana", "Akeem", "Al", "Alaina", "Alan", "Alana", "Alanis", "Alanna", "Alayna", "Alba", "Albert", "Alberta", "Albertha", "Alberto", "Albin", "Albina", "Alda", "Alden", "Alec", "Aleen", "Alejandra", "Alejandrin", "Alek", "Alena", "Alene", "Alessandra", "Alessandro", "Alessia", "Aletha", "Alex", "Alexa", "Alexander", "Alexandra", "Alexandre", "Alexandrea", "Alexandria", "Alexandrine", "Alexandro", "Alexane", "Alexanne", "Alexie", "Alexis", "Alexys", "Alexzander", "Alf", "Alfonso", "Alfonzo", "Alford", "Alfred", "Alfreda", "Alfredo", "Ali", "Alia", "Alice", "Alicia", "Alisa", "Alisha", "Alison", "Alivia", "Aliya", "Aliyah", "Aliza", "Alize", "Allan", "Allen", "Allene", "Allie", "Allison", "Ally", "Alphonso", "Alta", "Althea", "Alva", "Alvah", "Alvena", "Alvera", "Alverta", "Alvina", "Alvis", "Alyce", "Alycia", "Alysa", "Alysha", "Alyson", "Alysson", "Amalia", "Amanda", "Amani", "Amara", "Amari", "Amaya", "Amber", "Ambrose", "Amelia", "Amelie", "Amely", "America", "Americo", "Amie", "Amina", "Amir", "Amira", "Amiya", "Amos", "Amparo", "Amy", "Amya", "Ana", "Anabel", "Anabelle", "Anahi", "Anais", "Anastacio", "Anastasia", "Anderson", "Andre", "Andreane", "Andreanne", "Andres", "Andrew", "Andy", "Angel", "Angela", "Angelica", "Angelina", "Angeline", "Angelita", "Angelo", "Angie", "Angus", "Anibal", "Anika", "Anissa", "Anita", "Aniya", "Aniyah", "Anjali", "Anna", "Annabel", "Annabell", "Annabelle", "Annalise", "Annamae", "Annamarie", "Anne", "Annetta", "Annette", "Annie", "Ansel", "Ansley", "Anthony", "Antoinette", "Antone", "Antonetta", "Antonette", "Antonia", "Antonietta", "Antonina", "Antonio", "Antwan", "Antwon", "Anya", "April", "Ara", "Araceli", "Aracely", "Arch", "Archibald", "Ardella", "Arden", "Ardith", "Arely", "Ari", "Ariane", "Arianna", "Aric", "Ariel", "Arielle", "Arjun", "Arlene", "Arlie", "Arlo", "Armand", "Armando", "Armani", "Arnaldo", "Arne", "Arno", "Arnold", "Arnoldo", "Arnulfo", "Aron", "Art", "Arthur", "Arturo", "Arvel", "Arvid", "Arvilla", "Aryanna", "Asa", "Asha", "Ashlee", "Ashleigh", "Ashley", "Ashly", "Ashlynn", "Ashton", "Ashtyn", "Asia", "Assunta", "Astrid", "Athena", "Aubree", "Aubrey", "Audie", "Audra", "Audreanne", "Audrey", "August", "Augusta", "Augustine", "Augustus", "Aurelia", "Aurelie", "Aurelio", "Aurore", "Austen", "Austin", "Austyn", "Autumn", "Ava", "Avery", "Avis", "Axel", "Ayana", "Ayden", "Ayla", "Aylin", "Baby", "Bailee", "Bailey", "Barbara", "Barney", "Baron", "Barrett", "Barry", "Bart", "Bartholome", "Barton", "Baylee", "Beatrice", "Beau", "Beaulah", "Bell", "Bella", "Belle", "Ben", "Benedict", "Benjamin", "Bennett", "Bennie", "Benny", "Benton", "Berenice", "Bernadette", "Bernadine", "Bernard", "Bernardo", "Berneice", "Bernhard", "Bernice", "Bernie", "Berniece", "Bernita", "Berry", "Bert", "Berta", "Bertha", "Bertram", "Bertrand", "Beryl", "Bessie", "Beth", "Bethany", "Bethel", "Betsy", "Bette", "Bettie", "Betty", "Bettye", "Beulah", "Beverly", "Bianka", "Bill", "Billie", "Billy", "Birdie", "Blair", "Blaise", "Blake", "Blanca", "Blanche", "Blaze", "Bo", "Bobbie", "Bobby", "Bonita", "Bonnie", "Boris", "Boyd", "Brad", "Braden", "Bradford", "Bradley", "Bradly", "Brady", "Braeden", "Brain", "Brandi", "Brando", "Brandon", "Brandt", "Brandy", "Brandyn", "Brannon", "Branson", "Brant", "Braulio", "Braxton", "Brayan", "Breana", "Breanna", "Breanne", "Brenda", "Brendan", "Brenden", "Brendon", "Brenna", "Brennan", "Brennon", "Brent", "Bret", "Brett", "Bria", "Brian", "Briana", "Brianne", "Brice", "Bridget", "Bridgette", "Bridie", "Brielle", "Brigitte", "Brionna", "Brisa", "Britney", "Brittany", "Brock", "Broderick", "Brody", "Brook", "Brooke", "Brooklyn", "Brooks", "Brown", "Bruce", "Bryana", "Bryce", "Brycen", "Bryon", "Buck", "Bud", "Buddy", "Buford", "Bulah", "Burdette", "Burley", "Burnice", "Buster", "Cade", "Caden", "Caesar", "Caitlyn", "Cale", "Caleb", "Caleigh", "Cali", "Calista", "Callie", "Camden", "Cameron", "Camila", "Camilla", "Camille", "Camren", "Camron", "Camryn", "Camylle", "Candace", "Candelario", "Candice", "Candida", "Candido", "Cara", "Carey", "Carissa", "Carlee", "Carleton", "Carley", "Carli", "Carlie", "Carlo", "Carlos", "Carlotta", "Carmel", "Carmela", "Carmella", "Carmelo", "Carmen", "Carmine", "Carol", "Carolanne", "Carole", "Carolina", "Caroline", "Carolyn", "Carolyne", "Carrie", "Carroll", "Carson", "Carter", "Cary", "Casandra", "Casey", "Casimer", "Casimir", "Casper", "Cassandra", "Cassandre", "Cassidy", "Cassie", "Catalina", "Caterina", "Catharine", "Catherine", "Cathrine", "Cathryn", "Cathy", "Cayla", "Ceasar", "Cecelia", "Cecil", "Cecile", "Cecilia", "Cedrick", "Celestine", "Celestino", "Celia", "Celine", "Cesar", "Chad", "Chadd", "Chadrick", "Chaim", "Chance", "Chandler", "Chanel", "Chanelle", "Charity", "Charlene", "Charles", "Charley", "Charlie", "Charlotte", "Chase", "Chasity", "Chauncey", "Chaya", "Chaz", "Chelsea", "Chelsey", "Chelsie", "Chesley", "Chester", "Chet", "Cheyanne", "Cheyenne", "Chloe", "Chris", "Christ", "Christa", "Christelle", "Christian", "Christiana", "Christina", "Christine", "Christop", "Christophe", "Christopher", "Christy", "Chyna", "Ciara", "Cicero", "Cielo", "Cierra", "Cindy", "Citlalli", "Clair", "Claire", "Clara", "Clarabelle", "Clare", "Clarissa", "Clark", "Claud", "Claude", "Claudia", "Claudie", "Claudine", "Clay", "Clemens", "Clement", "Clementina", "Clementine", "Clemmie", "Cleo", "Cleora", "Cleta", "Cletus", "Cleve", "Cleveland", "Clifford", "Clifton", "Clint", "Clinton", "Clotilde", "Clovis", "Cloyd", "Clyde", "Coby", "Cody", "Colby", "Cole", "Coleman", "Colin", "Colleen", "Collin", "Colt", "Colten", "Colton", "Columbus", "Concepcion", "Conner", "Connie", "Connor", "Conor", "Conrad", "Constance", "Constantin", "Consuelo", "Cooper", "Cora", "Coralie", "Corbin", "Cordelia", "Cordell", "Cordia", "Cordie", "Corene", "Corine", "Cornelius", "Cornell", "Corrine", "Cortez", "Cortney", "Cory", "Coty", "Courtney", "Coy", "Craig", "Crawford", "Creola", "Cristal", "Cristian", "Cristina", "Cristobal", "Cristopher", "Cruz", "Crystal", "Crystel", "Cullen", "Curt", "Curtis", "Cydney", "Cynthia", "Cyril", "Cyrus", "Dagmar", "Dahlia", "Daija", "Daisha", "Daisy", "Dakota", "Dale", "Dallas", "Dallin", "Dalton", "Damaris", "Dameon", "Damian", "Damien", "Damion", "Damon", "Dan", "Dana", "Dandre", "Dane", "Dangelo", "Dangelo", "Danial", "Daniela", "Daniella", "Danielle", "Danika", "Dannie", "Danny", "Dante", "Danyka", "Daphne", "Daphnee", "Daphney", "Darby", "Daren", "Darian", "Dariana", "Darien", "Dario", "Darion", "Darius", "Darlene", "Daron", "Darrel", "Darrell", "Darren", "Darrick", "Darrin", "Darrion", "Darron", "Darryl", "Darwin", "Daryl", "Dashawn", "Dasia", "Dave", "David", "Davin", "Davion", "Davon", "Davonte", "Dawn", "Dawson", "Dax", "Dayana", "Dayna", "Dayne", "Dayton", "Dean", "Deangelo", "Deanna", "Deborah", "Declan", "Dedric", "Dedrick", "Dee", "Deion", "Deja", "Dejah", "Dejon", "Dejuan", "Delaney", "Delbert", "Delfina", "Delia", "Delilah", "Dell", "Della", "Delmer", "Delores", "Delpha", "Delphia", "Delphine", "Delta", "Demarco", "Demarcus", "Demario", "Demetris", "Demetrius", "Demond", "Dena", "Denis", "Dennis", "Deon", "Deondre", "Deontae", "Deonte", "Dereck", "Derek", "Derick", "Deron", "Derrick", "Deshaun", "Deshawn", "Desiree", "Desmond", "Dessie", "Destany", "Destin", "Destinee", "Destiney", "Destini", "Destiny", "Devan", "Devante", "Deven", "Devin", "Devon", "Devonte", "Devyn", "Dewayne", "Dewitt", "Dexter", "Diamond", "Diana", "Dianna", "Diego", "Dillan", "Dillon", "Dimitri", "Dina", "Dino", "Dion", "Dixie", "Dock", "Dolly", "Dolores", "Domenic", "Domenica", "Domenick", "Domenico", "Domingo", "Dominic", "Dominique", "Don", "Donald", "Donato", "Donavon", "Donna", "Donnell", "Donnie", "Donny", "Dora", "Dorcas", "Dorian", "Doris", "Dorothea", "Dorothy", "Dorris", "Dortha", "Dorthy", "Doug", "Douglas", "Dovie", "Doyle", "Drake", "Drew", "Duane", "Dudley", "Dulce", "Duncan", "Durward", "Dustin", "Dusty", "Dwight", "Dylan", "Earl", "Earlene", "Earline", "Earnest", "Earnestine", "Easter", "Easton", "Ebba", "Ebony", "Ed", "Eda", "Edd", "Eddie", "Eden", "Edgar", "Edgardo", "Edison", "Edmond", "Edmund", "Edna", "Eduardo", "Edward", "Edwardo", "Edwin", "Edwina", "Edyth", "Edythe", "Effie", "Efrain", "Efren", "Eileen", "Einar", "Eino", "Eladio", "Elaina", "Elbert", "Elda", "Eldon", "Eldora", "Eldred", "Eldridge", "Eleanora", "Eleanore", "Eleazar", "Electa", "Elena", "Elenor", "Elenora", "Eleonore", "Elfrieda", "Eli", "Elian", "Eliane", "Elias", "Eliezer", "Elijah", "Elinor", "Elinore", "Elisa", "Elisabeth", "Elise", "Eliseo", "Elisha", "Elissa", "Eliza", "Elizabeth", "Ella", "Ellen", "Ellie", "Elliot", "Elliott", "Ellis", "Ellsworth", "Elmer", "Elmira", "Elmo", "Elmore", "Elna", "Elnora", "Elody", "Eloisa", "Eloise", "Elouise", "Eloy", "Elroy", "Elsa", "Else", "Elsie", "Elta", "Elton", "Elva", "Elvera", "Elvie", "Elvis", "Elwin", "Elwyn", "Elyse", "Elyssa", "Elza", "Emanuel", "Emelia", "Emelie", "Emely", "Emerald", "Emerson", "Emery", "Emie", "Emil", "Emile", "Emilia", "Emiliano", "Emilie", "Emilio", "Emily", "Emma", "Emmalee", "Emmanuel", "Emmanuelle", "Emmet", "Emmett", "Emmie", "Emmitt", "Emmy", "Emory", "Ena", "Enid", "Enoch", "Enola", "Enos", "Enrico", "Enrique", "Ephraim", "Era", "Eriberto", "Eric", "Erica", "Erich", "Erick", "Ericka", "Erik", "Erika", "Erin", "Erling", "Erna", "Ernest", "Ernestina", "Ernestine", "Ernesto", "Ernie", "Ervin", "Erwin", "Eryn", "Esmeralda", "Esperanza", "Esta", "Esteban", "Estefania", "Estel", "Estell", "Estella", "Estelle", "Estevan", "Esther", "Estrella", "Etha", "Ethan", "Ethel", "Ethelyn", "Ethyl", "Ettie", "Eudora", "Eugene", "Eugenia", "Eula", "Eulah", "Eulalia", "Euna", "Eunice", "Eusebio", "Eva", "Evalyn", "Evan", "Evangeline", "Evans", "Eve", "Eveline", "Evelyn", "Everardo", "Everett", "Everette", "Evert", "Evie", "Ewald", "Ewell", "Ezekiel", "Ezequiel", "Ezra", "Fabian", "Fabiola", "Fae", "Fannie", "Fanny", "Fatima", "Faustino", "Fausto", "Favian", "Fay", "Faye", "Federico", "Felicia", "Felicita", "Felicity", "Felipa", "Felipe", "Felix", "Felton", "Fermin", "Fern", "Fernando", "Ferne", "Fidel", "Filiberto", "Filomena", "Finn", "Fiona", "Flavie", "Flavio", "Fleta", "Fletcher", "Flo", "Florence", "Florencio", "Florian", "Florida", "Florine", "Flossie", "Floy", "Floyd", "Ford", "Forest", "Forrest", "Foster", "Frances", "Francesca", "Francesco", "Francis", "Francisca", "Francisco", "Franco", "Frank", "Frankie", "Franz", "Fred", "Freda", "Freddie", "Freddy", "Frederic", "Frederick", "Frederik", "Frederique", "Fredrick", "Fredy", "Freeda", "Freeman", "Freida", "Frida", "Frieda", "Friedrich", "Fritz", "Furman", "Gabe", "Gabriel", "Gabriella", "Gabrielle", "Gaetano", "Gage", "Gail", "Gardner", "Garett", "Garfield", "Garland", "Garnet", "Garnett", "Garret", "Garrett", "Garrick", "Garrison", "Garry", "Garth", "Gaston", "Gavin", "Gay", "Gayle", "Gaylord", "Gene", "General", "Genesis", "Genevieve", "Gennaro", "Genoveva", "Geo", "Geoffrey", "George", "Georgette", "Georgiana", "Georgianna", "Geovanni", "Geovanny", "Geovany", "Gerald", "Geraldine", "Gerard", "Gerardo", "Gerda", "Gerhard", "Germaine", "German", "Gerry", "Gerson", "Gertrude", "Gia", "Gianni", "Gideon", "Gilbert", "Gilberto", "Gilda", "Giles", "Gillian", "Gina", "Gino", "Giovani", "Giovanna", "Giovanni", "Giovanny", "Gisselle", "Giuseppe", "Gladyce", "Gladys", "Glen", "Glenda", "Glenna", "Glennie", "Gloria", "Godfrey", "Golda", "Golden", "Gonzalo", "Gordon", "Grace", "Gracie", "Graciela", "Grady", "Graham", "Grant", "Granville", "Grayce", "Grayson", "Green", "Greg", "Gregg", "Gregoria", "Gregorio", "Gregory", "Greta", "Gretchen", "Greyson", "Griffin", "Grover", "Guadalupe", "Gudrun", "Guido", "Guillermo", "Guiseppe", "Gunnar", "Gunner", "Gus", "Gussie", "Gust", "Gustave", "Guy", "Gwen", "Gwendolyn", "Hadley", "Hailee", "Hailey", "Hailie", "Hal", "Haleigh", "Haley", "Halie", "Halle", "Hallie", "Hank", "Hanna", "Hannah", "Hans", "Hardy", "Harley", "Harmon", "Harmony", "Harold", "Harrison", "Harry", "Harvey", "Haskell", "Hassan", "Hassie", "Hattie", "Haven", "Hayden", "Haylee", "Hayley", "Haylie", "Hazel", "Hazle", "Heath", "Heather", "Heaven", "Heber", "Hector", "Heidi", "Helen", "Helena", "Helene", "Helga", "Hellen", "Helmer", "Heloise", "Henderson", "Henri", "Henriette", "Henry", "Herbert", "Herman", "Hermann", "Hermina", "Herminia", "Herminio", "Hershel", "Herta", "Hertha", "Hester", "Hettie", "Hilario", "Hilbert", "Hilda", "Hildegard", "Hillard", "Hillary", "Hilma", "Hilton", "Hipolito", "Hiram", "Hobart", "Holden", "Hollie", "Hollis", "Holly", "Hope", "Horace", "Horacio", "Hortense", "Hosea", "Houston", "Howard", "Howell", "Hoyt", "Hubert", "Hudson", "Hugh", "Hulda", "Humberto", "Hunter", "Hyman", "Ian", "Ibrahim", "Icie", "Ida", "Idell", "Idella", "Ignacio", "Ignatius", "Ike", "Ila", "Ilene", "Iliana", "Ima", "Imani", "Imelda", "Immanuel", "Imogene", "Ines", "Irma", "Irving", "Irwin", "Isaac", "Isabel", "Isabell", "Isabella", "Isabelle", "Isac", "Isadore", "Isai", "Isaiah", "Isaias", "Isidro", "Ismael", "Isobel", "Isom", "Israel", "Issac", "Itzel", "Iva", "Ivah", "Ivory", "Ivy", "Izabella", "Izaiah", "Jabari", "Jace", "Jacey", "Jacinthe", "Jacinto", "Jack", "Jackeline", "Jackie", "Jacklyn", "Jackson", "Jacky", "Jaclyn", "Jacquelyn", "Jacques", "Jacynthe", "Jada", "Jade", "Jaden", "Jadon", "Jadyn", "Jaeden", "Jaida", "Jaiden", "Jailyn", "Jaime", "Jairo", "Jakayla", "Jake", "Jakob", "Jaleel", "Jalen", "Jalon", "Jalyn", "Jamaal", "Jamal", "Jamar", "Jamarcus", "Jamel", "Jameson", "Jamey", "Jamie", "Jamil", "Jamir", "Jamison", "Jammie", "Jan", "Jana", "Janae", "Jane", "Janelle", "Janessa", "Janet", "Janice", "Janick", "Janie", "Janis", "Janiya", "Jannie", "Jany", "Jaquan", "Jaquelin", "Jaqueline", "Jared", "Jaren", "Jarod", "Jaron", "Jarred", "Jarrell", "Jarret", "Jarrett", "Jarrod", "Jarvis", "Jasen", "Jasmin", "Jason", "Jasper", "Jaunita", "Javier", "Javon", "Javonte", "Jay", "Jayce", "Jaycee", "Jayda", "Jayde", "Jayden", "Jaydon", "Jaylan", "Jaylen", "Jaylin", "Jaylon", "Jayme", "Jayne", "Jayson", "Jazlyn", "Jazmin", "Jazmyn", "Jazmyne", "Jean", "Jeanette", "Jeanie", "Jeanne", "Jed", "Jedediah", "Jedidiah", "Jeff", "Jefferey", "Jeffery", "Jeffrey", "Jeffry", "Jena", "Jenifer", "Jennie", "Jennifer", "Jennings", "Jennyfer", "Jensen", "Jerad", "Jerald", "Jeramie", "Jeramy", "Jerel", "Jeremie", "Jeremy", "Jermain", "Jermaine", "Jermey", "Jerod", "Jerome", "Jeromy", "Jerrell", "Jerrod", "Jerrold", "Jerry", "Jess", "Jesse", "Jessica", "Jessie", "Jessika", "Jessy", "Jessyca", "Jesus", "Jett", "Jettie", "Jevon", "Jewel", "Jewell", "Jillian", "Jimmie", "Jimmy", "Jo", "Joan", "Joana", "Joanie", "Joanne", "Joannie", "Joanny", "Joany", "Joaquin", "Jocelyn", "Jodie", "Jody", "Joe", "Joel", "Joelle", "Joesph", "Joey", "Johan", "Johann", "Johanna", "Johathan", "John", "Johnathan", "Johnathon", "Johnnie", "Johnny", "Johnpaul", "Johnson", "Jolie", "Jon", "Jonas", "Jonatan", "Jonathan", "Jonathon", "Jordan", "Jordane", "Jordi", "Jordon", "Jordy", "Jordyn", "Jorge", "Jose", "Josefa", "Josefina", "Joseph", "Josephine", "Josh", "Joshua", "Joshuah", "Josiah", "Josiane", "Josianne", "Josie", "Josue", "Jovan", "Jovani", "Jovanny", "Jovany", "Joy", "Joyce", "Juana", "Juanita", "Judah", "Judd", "Jude", "Judge", "Judson", "Judy", "Jules", "Julia", "Julian", "Juliana", "Julianne", "Julie", "Julien", "Juliet", "Julio", "Julius", "June", "Junior", "Junius", "Justen", "Justice", "Justina", "Justine", "Juston", "Justus", "Justyn", "Juvenal", "Juwan", "Kacey", "Kaci", "Kacie", "Kade", "Kaden", "Kadin", "Kaela", "Kaelyn", "Kaia", "Kailee", "Kailey", "Kailyn", "Kaitlin", "Kaitlyn", "Kale", "Kaleb", "Kaleigh", "Kaley", "Kali", "Kallie", "Kameron", "Kamille", "Kamren", "Kamron", "Kamryn", "Kane", "Kara", "Kareem", "Karelle", "Karen", "Kari", "Kariane", "Karianne", "Karina", "Karine", "Karl", "Karlee", "Karley", "Karli", "Karlie", "Karolann", "Karson", "Kasandra", "Kasey", "Kassandra", "Katarina", "Katelin", "Katelyn", "Katelynn", "Katharina", "Katherine", "Katheryn", "Kathleen", "Kathlyn", "Kathryn", "Kathryne", "Katlyn", "Katlynn", "Katrina", "Katrine", "Kattie", "Kavon", "Kay", "Kaya", "Kaycee", "Kayden", "Kayla", "Kaylah", "Kaylee", "Kayleigh", "Kayley", "Kayli", "Kaylie", "Kaylin", "Keagan", "Keanu", "Keara", "Keaton", "Keegan", "Keeley", "Keely", "Keenan", "Keira", "Keith", "Kellen", "Kelley", "Kelli", "Kellie", "Kelly", "Kelsi", "Kelsie", "Kelton", "Kelvin", "Ken", "Kendall", "Kendra", "Kendrick", "Kenna", "Kennedi", "Kennedy", "Kenneth", "Kennith", "Kenny", "Kenton", "Kenya", "Kenyatta", "Kenyon", "Keon", "Keshaun", "Keshawn", "Keven", "Kevin", "Kevon", "Keyon", "Keyshawn", "Khalid", "Khalil", "Kian", "Kiana", "Kianna", "Kiara", "Kiarra", "Kiel", "Kiera", "Kieran", "Kiley", "Kim", "Kimberly", "King", "Kip", "Kira", "Kirk", "Kirsten", "Kirstin", "Kitty", "Kobe", "Koby", "Kody", "Kolby", "Kole", "Korbin", "Korey", "Kory", "Kraig", "Kris", "Krista", "Kristian", "Kristin", "Kristina", "Kristofer", "Kristoffer", "Kristopher", "Kristy", "Krystal", "Krystel", "Krystina", "Kurt", "Kurtis", "Kyla", "Kyle", "Kylee", "Kyleigh", "Kyler", "Kylie", "Kyra", "Lacey", "Lacy", "Ladarius", "Lafayette", "Laila", "Laisha", "Lamar", "Lambert", "Lamont", "Lance", "Landen", "Lane", "Laney", "Larissa", "Laron", "Larry", "Larue", "Laura", "Laurel", "Lauren", "Laurence", "Lauretta", "Lauriane", "Laurianne", "Laurie", "Laurine", "Laury", "Lauryn", "Lavada", "Lavern", "Laverna", "Laverne", "Lavina", "Lavinia", "Lavon", "Lavonne", "Lawrence", "Lawson", "Layla", "Layne", "Lazaro", "Lea", "Leann", "Leanna", "Leanne", "Leatha", "Leda", "Lee", "Leif", "Leila", "Leilani", "Lela", "Lelah", "Leland", "Lelia", "Lempi", "Lemuel", "Lenna", "Lennie", "Lenny", "Lenora", "Lenore", "Leo", "Leola", "Leon", "Leonard", "Leonardo", "Leone", "Leonel", "Leonie", "Leonor", "Leonora", "Leopold", "Leopoldo", "Leora", "Lera", "Lesley", "Leslie", "Lesly", "Lessie", "Lester", "Leta", "Letha", "Letitia", "Levi", "Lew", "Lewis", "Lexi", "Lexie", "Lexus", "Lia", "Liam", "Liana", "Libbie", "Libby", "Lila", "Lilian", "Liliana", "Liliane", "Lilla", "Lillian", "Lilliana", "Lillie", "Lilly", "Lily", "Lilyan", "Lina", "Lincoln", "Linda", "Lindsay", "Lindsey", "Linnea", "Linnie", "Linwood", "Lionel", "Lisa", "Lisandro", "Lisette", "Litzy", "Liza", "Lizeth", "Lizzie", "Llewellyn", "Lloyd", "Logan", "Lois", "Lola", "Lolita", "Loma", "Lon", "London", "Lonie", "Lonnie", "Lonny", "Lonzo", "Lora", "Loraine", "Loren", "Lorena", "Lorenz", "Lorenza", "Lorenzo", "Lori", "Lorine", "Lorna", "Lottie", "Lou", "Louie", "Louisa", "Lourdes", "Louvenia", "Lowell", "Loy", "Loyal", "Loyce", "Lucas", "Luciano", "Lucie", "Lucienne", "Lucile", "Lucinda", "Lucio", "Lucious", "Lucius", "Lucy", "Ludie", "Ludwig", "Lue", "Luella", "Luigi", "Luis", "Luisa", "Lukas", "Lula", "Lulu", "Luna", "Lupe", "Lura", "Lurline", "Luther", "Luz", "Lyda", "Lydia", "Lyla", "Lynn", "Lyric", "Lysanne", "Mabel", "Mabelle", "Mable", "Mac", "Macey", "Maci", "Macie", "Mack", "Mackenzie", "Macy", "Madaline", "Madalyn", "Maddison", "Madeline", "Madelyn", "Madelynn", "Madge", "Madie", "Madilyn", "Madisen", "Madison", "Madisyn", "Madonna", "Madyson", "Mae", "Maegan", "Maeve", "Mafalda", "Magali", "Magdalen", "Magdalena", "Maggie", "Magnolia", "Magnus", "Maia", "Maida", "Maiya", "Major", "Makayla", "Makenna", "Makenzie", "Malachi", "Malcolm", "Malika", "Malinda", "Mallie", "Mallory", "Malvina", "Mandy", "Manley", "Manuel", "Manuela", "Mara", "Marc", "Marcel", "Marcelina", "Marcelino", "Marcella", "Marcelle", "Marcellus", "Marcelo", "Marcia", "Marco", "Marcos", "Marcus", "Margaret", "Margarete", "Margarett", "Margaretta", "Margarette", "Margarita", "Marge", "Margie", "Margot", "Margret", "Marguerite", "Maria", "Mariah", "Mariam", "Marian", "Mariana", "Mariane", "Marianna", "Marianne", "Mariano", "Maribel", "Marie", "Mariela", "Marielle", "Marietta", "Marilie", "Marilou", "Marilyne", "Marina", "Mario", "Marion", "Marisa", "Marisol", "Maritza", "Marjolaine", "Marjorie", "Marjory", "Mark", "Markus", "Marlee", "Marlen", "Marlene", "Marley", "Marlin", "Marlon", "Marques", "Marquis", "Marquise", "Marshall", "Marta", "Martin", "Martina", "Martine", "Marty", "Marvin", "Mary", "Maryam", "Maryjane", "Maryse", "Mason", "Mateo", "Mathew", "Mathias", "Mathilde", "Matilda", "Matilde", "Matt", "Matteo", "Mattie", "Maud", "Maude", "Maudie", "Maureen", "Maurice", "Mauricio", "Maurine", "Maverick", "Mavis", "Max", "Maxie", "Maxime", "Maximilian", "Maximillia", "Maximillian", "Maximo", "Maximus", "Maxine", "Maxwell", "May", "Maya", "Maybell", "Maybelle", "Maye", "Maymie", "Maynard", "Mayra", "Mazie", "Mckayla", "Mckenna", "Mckenzie", "Meagan", "Meaghan", "Meda", "Megane", "Meggie", "Meghan", "Mekhi", "Melany", "Melba", "Melisa", "Melissa", "Mellie", "Melody", "Melvin", "Melvina", "Melyna", "Melyssa", "Mercedes", "Meredith", "Merl", "Merle", "Merlin", "Merritt", "Mertie", "Mervin", "Meta", "Mia", "Micaela", "Micah", "Michael", "Michaela", "Michale", "Micheal", "Michel", "Michele", "Michelle", "Miguel", "Mikayla", "Mike", "Mikel", "Milan", "Miles", "Milford", "Miller", "Millie", "Milo", "Milton", "Mina", "Minerva", "Minnie", "Miracle", "Mireille", "Mireya", "Misael", "Missouri", "Misty", "Mitchel", "Mitchell", "Mittie", "Modesta", "Modesto", "Mohamed", "Mohammad", "Mohammed", "Moises", "Mollie", "Molly", "Mona", "Monica", "Monique", "Monroe", "Monserrat", "Monserrate", "Montana", "Monte", "Monty", "Morgan", "Moriah", "Morris", "Mortimer", "Morton", "Mose", "Moses", "Moshe", "Mossie", "Mozell", "Mozelle", "Muhammad", "Muriel", "Murl", "Murphy", "Murray", "Mustafa", "Mya", "Myah", "Mylene", "Myles", "Myra", "Myriam", "Myrl", "Myrna", "Myron", "Myrtice", "Myrtie", "Myrtis", "Myrtle", "Nadia", "Nakia", "Name", "Nannie", "Naomi", "Naomie", "Napoleon", "Narciso", "Nash", "Nasir", "Nat", "Natalia", "Natalie", "Natasha", "Nathan", "Nathanael", "Nathanial", "Nathaniel", "Nathen", "Nayeli", "Neal", "Ned", "Nedra", "Neha", "Neil", "Nelda", "Nella", "Nelle", "Nellie", "Nels", "Nelson", "Neoma", "Nestor", "Nettie", "Neva", "Newell", "Newton", "Nia", "Nicholas", "Nicholaus", "Nichole", "Nick", "Nicklaus", "Nickolas", "Nico", "Nicola", "Nicolas", "Nicole", "Nicolette", "Nigel", "Nikita", "Nikki", "Nikko", "Niko", "Nikolas", "Nils", "Nina", "Noah", "Noble", "Noe", "Noel", "Noelia", "Noemi", "Noemie", "Noemy", "Nola", "Nolan", "Nona", "Nora", "Norbert", "Norberto", "Norene", "Norma", "Norris", "Norval", "Norwood", "Nova", "Novella", "Nya", "Nyah", "Nyasia", "Obie", "Oceane", "Ocie", "Octavia", "Oda", "Odell", "Odessa", "Odie", "Ofelia", "Okey", "Ola", "Olaf", "Ole", "Olen", "Oleta", "Olga", "Olin", "Oliver", "Ollie", "Oma", "Omari", "Omer", "Ona", "Onie", "Opal", "Ophelia", "Ora", "Oral", "Oran", "Oren", "Orie", "Orin", "Orion", "Orland", "Orlando", "Orlo", "Orpha", "Orrin", "Orval", "Orville", "Osbaldo", "Osborne", "Oscar", "Osvaldo", "Oswald", "Oswaldo", "Otha", "Otho", "Otilia", "Otis", "Ottilie", "Ottis", "Otto", "Ova", "Owen", "Ozella", "Pablo", "Paige", "Palma", "Pamela", "Pansy", "Paolo", "Paris", "Parker", "Pascale", "Pasquale", "Pat", "Patience", "Patricia", "Patrick", "Patsy", "Pattie", "Paul", "Paula", "Pauline", "Paxton", "Payton", "Pearl", "Pearlie", "Pearline", "Pedro", "Peggie", "Penelope", "Percival", "Percy", "Perry", "Pete", "Peter", "Petra", "Peyton", "Philip", "Phoebe", "Phyllis", "Pierce", "Pierre", "Pietro", "Pink", "Pinkie", "Piper", "Polly", "Porter", "Precious", "Presley", "Preston", "Price", "Prince", "Princess", "Priscilla", "Providenci", "Prudence", "Queen", "Queenie", "Quentin", "Quincy", "Quinn", "Quinten", "Quinton", "Rachael", "Rachel", "Rachelle", "Rae", "Raegan", "Rafael", "Rafaela", "Raheem", "Rahsaan", "Rahul", "Raina", "Raleigh", "Ralph", "Ramiro", "Ramon", "Ramona", "Randal", "Randall", "Randi", "Randy", "Ransom", "Raoul", "Raphael", "Raphaelle", "Raquel", "Rashad", "Rashawn", "Rasheed", "Raul", "Raven", "Ray", "Raymond", "Raymundo", "Reagan", "Reanna", "Reba", "Rebeca", "Rebecca", "Rebeka", "Rebekah", "Reece", "Reed", "Reese", "Regan", "Reggie", "Reginald", "Reid", "Reilly", "Reina", "Reinhold", "Remington", "Rene", "Renee", "Ressie", "Reta", "Retha", "Retta", "Reuben", "Reva", "Rex", "Rey", "Reyes", "Reymundo", "Reyna", "Reynold", "Rhea", "Rhett", "Rhianna", "Rhiannon", "Rhoda", "Ricardo", "Richard", "Richie", "Richmond", "Rick", "Rickey", "Rickie", "Ricky", "Rico", "Rigoberto", "Riley", "Rita", "River", "Robb", "Robbie", "Robert", "Roberta", "Roberto", "Robin", "Robyn", "Rocio", "Rocky", "Rod", "Roderick", "Rodger", "Rodolfo", "Rodrick", "Rodrigo", "Roel", "Rogelio", "Roger", "Rogers", "Rolando", "Rollin", "Roma", "Romaine", "Roman", "Ron", "Ronaldo", "Ronny", "Roosevelt", "Rory", "Rosa", "Rosalee", "Rosalia", "Rosalind", "Rosalinda", "Rosalyn", "Rosamond", "Rosanna", "Rosario", "Roscoe", "Rose", "Rosella", "Roselyn", "Rosemarie", "Rosemary", "Rosendo", "Rosetta", "Rosie", "Rosina", "Roslyn", "Ross", "Rossie", "Rowan", "Rowena", "Rowland", "Roxane", "Roxanne", "Roy", "Royal", "Royce", "Rozella", "Ruben", "Rubie", "Ruby", "Rubye", "Rudolph", "Rudy", "Rupert", "Russ", "Russel", "Russell", "Rusty", "Ruth", "Ruthe", "Ruthie", "Ryan", "Ryann", "Ryder", "Rylan", "Rylee", "Ryleigh", "Ryley", "Sabina", "Sabrina", "Sabryna", "Sadie", "Sadye", "Sage", "Saige", "Sallie", "Sally", "Salma", "Salvador", "Salvatore", "Sam", "Samanta", "Samantha", "Samara", "Samir", "Sammie", "Sammy", "Samson", "Sandra", "Sandrine", "Sandy", "Sanford", "Santa", "Santiago", "Santina", "Santino", "Santos", "Sarah", "Sarai", "Sarina", "Sasha", "Saul", "Savanah", "Savanna", "Savannah", "Savion", "Scarlett", "Schuyler", "Scot", "Scottie", "Scotty", "Seamus", "Sean", "Sebastian", "Sedrick", "Selena", "Selina", "Selmer", "Serena", "Serenity", "Seth", "Shad", "Shaina", "Shakira", "Shana", "Shane", "Shanel", "Shanelle", "Shania", "Shanie", "Shaniya", "Shanna", "Shannon", "Shanny", "Shanon", "Shany", "Sharon", "Shaun", "Shawn", "Shawna", "Shaylee", "Shayna", "Shayne", "Shea", "Sheila", "Sheldon", "Shemar", "Sheridan", "Sherman", "Sherwood", "Shirley", "Shyann", "Shyanne", "Sibyl", "Sid", "Sidney", "Sienna", "Sierra", "Sigmund", "Sigrid", "Sigurd", "Silas", "Sim", "Simeon", "Simone", "Sincere", "Sister", "Skye", "Skyla", "Skylar", "Sofia", "Soledad", "Solon", "Sonia", "Sonny", "Sonya", "Sophia", "Sophie", "Spencer", "Stacey", "Stacy", "Stan", "Stanford", "Stanley", "Stanton", "Stefan", "Stefanie", "Stella", "Stephan", "Stephania", "Stephanie", "Stephany", "Stephen", "Stephon", "Sterling", "Steve", "Stevie", "Stewart", "Stone", "Stuart", "Summer", "Sunny", "Susan", "Susana", "Susanna", "Susie", "Suzanne", "Sven", "Syble", "Sydnee", "Sydney", "Sydni", "Sydnie", "Sylvan", "Sylvester", "Sylvia", "Tabitha", "Tad", "Talia", "Talon", "Tamara", "Tamia", "Tania", "Tanner", "Tanya", "Tara", "Taryn", "Tate", "Tatum", "Tatyana", "Taurean", "Tavares", "Taya", "Taylor", "Teagan", "Ted", "Telly", "Terence", "Teresa", "Terrance", "Terrell", "Terrence", "Terrill", "Terry", "Tess", "Tessie", "Tevin", "Thad", "Thaddeus", "Thalia", "Thea", "Thelma", "Theo", "Theodora", "Theodore", "Theresa", "Therese", "Theresia", "Theron", "Thomas", "Thora", "Thurman", "Tia", "Tiana", "Tianna", "Tiara", "Tierra", "Tiffany", "Tillman", "Timmothy", "Timmy", "Timothy", "Tina", "Tito", "Titus", "Tobin", "Toby", "Tod", "Tom", "Tomas", "Tomasa", "Tommie", "Toney", "Toni", "Tony", "Torey", "Torrance", "Torrey", "Toy", "Trace", "Tracey", "Tracy", "Travis", "Travon", "Tre", "Tremaine", "Tremayne", "Trent", "Trenton", "Tressa", "Tressie", "Treva", "Trever", "Trevion", "Trevor", "Trey", "Trinity", "Trisha", "Tristian", "Tristin", "Triston", "Troy", "Trudie", "Trycia", "Trystan", "Turner", "Twila", "Tyler", "Tyra", "Tyree", "Tyreek", "Tyrel", "Tyrell", "Tyrese", "Tyrique", "Tyshawn", "Tyson", "Ubaldo", "Ulices", "Ulises", "Una", "Unique", "Urban", "Uriah", "Uriel", "Ursula", "Vada", "Valentin", "Valentina", "Valentine", "Valerie", "Vallie", "Van", "Vance", "Vanessa", "Vaughn", "Veda", "Velda", "Vella", "Velma", "Velva", "Vena", "Verda", "Verdie", "Vergie", "Verla", "Verlie", "Vern", "Verna", "Verner", "Vernice", "Vernie", "Vernon", "Verona", "Veronica", "Vesta", "Vicenta", "Vicente", "Vickie", "Vicky", "Victor", "Victoria", "Vida", "Vidal", "Vilma", "Vince", "Vincent", "Vincenza", "Vincenzo", "Vinnie", "Viola", "Violet", "Violette", "Virgie", "Virgil", "Virginia", "Virginie", "Vita", "Vito", "Viva", "Vivian", "Viviane", "Vivianne", "Vivien", "Vivienne", "Vladimir", "Wade", "Waino", "Waldo", "Walker", "Wallace", "Walter", "Walton", "Wanda", "Ward", "Warren", "Watson", "Wava", "Waylon", "Wayne", "Webster", "Weldon", "Wellington", "Wendell", "Wendy", "Werner", "Westley", "Weston", "Whitney", "Wilber", "Wilbert", "Wilburn", "Wiley", "Wilford", "Wilfred", "Wilfredo", "Wilfrid", "Wilhelm", "Wilhelmine", "Will", "Willa", "Willard", "William", "Willie", "Willis", "Willow", "Willy", "Wilma", "Wilmer", "Wilson", "Wilton", "Winfield", "Winifred", "Winnifred", "Winona", "Winston", "Woodrow", "Wyatt", "Wyman", "Xander", "Xavier", "Xzavier", "Yadira", "Yasmeen", "Yasmin", "Yasmine", "Yazmin", "Yesenia", "Yessenia", "Yolanda", "Yoshiko", "Yvette", "Yvonne", "Zachariah", "Zachary", "Zachery", "Zack", "Zackary", "Zackery", "Zakary", "Zander", "Zane", "Zaria", "Zechariah", "Zelda", "Zella", "Zelma", "Zena", "Zetta", "Zion", "Zita", "Zoe", "Zoey", "Zoie", "Zoila", "Zola", "Zora", "Zula"},
- "middle": {"Abdul", "Abdullah", "Abigail", "Ada", "Adam", "Adelaide", "Adele", "Adelina", "Adrian", "Adriana", "Agnes", "Agnolo", "Ahmed", "Aida", "Aileen", "Aimee", "Akilesh", "Akio", "Alan", "Alana", "Alejandro", "Alex", "Ali", "Alice", "Alicia", "Alina", "Alison", "Alita", "Allegretta", "Alonzo", "Alyssa", "Aman", "Amara", "Amelda", "Amelia", "Amenra", "Amina", "Amir", "Amitabh", "Amy", "Ana", "Anastasia", "André", "Andrea", "Andrei", "Andrew", "Andy", "Angel", "Angela", "Anita", "Ann", "Anna", "Anne", "Annette", "Anthony", "Antioco", "Antonio", "Arduino", "Aria", "Ariana", "Ariel", "Aris", "Arjun", "Armando", "Asha", "Ashton", "Asong", "Athena", "Audrey", "August", "Aura", "Aurelia", "Austen", "Ava", "Avery", "Avril", "Badru", "Bailey", "Bakul", "Baldwin", "Bao", "Barack", "Bear", "Beatrice", "Beau", "Belinda", "Bella", "Belle", "Ben", "Benjamin", "Bertha", "Beverly", "Bharati", "Bhoja", "Bhuma", "Bianca", "Bird", "Birdie", "Bishvajit", "Bjorn", "Blair", "Blake", "Blanca", "Bliss", "Blue", "Bo", "Bobbie", "Bonnie", "Boris", "Bradley", "Brandt", "Braulia", "Breck", "Bree", "Brett", "Brianna", "Bridget", "Brie", "Brielle", "Brittany", "Brizio", "Brook", "Brooke", "Brooks", "Bruce", "Bryce", "Bryn", "Brynn", "Burke", "Cajetan", "Calvin", "Cameron", "Camilla", "Candice", "Carla", "Carlos", "Carmen", "Caroline", "Carson", "Casey", "Cash", "Cassandra", "Cassidy", "Catherine", "Cecelia", "Cecilia", "Cedric", "Celeste", "Celia", "Celso", "Chahna", "Chance", "Chander", "Chandler", "Chang", "Charles", "Charlie", "Charlotte", "Chen", "Chintak", "Chloe", "Chris", "Christine", "Chung", "Cimeron", "Cindy", "Ciprianna", "Ciro", "Claire", "Clara", "Clarissa", "Clark", "Clarke", "Claude", "Claudia", "Clay", "Clementine", "Clint", "Cody", "Cole", "Colette", "Cora", "Cordelia", "Corey", "Corinne", "Cory", "Cosme", "Courtney", "Cree", "Crew", "Cynthia", "Cyprienne", "Cyrus", "Daan", "Dada", "Daisy", "Dakota", "Dale", "Damodar", "Dan", "Dana", "Dane", "Daniel", "Danielle", "Danveer", "Daphne", "Darla", "David", "Davide", "Dawn", "Dax", "Dean", "Deborah", "Delilah", "Denise", "Denver", "Deshal", "Deshawn", "Dev", "Devin", "Dhavala", "Diana", "Diane", "Diego", "Dmitri", "Dolores", "Dolorita", "Donato", "Dong", "Donna", "Donte", "Donya", "Dora", "Doris", "Dorothy", "Drake", "Drew", "Dru", "Dylan", "Ean", "Edith", "Eduardo", "Edward", "Eila", "Eileen", "Elaine", "Elda", "Eleanor", "Elena", "Eliana", "Elias", "Elise", "Eliza", "Elizabeth", "Ella", "Elle", "Ellen", "Ellie", "Ellis", "Eloise", "Elsa", "Elsie", "Em", "Emerson", "Emery", "Emilie", "Emilio", "Emily", "Emma", "Emmett", "Enrico", "Enrique", "Epifania", "Erica", "Erik", "Erin", "Eroica", "Esperanza", "Estelle", "Esther", "Etta", "Ettore", "Eva", "Evan", "Eve", "Evelyn", "Everett", "Faith", "Farid", "Faye", "Federico", "Felicity", "Felipe", "Felix", "Fern", "Fernando", "Finley", "Finn", "Fiona", "Fitz", "Flint", "Flora", "Florence", "Flynn", "Folke", "Fonzo", "Fox", "Frances", "Francis", "Francisco", "Francois", "François", "Frank", "Frankie", "Freya", "Fumio", "Fynn", "Gabriel", "Gabriella", "Gael", "Gage", "Gail", "Gemma", "Genevieve", "George", "Georgia", "Geraldine", "Giannino", "Ginetta", "Gioia", "Giselle", "Giuseppe", "Giustino", "Glenn", "Gloria", "Glory", "Grace", "Grant", "Gray", "Greer", "Greta", "Guido", "Guillermo", "Gulshan", "Gus", "Gwen", "Gyula", "Hank", "Hannah", "Hans", "Harley", "Harper", "Harriet", "Harrison", "Harshad", "Haruki", "Hayden", "Hayes", "Haze", "Hazel", "Heath", "Heather", "Hector", "Helen", "Helena", "Henry", "Hideki", "Hidetoshi", "Himesh", "Hiro", "Hiroaki", "Hirofumi", "Hirokazu", "Hiroshi", "Hiroto", "Hiroyuki", "Holly", "Honor", "Hope", "Hugh", "Hugo", "Hunter", "Ida", "Ignacio", "Imogen", "Ingrid", "Irene", "Iris", "Isaac", "Isabel", "Isabella", "Isabelle", "Ivan", "Ivy", "Jace", "Jack", "Jacqueline", "Jade", "Jaden", "Jae", "Jai", "Jaime", "Jamal", "James", "Jamie", "Jan", "Janak", "Jane", "Janet", "Janice", "Jasmine", "Jasper", "Javier", "Jax", "Jay", "Jayden", "Jayne", "Jean", "Jeanne", "Jed", "Jenna", "Jennifer", "Jesse", "Jessica", "Jill", "Jin", "Joan", "Joanna", "João", "Jocelyn", "Jodi", "Jody", "Joe", "Joey", "Johanna", "Johar", "John", "Jolene", "Jordan", "Jorge", "Jose", "José", "Joseph", "Josephine", "Josie", "Joy", "Joyce", "Juan", "Juanita", "Judd", "Jude", "Judith", "Jules", "Julia", "Julian", "Juliana", "Julianne", "Julie", "June", "Justine", "Kael", "Kai", "Kane", "Karen", "Kate", "Katherine", "Kathleen", "Kathryn", "Katie", "Katrina", "Kay", "Kayla", "Kazuki", "Keira", "Kelly", "Kelsey", "Kendall", "Kendra", "Kennedy", "Kent", "Kenta", "Kerry", "Khaled", "Khloe", "Kiara", "Kim", "Kimberly", "Kit", "Kiyoshi", "Klaus", "Knight", "Knox", "Koen", "Koi", "Koichi", "Koji", "Kolt", "Kristen", "Kristina", "Kurt", "Kwame", "Kye", "Kylie", "Lacey", "Laine", "Lake", "Lakshman", "Lalika", "Lane", "Lark", "Lars", "Laurel", "Layne", "Lee", "Leif", "Lennon", "Leo", "Leon", "Leslie", "Liam", "Liberty", "Lilian", "Lillian", "Lillie", "Link", "Liz", "Locke", "Logan", "Lona", "Lorena", "Lorenzo", "Lou", "Louise", "Love", "Lucia", "Lucy", "Luis", "Luiz", "Luke", "Lupita", "Lux", "Luz", "Lydia", "Lynn", "Mabel", "Mac", "Mack", "Mackenzie", "Madeline", "Madison", "Madona", "Mae", "Mael", "Makoto", "Manuel", "Manuela", "Maple", "Marc", "Marco", "Margaret", "Margo", "Margot", "Maria", "Mariano", "Maricela", "Marilyn", "Mario", "Mark", "Marley", "Mars", "Marti", "Mary", "Mason", "Matthew", "Mavis", "Max", "May", "Mazie", "Mei", "Melody", "Mercy", "Merle", "Micah", "Michael", "Miguel", "Mina", "Ming", "Mohamed", "Mollie", "Monroe", "Morgan", "Muhammad", "Musetta", "Myra", "Nadine", "Naomi", "Nardo", "Nat", "Natalie", "Neal", "Neil", "Nellie", "Nerola", "Nevada", "Neve", "Nikolai", "Niles", "Noel", "Nola", "Nora", "Nuru", "Oakley", "Olive", "Oliver", "Opal", "Orazio", "Ortensa", "Ortensia", "Osamu", "Oscar", "Otto", "Pablo", "Paige", "Pancho", "Paris", "Parker", "Pat", "Patrick", "Paul", "Pauli", "Pax", "Peace", "Pearl", "Pedro", "Penelope", "Penn", "Penny", "Peter", "Petra", "Peyton", "Phoenix", "Pierce", "Pierre", "Pilar", "Porter", "Praise", "Pratap", "Presley", "Priscilla", "Quinn", "Rachanna", "Radames", "Rae", "Rafael", "Rain", "Raine", "Ramiro", "Ramon", "Ramona", "Raphael", "Raul", "Ravi", "Ray", "Rayne", "Reagan", "Reece", "Reed", "Reese", "Rei", "Reid", "Reilly", "Remy", "Ren", "Reyes", "Rhodes", "Ricardo", "Richard", "Riley", "Rita", "River", "Rivera", "Roan", "Robert", "Roberto", "Robin", "Robt", "Rodrigo", "Roma", "Romelia", "Rory", "Rosa", "Rosalee", "Rosalie", "Rosalynn", "Rosario", "Rose", "Ross", "Rowan", "Ruben", "Ruby", "Rue", "Rush", "Russell", "Ruth", "Ryan", "Saad", "Saariq", "Sade", "Sadie", "Sagara", "Sage", "Saige", "Saint", "Salvadora", "Sam", "Samir", "Samuel", "Sante", "Santiago", "Sara", "Sasha", "Satoshi", "Scott", "Sean", "Sebastian", "Sergei", "Sergio", "Seth", "Shae", "Shai", "Shane", "Shannon", "Shashi", "Shaun", "Shawn", "Shawnee", "Shay", "Shea", "Shelby", "Shin", "Sidney", "Simon", "Sky", "Skye", "Skyler", "Sol", "Sophie", "Spencer", "Star", "Starr", "Stella", "Steve", "Stevie", "Storm", "Susan", "Sven", "Sybil", "Sydney", "Tahj", "Takashi", "Takeshi", "Taryn", "Tatum", "Taylor", "Teagan", "Terry", "Tess", "Thea", "Theodore", "Thomas", "Tilly", "Timothy", "Tosca", "Trent", "Tripp", "Tristan", "Truth", "Tyler", "Tyrone", "Uberto", "Ursus", "Val", "Vandelia", "Vaughn", "Vera", "Vernon", "Verona", "Vianna", "Victoria", "Vida", "Vieda", "Vince", "Vincent", "Violet", "Virginia", "Vivian", "Vladimir", "Wade", "Wayne", "Wes", "Wesley", "West", "Whitney", "Will", "Willa", "William", "Willie", "Winston", "Winter", "Wolf", "Wren", "Wynn", "Xavier", "Yasuo", "Yoel", "Yolanda", "Yoshi", "Yoshiaki", "Yoshihiro", "Yoshiki", "Yoshinori", "Yoshio", "Yusuf", "Yutaka", "Zain", "Zane", "Zayd", "Zelda", "Zeus", "Zev", "Zhang", "Zhen", "Zola", "Zora", "Zuni"},
- "last": {"Abbott", "Abernathy", "Abshire", "Adams", "Altenwerth", "Anderson", "Ankunding", "Armstrong", "Auer", "Aufderhar", "Bahringer", "Bailey", "Balistreri", "Barrows", "Bartell", "Bartoletti", "Barton", "Bashirian", "Batz", "Bauch", "Baumbach", "Bayer", "Beahan", "Beatty", "Bechtelar", "Becker", "Bednar", "Beer", "Beier", "Berge", "Bergnaum", "Bergstrom", "Bernhard", "Bernier", "Bins", "Blanda", "Blick", "Block", "Bode", "Boehm", "Bogan", "Bogisich", "Borer", "Bosco", "Botsford", "Boyer", "Boyle", "Bradtke", "Brakus", "Braun", "Breitenberg", "Brekke", "Brown", "Bruen", "Buckridge", "Carroll", "Carter", "Cartwright", "Casper", "Cassin", "Champlin", "Christiansen", "Cole", "Collier", "Collins", "Conn", "Connelly", "Conroy", "Considine", "Corkery", "Cormier", "Corwin", "Cremin", "Crist", "Crona", "Cronin", "Crooks", "Cruickshank", "Cummerata", "Cummings", "Dach", "Damore", "Daniel", "Dare", "Daugherty", "Davis", "Deckow", "Denesik", "Dibbert", "Dickens", "Dicki", "Dickinson", "Dietrich", "Donnelly", "Dooley", "Douglas", "Doyle", "DuBuque", "Durgan", "Ebert", "Effertz", "Eichmann", "Emard", "Emmerich", "Erdman", "Ernser", "Fadel", "Fahey", "Farrell", "Fay", "Feeney", "Feest", "Feil", "Ferry", "Fisher", "Flatley", "Frami", "Franecki", "Friesen", "Fritsch", "Funk", "Gaylord", "Gerhold", "Gerlach", "Gibson", "Gislason", "Gleason", "Gleichner", "Glover", "Goldner", "Goodwin", "Gorczany", "Gottlieb", "Goyette", "Grady", "Graham", "Grant", "Green", "Greenfelder", "Greenholt", "Grimes", "Gulgowski", "Gusikowski", "Gutkowski", "Gutmann", "Haag", "Hackett", "Hagenes", "Hahn", "Haley", "Halvorson", "Hamill", "Hammes", "Hand", "Hane", "Hansen", "Harber", "Harris", "Hartmann", "Harvey", "Hauck", "Hayes", "Heaney", "Heathcote", "Hegmann", "Heidenreich", "Heller", "Herman", "Hermann", "Hermiston", "Herzog", "Hessel", "Hettinger", "Hickle", "Hilll", "Hills", "Hilpert", "Hintz", "Hirthe", "Hodkiewicz", "Hoeger", "Homenick", "Hoppe", "Howe", "Howell", "Hudson", "Huel", "Huels", "Hyatt", "Jacobi", "Jacobs", "Jacobson", "Jakubowski", "Jaskolski", "Jast", "Jenkins", "Jerde", "Jewess", "Johns", "Johnson", "Johnston", "Jones", "Kassulke", "Kautzer", "Keebler", "Keeling", "Kemmer", "Kerluke", "Kertzmann", "Kessler", "Kiehn", "Kihn", "Kilback", "King", "Kirlin", "Klein", "Kling", "Klocko", "Koch", "Koelpin", "Koepp", "Kohler", "Konopelski", "Koss", "Kovacek", "Kozey", "Krajcik", "Kreiger", "Kris", "Kshlerin", "Kub", "Kuhic", "Kuhlman", "Kuhn", "Kulas", "Kunde", "Kunze", "Kuphal", "Kutch", "Kuvalis", "Labadie", "Lakin", "Lang", "Langosh", "Langworth", "Larkin", "Larson", "Leannon", "Lebsack", "Ledner", "Leffler", "Legros", "Lehner", "Lemke", "Lesch", "Leuschke", "Lind", "Lindgren", "Littel", "Little", "Lockman", "Lowe", "Lubowitz", "Lueilwitz", "Luettgen", "Lynch", "Macejkovic", "Maggio", "Mann", "Mante", "Marks", "Marquardt", "Marvin", "Mayer", "Mayert", "McClure", "McCullough", "McDermott", "McGlynn", "McKenzie", "McLaughlin", "Medhurst", "Mertz", "Metz", "Miller", "Mills", "Mitchell", "Moen", "Mohr", "Monahan", "Moore", "Morar", "Morissette", "Mosciski", "Mraz", "Mueller", "Muller", "Murazik", "Murphy", "Murray", "Nader", "Nicolas", "Nienow", "Nikolaus", "Nitzsche", "Nolan", "Oberbrunner", "Okuneva", "Olson", "Ondricka", "OReilly", "Orn", "Ortiz", "Osinski", "Pacocha", "Padberg", "Pagac", "Parisian", "Parker", "Paucek", "Pfannerstill", "Pfeffer", "Pollich", "Pouros", "Powlowski", "Predovic", "Price", "Prohaska", "Prosacco", "Purdy", "Quigley", "Quitzon", "Rath", "Ratke", "Rau", "Raynor", "Reichel", "Reichert", "Reilly", "Reinger", "Rempel", "Renner", "Reynolds", "Rice", "Rippin", "Ritchie", "Robel", "Roberts", "Rodriguez", "Rogahn", "Rohan", "Rolfson", "Romaguera", "Roob", "Rosenbaum", "Rowe", "Ruecker", "Runolfsdottir", "Runolfsson", "Runte", "Russel", "Rutherford", "Ryan", "Sanford", "Satterfield", "Sauer", "Sawayn", "Schaden", "Schaefer", "Schamberger", "Schiller", "Schimmel", "Schinner", "Schmeler", "Schmidt", "Schmitt", "Schneider", "Schoen", "Schowalter", "Schroeder", "Schulist", "Schultz", "Schumm", "Schuppe", "Schuster", "Senger", "Shanahan", "Shields", "Simonis", "Sipes", "Skiles", "Smith", "Smitham", "Spencer", "Spinka", "Sporer", "Stamm", "Stanton", "Stark", "Stehr", "Steuber", "Stiedemann", "Stokes", "Stoltenberg", "Stracke", "Streich", "Stroman", "Strosin", "Swaniawski", "Swift", "Terry", "Thiel", "Thompson", "Tillman", "Torp", "Torphy", "Towne", "Toy", "Trantow", "Tremblay", "Treutel", "Tromp", "Turcotte", "Turner", "Ullrich", "Upton", "Vandervort", "Veum", "Volkman", "Von", "VonRueden", "Waelchi", "Walker", "Walsh", "Walter", "Ward", "Waters", "Watsica", "Weber", "Wehner", "Weimann", "Weissnat", "Welch", "West", "White", "Wiegand", "Wilderman", "Wilkinson", "Will", "Williamson", "Willms", "Windler", "Wintheiser", "Wisoky", "Wisozk", "Witting", "Wiza", "Wolf", "Wolff", "Wuckert", "Wunsch", "Wyman", "Yost", "Yundt", "Zboncak", "Zemlak", "Ziemann", "Zieme", "Zulauf"},
- "hobby": {"3D printing", "Acrobatics", "Acting", "Amateur radio", "Animation", "Aquascaping", "Astrology", "Astronomy", "Baking", "Baton twirling", "Blogging", "Building", "Board/tabletop games", "Book discussion clubs", "Book restoration", "Bowling", "Brazilian jiu-jitsu", "Breadmaking", "Bullet journaling", "Cabaret", "Calligraphy", "Candle making", "Candy making", "Car fixing & building", "Card games", "Cheesemaking", "Cleaning", "Clothesmaking", "Coffee roasting", "Collecting", "Coloring", "Computer programming", "Confectionery", "Cooking", "Cosplaying", "Couponing", "Craft", "Creative writing", "Crocheting", "Cross-stitch", "Crossword puzzles", "Cryptography", "Cue sports", "Dance", "Digital arts", "Distro Hopping", "DJing", "Do it yourself", "Drama", "Drawing", "Drink mixing", "Drinking", "Electronic games", "Electronics", "Embroidery", "Experimenting", "Fantasy sports", "Fashion", "Fashion design", "Fishkeeping", "Filmmaking", "Flower arranging", "Fly tying", "Foreign language learning", "Furniture building", "Gaming", "Genealogy", "Gingerbread house making", "Glassblowing", "Graphic design", "Gunsmithing", "Gymnastics", "Hacking", "Herp keeping", "Home improvement", "Homebrewing", "Houseplant care", "Hula hooping", "Humor", "Hydroponics", "Ice skating", "Jewelry making", "Jigsaw puzzles", "Journaling", "Juggling", "Karaoke", "Karate", "Kendama", "Knife making", "Knitting", "Knot tying", "Kombucha brewing", "Lace making", "Lapidary", "Leather crafting", "Lego building", "Lock picking", "Listening to music", "Listening to podcasts", "Machining", "Macrame", "Magic", "Makeup", "Mazes (indoor/outdoor)", "Metalworking", "Model building", "Model engineering", "Nail art", "Needlepoint", "Origami", "Painting", "Palmistry", "Pet adoption & fostering", "Philately", "Photography", "Practical jokes", "Pressed flower craft", "Playing musical instruments", "Poi", "Pottery", "Powerlifting", "Puzzles", "Quilling", "Quilting", "Quizzes", "Radio-controlled model", "Rail transport modeling", "Rapping", "Reading", "Refinishing", "Reiki", "Robot combat", "Rubik's Cube", "Scrapbooking", "Sculpting", "Sewing", "Shoemaking", "Singing", "Sketching", "Skipping rope", "Slot car", "Soapmaking", "Social media", "Spreadsheets", "Stand-up comedy", "Stamp collecting", "Table tennis", "Tarot", "Taxidermy", "Thrifting", "Video editing", "Video game developing", "Video gaming", "Watching movies", "Watching television", "Videography", "Virtual reality", "Waxing", "Weaving", "Weight training", "Welding", "Whittling", "Wikipedia editing", "Winemaking", "Wood carving", "Woodworking", "Worldbuilding", "Writing", "Word searches", "Yo-yoing", "Yoga", "Zumba", "Amusement park visiting", "Air sports", "Airsoft", "Amateur geology", "Archery", "Astronomy", "Backpacking", "Badminton", "BASE jumping", "Baseball", "Basketball", "Beekeeping", "Birdwatching", "Blacksmithing", "BMX", "Board sports", "Bodybuilding", "Bonsai", "Butterfly watching", "Bus riding", "Camping", "Canoeing", "Canyoning", "Car riding", "Caving", "Composting", "Cycling", "Dowsing", "Driving", "Farming", "Fishing", "Flag football", "Flower growing", "Flying", "Flying disc", "Foraging", "Fossicking", "Freestyle football", "Gardening", "Geocaching", "Ghost hunting", "Gold prospecting", "Graffiti", "Handball", "Herbalism", "Herping", "High-power rocketry", "Hiking", "Hobby horsing", "Hobby tunneling", "Hooping", "Horseback riding", "Hunting", "Inline skating", "Jogging", "Jumping rope", "Kayaking", "Kite flying", "Kitesurfing", "Lacrosse", "LARPing", "Letterboxing", "Longboarding", "Martial arts", "Metal detecting", "Meteorology", "Motor sports", "Mountain biking", "Mountaineering", "Museum visiting", "Mushroom hunting", "Netball", "Nordic skating", "Orienteering", "Paintball", "Parkour", "Photography", "Podcast hosting", "Polo", "Public transport riding", "Rafting", "Railway journeys", "Rappelling", "Road biking", "Rock climbing", "Roller skating", "Rugby", "Running", "Radio-controlled model", "Sailing", "Sand art", "Scouting", "Scuba diving", "Sculling", "Shooting", "Shopping", "Shuffleboard", "Skateboarding", "Skiing", "Skimboarding", "Skydiving", "Slacklining", "Snowboarding", "Snowmobiling", "Snowshoeing", "Soccer", "Stone skipping", "Sun bathing", "Surfing", "Survivalism", "Swimming", "Taekwondo", "Tai chi", "Tennis", "Topiary", "Tourism", "Thru-hiking", "Trade fair visiting", "Travel", "Urban exploration", "Vacation", "Vegetable farming", "Videography", "Vehicle restoration", "Walking", "Water sports", "Astronomy", "Biology", "Chemistry", "Electrochemistry", "Physics", "Psychology", "Sports science", "Geography", "History", "Mathematics", "Railway studies", "Action figure", "Antiquing", "Ant-keeping", "Art collecting", "Book collecting", "Button collecting", "Cartophily", "Coin collecting", "Comic book collecting", "Deltiology", "Die-cast toy", "Digital hoarding", "Dolls", "Element collecting", "Ephemera collecting", "Fusilately", "Knife collecting", "Lotology", "Movie and movie memorabilia collecting", "Fingerprint collecting", "Perfume", "Phillumeny", "Radio-controlled model", "Rail transport modelling", "Record collecting", "Rock tumbling", "Scutelliphily", "Shoes", "Slot car", "Sports memorabilia", "Stamp collecting", "Stuffed toy collecting", "Tea bag collecting", "Ticket collecting", "Toys", "Transit map collecting", "Video game collecting", "Vintage cars", "Vintage clothing", "Vinyl Records", "Antiquities", "Auto audiophilia", "Flower collecting and pressing", "Fossil hunting", "Insect collecting", "Magnet fishing", "Metal detecting", "Mineral collecting", "Rock balancing", "Sea glass collecting", "Seashell collecting", "Stone collecting", "Animal fancy", "Axe throwing", "Backgammon", "Badminton", "Baton twirling", "Beauty pageants", "Billiards", "Bowling", "Boxing", "Bridge", "Checkers (draughts)", "Cheerleading", "Chess", "Color guard", "Cribbage", "Curling", "Dancing", "Darts", "Debate", "Dominoes", "Eating", "Esports", "Fencing", "Go", "Gymnastics", "Ice hockey", "Ice skating", "Judo", "Jujitsu", "Kabaddi", "Knowledge/word games", "Laser tag", "Longboarding", "Mahjong", "Marbles", "Martial arts", "Model United Nations", "Poker", "Pool", "Role-playing games", "Shogi", "Slot car racing", "Speedcubing", "Sport stacking", "Table football", "Table tennis", "Volleyball", "Weightlifting", "Wrestling", "Airsoft", "Archery", "Association football", "Australian rules football", "Auto racing", "Baseball", "Beach volleyball", "Breakdancing", "Climbing", "Cricket", "Croquet", "Cycling", "Disc golf", "Dog sport", "Equestrianism", "Exhibition drill", "Field hockey", "Figure skating", "Fishing", "Footbag", "Frisbee", "Golfing", "Handball", "Horseback riding", "Horseshoes", "Iceboat racing", "Jukskei", "Kart racing", "Knife throwing", "Lacrosse", "Longboarding", "Long-distance running", "Marching band", "Model aircraft", "Orienteering", "Pickleball", "Quidditch", "Race walking", "Racquetball", "Radio-controlled car racing", "Roller derby", "Rugby league football", "Sculling", "Shooting sport", "Skateboarding", "Skiing", "Sled dog racing", "Softball", "Speed skating", "Squash", "Surfing", "Swimming", "Table tennis", "Tennis", "Tennis polo", "Tether car", "Tour skating", "Tourism", "Trapshooting", "Triathlon", "Ultimate frisbee", "Volleyball", "Water polo", "Fishkeeping", "Learning", "Meditation", "Microscopy", "Reading", "Research", "Shortwave listening", "Audiophile", "Aircraft spotting", "Amateur astronomy", "Birdwatching", "Bus spotting", "Geocaching", "Gongoozling", "Herping", "Hiking", "Meteorology", "Photography", "Satellite watching", "Trainspotting", "Whale watching"},
- "phone": {"###-###-####", "(###)###-####", "1-###-###-####", "###.###.####"},
+ "prefix": {
+ "Mr.", "Mrs.", "Ms.", "Miss", "Dr.",
+ },
+ "suffix": {
+ "Jr.", "Sr.", "I", "II", "III",
+ "IV", "V", "MD", "DDS", "PhD",
+ "DVM",
+ },
+ "first": {
+ "Aaliyah", "Aaron", "Abbey", "Abbie", "Abby",
+ "Abdul", "Abdullah", "Abe", "Abel", "Abigail",
+ "Abigale", "Abigayle", "Abner", "Abraham", "Ada",
+ "Adah", "Adalberto", "Adaline", "Adam", "Adan",
+ "Addie", "Addison", "Adela", "Adelbert", "Adele",
+ "Adelia", "Adeline", "Adell", "Adella", "Adelle",
+ "Aditya", "Adonis", "Adrain", "Adrian", "Adriana",
+ "Adriel", "Afton", "Agnes", "Agustin", "Agustina",
+ "Ahmad", "Ahmed", "Aida", "Aidan", "Aiden",
+ "Aileen", "Aimee", "Aisha", "Aiyana", "Al",
+ "Alaina", "Alan", "Alana", "Alanis", "Alanna",
+ "Alayna", "Alba", "Albert", "Alberta", "Albertha",
+ "Alberto", "Albin", "Albina", "Alda", "Alden",
+ "Alec", "Aleen", "Alejandra", "Alek", "Alena",
+ "Alene", "Alessandra", "Alessandro", "Alessia", "Aletha",
+ "Alex", "Alexa", "Alexander", "Alexandra", "Alexie",
+ "Alexis", "Alf", "Alfonso", "Alfonzo", "Alford",
+ "Alfred", "Ali", "Alia", "Alice", "Alicia",
+ "Alisa", "Alisha", "Alison", "Alivia", "Aliya",
+ "Aliyah", "Aliza", "Alize", "Allen", "Allene",
+ "Allie", "Allison", "Ally", "Alphonso", "Alta",
+ "Althea", "Alva", "Alvah", "Alvena", "Alvera",
+ "Alverta", "Alvina", "Alvis", "Alyce", "Alycia",
+ "Alysa", "Alysha", "Alyson", "Alysson", "Amalia",
+ "Amanda", "Amaya", "Amber", "Amelia", "America",
+ "Americo", "Amie", "Amina", "Amir", "Amira",
+ "Amiya", "Amos", "Amparo", "Amy", "Ana",
+ "Anahi", "Anais", "Anastasia", "Anderson", "Andre",
+ "Andrew", "Andy", "Angel", "Angela", "Angelica",
+ "Angelina", "Angeline", "Angelo", "Angie", "Angus",
+ "Anibal", "Anika", "Anissa", "Anita", "Aniya",
+ "Aniyah", "Anjali", "Anna", "Annabel", "Annalise",
+ "Anne", "Annie", "Ansel", "Ansley", "Anthony",
+ "Antonio", "Anya", "April", "Ara", "Araceli",
+ "Aracely", "Archibald", "Ardella", "Arden", "Ardith",
+ "Arely", "Ari", "Ariane", "Arianna", "Aric",
+ "Ariel", "Arielle", "Arjun", "Arlene", "Arlie",
+ "Arlo", "Armand", "Armando", "Arnaldo", "Arne",
+ "Arno", "Arnold", "Arnoldo", "Arnulfo", "Aron",
+ "Art", "Arthur", "Arvel", "Arvid", "Arvilla",
+ "Aryanna", "Asa", "Asha", "Ashlee", "Ashleigh",
+ "Ashley", "Ashly", "Ashlynn", "Ashton", "Ashtyn",
+ "Asia", "Astrid", "Athena", "Aubree", "Aubrey",
+ "Audie", "Audra", "Audrey", "August", "Augusta",
+ "Augustine", "Augustus", "Aurelia", "Austen", "Austin",
+ "Autumn", "Ava", "Avery", "Avis", "Axel",
+ "Ayana", "Ayden", "Ayla", "Bailey", "Barbara",
+ "Barney", "Baron", "Barrett", "Barry", "Bart",
+ "Barton", "Baylee", "Beatrice", "Beau", "Bell",
+ "Bella", "Belle", "Ben", "Benedict", "Benjamin",
+ "Bennett", "Benton", "Bernadette", "Bernadine", "Bernard",
+ "Bernardo", "Bernice", "Bernie", "Berry", "Bert",
+ "Berta", "Bertha", "Beryl", "Bessie", "Beth",
+ "Bethany", "Betty", "Beulah", "Beverly", "Bianka",
+ "Bill", "Billie", "Billy", "Birdie", "Blair",
+ "Blaise", "Blake", "Blanca", "Blanche", "Blaze",
+ "Bo", "Bobbie", "Bobby", "Bonita", "Bonnie",
+ "Boris", "Boyd", "Brad", "Braden", "Bradley",
+ "Brady", "Braeden", "Brandi", "Brando", "Brandon",
+ "Brandt", "Brandy", "Brant", "Braxton", "Breana",
+ "Breanna", "Breanne", "Brenda", "Brendan", "Brenden",
+ "Brendon", "Brenna", "Brennan", "Brennon", "Brent",
+ "Bret", "Brett", "Bria", "Brian", "Brice",
+ "Bridget", "Brittany", "Brock", "Broderick", "Brody",
+ "Brook", "Brooke", "Brooklyn", "Brooks", "Bruce",
+ "Bryana", "Bryce", "Brycen", "Bryon", "Buck",
+ "Bud", "Buddy", "Buford", "Bulah", "Burley",
+ "Buster", "Cade", "Caden", "Caesar", "Caitlyn",
+ "Cale", "Caleb", "Caleigh", "Cali", "Calista",
+ "Callie", "Camden", "Cameron", "Camila", "Camilla",
+ "Camille", "Camren", "Camron", "Camryn", "Candace",
+ "Candice", "Candida", "Cara", "Carey", "Carissa",
+ "Carlee", "Carleton", "Carley", "Carli", "Carlie",
+ "Carlo", "Carlos", "Carlotta", "Carmel", "Carmela",
+ "Carmella", "Carmelo", "Carmen", "Carmine", "Carol",
+ "Carole", "Carolina", "Caroline", "Carolyn", "Carrie",
+ "Carroll", "Carson", "Carter", "Cary", "Casandra",
+ "Casey", "Casper", "Cassandra", "Cassandre", "Cassidy",
+ "Cassie", "Catalina", "Caterina", "Catherine", "Cathy",
+ "Cayla", "Cecelia", "Cecil", "Cecile", "Cecilia",
+ "Cedrick", "Celestine", "Celia", "Celine", "Cesar",
+ "Chad", "Chadd", "Chadrick", "Chaim", "Chance",
+ "Chandler", "Chanel", "Chanelle", "Charity", "Charlene",
+ "Charles", "Charley", "Charlie", "Charlotte", "Chase",
+ "Chasity", "Chauncey", "Chaya", "Chaz", "Chelsea",
+ "Chelsey", "Chelsie", "Chester", "Chet", "Cheyanne",
+ "Cheyenne", "Chloe", "Chris", "Christa", "Christian",
+ "Christiana", "Christina", "Christine", "Christophe", "Christopher",
+ "Christy", "Chyna", "Ciara", "Cicero", "Cielo",
+ "Cierra", "Cindy", "Clair", "Claire", "Clara",
+ "Clare", "Clarissa", "Clark", "Claud", "Claude",
+ "Claudia", "Claudie", "Claudine", "Clay", "Clemens",
+ "Clement", "Clementina", "Clementine", "Cleo", "Cleora",
+ "Cleta", "Cleve", "Cleveland", "Clifford", "Clifton",
+ "Clint", "Clinton", "Clovis", "Clyde", "Coby",
+ "Cody", "Colby", "Cole", "Coleman", "Colin",
+ "Colleen", "Collin", "Colt", "Colten", "Colton",
+ "Columbus", "Concepcion", "Conner", "Connie", "Connor",
+ "Conor", "Conrad", "Constance", "Constantin", "Consuelo",
+ "Cooper", "Cora", "Coralie", "Corbin", "Cordelia",
+ "Cordell", "Cordia", "Cordie", "Corene", "Corine",
+ "Cornelius", "Cornell", "Corrine", "Cortez", "Cortney",
+ "Cory", "Coty", "Courtney", "Coy", "Craig",
+ "Crawford", "Cristian", "Cristina", "Cruz", "Crystal",
+ "Crystel", "Cullen", "Curt", "Curtis", "Cydney",
+ "Cynthia", "Cyril", "Cyrus", "Dahlia", "Daija",
+ "Daisha", "Daisy", "Dakota", "Dale", "Dallas",
+ "Dallin", "Dalton", "Damaris", "Dameon", "Damian",
+ "Damien", "Damion", "Damon", "Dan", "Dana",
+ "Dandre", "Dane", "Danny", "Dante", "Danyka",
+ "Daphne", "Darby", "Daren", "Darian", "Dariana",
+ "Darien", "Dario", "Darion", "Darius", "Darlene",
+ "Daron", "Darrel", "Darrell", "Darren", "Darrick",
+ "Darrin", "Darrion", "Darron", "Darryl", "Darwin",
+ "Daryl", "Dave", "David", "Davin", "Dawn",
+ "Dawson", "Dax", "Dayana", "Dayna", "Dayne",
+ "Dayton", "Dean", "Deangelo", "Deanna", "Deborah",
+ "Declan", "Dee", "Deja", "Delaney", "Delfina",
+ "Delia", "Delilah", "Dell", "Della", "Delores",
+ "Dena", "Denis", "Dennis", "Deon", "Dereck",
+ "Derek", "Derick", "Deron", "Derrick", "Desiree",
+ "Desmond", "Dessie", "Destiny", "Devin", "Devon",
+ "Dewayne", "Dexter", "Diamond", "Diana", "Dianna",
+ "Diego", "Dillon", "Dimitri", "Dina", "Dino",
+ "Dion", "Dixie", "Dock", "Dolly", "Dolores",
+ "Domingo", "Dominic", "Dominique", "Don", "Donald",
+ "Donna", "Dora", "Dorian", "Doris", "Dorothea",
+ "Dorothy", "Dorris", "Doug", "Douglas", "Dovie",
+ "Doyle", "Drake", "Drew", "Duane", "Dudley",
+ "Dulce", "Duncan", "Dustin", "Dusty", "Dwight",
+ "Dylan", "Earl", "Earlene", "Earline", "Earnest",
+ "Earnestine", "Easter", "Easton", "Ebony", "Ed",
+ "Eda", "Edd", "Eddie", "Eden", "Edgar",
+ "Edgardo", "Edison", "Edmond", "Edmund", "Edna",
+ "Eduardo", "Edward", "Edwin", "Edwina", "Effie",
+ "Eileen", "Elaina", "Elbert", "Eleanora", "Eleanore",
+ "Elena", "Eli", "Elias", "Elijah", "Elisa",
+ "Elisabeth", "Elise", "Elizabeth", "Ella", "Ellen",
+ "Ellie", "Elliot", "Elliott", "Ellis", "Elmer",
+ "Elmore", "Eloise", "Elsa", "Elsie", "Elton",
+ "Elvis", "Elyse", "Elyssa", "Emanuel", "Emerson",
+ "Emery", "Emil", "Emile", "Emilia", "Emilie",
+ "Emilio", "Emily", "Emma", "Emmanuel", "Emmanuelle",
+ "Emmet", "Emmett", "Emmie", "Emmy", "Emory",
+ "Ena", "Enid", "Enoch", "Enos", "Enrico",
+ "Enrique", "Eric", "Erica", "Ericka", "Erik",
+ "Erika", "Erin", "Erna", "Ernest", "Ernie",
+ "Ervin", "Esmeralda", "Esperanza", "Esteban", "Estefania",
+ "Estella", "Estelle", "Esther", "Estrella", "Ethan",
+ "Ethel", "Eugene", "Eunice", "Eva", "Evan",
+ "Evangeline", "Eve", "Evelyn", "Everett", "Ezekiel",
+ "Ezequiel", "Ezra", "Fabian", "Fae", "Fannie",
+ "Fanny", "Fatima", "Fay", "Faye", "Federico",
+ "Felicia", "Felicity", "Felipe", "Felix", "Fernando",
+ "Fidel", "Finn", "Fiona", "Fletcher", "Flo",
+ "Florence", "Floyd", "Ford", "Forest", "Forrest",
+ "Frances", "Francesca", "Francesco", "Francis", "Francisco",
+ "Franco", "Frank", "Frankie", "Franz", "Fred",
+ "Freda", "Freddie", "Freddy", "Frederic", "Frederick",
+ "Fredrick", "Freeman", "Gabe", "Gabriel", "Gabriella",
+ "Gabrielle", "Gage", "Gail", "Garfield", "Garland",
+ "Garret", "Garrett", "Garrick", "Garrison", "Garry",
+ "Garth", "Gaston", "Gavin", "Gay", "Gayle",
+ "Gaylord", "Gene", "Genesis", "Genevieve", "Gennaro",
+ "Geoffrey", "George", "Gerald", "Gerard", "Gerardo",
+ "Gerry", "Gia", "Gideon", "Gilbert", "Gilberto",
+ "Giles", "Gillian", "Gina", "Gino", "Giovani",
+ "Giovanna", "Giovanni", "Giovanny", "Gladys", "Glen",
+ "Glenda", "Gloria", "Gordon", "Grace", "Gracie",
+ "Graciela", "Grady", "Graham", "Grant", "Grayson",
+ "Greg", "Gregg", "Gregory", "Greta", "Griffin",
+ "Guadalupe", "Guido", "Gunnar", "Gunner", "Gustave",
+ "Guy", "Gwen", "Hadley", "Hailee", "Hailey",
+ "Hailie", "Hal", "Haley", "Halle", "Hallie",
+ "Hanna", "Hannah", "Hans", "Hardy", "Harley",
+ "Harmon", "Harmony", "Harold", "Harrison", "Harry",
+ "Harvey", "Hattie", "Hayden", "Haylee", "Hayley",
+ "Haylie", "Hazel", "Heath", "Heather", "Hector",
+ "Heidi", "Helen", "Helena", "Helene", "Hellen",
+ "Henri", "Henry", "Herbert", "Herman", "Hilda",
+ "Hillary", "Hiram", "Hollis", "Holly", "Hope",
+ "Horace", "Houston", "Howard", "Hubert", "Hudson",
+ "Hugh", "Humberto", "Hunter", "Ian", "Ibrahim",
+ "Ida", "Ignacio", "Ike", "Imani", "Ines",
+ "Irma", "Isaac", "Isabel", "Isabell", "Isabella",
+ "Isabelle", "Isaiah", "Israel", "Ivy", "Izabella",
+ "Jabari", "Jace", "Jack", "Jackie", "Jacklyn",
+ "Jackson", "Jacky", "Jaclyn", "Jacquelyn", "Jada",
+ "Jade", "Jaden", "Jadon", "Jadyn", "Jaida",
+ "Jaiden", "Jaime", "Jairo", "Jake", "Jakob",
+ "Jalen", "Jamaal", "Jamal", "Jamar", "Jameson",
+ "Jamie", "Jamison", "Jan", "Jana", "Jane",
+ "Janelle", "Janet", "Janice", "Janie", "Janis",
+ "Jaqueline", "Jared", "Jaron", "Jarred", "Jarrod",
+ "Jarvis", "Jasmin", "Jason", "Jasper", "Javier",
+ "Jay", "Jayda", "Jayden", "Jaydon", "Jayme",
+ "Jayne", "Jean", "Jeanette", "Jeanne", "Jeff",
+ "Jeffery", "Jeffrey", "Jena", "Jennie", "Jennifer",
+ "Jerald", "Jeremy", "Jerome", "Jerrold", "Jerry",
+ "Jess", "Jesse", "Jessica", "Jessie", "Jessy",
+ "Jesus", "Jillian", "Jimmie", "Jimmy", "Jo",
+ "Joan", "Joana", "Joanie", "Joanne", "Joannie",
+ "Joanny", "Joany", "Joaquin", "Jocelyn", "Jodie",
+ "Jody", "Joe", "Joel", "Joelle", "Joey",
+ "Johanna", "John", "Johnathan", "Johnathon", "Johnny",
+ "Jon", "Jonas", "Jonathan", "Jonathon", "Jordan",
+ "Jordyn", "Jorge", "Jose", "Josefa", "Josefina",
+ "Joseph", "Josephine", "Josh", "Joshua", "Josiah",
+ "Josie", "Josue", "Jovan", "Joy", "Joyce",
+ "Juanita", "Jude", "Judge", "Judy", "Jules",
+ "Julia", "Julian", "Juliana", "Julie", "Juliet",
+ "Julio", "Julius", "June", "Justice", "Justina",
+ "Justine", "Kacey", "Kade", "Kaden", "Kaia",
+ "Kailee", "Kailey", "Kailyn", "Kaitlin", "Kaitlyn",
+ "Kale", "Kaleb", "Kaley", "Kali", "Kallie",
+ "Kameron", "Kane", "Kara", "Kareem", "Karelle",
+ "Karen", "Kari", "Kariane", "Karianne", "Karina",
+ "Karine", "Karl", "Karlee", "Karley", "Karli",
+ "Karlie", "Karson", "Kasandra", "Kasey", "Kassandra",
+ "Katelyn", "Katelynn", "Katherine", "Katheryn", "Kathleen",
+ "Kathryn", "Katrina", "Kattie", "Kay", "Kaya",
+ "Kayla", "Kaylee", "Kayleigh", "Kayley", "Keanu",
+ "Keegan", "Keeley", "Keira", "Keith", "Kelli",
+ "Kellie", "Kelly", "Kelvin", "Ken", "Kendall",
+ "Kendra", "Kendrick", "Kennedy", "Kenneth", "Kenny",
+ "Kenton", "Kenya", "Kevin", "Kiana", "Kianna",
+ "Kiara", "Kiera", "Kiley", "Kim", "Kimberly",
+ "King", "Kip", "Kira", "Kirk", "Kitty",
+ "Kobe", "Kody", "Kolby", "Kole", "Kory",
+ "Kris", "Krista", "Kristian", "Kristin", "Kristina",
+ "Kristofer", "Kristoffer", "Kristopher", "Kristy", "Krystal",
+ "Kurt", "Kurtis", "Kyla", "Kyle", "Kylie",
+ "Kyra", "Lacey", "Lacy", "Laila", "Lance",
+ "Landen", "Lane", "Laney", "Larry", "Laura",
+ "Laurel", "Lauren", "Laurie", "Lawrence", "Lawson",
+ "Layla", "Layne", "Lea", "Leann", "Leanna",
+ "Leanne", "Lee", "Leif", "Leila", "Leilani",
+ "Lela", "Leland", "Lenny", "Leo", "Leon",
+ "Leonard", "Lesley", "Leslie", "Lester", "Leta",
+ "Levi", "Lew", "Lewis", "Lexi", "Lexie",
+ "Lia", "Liam", "Liana", "Libby", "Lila",
+ "Lilian", "Lilla", "Lillian", "Lillie", "Lilly",
+ "Lily", "Lina", "Lincoln", "Linda", "Lindsay",
+ "Lindsey", "Lionel", "Lisa", "Lisette", "Liza",
+ "Lizzie", "Lloyd", "Logan", "Lois", "Lola",
+ "Lolita", "London", "Lonny", "Loren", "Lorena",
+ "Lorenzo", "Lori", "Louie", "Louisa", "Lowell",
+ "Lucas", "Luciano", "Lucie", "Lucienne", "Lucy",
+ "Luis", "Luisa", "Lukas", "Luna", "Lupe",
+ "Luther", "Luz", "Lydia", "Lyla", "Lynn",
+ "Mabel", "Mable", "Mac", "Macey", "Maci",
+ "Macie", "Mack", "Mackenzie", "Macy", "Madaline",
+ "Madalyn", "Maddison", "Madeline", "Madelyn", "Madelynn",
+ "Madge", "Madie", "Madilyn", "Madisen", "Madison",
+ "Madisyn", "Madonna", "Madyson", "Mae", "Maegan",
+ "Maeve", "Maggie", "Maia", "Malachi", "Malcolm",
+ "Mallory", "Mandy", "Manuel", "Manuela", "Mara",
+ "Marc", "Marcel", "Marcella", "Marcia", "Marco",
+ "Marcos", "Marcus", "Margaret", "Marge", "Margie",
+ "Margot", "Maria", "Mariah", "Mariana", "Marianne",
+ "Marie", "Marina", "Mario", "Marion", "Marjorie",
+ "Mark", "Marlee", "Marlene", "Marley", "Marlon",
+ "Marta", "Martin", "Marty", "Marvin", "Mary",
+ "Matt", "Maureen", "Maurice", "Mavis", "Max",
+ "Maxime", "Maxine", "Maxwell", "May", "Maya",
+ "Maynard", "Mayra", "Meagan", "Meaghan", "Meghan",
+ "Melisa", "Melissa", "Mellie", "Melody", "Melvin",
+ "Meredith", "Merle", "Mia", "Micaela", "Micah",
+ "Michael", "Michaela", "Michel", "Michele", "Michelle",
+ "Miguel", "Mikayla", "Mike", "Milan", "Miles",
+ "Millie", "Milo", "Milton", "Mina", "Minerva",
+ "Misty", "Mitchell", "Mohamed", "Mohammad", "Mohammed",
+ "Moises", "Molly", "Mona", "Monica", "Monique",
+ "Monte", "Morgan", "Morris", "Moses", "Moshe",
+ "Muhammad", "Muriel", "Mustafa", "Myles", "Myrna",
+ "Myron", "Myrtle", "Nadia", "Nannie", "Naomi",
+ "Nash", "Nasir", "Nat", "Natalie", "Natasha",
+ "Nathan", "Nathanael", "Nathaniel", "Neal", "Ned",
+ "Nedra", "Neha", "Neil", "Nellie", "Neva",
+ "Nicholas", "Nichole", "Nick", "Nicole", "Nikolas",
+ "Nina", "Noah", "Noel", "Nola", "Nolan",
+ "Nora", "Norma", "Nova", "Octavia", "Olga",
+ "Oliver", "Opal", "Ophelia", "Oscar", "Otis",
+ "Otto", "Owen", "Pablo", "Paige", "Pamela",
+ "Paris", "Parker", "Patience", "Patricia", "Patrick",
+ "Paul", "Paula", "Pauline", "Payton", "Pearl",
+ "Pedro", "Penelope", "Perry", "Pete", "Peter",
+ "Philip", "Phoebe", "Phyllis", "Pierce", "Pierre",
+ "Piper", "Polly", "Preston", "Priscilla", "Quincy",
+ "Quinn", "Rachael", "Rachel", "Rachelle", "Rae",
+ "Raegan", "Rafael", "Rafaela", "Ralph", "Ramon",
+ "Ramona", "Randall", "Randy", "Raphael", "Raquel",
+ "Ray", "Raymond", "Reagan", "Reba", "Rebecca",
+ "Reggie", "Reginald", "Reid", "Reilly", "Reina",
+ "Rene", "Renee", "Reuben", "Ricardo", "Richard",
+ "Richie", "Rick", "Ricky", "Rico", "Rigoberto",
+ "Riley", "Rita", "River", "Robb", "Robbie",
+ "Robert", "Roberta", "Roberto", "Robin", "Robyn",
+ "Rocky", "Roderick", "Roger", "Roman", "Ron",
+ "Rory", "Rosa", "Rose", "Rowan", "Roxane",
+ "Roxanne", "Roy", "Royal", "Royce", "Ruben",
+ "Ruby", "Rudy", "Russell", "Ruth", "Ryan",
+ "Sabina", "Sabrina", "Sadie", "Sage", "Sally",
+ "Sam", "Samantha", "Sammy", "Samson", "Sandra",
+ "Sandy", "Santiago", "Sarah", "Sarai", "Sasha",
+ "Saul", "Savanna", "Savannah", "Scarlett", "Sean",
+ "Sebastian", "Selena", "Serena", "Seth", "Shane",
+ "Shanna", "Shannon", "Sharon", "Shaun", "Shawn",
+ "Shawna", "Shea", "Sheila", "Sheldon", "Shirley",
+ "Sidney", "Sienna", "Sierra", "Silas", "Simone",
+ "Sofia", "Sonia", "Sonya", "Sophia", "Sophie",
+ "Stanley", "Stella", "Stephanie", "Stephen", "Steve",
+ "Susan", "Sydney", "Sylvia", "Talia", "Tamara",
+ "Tanner", "Tanya", "Taylor", "Ted", "Terence",
+ "Teresa", "Terry", "Theodore", "Thomas", "Tiffany",
+ "Timothy", "Tina", "Toby", "Tom", "Tomas",
+ "Tony", "Travis", "Troy", "Tyler", "Tyson",
+ "Valerie", "Vanessa", "Vaughn", "Vernon", "Veronica",
+ "Vicente", "Victor", "Victoria", "Vince", "Vincent",
+ "Violet", "Virginia", "Vivian", "Wayne", "Wendy",
+ "Will", "Willa", "Willard", "William", "Winston",
+ "Yolanda", "Zachary", "Zane", "Zoe", "Zoey",
+ "Zola",
+ },
+ "middle": {
+ "Abdul", "Abdullah", "Ada", "Adam", "Adele",
+ "Adrian", "Agnes", "Ahmed", "Aida", "Aileen",
+ "Aimee", "Alan", "Alex", "Ali", "Alice",
+ "Alicia", "Amelia", "Amina", "Amir", "Amy",
+ "Ana", "Anastasia", "Andrea", "Andrei", "Andrew",
+ "Angel", "Angela", "Anita", "Anna", "Anne",
+ "Anthony", "Antonio", "Aria", "Ariana", "Armando",
+ "Ashton", "Audrey", "August", "Aura", "Aurelia",
+ "Ava", "Avery", "Bailey", "Beatrice", "Belinda",
+ "Belle", "Ben", "Benjamin", "Bertha", "Beverly",
+ "Bianca", "Blake", "Blanca", "Bonnie", "Boris",
+ "Bradley", "Brandt", "Brett", "Brooks", "Bruce",
+ "Burke", "Calvin", "Camilla", "Carlos", "Carmen",
+ "Caroline", "Carson", "Casey", "Cassandra", "Cassidy",
+ "Catherine", "Cecilia", "Cedric", "Celia", "Chance",
+ "Chandler", "Chang", "Charles", "Charlotte", "Chen",
+ "Chloe", "Chris", "Christine", "Claire", "Clara",
+ "Clarissa", "Claude", "Cody", "Cynthia", "Dan",
+ "Dana", "Dane", "Daniel", "Daphne", "David",
+ "Denver", "Diana", "Dolores", "Drake", "Edith",
+ "Eduardo", "Edward", "Eileen", "Eleanor", "Elena",
+ "Elias", "Elizabeth", "Ella", "Ellen", "Elsa",
+ "Emery", "Emily", "Emma", "Emmett", "Enrique",
+ "Epifania", "Erik", "Erin", "Esperanza", "Estelle",
+ "Esther", "Eva", "Evan", "Eve", "Evelyn",
+ "Finn", "Francois", "Gabriel", "Gael", "Gail",
+ "George", "Grace", "Hannah", "Hazel", "Helen",
+ "Henry", "Ignacio", "Isaac", "Isabella", "Jaime",
+ "James", "Jane", "Jean", "Joan", "Jose",
+ "Julia", "Julian", "Katherine", "Kristen", "Kristina",
+ "Kurt", "Leo", "Mabel", "Manuel", "Margaret",
+ "Maria", "Mario", "Max", "Rosa", "Rose",
+ "Ruth",
+ },
+ "last": {
+ "Abbott", "Abernathy", "Abshire", "Adams", "Allen",
+ "Anderson", "Armstrong", "Ashley", "Atkins", "Atkinson",
+ "Auer", "Austin", "Bailey", "Baker", "Baldwin",
+ "Ball", "Banks", "Barber", "Barker", "Barnes",
+ "Barnett", "Barrows", "Bartell", "Barton", "Bates",
+ "Bayer", "Beahan", "Beatty", "Becker", "Bell",
+ "Bennett", "Berge", "Bergstrom", "Bernhard", "Berry",
+ "Bird", "Black", "Blake", "Bogan", "Boyer",
+ "Boyle", "Bradley", "Brady", "Braun", "Brekke",
+ "Brooks", "Brown", "Bryant", "Burns", "Burton",
+ "Butler", "Byrd", "Campbell", "Carpenter", "Carr",
+ "Carroll", "Carter", "Cartwright", "Casper", "Castillo",
+ "Chapman", "Chen", "Christiansen", "Clark", "Clay",
+ "Clayton", "Cole", "Coleman", "Collier", "Collins",
+ "Connelly", "Conroy", "Considine", "Cook", "Cooper",
+ "Cormier", "Cox", "Craig", "Crawford", "Cronin",
+ "Cruz", "Cummings", "Cunningham", "Daniel", "Daniels",
+ "Daugherty", "Davidson", "Davies", "Davis", "Dean",
+ "Deckow", "Diaz", "Dickinson", "Dietrich", "Dixon",
+ "Donnelly", "Dooley", "Douglas", "Doyle", "Duncan",
+ "Dunn", "Edwards", "Elliott", "Ellis", "Evans",
+ "Farrell", "Feeney", "Ferguson", "Fernandez", "Fields",
+ "Fisher", "Flatley", "Fleming", "Fletcher", "Flores",
+ "Ford", "Foster", "Fox", "Franklin", "Frazier",
+ "Freeman", "Friesen", "Fuller", "Garcia", "Gardner",
+ "Garrett", "Garrison", "Garza", "George", "Gerhold",
+ "Gerlach", "Gibbs", "Gibson", "Gilbert", "Gill",
+ "Gislason", "Gleason", "Gleichner", "Glenn", "Glover",
+ "Goldner", "Gomez", "Gonzalez", "Goodwin", "Gordon",
+ "Gottlieb", "Grady", "Graham", "Grant", "Graves",
+ "Gray", "Green", "Greene", "Gregory", "Griffin",
+ "Grimes", "Gross", "Guzman", "Hackett", "Hahn",
+ "Hale", "Haley", "Hall", "Hamilton", "Hammond",
+ "Hansen", "Hanson", "Harper", "Harrington", "Harris",
+ "Harrison", "Hart", "Hartmann", "Harvey", "Hawkins",
+ "Hayes", "Heller", "Henderson", "Henry", "Herman",
+ "Hermann", "Hernandez", "Herrera", "Herzog", "Hicks",
+ "Higgins", "Hill", "Hills", "Hoffman", "Holland",
+ "Holmes", "Holt", "Hopkins", "Horton", "Howard",
+ "Howe", "Howell", "Hubbard", "Hudson", "Hughes",
+ "Hunt", "Hunter", "Ingram", "Jackson", "Jacobi",
+ "Jacobs", "Jacobson", "James", "Jenkins", "Jensen",
+ "Jimenez", "Johnson", "Johnston", "Jones", "Jordan",
+ "Joseph", "Keller", "Kelly", "Kennedy", "Kessler",
+ "Kim", "King", "Klein", "Kling", "Knight",
+ "Koch", "Kuhn", "Lamb", "Lambert", "Lane",
+ "Lang", "Larkin", "Larson", "Lawrence", "Lawson",
+ "Lee", "Leffler", "Leonard", "Lewis", "Li",
+ "Lin", "Lind", "Lindgren", "Little", "Lopez",
+ "Love", "Lowe", "Lucas", "Lynch", "Lyons",
+ "Maldonado", "Malone", "Mann", "Manning", "Marks",
+ "Marquardt", "Marsh", "Marshall", "Martin", "Martinez",
+ "Marvin", "Mason", "Matthews", "Maxwell", "May",
+ "Mayer", "Mccarthy", "McClure", "McCullough", "McDermott",
+ "Mcdonald", "McKenzie", "McLaughlin", "Medina", "Mendez",
+ "Mendoza", "Mertz", "Meyer", "Miles", "Miller",
+ "Mills", "Mitchell", "Monahan", "Montgomery", "Moore",
+ "Morales", "Moreno", "Morgan", "Morris", "Morrison",
+ "Mueller", "Muller", "Murphy", "Murray", "Myers",
+ "Nash", "Navarro", "Nelson", "Newman", "Newton",
+ "Nguyen", "Nichols", "Nicolas", "Nolan", "Norman",
+ "Norris", "Oliver", "Olson", "Ortega", "Ortiz",
+ "Osinski", "Owen", "Owens", "Padilla", "Palmer",
+ "Parker", "Patel", "Patterson", "Paul", "Payne",
+ "Pearson", "Pena", "Perez", "Perkins", "Perry",
+ "Peters", "Peterson", "Phillips", "Pierce", "Porter",
+ "Powell", "Powers", "Price", "Purdy", "Quigley",
+ "Quinn", "Ramirez", "Ramos", "Ramsey", "Rath",
+ "Ray", "Raynor", "Reed", "Reese", "Reid",
+ "Reilly", "Reyes", "Reynolds", "Rhodes", "Rice",
+ "Richards", "Richardson", "Riley", "Ritchie", "Rivera",
+ "Robbins", "Roberts", "Robertson", "Robinson", "Rodriguez",
+ "Rogers", "Romero", "Rose", "Rosenbaum", "Ross",
+ "Rowe", "Ruiz", "Russell", "Rutherford", "Ryan",
+ "Sanchez", "Sanders", "Sandoval", "Santiago", "Santos",
+ "Satterfield", "Sauer", "Saunders", "Schaefer", "Schiller",
+ "Schmidt", "Schmitt", "Schneider", "Schroeder", "Schultz",
+ "Schuster", "Schwartz", "Scott", "Sharp", "Shaw",
+ "Shelton", "Sherman", "Shields", "Silva", "Simmons",
+ "Simpson", "Sims", "Singh", "Singleton", "Smith",
+ "Snyder", "Solomon", "Soto", "Sparks", "Spencer",
+ "Stanley", "Stanton", "Stark", "Stephens", "Stevens",
+ "Stevenson", "Stewart", "Stokes", "Stone", "Strong",
+ "Sullivan", "Summers", "Sutton", "Swanson", "Swift",
+ "Tate", "Taylor", "Terry", "Thiel", "Thomas",
+ "Thompson", "Thornton", "Tillman", "Todd", "Torres",
+ "Towne", "Townsend", "Tran", "Tucker", "Turner",
+ "Tyler", "Valdez", "Valencia", "Vargas", "Vasquez",
+ "Vaughn", "Vega", "Velazquez", "Villarreal", "Vincent",
+ "Wade", "Wagner", "Walker", "Wall", "Wallace",
+ "Walsh", "Walter", "Walters", "Walton", "Wang",
+ "Ward", "Warren", "Washington", "Waters", "Watkins",
+ "Watson", "Watts", "Weaver", "Webb", "Weber",
+ "Webster", "Welch", "Wells", "West", "Wheeler",
+ "White", "Whitney", "Wiggins", "Wilcox", "Wiley",
+ "Wilkins", "Wilkinson", "Williams", "Williamson", "Willis",
+ "Wilson", "Wise", "Wolf", "Wolfe", "Wolff",
+ "Wong", "Wood", "Woods", "Wright", "Wu",
+ "Wyatt", "Wyman", "Yang", "Yates", "Yost",
+ "Young", "Zamora", "Zimmerman",
+ },
+ "hobby": {
+ "3D Printing", "Acrobatics", "Acting", "Air Sports", "Aircraft Spotting",
+ "Airsoft", "Amateur Astronomy", "Amateur Geology", "Amateur Radio", "Animation",
+ "Antiquing", "Archery", "Art Collecting", "Astrology", "Astronomy",
+ "Auto Racing", "Axe Throwing", "Backgammon", "Backpacking", "Badminton",
+ "Baking", "Base Jumping", "Baseball", "Basketball", "Beach Volleyball",
+ "Beauty Pageants", "Beekeeping", "Billiards", "Birdwatching", "Blacksmithing",
+ "Blogging", "BMX", "Board Sports", "Board/Tabletop Games", "Bodybuilding",
+ "Bonsai", "Book Collecting", "Bowling", "Boxing", "Brazilian Jiu-Jitsu",
+ "Breadmaking", "Breakdancing", "Bridge", "Butterfly Watching", "Calligraphy",
+ "Camping", "Candle Making", "Candy Making", "Canoeing", "Canyoning",
+ "Car Fixing & Building", "Card Games", "Caving", "Checkers", "Cheerleading",
+ "Cheesemaking", "Chess", "Climbing", "Clothesmaking", "Coffee Roasting",
+ "Coin Collecting", "Coloring", "Comic Book Collecting", "Computer Programming", "Confectionery",
+ "Cooking", "Cosplaying", "Couponing", "Creative Writing", "Cribbage",
+ "Cricket", "Crocheting", "Croquet", "Cross-Stitch", "Crossword Puzzles",
+ "Curling", "Cycling", "Dance", "Darts", "Debate",
+ "Digital Arts", "Disc Golf", "DJing", "Do It Yourself", "Dolls",
+ "Dominoes", "Drama", "Drawing", "Drink Mixing", "Electronics",
+ "Embroidery", "Equestrianism", "Esports", "Fantasy Sports", "Farming",
+ "Fashion", "Fashion Design", "Fencing", "Field Hockey", "Figure Skating",
+ "Filmmaking", "Fishing", "Fishkeeping", "Flag Football", "Flower Arranging",
+ "Flower Collecting", "Flower Growing", "Fly Tying", "Flying", "Flying Disc",
+ "Foraging", "Foreign Language Learning", "Fossil Hunting", "Frisbee", "Furniture Building",
+ "Gardening", "Genealogy", "Geocaching", "Ghost Hunting", "Gingerbread House Making",
+ "Gold Prospecting", "Golfing", "Graffiti", "Graphic Design", "Gymnastics",
+ "Hacking", "Handball", "Herbalism", "Hiking", "Home Improvement",
+ "Homebrewing", "Hooping", "Horseback Riding", "Houseplant Care", "Hula Hooping",
+ "Hunting", "Hydroponics", "Ice Hockey", "Ice Skating", "Inline Skating",
+ "Jewelry Making", "Jigsaw Puzzles", "Jogging", "Journaling", "Judo",
+ "Juggling", "Jujitsu", "Jumping Rope", "Karaoke", "Karate",
+ "Kayaking", "Kendama", "Kite Flying", "Kitesurfing", "Knitting",
+ "Lacrosse", "LARPing", "Laser Tag", "Leather Crafting", "Lego Building",
+ "Long-Distance Running", "Longboarding", "Macrame", "Magic", "Mahjong",
+ "Makeup", "Marbles", "Marching Band", "Martial Arts", "Meditation",
+ "Metal Detecting", "Model Aircraft", "Model Building", "Motor Sports", "Mountain Biking",
+ "Mountaineering", "Mushroom Hunting", "Nail Art", "Needlepoint", "Orienteering",
+ "Origami", "Paintball", "Painting", "Parkour", "Photography",
+ "Pickleball", "Playing Musical Instruments", "Podcast Hosting", "Poi", "Poker",
+ "Pool", "Pottery", "Powerlifting", "Practical Jokes", "Pressed Flower Craft",
+ "Puzzles", "Quilling", "Quilting", "Quizzes", "Racquetball",
+ "Radio-Controlled Car Racing", "Radio-Controlled Model", "Rafting", "Rappelling", "Rapping",
+ "Reading", "Record Collecting", "Road Biking", "Rock Climbing", "Role-Playing Games",
+ "Roller Derby", "Roller Skating", "Rubik's Cube", "Rugby", "Running",
+ "Sailing", "Sand Art", "Scouting", "Scrapbooking", "Scuba Diving",
+ "Sculpting", "Sewing", "Shooting", "Shooting Sport", "Shuffleboard",
+ "Singing", "Skateboarding", "Sketching", "Skiing", "Skimboarding",
+ "Skipping Rope", "Skydiving", "Slacklining", "Slot Car", "Slot Car Racing",
+ "Snowboarding", "Snowmobiling", "Snowshoeing", "Soapmaking", "Soccer",
+ "Softball", "Speed Skating", "Sports Memorabilia", "Squash", "Stamp Collecting",
+ "Stand-Up Comedy", "Stone Skipping", "Sun Bathing", "Surfing", "Survivalism",
+ "Swimming", "Table Tennis", "Taekwondo", "Tai Chi", "Tarot",
+ "Tennis", "Thrifting", "Thru-Hiking", "Travel", "Triathlon",
+ "Ultimate Frisbee", "Vegetable Farming", "Video Editing", "Video Game Collecting", "Video Gaming",
+ "Videography", "Vintage Cars", "Vintage Clothing", "Vinyl Records", "Virtual Reality",
+ "Volleyball", "Walking", "Water Polo", "Water Sports", "Waxing",
+ "Weaving", "Weight Training", "Weightlifting", "Welding", "Whittling",
+ "Winemaking", "Wood Carving", "Woodworking", "Word Searches", "Wrestling",
+ "Writing", "Yo-Yoing", "Yoga", "Zumba",
+ },
+ "ethnicity": {
+ "African", "African American", "Albanian", "American", "Arab",
+ "Armenian", "Asian", "Australian", "Austrian", "Belgian",
+ "Brazilian", "British", "Bulgarian", "Canadian", "Caribbean",
+ "Chinese", "Croatian", "Czech", "Danish", "Dutch",
+ "English", "Filipino", "Finnish", "French", "German",
+ "Greek", "Hispanic", "Hungarian", "Indian", "Indonesian",
+ "Iranian", "Irish", "Italian", "Japanese", "Jewish",
+ "Korean", "Latino", "Mexican", "Middle Eastern", "Native American",
+ "Norwegian", "Pakistani", "Polish", "Portuguese", "Romanian",
+ "Russian", "Scandinavian", "Scottish", "Slovak", "South Asian",
+ "Southeast Asian", "Spanish", "Swedish", "Swiss", "Thai",
+ "Turkish", "Ukrainian", "Vietnamese", "Welsh", "West Indian",
+ },
+ "phone": {
+ "###-###-####", "(###)###-####", "1-###-###-####", "###.###.####",
+ },
+ "social_media": {
+ // Generic handles
+ "{gamertag}",
+ "@{gamertag}",
+
+ // Social Websites
+ "https://x.com/{gamertag}",
+ "https://instagram.com/{gamertag}",
+ "https://linkedin.com/in/{gamertag}",
+ "https://github.com/{gamertag}",
+ "https://tiktok.com/@{gamertag}",
+ "https://facebook.com/{gamertag}",
+ },
+ // Bio contains sentence templates for personal biographies
+ // phrased to avoid article/plural pitfalls and work with Generate
+ "bio": {
+ // short punchy
+ "Started in {city} as {jobtitle}, now in {productcategory}",
+ "{programminglanguage} developer with a side path in {productcategory}",
+ "Former {jobtitle} now focused on {productcategory}",
+ "Born in {country}, moved into {jobtitle} after studying {programminglanguage}",
+
+ // hipster flavor
+ "{jobtitle} into {hipsterword} and {hipsterword}, based in {city}",
+ "Known for a {hipsterword} aesthetic and work in {country} as {jobtitle}",
+ "{jobtitle} with a taste for {hipsterword} culture in {city}",
+ "From {country}, brought {hipsterword} vibes to {city} while working in {jobtitle}",
+
+ // beer
+ "{jobtitle} by day, brewing {beerstyle} after hours in {city}",
+ "Known for a {beerhop} IPA recipe and a career in {country} as {jobtitle}",
+ "Started brewing {beerstyle} in {city}, later specializing in {productcategory} as {jobtitle}",
+ "{jobtitle} who experiments with {beeryeast} fermentation on weekends",
+
+ // cars
+ "{jobtitle} who drives a {carmaker} {carmodel} and trains in {hobby} around {city}",
+ "Collector of {carmaker} models and working in {country} as {jobtitle}",
+ "{jobtitle} with a soft spot for {carfueltype} builds and hands-on {hobby} in {city}",
+ "Restored a {carmaker} {carmodel} and shifted into {jobtitle}",
+
+ // movies
+ "{jobtitle} obsessed with {moviegenre} cinema and hands-on {hobby} in {city}",
+ "Known for deep dives into {moviegenre} and a career in {country} as {jobtitle}",
+ "{jobtitle} who studies {moviegenre} and practices {hobby} after work",
+
+ // music
+ "{jobtitle} who codes to {songgenre} playlists in {city}",
+ "Workdays in {country} as {jobtitle}, nights with {songgenre} sessions",
+ "{jobtitle} blending {songgenre} jams with weekend {hobby}",
+
+ // celebrity
+ "{jobtitle} inspired by {celebrityactor}, active with {hobby} in {city}",
+ "Takes cues from {celebritybusiness} playbooks while working in {country} as {jobtitle}",
+ "{jobtitle} who follows {celebritysport} and keeps up daily practice in {hobby}",
+
+ // books
+ "{jobtitle} who reads {bookgenre} and keeps up with {hobby} in {city}",
+ "Career in {country} as {jobtitle}, library stacked with {bookgenre}",
+ "Moved into {jobtitle} after reading {booktitle} by {bookauthor}",
+
+ // school
+ "{jobtitle} with roots at {school}, now active in {hobby} around {city}",
+ "Known for a {school} background and work in {country} as {jobtitle}",
+ "{jobtitle} with a {school} degree and a habit of {verb} {noun} in {city}",
+
+ // pets
+ "{jobtitle} who cares about {animaltype} welfare and keeps up with {hobby}",
+ "Career in {country} as {jobtitle}, home life includes {petname}",
+ "{jobtitle} who volunteers with {animaltype} groups on weekends",
+
+ // color and aesthetic
+ "{jobtitle} drawn to {color} palettes and practical {hobby} in {city}",
+ "Recognized in {country} for a {color} aesthetic and work as {jobtitle}",
+ "{jobtitle} focused on {productfeature} with an eye for {color} design",
+
+ // medium mixed
+ "From {city}, discovered {hobby} while working as {jobtitle} at {company}",
+ "{jobtitle} by day and {hobby} enthusiast by night, currently in {country}",
+ "After {number:5,30} years in {city}, shifted focus to {productcategory}",
+ "Known for {verb} {noun} and practical {productcategory} work",
+
+ // story-ish
+ "From {city} to {country}, the path in {jobtitle} involved steady {verb} {noun} and {hobby}",
+ "Studied {programminglanguage} in {city} and built a name in {productcategory}",
+ "Moved into {jobtitle} after years of hands-on {hobby} across {country}",
+
+ // creative combos
+ "What began as {hobby} in {city} led to work in {productfeature} as {jobtitle}",
+ "Between {verb} {noun} and {hobby}, developed a steady path in {jobtitle} around {country}",
+ "{jobtitle} who studies {animal} behavior for fun and iterates on {noun} for work",
+
+ // compact one-liners
+ "{jobtitle} by trade, {hobby} by choice",
+ "Born in {country}, works in {productcategory}",
+ "{programminglanguage} roots with a focus on {productfeature}",
+ "From {city}, building in {productcategory} and keeping up with {hobby}",
+
+ // professional focus
+ "Specializes in {productcategory} as {jobtitle} in {city}",
+ "{jobtitle} with {programminglanguage} experience and ongoing {hobby}",
+ "Works in {productcategory} and keeps a steady practice in {hobby} around {country}",
+
+ // lifestyle crossovers
+ "Brews {beerstyle} while streaming {songgenre}, day job in {city} as {jobtitle}",
+ "Known for a {hipsterword} look and a shelf of {color} {animal} art",
+ "{jobtitle} with a {carmaker} {carmodel} and a taste for {moviegenre}",
+ "Reads {booktitle} by {bookauthor} and applies lessons in {jobtitle}",
+
+ // safe oddities
+ "{jobtitle} exploring {language} study and practical {hobby} in {city}",
+ "From {country}, building a path in {jobtitle} with {productcategory} focus",
+ "{programminglanguage} practitioner mixing {hobby} and {productfeature}",
+ },
}
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/data/product.go b/vendor/github.com/brianvoe/gofakeit/v7/data/product.go
index cbe5b3a5..c4b96efc 100644
--- a/vendor/github.com/brianvoe/gofakeit/v7/data/product.go
+++ b/vendor/github.com/brianvoe/gofakeit/v7/data/product.go
@@ -2,98 +2,380 @@ package data
var Product = map[string][]string{
"category": {
- "electronics", "clothing", "home appliances", "furniture",
- "automotive parts", "beauty and personal care", "books", "sports equipment",
- "toys and games", "outdoor gear", "pet supplies", "kitchenware",
- "health and wellness", "tools and hardware", "office supplies",
- "baby products", "jewelry", "home decor", "musical instruments",
- "fitness equipment", "mobile phones", "computer accessories", "cameras and photography",
- "gardening supplies", "bedding and linens", "food and groceries", "party supplies",
- "craft and diy supplies", "camping gear", "watches", "luggage and travel accessories",
- "board games", "art supplies", "stationery", "bath and shower products",
- "sunglasses", "educational toys", "headphones and earbuds", "sneakers and athletic shoes",
- "coffee and tea products", "bicycles and accessories", "cookware", "cosmetics",
- "home improvement", "pet food", "laptop bags and cases", "home security systems",
- "musical accessories", "skincare products", "smart home devices",
+ "accessories", "air quality products", "appliances", "art supplies", "audio equipment",
+ "automotive accessories", "automotive parts", "baby products", "bath and shower products",
+ "bathroom accessories", "bathroom fixtures", "bedding and linens", "beverage accessories",
+ "bicycles and accessories", "board games", "books", "cables and connectors",
+ "cameras and photography", "camping gear", "car accessories", "care products",
+ "charging accessories", "cleaning supplies", "clothing", "clothing accessories",
+ "coffee and tea products", "computer accessories", "cookware", "cosmetics",
+ "craft and diy supplies", "decorative accessories", "dining furniture", "educational toys",
+ "electronics", "entertainment systems", "exercise equipment", "fashion accessories",
+ "fitness equipment", "food preparation", "furniture", "gaming accessories",
+ "gaming equipment", "gardening supplies", "gift items", "hair care products",
+ "health and wellness", "heating and cooling", "home accessories", "home automation",
+ "home decor", "home improvement", "home organization", "home security systems",
+ "household essentials", "jewelry", "kitchen accessories", "kitchen appliances",
+ "kitchen tools", "kitchenware", "laptop bags and cases", "lighting",
+ "luggage and travel accessories", "makeup and cosmetics", "massage and relaxation",
+ "mobile phones", "musical accessories", "musical instruments", "office accessories",
+ "office furniture", "office supplies", "outdoor furniture", "outdoor gear",
+ "party supplies", "personal care", "pet accessories", "pet food",
+ "pet supplies", "power accessories", "safety and security", "seasonal decorations",
+ "skincare products", "smart home devices", "sneakers and athletic shoes",
+ "sports equipment", "storage and organization", "tableware", "tools and hardware",
+ "toys and games", "travel accessories", "utensils", "video equipment",
+ "watches", "water accessories", "window treatments", "wireless accessories",
},
"adjective": {
- "bold", "swift", "pure", "smart", "fresh",
- "cool", "sharp", "zen", "bright", "quick",
- "robust", "sleek", "versatile", "innovative", "compact",
- "luxe", "modular", "precision", "stream",
+ "advanced", "aesthetic", "agile", "all-in-one", "alluring",
+ "amazing", "ambitious", "ancient", "artistic", "athletic",
+ "attractive", "authentic", "automatic", "awesome", "balanced",
+ "beautiful", "best-selling", "bold", "brilliant", "bright",
+ "brisk", "budget-friendly", "calm", "capable", "champion",
+ "charming", "classic", "clean", "clever", "colorful",
+ "comfortable", "compact", "complete", "cool", "creative",
+ "crisp", "custom", "cutting-edge", "dazzling", "delicate",
+ "dependable", "designed", "digital", "durable", "dynamic",
+ "efficient", "elegant", "elite", "enduring", "energetic",
+ "enhanced", "essential", "exceptional", "exclusive", "expert",
+ "extraordinary", "fabulous", "fast", "fashionable", "favorite",
+ "feature-rich", "fine", "first-class", "flexible", "fresh",
+ "friendly", "genuine", "gifted", "glamorous", "glossy",
+ "graceful", "great", "handcrafted", "handy", "harmonious",
+ "high-end", "high-performance", "high-quality", "high-tech", "highly-rated",
+ "honest", "ideal", "impressive", "improved", "incredible",
+ "indispensable", "innovative", "inspiring", "integrated", "intelligent",
+ "intense", "intuitive", "invaluable", "invincible", "irresistible",
+ "lasting", "leading", "legendary", "lightweight", "luxe",
+ "luxurious", "magical", "magnificent", "majestic", "masterful",
+ "mighty", "minimalist", "modern", "modular", "multi-functional",
+ "natural", "neat", "new", "next-generation", "noble",
+ "optimized", "outstanding", "perfect", "performance", "polished",
+ "portable", "powerful", "practical", "precise", "precision",
+ "premium", "professional", "pure", "quality", "quick",
+ "quiet", "radiant", "rapid", "reliable", "remarkable",
+ "resilient", "responsive", "revolutionary", "robust", "rugged",
+ "seamless", "secure", "sensitive", "sharp", "sleek",
+ "smart", "smooth", "sophisticated", "special", "spectacular",
+ "speed", "splendid", "stainless", "stunning", "stream",
+ "streamlined", "strong", "sturdy", "stylish", "super",
+ "superior", "supreme", "swift", "tactical", "tasteful",
+ "technological", "terrific", "thrilling", "timeless", "top-rated",
+ "tough", "traditional", "transparent", "trendy", "trusted",
+ "ultimate", "ultra", "unbeatable", "unique", "universal",
+ "unmatched", "upgraded", "valuable", "versatile", "vibrant",
+ "victorious", "vigorous", "virtual", "vital", "zen",
},
"name": {
- "phone", "laptop", "tablet", "watch", "camera",
- "headphones", "speaker", "drone", "car", "bike",
- "appliance", "gadget", "tool", "toy", "game",
- "computer", "console", "smartwatch", "fitness tracker", "smart home device",
- "robot", "router", "television", "smart speaker", "vr headset",
- "earbuds", "printer", "mouse", "keyboard", "monitor",
- "microwave", "blender", "vacuum", "fan", "toaster",
- "clock", "lamp", "shaver", "scale", "thermometer",
- "fridge", "oven", "mixer", "iron", "hair dryer",
- "fan", "scale", "thermostat", "router", "lightbulb",
+ "adapter", "air conditioner", "air fryer", "air purifier", "alarm",
+ "alarm clock", "alarm system", "amplifier", "antenna", "apron",
+ "appliance", "armchair", "artificial intelligence device", "ashtray", "audio system",
+ "backpack", "bag", "baggage", "balcony", "ball",
+ "band", "barbecue", "barometer", "barstool", "basket",
+ "bath mat", "bathroom scale", "bathroom vanity", "bathtub", "battery",
+ "beach chair", "beach towel", "bed", "bed frame", "bedding",
+ "bedside table", "bench", "bicycle", "bidet", "bike",
+ "bin", "binoculars", "blanket", "blender", "blinds",
+ "bluetooth device", "board", "body scale", "book", "bookcase",
+ "bookend", "bookmark", "boot", "bottle", "bottle opener",
+ "bowl", "box", "bracelet", "bread maker", "briefcase",
+ "broom", "brush", "bucket", "bug zapper", "bulb",
+ "bumper", "bundle", "bunk bed", "burner", "cable",
+ "cabinet", "caddy", "calculator", "calendar", "camera",
+ "camping chair", "camping gear", "can opener", "candle", "candle holder",
+ "canister", "canopy", "car", "card", "card reader",
+ "carpet", "carrier", "cart", "case", "cash register",
+ "cassette player", "cast iron pan", "cat bed", "cat tree", "cd player",
+ "ceiling fan", "chair", "chandelier", "charger", "charging dock",
+ "charging pad", "charging station", "chest", "chest of drawers", "china cabinet",
+ "chip", "chopsticks", "christmas lights", "cigar cutter", "cigarette lighter",
+ "circuit breaker", "clamp", "clapper", "cleaning brush", "cleaning kit",
+ "clock", "closet", "clothes hanger", "clothesline", "clothing rack",
+ "coaster", "coat rack", "coffee grinder", "coffee maker", "coffee table",
+ "coffee warmer", "coin sorter", "colander", "comb", "comforter",
+ "compact disc", "compass", "computer", "console", "container",
+ "controller", "cookie jar", "cooker", "cooking pot", "cooking timer",
+ "cooler", "cork", "corkboard", "corkscrew", "corner shelf",
+ "cosmetic bag", "couch", "counter", "cover", "cradle",
+ "craft kit", "crayon", "credit card reader", "crock pot", "crystal",
+ "cup", "cupboard", "curtain", "curtain rod", "cushion",
+ "cutting board", "dartboard", "decorative pillow", "dehumidifier", "desk",
+ "desk lamp", "desk organizer", "detector", "dice", "dimmer",
+ "dining chair", "dining table", "dish", "dish rack", "dishwasher",
+ "display", "divider", "docking station", "dog bed", "dog bowl",
+ "door", "doorbell", "doorknob", "doormat", "doorstop",
+ "drawer", "dresser", "drill", "drink coaster", "drink dispenser",
+ "drone", "dry erase board", "dryer", "dumbbell", "duster",
+ "dv player", "dvd player", "earbuds", "earphones", "earplugs",
+ "egg timer", "electric blanket", "electric can opener", "electric kettle", "electric shaver",
+ "electric toothbrush", "emergency light", "envelope", "eraser", "espresso machine",
+ "ethernet cable", "exercise ball", "exercise bike", "exercise mat", "extension cord",
+ "eyeglasses", "eyeglasses case", "face mask", "fan", "faucet",
+ "fence", "file", "file cabinet", "filter", "fire alarm",
+ "fire extinguisher", "fireplace", "fireplace screen", "first aid kit", "fitness tracker",
+ "flash drive", "flashlight", "flat screen tv", "flip phone", "floor lamp",
+ "floor mat", "flooring", "flower pot", "fluorescent light", "fly swatter",
+ "food processor", "foot massager", "footrest", "frame", "freezer",
+ "fridge", "fruit bowl", "frying pan", "furnace", "game",
+ "game console", "gaming chair", "gaming desk", "gaming headset", "gaming keyboard",
+ "gaming mouse", "gaming monitor", "garage door opener", "garbage can", "garbage disposal",
+ "garden hose", "garden tool", "gate", "gauge", "generator",
+ "gift box", "gift card", "gift wrap", "glass", "glasses",
+ "glove", "glue", "goggles", "golf bag", "gps device",
+ "grater", "grill", "grill pan", "guitar", "guitar pick",
+ "hair brush", "hair clip", "hair dryer", "hair straightener", "hammer",
+ "handbag", "handheld vacuum", "hanger", "hard drive", "hat",
+ "headband", "headphones", "headrest", "heater", "heating pad",
+ "helmet", "herb garden", "high chair", "hinge", "hockey stick",
+ "hood", "hook", "hose", "humidifier", "ice bucket",
+ "ice cream maker", "ice maker", "ice pack", "ice tray", "id card",
+ "ink", "ink cartridge", "insect repellent", "iron", "ironing board",
+ "jack", "jacket", "jar", "jewelry box", "jewelry organizer",
+ "juicer", "jump rope", "kayak", "kettle", "key",
+ "key holder", "keyboard", "keychain", "keypad", "kitchen scale",
+ "kitchen timer", "kitchen towel", "knife", "knife block", "knife set",
+ "ladder", "lamp", "lamp shade", "laptop", "laptop bag",
+ "laptop case", "laptop stand", "laundry basket", "laundry detergent", "laundry hamper",
+ "lawn mower", "led light", "led strip", "letter opener", "level",
+ "license plate", "life jacket", "light", "light bulb", "light fixture",
+ "light switch", "lightbulb", "lighter", "lighthouse", "linen",
+ "lint roller", "lock", "locker", "loft bed", "luggage",
+ "luggage tag", "lunch box", "machine", "magazine rack", "magnet",
+ "magnifying glass", "mailbox", "makeup bag", "makeup brush", "makeup mirror",
+ "mannequin", "map", "marble", "marker", "mascara",
+ "mask", "mat", "match", "matchbox", "mattress",
+ "mattress pad", "mattress topper", "measuring cup", "measuring spoon", "meat thermometer",
+ "memory card", "memory foam pillow", "mesh", "microwave", "microwave cover",
+ "milk frother", "mirror", "mixer", "mobile phone", "monitor",
+ "monitor stand", "mop", "mop bucket", "mouse", "mouse pad",
+ "mousetrap", "mug", "multimeter", "music player", "nail",
+ "nail clipper", "nail file", "napkin", "napkin holder", "necklace",
+ "needle", "nesting table", "net", "network switch", "newspaper",
+ "night light", "nightstand", "notebook", "notepad", "nutcracker",
+ "office chair", "oil", "oil diffuser", "organizer", "ornament",
+ "outlet", "outlet cover", "oven", "oven mitt", "oven timer",
+ "overhead light", "pad", "paint", "paint brush", "paint roller",
+ "painting", "pan", "panel", "paper", "paper clip",
+ "paper shredder", "paper towel", "paper towel holder", "parking meter", "party favor",
+ "passport holder", "patio furniture", "pattern", "pc", "pedestal",
+ "pedestal fan", "pegboard", "pen", "pencil", "pencil case",
+ "pencil holder", "pencil sharpener", "pendant", "pendant light", "perfume",
+ "phone", "phone case", "phone charger", "phone holder", "phone stand",
+ "photo album", "photo frame", "picture", "picture frame", "pillow",
+ "pillow case", "pillow sham", "pin", "pipe", "pizza cutter",
+ "pizza pan", "pizza stone", "place mat", "planter", "plate",
+ "plate holder", "player", "pliers", "plug", "pocket knife",
+ "pod", "polish", "pool", "pool table", "popcorn maker",
+ "portable charger", "portable fan", "portable speaker", "poster", "pot",
+ "pot holder", "potato masher", "power bank", "power cord", "power strip",
+ "power supply", "printer", "projector", "projector screen", "purse",
+ "push pin", "puzzle", "quilt", "rack", "radio",
+ "rain gauge", "rake", "range hood", "razor", "reading light",
+ "recliner", "record player", "refrigerator", "remote", "remote control",
+ "resistance band", "rice cooker", "ring", "ring holder", "rivet",
+ "robot", "robot vacuum", "rocking chair", "roller", "rolling pin",
+ "room divider", "rope", "router", "rug", "ruler",
+ "safety pin", "salt shaker", "sander", "sandwich maker", "saucepan",
+ "scale", "scanner", "scarf", "scissors", "scoop",
+ "screw", "screwdriver", "scrub brush", "seal", "seating",
+ "security camera", "security system", "sensor", "serving tray", "sewing machine",
+ "shaver", "sheet", "shelf", "shelving unit", "shirt",
+ "shoe", "shoe organizer", "shoe rack", "shoelace", "shopping bag",
+ "shopping cart", "shower", "shower cap", "shower curtain", "shower head",
+ "shower rod", "shower stool", "shredder", "side table", "sieve",
+ "sink", "skateboard", "skewer", "ski", "skillet",
+ "sleep mask", "slipper", "slow cooker", "smart home device", "smart speaker",
+ "smart thermostat", "smartwatch", "smoke alarm", "smoke detector", "snap",
+ "snow shovel", "soap", "soap dispenser", "soap dish", "sofa",
+ "sofa bed", "sofa table", "solar panel", "solar power bank", "solar light",
+ "sound bar", "sound system", "spatula", "speaker", "spice rack",
+ "spoon", "spray bottle", "squeegee", "stain remover", "stand",
+ "stapler", "staples", "steamer", "step ladder", "step stool",
+ "stereo", "stethoscope", "stirrer", "stool", "storage",
+ "storage bin", "storage box", "storage container", "storage unit", "stove",
+ "strainer", "strap", "straw", "string", "string lights",
+ "stud finder", "suitcase", "sunglasses", "surge protector", "switch",
+ "table", "table cloth", "table lamp", "table runner", "tablet",
+ "tablet case", "tablet stand", "tack", "tag", "tape",
+ "tape measure", "tap", "target", "tarp", "task light",
+ "tea kettle", "tea set", "teapot", "teddy bear", "telephone",
+ "television", "television stand", "tennis racket", "tent", "thermometer",
+ "thermos", "thermostat", "thread", "throw", "throw pillow",
+ "tie", "tie rack", "timer", "tin", "tissue box",
+ "tissue holder", "toaster", "toaster oven", "toilet", "toilet brush",
+ "toilet paper", "toilet paper holder", "toilet seat", "tongs", "tool",
+ "tool box", "tool kit", "toothbrush", "toothbrush holder", "toothpaste",
+ "toothpick", "towel", "towel bar", "towel rack", "toy",
+ "toy box", "tracker", "tray", "treasure chest", "tree",
+ "trivet", "trophy", "trowel", "trunk", "tv",
+ "tv antenna", "tv mount", "tv remote", "tv stand", "umbrella",
+ "umbrella stand", "under bed storage", "usb cable", "usb drive", "usb hub",
+ "utensil", "utensil holder", "vacuum", "vacuum bag", "vacuum cleaner",
+ "vase", "vent", "video camera", "video game", "video player",
+ "vinyl player", "vr headset", "waffle maker", "wagon", "wall art",
+ "wall clock", "wall hook", "wall light", "wall mirror", "wall mount",
+ "wall outlet", "wall sconce", "wallet", "wardrobe", "washboard",
+ "washing machine", "waste basket", "watch", "watch band", "water bottle",
+ "water cooler", "water dispenser", "water filter", "water heater", "water pitcher",
+ "waterproof case", "webcam", "weighing scale", "wheel", "wheelbarrow",
+ "whisk", "whiteboard", "wick", "wifi extender", "wifi router",
+ "window", "window blind", "window curtain", "window screen", "window shade",
+ "wine bottle", "wine glass", "wine rack", "wire", "wireless charger",
+ "wireless earbuds", "wireless headphone", "wireless mouse", "wireless router", "wood",
+ "workbench", "wrench", "writing desk", "yoga block", "yoga mat",
+ "yoga strap", "zipper", "zone",
},
"feature": {
- "wireless", "smart", "eco-friendly", "advanced", "compact",
- "high-performance", "energy-efficient", "portable", "durable", "stylish",
- "touchscreen", "water-resistant", "noise-canceling", "voice-controlled", "ultra-lightweight",
- "multi-functional", "user-friendly", "fast-charging", "biometric", "gps-enabled",
+ "3d capable", "4k ready", "5g compatible", "adjustable", "advanced",
+ "ai-powered", "anti-bacterial", "anti-fog", "anti-glare", "anti-slip",
+ "anti-static", "auto-adjusting", "auto-cleaning", "auto-focus", "auto-shutoff",
+ "automatic", "backlit", "battery-powered", "biometric", "bluetooth enabled",
+ "bluetooth ready", "built-in", "cable-free", "calibrated", "camera-enabled",
+ "certified", "child-safe", "cloud-connected", "color-changing", "compatible",
+ "compact", "connectable", "cordless", "customizable", "deep-cleaning",
+ "detachable", "digital", "dimming", "directional", "dishwasher-safe",
+ "dual-mode", "dual-purpose", "dust-proof", "easy-clean", "eco-friendly",
+ "edge-to-edge", "energy-efficient", "energy-saving", "enhanced", "ergonomic",
+ "expandable", "fast-charging", "fingerprint-resistant", "fire-resistant", "foldable",
+ "fragrance-free", "free-standing", "full-spectrum", "gps-enabled", "hands-free",
+ "hd ready", "heat-resistant", "high-capacity", "high-definition", "high-efficiency",
+ "high-performance", "high-speed", "high-tech", "holographic", "hybrid",
+ "impact-resistant", "indoor-outdoor", "infrared", "integrated", "interactive",
+ "ip-rated", "keyless", "led-backlit", "leak-proof", "long-lasting",
+ "low-energy", "low-maintenance", "magnetic", "maintenance-free", "memory-enabled",
+ "mesh-enabled", "microfiber", "microwave-safe", "motion-activated", "motion-sensing",
+ "multi-angle", "multi-color", "multi-functional", "multi-purpose", "multi-zone",
+ "network-ready", "noise-canceling", "noise-reducing", "non-stick", "odor-resistant",
+ "oil-resistant", "one-touch", "outdoor-rated", "overheat protection", "padded",
+ "palm-sized", "password-protected", "pet-friendly", "plug-and-play", "portable",
+ "precision", "premium", "pressure-sensitive", "programmable", "quick-release",
+ "quick-start", "radar-enabled", "rapid", "rechargeable", "remote-controlled",
+ "removable", "resistant", "retractable", "reusable", "rugged",
+ "rust-proof", "scratch-resistant", "self-adjusting", "self-cleaning", "self-contained",
+ "self-leveling", "sensor-enabled", "shock-absorbing", "shock-resistant", "smart",
+ "smartphone-compatible", "solar-powered", "sound-activated", "spill-proof", "splash-proof",
+ "stain-resistant", "steam-powered", "streaming-ready", "stylish", "submersible",
+ "tactile", "temperature-controlled", "tether-free", "time-delayed", "touch-activated",
+ "touchscreen", "ultra-compact", "ultra-fast", "ultra-lightweight", "ultra-quiet",
+ "ultra-slim", "ultrasonic", "underwater-capable", "upgradeable", "usb-powered",
+ "user-friendly", "ventilated", "vibration-resistant", "voice-activated", "voice-controlled",
+ "waterproof", "water-resistant", "weather-resistant", "weatherproof", "wi-fi enabled",
+ "wi-fi ready", "wireless", "wireless charging", "wrinkle-free", "zero-emission",
},
"material": {
- "titanium", "carbon", "alloy", "bamboo", "leather",
- "glass", "ceramic", "aluminum", "stainless", "wood",
- "plastic", "rubber", "silicon", "fabric", "paper",
- "gold", "silver", "brass", "copper", "bronze",
- "chrome", "marble", "granite", "porcelain", "plexiglass",
- "quartz", "felt", "suede",
+ "abs plastic", "acrylic", "aluminum", "aluminum alloy", "aluminum oxide",
+ "ash wood", "bamboo", "bauxite", "beech wood", "birch wood",
+ "brass", "bronze", "burlap", "canvas", "carbon",
+ "carbon fiber", "carbon steel", "cardboard", "cashmere", "cast iron",
+ "cedar wood", "ceramic", "cherry wood", "chrome", "chromium",
+ "clay", "cobalt", "composite", "concrete", "copper",
+ "cork", "cotton", "denim", "diamond", "ebony wood",
+ "enamel", "epoxy", "fabric", "faux leather", "faux suede",
+ "felt", "fiberglass", "foam", "galvanized steel", "gel",
+ "glass", "gold", "granite", "graphite", "hardwood",
+ "hemp", "iron", "jade", "jute", "kapok",
+ "lacquer", "laminate", "latex", "lead", "leather",
+ "limestone", "linen", "magnesium", "mahogany wood", "marble",
+ "mdf", "mesh", "metal", "microfiber", "mica",
+ "mineral", "molybdenum", "neoprene", "nickel", "nylon",
+ "oak wood", "obsidian", "onyx", "paper", "pearl",
+ "pewter", "pine wood", "plastic", "plexiglass", "plywood",
+ "polycarbonate", "polyester", "polyethylene", "polypropylene", "polystyrene",
+ "polyurethane", "porcelain", "pottery", "quartz", "rattan",
+ "rawhide", "resin", "rosewood", "rubber", "sapphire",
+ "satin", "silicone", "silk", "silver", "slate",
+ "softwood", "spandex", "stainless steel", "steel", "stone",
+ "styrofoam", "suede", "synthetic", "teak wood", "terracotta",
+ "textile", "tin", "titanium", "titanium alloy", "tungsten",
+ "twill", "velvet", "vinyl", "walnut wood", "wicker",
+ "wood", "wool", "zinc", "zirconium",
},
"suffix": {
- "tech", "pro", "x", "plus", "elite",
- "spark", "nexus", "nova", "fusion", "sync",
- "edge", "boost", "max", "link", "prime",
- "zoom", "pulse", "dash", "connect", "blaze",
- "quantum", "spark", "vertex", "core", "flux",
- "turbo", "shift", "wave", "matrix",
+ "ace", "active", "advanced", "air", "alpha",
+ "apex", "arc", "art", "aura", "axis",
+ "beast", "beta", "blaze", "boost", "brave",
+ "bright", "burst", "catalyst", "charge", "classic",
+ "connect", "core", "cosmic", "craft", "dash",
+ "delta", "design", "diamond", "digital", "drive",
+ "dynamic", "edge", "elite", "energy", "essence",
+ "evo", "ex", "excel", "express", "extreme",
+ "fire", "flex", "flow", "flux", "force",
+ "form", "forte", "fusion", "gen", "genesis",
+ "glide", "glow", "gold", "grand", "graph",
+ "gravity", "grid", "guard", "guide", "harmony",
+ "hero", "hub", "icon", "impact", "infinity",
+ "ion", "jet", "key", "kinetic", "lab",
+ "laser", "legend", "level", "light", "link",
+ "lite", "live", "logic", "loop", "lux",
+ "max", "matrix", "mega", "micro", "mind",
+ "mini", "mode", "motion", "move", "nexus",
+ "nova", "one", "optima", "orbit", "pace",
+ "peak", "phase", "pilot", "pixel", "plus",
+ "power", "premium", "prime", "pro", "pulse",
+ "quantum", "quest", "quick", "radiant", "rapid",
+ "ray", "rebel", "reign", "rise", "rush",
+ "scale", "scope", "sense", "shift", "signature",
+ "silver", "smart", "snap", "solo", "sonic",
+ "spark", "speed", "sphere", "spirit", "sport",
+ "star", "stream", "strike", "studio", "style",
+ "summit", "super", "surge", "sync", "tactical",
+ "tech", "terra", "thunder", "titan", "touch",
+ "tour", "trail", "trio", "trooper", "tropic",
+ "turbo", "ultra", "union", "unity", "vault",
+ "vector", "velocity", "vertex", "vibe", "vital",
+ "vortex", "wave", "x", "xenon", "zen",
+ "zero", "zone", "zoom",
},
"benefit": {
- "comfort", "efficiency", "safety", "reliability",
- "versatility", "ease of use", "long battery life",
- "precision", "enhanced connectivity", "portability",
- "durability", "energy savings", "aesthetic appeal",
- "health benefits", "convenience", "time-saving",
- "high performance", "noise reduction", "user satisfaction",
- "customizability", "sustainability", "cost-effectiveness",
- "innovative features", "improved productivity", "enhanced experience",
- "robust construction", "weather resistance", "minimal maintenance",
- "increased functionality", "advanced technology", "ergonomic design",
+ "advanced technology", "aesthetic appeal", "better organization", "cost-effectiveness",
+ "comfort", "convenience", "customizability", "durability", "ease of use",
+ "efficiency", "energy savings", "enhanced connectivity", "enhanced experience",
+ "enhanced performance", "ergonomic design", "excellent value", "fast response time",
+ "flexibility", "health benefits", "high performance", "improved accuracy",
+ "improved comfort", "improved productivity", "improved quality", "increased functionality",
+ "increased lifespan", "innovative features", "long battery life", "minimal maintenance",
+ "noise reduction", "peace of mind", "portability", "precision", "reliability",
+ "robust construction", "safety", "seamless integration", "space efficiency",
+ "sustainability", "time-saving", "user satisfaction", "versatility",
+ "weather resistance", "wireless freedom",
},
"use_case": {
- "home", "office", "outdoors", "fitness", "travel", "gaming",
- "cooking", "music", "learning", "entertainment", "professional work",
- "healthcare", "educational purposes", "commuting", "camping", "hiking",
- "sports", "art and craft", "gardening", "cleaning", "personal grooming",
- "relaxation", "home security", "pet care", "smart automation", "food preparation",
- "baking", "social gatherings", "productivity", "collaboration", "DIY projects",
- "childcare", "remote work", "photography", "videography", "wellness routines",
+ "art and craft", "baking", "barbecuing", "bathroom", "bedroom",
+ "camping", "childcare", "cleaning", "collaboration", "commuting",
+ "cooking", "creative projects", "dining", "DIY projects", "educational purposes",
+ "entertainment", "exercise", "fitness", "food preparation", "gardening",
+ "gaming", "garage", "healthcare", "hiking", "home",
+ "home automation", "home security", "indoor activities", "kitchen", "laundry",
+ "learning", "living room", "music", "office", "outdoor activities",
+ "outdoors", "personal grooming", "pet care", "photography", "productivity",
+ "professional work", "remote work", "relaxation", "smart automation", "social gatherings",
+ "spaces", "sports", "storage", "travel", "videography",
+ "wellness routines", "workshop",
},
"target_audience": {
- "children", "adults", "seniors", "students", "professionals", "athletes",
- "travelers", "families", "pet owners", "homeowners", "gamers", "cooks", "DIY enthusiasts",
- "musicians", "artists",
+ "adults", "artists", "athletes", "beginners", "children",
+ "collectors", "cooks", "creative professionals", "DIY enthusiasts", "educators",
+ "families", "fitness enthusiasts", "gamers", "health-conscious individuals", "homeowners",
+ "hobbyists", "musicians", "outdoor enthusiasts", "parents", "pet owners",
+ "photographers", "professionals", "seniors", "small businesses", "students",
+ "tech enthusiasts", "travelers", "wellness seekers", "working professionals",
},
"dimension": {
- "small", "medium", "large", "extra-large", "compact", "lightweight",
- "heavy", "mini", "standard", "oversized",
+ "compact", "extra-large", "extra-small", "full-size", "heavy",
+ "jumbo", "large", "lightweight", "medium", "mini",
+ "oversized", "petite", "portable", "regular", "small",
+ "standard", "travel-size", "x-large", "x-small", "xx-large",
+ "xx-small",
},
"description": {
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/data/sentence.go b/vendor/github.com/brianvoe/gofakeit/v7/data/sentence.go
deleted file mode 100644
index e12319d8..00000000
--- a/vendor/github.com/brianvoe/gofakeit/v7/data/sentence.go
+++ /dev/null
@@ -1,5 +0,0 @@
-package data
-
-var Sentence = map[string][]string{
- "phrase": {"what's yer poison", "time will tell", "I'm good", "nice to meet you", "spring forward, fall back", "what's your job", "once or twice", "you could have fooled me", "what's your name", "why not Zoidberg", "time you got a watch", "I'm Hindu", "fair play", "what's your phone number", "after the jump", "cease fire", "as ever", "I'm hot", "best of", "get well soon", "what's your poison", "when is closing time", "yes and amen", "you don't dip your pen in the company inkwell", "I'm hungry", "short of", "what's yours", "duces tecum", "after you", "yes and no", "I'm in love with you", "the pants off", "I'm Jewish", "few sandwiches short of a picnic", "shut the front door", "does a bear shit in the woods", "the party is over", "tomayto tomahto", "I'm looking for a grocery store", "does anyone here speak English", "heads I win, tails you lose", "I'm looking for a job", "stick a fork in it", "the penny drops", "I'm lost", "shut up and take my money", "mind you", "I'm married", "isn't it so", "wham-bam-thank-you-ma'am", "does not compute", "hold your fire", "pardon me", "mind your own beeswax", "I'm mute", "does someone look like", "I'm not being funny", "leave me alone", "going once, going twice, sold", "you get that", "I'm not interested", "talk about", "here be dragons", "always a bridesmaid, never a bride", "the plot thickens", "close, but no cigar", "I'm not religious", "ultra vires", "bound to", "always the bridesmaid, never the bride", "the plural of anecdote is not data", "I'm pregnant", "comedy equals tragedy plus time", "get you", "heads will roll", "all to the better", "I'm rubber, you're glue", "going to", "when push comes to shove", "you had to be there", "I'm scared", "you have beautiful eyes", "enjoy your meal", "I'm sick", "doesn't have both oars in the water", "you have the advantage of me", "here lies", "check is in the mail", "I'm single", "stick 'em up", "when the chips are down", "you just had to", "that'll be the day", "I'm sorry", "very good", "lather, rinse, repeat", "you kiss your mother with that mouth", "that'll do", "the rabbit died", "I'm straight", "in order for", "when the going gets weird, the weird turn pro", "I'm thirsty", "the rest is history", "it depends", "I'm tired", "in order to", "monkeys might fly out of my butt", "oh my life", "do want", "would it hurt", "you know what", "here you are", "all wool and a yard wide", "hit it", "pound for pound", "bottom falls out", "OK yah", "would it kill someone", "you know what I mean", "here you go", "alone in a crowd", "me neither", "chin up", "to be continued", "I'm twenty years old", "such is life", "off with someone's head", "Lord knows", "case closed", "you know what they say", "you've got to laugh", "ten points to Gryffindor", "that's a relief", "I'm worried", "kill the rabbit", "live and learn", "would not throw someone out of bed", "catch you later", "that's a wrap", "the rubber meets the road", "to be honest", "I'm your huckleberry", "off with their head", "you learn something new every day", "catch you on the flip side", "all your base are belong to us", "that's all", "horses for courses", "to be named later", "good night", "would you mind putting on your seat belt", "easy does it", "that's all she wrote", "me too", "oh noes", "that's for me to know and you to find out", "to be truthful", "still got one's communion money", "do you accept American dollars", "winner, winner, chicken dinner", "workers of the world, unite", "speak of the devil", "you must be fun at parties", "that's it", "hit me", "how about that", "ding, ding, ding, we have a winner", "do you accept credit cards", "word has it", "woulda, coulda, shoulda", "you must be new here", "how are you", "do you believe in God", "woulda, shoulda, coulda", "that's life", "safety in numbers", "how are you doing", "do you come here often", "worm has turned", "you never know", "that's my", "how are you getting along", "leave well enough alone", "do you have a boyfriend", "that's saying something", "the shoe is on the other foot", "this is someone", "do you have a girlfriend", "Lord only knows", "that's that", "check yourself before you wreck yourself", "this is the life", "how can you sleep at night", "wake up and die right", "do you have a menu in English", "that's the bunny", "the show must go on", "this is where we came in", "nod's as good as a wink to a blind bat", "wake up and smell the ashes", "on the huh", "do you have any brothers or sisters", "dogs bark", "worm turns", "that's the spirit", "this just in", "how did he die", "more like", "do you have any pets", "alright me babber", "Elvis has left the building", "this means war", "how do", "she could be his mother", "do you have children", "alright me lover", "that's the ticket", "how do I get to", "shoulda, coulda, woulda", "nome sane", "guess what", "whenever one turns around", "do you have Wi-Fi", "alright my babber", "the story goes", "how do I get to the airport", "shoulda, woulda, coulda", "do you kiss your mother with that mouth", "Lord willing and the creek don't rise", "you said it", "alright my lover", "how do I get to the bus station", "ask me one on sport", "need I say more", "sounds like a plan", "put that in your pipe and smoke it", "do you know", "take a picture, it will last longer", "the streets are paved with gold", "how do I get to the train station", "ask my arse", "stop the car", "do you know who I am", "wouldn't you know", "you shouldn't have", "how do ye do", "fans are slans", "use one's coconut", "bit by a barn mouse", "stick that in your pipe and smoke it", "do you mind", "but for the grace of God", "wouldn't you know it", "head in the sand", "the terrorists will have won", "how do you do", "please excuse my dear Aunt Sally", "much of a muchness", "bless someone's cotton socks", "do you need help", "or else", "dress for the slide, not the ride", "that's wassup", "the thick plottens", "much to be said", "bless someone's heart", "a blessing and a curse", "do you speak English", "you think", "that's what I'm talking about", "how do you like that", "art imitates life", "please help me", "five will get you ten", "do you think you can walk", "or so", "that's what she said", "the thing is", "how do you like them apples", "please pass the salt", "I've been robbed", "nature calls", "a boon and a bane", "but me no buts", "or something", "you welcome", "that's what's up", "how do you pronounce this word", "fare thee well", "please repeat after me", "I've been shot", "pot, meet kettle", "a boon or a bane", "where are the snows of yesteryear", "or what", "rolling in it", "the toilet is clogged", "how do you say...in English", "circle gets the square", "more than someone has had hot dinners", "please say that again", "I've burned myself", "different strokes", "where are the toilets", "or words to that effect", "you win", "how do you spell this word", "to hell with", "in virtue of which", "please sit down", "where are we", "out to", "am I right", "please speak more slowly", "I've lost my keys", "where are we going", "but who's counting", "you wish", "am I right or am I right", "how goes it", "methinks the lady doth protest too much", "please turn left", "could be written on the back of a postage stamp", "I've never heard it called that before", "where are you", "you wish, jellyfish", "am I under arrest", "methinks thou dost protest too much", "please turn right", "bang to rights", "gimme a break", "where are you from", "revenge is sweet", "'tis the season", "pull the other one", "where are your parents", "out with it", "have a good one", "how long is a piece of string", "ay up me duck", "before you can say Jack Robinson", "pull the other one, it's got bells on", "where away", "only time will tell", "could fit on the back of a postage stamp", "before you can say knife", "pull the other one, it's got brass bells on", "where can I find a hotel", "the wheels came off", "angel passes", "how many languages do you speak", "could go all day", "sleep tight", "nature vs nurture", "practice, practice, practice", "where do I sign up", "help is on the way", "many thanks", "the wheels came off the bus", "mercy bucket", "how many siblings do you have", "pleased to meet you", "could have fooled me", "where do you live", "the wheels came off the wagon", "mercy buckets", "where do you live at", "you'd better believe it", "than a bygod", "the wheels fell off", "could have, would have, should have", "where does it hurt", "hell if I know", "you'd complain if you were hung with a new rope", "the wheels fell off the bus", "every good boy deserves fudge", "could I see the menu, please", "where does this bus go", "help wanted", "the wheels fell off the wagon", "how much do I owe you", "where does this train go", "how much do you charge", "steady as she goes", "put the same shoe on every foot", "where have you been", "temper temper", "how much does it cost", "coulda, shoulda, woulda", "give credit where credit is due", "boom goes the dynamite", "where is the toilet", "how much is it", "in your dreams", "coulda, woulda, shoulda", "what a lovely day", "to save one's life", "exsqueeze me", "like a martin to his gourd", "what a pity", "you'll be late for your own funeral", "every man for himself", "size matters"},
-}
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/data/song.go b/vendor/github.com/brianvoe/gofakeit/v7/data/song.go
new file mode 100644
index 00000000..0e275c8e
--- /dev/null
+++ b/vendor/github.com/brianvoe/gofakeit/v7/data/song.go
@@ -0,0 +1,246 @@
+package data
+
+// Songs: Year-end Charts Hot 100 Songs from Billboard
+// Source: https://www.billboard.com/charts/year-end/hot-100-songs/
+
+// Artists: Greatest of All Time Artists based on Billboard rate
+// Source: https://www.billboard.com/charts/greatest-of-all-time-artists/
+
+var Songs = map[string][]string{
+ "name": {
+ "A Bar Song (Tipsy)",
+ "A Holly Jolly Christmas",
+ "Act II: Date @ 8",
+ "Agora Hills",
+ "Ain't No Love In Oklahoma",
+ "All I Want For Christmas Is You",
+ "Austin",
+ "Beautiful Things",
+ "Birds Of A Feather",
+ "Bulletproof",
+ "Burn It Down",
+ "Carnival",
+ "Cowgirls",
+ "Cruel Summer",
+ "Dance The Night",
+ "Die With A Smile",
+ "Down Bad",
+ "End Of Beginning",
+ "Espresso",
+ "Euphoria",
+ "Everybody",
+ "Exes",
+ "FE!N",
+ "FTCU",
+ "Fast Car",
+ "Feather",
+ "First Person Shooter",
+ "Flowers",
+ "Fortnight",
+ "Fukumean",
+ "Gata Only",
+ "Get It Sexyy",
+ "Good Good",
+ "Good Luck, Babe!",
+ "Greedy",
+ "High Road",
+ "Hot To Go!",
+ "Houdini",
+ "Houdini",
+ "I Am Not Okay",
+ "I Can Do It With A Broken Heart",
+ "I Had Some Help",
+ "I Like The Way You Kiss Me",
+ "I Remember Everything",
+ "IDGAF",
+ "Is It Over Now?",
+ "Jingle Bell Rock",
+ "La Diabla",
+ "Last Christmas",
+ "Last Night",
+ "Lies Lies Lies",
+ "Like That",
+ "Lil Boo Thang",
+ "Lose Control",
+ "Lovin On Me",
+ "Lunch",
+ "Made For Me",
+ "Miles On It",
+ "Million Dollar Baby",
+ "Monaco",
+ "Need A Favor",
+ "Never Lose Me",
+ "Not Like Us",
+ "On My Mama",
+ "Paint The Town Red",
+ "Pink Skies",
+ "Please Please Please",
+ "Pour Me A Drink",
+ "Pretty Little Poison",
+ "Redrum",
+ "Rich Baby Daddy",
+ "Rockin' Around The Christmas Tree",
+ "Saturn",
+ "Save Me",
+ "Slow It Down",
+ "Snooze",
+ "Stargazing",
+ "Stick Season",
+ "Taste",
+ "Texas Hold 'Em",
+ "The Painter",
+ "Thinkin' Bout Me",
+ "Too Sweet",
+ "Truck Bed",
+ "Type Shit",
+ "Vampire",
+ "Wanna Be",
+ "Water",
+ "We Can't Be Friends (Wait For Your Love)",
+ "What Was I Made For?",
+ "Whatever She Wants",
+ "Where It Ends",
+ "Where The Wild Things Are",
+ "White Horse",
+ "Wild Ones",
+ "Wildflower",
+ "Wind Up Missin' You",
+ "World On Fire",
+ "Yeah Glo!",
+ "Yes, And?",
+ },
+ "artist": {
+ "Adele",
+ "Aerosmith",
+ "Alicia Keys",
+ "Aretha Franklin",
+ "Barbra Streisand",
+ "Barry Manilow",
+ "Bee Gees",
+ "Beyonce",
+ "Billy Joel",
+ "Bob Dylan",
+ "Bob Seger",
+ "Bon Jovi",
+ "Boyz II Men",
+ "Britney Spears",
+ "Bruce Springsteen & The E Street Band",
+ "Bruno Mars",
+ "Bryan Adams",
+ "Carole King",
+ "Carpenters",
+ "Celine Dion",
+ "Chicago",
+ "Chris Brown",
+ "Commodores",
+ "Creedence Clearwater Revival",
+ "Daryl Hall John Oates",
+ "Def Leppard",
+ "Diana Ross",
+ "Donna Summer",
+ "Drake",
+ "Eagles",
+ "Earth, Wind & Fire",
+ "Ed Sheeran",
+ "Elton John",
+ "Elvis Presley",
+ "Eminem",
+ "Eric Clapton",
+ "Fleetwood Mac",
+ "Foreigner",
+ "Garth Brooks",
+ "Guns N' Roses",
+ "Heart",
+ "Herb Alpert",
+ "Huey Lewis & The News",
+ "JAY-Z",
+ "James Taylor",
+ "Janet Jackson",
+ "John Denver",
+ "John Mellencamp",
+ "Journey",
+ "Justin Bieber",
+ "Justin Timberlake",
+ "Kanye West",
+ "Katy Perry",
+ "Kelly Clarkson",
+ "Kenny Rogers",
+ "Lady Gaga",
+ "Led Zeppelin",
+ "Linda Ronstadt",
+ "Linkin Park",
+ "Lionel Richie",
+ "Madonna",
+ "Mariah Carey",
+ "Maroon 5",
+ "Marvin Gaye",
+ "Mary J. Blige",
+ "Michael Bolton",
+ "Michael Jackson",
+ "Miley Cyrus",
+ "Neil Diamond",
+ "Nelly",
+ "Nickelback",
+ "Olivia Newton-John",
+ "P!nk",
+ "Paul McCartney",
+ "Paula Abdul",
+ "Phil Collins",
+ "Pink Floyd",
+ "Prince",
+ "Queen",
+ "R. Kelly",
+ "Rihanna",
+ "Rod Stewart",
+ "Santana",
+ "Simon & Garfunkel",
+ "Stevie Wonder",
+ "Taylor Swift",
+ "The Beach Boys",
+ "The Beatles",
+ "The Black Eyed Peas",
+ "The Jacksons",
+ "The Monkees",
+ "The Rolling Stones",
+ "The Supremes",
+ "The Temptations",
+ "Three Dog Night",
+ "Tim McGraw",
+ "U2",
+ "Usher",
+ "Van Halen",
+ "Whitney Houston",
+ },
+ "genre": {
+ "Acoustic Pop",
+ "Alternative Hip-Hop",
+ "Alternative Pop",
+ "Chillwave",
+ "Contemporary R&B",
+ "Country",
+ "Dancehall",
+ "Electro-pop",
+ "Electronic Dance Music (EDM)",
+ "Emo Rap",
+ "Funk",
+ "Gospel-inspired Pop",
+ "Hip-Hop",
+ "Indie Pop",
+ "Latin Pop",
+ "Lo-fi Hip-Hop",
+ "Melodic Rap",
+ "Pop",
+ "Pop Punk",
+ "Pop Rock",
+ "R&B",
+ "Rap",
+ "Reggaeton",
+ "Rock",
+ "Singer-Songwriter",
+ "Soul",
+ "Synthwave",
+ "Trap",
+ "Trap Soul",
+ "Urban Contemporary",
+ },
+}
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/data/text.go b/vendor/github.com/brianvoe/gofakeit/v7/data/text.go
new file mode 100644
index 00000000..d1de2260
--- /dev/null
+++ b/vendor/github.com/brianvoe/gofakeit/v7/data/text.go
@@ -0,0 +1,523 @@
+package data
+
+var Text = map[string][]string{
+ "sentence": {
+ // Imperatives mixing verbs/adverbs/adjectives
+ "Choose {adjectivedescriptive} defaults.",
+ "Deliberately {verbtransitive} the {nouncommon}.",
+ "Carefully {verbtransitive} the {nounconcrete} {adverbmanner}.",
+ "Explicitly name the {nouncommon} before you {verbtransitive} it.",
+ "Ruthlessly remove dead {nouncommon}.",
+ "Quietly harden the {nouncommon} {adverbtimeindefinite}.",
+ "Systematically improve the {nouncommon} {adverbfrequencydefinite}.",
+ "Continuously measure the {nouncommon} and {verbtransitive} the outliers.",
+ "Optimize {nouncommon} for {adjectivedescriptive} clarity.",
+ "Protect the {nouncommon} under {adjectivedescriptive} load.",
+
+ // Descriptive statements using linking/helping verbs + adjectives/adverbs
+ "The {nouncommon} {verblinking} {adjectivedescriptive}.",
+ "The {adjectivedescriptive} {nouncommon} {verblinking} unexpectedly {adverbmanner}.",
+ "The {nounabstract} {verbhelping} be {adjectivedescriptive} {adverbdegree}.",
+ "Clear {nouncommon} {verblinking} better than clever {nouncommon}.",
+ "Consistent {nouncommon} {verblinking} the foundation of {nounabstract}.",
+ "Balanced {nouncommon} and {nouncommon} {verblinking} essential.",
+ "Subtle {color} accents {verblinking} effective {adverbdegree}.",
+ "Durable {nouncommon} {verblinking} worth the {nounabstract}.",
+ "Steady {adjectivedescriptive} progress in {city} {verblinking} visible.",
+ "Defaults at {company} {verblinking} shape {nouncommon}.",
+
+ // Prepositional / connective openers (time, comparison, listing, casual)
+ "{connectivetime}, {pronounpersonal} {verbaction} {adverbmanner}.",
+ "{connectivecomparative}, {pronounpersonal} {verbtransitive} the {nouncommon}.",
+ "{connectivelisting}, document the {nouncommon} and {verbtransitive} the rest.",
+ "{connectivecasual}, keep the {nouncommon} simple.",
+ "{connectiveexamplify}, prefer {nouncommon} over {nouncommon}.",
+ "{prepositionsimple} the {nounconcrete}, {pronounpersonal} {verbaction} {adverbmanner}.",
+ "{prepositioncompound} the {nouncommon}, we {verbtransitive} a smaller {nouncommon}.",
+ "{prepositiondouble} the {nouncommon}, align expectations.",
+ "{connectivetime} the review, {pronounpersonal} {verbtransitive} the {nouncommon}.",
+ "{connectivecomparative} the prior approach, this {nouncommon} {verblinking} clearer.",
+
+ // Pronoun-focused directions
+ "{pronounpersonal} {verbaction} {adverbmanner} to stabilize the {nouncommon}.",
+ "{pronoundemonstrative} {nouncommon} {verblinking} {adjectivedescriptive}; {pronounpersonal} {verbtransitive} it next.",
+ "{pronounindefinite} {verbintransitive} when the {nouncommon} spikes.",
+ "{pronounrelative} {verbaction} quickly {verbtransitive} the {nouncommon}.",
+ "{pronounpossessive} {nouncommon} {verblinking} ready for {nounabstract}.",
+
+ // Narrative / progression with time & frequency adverbs
+ "After {number:2,12} iterations, {pronounpersonal} {verbtransitive} the {nouncommon} {adverbmanner}.",
+ "Before launch, {pronounpersonal} {verbaction} {adverbtimedefinite}.",
+ "Eventually, the {nouncommon} {verbintransitive} {adverbmanner}.",
+ "Sometimes the {nouncommon} {verbintransitive} {adverbfrequencyindefinite}.",
+ "Weekly, {pronounpersonal} {verbtransitive} the {nouncommon} with {nouncommon}.",
+
+ // Product / UX flavored with adjectives & prepositions
+ "Guide {nouncommon} with {adjectivedescriptive} affordances.",
+ "Reduce cognitive load in the {nouncommon}.",
+ "Raise contrast where the {nouncommon} hides.",
+ "Align {nouncommon} with user intent.",
+ "Scope the {nouncommon} to fit the moment.",
+ "Map the happy path through {nouncommon}.",
+ "Remove first friction from the {nouncommon}.",
+ "Balance {productfeature} with {nouncommon}.",
+ "Prefer predictable {nouncommon} over surprising {nouncommon}.",
+ "Compose {nouncommon} from simple parts.",
+
+ // Data / measurement with adverbs and verbs
+ "Establish a baseline for {nouncommon}.",
+ "Set a realistic target for {nouncommon}.",
+ "Track {nouncommon} over time {adverbfrequencydefinite}.",
+ "Alert on {nouncommon} thresholds {adverbtimedefinite}.",
+ "Attribute gains to {nouncommon} where possible.",
+ "Sample {nouncommon} at {number:1,60}s intervals.",
+ "Compare {nouncommon} before and after you {verbtransitive}.",
+ "Visualize {nouncommon} for faster decisions.",
+ "Archive stale {nouncommon} responsibly.",
+ "Instrument the {nouncommon} for observability.",
+
+ // Reliability / ops with adverbs & prepositions
+ "Design for failure and graceful {nouncommon}.",
+ "Create a fallback for {nouncommon}.",
+ "Rate-limit {nouncommon} by default.",
+ "Defer {nouncommon} during peak load.",
+ "Decompose {nouncommon} into smaller {nouncommon}.",
+ "Guard {nouncommon} with sensible limits.",
+ "Budget latency for {nouncommon}.",
+ "Stage {nouncommon} behind feature flags.",
+ "Automate {nouncommon} recovery {adverbmanner}.",
+ "Practice {nouncommon} drills regularly.",
+
+ // Collaboration / communication using connectives & pronouns
+ "Write the one-sentence summary for the {nouncommon}.",
+ "Share the decision record for the {nouncommon}.",
+ "Draw a diagram for the {nouncommon} {adverbmanner}.",
+ "Clarify ownership of the {nouncommon} {adverbtimeindefinite}.",
+ "Surface risks around the {nouncommon} {adverbdegree}.",
+ "State assumptions behind the {nouncommon}.",
+ "Invite review for the {nouncommon} in {city}.",
+ "Close the loop on the {nouncommon}.",
+ "Publish a changelog entry for the {nouncommon}.",
+ "Celebrate wins tied to the {nouncommon}.",
+
+ // Place / time flavor with prepositions and adverbs
+ "Mornings in {city} favor {nouncommon}.",
+ "Evenings in {city} invite quieter {nouncommon}.",
+ "Weekends reserve time for {hobby} and {nouncommon}.",
+ "Launch the {nouncommon} midweek for clarity.",
+ "Review the {nouncommon} every {number:1,4} weeks.",
+ "Retire outdated {nouncommon} each quarter.",
+ "Short feedback loops {verbaction} {nouncommon} {adverbmanner}.",
+ "Warm starts beat cold {nouncommon}.",
+
+ // Emphatic / interjectional
+ "{interjection}! Ship the {nouncommon} now!",
+ "{interjection}! Great progress on {nouncommon}!",
+ "Onward to better {nouncommon}!",
+ "Mind the {nouncommon}, then celebrate!",
+ },
+ "phrase": {"what's yer poison", "time will tell", "I'm good", "nice to meet you", "spring forward, fall back", "what's your job", "once or twice", "you could have fooled me", "what's your name", "why not Zoidberg", "time you got a watch", "I'm Hindu", "fair play", "what's your phone number", "after the jump", "cease fire", "as ever", "I'm hot", "best of", "get well soon", "what's your poison", "when is closing time", "yes and amen", "you don't dip your pen in the company inkwell", "I'm hungry", "short of", "what's yours", "duces tecum", "after you", "yes and no", "I'm in love with you", "the pants off", "I'm Jewish", "few sandwiches short of a picnic", "shut the front door", "does a bear shit in the woods", "the party is over", "tomayto tomahto", "I'm looking for a grocery store", "does anyone here speak English", "heads I win, tails you lose", "I'm looking for a job", "stick a fork in it", "the penny drops", "I'm lost", "shut up and take my money", "mind you", "I'm married", "isn't it so", "wham-bam-thank-you-ma'am", "does not compute", "hold your fire", "pardon me", "mind your own beeswax", "I'm mute", "does someone look like", "I'm not being funny", "leave me alone", "going once, going twice, sold", "you get that", "I'm not interested", "talk about", "here be dragons", "always a bridesmaid, never a bride", "the plot thickens", "close, but no cigar", "I'm not religious", "ultra vires", "bound to", "always the bridesmaid, never the bride", "the plural of anecdote is not data", "I'm pregnant", "comedy equals tragedy plus time", "get you", "heads will roll", "all to the better", "I'm rubber, you're glue", "going to", "when push comes to shove", "you had to be there", "I'm scared", "you have beautiful eyes", "enjoy your meal", "I'm sick", "doesn't have both oars in the water", "you have the advantage of me", "here lies", "check is in the mail", "I'm single", "stick 'em up", "when the chips are down", "you just had to", "that'll be the day", "I'm sorry", "very good", "lather, rinse, repeat", "you kiss your mother with that mouth", "that'll do", "the rabbit died", "I'm straight", "in order for", "when the going gets weird, the weird turn pro", "I'm thirsty", "the rest is history", "it depends", "I'm tired", "in order to", "monkeys might fly out of my butt", "oh my life", "do want", "would it hurt", "you know what", "here you are", "all wool and a yard wide", "hit it", "pound for pound", "bottom falls out", "OK yah", "would it kill someone", "you know what I mean", "here you go", "alone in a crowd", "me neither", "chin up", "to be continued", "I'm twenty years old", "such is life", "off with someone's head", "Lord knows", "case closed", "you know what they say", "you've got to laugh", "ten points to Gryffindor", "that's a relief", "I'm worried", "kill the rabbit", "live and learn", "would not throw someone out of bed", "catch you later", "that's a wrap", "the rubber meets the road", "to be honest", "I'm your huckleberry", "off with their head", "you learn something new every day", "catch you on the flip side", "all your base are belong to us", "that's all", "horses for courses", "to be named later", "good night", "would you mind putting on your seat belt", "easy does it", "that's all she wrote", "me too", "oh noes", "that's for me to know and you to find out", "to be truthful", "still got one's communion money", "do you accept American dollars", "winner, winner, chicken dinner", "workers of the world, unite", "speak of the devil", "you must be fun at parties", "that's it", "hit me", "how about that", "ding, ding, ding, we have a winner", "do you accept credit cards", "word has it", "woulda, coulda, shoulda", "you must be new here", "how are you", "do you believe in God", "woulda, shoulda, coulda", "that's life", "safety in numbers", "how are you doing", "do you come here often", "worm has turned", "you never know", "that's my", "how are you getting along", "leave well enough alone", "do you have a boyfriend", "that's saying something", "the shoe is on the other foot", "this is someone", "do you have a girlfriend", "Lord only knows", "that's that", "check yourself before you wreck yourself", "this is the life", "how can you sleep at night", "wake up and die right", "do you have a menu in English", "that's the bunny", "the show must go on", "this is where we came in", "nod's as good as a wink to a blind bat", "wake up and smell the ashes", "on the huh", "do you have any brothers or sisters", "dogs bark", "worm turns", "that's the spirit", "this just in", "how did he die", "more like", "do you have any pets", "alright me babber", "Elvis has left the building", "this means war", "how do", "she could be his mother", "do you have children", "alright me lover", "that's the ticket", "how do I get to", "shoulda, coulda, woulda", "nome sane", "guess what", "whenever one turns around", "do you have Wi-Fi", "alright my babber", "the story goes", "how do I get to the airport", "shoulda, woulda, coulda", "do you kiss your mother with that mouth", "Lord willing and the creek don't rise", "you said it", "alright my lover", "how do I get to the bus station", "ask me one on sport", "need I say more", "sounds like a plan", "put that in your pipe and smoke it", "do you know", "take a picture, it will last longer", "the streets are paved with gold", "how do I get to the train station", "ask my arse", "stop the car", "do you know who I am", "wouldn't you know", "you shouldn't have", "how do ye do", "fans are slans", "use one's coconut", "bit by a barn mouse", "stick that in your pipe and smoke it", "do you mind", "but for the grace of God", "wouldn't you know it", "head in the sand", "the terrorists will have won", "how do you do", "please excuse my dear Aunt Sally", "much of a muchness", "bless someone's cotton socks", "do you need help", "or else", "dress for the slide, not the ride", "that's wassup", "the thick plottens", "much to be said", "bless someone's heart", "a blessing and a curse", "do you speak English", "you think", "that's what I'm talking about", "how do you like that", "art imitates life", "please help me", "five will get you ten", "do you think you can walk", "or so", "that's what she said", "the thing is", "how do you like them apples", "please pass the salt", "I've been robbed", "nature calls", "a boon and a bane", "but me no buts", "or something", "you welcome", "that's what's up", "how do you pronounce this word", "fare thee well", "please repeat after me", "I've been shot", "pot, meet kettle", "a boon or a bane", "where are the snows of yesteryear", "or what", "rolling in it", "the toilet is clogged", "how do you say...in English", "circle gets the square", "more than someone has had hot dinners", "please say that again", "I've burned myself", "different strokes", "where are the toilets", "or words to that effect", "you win", "how do you spell this word", "to hell with", "in virtue of which", "please sit down", "where are we", "out to", "am I right", "please speak more slowly", "I've lost my keys", "where are we going", "but who's counting", "you wish", "am I right or am I right", "how goes it", "methinks the lady doth protest too much", "please turn left", "could be written on the back of a postage stamp", "I've never heard it called that before", "where are you", "you wish, jellyfish", "am I under arrest", "methinks thou dost protest too much", "please turn right", "bang to rights", "gimme a break", "where are you from", "revenge is sweet", "'tis the season", "pull the other one", "where are your parents", "out with it", "have a good one", "how long is a piece of string", "ay up me duck", "before you can say Jack Robinson", "pull the other one, it's got bells on", "where away", "only time will tell", "could fit on the back of a postage stamp", "before you can say knife", "pull the other one, it's got brass bells on", "where can I find a hotel", "the wheels came off", "angel passes", "how many languages do you speak", "could go all day", "sleep tight", "nature vs nurture", "practice, practice, practice", "where do I sign up", "help is on the way", "many thanks", "the wheels came off the bus", "mercy bucket", "how many siblings do you have", "pleased to meet you", "could have fooled me", "where do you live", "the wheels came off the wagon", "mercy buckets", "where do you live at", "you'd better believe it", "than a bygod", "the wheels fell off", "could have, would have, should have", "where does it hurt", "hell if I know", "you'd complain if you were hung with a new rope", "the wheels fell off the bus", "every good boy deserves fudge", "could I see the menu, please", "where does this bus go", "help wanted", "the wheels fell off the wagon", "how much do I owe you", "where does this train go", "how much do you charge", "steady as she goes", "put the same shoe on every foot", "where have you been", "temper temper", "how much does it cost", "coulda, shoulda, woulda", "give credit where credit is due", "boom goes the dynamite", "where is the toilet", "how much is it", "in your dreams", "coulda, woulda, shoulda", "what a lovely day", "to save one's life", "exsqueeze me", "like a martin to his gourd", "what a pity", "you'll be late for your own funeral", "every man for himself", "size matters"},
+ "comment": {
+ // Quick reactions
+ "{interjection}",
+ "{interjection}! nice",
+ "wow {adjective}",
+ "solid",
+ "good call",
+ "love it",
+ "clean move",
+ "tight work",
+ "so smooth",
+ "neat",
+
+ // Positive feedback
+ "{interjection}, this {noun} is {adjective}",
+ "really like the {adjective} {noun}",
+ "love the {noun} vibe",
+ "nice {noun}, great {adjective} touch",
+ "{interjection}! {adjective} {noun} all around",
+ "great {noun} structure",
+ "smooth {noun} flow",
+ "balanced {noun} and {noun}",
+ "that {noun} is {adjective}",
+ "good {noun} execution",
+
+ // Questions / curiosity
+ "does {noun} need to {verb}",
+ "why the {adjective} {noun}",
+ "could we {verb} the {noun} a bit",
+ "any reason {noun} should {verb}",
+ "how does this {noun} {verb}",
+ "what if we {verb} the {noun}",
+ "would a {adjective} {noun} help",
+ "where does the {noun} go",
+ "is {noun} supposed to {verb}",
+ "does this {noun} scale",
+
+ // Suggestions
+ "maybe {verb} the {noun} for {noun}",
+ "try {verb} with {noun}",
+ "let’s {verb} the {noun} and see",
+ "consider {adjective} {noun} over {noun}",
+ "lean into the {adjective} {noun}",
+ "pull back on the {adjective} {noun}",
+ "swap {noun} for {adjective} {noun}",
+ "add some {adjective} {noun}",
+ "replace {noun} with {noun}",
+ "simplify the {noun}",
+
+ // Trade-off / compare
+ "this favors {noun} over {noun}",
+ "strong {adjective} {noun}, weaker {noun}",
+ "more {noun}, less {noun} might work",
+ "balance {noun} with {adjective} {noun}",
+ "{interjection} — nice {noun}, watch the {noun}",
+ "trades {noun} for {adjective} {noun}",
+ "shift from {noun} toward {noun}",
+ "prioritize {noun} before {noun}",
+ "watch {noun} vs {noun}",
+ "weights {noun} higher than {noun}",
+
+ // Clarity / critique
+ "the {noun} feels {adjective}",
+ "scope the {noun} tighter",
+ "the {noun} goal is unclear",
+ "the {noun} could be simpler",
+ "the {noun} reads {adjective}",
+ "unclear {noun} boundaries",
+ "hard to follow {noun}",
+ "the {noun} seems overloaded",
+ "maybe lighten the {noun}",
+ "focus the {noun}",
+
+ // Performance / reliability
+ "{noun} looks {adjective} under load",
+ "{noun} might {verb} under stress",
+ "watch {noun} when we {verb}",
+ "{interjection}, {noun} spikes when {verb}",
+ "handle {noun} if it {verb}s",
+ "the {noun} might break when {verb}",
+ "test {noun} under {adjective} load",
+ "safe {noun}, careful with {noun}",
+ "optimize {noun} when {verb}",
+ "guard {noun} against {verb}",
+
+ // Style / tone
+ "consistent {noun}, good rhythm",
+ "the {adjective} {noun} sets the tone",
+ "{noun} and {noun} land well",
+ "keep the {noun} crisp",
+ "the {noun} feels polished",
+ "love the {adjective} {noun} energy",
+ "stylish {noun} layout",
+ "sharp {noun} edges",
+ "smooth {noun} finish",
+ "elegant {noun} use",
+
+ // Narrative / longer thoughts
+ "after seeing this {noun}, maybe {verb} the {noun} and adjust the {adjective} {noun}",
+ "the {noun} could benefit from {verb} before adding more {adjective} {noun}",
+ "if we {verb} the {noun} first, the {noun} might feel more {adjective}",
+ "really liking how the {adjective} {noun} ties to the {noun}",
+ "feels like {noun} wants to {verb} before we add {noun}",
+ "this {noun} sets a strong base, but {noun} could still {verb}",
+ "we might {verb} the {noun} later if {noun} grows",
+ "the {noun} works well; curious if {noun} should {verb} next",
+ "could chain {verb} {noun} after {noun} for better flow",
+ "maybe {verb} {noun} once {noun} is {adjective}",
+ },
+ "quote": {
+ // Short aphorisms
+ `"less {noun}, more {noun}"`,
+ `"make the {noun} simple"`,
+ `"clarity over {noun}"`,
+ `"ship the {noun}"`,
+ `"trust the {adjective} {noun}"`,
+ `"move with {adjective} {noun}"`,
+ `"small {noun}, big impact"`,
+ `"choose useful {noun}"`,
+ `"iterate the {noun}"`,
+ `"defaults are decisions"`,
+
+ // Imperatives
+ `"keep the {noun} crisp"`,
+ `"name the {noun}, then {verb}"`,
+ `"measure the {noun} you {verb}"`,
+ `"start with {noun}, end with {noun}"`,
+ `"protect the {noun} under stress"`,
+ `"pair {noun} with {adjective} {noun}"`,
+ `"reduce the {noun} until it hurts, then stop"`,
+ `"focus on {productfeature}, trim the rest"`,
+ `"pick the {adjective} path and commit"`,
+ `"make {noun} boring and {noun} remarkable"`,
+
+ // Reflective
+ `"in {city}, the {noun} you {verb} becomes your {noun}"`,
+ `"after {number:3,12} attempts, the {noun} finally felt {adjective}"`,
+ `"from {country} to {city}, chasing better {noun}"`,
+ `"we are what we repeatedly {verb}"`,
+ `"the {adjective} {noun} was a choice, not a chance"`,
+ `"every {noun} hides a smaller {noun}"`,
+ `"constraints are the {noun} that shape {noun}"`,
+ `"the cost of {noun} is usually hidden in {noun}"`,
+ `"we borrowed {noun} from the future to ship today"`,
+ `"quality is a series of {adjective} decisions"`,
+
+ // Questions
+ `"what problem does this {noun} solve"`,
+ `"why this {noun} and not that {noun}"`,
+ `"how would this {noun} {verb} at scale"`,
+ `"what breaks when {noun} {verb}s"`,
+ `"who owns the {noun} after launch"`,
+ `"is the {noun} doing too much"`,
+ `"which {noun} matters right now"`,
+ `"does {noun} help the {noun} or distract it"`,
+ `"what happens if we remove this {noun}"`,
+ `"are we optimizing the wrong {noun}"`,
+
+ // Humor / light
+ `"make {noun}, not meetings"`,
+ `"add {adjective} {noun}; regret later"`,
+ `"it worked on my {noun}"`,
+ `"one more {noun}, then sleep"`,
+ `"documents are just {noun} with better {noun}"`,
+ `"naming is hard, {noun} is harder"`,
+ `"we {verb} the {noun} and called it agile"`,
+ `"the backlog is just {noun} with hopes"`,
+ `"today’s blocker is tomorrow’s {noun}"`,
+ `"I’ll refactor after {noun}"`,
+
+ // Work / craft
+ `"craft lives in the space between {noun} and {noun}"`,
+ `"discipline is the quiet {noun} behind excellence"`,
+ `"habits turn {noun} into momentum"`,
+ `"precision is {adjective} kindness"`,
+ `"consistency beats {adjective} bursts"`,
+ `"ownership begins where excuses end"`,
+ `"feedback is a mirror for {noun}"`,
+ `"slow is smooth, smooth is {adjective}"`,
+ `"systems scale, heroics do not"`,
+ `"we get the {noun} we reward"`,
+
+ // Tech / dev flavored
+ `"delete the {noun}, not the clarity"`,
+ `"latency is a {noun} tax"`,
+ `"naming, caching, and {noun}—pick two"`,
+ `"pragmatism beats perfect {noun}"`,
+ `"make the happy path obvious"`,
+ `"logs are stories your {noun} tells"`,
+ `"APIs are just promises about {noun}"`,
+ `"complexity compounds like {noun}"`,
+ `"tests are confidence, not ceremony"`,
+ `"design for failure, celebrate {noun}"`,
+
+ // Creativity / design
+ `"constraints create character"`,
+ `"edit until the {noun} appears"`,
+ `"taste is trained attention"`,
+ `"contrast makes {noun} legible"`,
+ `"delight lives in the last {number:2,10}%"`,
+ `"the grid is a kind of kindness"`,
+ `"silence is also part of the {noun}"`,
+ `"good {noun} feels inevitable"`,
+ `"remove until it breaks, then add one {noun}"`,
+ `"friction reveals intent"`,
+
+ // Nature / metaphor
+ `"gardens, not garages: grow the {noun}"`,
+ `"rivers remember the path of {noun}"`,
+ `"sharp tools, soft hands"`,
+ `"winter disciplines, spring reveals"`,
+ `"build roots before branches"`,
+ `"polish is the weathering of {noun}"`,
+ `"stable soil makes brave {noun}"`,
+ `"light shows what {noun} hides"`,
+ `"grain fights every careless {verb}"`,
+ `"measure twice, cut once"`,
+
+ // People / leadership
+ `"clear goals, kind {noun}"`,
+ `"trust is a backlog of kept promises"`,
+ `"argue like {adjective} peers, decide like {noun}"`,
+ `"praise in public, critique in private"`,
+ `"teams ship what they believe"`,
+ `"culture is the worst {noun} you tolerate"`,
+ `"leadership is {verb} the {noun} first"`,
+ `"alignment is the art of saying the same {noun}"`,
+ `"energy is contagious—so is {noun}"`,
+ `"hire for slope, teach the {noun}"`,
+
+ // Attribution variants
+ `"make it work, then make it right" — {firstname} {lastname}`,
+ `"simplicity scales better than cleverness" — {jobtitle} in {city}`,
+ `"focus is saying no to good {noun}" — {company}`,
+ `"good {productcategory} is just clear {noun}" — {firstname} {lastname}`,
+ `"optimize for trust before speed" — {jobtitle}`,
+ `"the roadmap is a story about {noun}" — {company} team`,
+ `"we shipped when {noun} felt {adjective}" — {firstname}`,
+ `"defaults shape behavior" — {firstname} {lastname} in {city}`,
+ `"names are the first UX" — {jobtitle} at {company}`,
+ `"choose boring tech, exciting {noun}" — {firstname} {lastname}`,
+ },
+ "question": {
+ // Ultra-short checks
+ "why this {noun}",
+ "how does this {noun} work",
+ "what changed",
+ "what is missing",
+ "who owns this {noun}",
+ "where does {noun} live",
+ "when does {noun} happen",
+ "is this {noun} necessary",
+ "does this {noun} scale",
+ "are we over-optimizing",
+
+ // Clarification / intent
+ "what problem does this {noun} solve",
+ "who is the {noun} for",
+ "what is the goal of this {noun}",
+ "how will we know {noun} is successful",
+ "what is the smallest {noun} that works",
+ "what is the success metric for this {noun}",
+ "which {noun} matters most right now",
+ "what is the scope of this {noun}",
+ "what assumptions are behind this {noun}",
+ "what constraints shape this {noun}",
+
+ // Why / rationale
+ "why this {noun} and not that {noun}",
+ "why now for this {noun}",
+ "why did we choose {adjective} {noun}",
+ "why is this {noun} the default",
+ "why keep this {noun} in {city}",
+ "why is {noun} coupled to {noun}",
+ "why does {company} prefer this {noun}",
+ "why not remove this {noun}",
+ "why prioritize this {noun} over {noun}",
+ "why is this {noun} hard",
+
+ // How / approach
+ "how would this {noun} {verb} at scale",
+ "how can we simplify this {noun}",
+ "how does {noun} interact with {noun}",
+ "how will {noun} fail",
+ "how do we test this {noun}",
+ "how can we break this {noun} safely",
+ "how do we make {noun} observable",
+ "how do we migrate from {noun} to {noun}",
+ "how will we monitor this {noun} in {country}",
+ "how do we roll back if {noun} breaks",
+
+ // Decision / trade-offs
+ "what are the trade-offs between {noun} and {noun}",
+ "what do we gain by choosing {noun}",
+ "what do we lose if we drop {noun}",
+ "which risks come with this {noun}",
+ "which {noun} is the constraint",
+ "what is the opportunity cost of {noun}",
+ "which {noun} should we do first",
+ "what is reversible about this {noun}",
+ "what is the cheapest way to try this {noun}",
+ "what would we choose if {number:1,10}x more users arrived",
+
+ // Performance / reliability
+ "what happens when {noun} {verb}s under load",
+ "where could {noun} become a bottleneck",
+ "how do we guard {noun} against {verb}",
+ "what is the latency budget for this {noun}",
+ "how does {noun} behave under {adjective} load",
+ "what fails if {noun} is slow",
+ "how do we detect {noun} regressions",
+ "can {noun} recover after {verb}",
+ "what is the fallback when {noun} fails",
+ "how do we rate-limit this {noun}",
+
+ // Product / UX / design
+ "who is the primary user of this {noun}",
+ "what is the happy path for this {noun}",
+ "where is the first friction in this {noun}",
+ "what is confusing about this {noun}",
+ "how does this {noun} reduce effort",
+ "what is the most common {noun} error",
+ "how does {color} affect this {noun}",
+ "which {productfeature} is essential",
+ "what is the minimum useful {productcategory}",
+ "how would a new user explain this {noun}",
+
+ // Data / measurement
+ "what will we measure for this {noun}",
+ "what is the baseline for this {noun}",
+ "what is a good target for this {noun}",
+ "which metric should move if we {verb} the {noun}",
+ "how do we attribute improvements to this {noun}",
+ "what data do we need before {verb}ing",
+ "how noisy is this {noun} metric",
+ "what is the sample size for this {noun}",
+ "how do we track {noun} over time",
+ "what is the alert threshold for {noun}",
+
+ // Planning / timeline
+ "what can we ship in {number:1,6} weeks",
+ "what is the critical path for this {noun}",
+ "what can slip without hurting {noun}",
+ "what depends on this {noun}",
+ "what is blocked by {noun}",
+ "when do we review this {noun}",
+ "what must happen before {verb}ing the {noun}",
+ "what is the rollout plan for this {noun}",
+
+ // People / ownership
+ "who decides if {noun} is done",
+ "who maintains this {noun}",
+ "who is on call for {noun}",
+ "who reviews changes to this {noun}",
+ "who approves {noun} in {company}",
+ "who needs to know about this {noun}",
+ "who can remove this {noun} safely",
+ "who pairs on this {noun} next",
+
+ // Alternatives / exploration
+ "what alternatives exist to {noun}",
+ "what is the simplest alternative to this {noun}",
+ "what if we did the opposite of {noun}",
+ "what if we delayed this {noun}",
+ "what if we automated this {noun}",
+ "what if we stopped doing this {noun}",
+ "what would this {noun} look like in {programminglanguage}",
+ "what happens if we move {noun} to {city}",
+
+ // Risk / failure / safety
+ "what is the worst outcome of this {noun}",
+ "what could go wrong with {noun}",
+ "how do we make {noun} safe to fail",
+ "what is our recovery plan for {noun}",
+ "what if {noun} never {verb}s",
+ "how do we contain a {noun} incident",
+ "what signs show {noun} is degrading",
+ "what is the cost of a {noun} outage",
+
+ // Cost / effort
+ "what is the ongoing cost of this {noun}",
+ "how much effort is {noun} to maintain",
+ "what can we drop to fund this {noun}",
+ "what is the cheapest experiment for this {noun}",
+ "what is the marginal gain from {noun}",
+ "what is the payoff time for this {noun}",
+
+ // Communication / docs
+ "what should the doc for this {noun} say",
+ "what is the single sentence that explains this {noun}",
+ "what diagram would clarify this {noun}",
+ "what is the changelog entry for this {noun}",
+ "what decision did we make about this {noun}",
+ "what questions remain about this {noun}",
+
+ // Domain flavored (optional but generic)
+ "how would {jobtitle} use this {noun}",
+ "how does this {noun} help {company}",
+ "what does {language} support look like for this {noun}",
+ "how does {hobby} influence this {noun}",
+ "what does this {noun} look like in {country}",
+ "where in {city} would this {noun} matter",
+ },
+}
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/time.go b/vendor/github.com/brianvoe/gofakeit/v7/datetime.go
similarity index 61%
rename from vendor/github.com/brianvoe/gofakeit/v7/time.go
rename to vendor/github.com/brianvoe/gofakeit/v7/datetime.go
index 55589034..4034d3a7 100644
--- a/vendor/github.com/brianvoe/gofakeit/v7/time.go
+++ b/vendor/github.com/brianvoe/gofakeit/v7/datetime.go
@@ -163,13 +163,14 @@ func timeZoneOffset(f *Faker) float32 {
return float32(value)
}
-// javaDateFormatToGolangDateFormat converts java date format into go date format
-func javaDateFormatToGolangDateFormat(format string) string {
+// javaDateTimeFormatToGolangFormat converts java date/time format into go date/time format
+func javaDateTimeFormatToGolangFormat(format string) string {
format = strings.Replace(format, "ddd", "_2", -1)
format = strings.Replace(format, "dd", "02", -1)
format = strings.Replace(format, "d", "2", -1)
format = strings.Replace(format, "HH", "15", -1)
+ format = strings.Replace(format, "H", "15", -1)
format = strings.Replace(format, "hh", "03", -1)
format = strings.Replace(format, "h", "3", -1)
@@ -213,10 +214,16 @@ func javaDateFormatToGolangDateFormat(format string) string {
func addDateTimeLookup() {
AddFuncLookup("date", Info{
Display: "Date",
- Category: "time",
+ Category: "datetime",
Description: "Representation of a specific day, month, and year, often used for chronological reference",
Example: "2006-01-02T15:04:05Z07:00",
Output: "string",
+ Aliases: []string{
+ "date string", "calendar date", "datetime", "timestamp", "chronological reference",
+ },
+ Keywords: []string{
+ "time", "day", "month", "year", "format", "rfc3339", "iso8601", "utc",
+ },
Params: []Param{
{
Field: "format",
@@ -259,17 +266,23 @@ func addDateTimeLookup() {
return f.Date().Format(time.RFC3339), nil
}
- return f.Date().Format(javaDateFormatToGolangDateFormat(format)), nil
+ return f.Date().Format(javaDateTimeFormatToGolangFormat(format)), nil
}
},
})
AddFuncLookup("daterange", Info{
- Display: "DateRange",
- Category: "time",
+ Display: "Date Range",
+ Category: "datetime",
Description: "Random date between two ranges",
- Example: "2006-01-02T15:04:05Z07:00",
+ Example: "1995-06-15T14:30:00Z",
Output: "string",
+ Aliases: []string{
+ "date interval", "date span", "date window", "between dates", "bounded period",
+ },
+ Keywords: []string{
+ "daterange", "range", "between", "date", "time", "random", "bounds", "limits", "window",
+ },
Params: []Param{
{
Field: "startdate",
@@ -298,7 +311,7 @@ func addDateTimeLookup() {
if err != nil {
return nil, err
}
- format = javaDateFormatToGolangDateFormat(format)
+ format = javaDateTimeFormatToGolangFormat(format)
startdate, err := info.GetString(m, "startdate")
if err != nil {
@@ -324,177 +337,362 @@ func addDateTimeLookup() {
AddFuncLookup("pastdate", Info{
Display: "PastDate",
- Category: "time",
+ Category: "datetime",
Description: "Date that has occurred before the current moment in time",
Example: "2007-01-24 13:00:35.820738079 +0000 UTC",
Output: "time",
- Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
- return pastDate(f), nil
+ Aliases: []string{
+ "past date", "historical date", "previous date", "earlier date", "prior time",
},
+ Keywords: []string{
+ "date", "time", "occurred", "elapsed", "gone", "expired", "finished", "completed",
+ },
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return pastDate(f), nil },
})
AddFuncLookup("futuredate", Info{
Display: "FutureDate",
- Category: "time",
+ Category: "datetime",
Description: "Date that has occurred after the current moment in time",
Example: "2107-01-24 13:00:35.820738079 +0000 UTC",
Output: "time",
- Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
- return futureDate(f), nil
+ Aliases: []string{
+ "future date", "upcoming date", "next date", "scheduled date", "later time",
},
+ Keywords: []string{
+ "future", "date", "time", "forthcoming", "prospective", "anticipated", "scheduled",
+ },
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return futureDate(f), nil },
})
AddFuncLookup("nanosecond", Info{
Display: "Nanosecond",
- Category: "time",
- Description: "Unit of time equal to One billionth (10^-9) of a second",
+ Category: "datetime",
+ Description: "Unit of time equal to one billionth (10^-9) of a second",
Example: "196446360",
Output: "int",
- Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
- return nanoSecond(f), nil
+ Aliases: []string{
+ "nano", "ns value", "tiny time", "ultra precision", "fractional second",
},
+ Keywords: []string{
+ "time", "unit", "second", "billionth", "ultra", "high", "resolution",
+ },
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return nanoSecond(f), nil },
})
AddFuncLookup("second", Info{
Display: "Second",
- Category: "time",
+ Category: "datetime",
Description: "Unit of time equal to 1/60th of a minute",
Example: "43",
Output: "int",
- Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
- return second(f), nil
+ Aliases: []string{
+ "second value", "sec unit", "time second", "sixtieth minute", "time slice",
},
+ Keywords: []string{
+ "time", "unit", "minute", "sixtieth", "duration", "interval", "sixty",
+ },
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return second(f), nil },
})
AddFuncLookup("minute", Info{
Display: "Minute",
- Category: "time",
+ Category: "datetime",
Description: "Unit of time equal to 60 seconds",
Example: "34",
Output: "int",
- Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
- return minute(f), nil
+ Aliases: []string{
+ "minute value", "time minute", "sixty seconds", "short period", "clock minute",
},
+ Keywords: []string{
+ "time", "unit", "60", "seconds", "duration", "interval", "sixtieth", "hour",
+ },
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return minute(f), nil },
})
AddFuncLookup("hour", Info{
Display: "Hour",
- Category: "time",
+ Category: "datetime",
Description: "Unit of time equal to 60 minutes",
Example: "8",
Output: "int",
- Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
- return hour(f), nil
+ Aliases: []string{
+ "hour value", "time hour", "sixty minutes", "clock hour", "time period",
},
+ Keywords: []string{
+ "time", "unit", "60", "minutes", "duration", "interval", "day",
+ },
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return hour(f), nil },
})
AddFuncLookup("day", Info{
Display: "Day",
- Category: "time",
+ Category: "datetime",
Description: "24-hour period equivalent to one rotation of Earth on its axis",
Example: "12",
Output: "int",
- Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
- return day(f), nil
+ Aliases: []string{
+ "calendar day", "day value", "earth rotation", "daily unit", "full day",
},
+ Keywords: []string{
+ "time", "unit", "axis", "24-hour", "calendar", "sunrise", "sunset",
+ },
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return day(f), nil },
})
AddFuncLookup("weekday", Info{
Display: "Weekday",
- Category: "time",
+ Category: "datetime",
Description: "Day of the week excluding the weekend",
Example: "Friday",
Output: "string",
- Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
- return weekDay(f), nil
+ Aliases: []string{
+ "weekday name", "business day", "work day", "monday to friday", "weekday label",
},
+ Keywords: []string{
+ "day", "week", "workday", "business", "calendar", "monday", "tuesday", "wednesday", "thursday", "friday",
+ },
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return weekDay(f), nil },
})
AddFuncLookup("month", Info{
Display: "Month",
- Category: "time",
+ Category: "datetime",
Description: "Division of the year, typically 30 or 31 days long",
Example: "1",
Output: "string",
- Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
- return month(f), nil
+ Aliases: []string{
+ "calendar month", "month value", "monthly unit", "date month", "time month",
},
+ Keywords: []string{
+ "year", "time", "30", "31", "days", "calendar", "period",
+ },
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return month(f), nil },
})
AddFuncLookup("monthstring", Info{
Display: "Month String",
- Category: "time",
- Description: "String Representation of a month name",
+ Category: "datetime",
+ Description: "String representation of a month name",
Example: "September",
Output: "string",
- Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
- return monthString(f), nil
+ Aliases: []string{
+ "month name", "calendar month name", "full month", "month label", "month string",
},
+ Keywords: []string{
+ "month", "string", "time", "representation", "january", "september", "december",
+ },
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return monthString(f), nil },
})
AddFuncLookup("year", Info{
Display: "Year",
- Category: "time",
+ Category: "datetime",
Description: "Period of 365 days, the time Earth takes to orbit the Sun",
Example: "1900",
Output: "int",
- Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
- return year(f), nil
+ Aliases: []string{
+ "calendar year", "annual period", "orbit year", "year value", "fiscal year",
},
+ Keywords: []string{
+ "time", "365", "days", "leap", "calendar", "decade", "century",
+ },
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return year(f), nil },
})
AddFuncLookup("timezone", Info{
Display: "Timezone",
- Category: "time",
+ Category: "datetime",
Description: "Region where the same standard time is used, based on longitudinal divisions of the Earth",
Example: "Kaliningrad Standard Time",
Output: "string",
- Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
- return timeZone(f), nil
+ Aliases: []string{
+ "time zone", "tz name", "standard time zone", "geographic zone", "regional time",
},
+ Keywords: []string{
+ "time", "earth", "utc", "gmt", "pst", "est", "cst", "mst", "dst",
+ },
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return timeZone(f), nil },
})
AddFuncLookup("timezoneabv", Info{
Display: "Timezone Abbreviation",
- Category: "time",
+ Category: "datetime",
Description: "Abbreviated 3-letter word of a timezone",
Example: "KST",
Output: "string",
- Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
- return timeZoneAbv(f), nil
+ Aliases: []string{
+ "timezone abbr", "tz short code", "abbreviated zone", "short tz name", "zone abbreviation",
},
+ Keywords: []string{
+ "time", "3-letter", "kst", "pst", "est", "gmt", "utc",
+ },
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return timeZoneAbv(f), nil },
})
AddFuncLookup("timezonefull", Info{
Display: "Timezone Full",
- Category: "time",
+ Category: "datetime",
Description: "Full name of a timezone",
Example: "(UTC+03:00) Kaliningrad, Minsk",
Output: "string",
- Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
- return timeZoneFull(f), nil
+ Aliases: []string{
+ "timezone full", "full tz name", "complete zone name", "long tz name", "detailed zone",
},
+ Keywords: []string{
+ "timezone", "full", "time", "standard", "format", "display", "utc", "gmt",
+ },
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return timeZoneFull(f), nil },
})
AddFuncLookup("timezoneoffset", Info{
Display: "Timezone Offset",
- Category: "time",
+ Category: "datetime",
Description: "The difference in hours from Coordinated Universal Time (UTC) for a specific region",
- Example: "3",
+ Example: "-5",
Output: "float32",
- Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
- return timeZoneOffset(f), nil
+ Aliases: []string{
+ "utc offset", "gmt offset", "tz shift", "time difference", "offset value",
},
+ Keywords: []string{
+ "timezone", "offset", "utc", "gmt", "plus", "minus", "east", "west",
+ },
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return timeZoneOffset(f), nil },
})
AddFuncLookup("timezoneregion", Info{
Display: "Timezone Region",
- Category: "time",
+ Category: "datetime",
Description: "Geographic area sharing the same standard time",
Example: "America/Alaska",
Output: "string",
+ Aliases: []string{
+ "region zone", "geo time region", "tz area", "regional timezone", "country zone",
+ },
+ Keywords: []string{
+ "timezone", "time", "america", "europe", "asia", "africa", "australia", "continent", "city",
+ },
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return timeZoneRegion(f), nil },
+ })
+
+ AddFuncLookup("time", Info{
+ Display: "Time",
+ Category: "datetime",
+ Description: "Random time string in the specified format",
+ Example: "14:30:25",
+ Output: "string",
+ Aliases: []string{
+ "time string", "clock time", "time format", "time value", "hour minute second",
+ },
+ Keywords: []string{
+ "clock", "hour", "minute", "second", "format", "24-hour", "12-hour", "am", "pm",
+ },
+ Params: []Param{
+ {
+ Field: "format",
+ Display: "Format",
+ Type: "string",
+ Default: "HH:mm:ss",
+ Options: []string{"HH:mm:ss", "HH:mm", "hh:mm:ss a", "hh:mm a", "H:mm", "h:mm a"},
+ Description: "Time format string. Supports Java time format patterns or Go time format patterns",
+ },
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
- return timeZoneRegion(f), nil
+ format, err := info.GetString(m, "format")
+ if err != nil {
+ return nil, err
+ }
+
+ // Convert java format to golang format
+ golangFormat := javaDateTimeFormatToGolangFormat(format)
+
+ // Create a time with today's date but random time
+ t := time.Date(2000, 1, 1, hour(f), minute(f), second(f), nanoSecond(f), time.UTC)
+
+ return t.Format(golangFormat), nil
+ },
+ })
+
+ AddFuncLookup("timerange", Info{
+ Display: "Time Range",
+ Category: "datetime",
+ Description: "Random time string between start and end times",
+ Example: "10:15:30",
+ Output: "string",
+ Aliases: []string{
+ "time interval", "time span", "time window", "between times", "bounded time",
+ },
+ Keywords: []string{
+ "timerange", "range", "between", "time", "start", "end", "bounds", "limits", "window",
+ },
+ Params: []Param{
+ {
+ Field: "starttime",
+ Display: "Start Time",
+ Type: "string",
+ Default: "00:00:00",
+ Description: "Start time string in the specified format",
+ },
+ {
+ Field: "endtime",
+ Display: "End Time",
+ Type: "string",
+ Default: "23:59:59",
+ Description: "End time string in the specified format",
+ },
+ {
+ Field: "format",
+ Display: "Format",
+ Type: "string",
+ Default: "HH:mm:ss",
+ Options: []string{"HH:mm:ss", "HH:mm", "hh:mm:ss a", "hh:mm a", "H:mm", "h:mm a"},
+ Description: "Time format string. Supports Java time format patterns or Go time format patterns",
+ },
+ },
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
+ format, err := info.GetString(m, "format")
+ if err != nil {
+ return nil, err
+ }
+
+ startTime, err := info.GetString(m, "starttime")
+ if err != nil {
+ return nil, err
+ }
+
+ endTime, err := info.GetString(m, "endtime")
+ if err != nil {
+ return nil, err
+ }
+
+ // Convert java format to golang format
+ golangFormat := javaDateTimeFormatToGolangFormat(format)
+
+ // Parse start and end times
+ start, err := time.Parse(golangFormat, startTime)
+ if err != nil {
+ // If parsing fails, use a default start time
+ start = time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC)
+ }
+
+ end, err := time.Parse(golangFormat, endTime)
+ if err != nil {
+ // If parsing fails, use a default end time
+ end = time.Date(2000, 1, 1, 23, 59, 59, 999999999, time.UTC)
+ }
+
+ // Generate random time between start and end
+ startNano := start.UnixNano()
+ endNano := end.UnixNano()
+
+ if startNano > endNano {
+ startNano, endNano = endNano, startNano
+ }
+
+ randomNano := int64(number(f, int(startNano), int(endNano)))
+ randomTime := time.Unix(0, randomNano).UTC()
+
+ return randomTime.Format(golangFormat), nil
},
})
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/emoji.go b/vendor/github.com/brianvoe/gofakeit/v7/emoji.go
index c9e9785e..c21ac28c 100644
--- a/vendor/github.com/brianvoe/gofakeit/v7/emoji.go
+++ b/vendor/github.com/brianvoe/gofakeit/v7/emoji.go
@@ -6,15 +6,32 @@ func Emoji() string { return emoji(GlobalFaker) }
// Emoji will return a random fun emoji
func (f *Faker) Emoji() string { return emoji(f) }
-func emoji(f *Faker) string { return getRandValue(f, []string{"emoji", "emoji"}) }
+func emoji(f *Faker) string {
+ // Explicit allow-list of emoji subgroups (sorted for deterministic behavior)
+ allowed := []string{
+ "animal",
+ "clothing",
+ "costume",
+ "electronics",
+ "face",
+ "flag",
+ "food",
+ "game",
+ "gesture",
+ "hand",
+ "job",
+ "landmark",
+ "music",
+ "person",
+ "plant",
+ "sport",
+ "tools",
+ "vehicle",
+ "weather",
+ }
-// EmojiDescription will return a random fun emoji description
-func EmojiDescription() string { return emojiDescription(GlobalFaker) }
-
-// EmojiDescription will return a random fun emoji description
-func (f *Faker) EmojiDescription() string { return emojiDescription(f) }
-
-func emojiDescription(f *Faker) string { return getRandValue(f, []string{"emoji", "description"}) }
+ return getRandValue(f, []string{"emoji", randomString(f, allowed)})
+}
// EmojiCategory will return a random fun emoji category
func EmojiCategory() string { return emojiCategory(GlobalFaker) }
@@ -40,6 +57,173 @@ func (f *Faker) EmojiTag() string { return emojiTag(f) }
func emojiTag(f *Faker) string { return getRandValue(f, []string{"emoji", "tag"}) }
+// EmojiFlag will return a random country flag emoji
+func EmojiFlag() string { return emojiFlag(GlobalFaker) }
+
+// EmojiFlag will return a random country flag emoji
+func (f *Faker) EmojiFlag() string { return emojiFlag(f) }
+
+func emojiFlag(f *Faker) string { return getRandValue(f, []string{"emoji", "flag"}) }
+
+// EmojiAnimal will return a random animal emoji
+func EmojiAnimal() string { return emojiAnimal(GlobalFaker) }
+
+// EmojiAnimal will return a random animal emoji
+func (f *Faker) EmojiAnimal() string { return emojiAnimal(f) }
+
+func emojiAnimal(f *Faker) string { return getRandValue(f, []string{"emoji", "animal"}) }
+
+// EmojiFood will return a random food emoji
+func EmojiFood() string { return emojiFood(GlobalFaker) }
+
+// EmojiFood will return a random food emoji
+func (f *Faker) EmojiFood() string { return emojiFood(f) }
+
+func emojiFood(f *Faker) string { return getRandValue(f, []string{"emoji", "food"}) }
+
+// EmojiPlant will return a random plant emoji
+func EmojiPlant() string { return emojiPlant(GlobalFaker) }
+
+// EmojiPlant will return a random plant emoji
+func (f *Faker) EmojiPlant() string { return emojiPlant(f) }
+
+func emojiPlant(f *Faker) string { return getRandValue(f, []string{"emoji", "plant"}) }
+
+// EmojiMusic will return a random music-related emoji
+func EmojiMusic() string { return emojiMusic(GlobalFaker) }
+
+// EmojiMusic will return a random music-related emoji
+func (f *Faker) EmojiMusic() string { return emojiMusic(f) }
+
+func emojiMusic(f *Faker) string { return getRandValue(f, []string{"emoji", "music"}) }
+
+// EmojiVehicle will return a random vehicle/transport emoji
+func EmojiVehicle() string { return emojiVehicle(GlobalFaker) }
+
+// EmojiVehicle will return a random vehicle/transport emoji
+func (f *Faker) EmojiVehicle() string { return emojiVehicle(f) }
+
+func emojiVehicle(f *Faker) string { return getRandValue(f, []string{"emoji", "vehicle"}) }
+
+// EmojiSport will return a random sports emoji
+func EmojiSport() string { return emojiSport(GlobalFaker) }
+
+// EmojiSport will return a random sports emoji
+func (f *Faker) EmojiSport() string { return emojiSport(f) }
+
+func emojiSport(f *Faker) string { return getRandValue(f, []string{"emoji", "sport"}) }
+
+// EmojiFace will return a random face emoji
+func EmojiFace() string { return emojiFace(GlobalFaker) }
+
+// EmojiFace will return a random face emoji
+func (f *Faker) EmojiFace() string { return emojiFace(f) }
+
+func emojiFace(f *Faker) string { return getRandValue(f, []string{"emoji", "face"}) }
+
+// EmojiHand will return a random hand emoji
+func EmojiHand() string { return emojiHand(GlobalFaker) }
+
+// EmojiHand will return a random hand emoji
+func (f *Faker) EmojiHand() string { return emojiHand(f) }
+
+func emojiHand(f *Faker) string { return getRandValue(f, []string{"emoji", "hand"}) }
+
+// EmojiClothing will return a random clothing or accessory emoji
+func EmojiClothing() string { return emojiClothing(GlobalFaker) }
+
+// EmojiClothing will return a random clothing or accessory emoji
+func (f *Faker) EmojiClothing() string { return emojiClothing(f) }
+
+func emojiClothing(f *Faker) string { return getRandValue(f, []string{"emoji", "clothing"}) }
+
+// EmojiLandmark will return a random landmark or place emoji
+func EmojiLandmark() string { return emojiLandmark(GlobalFaker) }
+
+// EmojiLandmark will return a random landmark or place emoji
+func (f *Faker) EmojiLandmark() string { return emojiLandmark(f) }
+
+func emojiLandmark(f *Faker) string { return getRandValue(f, []string{"emoji", "landmark"}) }
+
+// EmojiElectronics will return a random electronics/media device emoji
+func EmojiElectronics() string { return emojiElectronics(GlobalFaker) }
+
+// EmojiElectronics will return a random electronics/media device emoji
+func (f *Faker) EmojiElectronics() string { return emojiElectronics(f) }
+
+func emojiElectronics(f *Faker) string { return getRandValue(f, []string{"emoji", "electronics"}) }
+
+// EmojiGame will return a random game/leisure emoji
+func EmojiGame() string { return emojiGame(GlobalFaker) }
+
+// EmojiGame will return a random game/leisure emoji
+func (f *Faker) EmojiGame() string { return emojiGame(f) }
+
+func emojiGame(f *Faker) string { return getRandValue(f, []string{"emoji", "game"}) }
+
+// EmojiTools will return a random tools/weapons emoji
+func EmojiTools() string { return emojiTools(GlobalFaker) }
+
+// EmojiTools will return a random tools/weapons emoji
+func (f *Faker) EmojiTools() string { return emojiTools(f) }
+
+func emojiTools(f *Faker) string { return getRandValue(f, []string{"emoji", "tools"}) }
+
+// EmojiWeather will return a random weather/celestial emoji
+func EmojiWeather() string { return emojiWeather(GlobalFaker) }
+
+// EmojiWeather will return a random weather/celestial emoji
+func (f *Faker) EmojiWeather() string { return emojiWeather(f) }
+
+func emojiWeather(f *Faker) string { return getRandValue(f, []string{"emoji", "weather"}) }
+
+// EmojiJob will return a random job/occupation emoji
+func EmojiJob() string { return emojiJob(GlobalFaker) }
+
+// EmojiJob will return a random job/occupation emoji
+func (f *Faker) EmojiJob() string { return emojiJob(f) }
+
+func emojiJob(f *Faker) string { return getRandValue(f, []string{"emoji", "job"}) }
+
+// EmojiPerson will return a random person variant emoji
+func EmojiPerson() string { return emojiPerson(GlobalFaker) }
+
+// EmojiPerson will return a random person variant emoji
+func (f *Faker) EmojiPerson() string { return emojiPerson(f) }
+
+func emojiPerson(f *Faker) string { return getRandValue(f, []string{"emoji", "person"}) }
+
+// EmojiGesture will return a random gesture emoji
+func EmojiGesture() string { return emojiGesture(GlobalFaker) }
+
+// EmojiGesture will return a random gesture emoji
+func (f *Faker) EmojiGesture() string { return emojiGesture(f) }
+
+func emojiGesture(f *Faker) string { return getRandValue(f, []string{"emoji", "gesture"}) }
+
+// EmojiCostume will return a random costume/fantasy emoji
+func EmojiCostume() string { return emojiCostume(GlobalFaker) }
+
+// EmojiCostume will return a random costume/fantasy emoji
+func (f *Faker) EmojiCostume() string { return emojiCostume(f) }
+
+func emojiCostume(f *Faker) string { return getRandValue(f, []string{"emoji", "costume"}) }
+
+// EmojiSentence will return a random sentence with emojis interspersed
+func EmojiSentence() string { return emojiSentence(GlobalFaker) }
+
+// EmojiSentence will return a random sentence with emojis interspersed
+func (f *Faker) EmojiSentence() string { return emojiSentence(f) }
+
+func emojiSentence(f *Faker) string {
+ sentence, err := generate(f, getRandValue(f, []string{"emoji", "sentence"}))
+ if err != nil {
+ return ""
+ }
+
+ return sentence
+}
+
func addEmojiLookup() {
AddFuncLookup("emoji", Info{
Display: "Emoji",
@@ -47,28 +231,37 @@ func addEmojiLookup() {
Description: "Digital symbol expressing feelings or ideas in text messages and online chats",
Example: "🤣",
Output: "string",
+ Aliases: []string{
+ "emoticon symbol",
+ "chat icon",
+ "unicode pictograph",
+ "emotional glyph",
+ "digital expression",
+ },
+ Keywords: []string{
+ "symbol", "text", "message", "online", "chats", "ideas", "feelings", "digital", "reaction",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return emoji(f), nil
},
})
- AddFuncLookup("emojidescription", Info{
- Display: "Emoji Description",
- Category: "emoji",
- Description: "Brief explanation of the meaning or emotion conveyed by an emoji",
- Example: "face vomiting",
- Output: "string",
- Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
- return emojiDescription(f), nil
- },
- })
-
AddFuncLookup("emojicategory", Info{
Display: "Emoji Category",
Category: "emoji",
Description: "Group or classification of emojis based on their common theme or use, like 'smileys' or 'animals'",
Example: "Smileys & Emotion",
Output: "string",
+ Aliases: []string{
+ "emoji group",
+ "emoji theme",
+ "emoji section",
+ "emoji classification",
+ "emoji grouping",
+ },
+ Keywords: []string{
+ "emoji", "smileys", "emotion", "animals", "theme", "classification", "set", "category", "collection",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return emojiCategory(f), nil
},
@@ -80,6 +273,16 @@ func addEmojiLookup() {
Description: "Alternative name or keyword used to represent a specific emoji in text or code",
Example: "smile",
Output: "string",
+ Aliases: []string{
+ "emoji nickname",
+ "emoji shorthand",
+ "emoji label",
+ "emoji alt text",
+ "emoji identifier",
+ },
+ Keywords: []string{
+ "emoji", "alias", "smile", "code", "specific", "represent", "alternative", "keyword", "mapping",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return emojiAlias(f), nil
},
@@ -91,8 +294,279 @@ func addEmojiLookup() {
Description: "Label or keyword associated with an emoji to categorize or search for it easily",
Example: "happy",
Output: "string",
+ Aliases: []string{
+ "emoji keyword",
+ "emoji marker",
+ "emoji label",
+ "emoji hashtag",
+ "emoji reference",
+ },
+ Keywords: []string{
+ "emoji", "tag", "happy", "associated", "categorize", "search", "label", "index", "metadata",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return emojiTag(f), nil
},
})
+
+ AddFuncLookup("emojiflag", Info{
+ Display: "Emoji Flag",
+ Category: "emoji",
+ Description: "Unicode symbol representing a specific country's flag",
+ Example: "🇺🇸",
+ Output: "string",
+ Aliases: []string{"country flag", "flag emoji", "national flag"},
+ Keywords: []string{"emoji", "flag", "country", "national", "unicode", "symbol", "banner"},
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
+ return emojiFlag(f), nil
+ },
+ })
+
+ AddFuncLookup("emojianimal", Info{
+ Display: "Emoji Animal",
+ Category: "emoji",
+ Description: "Unicode symbol representing an animal",
+ Example: "🐌",
+ Output: "string",
+ Aliases: []string{"animal emoji", "creature emoji", "wildlife emoji"},
+ Keywords: []string{"emoji", "animal", "creature", "wildlife", "pet", "nature", "zoo", "mammal"},
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
+ return emojiAnimal(f), nil
+ },
+ })
+
+ AddFuncLookup("emojifood", Info{
+ Display: "Emoji Food",
+ Category: "emoji",
+ Description: "Unicode symbol representing food or drink",
+ Example: "🍾",
+ Output: "string",
+ Aliases: []string{"food emoji", "drink emoji", "meal emoji"},
+ Keywords: []string{"emoji", "food", "drink", "meal", "snack", "beverage", "cuisine", "restaurant"},
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
+ return emojiFood(f), nil
+ },
+ })
+
+ AddFuncLookup("emojiplant", Info{
+ Display: "Emoji Plant",
+ Category: "emoji",
+ Description: "Unicode symbol representing a plant, flower, or tree",
+ Example: "🌻",
+ Output: "string",
+ Aliases: []string{"plant emoji", "flower emoji", "tree emoji"},
+ Keywords: []string{"emoji", "plant", "flower", "tree", "nature", "botanical", "leaf", "garden"},
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
+ return emojiPlant(f), nil
+ },
+ })
+
+ AddFuncLookup("emojimusic", Info{
+ Display: "Emoji Music",
+ Category: "emoji",
+ Description: "Unicode symbol representing music or musical instruments",
+ Example: "🎵",
+ Output: "string",
+ Aliases: []string{"music emoji", "instrument emoji", "audio emoji"},
+ Keywords: []string{"emoji", "music", "instrument", "audio", "song", "sound", "melody"},
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
+ return emojiMusic(f), nil
+ },
+ })
+
+ AddFuncLookup("emojivehicle", Info{
+ Display: "Emoji Vehicle",
+ Category: "emoji",
+ Description: "Unicode symbol representing vehicles or transportation",
+ Example: "🚗",
+ Output: "string",
+ Aliases: []string{"vehicle emoji", "transport emoji", "transportation emoji"},
+ Keywords: []string{"emoji", "vehicle", "transport", "transportation", "car", "train", "plane", "boat"},
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
+ return emojiVehicle(f), nil
+ },
+ })
+
+ AddFuncLookup("emojisport", Info{
+ Display: "Emoji Sport",
+ Category: "emoji",
+ Description: "Unicode symbol representing sports, activities, or awards",
+ Example: "⚽",
+ Output: "string",
+ Aliases: []string{"sport emoji", "sports emoji", "activity emoji"},
+ Keywords: []string{"emoji", "sport", "activity", "game", "award", "team", "fitness", "exercise"},
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
+ return emojiSport(f), nil
+ },
+ })
+
+ AddFuncLookup("emojiface", Info{
+ Display: "Emoji Face",
+ Category: "emoji",
+ Description: "Unicode symbol representing faces/smileys (including cat/creature faces)",
+ Example: "😀",
+ Output: "string",
+ Aliases: []string{"face emoji", "smiley emoji", "cat face emoji"},
+ Keywords: []string{"emoji", "face", "smiley", "emotion", "expression", "cat", "creature"},
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
+ return emojiFace(f), nil
+ },
+ })
+
+ AddFuncLookup("emojihand", Info{
+ Display: "Emoji Hand",
+ Category: "emoji",
+ Description: "Unicode symbol representing hand gestures and hand-related symbols",
+ Example: "👍",
+ Output: "string",
+ Aliases: []string{"hand emoji", "gesture emoji", "hand symbol"},
+ Keywords: []string{"emoji", "hand", "gesture", "thumbs", "fingers", "clap", "pray"},
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
+ return emojiHand(f), nil
+ },
+ })
+
+ AddFuncLookup("emojiclothing", Info{
+ Display: "Emoji Clothing",
+ Category: "emoji",
+ Description: "Unicode symbol representing clothing and accessories",
+ Example: "👗",
+ Output: "string",
+ Aliases: []string{"clothing emoji", "accessory emoji", "garment emoji", "wardrobe emoji"},
+ Keywords: []string{"emoji", "clothing", "apparel", "accessory", "shoes", "hat", "jewelry"},
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
+ return emojiClothing(f), nil
+ },
+ })
+
+ AddFuncLookup("emojilandmark", Info{
+ Display: "Emoji Landmark",
+ Category: "emoji",
+ Description: "Unicode symbol representing landmarks and notable places/buildings",
+ Example: "🗽",
+ Output: "string",
+ Aliases: []string{"landmark emoji", "place emoji", "building emoji"},
+ Keywords: []string{"emoji", "landmark", "place", "building", "monument", "site"},
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
+ return emojiLandmark(f), nil
+ },
+ })
+
+ AddFuncLookup("emojielectronics", Info{
+ Display: "Emoji Electronics",
+ Category: "emoji",
+ Description: "Unicode symbol representing electronic and media devices",
+ Example: "💻",
+ Output: "string",
+ Aliases: []string{"electronics emoji", "device emoji", "media emoji"},
+ Keywords: []string{"emoji", "electronics", "device", "media", "computer", "phone", "camera"},
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
+ return emojiElectronics(f), nil
+ },
+ })
+
+ AddFuncLookup("emojigame", Info{
+ Display: "Emoji Game",
+ Category: "emoji",
+ Description: "Unicode symbol representing games and leisure",
+ Example: "🎮",
+ Output: "string",
+ Aliases: []string{"game emoji", "leisure emoji", "gaming emoji", "play emoji"},
+ Keywords: []string{"emoji", "game", "leisure", "cards", "dice", "puzzle", "toy"},
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
+ return emojiGame(f), nil
+ },
+ })
+
+ AddFuncLookup("emojitools", Info{
+ Display: "Emoji Tools",
+ Category: "emoji",
+ Description: "Unicode symbol representing tools or similar equipment",
+ Example: "🔨",
+ Output: "string",
+ Aliases: []string{"tool emoji", "equipment emoji", "hardware emoji", "repair emoji"},
+ Keywords: []string{"emoji", "tools", "equipment", "hardware", "fix", "build"},
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
+ return emojiTools(f), nil
+ },
+ })
+
+ AddFuncLookup("emojiweather", Info{
+ Display: "Emoji Weather",
+ Category: "emoji",
+ Description: "Unicode symbol representing weather and celestial bodies",
+ Example: "☀️",
+ Output: "string",
+ Aliases: []string{"weather emoji", "sky emoji", "forecast emoji", "climate emoji"},
+ Keywords: []string{"emoji", "weather", "sky", "celestial", "cloud", "rain", "sun"},
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
+ return emojiWeather(f), nil
+ },
+ })
+
+ AddFuncLookup("emojijob", Info{
+ Display: "Emoji Job",
+ Category: "emoji",
+ Description: "Unicode symbol representing people in a role of employment",
+ Example: "🧑💻",
+ Output: "string",
+ Aliases: []string{"job emoji", "occupation emoji", "career emoji", "profession emoji"},
+ Keywords: []string{"emoji", "job", "role", "profession", "worker", "person"},
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
+ return emojiJob(f), nil
+ },
+ })
+
+ AddFuncLookup("emojiperson", Info{
+ Display: "Emoji Person",
+ Category: "emoji",
+ Description: "Unicode symbol representing human person variants",
+ Example: "👩",
+ Output: "string",
+ Aliases: []string{"person emoji", "human emoji", "adult emoji", "child emoji"},
+ Keywords: []string{"emoji", "person", "human", "man", "woman", "adult", "child"},
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
+ return emojiPerson(f), nil
+ },
+ })
+
+ AddFuncLookup("emojigesture", Info{
+ Display: "Emoji Gesture",
+ Category: "emoji",
+ Description: "Unicode symbol representing person gestures/poses",
+ Example: "🙋",
+ Output: "string",
+ Aliases: []string{"gesture emoji", "pose emoji", "action emoji"},
+ Keywords: []string{"emoji", "gesture", "pose", "action", "person", "hand", "sign"},
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
+ return emojiGesture(f), nil
+ },
+ })
+
+ AddFuncLookup("emojicostume", Info{
+ Display: "Emoji Costume",
+ Category: "emoji",
+ Description: "Unicode symbol representing costume/fantasy people and roles",
+ Example: "🦸",
+ Output: "string",
+ Aliases: []string{"costume emoji", "fantasy emoji", "role emoji"},
+ Keywords: []string{"emoji", "costume", "fantasy", "superhero", "prince", "princess"},
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
+ return emojiCostume(f), nil
+ },
+ })
+
+ AddFuncLookup("emojisentence", Info{
+ Display: "Emoji Sentence",
+ Category: "emoji",
+ Description: "Sentence with random emojis interspersed throughout",
+ Example: "Weekends reserve time for 🖼️ Disc 🏨 golf and day.",
+ Output: "string",
+ Aliases: []string{"sentence with emojis", "emoji text", "emoji message"},
+ Keywords: []string{"emoji", "sentence", "text", "message", "interspersed", "random", "words", "expression"},
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
+ return emojiSentence(f), nil
+ },
+ })
+
}
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/error.go b/vendor/github.com/brianvoe/gofakeit/v7/error.go
index e3726e7e..ef007223 100644
--- a/vendor/github.com/brianvoe/gofakeit/v7/error.go
+++ b/vendor/github.com/brianvoe/gofakeit/v7/error.go
@@ -146,96 +146,152 @@ func addErrorLookup() {
Description: "Message displayed by a computer or software when a problem or mistake is encountered",
Example: "syntax error",
Output: "string",
+ Aliases: []string{
+ "fault", "problem", "issue", "bug", "failure",
+ },
+ Keywords: []string{
+ "software", "computer", "crash", "exception", "warning", "alert", "diagnostic", "system", "message", "malfunction",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return err(f), nil
},
})
AddFuncLookup("errorobject", Info{
- Display: "Error object word",
+ Display: "Error Object",
Category: "error",
Description: "Various categories conveying details about encountered errors",
Example: "protocol",
Output: "string",
+ Aliases: []string{
+ "category", "classification", "entity", "type", "object detail",
+ },
+ Keywords: []string{
+ "protocol", "context", "identifier", "descriptor", "domain", "nature", "tag", "origin",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return errorObject(f), nil
},
})
AddFuncLookup("errordatabase", Info{
- Display: "Database error",
+ Display: "Database Error",
Category: "error",
Description: "A problem or issue encountered while accessing or managing a database",
Example: "sql error",
Output: "string",
+ Aliases: []string{
+ "db error", "query issue", "storage failure", "sql fault", "data access problem",
+ },
+ Keywords: []string{
+ "connection", "query", "timeout", "transaction", "integrity", "constraint", "lock", "schema", "management", "corruption",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return errorDatabase(f), nil
},
})
AddFuncLookup("errorgrpc", Info{
- Display: "gRPC error",
+ Display: "gRPC Error",
Category: "error",
Description: "Communication failure in the high-performance, open-source universal RPC framework",
Example: "client protocol error",
Output: "string",
+ Aliases: []string{
+ "grpc failure", "rpc error", "rpc failure", "communication fault", "transport issue",
+ },
+ Keywords: []string{
+ "protocol", "transport", "client", "server", "connection", "status", "unavailable", "timeout", "stream", "call",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return errorGRPC(f), nil
},
})
AddFuncLookup("errorhttp", Info{
- Display: "HTTP error",
+ Display: "HTTP Error",
Category: "error",
- Description: "A problem with a web http request",
+ Description: "A problem with a web HTTP request",
Example: "invalid method",
Output: "string",
+ Aliases: []string{
+ "http failure", "network error", "web problem", "request fault", "protocol issue",
+ },
+ Keywords: []string{
+ "invalid", "method", "status", "response", "request", "header", "url", "timeout", "redirect", "forbidden",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return errorHTTP(f), nil
},
})
AddFuncLookup("errorhttpclient", Info{
- Display: "HTTP client error",
+ Display: "HTTP Client Error",
Category: "error",
Description: "Failure or issue occurring within a client software that sends requests to web servers",
Example: "request timeout",
Output: "string",
+ Aliases: []string{
+ "client failure", "browser error", "request timeout", "frontend fault", "http client issue",
+ },
+ Keywords: []string{
+ "timeout", "request", "forbidden", "unauthorized",
+ "network", "connectivity", "invalid", "failure", "rejected",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return errorHTTPClient(f), nil
},
})
AddFuncLookup("errorhttpserver", Info{
- Display: "HTTP server error",
+ Display: "HTTP Server Error",
Category: "error",
- Description: "Failure or issue occurring within a server software that recieves requests from clients",
+ Description: "Failure or issue occurring within a server software that receives requests from clients",
Example: "internal server error",
Output: "string",
+ Aliases: []string{
+ "server fault", "backend error", "host issue", "service failure", "internal error",
+ },
+ Keywords: []string{
+ "unavailable", "overload", "gateway", "crash", "timeout", "backend", "processing", "failure", "503", "unexpected",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return errorHTTPServer(f), nil
},
})
AddFuncLookup("errorruntime", Info{
- Display: "Runtime error",
+ Display: "Runtime Error",
Category: "error",
- Description: "Malfunction occuring during program execution, often causing abrupt termination or unexpected behavior",
+ Description: "Malfunction occurring during program execution, often causing abrupt termination or unexpected behavior",
Example: "address out of bounds",
Output: "string",
+ Aliases: []string{
+ "execution error", "program crash", "runtime failure", "unexpected fault", "software halt",
+ },
+ Keywords: []string{
+ "execution", "segmentation", "overflow", "invalid", "null", "panic", "crash", "termination", "exception", "bug",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return errorRuntime(f), nil
},
})
AddFuncLookup("errorvalidation", Info{
- Display: "Validation error",
+ Display: "Validation Error",
Category: "error",
Description: "Occurs when input data fails to meet required criteria or format specifications",
Example: "missing required field",
Output: "string",
+ Aliases: []string{
+ "invalid input", "format error", "data check failure", "input rejection", "criteria mismatch",
+ },
+ Keywords: []string{
+ "missing", "required", "field", "constraint", "format", "rule", "criteria", "restriction", "validation", "check",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return errorValidation(f), nil
},
})
+
}
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/faker.go b/vendor/github.com/brianvoe/gofakeit/v7/faker.go
index 2271eac4..7383bb40 100644
--- a/vendor/github.com/brianvoe/gofakeit/v7/faker.go
+++ b/vendor/github.com/brianvoe/gofakeit/v7/faker.go
@@ -27,13 +27,11 @@ func New(seed uint64) *Faker {
// If seed is 0, use a random crypto seed
if seed == 0 {
faker := NewFaker(source.NewCrypto(), false)
- seed = faker.Uint64()
+
+ return NewFaker(rand.NewPCG(faker.Uint64(), faker.Uint64()), true)
}
- return &Faker{
- Rand: rand.NewPCG(seed, seed),
- Locked: true,
- }
+ return NewFaker(rand.NewPCG(seed, seed), true)
}
// NewFaker takes in a rand.Source and thread lock state and returns a new Faker struct
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/file.go b/vendor/github.com/brianvoe/gofakeit/v7/file.go
index ffefe863..6d5e6fc0 100644
--- a/vendor/github.com/brianvoe/gofakeit/v7/file.go
+++ b/vendor/github.com/brianvoe/gofakeit/v7/file.go
@@ -23,6 +23,12 @@ func addFileLookup() {
Description: "Suffix appended to a filename indicating its format or type",
Example: "nes",
Output: "string",
+ Aliases: []string{
+ "extension", "file suffix", "filename ending", "type indicator", "file ending", "format suffix",
+ },
+ Keywords: []string{
+ "file", "appended", "indicating", "format", "type", "filename", "suffix", "descriptor", "notation", "identifier",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return fileExtension(f), nil
},
@@ -34,6 +40,12 @@ func addFileLookup() {
Description: "Defines file format and nature for browsers and email clients using standardized identifiers",
Example: "application/json",
Output: "string",
+ Aliases: []string{
+ "mime type", "content type", "internet media type", "media format", "standard identifier", "file format",
+ },
+ Keywords: []string{
+ "file", "defines", "nature", "clients", "identifiers", "application", "json", "browser", "email", "protocol",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return fileMimeType(f), nil
},
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/finance.go b/vendor/github.com/brianvoe/gofakeit/v7/finance.go
index 4e363326..dca8e57c 100644
--- a/vendor/github.com/brianvoe/gofakeit/v7/finance.go
+++ b/vendor/github.com/brianvoe/gofakeit/v7/finance.go
@@ -110,6 +110,8 @@ func addFinanceLookup() {
Description: "Unique identifier for securities, especially bonds, in the United States and Canada",
Example: "38259P508",
Output: "string",
+ Aliases: []string{"identifier", "bond", "security", "us", "canada", "unique"},
+ Keywords: []string{"finance", "investment", "trading", "securities", "38259p508", "checksum", "validation", "market"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return cusip(f), nil
},
@@ -120,6 +122,8 @@ func addFinanceLookup() {
Description: "International standard code for uniquely identifying securities worldwide",
Example: "CVLRQCZBXQ97",
Output: "string",
+ Aliases: []string{"international", "securities", "identifier", "stock", "bond", "security"},
+ Keywords: []string{"finance", "investment", "trading", "cvlrqczbxq97", "worldwide", "standard", "code", "global"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return isin(f), nil
},
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/food.go b/vendor/github.com/brianvoe/gofakeit/v7/food.go
index 111dbc25..78bfd675 100644
--- a/vendor/github.com/brianvoe/gofakeit/v7/food.go
+++ b/vendor/github.com/brianvoe/gofakeit/v7/food.go
@@ -93,6 +93,18 @@ func addFoodLookup() {
Description: "Edible plant part, typically sweet, enjoyed as a natural snack or dessert",
Example: "Peach",
Output: "string",
+ Aliases: []string{
+ "fruit item",
+ "natural snack",
+ "sweet produce",
+ "edible plant food",
+ "dessert fruit",
+ },
+ Keywords: []string{
+ "edible", "plant", "peach",
+ "snack", "dessert", "sweet", "natural",
+ "produce", "fresh",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return fruit(f), nil
},
@@ -104,6 +116,18 @@ func addFoodLookup() {
Description: "Edible plant or part of a plant, often used in savory cooking or salads",
Example: "Amaranth Leaves",
Output: "string",
+ Aliases: []string{
+ "veggie",
+ "plant food",
+ "green produce",
+ "savory food",
+ "leafy edible",
+ },
+ Keywords: []string{
+ "greens", "produce", "amaranth",
+ "leaves", "cooking", "salads", "plant",
+ "edible", "savory",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return vegetable(f), nil
},
@@ -115,6 +139,18 @@ func addFoodLookup() {
Description: "First meal of the day, typically eaten in the morning",
Example: "Blueberry banana happy face pancakes",
Output: "string",
+ Aliases: []string{
+ "morning meal",
+ "first meal",
+ "day starter",
+ "early food",
+ "sunrise meal",
+ },
+ Keywords: []string{
+ "morning", "meal", "start",
+ "pancakes", "blueberry", "banana", "food",
+ "first", "early",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return breakfast(f), nil
},
@@ -126,6 +162,18 @@ func addFoodLookup() {
Description: "Midday meal, often lighter than dinner, eaten around noon",
Example: "No bake hersheys bar pie",
Output: "string",
+ Aliases: []string{
+ "midday meal",
+ "noon food",
+ "afternoon meal",
+ "light meal",
+ "daytime meal",
+ },
+ Keywords: []string{
+ "meal", "midday", "noon",
+ "lighter", "food", "pie", "bar",
+ "afternoon",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return lunch(f), nil
},
@@ -137,6 +185,18 @@ func addFoodLookup() {
Description: "Evening meal, typically the day's main and most substantial meal",
Example: "Wild addicting dip",
Output: "string",
+ Aliases: []string{
+ "evening meal",
+ "main meal",
+ "days supper",
+ "night food",
+ "hearty meal",
+ },
+ Keywords: []string{
+ "supper", "evening", "meal",
+ "main", "substantial", "night", "food",
+ "heavy", "course",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return dinner(f), nil
},
@@ -148,6 +208,18 @@ func addFoodLookup() {
Description: "Liquid consumed for hydration, pleasure, or nutritional benefits",
Example: "Soda",
Output: "string",
+ Aliases: []string{
+ "beverage",
+ "refreshment",
+ "hydration",
+ "liquid food",
+ "consumable fluid",
+ },
+ Keywords: []string{
+ "soda", "liquid",
+ "pleasure", "nutrition", "fluid", "quencher",
+ "consumed",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return drink(f), nil
},
@@ -156,9 +228,21 @@ func addFoodLookup() {
AddFuncLookup("snack", Info{
Display: "Snack",
Category: "food",
- Description: "Random snack",
- Example: "Small, quick food item eaten between meals",
+ Description: "Small, quick food item eaten between meals",
+ Example: "Trail mix",
Output: "string",
+ Aliases: []string{
+ "light bite",
+ "quick food",
+ "mini meal",
+ "finger food",
+ "nibble",
+ },
+ Keywords: []string{
+ "between", "meals", "quick",
+ "small", "food", "item", "random",
+ "bite", "treat",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return snack(f), nil
},
@@ -170,8 +254,21 @@ func addFoodLookup() {
Description: "Sweet treat often enjoyed after a meal",
Example: "French napoleons",
Output: "string",
+ Aliases: []string{
+ "after meal sweet",
+ "pastry treat",
+ "confection",
+ "final course",
+ "delicacy",
+ },
+ Keywords: []string{
+ "sweet", "treat", "meal",
+ "after", "pastry", "cake", "enjoyed",
+ "final", "sugar",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return dessert(f), nil
},
})
+
}
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/game.go b/vendor/github.com/brianvoe/gofakeit/v7/game.go
index 0e137000..66af13d9 100644
--- a/vendor/github.com/brianvoe/gofakeit/v7/game.go
+++ b/vendor/github.com/brianvoe/gofakeit/v7/game.go
@@ -69,6 +69,18 @@ func addGameLookup() {
Description: "User-selected online username or alias used for identification in games",
Example: "footinterpret63",
Output: "string",
+ Aliases: []string{
+ "player handle",
+ "gaming nickname",
+ "online tag",
+ "user alias",
+ "profile name",
+ },
+ Keywords: []string{
+ "user-selected", "username",
+ "alias", "identification", "online", "gaming",
+ "video", "games", "player",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return gamertag(f), nil
},
@@ -80,6 +92,18 @@ func addGameLookup() {
Description: "Small, cube-shaped objects used in games of chance for random outcomes",
Example: "[5, 2, 3]",
Output: "[]uint",
+ Aliases: []string{
+ "rolling cubes",
+ "chance cubes",
+ "game dice",
+ "random rollers",
+ "luck blocks",
+ },
+ Keywords: []string{
+ "games", "cube-shaped", "chance",
+ "random", "outcomes", "roll", "sides",
+ "objects", "probability",
+ },
Params: []Param{
{Field: "numdice", Display: "Number of Dice", Type: "uint", Default: "1", Description: "Number of dice to roll"},
{Field: "sides", Display: "Number of Sides", Type: "[]uint", Default: "[6]", Description: "Number of sides on each dice"},
@@ -98,4 +122,5 @@ func addGameLookup() {
return dice(f, numDice, sides), nil
},
})
+
}
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/generate.go b/vendor/github.com/brianvoe/gofakeit/v7/generate.go
index 9ca091e7..358caefe 100644
--- a/vendor/github.com/brianvoe/gofakeit/v7/generate.go
+++ b/vendor/github.com/brianvoe/gofakeit/v7/generate.go
@@ -47,84 +47,77 @@ func generate(f *Faker, dataVal string) (string, error) {
dataVal = replaceWithLetters(f, dataVal)
// Check if string has any replaceable values
- // Even if it doesnt its ok we will just return the string
- if !strings.Contains(dataVal, "{") && !strings.Contains(dataVal, "}") {
+ if !strings.Contains(dataVal, "{") {
return dataVal, nil
}
- // Variables to identify the index in which it exists
- startCurly := -1
- startCurlyIgnore := []int{}
- endCurly := -1
- endCurlyIgnore := []int{}
+ var result strings.Builder
+ result.Grow(len(dataVal) * 2) // Pre-allocate with estimate
- // Loop through string characters
- for i := 0; i < len(dataVal); i++ {
- // Check for ignores if equal skip
- shouldSkip := false
- for _, igs := range startCurlyIgnore {
- if i == igs {
- shouldSkip = true
+ i := 0
+ for i < len(dataVal) {
+ // Find next opening brace
+ start := strings.IndexByte(dataVal[i:], '{')
+ if start == -1 {
+ // No more replacements, append rest and break
+ result.WriteString(dataVal[i:])
+ break
+ }
+ start += i
+
+ // Append everything before the brace
+ result.WriteString(dataVal[i:start])
+
+ // Find matching closing brace (handle nested brackets)
+ end := -1
+ depth := 0
+ for j := start; j < len(dataVal); j++ {
+ if dataVal[j] == '{' {
+ depth++
+ } else if dataVal[j] == '}' {
+ depth--
+ if depth == 0 {
+ end = j
+ break
+ }
}
}
- for _, ige := range endCurlyIgnore {
- if i == ige {
- shouldSkip = true
- }
- }
- if shouldSkip {
- continue
+
+ if end == -1 {
+ // No closing brace, append rest and break
+ result.WriteString(dataVal[start:])
+ break
}
- // Identify items between brackets. Ex: {firstname}
- if string(dataVal[i]) == "{" {
- startCurly = i
- continue
- }
- if startCurly != -1 && string(dataVal[i]) == "}" {
- endCurly = i
- }
- if startCurly == -1 || endCurly == -1 {
- continue
- }
+ // Extract function name and params
+ fParts := dataVal[start+1 : end]
+ fName, fParams, _ := strings.Cut(fParts, ":")
- // Get the value between brackets
- fParts := dataVal[startCurly+1 : endCurly]
-
- // Check if has params separated by :
- fNameSplit := strings.SplitN(fParts, ":", 2)
- fName := ""
- fParams := ""
- if len(fNameSplit) >= 1 {
- fName = fNameSplit[0]
- }
- if len(fNameSplit) >= 2 {
- fParams = fNameSplit[1]
- }
-
- // Check to see if its a replaceable lookup function
+ // Check if it's a replaceable lookup function
if info := GetFuncLookup(fName); info != nil {
- // Get parameters, make sure params and the split both have values
- mapParams := NewMapParams()
+ // Get parameters
+ var mapParams *MapParams
paramsLen := len(info.Params)
- // If just one param and its a string simply just pass it
- if paramsLen == 1 && info.Params[0].Type == "string" {
- mapParams.Add(info.Params[0].Field, fParams)
- } else if paramsLen > 0 && fParams != "" {
- var err error
- splitVals, err := funcLookupSplit(fParams)
- if err != nil {
- return "", err
+ if paramsLen > 0 && fParams != "" {
+ mapParams = NewMapParams()
+ // If just one param and its a string simply just pass it
+ if paramsLen == 1 && info.Params[0].Type == "string" {
+ mapParams.Add(info.Params[0].Field, fParams)
+ } else {
+ splitVals, err := funcLookupSplit(fParams)
+ if err != nil {
+ return "", err
+ }
+ mapParams, err = addSplitValsToMapParams(splitVals, info, mapParams)
+ if err != nil {
+ return "", err
+ }
}
- mapParams, err = addSplitValsToMapParams(splitVals, info, mapParams)
- if err != nil {
- return "", err
+ if mapParams.Size() == 0 {
+ mapParams = nil
}
}
- if mapParams.Size() == 0 {
- mapParams = nil
- }
// Call function
fValue, err := info.Generate(f, mapParams, info)
@@ -132,30 +125,17 @@ func generate(f *Faker, dataVal string) (string, error) {
return "", err
}
- // Successfully found, run replace with new value
- dataVal = strings.Replace(dataVal, "{"+fParts+"}", fmt.Sprintf("%v", fValue), 1)
-
- // Reset the curly index back to -1 and reset ignores
- startCurly = -1
- startCurlyIgnore = []int{}
- endCurly = -1
- endCurlyIgnore = []int{}
- i = -1 // Reset back to the start of the string
- continue
+ // Write the generated value
+ result.WriteString(fmt.Sprintf("%v", fValue))
+ i = end + 1
+ } else {
+ // Not a valid function, keep the braces
+ result.WriteString(dataVal[start : end+1])
+ i = end + 1
}
-
- // Couldnt find anything - mark curly brackets to skip and rerun
- startCurlyIgnore = append(startCurlyIgnore, startCurly)
- endCurlyIgnore = append(endCurlyIgnore, endCurly)
-
- // Reset the curly index back to -1
- startCurly = -1
- endCurly = -1
- i = -1 // Reset back to the start of the string
- continue
}
- return dataVal, nil
+ return result.String(), nil
}
// FixedWidthOptions defines values needed for csv generation
@@ -489,6 +469,19 @@ func addGenerateLookup() {
Description: "Random string generated from string value based upon available data sets",
Example: "{firstname} {lastname} {email} - Markus Moen markusmoen@pagac.net",
Output: "string",
+ Aliases: []string{
+ "template expander",
+ "placeholder interpolator",
+ "variable substitution",
+ "token formatter",
+ "pattern builder",
+ "macro resolver",
+ },
+ Keywords: []string{
+ "upon", "datasets", "random",
+ "string", "value", "available", "data",
+ "sets", "based",
+ },
Params: []Param{
{Field: "str", Display: "String", Type: "string", Description: "String value to generate from"},
},
@@ -517,6 +510,12 @@ Alayna Wuckert santinostanton@carroll.biz g7sLrS0gEwLO 46
Lura Lockman zacherykuhic@feil.name S8gV7Z64KlHG 12`,
Output: "[]byte",
ContentType: "text/plain",
+ Aliases: []string{
+ "fixed rows", "columnar data", "padded text", "aligned output", "structured fields",
+ },
+ Keywords: []string{
+ "tabular", "data", "format", "alignment", "columns", "rows", "layout", "monospace", "table", "presentation",
+ },
Params: []Param{
{Field: "rowcount", Display: "Row Count", Type: "int", Default: "10", Description: "Number of rows"},
{Field: "fields", Display: "Fields", Type: "[]Field", Description: "Fields name, function and params"},
@@ -562,6 +561,19 @@ Lura Lockman zacherykuhic@feil.name S8gV7Z64KlHG 12`,
Description: "Pattern-matching tool used in text processing to search and manipulate strings",
Example: "[abcdef]{5} - affec",
Output: "string",
+ Aliases: []string{
+ "regular expression",
+ "string matcher",
+ "text parser",
+ "pattern engine",
+ "token analyzer",
+ "rule evaluator",
+ },
+ Keywords: []string{
+ "strings", "re2", "syntax",
+ "pattern-matching", "tool", "search",
+ "validation", "compile", "replace",
+ },
Params: []Param{
{Field: "str", Display: "String", Type: "string", Description: "Regex RE2 syntax string"},
},
@@ -593,6 +605,19 @@ Lura Lockman zacherykuhic@feil.name S8gV7Z64KlHG 12`,
}`,
Output: "map[string]any",
ContentType: "application/json",
+ Aliases: []string{
+ "associative array",
+ "lookup table",
+ "symbol table",
+ "keyed collection",
+ "map structure",
+ "object store",
+ },
+ Keywords: []string{
+ "stores", "key", "value",
+ "dictionary", "hash", "collection",
+ "pairs", "keys", "values", "structure",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return mapFunc(f), nil
},
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/hacker.go b/vendor/github.com/brianvoe/gofakeit/v7/hacker.go
index 22a78eb8..19143325 100644
--- a/vendor/github.com/brianvoe/gofakeit/v7/hacker.go
+++ b/vendor/github.com/brianvoe/gofakeit/v7/hacker.go
@@ -75,6 +75,13 @@ func addHackerLookup() {
Description: "Informal jargon and slang used in the hacking and cybersecurity community",
Example: "If we calculate the program, we can get to the AI pixel through the redundant XSS matrix!",
Output: "string",
+ Aliases: []string{
+ "hacker jargon", "cyber phrase", "security slang", "tech quip", "infosec phrase",
+ },
+ Keywords: []string{
+ "phrase", "jargon", "slang", "informal", "community",
+ "calculate", "program", "ai", "pixel", "redundant", "xss", "matrix",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return hackerPhrase(f), nil
},
@@ -86,6 +93,13 @@ func addHackerLookup() {
Description: "Abbreviations and acronyms commonly used in the hacking and cybersecurity community",
Example: "ADP",
Output: "string",
+ Aliases: []string{
+ "infosec acronym", "tech abbreviation", "security acronym", "cyber acronym", "hacker shorthand",
+ },
+ Keywords: []string{
+ "abbreviation", "acronym", "short", "code", "initialism",
+ "common", "used", "security", "community", "terminology",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return hackerAbbreviation(f), nil
},
@@ -97,6 +111,13 @@ func addHackerLookup() {
Description: "Adjectives describing terms often associated with hackers and cybersecurity experts",
Example: "wireless",
Output: "string",
+ Aliases: []string{
+ "hacker descriptor", "cyber adjective", "infosec modifier", "security adjective", "tech describing word",
+ },
+ Keywords: []string{
+ "adjective", "descriptive", "term", "modifier", "attribute",
+ "wireless", "connected", "digital", "virtual", "networked",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return hackerAdjective(f), nil
},
@@ -108,6 +129,13 @@ func addHackerLookup() {
Description: "Noun representing an element, tool, or concept within the realm of hacking and cybersecurity",
Example: "driver",
Output: "string",
+ Aliases: []string{
+ "hacking tool", "cyber noun", "security concept", "tech object", "infosec element",
+ },
+ Keywords: []string{
+ "noun", "element", "tool", "concept", "object",
+ "driver", "exploit", "payload", "virus", "device",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return hackerNoun(f), nil
},
@@ -119,6 +147,13 @@ func addHackerLookup() {
Description: "Verbs associated with actions and activities in the field of hacking and cybersecurity",
Example: "synthesize",
Output: "string",
+ Aliases: []string{
+ "hacking verb", "cyber action", "infosec verb", "tech activity", "security verb",
+ },
+ Keywords: []string{
+ "verb", "action", "activity", "task", "operation",
+ "synthesize", "exploit", "inject", "bypass", "scan",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return hackerVerb(f), nil
},
@@ -130,6 +165,13 @@ func addHackerLookup() {
Description: "Verb describing actions and activities related to hacking, often involving computer systems and security",
Example: "connecting",
Output: "string",
+ Aliases: []string{
+ "hacking action", "present participle", "cyber verb", "infosec activity", "progressive verb",
+ },
+ Keywords: []string{
+ "verb", "ing", "connecting", "probing", "listening",
+ "systems", "process", "computer", "security", "operation",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return hackeringVerb(f), nil
},
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/hipster.go b/vendor/github.com/brianvoe/gofakeit/v7/hipster.go
index 8cf7cba9..0c6de6d8 100644
--- a/vendor/github.com/brianvoe/gofakeit/v7/hipster.go
+++ b/vendor/github.com/brianvoe/gofakeit/v7/hipster.go
@@ -1,8 +1,6 @@
package gofakeit
-import (
- "errors"
-)
+import "strings"
// HipsterWord will return a single hipster word
func HipsterWord() string { return hipsterWord(GlobalFaker) }
@@ -12,36 +10,43 @@ func (f *Faker) HipsterWord() string { return hipsterWord(f) }
func hipsterWord(f *Faker) string { return getRandValue(f, []string{"hipster", "word"}) }
-// HipsterSentence will generate a random sentence
-func HipsterSentence(wordCount int) string { return hipsterSentence(GlobalFaker, wordCount) }
+// HipsterSentence will generate a random hipster sentence
+func HipsterSentence() string { return hipsterSentence(GlobalFaker) }
-// HipsterSentence will generate a random sentence
-func (f *Faker) HipsterSentence(wordCount int) string { return hipsterSentence(f, wordCount) }
+// HipsterSentence will generate a random hipster sentence
+func (f *Faker) HipsterSentence() string { return hipsterSentence(f) }
-func hipsterSentence(f *Faker, wordCount int) string {
- return sentenceGen(f, wordCount, hipsterWord)
+func hipsterSentence(f *Faker) string {
+ sentence, err := generate(f, getRandValue(f, []string{"hipster", "sentence"}))
+ if err != nil {
+ return ""
+ }
+
+ // Capitalize the first letter
+ sentence = strings.ToUpper(sentence[:1]) + sentence[1:]
+
+ return sentence
}
-// HipsterParagraph will generate a random paragraphGenerator
-// Set Paragraph Count
-// Set Sentence Count
-// Set Word Count
-// Set Paragraph Separator
-func HipsterParagraph(paragraphCount int, sentenceCount int, wordCount int, separator string) string {
- return hipsterParagraph(GlobalFaker, paragraphCount, sentenceCount, wordCount, separator)
+// HipsterParagraph will generate a random hipster paragraph
+func HipsterParagraph() string {
+ return hipsterParagraph(GlobalFaker)
}
-// HipsterParagraph will generate a random paragraphGenerator
-// Set Paragraph Count
-// Set Sentence Count
-// Set Word Count
-// Set Paragraph Separator
-func (f *Faker) HipsterParagraph(paragraphCount int, sentenceCount int, wordCount int, separator string) string {
- return hipsterParagraph(f, paragraphCount, sentenceCount, wordCount, separator)
+// HipsterParagraph will generate a random hipster paragraph
+func (f *Faker) HipsterParagraph() string {
+ return hipsterParagraph(f)
}
-func hipsterParagraph(f *Faker, paragraphCount int, sentenceCount int, wordCount int, separator string) string {
- return paragraphGen(f, paragrapOptions{paragraphCount, sentenceCount, wordCount, separator}, hipsterSentence)
+func hipsterParagraph(f *Faker) string {
+ // generate 2-5 sentences
+ sentenceCount := f.Number(2, 5)
+ sentences := make([]string, sentenceCount)
+ for i := 0; i < sentenceCount; i++ {
+ sentences[i] = hipsterSentence(f)
+ }
+
+ return strings.Join(sentences, " ")
}
func addHipsterLookup() {
@@ -51,6 +56,8 @@ func addHipsterLookup() {
Description: "Trendy and unconventional vocabulary used by hipsters to express unique cultural preferences",
Example: "microdosing",
Output: "string",
+ Aliases: []string{"word", "trendy", "unconventional", "vocabulary", "culture", "modern"},
+ Keywords: []string{"hipster", "preferences", "microdosing", "artisanal", "craft", "organic", "sustainable", "authentic"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return hipsterWord(f), nil
},
@@ -60,21 +67,12 @@ func addHipsterLookup() {
Display: "Hipster Sentence",
Category: "hipster",
Description: "Sentence showcasing the use of trendy and unconventional vocabulary associated with hipster culture",
- Example: "Microdosing roof chia echo pickled.",
+ Example: "Soul loops with you probably haven't heard of them undertones.",
Output: "string",
- Params: []Param{
- {Field: "wordcount", Display: "Word Count", Type: "int", Default: "5", Description: "Number of words in a sentence"},
- },
+ Aliases: []string{"sentence", "trendy", "unconventional", "vocabulary", "culture", "modern"},
+ Keywords: []string{"hipster", "showcasing", "microdosing", "roof", "chia", "echo", "pickled", "artisanal"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
- wordCount, err := info.GetInt(m, "wordcount")
- if err != nil {
- return nil, err
- }
- if wordCount <= 0 || wordCount > 50 {
- return nil, errors.New("invalid word count, must be greater than 0, less than 50")
- }
-
- return hipsterSentence(f, wordCount), nil
+ return hipsterSentence(f), nil
},
})
@@ -82,49 +80,12 @@ func addHipsterLookup() {
Display: "Hipster Paragraph",
Category: "hipster",
Description: "Paragraph showcasing the use of trendy and unconventional vocabulary associated with hipster culture",
- Example: `Microdosing roof chia echo pickled meditation cold-pressed raw denim fingerstache normcore sriracha pork belly. Wolf try-hard pop-up blog tilde hashtag health butcher waistcoat paleo portland vinegar. Microdosing sartorial blue bottle slow-carb freegan five dollar toast you probably haven't heard of them asymmetrical chia farm-to-table narwhal banjo. Gluten-free blog authentic literally synth vinyl meh ethical health fixie banh mi Yuccie. Try-hard drinking squid seitan cray VHS echo chillwave hammock kombucha food truck sustainable.
-
-Pug bushwick hella tote bag cliche direct trade waistcoat yr waistcoat knausgaard pour-over master. Pitchfork jean shorts franzen flexitarian distillery hella meggings austin knausgaard crucifix wolf heirloom. Crucifix food truck you probably haven't heard of them trust fund fixie gentrify pitchfork stumptown mlkshk umami chambray blue bottle. 3 wolf moon swag +1 biodiesel knausgaard semiotics taxidermy meh artisan hoodie +1 blue bottle. Fashion axe forage mixtape Thundercats pork belly whatever 90's beard selfies chambray cred mlkshk.
-
-Shabby chic typewriter VHS readymade lo-fi bitters PBR&B gentrify lomo raw denim freegan put a bird on it. Raw denim cliche dreamcatcher pug fixie park trust fund migas fingerstache sriracha +1 mustache. Tilde shoreditch kickstarter franzen dreamcatcher green juice mustache neutra polaroid stumptown organic schlitz. Flexitarian ramps chicharrones kogi lo-fi mustache tilde forage street church-key williamsburg taxidermy. Chia mustache plaid mumblecore squid slow-carb disrupt Thundercats goth shoreditch master direct trade.`,
- Output: "string",
- Params: []Param{
- {Field: "paragraphcount", Display: "Paragraph Count", Type: "int", Default: "2", Description: "Number of paragraphs"},
- {Field: "sentencecount", Display: "Sentence Count", Type: "int", Default: "2", Description: "Number of sentences in a paragraph"},
- {Field: "wordcount", Display: "Word Count", Type: "int", Default: "5", Description: "Number of words in a sentence"},
- {Field: "paragraphseparator", Display: "Paragraph Separator", Type: "string", Default: "
", Description: "String value to add between paragraphs"},
- },
+ Example: "Single-origin austin, double why. Tag it Yuccie, keep it any. Ironically pug, sincerely several. Roof > helvetica, discuss. From France to Jersey, chasing ennui.",
+ Output: "string",
+ Aliases: []string{"paragraph", "trendy", "unconventional", "vocabulary", "culture", "modern"},
+ Keywords: []string{"hipster", "showcasing", "meditation", "cold-pressed", "raw", "denim", "fingerstache", "normcore", "sriracha"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
- paragraphCount, err := info.GetInt(m, "paragraphcount")
- if err != nil {
- return nil, err
- }
- if paragraphCount <= 0 || paragraphCount > 20 {
- return nil, errors.New("invalid paragraph count, must be greater than 0, less than 20")
- }
-
- sentenceCount, err := info.GetInt(m, "sentencecount")
- if err != nil {
- return nil, err
- }
- if sentenceCount <= 0 || sentenceCount > 20 {
- return nil, errors.New("invalid sentence count, must be greater than 0, less than 20")
- }
-
- wordCount, err := info.GetInt(m, "wordcount")
- if err != nil {
- return nil, err
- }
- if wordCount <= 0 || wordCount > 50 {
- return nil, errors.New("invalid word count, must be greater than 0, less than 50")
- }
-
- paragraphSeparator, err := info.GetString(m, "paragraphseparator")
- if err != nil {
- return nil, err
- }
-
- return hipsterParagraph(f, paragraphCount, sentenceCount, wordCount, paragraphSeparator), nil
+ return hipsterParagraph(f), nil
},
})
}
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/html.go b/vendor/github.com/brianvoe/gofakeit/v7/html.go
index 27385ecd..82f5f24f 100644
--- a/vendor/github.com/brianvoe/gofakeit/v7/html.go
+++ b/vendor/github.com/brianvoe/gofakeit/v7/html.go
@@ -99,6 +99,12 @@ func addHtmlLookup() {
Description: "Attribute used to define the name of an input element in web forms",
Example: "first_name",
Output: "string",
+ Aliases: []string{
+ "form field", "field name", "html input", "input identifier", "web attribute",
+ },
+ Keywords: []string{
+ "define", "attribute", "element", "parameter", "submission", "mapping", "key", "entry", "binding",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return inputName(f), nil
},
@@ -114,6 +120,13 @@ func addHtmlLookup() {
`,
Output: "string",
ContentType: "image/svg+xml",
+ Aliases: []string{
+ "vector graphic", "xml image", "scalable format", "web graphic", "svg file",
+ },
+ Keywords: []string{
+ "scalable", "vector", "graphics", "image", "drawing", "markup", "shape", "color", "path", "render",
+ },
+
Params: []Param{
{Field: "width", Display: "Width", Type: "int", Default: "500", Description: "Width in px"},
{Field: "height", Display: "Height", Type: "int", Default: "500", Description: "Height in px"},
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/id.go b/vendor/github.com/brianvoe/gofakeit/v7/id.go
new file mode 100644
index 00000000..db04c0f5
--- /dev/null
+++ b/vendor/github.com/brianvoe/gofakeit/v7/id.go
@@ -0,0 +1,127 @@
+package gofakeit
+
+const (
+ idLength = 20
+ idBitsPerChar = 5
+ idAlphabetMask = (1 << idBitsPerChar) - 1
+ // readable 32 chars, (no 0, o, 1, i, l)
+ // 0 and o are removed to avoid confusion with each other
+ // 1, i, l are removed to avoid confusion with each other
+ // extra g was added to fit 32 chars
+ idAlphabetStr = "23456789abcdefgghjkmnpqrstuvwxyz"
+ hexDigits = "0123456789abcdef"
+)
+
+var (
+ idAlphabet = []byte(idAlphabetStr)
+)
+
+// ID will return a random unique identifier
+func ID() string { return id(GlobalFaker) }
+
+// ID will return a random unique identifier
+func (f *Faker) ID() string { return id(f) }
+
+func id(f *Faker) string {
+ out := make([]byte, idLength)
+
+ var cache uint64
+ var bits uint
+
+ for i := 0; i < idLength; {
+ if bits < idBitsPerChar {
+ cache = f.Uint64()
+ bits = 64
+ }
+
+ index := cache & idAlphabetMask
+ cache >>= idBitsPerChar
+ bits -= idBitsPerChar
+
+ // optimization: remove this check to avoid bounds check
+ // if index >= uint64(idAlphabetLen) {
+ // continue
+ // }
+
+ out[i] = idAlphabet[index]
+ i++
+ }
+
+ return string(out)
+}
+
+// UUID (version 4) will generate a random unique identifier based upon random numbers
+func UUID() string { return uuid(GlobalFaker) }
+
+// UUID (version 4) will generate a random unique identifier based upon random numbers
+func (f *Faker) UUID() string { return uuid(f) }
+
+func uuid(f *Faker) string {
+ const version = byte(4)
+
+ var uuid [16]byte
+ var r uint64
+
+ r = f.Uint64()
+ for i := 0; i < 8; i++ {
+ uuid[i] = byte(r)
+ r >>= 8
+ }
+
+ r = f.Uint64()
+ for i := 8; i < 16; i++ {
+ uuid[i] = byte(r)
+ r >>= 8
+ }
+
+ uuid[6] = (uuid[6] & 0x0f) | (version << 4)
+ uuid[8] = (uuid[8] & 0x3f) | 0x80
+
+ var buf [36]byte
+ encodeHexLower(buf[0:8], uuid[0:4])
+ buf[8] = dash
+ encodeHexLower(buf[9:13], uuid[4:6])
+ buf[13] = dash
+ encodeHexLower(buf[14:18], uuid[6:8])
+ buf[18] = dash
+ encodeHexLower(buf[19:23], uuid[8:10])
+ buf[23] = dash
+ encodeHexLower(buf[24:], uuid[10:])
+
+ return string(buf[:])
+}
+
+func encodeHexLower(dst, src []byte) {
+ for i, b := range src {
+ dst[i*2] = hexDigits[b>>4]
+ dst[i*2+1] = hexDigits[b&0x0f]
+ }
+}
+
+func addIDLookup() {
+ AddFuncLookup("id", Info{
+ Display: "ID",
+ Category: "id",
+ Description: "Generates a short, URL-safe base32 identifier using a custom alphabet that avoids lookalike characters",
+ Example: "pfsfktb87rcmj6bqha2fz9",
+ Output: "string",
+ Aliases: []string{"unique id", "random id", "base32 id", "url-safe id", "slug id", "short id"},
+ Keywords: []string{"random", "base32", "slug", "token", "url", "identifier", "nonsequential"},
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
+ return id(f), nil
+ },
+ })
+
+ AddFuncLookup("uuid", Info{
+ Display: "UUID",
+ Category: "id",
+ Description: "Generates a RFC 4122 compliant version 4 UUID using the faker random source",
+ Example: "b4ddf623-4ea6-48e5-9292-541f028d1fdb",
+ Output: "string",
+ Aliases: []string{"identifier", "guid", "uuid v4", "128-bit", "uuid generator"},
+ Keywords: []string{"unique", "v4", "hex", "computer", "system", "random"},
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
+ return uuid(f), nil
+ },
+ })
+}
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/image.go b/vendor/github.com/brianvoe/gofakeit/v7/image.go
index 9a04bcd6..d20f227d 100644
--- a/vendor/github.com/brianvoe/gofakeit/v7/image.go
+++ b/vendor/github.com/brianvoe/gofakeit/v7/image.go
@@ -63,6 +63,8 @@ func addImageLookup() {
Example: "file.jpeg - bytes",
Output: "[]byte",
ContentType: "image/jpeg",
+ Aliases: []string{"jpeg", "jpg", "format", "compression", "compatibility", "photo"},
+ Keywords: []string{"image", "efficient", "file", "bytes", "known", "rgba", "pixel", "width", "height"},
Params: []Param{
{Field: "width", Display: "Width", Type: "int", Default: "500", Description: "Image width in px"},
{Field: "height", Display: "Height", Type: "int", Default: "500", Description: "Image height in px"},
@@ -95,6 +97,8 @@ func addImageLookup() {
Example: "file.png - bytes",
Output: "[]byte",
ContentType: "image/png",
+ Aliases: []string{"png", "format", "lossless", "compression", "transparency", "graphic"},
+ Keywords: []string{"image", "support", "file", "bytes", "known", "rgba", "pixel", "width", "height"},
Params: []Param{
{Field: "width", Display: "Width", Type: "int", Default: "500", Description: "Image width in px"},
{Field: "height", Display: "Height", Type: "int", Default: "500", Description: "Image height in px"},
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/internet.go b/vendor/github.com/brianvoe/gofakeit/v7/internet.go
index 68cf8580..e9fdd633 100644
--- a/vendor/github.com/brianvoe/gofakeit/v7/internet.go
+++ b/vendor/github.com/brianvoe/gofakeit/v7/internet.go
@@ -53,6 +53,25 @@ func url(f *Faker) string {
return url
}
+// UrlSlug will generate a random url slug with the specified number of words
+func UrlSlug(words int) string { return urlSlug(GlobalFaker, words) }
+
+// UrlSlug will generate a random url slug with the specified number of words
+func (f *Faker) UrlSlug(words int) string { return urlSlug(f, words) }
+
+func urlSlug(f *Faker, words int) string {
+ if words <= 0 {
+ words = 3
+ }
+
+ slug := make([]string, words)
+ for i := 0; i < words; i++ {
+ slug[i] = strings.ToLower(word(f))
+ }
+
+ return strings.Join(slug, "-")
+}
+
// HTTPMethod will generate a random http method
func HTTPMethod() string { return httpMethod(GlobalFaker) }
@@ -225,6 +244,18 @@ func operaUserAgent(f *Faker) string {
return "Opera/" + strconv.Itoa(randIntRange(f, 8, 10)) + "." + strconv.Itoa(randIntRange(f, 10, 99)) + " " + platform
}
+// APIUserAgent will generate a random API user agent string
+func APIUserAgent() string { return apiUserAgent(GlobalFaker) }
+
+// APIUserAgent will generate a random API user agent string
+func (f *Faker) APIUserAgent() string { return apiUserAgent(f) }
+
+func apiUserAgent(f *Faker) string {
+ ua := getRandValue(f, []string{"internet", "api"})
+ result, _ := generate(f, ua)
+ return result
+}
+
// linuxPlatformToken will generate a random linux platform
func linuxPlatformToken(f *Faker) string {
return "X11; Linux " + getRandValue(f, []string{"computer", "linux_processor"})
@@ -268,17 +299,45 @@ func addInternetLookup() {
Description: "Web address that specifies the location of a resource on the internet",
Example: "http://www.principalproductize.biz/target",
Output: "string",
+ Aliases: []string{"url string", "web address", "internet link", "website url", "resource locator"},
+ Keywords: []string{"web", "address", "http", "https", "www", "protocol", "scheme", "path", "domain", "location", "resource"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return url(f), nil
},
})
+ AddFuncLookup("urlslug", Info{
+ Display: "URL Slug",
+ Category: "internet",
+ Description: "Simplified and URL-friendly version of a string, typically used in web addresses",
+ Example: "bathe-regularly-quiver",
+ Output: "string",
+ Aliases: []string{"slug", "url path", "permalink", "friendly url"},
+ Keywords: []string{"url", "path", "hyphen", "dash", "seo", "friendly", "web", "address", "kebab", "separator"},
+ Params: []Param{
+ {Field: "words", Display: "Words", Type: "int", Default: "3", Description: "Number of words in the slug"},
+ },
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
+ words, err := info.GetInt(m, "words")
+ if err != nil {
+ return nil, err
+ }
+ if words <= 0 {
+ words = 3
+ }
+
+ return urlSlug(f, words), nil
+ },
+ })
+
AddFuncLookup("domainname", Info{
Display: "Domain Name",
Category: "internet",
Description: "Human-readable web address used to identify websites on the internet",
Example: "centraltarget.biz",
Output: "string",
+ Aliases: []string{"domain name", "website name", "internet domain", "dns name", "site domain"},
+ Keywords: []string{"domain", "name", "web", "address", "dns", "hostname", "resolve", "centraltarget", "biz", "website"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return domainName(f), nil
},
@@ -290,6 +349,8 @@ func addInternetLookup() {
Description: "The part of a domain name that comes after the last dot, indicating its type or purpose",
Example: "org",
Output: "string",
+ Aliases: []string{"domain suffix", "domain extension", "top level domain", "domain ending"},
+ Keywords: []string{"domain", "suffix", "tld", "top-level", "extension", "org", "com", "net", "gov", "edu", "mil", "int"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return domainSuffix(f), nil
},
@@ -301,6 +362,8 @@ func addInternetLookup() {
Description: "Numerical label assigned to devices on a network for identification and communication",
Example: "222.83.191.222",
Output: "string",
+ Aliases: []string{"ip address", "network address", "internet address", "device ip", "ipv4 label"},
+ Keywords: []string{"ipv4", "ip", "network", "internet", "protocol", "communication", "dotted", "decimal"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return ipv4Address(f), nil
},
@@ -312,6 +375,8 @@ func addInternetLookup() {
Description: "Numerical label assigned to devices on a network, providing a larger address space than IPv4 for internet communication",
Example: "2001:cafe:8898:ee17:bc35:9064:5866:d019",
Output: "string",
+ Aliases: []string{"ip address", "network address", "internet address", "hex ip", "ipv6 label"},
+ Keywords: []string{"ipv6", "ip", "network", "protocol", "hexadecimal", "identification"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return ipv6Address(f), nil
},
@@ -323,6 +388,8 @@ func addInternetLookup() {
Description: "Verb used in HTTP requests to specify the desired action to be performed on a resource",
Example: "HEAD",
Output: "string",
+ Aliases: []string{"http verb", "http action", "http request", "http command", "method name"},
+ Keywords: []string{"http", "method", "verb", "get", "post", "put", "delete", "patch", "options", "head", "request", "action"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return httpMethod(f), nil
},
@@ -334,6 +401,8 @@ func addInternetLookup() {
Description: "Classification used in logging to indicate the severity or priority of a log entry",
Example: "error",
Output: "string",
+ Aliases: []string{"log severity", "logging level", "log classification", "priority level", "event level"},
+ Keywords: []string{"log", "level", "severity", "priority", "classification", "error", "warn", "info", "debug", "trace", "fatal", "critical"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return logLevel(f, ""), nil
},
@@ -345,6 +414,8 @@ func addInternetLookup() {
Description: "String sent by a web browser to identify itself when requesting web content",
Example: "Mozilla/5.0 (Windows NT 5.0) AppleWebKit/5362 (KHTML, like Gecko) Chrome/37.0.834.0 Mobile Safari/5362",
Output: "string",
+ Aliases: []string{"ua string", "browser ua", "http user agent", "client identifier", "browser identifier"},
+ Keywords: []string{"useragent", "browser", "http", "request", "mozilla", "applewebkit", "chrome", "firefox", "safari", "opera", "mobile"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return userAgent(f), nil
},
@@ -356,6 +427,8 @@ func addInternetLookup() {
Description: "The specific identification string sent by the Google Chrome web browser when making requests on the internet",
Example: "Mozilla/5.0 (X11; Linux i686) AppleWebKit/5312 (KHTML, like Gecko) Chrome/39.0.836.0 Mobile Safari/5312",
Output: "string",
+ Aliases: []string{"chrome ua", "chrome browser ua", "google chrome ua", "chrome identifier", "chrome user agent"},
+ Keywords: []string{"chrome", "google", "browser", "ua", "useragent", "applewebkit", "khtml", "gecko", "safari", "version"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return chromeUserAgent(f), nil
},
@@ -367,6 +440,8 @@ func addInternetLookup() {
Description: "The specific identification string sent by the Firefox web browser when making requests on the internet",
Example: "Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_8_3 rv:7.0) Gecko/1900-07-01 Firefox/37.0",
Output: "string",
+ Aliases: []string{"firefox ua", "firefox browser ua", "mozilla firefox ua", "gecko ua", "firefox identifier"},
+ Keywords: []string{"firefox", "mozilla", "browser", "ua", "useragent", "gecko", "macintosh", "ppc", "version"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return firefoxUserAgent(f), nil
},
@@ -378,6 +453,8 @@ func addInternetLookup() {
Description: "The specific identification string sent by the Opera web browser when making requests on the internet",
Example: "Opera/8.39 (Macintosh; U; PPC Mac OS X 10_8_7; en-US) Presto/2.9.335 Version/10.00",
Output: "string",
+ Aliases: []string{"opera ua", "opera browser ua", "opera identifier", "opera client", "opera user agent"},
+ Keywords: []string{"opera", "presto", "ua", "browser", "useragent", "macintosh", "ppc", "os", "version"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return operaUserAgent(f), nil
},
@@ -389,17 +466,34 @@ func addInternetLookup() {
Description: "The specific identification string sent by the Safari web browser when making requests on the internet",
Example: "Mozilla/5.0 (iPad; CPU OS 8_3_2 like Mac OS X; en-US) AppleWebKit/531.15.6 (KHTML, like Gecko) Version/4.0.5 Mobile/8B120 Safari/6531.15.6",
Output: "string",
+ Aliases: []string{"safari ua", "apple safari ua", "safari browser ua", "safari identifier", "safari user agent"},
+ Keywords: []string{"safari", "apple", "ipad", "os", "applewebkit", "khtml", "gecko", "browser", "ua", "mobile"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return safariUserAgent(f), nil
},
})
+ AddFuncLookup("apiuseragent", Info{
+ Display: "API User Agent",
+ Category: "internet",
+ Description: "String sent by API clients, tools, or libraries to identify themselves when making HTTP requests",
+ Example: "curl/8.2.5",
+ Output: "string",
+ Aliases: []string{"api ua", "api client ua", "http client ua", "api identifier", "client user agent"},
+ Keywords: []string{"api", "useragent", "client", "http", "request", "curl", "python", "go", "java", "node", "postman", "tool", "library"},
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
+ return apiUserAgent(f), nil
+ },
+ })
+
AddFuncLookup("httpstatuscode", Info{
Display: "HTTP Status Code",
Category: "internet",
- Description: "Random http status code",
+ Description: "Random HTTP status code",
Example: "200",
Output: "int",
+ Aliases: []string{"http status", "response code", "http response", "server status", "status identifier"},
+ Keywords: []string{"http", "status", "code", "server", "response", "200", "404", "500", "301", "302", "401", "403"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return httpStatusCode(f), nil
},
@@ -411,6 +505,8 @@ func addInternetLookup() {
Description: "Three-digit number returned by a web server to indicate the outcome of an HTTP request",
Example: "404",
Output: "int",
+ Aliases: []string{"http status simple", "simple response code", "http response simple", "status code", "server code"},
+ Keywords: []string{"http", "status", "code", "server", "response", "200", "404", "500", "301", "302", "401", "403"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return httpStatusCodeSimple(f), nil
},
@@ -422,6 +518,8 @@ func addInternetLookup() {
Description: "Number indicating the version of the HTTP protocol used for communication between a client and a server",
Example: "HTTP/1.1",
Output: "string",
+ Aliases: []string{"http version", "protocol version", "http protocol", "http identifier", "http version string"},
+ Keywords: []string{"http", "version", "protocol", "communication", "client", "server"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return httpVersion(f), nil
},
@@ -433,8 +531,11 @@ func addInternetLookup() {
Description: "Unique identifier assigned to network interfaces, often used in Ethernet networks",
Example: "cb:ce:06:94:22:e9",
Output: "string",
+ Aliases: []string{"mac address", "hardware address", "ethernet address", "network identifier", "link-layer address"},
+ Keywords: []string{"mac", "address", "hardware", "ethernet", "network", "identifier", "oui", "vendor", "colon", "hexadecimal"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return macAddress(f), nil
},
})
+
}
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/json.go b/vendor/github.com/brianvoe/gofakeit/v7/json.go
index 858e5233..fd21f9d3 100644
--- a/vendor/github.com/brianvoe/gofakeit/v7/json.go
+++ b/vendor/github.com/brianvoe/gofakeit/v7/json.go
@@ -79,7 +79,7 @@ func jsonFunc(f *Faker, jo *JSONOptions) ([]byte, error) {
return nil, errors.New("invalid type, must be array or object")
}
- if jo.Fields == nil || len(jo.Fields) <= 0 {
+ if len(jo.Fields) <= 0 {
return nil, errors.New("must pass fields in order to build json object(s)")
}
@@ -201,6 +201,8 @@ func addFileJSONLookup() {
]`,
Output: "[]byte",
ContentType: "application/json",
+ Aliases: []string{"data", "interchange", "structured", "format", "serialization", "api"},
+ Keywords: []string{"object", "array", "fields", "indent", "rowcount", "type", "serialize", "deserialize", "marshal", "unmarshal"},
Params: []Param{
{Field: "type", Display: "Type", Type: "string", Default: "object", Options: []string{"object", "array"}, Description: "Type of JSON, object or array"},
{Field: "rowcount", Display: "Row Count", Type: "int", Default: "100", Description: "Number of rows in JSON array"},
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/languages.go b/vendor/github.com/brianvoe/gofakeit/v7/languages.go
index 5ac0db80..ace4f84a 100644
--- a/vendor/github.com/brianvoe/gofakeit/v7/languages.go
+++ b/vendor/github.com/brianvoe/gofakeit/v7/languages.go
@@ -41,6 +41,8 @@ func addLanguagesLookup() {
Description: "System of communication using symbols, words, and grammar to convey meaning between individuals",
Example: "Kazakh",
Output: "string",
+ Aliases: []string{"spoken tongue", "dialect name", "native language", "speech form", "linguistic system"},
+ Keywords: []string{"communication", "symbols", "words", "grammar", "meaning", "system", "convey", "individuals"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return language(f), nil
},
@@ -52,6 +54,8 @@ func addLanguagesLookup() {
Description: "Shortened form of a language's name",
Example: "kk",
Output: "string",
+ Aliases: []string{"language code", "iso code", "locale code", "short form", "abbreviated tag"},
+ Keywords: []string{"abbreviation", "identifier", "shortened", "representation", "two-letter", "three-letter", "standard", "locale"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return languageAbbreviation(f), nil
},
@@ -63,6 +67,8 @@ func addLanguagesLookup() {
Description: "Set of guidelines and standards for identifying and representing languages in computing and internet protocols",
Example: "en-US",
Output: "string",
+ Aliases: []string{"bcp47 tag", "language tag", "locale identifier", "regional code", "protocol language code"},
+ Keywords: []string{"guidelines", "standards", "rfc", "internet", "protocols", "representation", "locale", "region", "country"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return languageBCP(f), nil
},
@@ -74,6 +80,8 @@ func addLanguagesLookup() {
Description: "Formal system of instructions used to create software and perform computational tasks",
Example: "Go",
Output: "string",
+ Aliases: []string{"coding language", "scripting language", "software language", "development language", "computer language"},
+ Keywords: []string{"programming", "instructions", "formal", "system", "tasks", "development", "compilation", "execution"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return programmingLanguage(f), nil
},
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/lookup.go b/vendor/github.com/brianvoe/gofakeit/v7/lookup.go
index 51dda64c..5468bff0 100644
--- a/vendor/github.com/brianvoe/gofakeit/v7/lookup.go
+++ b/vendor/github.com/brianvoe/gofakeit/v7/lookup.go
@@ -11,7 +11,7 @@ import (
// FuncLookups is the primary map array with mapping to all available data
var FuncLookups map[string]Info
-var lockFuncLookups sync.Mutex
+var lockFuncLookups sync.RWMutex
// MapParams is the values to pass into a lookup generate
type MapParams map[string]MapParamsValue
@@ -20,15 +20,17 @@ type MapParamsValue []string
// Info structures fields to better break down what each one generates
type Info struct {
- Display string `json:"display"`
- Category string `json:"category"`
- Description string `json:"description"`
- Example string `json:"example"`
- Output string `json:"output"`
- ContentType string `json:"content_type"`
- Params []Param `json:"params"`
- Any any `json:"any"`
- Generate func(f *Faker, m *MapParams, info *Info) (any, error) `json:"-"`
+ Display string `json:"display"` // display name
+ Category string `json:"category"` // category
+ Description string `json:"description"` // description
+ Example string `json:"example"` // example
+ Output string `json:"output"` // output type
+ Aliases []string `json:"aliases"` // alt names users might type
+ Keywords []string `json:"keywords"` // free words and domain terms
+ ContentType string `json:"content_type"` // content type
+ Params []Param `json:"params"` // params
+ Any any `json:"any"` // any
+ Generate func(f *Faker, m *MapParams, info *Info) (any, error) `json:"-"` // generate function
}
// Param is a breakdown of param requirements and type definition
@@ -54,6 +56,7 @@ func init() { initLookup() }
// init will add all the functions to MapLookups
func initLookup() {
addAddressLookup()
+ addAirlineLookup()
addAnimalLookup()
addAppLookup()
addAuthLookup()
@@ -78,10 +81,10 @@ func initLookup() {
addHackerLookup()
addHipsterLookup()
addHtmlLookup()
+ addIDLookup()
addImageLookup()
addInternetLookup()
addLanguagesLookup()
- addLoremLookup()
addMinecraftLookup()
addMiscLookup()
addMovieLookup()
@@ -90,6 +93,7 @@ func initLookup() {
addPersonLookup()
addProductLookup()
addSchoolLookup()
+ addSongLookup()
addStringLookup()
addTemplateLookup()
addWeightedLookup()
@@ -97,15 +101,12 @@ func initLookup() {
addWordAdverbLookup()
addWordConnectiveLookup()
addWordGeneralLookup()
- addWordGrammerLookup()
addWordNounLookup()
- addWordPhraseLookup()
addWordPrepositionLookup()
addWordPronounLookup()
- addWordSentenceLookup()
addWordVerbLookup()
- addWordCommentLookup()
addWordMiscLookup()
+ addTextLookup()
}
// internalFuncLookups is the internal map array with mapping to all available data
@@ -192,6 +193,9 @@ func (m *MapParamsValue) UnmarshalJSON(data []byte) error {
}
func GetRandomSimpleFunc(f *Faker) (string, Info) {
+ lockFuncLookups.RLock()
+ defer lockFuncLookups.RUnlock()
+
// Loop through all the functions and add them to a slice
var keys []string
for k, info := range FuncLookups {
@@ -210,18 +214,19 @@ func GetRandomSimpleFunc(f *Faker) (string, Info) {
// AddFuncLookup takes a field and adds it to map
func AddFuncLookup(functionName string, info Info) {
- if FuncLookups == nil {
- FuncLookups = make(map[string]Info)
- }
-
// Check content type
if info.ContentType == "" {
info.ContentType = "text/plain"
}
lockFuncLookups.Lock()
+ defer lockFuncLookups.Unlock()
+
+ if FuncLookups == nil {
+ FuncLookups = make(map[string]Info)
+ }
+
FuncLookups[functionName] = info
- lockFuncLookups.Unlock()
}
// GetFuncLookup will lookup
@@ -235,7 +240,10 @@ func GetFuncLookup(functionName string) *Info {
return &info
}
+ lockFuncLookups.RLock()
info, ok = FuncLookups[functionName]
+ lockFuncLookups.RUnlock()
+
if ok {
return &info
}
@@ -245,14 +253,15 @@ func GetFuncLookup(functionName string) *Info {
// RemoveFuncLookup will remove a function from lookup
func RemoveFuncLookup(functionName string) {
+ lockFuncLookups.Lock()
+ defer lockFuncLookups.Unlock()
+
_, ok := FuncLookups[functionName]
if !ok {
return
}
- lockFuncLookups.Lock()
delete(FuncLookups, functionName)
- lockFuncLookups.Unlock()
}
// GetAny will retrieve Any field from Info
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/lorem.go b/vendor/github.com/brianvoe/gofakeit/v7/lorem.go
deleted file mode 100644
index b4e48f58..00000000
--- a/vendor/github.com/brianvoe/gofakeit/v7/lorem.go
+++ /dev/null
@@ -1,126 +0,0 @@
-package gofakeit
-
-import (
- "errors"
-)
-
-// LoremIpsumWord will generate a random word
-func LoremIpsumWord() string { return loremIpsumWord(GlobalFaker) }
-
-// LoremIpsumWord will generate a random word
-func (f *Faker) LoremIpsumWord() string { return loremIpsumWord(f) }
-
-func loremIpsumWord(f *Faker) string { return getRandValue(f, []string{"lorem", "word"}) }
-
-// LoremIpsumSentence will generate a random sentence
-func LoremIpsumSentence(wordCount int) string {
- return loremIpsumSentence(GlobalFaker, wordCount)
-}
-
-// LoremIpsumSentence will generate a random sentence
-func (f *Faker) LoremIpsumSentence(wordCount int) string {
- return loremIpsumSentence(f, wordCount)
-}
-
-func loremIpsumSentence(f *Faker, wordCount int) string {
- return sentenceGen(f, wordCount, loremIpsumWord)
-}
-
-// LoremIpsumParagraph will generate a random paragraphGenerator
-func LoremIpsumParagraph(paragraphCount int, sentenceCount int, wordCount int, separator string) string {
- return loremIpsumParagraph(GlobalFaker, paragraphCount, sentenceCount, wordCount, separator)
-}
-
-// LoremIpsumParagraph will generate a random paragraphGenerator
-func (f *Faker) LoremIpsumParagraph(paragraphCount int, sentenceCount int, wordCount int, separator string) string {
- return loremIpsumParagraph(f, paragraphCount, sentenceCount, wordCount, separator)
-}
-
-func loremIpsumParagraph(f *Faker, paragraphCount int, sentenceCount int, wordCount int, separator string) string {
- return paragraphGen(f, paragrapOptions{paragraphCount, sentenceCount, wordCount, separator}, loremIpsumSentence)
-}
-
-func addLoremLookup() {
- AddFuncLookup("loremipsumword", Info{
- Display: "Lorem Ipsum Word",
- Category: "word",
- Description: "Word of the Lorem Ipsum placeholder text used in design and publishing",
- Example: "quia",
- Output: "string",
- Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
- return loremIpsumWord(f), nil
- },
- })
-
- AddFuncLookup("loremipsumsentence", Info{
- Display: "Lorem Ipsum Sentence",
- Category: "word",
- Description: "Sentence of the Lorem Ipsum placeholder text used in design and publishing",
- Example: "Quia quae repellat consequatur quidem.",
- Output: "string",
- Params: []Param{
- {Field: "wordcount", Display: "Word Count", Type: "int", Default: "5", Description: "Number of words in a sentence"},
- },
- Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
- wordCount, err := info.GetInt(m, "wordcount")
- if err != nil {
- return nil, err
- }
- if wordCount <= 0 || wordCount > 50 {
- return nil, errors.New("invalid word count, must be greater than 0, less than 50")
- }
-
- return loremIpsumSentence(f, wordCount), nil
- },
- })
-
- AddFuncLookup("loremipsumparagraph", Info{
- Display: "Lorem Ipsum Paragraph",
- Category: "word",
- Description: "Paragraph of the Lorem Ipsum placeholder text used in design and publishing",
- Example: `Quia quae repellat consequatur quidem nisi quo qui voluptatum accusantium quisquam amet. Quas et ut non dolorem ipsam aut enim assumenda mollitia harum ut. Dicta similique veniam nulla voluptas at excepturi non ad maxime at non. Eaque hic repellat praesentium voluptatem qui consequuntur dolor iusto autem velit aut. Fugit tempore exercitationem harum consequatur voluptatum modi minima aut eaque et et.
-
-Aut ea voluptatem dignissimos expedita odit tempore quod aut beatae ipsam iste. Minus voluptatibus dolorem maiores eius sed nihil vel enim odio voluptatem accusamus. Natus quibusdam temporibus tenetur cumque sint necessitatibus dolorem ex ducimus iusto ex. Voluptatem neque dicta explicabo officiis et ducimus sit ut ut praesentium pariatur. Illum molestias nisi at dolore ut voluptatem accusantium et fugiat et ut.
-
-Explicabo incidunt reprehenderit non quia dignissimos recusandae vitae soluta quia et quia. Aut veniam voluptas consequatur placeat sapiente non eveniet voluptatibus magni velit eum. Nobis vel repellendus sed est qui autem laudantium quidem quam ullam consequatur. Aut iusto ut commodi similique quae voluptatem atque qui fugiat eum aut. Quis distinctio consequatur voluptatem vel aliquid aut laborum facere officiis iure tempora.`,
- Output: "string",
- Params: []Param{
- {Field: "paragraphcount", Display: "Paragraph Count", Type: "int", Default: "2", Description: "Number of paragraphs"},
- {Field: "sentencecount", Display: "Sentence Count", Type: "int", Default: "2", Description: "Number of sentences in a paragraph"},
- {Field: "wordcount", Display: "Word Count", Type: "int", Default: "5", Description: "Number of words in a sentence"},
- {Field: "paragraphseparator", Display: "Paragraph Separator", Type: "string", Default: "
", Description: "String value to add between paragraphs"},
- },
- Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
- paragraphCount, err := info.GetInt(m, "paragraphcount")
- if err != nil {
- return nil, err
- }
- if paragraphCount <= 0 || paragraphCount > 20 {
- return nil, errors.New("invalid paragraph count, must be greater than 0, less than 20")
- }
-
- sentenceCount, err := info.GetInt(m, "sentencecount")
- if err != nil {
- return nil, err
- }
- if sentenceCount <= 0 || sentenceCount > 20 {
- return nil, errors.New("invalid sentence count, must be greater than 0, less than 20")
- }
-
- wordCount, err := info.GetInt(m, "wordcount")
- if err != nil {
- return nil, err
- }
- if wordCount <= 0 || wordCount > 50 {
- return nil, errors.New("invalid word count, must be greater than 0, less than 50")
- }
-
- paragraphSeparator, err := info.GetString(m, "paragraphseparator")
- if err != nil {
- return nil, err
- }
-
- return loremIpsumParagraph(f, paragraphCount, sentenceCount, wordCount, paragraphSeparator), nil
- },
- })
-}
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/merch.png b/vendor/github.com/brianvoe/gofakeit/v7/merch.png
new file mode 100644
index 00000000..a7e72768
Binary files /dev/null and b/vendor/github.com/brianvoe/gofakeit/v7/merch.png differ
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/minecraft.go b/vendor/github.com/brianvoe/gofakeit/v7/minecraft.go
index 5e5efa20..f15daa87 100644
--- a/vendor/github.com/brianvoe/gofakeit/v7/minecraft.go
+++ b/vendor/github.com/brianvoe/gofakeit/v7/minecraft.go
@@ -171,6 +171,8 @@ func addMinecraftLookup() {
Description: "Naturally occurring minerals found in the game Minecraft, used for crafting purposes",
Example: "coal",
Output: "string",
+ Aliases: []string{"resource block", "crafting ore", "mining material", "mineral node", "in-game ore"},
+ Keywords: []string{"naturally", "occurring", "coal", "iron", "gold", "diamond", "lapis", "emerald", "redstone"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return minecraftOre(f), nil
},
@@ -182,6 +184,8 @@ func addMinecraftLookup() {
Description: "Natural resource in Minecraft, used for crafting various items and building structures",
Example: "oak",
Output: "string",
+ Aliases: []string{"tree log", "wood block", "timber type", "crafting wood", "building wood"},
+ Keywords: []string{"natural", "resource", "oak", "birch", "jungle", "spruce", "mangrove", "planks"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return minecraftWood(f), nil
},
@@ -193,6 +197,8 @@ func addMinecraftLookup() {
Description: "Classification system for armor sets in Minecraft, indicating their effectiveness and protection level",
Example: "iron",
Output: "string",
+ Aliases: []string{"armor level", "armor rank", "armor category", "tier type", "defense tier"},
+ Keywords: []string{"classification", "iron", "diamond", "netherite", "leather", "chainmail", "gold", "effectiveness", "defense"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return minecraftArmorTier(f), nil
},
@@ -204,6 +210,8 @@ func addMinecraftLookup() {
Description: "Component of an armor set in Minecraft, such as a helmet, chestplate, leggings, or boots",
Example: "helmet",
Output: "string",
+ Aliases: []string{"armor piece", "armor gear", "armor equipment", "armor slot", "protective item"},
+ Keywords: []string{"helmet", "chestplate", "leggings", "boots", "component", "set", "gear"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return minecraftArmorPart(f), nil
},
@@ -215,6 +223,8 @@ func addMinecraftLookup() {
Description: "Tools and items used in Minecraft for combat and defeating hostile mobs",
Example: "bow",
Output: "string",
+ Aliases: []string{"combat item", "fighting tool", "attack weapon", "battle gear", "mob killer"},
+ Keywords: []string{"bow", "sword", "axe", "trident", "crossbow", "used", "combat", "damage"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return minecraftWeapon(f), nil
},
@@ -226,6 +236,8 @@ func addMinecraftLookup() {
Description: "Items in Minecraft designed for specific tasks, including mining, digging, and building",
Example: "shovel",
Output: "string",
+ Aliases: []string{"utility tool", "crafting tool", "gathering tool", "work tool", "task tool"},
+ Keywords: []string{"pickaxe", "axe", "hoe", "shovel", "fishing-rod", "tasks", "mining", "digging"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return minecraftTool(f), nil
},
@@ -237,6 +249,8 @@ func addMinecraftLookup() {
Description: "Items used to change the color of various in-game objects",
Example: "white",
Output: "string",
+ Aliases: []string{"color dye", "pigment item", "colorant", "dye material", "color change"},
+ Keywords: []string{"red", "blue", "green", "yellow", "white", "wool", "coloring", "sheep"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return minecraftDye(f), nil
},
@@ -248,6 +262,8 @@ func addMinecraftLookup() {
Description: "Consumable items in Minecraft that provide nourishment to the player character",
Example: "apple",
Output: "string",
+ Aliases: []string{"edible item", "consumable block", "nourishment item", "hunger food", "survival food"},
+ Keywords: []string{"apple", "bread", "meat", "carrot", "potato", "steak", "restore", "health", "hunger"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return minecraftFood(f), nil
},
@@ -259,6 +275,8 @@ func addMinecraftLookup() {
Description: "Non-hostile creatures in Minecraft, often used for resources and farming",
Example: "chicken",
Output: "string",
+ Aliases: []string{"farm animal", "passive mob", "resource creature", "livestock", "tameable mob"},
+ Keywords: []string{"cow", "pig", "sheep", "chicken", "horse", "llama", "resources", "farming"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return minecraftAnimal(f), nil
},
@@ -270,6 +288,8 @@ func addMinecraftLookup() {
Description: "The profession or occupation assigned to a villager character in the game",
Example: "farmer",
Output: "string",
+ Aliases: []string{"villager profession", "npc job", "trade role", "occupation type", "work class"},
+ Keywords: []string{"farmer", "librarian", "cleric", "armorer", "fletcher", "smith", "trading"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return minecraftVillagerJob(f), nil
},
@@ -281,6 +301,8 @@ func addMinecraftLookup() {
Description: "Designated area or structure in Minecraft where villagers perform their job-related tasks and trading",
Example: "furnace",
Output: "string",
+ Aliases: []string{"workstation block", "villager station", "profession station", "trade station", "job block"},
+ Keywords: []string{"furnace", "grindstone", "lectern", "brewing", "stand", "smithing", "table", "trading", "block"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return minecraftVillagerStation(f), nil
},
@@ -292,6 +314,8 @@ func addMinecraftLookup() {
Description: "Measure of a villager's experience and proficiency in their assigned job or profession",
Example: "master",
Output: "string",
+ Aliases: []string{"villager rank", "experience tier", "profession level", "npc level", "skill grade"},
+ Keywords: []string{"novice", "apprentice", "journeyman", "expert", "master", "progression"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return minecraftVillagerLevel(f), nil
},
@@ -303,6 +327,8 @@ func addMinecraftLookup() {
Description: "Non-aggressive creatures in the game that do not attack players",
Example: "cow",
Output: "string",
+ Aliases: []string{"peaceful mob", "friendly creature", "safe entity", "passive entity", "non-hostile mob"},
+ Keywords: []string{"cow", "sheep", "chicken", "villager", "bat", "neutral", "farm"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return minecraftMobPassive(f), nil
},
@@ -314,6 +340,8 @@ func addMinecraftLookup() {
Description: "Creature in the game that only becomes hostile if provoked, typically defending itself when attacked",
Example: "bee",
Output: "string",
+ Aliases: []string{"conditional mob", "provokable creature", "neutral mob", "reactive entity", "self-defense mob"},
+ Keywords: []string{"bee", "wolf", "enderman", "goat", "attack", "provoked", "defending"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return minecraftMobNeutral(f), nil
},
@@ -325,6 +353,8 @@ func addMinecraftLookup() {
Description: "Aggressive creatures in the game that actively attack players when encountered",
Example: "spider",
Output: "string",
+ Aliases: []string{"enemy mob", "aggressive entity", "dangerous creature", "threat mob", "monster mob"},
+ Keywords: []string{"spider", "zombie", "skeleton", "creeper", "witch", "attack", "players"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return minecraftMobHostile(f), nil
},
@@ -336,6 +366,8 @@ func addMinecraftLookup() {
Description: "Powerful hostile creature in the game, often found in challenging dungeons or structures",
Example: "ender dragon",
Output: "string",
+ Aliases: []string{"boss mob", "elite mob", "endgame creature", "raid boss", "legendary mob"},
+ Keywords: []string{"ender", "dragon", "wither", "warden", "powerful", "challenging", "structure", "hostile"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return minecraftMobBoss(f), nil
},
@@ -347,6 +379,8 @@ func addMinecraftLookup() {
Description: "Distinctive environmental regions in the game, characterized by unique terrain, vegetation, and weather",
Example: "forest",
Output: "string",
+ Aliases: []string{"environment zone", "terrain type", "climate region", "biome area", "ecological zone"},
+ Keywords: []string{"forest", "plains", "jungle", "desert", "swamp", "tundra", "savanna"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return minecraftBiome(f), nil
},
@@ -358,6 +392,8 @@ func addMinecraftLookup() {
Description: "Atmospheric conditions in the game that include rain, thunderstorms, and clear skies, affecting gameplay and ambiance",
Example: "rain",
Output: "string",
+ Aliases: []string{"climate condition", "weather effect", "game atmosphere", "sky state", "environmental condition"},
+ Keywords: []string{"rain", "clear", "thunderstorm", "snow", "atmospheric", "storm", "lightning"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return minecraftWeather(f), nil
},
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/misc.go b/vendor/github.com/brianvoe/gofakeit/v7/misc.go
index b40ba1ef..54fa1ace 100644
--- a/vendor/github.com/brianvoe/gofakeit/v7/misc.go
+++ b/vendor/github.com/brianvoe/gofakeit/v7/misc.go
@@ -1,7 +1,6 @@
package gofakeit
import (
- "encoding/hex"
"reflect"
"github.com/brianvoe/gofakeit/v7/data"
@@ -15,43 +14,6 @@ func (f *Faker) Bool() bool { return boolFunc(f) }
func boolFunc(f *Faker) bool { return randIntRange(f, 0, 1) == 1 }
-// UUID (version 4) will generate a random unique identifier based upon random numbers
-// Format: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
-func UUID() string { return uuid(GlobalFaker) }
-
-// UUID (version 4) will generate a random unique identifier based upon random numbers
-// Format: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx 8-4-4-4-12
-func (f *Faker) UUID() string { return uuid(f) }
-
-func uuid(f *Faker) string {
- version := byte(4)
- uuid := make([]byte, 16)
-
- // Read 16 random bytes
- for i := 0; i < 16; i++ {
- uuid[i] = byte(f.IntN(256))
- }
-
- // Set version
- uuid[6] = (uuid[6] & 0x0f) | (version << 4)
-
- // Set variant
- uuid[8] = (uuid[8] & 0xbf) | 0x80
-
- buf := make([]byte, 36)
- hex.Encode(buf[0:8], uuid[0:4])
- buf[8] = dash
- hex.Encode(buf[9:13], uuid[4:6])
- buf[13] = dash
- hex.Encode(buf[14:18], uuid[6:8])
- buf[18] = dash
- hex.Encode(buf[19:23], uuid[8:10])
- buf[23] = dash
- hex.Encode(buf[24:], uuid[10:])
-
- return string(buf)
-}
-
// ShuffleAnySlice takes in a slice and outputs it in a random order
func ShuffleAnySlice(v any) { shuffleAnySlice(GlobalFaker, v) }
@@ -129,23 +91,14 @@ func Categories() map[string][]string {
}
func addMiscLookup() {
- AddFuncLookup("uuid", Info{
- Display: "UUID",
- Category: "misc",
- Description: "128-bit identifier used to uniquely identify objects or entities in computer systems",
- Example: "590c1440-9888-45b0-bd51-a817ee07c3f2",
- Output: "string",
- Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
- return uuid(f), nil
- },
- })
-
AddFuncLookup("bool", Info{
Display: "Boolean",
Category: "misc",
Description: "Data type that represents one of two possible values, typically true or false",
Example: "true",
Output: "bool",
+ Aliases: []string{"boolean", "true", "false", "logic", "binary"},
+ Keywords: []string{"bool", "data", "type", "represents", "values", "typically", "two", "possible"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return boolFunc(f), nil
},
@@ -157,6 +110,8 @@ func addMiscLookup() {
Description: "Decision-making method involving the tossing of a coin to determine outcomes",
Example: "Tails",
Output: "string",
+ Aliases: []string{"coin", "flip", "heads", "tails", "decision", "random"},
+ Keywords: []string{"decision-making", "method", "tossing", "determine", "outcomes", "chance", "probability"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return flipACoin(f), nil
},
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/movie.go b/vendor/github.com/brianvoe/gofakeit/v7/movie.go
index 27199cd6..67d7112c 100644
--- a/vendor/github.com/brianvoe/gofakeit/v7/movie.go
+++ b/vendor/github.com/brianvoe/gofakeit/v7/movie.go
@@ -39,6 +39,8 @@ func addMovieLookup() {
}`,
Output: "map[string]string",
ContentType: "application/json",
+ Aliases: []string{"cinema", "picture", "story", "entertainment", "motion"},
+ Keywords: []string{"film", "moving", "sound", "pictures", "told", "through", "psycho", "mystery"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return movie(f), nil
},
@@ -50,6 +52,18 @@ func addMovieLookup() {
Description: "Title or name of a specific film used for identification and reference",
Example: "The Matrix",
Output: "string",
+ Aliases: []string{
+ "movie title",
+ "film title",
+ "film name",
+ "motion picture title",
+ "cinema title",
+ },
+ Keywords: []string{
+ "movie", "film", "title", "name", "cinema",
+ "motionpicture", "blockbuster", "feature", "picture",
+ "hollywood", "bollywood", "screenplay", "screen",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return movieName(f), nil
},
@@ -61,6 +75,19 @@ func addMovieLookup() {
Description: "Category that classifies movies based on common themes, styles, and storytelling approaches",
Example: "Action",
Output: "string",
+ Aliases: []string{
+ "film genre",
+ "movie category",
+ "film type",
+ "cinema genre",
+ "movie classification",
+ },
+ Keywords: []string{
+ "category", "type", "classification",
+ "movie", "film", "cinema", "style", "theme",
+ "drama", "comedy", "horror", "thriller", "romance",
+ "documentary", "animation", "sci-fi", "fantasy", "action",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return movieGenre(f), nil
},
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/number.go b/vendor/github.com/brianvoe/gofakeit/v7/number.go
index e4cdfb9c..d98581e6 100644
--- a/vendor/github.com/brianvoe/gofakeit/v7/number.go
+++ b/vendor/github.com/brianvoe/gofakeit/v7/number.go
@@ -331,9 +331,20 @@ func addNumberLookup() {
AddFuncLookup("number", Info{
Display: "Number",
Category: "number",
- Description: "Mathematical concept used for counting, measuring, and expressing quantities or values",
+ Description: "Integer used for counting or measuring, with optional bounds",
Example: "14866",
Output: "int",
+ Aliases: []string{
+ "integer value",
+ "whole-number output",
+ "bounded result",
+ "range-limited value",
+ "discrete quantity",
+ },
+ Keywords: []string{
+ "integer", "int", "random",
+ "min", "max", "range", "bounded", "between", "inclusive",
+ },
Params: []Param{
{Field: "min", Display: "Min", Type: "int", Default: "-2147483648", Description: "Minimum integer value"},
{Field: "max", Display: "Max", Type: "int", Default: "2147483647", Description: "Maximum integer value"},
@@ -343,12 +354,10 @@ func addNumberLookup() {
if err != nil {
return nil, err
}
-
max, err := info.GetInt(m, "max")
if err != nil {
return nil, err
}
-
return number(f, min, max), nil
},
})
@@ -356,29 +365,48 @@ func addNumberLookup() {
AddFuncLookup("uint", Info{
Display: "Uint",
Category: "number",
- Description: "Unsigned integer",
+ Description: "Unsigned integer (nonnegative whole number)",
Example: "14866",
Output: "uint",
- Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
- return uintFunc(f), nil
+ Aliases: []string{
+ "nonnegative value",
+ "natural-count type",
+ "unsigned whole",
+ "zero-or-greater",
+ "cardinal quantity",
},
+ Keywords: []string{
+ "unsigned", "integer", "nonnegative",
+ "natural", "zero", "positive", "whole",
+ },
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return uintFunc(f), nil },
})
AddFuncLookup("uintn", Info{
Display: "UintN",
Category: "number",
- Description: "Unsigned integer between 0 and n",
+ Description: "Unsigned integer between 0 (inclusive) and n (exclusive)",
Example: "32783",
Output: "uint",
+ Aliases: []string{
+ "upper-bounded uint",
+ "cap-limited unsigned",
+ "zero-to-n minus one",
+ "exclusive-maximum uint",
+ "limited-range unsigned",
+ },
+ Keywords: []string{
+ "unsigned", "range", "upper",
+ "limit", "bound", "cap", "max", "exclusive",
+ },
Params: []Param{
- {Field: "n", Display: "N", Type: "uint", Default: "4294967295", Description: "Maximum uint value"},
+ {Field: "n", Display: "N", Type: "uint", Default: "4294967295", Description: "Maximum uint value (exclusive)"},
},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
n, err := info.GetUint(m, "n")
if err != nil {
return nil, err
}
-
return uintNFunc(f, n), nil
},
})
@@ -386,53 +414,89 @@ func addNumberLookup() {
AddFuncLookup("uint8", Info{
Display: "Uint8",
Category: "number",
- Description: "Unsigned 8-bit integer, capable of representing values from 0 to 255",
+ Description: "Unsigned 8-bit integer, range 0–255",
Example: "152",
Output: "uint8",
- Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
- return uint8Func(f), nil
+ Aliases: []string{
+ "byte-sized unsigned",
+ "octet quantity",
+ "small-range unsigned",
+ "one-byte value",
+ "0-255 whole",
},
+ Keywords: []string{
+ "unsigned", "8bit", "byte", "octet", "range", "integer",
+ },
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return uint8Func(f), nil },
})
AddFuncLookup("uint16", Info{
Display: "Uint16",
Category: "number",
- Description: "Unsigned 16-bit integer, capable of representing values from 0 to 65,535",
+ Description: "Unsigned 16-bit integer, range 0–65,535",
Example: "34968",
Output: "uint16",
- Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
- return uint16Func(f), nil
+ Aliases: []string{
+ "two-byte unsigned",
+ "ushort quantity",
+ "medium-range unsigned",
+ "port-sized value",
+ "0-65535 whole",
},
+ Keywords: []string{
+ "unsigned", "16bit", "word", "port", "range", "integer",
+ },
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return uint16Func(f), nil },
})
AddFuncLookup("uint32", Info{
Display: "Uint32",
Category: "number",
- Description: "Unsigned 32-bit integer, capable of representing values from 0 to 4,294,967,295",
+ Description: "Unsigned 32-bit integer, range 0–4,294,967,295",
Example: "1075055705",
Output: "uint32",
- Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
- return uint32Func(f), nil
+ Aliases: []string{
+ "four-byte unsigned", "u32 numeric", "ipv4-scale value",
+ "wide-range unsigned", "32-bit whole", "medium unsigned int", "standard unsigned int",
},
+ Keywords: []string{
+ "unsigned", "32bit", "range", "ipv4", "integer", "binary", "numeric",
+ },
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return uint32Func(f), nil },
})
AddFuncLookup("uint64", Info{
Display: "Uint64",
Category: "number",
- Description: "Unsigned 64-bit integer, capable of representing values from 0 to 18,446,744,073,709,551,615",
+ Description: "Unsigned 64-bit integer, range 0–18,446,744,073,709,551,615",
Example: "843730692693298265",
Output: "uint64",
- Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
- return f.Uint64(), nil
+ Aliases: []string{
+ "eight-byte unsigned", "u64 numeric", "very-large unsigned", "wide whole count", "extended-range value", "large uint", "unsigned bigint",
},
+ Keywords: []string{
+ "unsigned", "64bit", "range", "bigint", "integer", "numeric", "arithmetic",
+ },
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return f.Uint64(), nil },
})
AddFuncLookup("uintrange", Info{
- Display: "UintRange",
+ Display: "Uint Range",
Category: "number",
- Description: "Non-negative integer value between given range",
+ Description: "Unsigned integer value within a given range",
Example: "1075055705",
Output: "uint",
+ Aliases: []string{
+ "unsigned span",
+ "nonnegative interval",
+ "ranged cardinal",
+ "bounded unsigned result",
+ "constrained uint output",
+ },
+ Keywords: []string{
+ "uintrange", "unsigned", "range", "min", "max",
+ "bounds", "limits", "interval", "span",
+ },
Params: []Param{
{Field: "min", Display: "Min", Type: "uint", Default: "0", Description: "Minimum uint value"},
{Field: "max", Display: "Max", Type: "uint", Default: "4294967295", Description: "Maximum uint value"},
@@ -442,12 +506,10 @@ func addNumberLookup() {
if err != nil {
return nil, err
}
-
max, err := info.GetUint(m, "max")
if err != nil {
return nil, err
}
-
return uintRangeFunc(f, min, max), nil
},
})
@@ -458,26 +520,45 @@ func addNumberLookup() {
Description: "Signed integer",
Example: "14866",
Output: "int",
- Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
- return intFunc(f), nil
+ Aliases: []string{
+ "signed whole",
+ "two-sided count",
+ "negative-or-positive value",
+ "zero-inclusive whole",
+ "general int type",
},
+ Keywords: []string{
+ "signed", "integer",
+ "positive", "negative", "zero", "counting",
+ },
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return intFunc(f), nil },
})
AddFuncLookup("intn", Info{
Display: "IntN",
Category: "number",
- Description: "Integer value between 0 and n",
+ Description: "Integer between 0 (inclusive) and n (exclusive)",
Example: "32783",
Output: "int",
+ Aliases: []string{
+ "upper-bounded int",
+ "exclusive-maximum int",
+ "zero-through-n minus one",
+ "limited-range int",
+ "cap-limited integer",
+ },
+ Keywords: []string{
+ "range", "upper", "limit", "bound",
+ "cap", "max", "exclusive", "integer",
+ },
Params: []Param{
- {Field: "n", Display: "N", Type: "int", Default: "2147483647", Description: "Maximum int value"},
+ {Field: "n", Display: "N", Type: "int", Default: "2147483647", Description: "Maximum int value (exclusive)"},
},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
n, err := info.GetInt(m, "n")
if err != nil {
return nil, err
}
-
return intNFunc(f, n), nil
},
})
@@ -485,53 +566,84 @@ func addNumberLookup() {
AddFuncLookup("int8", Info{
Display: "Int8",
Category: "number",
- Description: "Signed 8-bit integer, capable of representing values from -128 to 127",
+ Description: "Signed 8-bit integer, range −128–127",
Example: "24",
Output: "int8",
- Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
- return int8Func(f), nil
+ Aliases: []string{
+ "byte-sized signed", "small signed range", "one-byte integer", "8-bit whole signed", "narrow signed value", "tiny int", "signed byte",
},
+ Keywords: []string{
+ "signed", "8bit", "range", "twoscomplement", "integer", "arithmetic", "numeric", "binary", "storage",
+ },
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return int8Func(f), nil },
})
AddFuncLookup("int16", Info{
Display: "Int16",
Category: "number",
- Description: "Signed 16-bit integer, capable of representing values from 32,768 to 32,767",
+ Description: "Signed 16-bit integer, range −32,768–32,767",
Example: "2200",
Output: "int16",
- Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
- return int16Func(f), nil
+ Aliases: []string{
+ "two-byte signed", "short integer signed", "16-bit whole signed", "narrow-mid signed", "twobyte int", "short int", "halfword signed",
},
+ Keywords: []string{
+ "signed", "16bit", "range", "word", "numeric", "arithmetic", "binary", "integer",
+ },
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return int16Func(f), nil },
})
AddFuncLookup("int32", Info{
Display: "Int32",
Category: "number",
- Description: "Signed 32-bit integer, capable of representing values from -2,147,483,648 to 2,147,483,647",
+ Description: "Signed 32-bit integer, range −2,147,483,648–2,147,483,647",
Example: "-1072427943",
Output: "int32",
- Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
- return int32Func(f), nil
+ Aliases: []string{
+ "four-byte signed", "standard-width signed", "32-bit whole signed", "midrange integer", "int32 value", "long int", "standard signed int",
},
+ Keywords: []string{
+ "signed", "32bit", "range", "ipv4", "numeric", "arithmetic", "binary", "integer",
+ },
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return int32Func(f), nil },
})
AddFuncLookup("int64", Info{
Display: "Int64",
Category: "number",
- Description: "Signed 64-bit integer, capable of representing values from -9,223,372,036,854,775,808 to -9,223,372,036,854,775,807",
+ Description: "Signed 64-bit integer, range −9,223,372,036,854,775,808–9,223,372,036,854,775,807",
Example: "-8379641344161477543",
Output: "int64",
- Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
- return int64Func(f), nil
+ Aliases: []string{
+ "eight-byte signed",
+ "long-width integer",
+ "64-bit whole signed",
+ "large signed value",
+ "extended signed range",
},
+ Keywords: []string{
+ "signed", "64bit", "bigint", "range", "timestamp", "nanosecond",
+ },
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return int64Func(f), nil },
})
AddFuncLookup("intrange", Info{
- Display: "IntRange",
+ Display: "Int Range",
Category: "number",
- Description: "Integer value between given range",
+ Description: "Signed integer value within a given range",
Example: "-8379477543",
Output: "int",
+ Aliases: []string{
+ "signed span",
+ "bounded integer result",
+ "constrained int output",
+ "limited signed interval",
+ "ranged whole value",
+ },
+ Keywords: []string{
+ "int", "range", "min", "max",
+ "bounds", "limits", "interval", "span",
+ },
Params: []Param{
{Field: "min", Display: "Min", Type: "int", Description: "Minimum int value"},
{Field: "max", Display: "Max", Type: "int", Description: "Maximum int value"},
@@ -541,12 +653,10 @@ func addNumberLookup() {
if err != nil {
return nil, err
}
-
max, err := info.GetInt(m, "max")
if err != nil {
return nil, err
}
-
return intRangeFunc(f, min, max), nil
},
})
@@ -554,20 +664,40 @@ func addNumberLookup() {
AddFuncLookup("float32", Info{
Display: "Float32",
Category: "number",
- Description: "Data type representing floating-point numbers with 32 bits of precision in computing",
+ Description: "Floating-point number with 32-bit single precision (IEEE 754)",
Example: "3.1128167e+37",
Output: "float32",
- Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
- return float32Func(f), nil
+ Aliases: []string{
+ "single-precision float",
+ "fp32 numeric",
+ "32-bit real",
+ "float single",
+ "reduced-precision real",
},
+ Keywords: []string{
+ "single-precision", "ieee754",
+ "fp32", "mantissa", "exponent", "decimal",
+ },
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return float32Func(f), nil },
})
AddFuncLookup("float32range", Info{
Display: "Float32 Range",
Category: "number",
- Description: "Float32 value between given range",
+ Description: "Float32 value within a given range",
Example: "914774.6",
Output: "float32",
+ Aliases: []string{
+ "single-precision span",
+ "bounded fp32",
+ "limited float32 output",
+ "constrained 32-bit real",
+ "float single interval",
+ },
+ Keywords: []string{
+ "float32", "range",
+ "min", "max", "bounds", "limits", "interval",
+ },
Params: []Param{
{Field: "min", Display: "Min", Type: "float", Description: "Minimum float32 value"},
{Field: "max", Display: "Max", Type: "float", Description: "Maximum float32 value"},
@@ -577,12 +707,10 @@ func addNumberLookup() {
if err != nil {
return nil, err
}
-
max, err := info.GetFloat32(m, "max")
if err != nil {
return nil, err
}
-
return float32Range(f, min, max), nil
},
})
@@ -590,20 +718,41 @@ func addNumberLookup() {
AddFuncLookup("float64", Info{
Display: "Float64",
Category: "number",
- Description: "Data type representing floating-point numbers with 64 bits of precision in computing",
+ Description: "Floating-point number with 64-bit double precision (IEEE 754)",
Example: "1.644484108270445e+307",
Output: "float64",
- Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
- return float64Func(f), nil
+ Aliases: []string{
+ "double-precision float",
+ "fp64 numeric",
+ "64-bit real",
+ "float double",
+ "high-precision real",
},
+ Keywords: []string{
+ "double-precision", "ieee754",
+ "fp64", "mantissa", "exponent", "decimal",
+ "precision", "scientific", "number",
+ },
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return float64Func(f), nil },
})
AddFuncLookup("float64range", Info{
Display: "Float64 Range",
Category: "number",
- Description: "Float64 value between given range",
+ Description: "Float64 value within a given range",
Example: "914774.5585333086",
Output: "float64",
+ Aliases: []string{
+ "double-precision span",
+ "bounded fp64",
+ "limited float64 output",
+ "constrained 64-bit real",
+ "float double interval",
+ },
+ Keywords: []string{
+ "float64", "range",
+ "min", "max", "bounds", "limits", "interval",
+ },
Params: []Param{
{Field: "min", Display: "Min", Type: "float", Description: "Minimum float64 value"},
{Field: "max", Display: "Max", Type: "float", Description: "Maximum float64 value"},
@@ -613,12 +762,10 @@ func addNumberLookup() {
if err != nil {
return nil, err
}
-
max, err := info.GetFloat64(m, "max")
if err != nil {
return nil, err
}
-
return float64Range(f, min, max), nil
},
})
@@ -629,6 +776,17 @@ func addNumberLookup() {
Description: "Shuffles an array of ints",
Example: "1,2,3,4 => 3,1,4,2",
Output: "[]int",
+ Aliases: []string{
+ "reorder integers",
+ "scramble int slice",
+ "random permutation ints",
+ "reshuffle numbers",
+ "jumbled int output",
+ },
+ Keywords: []string{
+ "shuffle", "permute", "randomize",
+ "ints", "slice", "array", "permutation",
+ },
Params: []Param{
{Field: "ints", Display: "Integers", Type: "[]int", Description: "Delimited separated integers"},
},
@@ -637,9 +795,7 @@ func addNumberLookup() {
if err != nil {
return nil, err
}
-
shuffleInts(f, ints)
-
return ints, nil
},
})
@@ -650,6 +806,17 @@ func addNumberLookup() {
Description: "Randomly selected value from a slice of int",
Example: "-1,2,-3,4 => -3",
Output: "int",
+ Aliases: []string{
+ "draw one integer",
+ "sample an int",
+ "pick from ints",
+ "select a number",
+ "choose single int",
+ },
+ Keywords: []string{
+ "random", "pick", "choose",
+ "select", "ints", "slice", "list",
+ },
Params: []Param{
{Field: "ints", Display: "Integers", Type: "[]int", Description: "Delimited separated integers"},
},
@@ -658,7 +825,6 @@ func addNumberLookup() {
if err != nil {
return nil, err
}
-
return randomInt(f, ints), nil
},
})
@@ -669,6 +835,17 @@ func addNumberLookup() {
Description: "Randomly selected value from a slice of uint",
Example: "1,2,3,4 => 4",
Output: "uint",
+ Aliases: []string{
+ "draw one unsigned",
+ "sample a uint",
+ "pick from uints",
+ "select an unsigned",
+ "choose single uint",
+ },
+ Keywords: []string{
+ "random", "pick", "choose",
+ "select", "uints", "slice", "list", "nonnegative",
+ },
Params: []Param{
{Field: "uints", Display: "Unsigned Integers", Type: "[]uint", Description: "Delimited separated unsigned integers"},
},
@@ -677,7 +854,6 @@ func addNumberLookup() {
if err != nil {
return nil, err
}
-
return randomUint(f, uints), nil
},
})
@@ -688,6 +864,17 @@ func addNumberLookup() {
Description: "Hexadecimal representation of an unsigned integer",
Example: "0x87",
Output: "string",
+ Aliases: []string{
+ "hex-encoded unsigned",
+ "base-16 uint string",
+ "prefixed 0x value",
+ "hex view of uint",
+ "formatted unsigned hex",
+ },
+ Keywords: []string{
+ "hex", "base16", "uint", "0x",
+ "bits", "width", "format",
+ },
Params: []Param{
{Field: "bitSize", Display: "Bit Size", Type: "int", Default: "8", Description: "Bit size of the unsigned integer"},
},
@@ -696,8 +883,8 @@ func addNumberLookup() {
if err != nil {
return nil, err
}
-
return hexUint(f, bitSize), nil
},
})
+
}
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/payment.go b/vendor/github.com/brianvoe/gofakeit/v7/payment.go
index 52496153..8aac56df 100644
--- a/vendor/github.com/brianvoe/gofakeit/v7/payment.go
+++ b/vendor/github.com/brianvoe/gofakeit/v7/payment.go
@@ -108,7 +108,7 @@ func creditCardNumber(f *Faker, cco *CreditCardOptions) string {
if cco == nil {
cco = &CreditCardOptions{}
}
- if cco.Types == nil || len(cco.Types) == 0 {
+ if len(cco.Types) == 0 {
cco.Types = data.CreditCardTypes
}
ccType := randomString(f, cco.Types)
@@ -240,50 +240,80 @@ func bitcoinPrivateKey(f *Faker) string {
return "5" + randomString(f, []string{"H", "J", "K"}) + b.String()
}
+func BankName() string { return bankName(GlobalFaker) }
+
+func (f *Faker) BankName() string { return bankName(f) }
+
+func bankName(f *Faker) string { return getRandValue(f, []string{"bank", "name"}) }
+
+func BankType() string { return bankType(GlobalFaker) }
+
+func (f *Faker) BankType() string { return bankType(f) }
+
+func bankType(f *Faker) string { return getRandValue(f, []string{"bank", "type"}) }
+
func addPaymentLookup() {
AddFuncLookup("currency", Info{
Display: "Currency",
Category: "payment",
- Description: "Medium of exchange, often in the form of paper money or coins, used for trade and transactions",
+ Description: "Medium of exchange, often in the form of money, used for trade and transactions",
Example: `{
"short": "IQD",
"long": "Iraq Dinar"
}`,
Output: "map[string]string",
ContentType: "application/json",
- Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
- return currency(f), nil
+ Aliases: []string{
+ "currency unit", "currency code", "money type", "exchange currency", "monetary unit", "legal tender", "fiat money",
},
+ Keywords: []string{
+ "money", "exchange", "fiat", "unit", "code", "iso", "usd", "eur", "gbp", "jpy", "cny", "trade", "transaction", "market",
+ },
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return currency(f), nil },
})
AddFuncLookup("currencyshort", Info{
Display: "Currency Short",
Category: "payment",
- Description: "Short 3-letter word used to represent a specific currency",
+ Description: "Short 3-letter ISO code used to represent a specific currency",
Example: "USD",
Output: "string",
- Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
- return currencyShort(f), nil
+ Aliases: []string{
+ "iso alpha-3", "currency ticker", "alpha-3 code", "currency shorthand", "iso-4217 code",
},
+ Keywords: []string{
+ "currency", "short", "iso", "code", "alpha3", "usd", "eur", "gbp", "jpy", "cad", "aud",
+ },
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return currencyShort(f), nil },
})
AddFuncLookup("currencylong", Info{
Display: "Currency Long",
Category: "payment",
- Description: "Complete name of a specific currency used for official identification in financial transactions",
+ Description: "Complete name of a specific currency used in financial transactions",
Example: "United States Dollar",
Output: "string",
- Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
- return currencyLong(f), nil
+ Aliases: []string{
+ "currency name", "full currency", "long form name", "official currency", "monetary name",
},
+ Keywords: []string{
+ "currency", "name", "long", "full", "official", "dollar", "euro", "pound", "yen", "franc", "peso", "rupee",
+ },
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return currencyLong(f), nil },
})
AddFuncLookup("price", Info{
Display: "Price",
Category: "payment",
- Description: "The amount of money or value assigned to a product, service, or asset in a transaction",
+ Description: "The amount of money assigned to a product, service, or asset in a transaction",
Example: "92.26",
Output: "float64",
+ Aliases: []string{
+ "amount", "cost", "value", "fee", "charge", "rate", "unit price",
+ },
+ Keywords: []string{
+ "payment", "transaction", "retail", "wholesale", "market", "asset", "listing", "quote", "valuation",
+ },
Params: []Param{
{Field: "min", Display: "Min", Type: "float", Default: "0", Description: "Minimum price value"},
{Field: "max", Display: "Max", Type: "float", Default: "1000", Description: "Maximum price value"},
@@ -293,12 +323,10 @@ func addPaymentLookup() {
if err != nil {
return nil, err
}
-
max, err := info.GetFloat64(m, "max")
if err != nil {
return nil, err
}
-
return price(f, min, max), nil
},
})
@@ -306,18 +334,22 @@ func addPaymentLookup() {
AddFuncLookup("creditcard", Info{
Display: "Credit Card",
Category: "payment",
- Description: "Plastic card allowing users to make purchases on credit, with payment due at a later date",
+ Description: "Card allowing users to make purchases on credit, with payment due at a later date",
Example: `{
- "type": "UnionPay",
- "number": "4364599489953698",
- "exp": "02/24",
- "cvv": "300"
+ "type": "Visa",
+ "number": "4111111111111111",
+ "exp": "02/27",
+ "cvv": "123"
}`,
Output: "map[string]any",
ContentType: "application/json",
- Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
- return creditCard(f), nil
+ Aliases: []string{
+ "credit card", "payment card", "charge card", "credit instrument", "card account", "plastic card",
},
+ Keywords: []string{
+ "credit", "card", "payment", "debt", "visa", "mastercard", "amex", "discover", "unionpay", "maestro", "jcb",
+ },
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return creditCard(f), nil },
})
AddFuncLookup("creditcardtype", Info{
@@ -326,17 +358,27 @@ func addPaymentLookup() {
Description: "Classification of credit cards based on the issuing company",
Example: "Visa",
Output: "string",
- Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
- return creditCardType(f), nil
+ Aliases: []string{
+ "credit card type", "issuer brand", "card network", "scheme name", "card family", "issuer type",
},
+ Keywords: []string{
+ "credit", "card", "type", "issuer", "brand", "network", "visa", "mastercard", "amex", "discover", "unionpay", "maestro", "jcb",
+ },
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return creditCardType(f), nil },
})
AddFuncLookup("creditcardnumber", Info{
Display: "Credit Card Number",
Category: "payment",
- Description: "Unique numerical identifier on a credit card used for making electronic payments and transactions",
- Example: "4136459948995369",
+ Description: "Unique number on a credit card used for electronic payments",
+ Example: "4111111111111111",
Output: "string",
+ Aliases: []string{
+ "credit card", "credit card number", "card number", "cc number", "primary account number", "pan value", "payment number",
+ },
+ Keywords: []string{
+ "credit", "card", "number", "identifier", "luhn", "validation", "checksum", "bin", "tokenize", "masking", "digits",
+ },
Params: []Param{
{
Field: "types", Display: "Types", Type: "[]string", Default: "all",
@@ -344,7 +386,7 @@ func addPaymentLookup() {
Description: "A select number of types you want to use when generating a credit card number",
},
{Field: "bins", Display: "Bins", Type: "[]string", Optional: true, Description: "Optional list of prepended bin numbers to pick from"},
- {Field: "gaps", Display: "Gaps", Type: "bool", Default: "false", Description: "Whether or not to have gaps in number"},
+ {Field: "gaps", Display: "Gaps", Type: "bool", Default: "false", Optional: true, Description: "Whether or not to have gaps in number"},
},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
types, err := info.GetStringArray(m, "types")
@@ -354,23 +396,12 @@ func addPaymentLookup() {
if len(types) == 1 && types[0] == "all" {
types = []string{}
}
-
bins, _ := info.GetStringArray(m, "bins")
-
- gaps, err := info.GetBool(m, "gaps")
- if err != nil {
- return nil, err
- }
-
- options := CreditCardOptions{
- Types: types,
- Gaps: gaps,
- }
-
+ gaps, _ := info.GetBool(m, "gaps")
+ options := CreditCardOptions{Types: types, Gaps: gaps}
if len(bins) >= 1 {
options.Bins = bins
}
-
return creditCardNumber(f, &options), nil
},
})
@@ -378,66 +409,121 @@ func addPaymentLookup() {
AddFuncLookup("creditcardexp", Info{
Display: "Credit Card Exp",
Category: "payment",
- Description: "Date when a credit card becomes invalid and cannot be used for transactions",
- Example: "01/21",
+ Description: "Expiration date of a credit card",
+ Example: "01/27",
Output: "string",
- Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
- return creditCardExp(f), nil
+ Aliases: []string{
+ "credit card exp", "credit card expiration", "expiry date", "expiration date", "exp date", "valid thru", "card expiry",
},
+ Keywords: []string{
+ "credit", "card", "exp", "expiry", "expiration", "month", "year", "validity", "future", "expired",
+ },
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return creditCardExp(f), nil },
})
AddFuncLookup("creditcardcvv", Info{
Display: "Credit Card CVV",
Category: "payment",
- Description: "Three or four-digit security code on a credit card used for online and remote transactions",
+ Description: "Three or four-digit security code on a credit card",
Example: "513",
Output: "string",
- Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
- return creditCardCvv(f), nil
+ Aliases: []string{
+ "credit card cvv", "cvv", "cvc", "cid", "security number", "auth digits", "card check value", "security code",
},
+ Keywords: []string{
+ "security", "code", "verification", "authentication", "fraud", "protection", "online", "payment", "transaction",
+ },
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return creditCardCvv(f), nil },
})
AddFuncLookup("achrouting", Info{
Display: "ACH Routing Number",
Category: "payment",
- Description: "Unique nine-digit code used in the U.S. for identifying the bank and processing electronic transactions",
+ Description: "Nine-digit code used in the U.S. for identifying a bank in ACH transactions",
Example: "513715684",
Output: "string",
- Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
- return achRouting(f), nil
+ Aliases: []string{
+ "routing number", "aba number", "routing transit number", "rtn code", "bank routing id",
},
+ Keywords: []string{
+ "ach", "routing", "aba", "us", "bank", "federal", "reserve", "clearinghouse",
+ },
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return achRouting(f), nil },
})
AddFuncLookup("achaccount", Info{
Display: "ACH Account Number",
Category: "payment",
- Description: "A bank account number used for Automated Clearing House transactions and electronic transfers",
+ Description: "Bank account number used for Automated Clearing House transactions",
Example: "491527954328",
Output: "string",
- Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
- return achAccount(f), nil
+ Aliases: []string{
+ "account number", "ach account", "bank account", "checking account", "savings account", "account identifier",
},
+ Keywords: []string{
+ "ach", "account", "banking", "checking", "savings", "finance", "electronic", "transfer", "payment",
+ },
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return achAccount(f), nil },
})
AddFuncLookup("bitcoinaddress", Info{
Display: "Bitcoin Address",
Category: "payment",
- Description: "Cryptographic identifier used to receive, store, and send Bitcoin cryptocurrency in a peer-to-peer network",
- Example: "1lWLbxojXq6BqWX7X60VkcDIvYA",
+ Description: "Cryptographic identifier used to send and receive Bitcoin",
+ Example: "1BoatSLRHtKNngkdXEeobR76b53LETtpyT",
Output: "string",
- Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
- return bitcoinAddress(f), nil
+ Aliases: []string{
+ "btc address", "bitcoin wallet", "crypto address", "public address", "payment address",
},
+ Keywords: []string{
+ "bitcoin", "btc", "wallet", "blockchain", "public", "key", "hash", "base58",
+ },
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return bitcoinAddress(f), nil },
})
AddFuncLookup("bitcoinprivatekey", Info{
Display: "Bitcoin Private Key",
Category: "payment",
- Description: "Secret, secure code that allows the owner to access and control their Bitcoin holdings",
- Example: "5vrbXTADWJ6sQBSYd6lLkG97jljNc0X9VPBvbVqsIH9lWOLcoqg",
+ Description: "Secret key that allows access and control over Bitcoin holdings",
+ Example: "5HueCGU8rMjxEXxiPuD5BDuG6o5xjA7QkbPp",
Output: "string",
- Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
- return bitcoinPrivateKey(f), nil
+ Aliases: []string{
+ "btc private key", "wallet key", "secret key", "private wif", "signing key",
},
+ Keywords: []string{
+ "bitcoin", "btc", "private", "key", "blockchain", "wallet", "signature", "base58", "wif",
+ },
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return bitcoinPrivateKey(f), nil },
})
+
+ AddFuncLookup("bankname", Info{
+ Display: "Bank Name",
+ Category: "payment",
+ Description: "Name of a financial institution that offers banking services",
+ Example: "Wells Fargo",
+ Output: "string",
+ Aliases: []string{
+ "financial institution", "banking entity", "lender name", "depository name", "institution title",
+ },
+ Keywords: []string{
+ "bank", "name", "institution", "financial", "wells", "fargo", "chase", "citibank", "pnc", "boa", "usbank",
+ },
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return bankName(f), nil },
+ })
+
+ AddFuncLookup("banktype", Info{
+ Display: "Bank Type",
+ Category: "payment",
+ Description: "Classification of a bank based on its services and operations",
+ Example: "Investment Bank",
+ Output: "string",
+ Aliases: []string{
+ "bank classification", "bank category", "bank segment", "institution class", "service tier",
+ },
+ Keywords: []string{
+ "bank", "type", "classification", "category", "segment", "investment", "commercial", "retail", "savings", "credit", "union", "central", "federal",
+ },
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return bankType(f), nil },
+ })
+
}
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/person.go b/vendor/github.com/brianvoe/gofakeit/v7/person.go
index 3eb804c3..b69a5321 100644
--- a/vendor/github.com/brianvoe/gofakeit/v7/person.go
+++ b/vendor/github.com/brianvoe/gofakeit/v7/person.go
@@ -11,6 +11,7 @@ type PersonInfo struct {
FirstName string `json:"first_name" xml:"first_name"`
LastName string `json:"last_name" xml:"last_name"`
Gender string `json:"gender" xml:"gender"`
+ Age int `json:"age" xml:"age"`
SSN string `json:"ssn" xml:"ssn"`
Hobby string `json:"hobby" xml:"hobby"`
Job *JobInfo `json:"job" xml:"job"`
@@ -30,6 +31,7 @@ func person(f *Faker) *PersonInfo {
FirstName: firstName(f),
LastName: lastName(f),
Gender: gender(f),
+ Age: age(f),
SSN: ssn(f),
Hobby: hobby(f),
Job: job(f),
@@ -89,6 +91,22 @@ func (f *Faker) NameSuffix() string { return nameSuffix(f) }
func nameSuffix(f *Faker) string { return getRandValue(f, []string{"person", "suffix"}) }
+// Age will generate a random age between 0 and 100
+func Age() int { return age(GlobalFaker) }
+
+// Age will generate a random age between 0 and 100
+func (f *Faker) Age() int { return age(f) }
+
+func age(f *Faker) int { return randIntRange(f, 0, 100) }
+
+// Ethnicity will generate a random ethnicity string
+func Ethnicity() string { return ethnicity(GlobalFaker) }
+
+// Ethnicity will generate a random ethnicity string
+func (f *Faker) Ethnicity() string { return ethnicity(f) }
+
+func ethnicity(f *Faker) string { return getRandValue(f, []string{"person", "ethnicity"}) }
+
// SSN will generate a random Social Security Number
func SSN() string { return ssn(GlobalFaker) }
@@ -97,6 +115,27 @@ func (f *Faker) SSN() string { return ssn(f) }
func ssn(f *Faker) string { return strconv.Itoa(randIntRange(f, 100000000, 999999999)) }
+// EIN will generate a random Employer Identification Number
+func EIN() string { return ein(GlobalFaker) }
+
+// EIN will generate a random Employer Identification Number
+func (f *Faker) EIN() string { return ein(f) }
+
+func ein(f *Faker) string {
+ // EIN format: XX-XXXXXXX (2 digits, dash, 7 digits)
+ // First two digits have specific valid prefixes
+ prefixes := []string{"10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", "54", "55", "56", "57", "58", "59", "60", "61", "62", "63", "64", "65", "66", "67", "68", "69", "70", "71", "72", "73", "74", "75", "76", "77", "78", "79", "80", "81", "82", "83", "84", "85", "86", "87", "88", "89", "90", "91", "92", "93", "94", "95", "96", "97", "98", "99"}
+ prefix := prefixes[f.IntN(len(prefixes))]
+
+ // Generate 7 random digits
+ sevenDigits := ""
+ for i := 0; i < 7; i++ {
+ sevenDigits += string(rune('0' + f.IntN(10)))
+ }
+
+ return prefix + "-" + sevenDigits
+}
+
// Gender will generate a random gender string
func Gender() string { return gender(GlobalFaker) }
@@ -119,6 +158,44 @@ func (f *Faker) Hobby() string { return hobby(f) }
func hobby(f *Faker) string { return getRandValue(f, []string{"person", "hobby"}) }
+// SocialMedia will generate a random social media string
+func SocialMedia() string { return socialMedia(GlobalFaker) }
+
+// SocialMedia will generate a random social media string
+func (f *Faker) SocialMedia() string { return socialMedia(f) }
+
+func socialMedia(f *Faker) string {
+ template := getRandValue(f, []string{"person", "social_media"})
+ social, err := generate(f, template)
+ if err != nil {
+ return template // fallback to raw template if generation fails
+ }
+
+ return social
+}
+
+// Bio will generate a random biography using mad libs style templates
+func Bio() string {
+ return bio(GlobalFaker)
+}
+
+// Bio will generate a random biography using mad libs style templates
+func (f *Faker) Bio() string {
+ return bio(f)
+}
+
+func bio(f *Faker) string {
+ template := getRandValue(f, []string{"person", "bio"})
+
+ // Use generate function to process the template with all available lookups
+ bio, err := generate(f, template)
+ if err != nil {
+ return template // fallback to raw template if generation fails
+ }
+
+ return bio
+}
+
// ContactInfo struct full of contact info
type ContactInfo struct {
Phone string `json:"phone" xml:"phone"`
@@ -211,6 +288,7 @@ func addPersonLookup() {
"first_name": "Markus",
"last_name": "Moen",
"gender": "male",
+ "age": 30,
"ssn": "275413589",
"image": "https://picsum.photos/208/500",
"hobby": "Lacrosse",
@@ -243,141 +321,411 @@ func addPersonLookup() {
}`,
Output: "map[string]any",
ContentType: "application/json",
+ Aliases: []string{
+ "person record",
+ "identity profile",
+ "user profile",
+ "personal info",
+ "individual data",
+ },
+ Keywords: []string{
+ "profile", "identity", "individual",
+ "user", "account", "record", "contact",
+ "name", "details", "attributes", "information",
+ "bio", "demographics", "personal", "data",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return person(f), nil
},
})
+ // full name
AddFuncLookup("name", Info{
Display: "Name",
Category: "person",
Description: "The given and family name of an individual",
Example: "Markus Moen",
Output: "string",
- Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
- return name(f), nil
+ Aliases: []string{
+ "full name",
+ "person name",
+ "complete name",
+ "name string",
+ "display name",
},
+ Keywords: []string{
+ "fullname", "given", "family",
+ "first", "last", "forename", "surname",
+ "display", "legal",
+ },
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return name(f), nil },
})
+ // name prefix (honorific)
AddFuncLookup("nameprefix", Info{
Display: "Name Prefix",
Category: "person",
Description: "A title or honorific added before a person's name",
Example: "Mr.",
Output: "string",
- Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
- return namePrefix(f), nil
+ Aliases: []string{
+ "name prefix",
+ "honorific",
+ "title prefix",
+ "courtesy title",
+ "pre-nominal",
},
+ Keywords: []string{
+ "prefix", "title", "mr", "ms", "mrs",
+ "dr", "prof", "sir", "madam", "rev", "fr",
+ },
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return namePrefix(f), nil },
})
+ // name suffix (generational/professional)
AddFuncLookup("namesuffix", Info{
Display: "Name Suffix",
Category: "person",
Description: "A title or designation added after a person's name",
Example: "Jr.",
Output: "string",
- Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
- return nameSuffix(f), nil
+ Aliases: []string{
+ "name suffix",
+ "post nominal",
+ "suffix designation",
+ "generational suffix",
+ "professional suffix",
},
+ Keywords: []string{
+ "suffix", "jr", "sr", "iii", "iv",
+ "esq", "phd", "md", "mba", "cpa",
+ "designation",
+ },
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return nameSuffix(f), nil },
})
+ // first name
AddFuncLookup("firstname", Info{
Display: "First Name",
Category: "person",
Description: "The name given to a person at birth",
Example: "Markus",
Output: "string",
- Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
- return firstName(f), nil
+ Aliases: []string{
+ "first name",
+ "given name",
+ "forename",
+ "personal name",
+ "given label",
},
+ Keywords: []string{
+ "first", "given", "name",
+ "preferred", "callname", "initial",
+ "personal",
+ },
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return firstName(f), nil },
})
+ // middle name
AddFuncLookup("middlename", Info{
Display: "Middle Name",
Category: "person",
Description: "Name between a person's first name and last name",
Example: "Belinda",
Output: "string",
- Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
- return middleName(f), nil
+ Aliases: []string{
+ "middle name",
+ "second name",
+ "additional name",
+ "secondary name",
+ "middle initial label",
},
+ Keywords: []string{
+ "middle", "second", "additional", "secondary",
+ "name", "initial", "intermediate", "optional",
+ },
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return middleName(f), nil },
})
+ // last name
AddFuncLookup("lastname", Info{
Display: "Last Name",
Category: "person",
Description: "The family name or surname of an individual",
Example: "Daniel",
Output: "string",
- Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
- return lastName(f), nil
+ Aliases: []string{
+ "last name",
+ "family name",
+ "surname",
+ "patronymic",
+ "family designation",
},
+ Keywords: []string{
+ "last", "family", "name",
+ "lineage", "heritage", "ancestry", "clan",
+ "tribe",
+ },
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return lastName(f), nil },
})
+ // gender
AddFuncLookup("gender", Info{
Display: "Gender",
Category: "person",
- Description: "Classification based on social and cultural norms that identifies an individual",
+ Description: "Classification that identifies gender",
Example: "male",
Output: "string",
- Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
- return gender(f), nil
+ Aliases: []string{
+ "gender identity",
+ "gender label",
+ "sex category",
+ "gender marker",
+ "presentation",
},
+ Keywords: []string{
+ "male", "female", "nonbinary",
+ "identity", "label", "category", "sex",
+ },
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return gender(f), nil },
})
+ // age
+ AddFuncLookup("age", Info{
+ Display: "Age",
+ Category: "person",
+ Description: "The number of years a person has lived",
+ Example: "40",
+ Output: "int",
+ Aliases: []string{
+ "age of person", "person age", "age of individual", "years old", "years of age",
+ },
+ Keywords: []string{
+ "years", "old", "birthday", "birthdate", "birth-date",
+ "lifespan", "maturity", "elderly", "young", "adult", "teenager", "child",
+ "senior", "juvenile", "minor", "majority", "minority", "generation",
+ },
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return age(f), nil },
+ })
+
+ // ethnicity
+ AddFuncLookup("ethnicity", Info{
+ Display: "Ethnicity",
+ Category: "person",
+ Description: "Classification that identifies a person's cultural or ethnic background",
+ Example: "German",
+ Output: "string",
+ Aliases: []string{
+ "ethnic background",
+ "ethnic identity",
+ "cultural background",
+ "cultural heritage",
+ "ethnic origin",
+ },
+ Keywords: []string{
+ "ethnic", "heritage", "ancestry",
+ "origin", "identity", "cultural", "nationality",
+ "background", "descent", "lineage",
+ },
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return ethnicity(f), nil },
+ })
+
+ // ssn
AddFuncLookup("ssn", Info{
Display: "SSN",
Category: "person",
Description: "Unique nine-digit identifier used for government and financial purposes in the United States",
Example: "296446360",
Output: "string",
- Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
- return ssn(f), nil
+ Aliases: []string{
+ "social security number",
+ "ssn number",
+ "us ssn",
+ "tax id us",
+ "federal id",
},
+ Keywords: []string{
+ "social", "security", "number",
+ "us", "tax", "irs", "employment",
+ "benefits", "identification",
+ },
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return ssn(f), nil },
})
+ AddFuncLookup("ein", Info{
+ Display: "EIN",
+ Category: "person",
+ Description: "Nine-digit Employer Identification Number used by businesses for tax purposes",
+ Example: "12-3456789",
+ Output: "string",
+ Aliases: []string{
+ "employer id",
+ "tax id",
+ "business tax id",
+ "federal tax id",
+ "irs number",
+ },
+ Keywords: []string{
+ "employer", "identification", "tax", "business", "federal", "irs", "number", "id",
+ },
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return ein(f), nil },
+ })
+
+ // hobby
AddFuncLookup("hobby", Info{
Display: "Hobby",
Category: "person",
Description: "An activity pursued for leisure and pleasure",
Example: "Swimming",
Output: "string",
- Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
- return hobby(f), nil
+ Aliases: []string{
+ "pastime",
+ "leisure activity",
+ "recreational activity",
+ "interest",
+ "free-time pursuit",
},
+ Keywords: []string{
+ "leisure", "recreation",
+ "activity", "sport", "craft",
+ "game", "collection",
+ },
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return hobby(f), nil },
})
+ AddFuncLookup("socialmedia", Info{
+ Display: "Social Media",
+ Category: "person",
+ Description: "Random social media string",
+ Example: "https://twitter.com/ImpossibleTrousers",
+ Output: "string",
+ Aliases: []string{
+ "social media",
+ "social link",
+ "social url",
+ "social handle",
+ "social username",
+ "social profile",
+ "profile link",
+ "profile url",
+ "profile handle",
+ "account link",
+ "account url",
+ "account handle",
+ "username handle",
+ "screen name",
+ // platform-intent phrases (useful for fuzzy scoring)
+ "twitter link",
+ "x link",
+ "instagram link",
+ "linkedin url",
+ "github url",
+ "tiktok handle",
+ "facebook profile",
+ },
+ Keywords: []string{
+ "social", "media", "profile", "account", "handle", "username",
+ "screenname", "link", "url",
+ "twitter", "x", "instagram", "linkedin", "github",
+ "tiktok", "facebook", "dribbble", "behance",
+ },
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return socialMedia(f), nil },
+ })
+
+ AddFuncLookup("bio", Info{
+ Display: "Biography",
+ Category: "person",
+ Description: "Random biography",
+ Example: "Born in New York, John grew up to become a Software Engineer who codes applications.",
+ Output: "string",
+ Aliases: []string{
+ "bio",
+ "short bio",
+ "mini bio",
+ "one line bio",
+ "profile bio",
+ "user bio",
+ "author bio",
+ "about",
+ "about me",
+ "profile summary",
+ "personal summary",
+ "blurb",
+ "elevator pitch",
+ },
+ Keywords: []string{
+ "profile", "summary", "tagline", "intro",
+ "overview", "description", "story", "background",
+ "career", "job", "role", "hobby", "personal", "person",
+ "one-liner", "author", "user",
+ },
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return f.Bio(), nil },
+ })
+
+ // email
AddFuncLookup("email", Info{
Display: "Email",
Category: "person",
- Description: "Electronic mail used for sending digital messages and communication over the internet",
+ Description: "Electronic mail address",
Example: "markusmoen@pagac.net",
Output: "string",
- Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
- return email(f), nil
+ Aliases: []string{
+ "email address",
+ "mail address",
+ "contact email",
+ "user email",
+ "electronic mailbox",
},
+ Keywords: []string{
+ "address", "mail", "inbox",
+ "account", "contact", "sender", "recipient",
+ "domain", "username",
+ },
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return email(f), nil },
})
+ // phone (raw digits)
AddFuncLookup("phone", Info{
Display: "Phone",
Category: "person",
Description: "Numerical sequence used to contact individuals via telephone or mobile devices",
Example: "6136459948",
Output: "string",
- Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
- return phone(f), nil
+ Aliases: []string{
+ "phone number",
+ "telephone number",
+ "mobile number",
+ "contact number",
+ "voice number",
},
+ Keywords: []string{
+ "number", "telephone", "mobile",
+ "contact", "dial", "cell", "landline",
+ "e164", "voice",
+ },
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return phone(f), nil },
})
+ // phone formatted (readable)
AddFuncLookup("phoneformatted", Info{
Display: "Phone Formatted",
Category: "person",
Description: "Formatted phone number of a person",
Example: "136-459-9489",
Output: "string",
- Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
- return phoneFormatted(f), nil
+ Aliases: []string{
+ "formatted phone",
+ "pretty phone",
+ "display phone",
+ "readable phone",
+ "formatted telephone",
},
+ Keywords: []string{
+ "phone", "formatted", "format", "pattern",
+ "dashes", "parentheses", "spaces", "separators",
+ "telephone", "contact",
+ },
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) { return phoneFormatted(f), nil },
})
AddFuncLookup("teams", Info{
@@ -402,6 +750,17 @@ func addPersonLookup() {
}`,
Output: "map[string][]string",
ContentType: "application/json",
+ Aliases: []string{
+ "people grouping",
+ "team assignment",
+ "random partition",
+ "group allocator",
+ "roster builder",
+ },
+ Keywords: []string{
+ "randomly", "person", "into",
+ "distribution", "allocation", "roster", "squad",
+ },
Params: []Param{
{Field: "people", Display: "Strings", Type: "[]string", Description: "Array of people"},
{Field: "teams", Display: "Strings", Type: "[]string", Description: "Array of teams"},
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/product.go b/vendor/github.com/brianvoe/gofakeit/v7/product.go
index 23f8c8b7..b8011a8b 100644
--- a/vendor/github.com/brianvoe/gofakeit/v7/product.go
+++ b/vendor/github.com/brianvoe/gofakeit/v7/product.go
@@ -2,7 +2,10 @@ package gofakeit
import (
"fmt"
+ "strconv"
"strings"
+
+ "github.com/brianvoe/gofakeit/v7/data"
)
type ProductInfo struct {
@@ -69,38 +72,62 @@ func (f *Faker) ProductName() string { return productName(f) }
func productName(f *Faker) string {
name := getRandValue(f, []string{"product", "name"})
- switch number(f, 0, 9) {
- case 1:
- // Name + Adjective + Feature
- return title(fmt.Sprintf("%s %s %s", name, getRandValue(f, []string{"product", "adjective"}), productFeature(f)))
- case 2:
- // Adjective + Material + Name
- return title(fmt.Sprintf("%s %s %s", getRandValue(f, []string{"product", "adjective"}), productMaterial(f), name))
- case 3:
- // Color + Name + Suffix
- return title(fmt.Sprintf("%s %s %s", safeColor(f), name, getRandValue(f, []string{"product", "suffix"})))
- case 4:
- // Feature + Name + Adjective
- return title(fmt.Sprintf("%s %s %s", productFeature(f), name, getRandValue(f, []string{"product", "adjective"})))
- case 5:
- // Material + Color + Name
- return title(fmt.Sprintf("%s %s %s", productMaterial(f), safeColor(f), name))
- case 6:
- // Name + Suffix + Material
- return title(fmt.Sprintf("%s %s %s", name, getRandValue(f, []string{"product", "suffix"}), productMaterial(f)))
- case 7:
- // Adjective + Feature + Name
- return title(fmt.Sprintf("%s %s %s", getRandValue(f, []string{"product", "adjective"}), productFeature(f), name))
- case 8:
- // Color + Material + Name
- return title(fmt.Sprintf("%s %s %s", safeColor(f), productMaterial(f), name))
- case 9:
- // Suffix + Adjective + Name
- return title(fmt.Sprintf("%s %s %s", getRandValue(f, []string{"product", "suffix"}), getRandValue(f, []string{"product", "adjective"}), name))
+ adj := func() string { return getRandValue(f, []string{"product", "adjective"}) }
+ suf := func() string { return getRandValue(f, []string{"product", "suffix"}) }
+ mat := func() string { return productMaterial(f) }
+ feat := func() string { return productFeature(f) }
+
+ // Small realism helpers: occasional compound/connector without turning into a listing
+ compoundAdj := func() string {
+ // 1 in 5: "adj-adj" (e.g., "Ultra-Light", "Quick-Dry")
+ if number(f, 1, 5) == 1 {
+ return fmt.Sprintf("%s-%s", adj(), adj())
+ }
+ return adj()
}
- // case: 0 - Adjective + Name + Suffix
- return title(fmt.Sprintf("%s %s %s", getRandValue(f, []string{"product", "adjective"}), name, getRandValue(f, []string{"product", "suffix"})))
+ // Keep it "product name"-ish: 2–3 chunks, no specs/colors/for-phrases.
+ // Weighted: 2-word names (~70%), 3-word names (~30%)
+ wordCount, _ := weighted(f, []any{"2word", "3word"}, []float32{70, 30})
+
+ switch wordCount {
+ case "2word":
+ // 2-word names (most common in real products)
+ switch number(f, 0, 4) {
+ case 0, 1:
+ // Adjective + Name (most common 2-word pattern)
+ return title(fmt.Sprintf("%s %s", compoundAdj(), name))
+ case 2:
+ // Name + Suffix
+ return title(fmt.Sprintf("%s %s", name, suf()))
+ case 3:
+ // Material + Name
+ return title(fmt.Sprintf("%s %s", mat(), name))
+ case 4:
+ // Feature + Name
+ return title(fmt.Sprintf("%s %s", feat(), name))
+ }
+
+ case "3word":
+ // 3-word names (less common)
+ switch number(f, 0, 4) {
+ case 0, 1:
+ // Adjective + Name + Suffix (most common 3-word pattern)
+ return title(fmt.Sprintf("%s %s %s", compoundAdj(), name, suf()))
+ case 2:
+ // Name + Feature + Suffix
+ return title(fmt.Sprintf("%s %s %s", name, feat(), suf()))
+ case 3:
+ // Adjective + Feature + Name
+ return title(fmt.Sprintf("%s %s %s", compoundAdj(), feat(), name))
+ case 4:
+ // Name + Material + Suffix
+ return title(fmt.Sprintf("%s %s %s", name, mat(), suf()))
+ }
+ }
+
+ // Fallback to 2-word name
+ return title(fmt.Sprintf("%s %s", compoundAdj(), name))
}
// ProductDescription will generate a random product description
@@ -233,6 +260,87 @@ func productSuffix(f *Faker) string {
return getRandValue(f, []string{"product", "suffix"})
}
+// ProductISBN13 will generate a random ISBN-13 string for the product
+func ProductISBN(opts *ISBNOptions) string { return productISBN(GlobalFaker, opts) }
+
+// ProductISBN13 will generate a random ISBN-13 string for the product
+func (f *Faker) ProductISBN(opts *ISBNOptions) string { return productISBN(f, opts) }
+
+type ISBNOptions struct {
+ Version string // "10" or "13"
+ Separator string // e.g. "-", "" (default: "-")
+}
+
+func productISBN(f *Faker, opts *ISBNOptions) string {
+ if opts == nil {
+ opts = &ISBNOptions{Version: "13", Separator: "-"}
+ }
+
+ sep := opts.Separator
+ if sep == "" {
+ sep = "-"
+ }
+
+ // string of n random digits
+ randomDigits := func(f *Faker, n int) string {
+ digits := make([]byte, n)
+ for i := 0; i < n; i++ {
+ digits[i] = byte('0' + number(f, 0, 9))
+ }
+ return string(digits)
+ }
+
+ switch opts.Version {
+ case "10":
+ // ISBN-10 format: group(1)-registrant(4)-publication(3)-check(1)
+ group := randomDigits(f, 1)
+ registrant := randomDigits(f, 4)
+ publication := randomDigits(f, 3)
+ base := group + registrant + publication
+
+ // checksum
+ sum := 0
+ for i, c := range base {
+ digit := int(c - '0')
+ sum += digit * (10 - i)
+ }
+ remainder := (11 - (sum % 11)) % 11
+ check := "X"
+ if remainder < 10 {
+ check = strconv.Itoa(remainder)
+ }
+
+ return strings.Join([]string{group, registrant, publication, check}, sep)
+
+ case "13":
+ // ISBN-13 format: prefix(3)-group(1)-registrant(4)-publication(4)-check(1)
+ prefix := data.ISBN13Prefix
+ group := randomDigits(f, 1)
+ registrant := randomDigits(f, 4)
+ publication := randomDigits(f, 4)
+ base := prefix + group + registrant + publication
+
+ // checksum
+ sum := 0
+ for i, c := range base {
+ digit := int(c - '0')
+ if i%2 == 0 {
+ sum += digit
+ } else {
+ sum += digit * 3
+ }
+ }
+ remainder := (10 - (sum % 10)) % 10
+ check := strconv.Itoa(remainder)
+
+ return strings.Join([]string{prefix, group, registrant, publication, check}, sep)
+
+ default:
+ // fallback to ISBN-13 if invalid version provided
+ return productISBN(f, &ISBNOptions{Version: "13", Separator: sep})
+ }
+}
+
func addProductLookup() {
AddFuncLookup("product", Info{
Display: "Product",
@@ -262,6 +370,17 @@ func addProductLookup() {
}`,
Output: "map[string]any",
ContentType: "application/json",
+ Aliases: []string{
+ "goods",
+ "merchandise",
+ "retail item",
+ "consumer product",
+ "commercial item",
+ },
+ Keywords: []string{
+ "sale", "use", "trade", "manufactured",
+ "market", "inventory", "supply", "distribution", "commodity",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return product(f), nil
},
@@ -273,6 +392,19 @@ func addProductLookup() {
Description: "Distinctive title or label assigned to a product for identification and marketing",
Example: "olive copper monitor",
Output: "string",
+ Aliases: []string{
+ "product title",
+ "product label",
+ "brand name",
+ "item name",
+ "product identifier",
+ },
+ Keywords: []string{
+ "product", "name", "title", "label", "brand",
+ "item", "merchandise", "goods", "article",
+ "identifier", "marketing", "branding",
+ "catalog", "inventory",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return productName(f), nil
},
@@ -284,6 +416,19 @@ func addProductLookup() {
Description: "Explanation detailing the features and characteristics of a product",
Example: "Backwards caused quarterly without week it hungry thing someone him regularly. Whomever this revolt hence from his timing as quantity us these yours.",
Output: "string",
+ Aliases: []string{
+ "product details",
+ "product specs",
+ "item description",
+ "feature list",
+ "marketing copy",
+ },
+ Keywords: []string{
+ "product", "description", "details", "features",
+ "specifications", "characteristics", "summary",
+ "overview", "attributes", "benefits",
+ "marketing", "content", "copy", "info", "text",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return productDescription(f), nil
},
@@ -295,6 +440,19 @@ func addProductLookup() {
Description: "Classification grouping similar products based on shared characteristics or functions",
Example: "clothing",
Output: "string",
+ Aliases: []string{
+ "product classification",
+ "product type",
+ "item category",
+ "product group",
+ "product segment",
+ },
+ Keywords: []string{
+ "product", "category", "type", "class", "classification",
+ "group", "segment", "line", "collection", "range",
+ "electronics", "furniture", "clothing", "appliances",
+ "food", "toys", "accessories", "goods",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return productCategory(f), nil
},
@@ -306,6 +464,19 @@ func addProductLookup() {
Description: "Specific characteristic of a product that distinguishes it from others products",
Example: "ultra-lightweight",
Output: "string",
+ Aliases: []string{
+ "product trait",
+ "product attribute",
+ "key feature",
+ "unique feature",
+ "special characteristic",
+ },
+ Keywords: []string{
+ "feature", "trait", "attribute", "characteristic",
+ "capability", "functionality", "specification",
+ "benefit", "advantage", "highlight",
+ "unique", "differentiator",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return productFeature(f), nil
},
@@ -317,6 +488,19 @@ func addProductLookup() {
Description: "The substance from which a product is made, influencing its appearance, durability, and properties",
Example: "brass",
Output: "string",
+ Aliases: []string{
+ "material type",
+ "product substance",
+ "product composition",
+ "item material",
+ "build material",
+ },
+ Keywords: []string{
+ "material", "substance", "composition", "make",
+ "fabric", "textile", "cloth", "leather", "wool",
+ "wood", "metal", "plastic", "glass", "stone",
+ "durability", "properties", "construction",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return productMaterial(f), nil
},
@@ -328,6 +512,20 @@ func addProductLookup() {
Description: "Standardized barcode used for product identification and tracking in retail and commerce",
Example: "012780949980",
Output: "string",
+ Aliases: []string{
+ "upc code",
+ "product barcode",
+ "product code",
+ "product sku",
+ "universal product code",
+ "retail barcode",
+ },
+ Keywords: []string{
+ "upc", "barcode", "product", "code", "identifier",
+ "sku", "retail", "commerce", "inventory",
+ "tracking", "scanning", "checkout", "label",
+ "universal", "standard",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return productUPC(f), nil
},
@@ -339,6 +537,20 @@ func addProductLookup() {
Description: "The group of people for whom the product is designed or intended",
Example: "adults",
Output: "[]string",
+ Aliases: []string{
+ "target audience",
+ "target market",
+ "customer group",
+ "user base",
+ "demographic group",
+ },
+ Keywords: []string{
+ "audience", "market", "segment", "demographic",
+ "consumer", "customer", "buyer", "user",
+ "group", "target", "population", "adults",
+ "kids", "teens", "families", "professionals",
+ },
+
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return productAudience(f), nil
},
@@ -350,6 +562,19 @@ func addProductLookup() {
Description: "The size or dimension of a product",
Example: "medium",
Output: "string",
+ Aliases: []string{
+ "product size",
+ "product measurement",
+ "item dimensions",
+ "product scale",
+ "size specification",
+ },
+ Keywords: []string{
+ "dimension", "size", "measurement", "proportion",
+ "scale", "specification", "specs", "length",
+ "width", "height", "depth", "volume", "weight",
+ "product", "item",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return productDimension(f), nil
},
@@ -361,6 +586,19 @@ func addProductLookup() {
Description: "The scenario or purpose for which a product is typically used",
Example: "home",
Output: "string",
+ Aliases: []string{
+ "use case",
+ "product purpose",
+ "intended use",
+ "product application",
+ "usage scenario",
+ },
+ Keywords: []string{
+ "use", "usecase", "purpose", "usage", "application",
+ "context", "scenario", "situation", "case",
+ "intention", "goal", "objective", "function",
+ "home", "office", "outdoor", "industrial", "commercial",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return productUseCase(f), nil
},
@@ -372,6 +610,17 @@ func addProductLookup() {
Description: "The key advantage or value the product provides",
Example: "comfort",
Output: "string",
+ Aliases: []string{
+ "product advantage",
+ "product value",
+ "user benefit",
+ "customer gain",
+ "selling point",
+ },
+ Keywords: []string{
+ "benefit", "advantage", "value", "improvement",
+ "enhancement", "feature", "positive", "outcome",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return productBenefit(f), nil
},
@@ -383,8 +632,39 @@ func addProductLookup() {
Description: "A suffix used to differentiate product models or versions",
Example: "pro",
Output: "string",
+ Aliases: []string{
+ "product suffix",
+ "model suffix",
+ "version suffix",
+ "edition suffix",
+ "name suffix",
+ },
+ Keywords: []string{
+ "suffix", "variant", "edition", "version", "model",
+ "series", "line", "tier", "release", "upgrade",
+ "plus", "pro", "max", "lite", "mini",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return productSuffix(f), nil
},
})
+
+ AddFuncLookup("productisbn", Info{
+ Display: "Product ISBN",
+ Category: "product",
+ Description: "ISBN-10 or ISBN-13 identifier for books",
+ Example: "978-1-4028-9462-6",
+ Output: "string",
+ Aliases: []string{
+ "isbn code", "isbn number", "book isbn", "isbn13",
+ "isbn10", "publication code", "book identifier",
+ },
+ Keywords: []string{
+ "identifier", "publication", "library", "catalog",
+ "literature", "reference", "edition", "registration", "publishing",
+ },
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
+ return productISBN(f, nil), nil
+ },
+ })
}
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/school.go b/vendor/github.com/brianvoe/gofakeit/v7/school.go
index b100ab80..e153e2dc 100644
--- a/vendor/github.com/brianvoe/gofakeit/v7/school.go
+++ b/vendor/github.com/brianvoe/gofakeit/v7/school.go
@@ -1,25 +1,31 @@
-package gofakeit
-
-// School will generate a random School type
-func School() string { return school(GlobalFaker) }
-
-func (f *Faker) School() string { return school(f) }
-
-func school(f *Faker) string {
- return getRandValue(f, []string{"school", "name"}) + " " +
- getRandValue(f, []string{"school", "isPrivate"}) + " " +
- getRandValue(f, []string{"school", "type"})
-}
-
-func addSchoolLookup() {
- AddFuncLookup("school", Info{
- Display: "School",
- Category: "school",
- Description: "An institution for formal education and learning",
- Example: `Harborview State Academy`,
- Output: "string",
- Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
- return school(f), nil
- },
- })
-}
+package gofakeit
+
+// School will generate a random School type
+func School() string { return school(GlobalFaker) }
+
+func (f *Faker) School() string { return school(f) }
+
+func school(f *Faker) string {
+ return getRandValue(f, []string{"school", "name"}) + " " +
+ getRandValue(f, []string{"school", "isPrivate"}) + " " +
+ getRandValue(f, []string{"school", "type"})
+}
+
+func addSchoolLookup() {
+ AddFuncLookup("school", Info{
+ Display: "School",
+ Category: "school",
+ Description: "An institution for formal education and learning",
+ Example: `Harborview State Academy`,
+ Output: "string",
+ Aliases: []string{
+ "academy", "educational institute", "learning center", "training school", "academic institution",
+ },
+ Keywords: []string{
+ "institution", "education", "learning", "teaching", "university", "college", "campus", "classroom", "study", "pupil", "curriculum", "instruction",
+ },
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
+ return school(f), nil
+ },
+ })
+}
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/slice.go b/vendor/github.com/brianvoe/gofakeit/v7/slice.go
index f9636eec..b13fff03 100644
--- a/vendor/github.com/brianvoe/gofakeit/v7/slice.go
+++ b/vendor/github.com/brianvoe/gofakeit/v7/slice.go
@@ -11,5 +11,9 @@ func Slice(v any) { sliceFunc(GlobalFaker, v) }
func (f *Faker) Slice(v any) { sliceFunc(f, v) }
func sliceFunc(f *Faker, v any) {
- r(f, reflect.TypeOf(v), reflect.ValueOf(v), "", -1)
+ // Note: We intentionally call r with size -1 instead of using structFunc.
+ // structFunc starts with size 0, which would result in zero-length top-level
+ // slices and maps. Passing -1 lets rSlice/rMap auto-size (random length)
+ // when no fakesize tag is provided.
+ r(f, reflect.TypeOf(v), reflect.ValueOf(v), "", -1, 0)
}
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/song.go b/vendor/github.com/brianvoe/gofakeit/v7/song.go
new file mode 100644
index 00000000..a89ed77c
--- /dev/null
+++ b/vendor/github.com/brianvoe/gofakeit/v7/song.go
@@ -0,0 +1,131 @@
+package gofakeit
+
+func SongName() string { return songName(GlobalFaker) }
+
+func (f *Faker) SongName() string { return songName(f) }
+
+func songName(f *Faker) string { return getRandValue(f, []string{"song", "name"}) }
+
+func SongArtist() string { return songArtist(GlobalFaker) }
+
+func (f *Faker) SongArtist() string { return songArtist(f) }
+
+func songArtist(f *Faker) string { return getRandValue(f, []string{"song", "artist"}) }
+
+func SongGenre() string { return songGenre(GlobalFaker) }
+
+func (f *Faker) SongGenre() string { return songGenre(f) }
+
+func songGenre(f *Faker) string { return getRandValue(f, []string{"song", "genre"}) }
+
+type SongInfo struct {
+ Name string `json:"name" xml:"name"`
+ Artist string `json:"artist" xml:"artist"`
+ Genre string `json:"genre" xml:"genre"`
+}
+
+func Song() *SongInfo { return song(GlobalFaker) }
+
+func (f *Faker) Song() *SongInfo { return song(f) }
+
+func song(f *Faker) *SongInfo {
+ return &SongInfo{
+ Name: songName(f),
+ Artist: songArtist(f),
+ Genre: songGenre(f),
+ }
+}
+
+func addSongLookup() {
+ AddFuncLookup("song", Info{
+ Display: "Song",
+ Category: "song",
+ Description: "Song with a drum and horn instrumentation",
+ Example: `{
+ "name": "New Rules",
+ "genre": "Tropical house"
+}`,
+ Output: "map[string]string",
+ ContentType: "application/json",
+ Aliases: []string{
+ "musical work",
+ "sound piece",
+ "single release",
+ "record title",
+ "audio selection",
+ },
+ Keywords: []string{
+ "music", "track", "tune", "melody",
+ "artist", "genre", "name", "composition", "recording",
+ },
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
+ return song(f), nil
+ },
+ })
+
+ AddFuncLookup("songname", Info{
+ Display: "Song Name",
+ Category: "song",
+ Description: "Title or name of a specific song used for identification and reference",
+ Example: "New Rules",
+ Output: "string",
+ Aliases: []string{
+ "song title",
+ "track name",
+ "music title",
+ "song label",
+ },
+ Keywords: []string{
+ "song", "title", "name", "track", "music",
+ "single", "hit", "tune", "recording",
+ "composition", "melody",
+ },
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
+ return songName(f), nil
+ },
+ })
+
+ AddFuncLookup("songartist", Info{
+ Display: "Song Artist",
+ Category: "song",
+ Description: "The artist of maker of song",
+ Example: "Dua Lipa",
+ Output: "string",
+ Aliases: []string{
+ "performer name",
+ "music act",
+ "band name",
+ "recording artist",
+ "song creator",
+ },
+ Keywords: []string{
+ "song", "artist", "singer", "musician", "composer",
+ "band", "producer", "vocalist", "group", "instrumentalist",
+ },
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
+ return songArtist(f), nil
+ },
+ })
+
+ AddFuncLookup("songgenre", Info{
+ Display: "Genre",
+ Category: "song",
+ Description: "Category that classifies song based on common themes, styles, and storytelling approaches",
+ Example: "Action",
+ Output: "string",
+ Aliases: []string{
+ "music style",
+ "song category",
+ "musical classification",
+ "sound type",
+ "genre label",
+ },
+ Keywords: []string{
+ "song", "style", "category", "type",
+ "classification", "theme", "musical", "subgenre", "influence",
+ },
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
+ return songGenre(f), nil
+ },
+ })
+}
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/sql.go b/vendor/github.com/brianvoe/gofakeit/v7/sql.go
index cf767758..0d447c9e 100644
--- a/vendor/github.com/brianvoe/gofakeit/v7/sql.go
+++ b/vendor/github.com/brianvoe/gofakeit/v7/sql.go
@@ -21,7 +21,7 @@ func sqlFunc(f *Faker, so *SQLOptions) (string, error) {
if so.Table == "" {
return "", errors.New("must provide table name to generate SQL")
}
- if so.Fields == nil || len(so.Fields) <= 0 {
+ if len(so.Fields) <= 0 {
return "", errors.New(("must pass fields in order to generate SQL queries"))
}
if so.Count <= 0 {
@@ -112,6 +112,12 @@ VALUES
(2, 'Santino', 235.13, 40, '1964-07-07 22:25:40');`,
Output: "string",
ContentType: "application/sql",
+ Aliases: []string{
+ "insert command", "database query", "sql statement", "record insert", "data query",
+ },
+ Keywords: []string{
+ "database", "insert", "command", "records", "table", "tuples", "rows", "data", "values", "query",
+ },
Params: []Param{
{Field: "table", Display: "Table", Type: "string", Description: "Name of the table to insert into"},
{Field: "count", Display: "Count", Type: "int", Default: "100", Description: "Number of inserts to generate"},
@@ -153,4 +159,5 @@ VALUES
return sqlFunc(f, &so)
},
})
+
}
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/string.go b/vendor/github.com/brianvoe/gofakeit/v7/string.go
index 5be37826..46bf032f 100644
--- a/vendor/github.com/brianvoe/gofakeit/v7/string.go
+++ b/vendor/github.com/brianvoe/gofakeit/v7/string.go
@@ -124,6 +124,12 @@ func addStringLookup() {
Description: "Character or symbol from the American Standard Code for Information Interchange (ASCII) character set",
Example: "g",
Output: "string",
+ Aliases: []string{
+ "alphabet", "character", "text symbol", "ascii char", "alphabetical sign",
+ },
+ Keywords: []string{
+ "standard", "code", "information", "interchange", "set", "printable", "typography", "symbolic", "encoding",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return letter(f), nil
},
@@ -135,6 +141,12 @@ func addStringLookup() {
Description: "ASCII string with length N",
Example: "gbRMaRxHki",
Output: "string",
+ Aliases: []string{
+ "random letters", "ascii string", "text sequence", "generated letters", "alphabetical string",
+ },
+ Keywords: []string{
+ "sequence", "multiple", "concatenated", "combined", "series", "generated", "batch", "collection",
+ },
Params: []Param{
{Field: "count", Display: "Count", Type: "uint", Description: "Number of digits to generate"},
},
@@ -154,6 +166,12 @@ func addStringLookup() {
Description: "Speech sound produced with an open vocal tract",
Example: "a",
Output: "string",
+ Aliases: []string{
+ "vocal sound", "speech letter", "phonetic vowel", "linguistic vowel", "spoken sound",
+ },
+ Keywords: []string{
+ "open", "e", "i", "o", "u", "phonetic", "linguistic", "articulation", "pronunciation", "syllable",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return vowel(f), nil
},
@@ -165,6 +183,12 @@ func addStringLookup() {
Description: "Numerical symbol used to represent numbers",
Example: "0",
Output: "string",
+ Aliases: []string{
+ "number symbol", "numeric character", "decimal digit", "ascii number", "numerical sign",
+ },
+ Keywords: []string{
+ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "decimal", "base10", "notation", "numeric",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return digit(f), nil
},
@@ -173,9 +197,15 @@ func addStringLookup() {
AddFuncLookup("digitn", Info{
Display: "DigitN",
Category: "string",
- Description: "string of length N consisting of ASCII digits",
+ Description: "String of length N consisting of ASCII digits",
Example: "0136459948",
Output: "string",
+ Aliases: []string{
+ "numeric string", "digit sequence", "number series", "generated digits", "ascii digits",
+ },
+ Keywords: []string{
+ "consisting", "multiple", "concatenated", "combined", "series", "numeric", "sequence", "continuous", "string", "digits",
+ },
Params: []Param{
{Field: "count", Display: "Count", Type: "uint", Description: "Number of digits to generate"},
},
@@ -195,6 +225,12 @@ func addStringLookup() {
Description: "Replace # with random numerical values",
Example: "(###)###-#### => (555)867-5309",
Output: "string",
+ Aliases: []string{
+ "hash replace", "number substitute", "pattern filler", "digit replacer", "placeholder numbers",
+ },
+ Keywords: []string{
+ "replace", "hash", "pound", "template", "placeholder", "format", "substitute", "pattern", "randomize", "masking",
+ },
Params: []Param{
{Field: "str", Display: "String", Type: "string", Description: "String value to replace #'s"},
},
@@ -214,6 +250,12 @@ func addStringLookup() {
Description: "Replace ? with random generated letters",
Example: "?????@??????.com => billy@mister.com",
Output: "string",
+ Aliases: []string{
+ "letter substitute", "pattern letters", "placeholder letters", "random letter filler", "character replacer",
+ },
+ Keywords: []string{
+ "replace", "question", "mark", "template", "placeholder", "format", "substitute", "pattern", "randomize", "masking",
+ },
Params: []Param{
{Field: "str", Display: "String", Type: "string", Description: "String value to replace ?'s"},
},
@@ -234,6 +276,12 @@ func addStringLookup() {
Example: "hello,world,whats,up => whats,world,hello,up",
Output: "[]string",
ContentType: "application/json",
+ Aliases: []string{
+ "array shuffle", "list randomize", "string reorder", "string mixer", "sequence shuffle",
+ },
+ Keywords: []string{
+ "collection", "list", "slice", "permutation", "randomized", "scrambled", "jumbled", "unordered",
+ },
Params: []Param{
{Field: "strs", Display: "Strings", Type: "[]string", Description: "Delimited separated strings"},
},
@@ -254,7 +302,13 @@ func addStringLookup() {
Category: "string",
Description: "Return a random string from a string array",
Example: "hello,world,whats,up => world",
- Output: "[]string",
+ Output: "string",
+ Aliases: []string{
+ "string picker", "array choice", "string select", "random pick", "string chooser",
+ },
+ Keywords: []string{
+ "selection", "chosen", "picked", "random", "list", "slice", "array", "choice", "element", "option",
+ },
Params: []Param{
{Field: "strs", Display: "Strings", Type: "[]string", Description: "Delimited separated strings"},
},
@@ -267,4 +321,5 @@ func addStringLookup() {
return randomString(f, strs), nil
},
})
+
}
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/struct.go b/vendor/github.com/brianvoe/gofakeit/v7/struct.go
index b2ac99a3..86026ae7 100644
--- a/vendor/github.com/brianvoe/gofakeit/v7/struct.go
+++ b/vendor/github.com/brianvoe/gofakeit/v7/struct.go
@@ -9,6 +9,10 @@ import (
"time"
)
+// RecursiveDepth controls the maximum recursion depth when populating structs.
+// Increase if your data structures are deeply nested; decrease to be more conservative.
+var RecursiveDepth = 10
+
// Struct fills in exported fields of a struct with random data
// based on the value of `fake` tag of exported fields
// or with the result of a call to the Fake() method
@@ -26,10 +30,10 @@ func Struct(v any) error { return structFunc(GlobalFaker, v) }
func (f *Faker) Struct(v any) error { return structFunc(f, v) }
func structFunc(f *Faker, v any) error {
- return r(f, reflect.TypeOf(v), reflect.ValueOf(v), "", 0)
+ return r(f, reflect.TypeOf(v), reflect.ValueOf(v), "", 0, 0)
}
-func r(f *Faker, t reflect.Type, v reflect.Value, tag string, size int) error {
+func r(f *Faker, t reflect.Type, v reflect.Value, tag string, size int, depth int) error {
// Handle special types
if t.PkgPath() == "encoding/json" {
@@ -50,9 +54,9 @@ func r(f *Faker, t reflect.Type, v reflect.Value, tag string, size int) error {
// Handle generic types
switch t.Kind() {
case reflect.Ptr:
- return rPointer(f, t, v, tag, size)
+ return rPointer(f, t, v, tag, size, depth)
case reflect.Struct:
- return rStruct(f, t, v, tag)
+ return rStruct(f, t, v, tag, depth)
case reflect.String:
return rString(f, t, v, tag)
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
@@ -64,9 +68,9 @@ func r(f *Faker, t reflect.Type, v reflect.Value, tag string, size int) error {
case reflect.Bool:
return rBool(f, t, v, tag)
case reflect.Array, reflect.Slice:
- return rSlice(f, t, v, tag, size)
+ return rSlice(f, t, v, tag, size, depth)
case reflect.Map:
- return rMap(f, t, v, tag, size)
+ return rMap(f, t, v, tag, size, depth)
}
return nil
@@ -123,7 +127,12 @@ func rCustom(f *Faker, v reflect.Value, tag string) error {
return nil
}
-func rStruct(f *Faker, t reflect.Type, v reflect.Value, tag string) error {
+func rStruct(f *Faker, t reflect.Type, v reflect.Value, tag string, depth int) error {
+ // Prevent recursing deeper than configured levels
+ if depth >= RecursiveDepth {
+ return nil
+ }
+
// Check if tag exists, if so run custom function
if t.Name() != "" && tag != "" {
return rCustom(f, v, tag)
@@ -214,7 +223,7 @@ func rStruct(f *Faker, t reflect.Type, v reflect.Value, tag string) error {
}
// Recursively call r() to fill in the struct
- err := r(f, elementT.Type, elementV, fakeTag, size)
+ err := r(f, elementT.Type, elementV, fakeTag, size, depth+1)
if err != nil {
return err
}
@@ -223,18 +232,23 @@ func rStruct(f *Faker, t reflect.Type, v reflect.Value, tag string) error {
return nil
}
-func rPointer(f *Faker, t reflect.Type, v reflect.Value, tag string, size int) error {
+func rPointer(f *Faker, t reflect.Type, v reflect.Value, tag string, size int, depth int) error {
elemT := t.Elem()
+ // Prevent recursing deeper than configured levels
+ if depth >= RecursiveDepth {
+ return nil
+ }
+
if v.IsNil() {
nv := reflect.New(elemT).Elem()
- err := r(f, elemT, nv, tag, size)
+ err := r(f, elemT, nv, tag, size, depth+1)
if err != nil {
return err
}
v.Set(nv.Addr())
} else {
- err := r(f, elemT, v.Elem(), tag, size)
+ err := r(f, elemT, v.Elem(), tag, size, depth+1)
if err != nil {
return err
}
@@ -243,12 +257,17 @@ func rPointer(f *Faker, t reflect.Type, v reflect.Value, tag string, size int) e
return nil
}
-func rSlice(f *Faker, t reflect.Type, v reflect.Value, tag string, size int) error {
+func rSlice(f *Faker, t reflect.Type, v reflect.Value, tag string, size int, depth int) error {
// If you cant even set it dont even try
if !v.CanSet() {
return errors.New("cannot set slice")
}
+ // Prevent recursing deeper than configured levels
+ if depth >= RecursiveDepth {
+ return nil
+ }
+
// Check if tag exists, if so run custom function
if t.Name() != "" && tag != "" {
// Check to see if custom function works if not continue to normal loop of values
@@ -284,7 +303,7 @@ func rSlice(f *Faker, t reflect.Type, v reflect.Value, tag string, size int) err
// Loop through the elements length and set based upon the index
for i := 0; i < size; i++ {
nv := reflect.New(elemT)
- err := r(f, elemT, nv.Elem(), tag, ogSize)
+ err := r(f, elemT, nv.Elem(), tag, ogSize, depth+1)
if err != nil {
return err
}
@@ -300,18 +319,22 @@ func rSlice(f *Faker, t reflect.Type, v reflect.Value, tag string, size int) err
return nil
}
-func rMap(f *Faker, t reflect.Type, v reflect.Value, tag string, size int) error {
+func rMap(f *Faker, t reflect.Type, v reflect.Value, tag string, size int, depth int) error {
// If you cant even set it dont even try
if !v.CanSet() {
return errors.New("cannot set slice")
}
+ // Prevent recursing deeper than configured levels
+ if depth >= RecursiveDepth {
+ return nil
+ }
+
// Check if tag exists, if so run custom function
if tag != "" {
return rCustom(f, v, tag)
- } else if size > 0 {
- // NOOP
- } else if isFakeable(t) {
+ } else if isFakeable(t) && size <= 0 {
+ // Only call custom function if no fakesize is specified (size <= 0)
value, err := callFake(f, v, reflect.Map)
if err != nil {
return err
@@ -334,14 +357,14 @@ func rMap(f *Faker, t reflect.Type, v reflect.Value, tag string, size int) error
for i := 0; i < newSize; i++ {
// Create new key
mapIndex := reflect.New(t.Key())
- err := r(f, t.Key(), mapIndex.Elem(), "", -1)
+ err := r(f, t.Key(), mapIndex.Elem(), "", -1, depth+1)
if err != nil {
return err
}
// Create new value
mapValue := reflect.New(t.Elem())
- err = r(f, t.Elem(), mapValue.Elem(), "", -1)
+ err = r(f, t.Elem(), mapValue.Elem(), "", -1, depth+1)
if err != nil {
return err
}
@@ -586,7 +609,7 @@ func rTime(f *Faker, t reflect.StructField, v reflect.Value, tag string) error {
// Check to see if they are passing in a format to parse the time
timeFormat, timeFormatOK := t.Tag.Lookup("format")
if timeFormatOK {
- timeFormat = javaDateFormatToGolangDateFormat(timeFormat)
+ timeFormat = javaDateTimeFormatToGolangFormat(timeFormat)
} else {
// If tag == "{date}" use time.RFC3339
// They are attempting to use the default date lookup
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/template.go b/vendor/github.com/brianvoe/gofakeit/v7/template.go
index 5921fbf6..612d387d 100644
--- a/vendor/github.com/brianvoe/gofakeit/v7/template.go
+++ b/vendor/github.com/brianvoe/gofakeit/v7/template.go
@@ -55,7 +55,9 @@ const templateMarkdown = `
*Author: {{FirstName}} {{LastName}}*
-{{Paragraph 2 5 7 "\n\n"}}
+{{Paragraph}}
+
+{{Paragraph}}
## Table of Contents
- [Installation](#installation)
@@ -119,7 +121,11 @@ Dear {{LastName}},
{{RandomString (SliceString "I trust this email finds you well." "I hope you're doing great." "Hoping this message reaches you in good spirits.")}} {{RandomString (SliceString "Wishing you a fantastic day!" "May your week be filled with joy." "Sending good vibes your way.")}}
-{{Paragraph 3 5 10 "\n\n"}}
+{{Paragraph}}
+
+{{Paragraph}}
+
+{{Paragraph}}
{{RandomString (SliceString "I would appreciate your thoughts on" "I'm eager to hear your feedback on" "I'm curious to know what you think about")}} it. If you have a moment, please feel free to check out the project on {{RandomString (SliceString "GitHub" "GitLab" "Bitbucket")}}
@@ -342,6 +348,12 @@ func addTemplateLookup() {
Markus Moen`,
Output: "string",
ContentType: "text/plain",
+ Aliases: []string{
+ "document template", "layout", "blueprint", "design pattern", "text template", "generator", "format schema",
+ },
+ Keywords: []string{
+ "generates", "format", "structure", "engine", "document", "pattern", "design", "syntax", "render", "compile",
+ },
Params: []Param{
{Field: "template", Display: "Template", Type: "string", Description: "Golang template to generate the document from"},
{Field: "data", Display: "Custom Data", Type: "string", Default: "", Optional: true, Description: "Custom data to pass to the template"},
@@ -397,6 +409,12 @@ print("purplesheep5 result:", "in progress")
## License
MIT`,
Output: "string",
+ Aliases: []string{
+ "markup language", "readme format", "lightweight markup", "documentation style", "plain text format", "md file", "doc format",
+ },
+ Keywords: []string{
+ "markdown", "markup", "language", "formatting", "plain", "text", "documentation", "lightweight", "syntax", "rendering", "structure", "readme",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
template_result, err := templateFunc(templateMarkdown, templateFuncMap(f, nil), &MarkdownOptions{})
return string(template_result), err
@@ -432,6 +450,19 @@ Milford Johnston
jamelhaag@king.org
(507)096-3058`,
Output: "string",
+ Aliases: []string{
+ "email body",
+ "email text",
+ "email message",
+ "message body",
+ "email content",
+ },
+ Keywords: []string{
+ "email", "body", "message", "content",
+ "subject", "salutation", "greeting", "closing",
+ "signature", "footer", "paragraph", "plaintext",
+ "correspondence", "communication",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
template_result, err := templateFunc(templateEmail, templateFuncMap(f, nil), &EmailOptions{})
return string(template_result), err
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/text.go b/vendor/github.com/brianvoe/gofakeit/v7/text.go
new file mode 100644
index 00000000..be62eb6c
--- /dev/null
+++ b/vendor/github.com/brianvoe/gofakeit/v7/text.go
@@ -0,0 +1,540 @@
+package gofakeit
+
+import (
+ "bytes"
+ "errors"
+ "strings"
+ "unicode"
+)
+
+// Comment will generate a random statement or remark expressing an opinion, observation, or reaction
+func Comment() string { return comment(GlobalFaker) }
+
+// Comment will generate a random statement or remark expressing an opinion, observation, or reaction
+func (f *Faker) Comment() string { return comment(f) }
+
+func comment(f *Faker) string {
+ template := getRandValue(f, []string{"text", "comment"})
+
+ // Generate using your faker
+ comment, err := generate(f, template)
+ if err != nil {
+ return template
+ }
+
+ // ~16% chance to capitalize first letter
+ if prob, _ := weighted(f, []any{0, 1}, []float32{5, 1}); prob == 1 {
+ if len(comment) > 0 {
+ comment = strings.ToUpper(comment[:1]) + comment[1:]
+ }
+ }
+
+ // ~15% chance to add punctuation
+ if prob, _ := weighted(f, []any{0, 1}, []float32{17, 3}); prob == 1 {
+ // Within punctuation: ? (4), ! (3), . (1)
+ switch p, _ := weighted(f, []any{"?", "!", "."}, []float32{4, 3, 1}); p {
+ case "?":
+ comment += "?"
+ case "!":
+ comment += "!"
+ case ".":
+ comment += "."
+ }
+ }
+
+ return comment
+}
+
+// Phrase will return a random phrase
+func Phrase() string { return phrase(GlobalFaker) }
+
+// Phrase will return a random phrase
+func (f *Faker) Phrase() string { return phrase(f) }
+
+func phrase(f *Faker) string { return getRandValue(f, []string{"text", "phrase"}) }
+
+// PhraseNoun will return a random noun phrase
+func PhraseNoun() string { return phraseNoun(GlobalFaker) }
+
+// PhraseNoun will return a random noun phrase
+func (f *Faker) PhraseNoun() string { return phraseNoun(f) }
+
+func phraseNoun(f *Faker) string {
+ str := ""
+
+ // You may also want to add an adjective to describe the noun
+ if boolFunc(f) {
+ str = adjectiveDescriptive(f) + " " + noun(f)
+ } else {
+ str = noun(f)
+ }
+
+ // Add determiner from weighted list
+ prob, _ := weighted(f, []any{1, 2, 3}, []float32{2, 1.5, 1})
+ switch prob {
+ case 1:
+ str = getArticle(str) + " " + str
+ case 2:
+ str = "the " + str
+ }
+
+ return str
+}
+
+// PhraseVerb will return a random preposition phrase
+func PhraseVerb() string { return phraseVerb(GlobalFaker) }
+
+// PhraseVerb will return a random preposition phrase
+func (f *Faker) PhraseVerb() string { return phraseVerb(f) }
+
+func phraseVerb(f *Faker) string {
+ // Put together a string builder
+ sb := []string{}
+
+ // You may have an adverb phrase
+ if boolFunc(f) {
+ sb = append(sb, phraseAdverb(f))
+ }
+
+ // Lets add the primary verb
+ sb = append(sb, verbAction(f))
+
+ // You may have a noun phrase
+ if boolFunc(f) {
+ sb = append(sb, phraseNoun(f))
+ }
+
+ // You may have an adverb phrase
+ if boolFunc(f) {
+ sb = append(sb, phraseAdverb(f))
+
+ // You may also have a preposition phrase
+ if boolFunc(f) {
+ sb = append(sb, phrasePreposition(f))
+ }
+
+ // You may also hae an adverb phrase
+ if boolFunc(f) {
+ sb = append(sb, phraseAdverb(f))
+ }
+ }
+
+ return strings.Join(sb, " ")
+}
+
+// PhraseAdverb will return a random adverb phrase
+func PhraseAdverb() string { return phraseAdverb(GlobalFaker) }
+
+// PhraseAdverb will return a random adverb phrase
+func (f *Faker) PhraseAdverb() string { return phraseAdverb(f) }
+
+func phraseAdverb(f *Faker) string {
+ if boolFunc(f) {
+ return adverbDegree(f) + " " + adverbManner(f)
+ }
+
+ return adverbManner(f)
+}
+
+// PhrasePreposition will return a random preposition phrase
+func PhrasePreposition() string { return phrasePreposition(GlobalFaker) }
+
+// PhrasePreposition will return a random preposition phrase
+func (f *Faker) PhrasePreposition() string { return phrasePreposition(f) }
+
+func phrasePreposition(f *Faker) string {
+ return prepositionSimple(f) + " " + phraseNoun(f)
+}
+
+// Sentence will generate a random sentence
+// Deprecated: The wordCount parameter is ignored and will be removed in the next major release.
+func Sentence(wordCount ...int) string { return sentence(GlobalFaker) }
+
+// Sentence will generate a random sentence
+// Deprecated: The wordCount parameter is ignored and will be removed in the next major release.
+func (f *Faker) Sentence(wordCount ...int) string { return sentence(f) }
+
+func sentence(f *Faker) string {
+ sentence, err := generate(f, getRandValue(f, []string{"text", "sentence"}))
+ if err != nil {
+ return ""
+ }
+
+ // Capitalize the first letter
+ return strings.ToUpper(sentence[:1]) + sentence[1:]
+}
+
+// Paragraph will generate a random paragraph
+// Deprecated: The parameters are ignored and will be removed in the next major release.
+func Paragraph(paragraphCount ...any) string {
+ return paragraph(GlobalFaker)
+}
+
+// Paragraph will generate a random paragraph
+// Deprecated: The parameters are ignored and will be removed in the next major release.
+func (f *Faker) Paragraph(paragraphCount ...any) string {
+ return paragraph(f)
+}
+
+func paragraph(f *Faker) string {
+ // generate 2-5 sentences
+ sentenceCount := f.Number(2, 5)
+ sentences := make([]string, sentenceCount)
+ for i := 0; i < sentenceCount; i++ {
+ sentences[i] = sentence(f)
+ }
+
+ return strings.Join(sentences, " ")
+}
+
+// Question will return a random question
+func Question() string {
+ return question(GlobalFaker)
+}
+
+// Question will return a random question
+func (f *Faker) Question() string {
+ return question(f)
+}
+
+func question(f *Faker) string {
+ question, err := generate(f, getRandValue(f, []string{"text", "question"}))
+ if err != nil {
+ return ""
+ }
+
+ // Capitalize the first letter and add a question mark
+ return strings.ToUpper(question[:1]) + question[1:] + "?"
+}
+
+// Quote will return a random quote from a random person
+func Quote() string { return quote(GlobalFaker) }
+
+// Quote will return a random quote from a random person
+func (f *Faker) Quote() string { return quote(f) }
+
+func quote(f *Faker) string {
+ quote, err := generate(f, getRandValue(f, []string{"text", "quote"}))
+ if err != nil {
+ return ""
+ }
+
+ // Capitalize the first letter after the opening quote
+ return quote[:1] + strings.ToUpper(quote[1:2]) + quote[2:]
+}
+
+// LoremIpsumSentence will generate a random sentence
+func LoremIpsumSentence(wordCount int) string {
+ return loremIpsumSentence(GlobalFaker, wordCount)
+}
+
+// LoremIpsumSentence will generate a random sentence
+func (f *Faker) LoremIpsumSentence(wordCount int) string {
+ return loremIpsumSentence(f, wordCount)
+}
+
+func loremIpsumSentence(f *Faker, wordCount int) string {
+ if wordCount <= 0 {
+ return ""
+ }
+
+ sentence := bytes.Buffer{}
+ sentence.Grow(wordCount * 6) // estimate 6 bytes per word
+
+ for i := 0; i < wordCount; i++ {
+ word := loremIpsumWord(f)
+ if i == 0 {
+ runes := []rune(word)
+ runes[0] = unicode.ToTitle(runes[0])
+ word = string(runes)
+ }
+ sentence.WriteString(word)
+ if i < wordCount-1 {
+ sentence.WriteRune(' ')
+ }
+ }
+ sentence.WriteRune('.')
+ return sentence.String()
+}
+
+// LoremIpsumParagraph will generate a random paragraphGenerator
+func LoremIpsumParagraph(paragraphCount int, sentenceCount int, wordCount int, separator string) string {
+ return loremIpsumParagraph(GlobalFaker, paragraphCount, sentenceCount, wordCount, separator)
+}
+
+// LoremIpsumParagraph will generate a random paragraphGenerator
+func (f *Faker) LoremIpsumParagraph(paragraphCount int, sentenceCount int, wordCount int, separator string) string {
+ return loremIpsumParagraph(f, paragraphCount, sentenceCount, wordCount, separator)
+}
+
+func loremIpsumParagraph(f *Faker, paragraphCount int, sentenceCount int, wordCount int, separator string) string {
+ if paragraphCount <= 0 || sentenceCount <= 0 || wordCount <= 0 {
+ return ""
+ }
+
+ paragraphs := bytes.Buffer{}
+ paragraphs.Grow(paragraphCount * sentenceCount * wordCount * 6) // estimate 6 bytes per word
+
+ for i := 0; i < paragraphCount; i++ {
+ for e := 0; e < sentenceCount; e++ {
+ paragraphs.WriteString(loremIpsumSentence(f, wordCount))
+ if e < sentenceCount-1 {
+ paragraphs.WriteRune(' ')
+ }
+ }
+
+ if i < paragraphCount-1 {
+ paragraphs.WriteString(separator)
+ }
+ }
+
+ return paragraphs.String()
+}
+
+func addTextLookup() {
+ AddFuncLookup("comment", Info{
+ Display: "Comment",
+ Category: "text",
+ Description: "Statement or remark expressing an opinion, observation, or reaction",
+ Example: "add some a little bit team",
+ Output: "string",
+ Aliases: []string{
+ "verbal statement", "expressed thought", "spoken remark", "communication element", "casual note",
+ },
+ Keywords: []string{
+ "opinion", "observation", "reaction", "response", "feedback", "critique", "interpretation", "perspective", "reflection", "discussion",
+ },
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
+ return comment(f), nil
+ },
+ })
+
+ AddFuncLookup("phrase", Info{
+ Display: "Phrase",
+ Category: "text",
+ Description: "A small group of words standing together",
+ Example: "time will tell",
+ Output: "string",
+ Aliases: []string{"word group", "language unit", "text element", "expression block"},
+ Keywords: []string{"words", "group", "sentence", "text", "language", "grammar", "expression", "unit", "collection"},
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
+ return phrase(f), nil
+ },
+ })
+
+ AddFuncLookup("phrasenoun", Info{
+ Display: "Noun Phrase",
+ Category: "text",
+ Description: "Phrase with a noun as its head, functions within sentence like a noun",
+ Example: "a tribe",
+ Output: "string",
+ Aliases: []string{"nominal phrase", "substantive element", "subject phrase", "object phrase"},
+ Keywords: []string{"phrase", "noun", "grammar", "subject", "object", "head", "sentence", "nominal", "substantive", "entity"},
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
+ return phraseNoun(f), nil
+ },
+ })
+
+ AddFuncLookup("phraseverb", Info{
+ Display: "Verb Phrase",
+ Category: "text",
+ Description: "Phrase that Consists of a verb and its modifiers, expressing an action or state",
+ Example: "a tribe",
+ Output: "string",
+ Aliases: []string{"predicate phrase", "verbal element", "action phrase", "state phrase"},
+ Keywords: []string{"phrase", "verb", "grammar", "action", "state", "modifiers", "sentence", "predicate", "verbal", "behavior"},
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
+ return phraseVerb(f), nil
+ },
+ })
+
+ AddFuncLookup("phraseadverb", Info{
+ Display: "Adverb Phrase",
+ Category: "text",
+ Description: "Phrase that modifies a verb, adjective, or another adverb, providing additional information.",
+ Example: "fully gladly",
+ Output: "string",
+ Aliases: []string{"adverbial phrase", "qualifier element", "modifier phrase", "description phrase"},
+ Keywords: []string{"phrase", "adverb", "grammar", "modifier", "description", "information", "adverbial", "qualifier", "modification"},
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
+ return phraseAdverb(f), nil
+ },
+ })
+
+ AddFuncLookup("phrasepreposition", Info{
+ Display: "Preposition Phrase",
+ Category: "text",
+ Description: "Phrase starting with a preposition, showing relation between elements in a sentence.",
+ Example: "out the black thing",
+ Output: "string",
+ Aliases: []string{"prepositional phrase", "relational element", "connection phrase", "grammar bridge"},
+ Keywords: []string{"phrase", "preposition", "grammar", "relation", "connection", "sentence", "prepositional", "relational", "linking"},
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
+ return phrasePreposition(f), nil
+ },
+ })
+
+ AddFuncLookup("sentence", Info{
+ Display: "Sentence",
+ Category: "text",
+ Description: "Set of words expressing a statement, question, exclamation, or command",
+ Example: "Guide person with kind affordances.",
+ Output: "string",
+ Aliases: []string{"complete thought", "grammatical unit", "word group", "linguistic element"},
+ Keywords: []string{"complete", "thought", "grammatical", "unit", "word", "group", "expression", "clause", "utterance"},
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
+ return sentence(f), nil
+ },
+ })
+
+ AddFuncLookup("paragraph", Info{
+ Display: "Paragraph",
+ Category: "text",
+ Description: "Distinct section of writing covering a single theme, composed of multiple sentences",
+ Example: "Protect the place under grumpy load. Decompose work into smaller group. Ruthlessly remove dead work.",
+ Output: "string",
+ Aliases: []string{"text block", "writing section", "thematic unit", "content block"},
+ Keywords: []string{"text", "block", "writing", "section", "theme", "sentences", "composition", "distinct", "passage", "content"},
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
+ return paragraph(f), nil
+ },
+ })
+
+ AddFuncLookup("question", Info{
+ Display: "Question",
+ Category: "text",
+ Description: "Statement formulated to inquire or seek clarification",
+ Example: "Roof chia echo?",
+ Output: "string",
+ Aliases: []string{
+ "interrogative sentence",
+ "information request",
+ "asking phrase",
+ "query prompt",
+ "clarifying ask",
+ },
+ Keywords: []string{
+ "inquiry", "clarification", "interrogative",
+ "ask", "who", "what", "when", "where", "why", "how", "mark",
+ },
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
+ return question(f), nil
+ },
+ })
+
+ AddFuncLookup("quote", Info{
+ Display: "Quote",
+ Category: "text",
+ Description: "Direct repetition of someone else's words",
+ Example: `"Does orange help the tissue or distract it"`,
+ Output: "string",
+ Aliases: []string{
+ "direct speech",
+ "verbatim line",
+ "cited passage",
+ "attributed text",
+ "pulled excerpt",
+ },
+ Keywords: []string{
+ "quotation", "citation", "reference", "excerpt",
+ "epigraph", "saying", "maxim", "attribution", "blockquote",
+ },
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
+ return quote(f), nil
+ },
+ })
+
+ AddFuncLookup("loremipsumsentence", Info{
+ Display: "Lorem Ipsum Sentence",
+ Category: "text",
+ Description: "Sentence of the Lorem Ipsum placeholder text used in design and publishing",
+ Example: "Quia quae repellat consequatur quidem.",
+ Output: "string",
+ Aliases: []string{
+ "lorem sentence",
+ "ipsum sentence",
+ "placeholder sentence",
+ "latin sentence",
+ },
+ Keywords: []string{
+ "lorem", "ipsum", "sentence", "placeholder",
+ "latin", "dummy", "filler", "text",
+ "typography", "mockup",
+ },
+ Params: []Param{
+ {Field: "wordcount", Display: "Word Count", Type: "int", Default: "5", Description: "Number of words in a sentence"},
+ },
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
+ wordCount, err := info.GetInt(m, "wordcount")
+ if err != nil {
+ return nil, err
+ }
+ if wordCount <= 0 || wordCount > 50 {
+ return nil, errors.New("invalid word count, must be greater than 0, less than 50")
+ }
+
+ return loremIpsumSentence(f, wordCount), nil
+ },
+ })
+
+ AddFuncLookup("loremipsumparagraph", Info{
+ Display: "Lorem Ipsum Paragraph",
+ Category: "text",
+ Description: "Paragraph of the Lorem Ipsum placeholder text used in design and publishing",
+ Example: `Quia quae repellat consequatur quidem nisi quo qui voluptatum accusantium quisquam amet. Quas et ut non dolorem ipsam aut enim assumenda mollitia harum ut. Dicta similique veniam nulla voluptas at excepturi non ad maxime at non. Eaque hic repellat praesentium voluptatem qui consequuntur dolor iusto autem velit aut. Fugit tempore exercitationem harum consequatur voluptatum modi minima aut eaque et et.
+
+Aut ea voluptatem dignissimos expedita odit tempore quod aut beatae ipsam iste. Minus voluptatibus dolorem maiores eius sed nihil vel enim odio voluptatem accusamus. Natus quibusdam temporibus tenetur cumque sint necessitatibus dolorem ex ducimus iusto ex. Voluptatem neque dicta explicabo officiis et ducimus sit ut ut praesentium pariatur. Illum molestias nisi at dolore ut voluptatem accusantium et fugiat et ut.
+
+Explicabo incidunt reprehenderit non quia dignissimos recusandae vitae soluta quia et quia. Aut veniam voluptas consequatur placeat sapiente non eveniet voluptatibus magni velit eum. Nobis vel repellendus sed est qui autem laudantium quidem quam ullam consequatur. Aut iusto ut commodi similique quae voluptatem atque qui fugiat eum aut. Quis distinctio consequatur voluptatem vel aliquid aut laborum facere officiis iure tempora.`,
+ Output: "string",
+ Aliases: []string{
+ "lorem paragraph",
+ "ipsum paragraph",
+ "placeholder paragraph",
+ "latin paragraph",
+ },
+ Keywords: []string{
+ "lorem", "ipsum", "paragraph", "placeholder",
+ "latin", "dummy", "filler", "text",
+ "typography", "mockup",
+ },
+ Params: []Param{
+ {Field: "paragraphcount", Display: "Paragraph Count", Type: "int", Default: "2", Description: "Number of paragraphs"},
+ {Field: "sentencecount", Display: "Sentence Count", Type: "int", Default: "2", Description: "Number of sentences in a paragraph"},
+ {Field: "wordcount", Display: "Word Count", Type: "int", Default: "5", Description: "Number of words in a sentence"},
+ {Field: "paragraphseparator", Display: "Paragraph Separator", Type: "string", Default: "
", Description: "String value to add between paragraphs"},
+ },
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
+ paragraphCount, err := info.GetInt(m, "paragraphcount")
+ if err != nil {
+ return nil, err
+ }
+ if paragraphCount <= 0 || paragraphCount > 20 {
+ return nil, errors.New("invalid paragraph count, must be greater than 0, less than 20")
+ }
+
+ sentenceCount, err := info.GetInt(m, "sentencecount")
+ if err != nil {
+ return nil, err
+ }
+ if sentenceCount <= 0 || sentenceCount > 20 {
+ return nil, errors.New("invalid sentence count, must be greater than 0, less than 20")
+ }
+
+ wordCount, err := info.GetInt(m, "wordcount")
+ if err != nil {
+ return nil, err
+ }
+ if wordCount <= 0 || wordCount > 50 {
+ return nil, errors.New("invalid word count, must be greater than 0, less than 50")
+ }
+
+ paragraphSeparator, err := info.GetString(m, "paragraphseparator")
+ if err != nil {
+ return nil, err
+ }
+
+ return loremIpsumParagraph(f, paragraphCount, sentenceCount, wordCount, paragraphSeparator), nil
+ },
+ })
+}
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/weighted.go b/vendor/github.com/brianvoe/gofakeit/v7/weighted.go
index cedfe42d..95d4cade 100644
--- a/vendor/github.com/brianvoe/gofakeit/v7/weighted.go
+++ b/vendor/github.com/brianvoe/gofakeit/v7/weighted.go
@@ -80,6 +80,12 @@ func addWeightedLookup() {
Description: "Randomly select a given option based upon an equal amount of weights",
Example: "[hello, 2, 6.9],[1, 2, 3] => 6.9",
Output: "any",
+ Aliases: []string{
+ "weighted choice", "probabilistic pick", "random weight", "distribution choice", "chance selection", "ratio selection", "stochastic option",
+ },
+ Keywords: []string{
+ "randomly", "select", "probability", "distribution", "likelihood", "chance", "statistical", "outcome", "bias", "ratio",
+ },
Params: []Param{
{Field: "options", Display: "Options", Type: "[]string", Description: "Array of any values"},
{Field: "weights", Display: "Weights", Type: "[]float", Description: "Array of weights"},
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/word_adjective.go b/vendor/github.com/brianvoe/gofakeit/v7/word_adjective.go
index 01efb032..f9023269 100644
--- a/vendor/github.com/brianvoe/gofakeit/v7/word_adjective.go
+++ b/vendor/github.com/brianvoe/gofakeit/v7/word_adjective.go
@@ -96,6 +96,17 @@ func addWordAdjectiveLookup() {
Description: "Word describing or modifying a noun",
Example: "genuine",
Output: "string",
+ Aliases: []string{
+ "descriptor term",
+ "qualifying modifier",
+ "attribute marker",
+ "descriptive label",
+ "noun qualifier",
+ },
+ Keywords: []string{
+ "noun", "speech", "quality", "attribute",
+ "characteristic", "property", "trait", "descriptive", "modifier",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return adjective(f), nil
},
@@ -107,6 +118,17 @@ func addWordAdjectiveLookup() {
Description: "Adjective that provides detailed characteristics about a noun",
Example: "brave",
Output: "string",
+ Aliases: []string{
+ "qualitative adjective",
+ "detail-rich modifier",
+ "characterizing term",
+ "specific descriptor",
+ "noun enhancer",
+ },
+ Keywords: []string{
+ "adjective", "word", "describing", "modifying", "attribute",
+ "property", "trait", "feature", "aspect", "detailed", "characteristics",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return adjectiveDescriptive(f), nil
},
@@ -118,6 +140,17 @@ func addWordAdjectiveLookup() {
Description: "Adjective that indicates the quantity or amount of something",
Example: "a little",
Output: "string",
+ Aliases: []string{
+ "numeric descriptor",
+ "cardinal qualifier",
+ "quantifier adjective",
+ "how many indicator",
+ "magnitude marker",
+ },
+ Keywords: []string{
+ "adjective", "quantitative", "word", "describing", "modifying",
+ "count", "volume", "extent", "degree", "magnitude", "quantity", "amount",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return adjectiveQuantitative(f), nil
},
@@ -129,6 +162,18 @@ func addWordAdjectiveLookup() {
Description: "Adjective derived from a proper noun, often used to describe nationality or origin",
Example: "Afghan",
Output: "string",
+ Aliases: []string{
+ "nationality adjective",
+ "eponym-derived",
+ "proper-noun based",
+ "demonym adjective",
+ "origin descriptor",
+ },
+ Keywords: []string{
+ "adjective", "noun", "word", "describing",
+ "cultural", "regional", "ethnic", "linguistic", "heritage",
+ "proper", "nationality",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return adjectiveProper(f), nil
},
@@ -140,6 +185,19 @@ func addWordAdjectiveLookup() {
Description: "Adjective used to point out specific things",
Example: "this",
Output: "string",
+ Aliases: []string{
+ "demonstrative adjective",
+ "pointing adjective",
+ "deictic adjective",
+ "proximal distal adjective",
+ "reference adjective",
+ },
+ Keywords: []string{
+ "adjective", "demonstrative", "deictic",
+ "this", "that", "these", "those",
+ "proximal", "distal", "near", "far",
+ "pointer", "reference", "specific", "grammar",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return adjectiveDemonstrative(f), nil
},
@@ -151,6 +209,18 @@ func addWordAdjectiveLookup() {
Description: "Adjective indicating ownership or possession",
Example: "my",
Output: "string",
+ Aliases: []string{
+ "ownership adjective",
+ "owners descriptor",
+ "possessive determiner",
+ "belonging indicator",
+ "proprietary modifier",
+ },
+ Keywords: []string{
+ "adjective", "word", "grammar",
+ "my", "your", "his", "her", "its", "our", "their",
+ "belong", "possessive", "ownership",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return adjectivePossessive(f), nil
},
@@ -162,6 +232,17 @@ func addWordAdjectiveLookup() {
Description: "Adjective used to ask questions",
Example: "what",
Output: "string",
+ Aliases: []string{
+ "interrogative adjective",
+ "question word",
+ "asking adjective",
+ "inquiry word",
+ "grammar adjective",
+ },
+ Keywords: []string{
+ "adjective", "word", "grammar", "what", "which", "whose",
+ "question", "inquiry", "interrogation", "interrogative", "ask",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return adjectiveInterrogative(f), nil
},
@@ -173,8 +254,21 @@ func addWordAdjectiveLookup() {
Description: "Adjective describing a non-specific noun",
Example: "few",
Output: "string",
+ Aliases: []string{
+ "unspecified adjective",
+ "quantifier-like",
+ "noncount marker",
+ "broad determiner",
+ "approximate amount",
+ },
+ Keywords: []string{
+ "adjective", "noun", "word", "grammar",
+ "some", "any", "many", "few", "several", "various", "certain",
+ "indefinite", "non-specific",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return adjectiveIndefinite(f), nil
},
})
+
}
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/word_adverb.go b/vendor/github.com/brianvoe/gofakeit/v7/word_adverb.go
index 4cafb8a8..fe5b546b 100644
--- a/vendor/github.com/brianvoe/gofakeit/v7/word_adverb.go
+++ b/vendor/github.com/brianvoe/gofakeit/v7/word_adverb.go
@@ -90,6 +90,12 @@ func addWordAdverbLookup() {
Description: "Word that modifies verbs, adjectives, or other adverbs",
Example: "smoothly",
Output: "string",
+ Aliases: []string{
+ "modifier", "descriptive word", "language part", "expression word", "qualifier",
+ },
+ Keywords: []string{
+ "intensity", "manner", "degree", "place", "time", "frequency", "extent", "emphasis", "usage", "context",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return adverb(f), nil
},
@@ -101,6 +107,12 @@ func addWordAdverbLookup() {
Description: "Adverb that describes how an action is performed",
Example: "stupidly",
Output: "string",
+ Aliases: []string{
+ "manner word", "action style", "performance word", "descriptive term", "behavior word",
+ },
+ Keywords: []string{
+ "style", "process", "mode", "technique", "behavior", "attitude", "fashion", "pattern", "characteristic", "approach",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return adverbManner(f), nil
},
@@ -112,6 +124,12 @@ func addWordAdverbLookup() {
Description: "Adverb that indicates the degree or intensity of an action or adjective",
Example: "intensely",
Output: "string",
+ Aliases: []string{
+ "degree word", "intensity word", "level word", "strength word", "extent word",
+ },
+ Keywords: []string{
+ "measure", "force", "strength", "scope", "magnitude", "gradation", "amount", "power", "amplification", "range",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return adverbDegree(f), nil
},
@@ -123,6 +141,12 @@ func addWordAdverbLookup() {
Description: "Adverb that indicates the location or direction of an action",
Example: "east",
Output: "string",
+ Aliases: []string{
+ "place word", "location word", "direction word", "position word", "movement word",
+ },
+ Keywords: []string{
+ "orientation", "destination", "area", "region", "spot", "placement", "site", "territory", "geography", "setting",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return adverbPlace(f), nil
},
@@ -134,6 +158,12 @@ func addWordAdverbLookup() {
Description: "Adverb that specifies the exact time an action occurs",
Example: "now",
Output: "string",
+ Aliases: []string{
+ "time word", "definite time", "exact time", "moment word", "specific time",
+ },
+ Keywords: []string{
+ "precise", "instant", "point", "schedule", "fixed", "timestamp", "occasion", "momentary", "calendar", "chronology",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return adverbTimeDefinite(f), nil
},
@@ -145,6 +175,12 @@ func addWordAdverbLookup() {
Description: "Adverb that gives a general or unspecified time frame",
Example: "already",
Output: "string",
+ Aliases: []string{
+ "time word", "indefinite time", "general time", "approximate time", "vague time",
+ },
+ Keywords: []string{
+ "uncertain", "broad", "loose", "non-specific", "undefined", "imprecise", "approximation", "unsure", "flexible", "open-ended",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return adverbTimeIndefinite(f), nil
},
@@ -156,6 +192,12 @@ func addWordAdverbLookup() {
Description: "Adverb that specifies how often an action occurs with a clear frequency",
Example: "hourly",
Output: "string",
+ Aliases: []string{
+ "frequency word", "repetition word", "regular word", "interval word", "scheduled word",
+ },
+ Keywords: []string{
+ "interval", "regular", "pattern", "routine", "cycle", "repetition", "rate", "periodic", "consistency", "predictable",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return adverbFrequencyDefinite(f), nil
},
@@ -167,8 +209,15 @@ func addWordAdverbLookup() {
Description: "Adverb that specifies how often an action occurs without specifying a particular frequency",
Example: "occasionally",
Output: "string",
+ Aliases: []string{
+ "frequency word", "indefinite frequency", "irregular word", "sporadic word", "recurring word",
+ },
+ Keywords: []string{
+ "uncertain", "sporadic", "occasional", "irregular", "unfixed", "varying", "undetermined", "fluctuating", "approximate", "inconsistent",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return adverbFrequencyIndefinite(f), nil
},
})
+
}
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/word_comment.go b/vendor/github.com/brianvoe/gofakeit/v7/word_comment.go
deleted file mode 100644
index f73d1f03..00000000
--- a/vendor/github.com/brianvoe/gofakeit/v7/word_comment.go
+++ /dev/null
@@ -1,72 +0,0 @@
-package gofakeit
-
-import (
- "strings"
-)
-
-// Comment will generate a random statement or remark expressing an opinion, observation, or reaction
-func Comment() string { return comment(GlobalFaker) }
-
-// Comment will generate a random statement or remark expressing an opinion, observation, or reaction
-func (f *Faker) Comment() string { return comment(f) }
-
-func comment(f *Faker) string {
- structures := [][]string{
- {"interjection", "adjective", "noun", "verb", "adverb"},
- {"noun", "verb", "preposition", "determiner", "adjective", "noun"},
- {"noun", "verb", "adverb"},
- {"adjective", "noun", "verb"},
- {"noun", "verb", "preposition", "noun"},
- }
-
- // Randomly select a structure
- structure := structures[number(f, 0, len(structures)-1)]
-
- // Build the sentence
- var commentParts []string
- for _, wordType := range structure {
- switch wordType {
- case "noun":
- commentParts = append(commentParts, noun(f))
- case "verb":
- commentParts = append(commentParts, verb(f))
- case "adjective":
- commentParts = append(commentParts, adjective(f))
- case "adverb":
- commentParts = append(commentParts, adverb(f))
- case "interjection":
- commentParts = append(commentParts, interjection(f))
- case "preposition":
- commentParts = append(commentParts, preposition(f))
- case "determiner":
- commentParts = append(commentParts, nounDeterminer(f))
- default:
- // Should never hit
- panic("Invalid word type")
- }
- }
-
- // Combine the words into a sentence
- sentence := strings.Join(commentParts, " ")
-
- // Capitalize the first letter
- sentence = title(sentence)
-
- // Add a period to the end of the sentence
- sentence = sentence + "."
-
- return sentence
-}
-
-func addWordCommentLookup() {
- AddFuncLookup("comment", Info{
- Display: "Comment",
- Category: "word",
- Description: "Statement or remark expressing an opinion, observation, or reaction",
- Example: "wow",
- Output: "string",
- Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
- return interjection(f), nil
- },
- })
-}
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/word_connective.go b/vendor/github.com/brianvoe/gofakeit/v7/word_connective.go
index 92dc025f..48304511 100644
--- a/vendor/github.com/brianvoe/gofakeit/v7/word_connective.go
+++ b/vendor/github.com/brianvoe/gofakeit/v7/word_connective.go
@@ -86,6 +86,8 @@ func addWordConnectiveLookup() {
Description: "Word used to connect words or sentences",
Example: "such as",
Output: "string",
+ Aliases: []string{"joining element", "grammar connector", "sentence bridge", "word linker"},
+ Keywords: []string{"word", "connect", "sentence", "grammar", "used", "conjunction", "link", "joining"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return connective(f), nil
},
@@ -97,6 +99,8 @@ func addWordConnectiveLookup() {
Description: "Connective word used to indicate a temporal relationship between events or actions",
Example: "finally",
Output: "string",
+ Aliases: []string{"temporal connector", "time relationship", "chronological link", "sequence element"},
+ Keywords: []string{"connective", "time", "temporal", "relationship", "events", "grammar", "actions", "chronological", "sequence", "timing"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return connectiveTime(f), nil
},
@@ -108,6 +112,8 @@ func addWordConnectiveLookup() {
Description: "Connective word used to indicate a comparison between two or more things",
Example: "in addition",
Output: "string",
+ Aliases: []string{"comparison connector", "contrast element", "similarity link", "grammar bridge"},
+ Keywords: []string{"connective", "comparative", "comparison", "things", "grammar", "indicate", "contrast", "similarity", "relative"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return connectiveComparative(f), nil
},
@@ -119,6 +125,8 @@ func addWordConnectiveLookup() {
Description: "Connective word used to express dissatisfaction or complaints about a situation",
Example: "besides",
Output: "string",
+ Aliases: []string{"objection connector", "criticism element", "dissatisfaction link", "grammar bridge"},
+ Keywords: []string{"connective", "complaint", "dissatisfaction", "situation", "grammar", "express", "objection", "criticism", "negative"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return connectiveComplaint(f), nil
},
@@ -130,6 +138,8 @@ func addWordConnectiveLookup() {
Description: "Connective word used to list or enumerate items or examples",
Example: "firstly",
Output: "string",
+ Aliases: []string{"enumeration connector", "sequence element", "order link", "grammar bridge"},
+ Keywords: []string{"connective", "listing", "enumerate", "items", "examples", "grammar", "list", "sequence", "order", "numbered"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return connectiveListing(f), nil
},
@@ -141,6 +151,8 @@ func addWordConnectiveLookup() {
Description: "Connective word used to indicate a cause-and-effect relationship between events or actions",
Example: "an outcome of",
Output: "string",
+ Aliases: []string{"causal connector", "effect relationship", "consequence link", "grammar bridge"},
+ Keywords: []string{"connective", "casual", "cause", "effect", "relationship", "grammar", "events", "actions", "causal", "consequence", "result"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return connectiveCasual(f), nil
},
@@ -152,6 +164,8 @@ func addWordConnectiveLookup() {
Description: "Connective word used to provide examples or illustrations of a concept or idea",
Example: "then",
Output: "string",
+ Aliases: []string{"example connector", "illustration element", "instance link", "grammar bridge"},
+ Keywords: []string{"connective", "examplify", "examples", "illustrations", "concept", "grammar", "provide", "instance", "demonstration", "sample"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return connectiveExamplify(f), nil
},
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/word_general.go b/vendor/github.com/brianvoe/gofakeit/v7/word_general.go
index 548ef125..fcf7acd1 100644
--- a/vendor/github.com/brianvoe/gofakeit/v7/word_general.go
+++ b/vendor/github.com/brianvoe/gofakeit/v7/word_general.go
@@ -30,6 +30,8 @@ func addWordGeneralLookup() {
Description: "Basic unit of language representing a concept or thing, consisting of letters and having meaning",
Example: "man",
Output: "string",
+ Aliases: []string{"language unit", "speech element", "writing component", "lexical item"},
+ Keywords: []string{"basic", "unit", "language", "concept", "letters", "meaning", "representing", "lexeme", "vocabulary"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return word(f), nil
},
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/word_grammar.go b/vendor/github.com/brianvoe/gofakeit/v7/word_grammar.go
deleted file mode 100644
index b3690bee..00000000
--- a/vendor/github.com/brianvoe/gofakeit/v7/word_grammar.go
+++ /dev/null
@@ -1,34 +0,0 @@
-package gofakeit
-
-import (
- "unicode"
-)
-
-// SentenceSimple will generate a random simple sentence
-func SentenceSimple() string { return sentenceSimple(GlobalFaker) }
-
-// SentenceSimple will generate a random simple sentence
-func (f *Faker) SentenceSimple() string { return sentenceSimple(f) }
-
-func sentenceSimple(f *Faker) string {
- // simple sentence consists of a noun phrase and a verb phrase
- str := phraseNoun(f) + " " + phraseVerb(f) + "."
-
- // capitalize the first letter
- strR := []rune(str)
- strR[0] = unicode.ToUpper(strR[0])
- return string(strR)
-}
-
-func addWordGrammerLookup() {
- AddFuncLookup("sentencesimple", Info{
- Display: "Simple Sentence",
- Category: "word",
- Description: "Group of words that expresses a complete thought",
- Example: "A tribe fly the lemony kitchen.",
- Output: "string",
- Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
- return sentenceSimple(f), nil
- },
- })
-}
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/word_misc.go b/vendor/github.com/brianvoe/gofakeit/v7/word_misc.go
index 58c8799b..8e00e7e7 100644
--- a/vendor/github.com/brianvoe/gofakeit/v7/word_misc.go
+++ b/vendor/github.com/brianvoe/gofakeit/v7/word_misc.go
@@ -8,6 +8,14 @@ func (f *Faker) Interjection() string { return interjection(f) }
func interjection(f *Faker) string { return getRandValue(f, []string{"word", "interjection"}) }
+// LoremIpsumWord will generate a random word
+func LoremIpsumWord() string { return loremIpsumWord(GlobalFaker) }
+
+// LoremIpsumWord will generate a random word
+func (f *Faker) LoremIpsumWord() string { return loremIpsumWord(f) }
+
+func loremIpsumWord(f *Faker) string { return getRandValue(f, []string{"lorem", "word"}) }
+
func addWordMiscLookup() {
AddFuncLookup("interjection", Info{
Display: "Interjection",
@@ -15,8 +23,32 @@ func addWordMiscLookup() {
Description: "Word expressing emotion",
Example: "wow",
Output: "string",
+ Aliases: []string{"emotional expression", "feeling word", "reaction term", "exclamation element"},
+ Keywords: []string{"emotion", "word", "expression", "feeling", "reaction", "exclamation", "utterance", "ejaculation", "emotional"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return interjection(f), nil
},
})
+
+ AddFuncLookup("loremipsumword", Info{
+ Display: "Lorem Ipsum Word",
+ Category: "word",
+ Description: "Word of the Lorem Ipsum placeholder text used in design and publishing",
+ Example: "quia",
+ Output: "string",
+ Aliases: []string{
+ "lorem word",
+ "ipsum word",
+ "placeholder word",
+ "latin word",
+ },
+ Keywords: []string{
+ "lorem", "ipsum", "word", "placeholder",
+ "latin", "dummy", "filler", "text",
+ "typography", "mockup",
+ },
+ Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
+ return loremIpsumWord(f), nil
+ },
+ })
}
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/word_noun.go b/vendor/github.com/brianvoe/gofakeit/v7/word_noun.go
index ad7d388c..2e433291 100644
--- a/vendor/github.com/brianvoe/gofakeit/v7/word_noun.go
+++ b/vendor/github.com/brianvoe/gofakeit/v7/word_noun.go
@@ -125,6 +125,12 @@ func addWordNounLookup() {
Description: "Person, place, thing, or idea, named or referred to in a sentence",
Example: "aunt",
Output: "string",
+ Aliases: []string{
+ "random noun", "grammar noun", "word type", "part speech", "naming word", "lexical noun", "nominal word",
+ },
+ Keywords: []string{
+ "person", "place", "idea", "sentence", "grammar", "named", "referred", "subject", "object", "entity", "concept", "term", "substantive",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return noun(f), nil
},
@@ -136,6 +142,12 @@ func addWordNounLookup() {
Description: "General name for people, places, or things, not specific or unique",
Example: "part",
Output: "string",
+ Aliases: []string{
+ "common noun", "general noun", "generic name", "basic noun", "ordinary noun", "regular noun", "everyday noun",
+ },
+ Keywords: []string{
+ "common", "general", "name", "people", "places", "generic", "basic", "ordinary", "standard", "typical", "regular", "normal",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return nounCommon(f), nil
},
@@ -147,6 +159,12 @@ func addWordNounLookup() {
Description: "Names for physical entities experienced through senses like sight, touch, smell, or taste",
Example: "snowman",
Output: "string",
+ Aliases: []string{
+ "concrete noun", "physical noun", "tangible noun", "material noun", "sensory noun", "real noun", "perceptible noun",
+ },
+ Keywords: []string{
+ "concrete", "physical", "entities", "senses", "sight", "touch", "smell", "taste", "tangible", "material", "solid", "real", "visible", "touchable", "observable",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return nounConcrete(f), nil
},
@@ -158,6 +176,12 @@ func addWordNounLookup() {
Description: "Ideas, qualities, or states that cannot be perceived with the five senses",
Example: "confusion",
Output: "string",
+ Aliases: []string{
+ "abstract noun", "concept noun", "idea noun", "intangible noun", "mental noun", "notional noun", "theoretical noun",
+ },
+ Keywords: []string{
+ "abstract", "ideas", "qualities", "states", "senses", "concept", "intangible", "mental", "theoretical", "emotional", "spiritual", "intellectual", "philosophical", "metaphysical",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return nounAbstract(f), nil
},
@@ -169,6 +193,12 @@ func addWordNounLookup() {
Description: "Group of people or things regarded as a unit",
Example: "body",
Output: "string",
+ Aliases: []string{
+ "collective noun", "group noun", "people group", "crowd noun", "assembly noun", "community noun", "societal noun",
+ },
+ Keywords: []string{
+ "collective", "people", "group", "unit", "regarded", "crowd", "assembly", "gathering", "team", "committee", "audience", "class", "family", "society",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return nounCollectivePeople(f), nil
},
@@ -180,6 +210,12 @@ func addWordNounLookup() {
Description: "Group of animals, like a 'pack' of wolves or a 'flock' of birds",
Example: "party",
Output: "string",
+ Aliases: []string{
+ "animal collective", "pack noun", "flock noun", "herd noun", "swarm noun", "colony noun", "pride noun",
+ },
+ Keywords: []string{
+ "collective", "animal", "group", "pack", "flock", "animals", "herd", "swarm", "pride", "school", "colony", "pod", "gaggle", "murder", "exaltation",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return nounCollectiveAnimal(f), nil
},
@@ -191,6 +227,12 @@ func addWordNounLookup() {
Description: "Group of objects or items, such as a 'bundle' of sticks or a 'cluster' of grapes",
Example: "hand",
Output: "string",
+ Aliases: []string{
+ "object collective", "bundle noun", "cluster noun", "collection noun", "set noun", "batch noun", "pile noun",
+ },
+ Keywords: []string{
+ "collective", "thing", "group", "objects", "items", "bundle", "cluster", "collection", "set", "batch", "stack", "pile", "heap", "bunch", "array", "assortment",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return nounCollectiveThing(f), nil
},
@@ -202,6 +244,12 @@ func addWordNounLookup() {
Description: "Items that can be counted individually",
Example: "neck",
Output: "string",
+ Aliases: []string{
+ "countable noun", "count noun", "discrete item", "enumerable noun", "plural noun", "numerical noun", "measurable noun",
+ },
+ Keywords: []string{
+ "countable", "items", "counted", "individually", "discrete", "enumerable", "plural", "many", "few", "number", "objects", "things", "units", "pieces",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return nounCountable(f), nil
},
@@ -213,6 +261,12 @@ func addWordNounLookup() {
Description: "Items that can't be counted individually",
Example: "seafood",
Output: "string",
+ Aliases: []string{
+ "uncountable noun", "mass noun", "non-count noun", "bulk noun", "substance noun", "continuous noun", "material noun",
+ },
+ Keywords: []string{
+ "uncountable", "items", "counted", "individually", "mass", "bulk", "substance", "material", "liquid", "powder", "grain", "continuous", "indivisible", "measurement",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return nounUncountable(f), nil
},
@@ -224,6 +278,12 @@ func addWordNounLookup() {
Description: "Specific name for a particular person, place, or organization",
Example: "John",
Output: "string",
+ Aliases: []string{
+ "proper noun", "specific name", "person name", "place name", "organization name", "capitalized noun", "unique name",
+ },
+ Keywords: []string{
+ "proper", "specific", "name", "person", "place", "organization", "capitalized", "title", "brand", "company", "city", "country", "individual", "entity", "designation",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return nounProper(f), nil
},
@@ -235,8 +295,15 @@ func addWordNounLookup() {
Description: "Word that introduces a noun and identifies it as a noun",
Example: "your",
Output: "string",
+ Aliases: []string{
+ "determiner word", "article word", "noun introducer", "specifier word", "modifier word", "defining word", "introductory word",
+ },
+ Keywords: []string{
+ "determiner", "word", "introduces", "identifies", "article", "specifier", "modifier",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return nounDeterminer(f), nil
},
})
+
}
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/word_phrase.go b/vendor/github.com/brianvoe/gofakeit/v7/word_phrase.go
deleted file mode 100644
index 68ff015a..00000000
--- a/vendor/github.com/brianvoe/gofakeit/v7/word_phrase.go
+++ /dev/null
@@ -1,162 +0,0 @@
-package gofakeit
-
-import (
- "strings"
-)
-
-// Phrase will return a random phrase
-func Phrase() string { return phrase(GlobalFaker) }
-
-// Phrase will return a random phrase
-func (f *Faker) Phrase() string { return phrase(f) }
-
-func phrase(f *Faker) string { return getRandValue(f, []string{"sentence", "phrase"}) }
-
-// PhraseNoun will return a random noun phrase
-func PhraseNoun() string { return phraseNoun(GlobalFaker) }
-
-// PhraseNoun will return a random noun phrase
-func (f *Faker) PhraseNoun() string { return phraseNoun(f) }
-
-func phraseNoun(f *Faker) string {
- str := ""
-
- // You may also want to add an adjective to describe the noun
- if boolFunc(f) {
- str = adjectiveDescriptive(f) + " " + noun(f)
- } else {
- str = noun(f)
- }
-
- // Add determiner from weighted list
- prob, _ := weighted(f, []any{1, 2, 3}, []float32{2, 1.5, 1})
- if prob == 1 {
- str = getArticle(str) + " " + str
- } else if prob == 2 {
- str = "the " + str
- }
-
- return str
-}
-
-// PhraseVerb will return a random preposition phrase
-func PhraseVerb() string { return phraseVerb(GlobalFaker) }
-
-// PhraseVerb will return a random preposition phrase
-func (f *Faker) PhraseVerb() string { return phraseVerb(f) }
-
-func phraseVerb(f *Faker) string {
- // Put together a string builder
- sb := []string{}
-
- // You may have an adverb phrase
- if boolFunc(f) {
- sb = append(sb, phraseAdverb(f))
- }
-
- // Lets add the primary verb
- sb = append(sb, verbAction(f))
-
- // You may have a noun phrase
- if boolFunc(f) {
- sb = append(sb, phraseNoun(f))
- }
-
- // You may have an adverb phrase
- if boolFunc(f) {
- sb = append(sb, phraseAdverb(f))
-
- // You may also have a preposition phrase
- if boolFunc(f) {
- sb = append(sb, phrasePreposition(f))
- }
-
- // You may also hae an adverb phrase
- if boolFunc(f) {
- sb = append(sb, phraseAdverb(f))
- }
- }
-
- return strings.Join(sb, " ")
-}
-
-// PhraseAdverb will return a random adverb phrase
-func PhraseAdverb() string { return phraseAdverb(GlobalFaker) }
-
-// PhraseAdverb will return a random adverb phrase
-func (f *Faker) PhraseAdverb() string { return phraseAdverb(f) }
-
-func phraseAdverb(f *Faker) string {
- if boolFunc(f) {
- return adverbDegree(f) + " " + adverbManner(f)
- }
-
- return adverbManner(f)
-}
-
-// PhrasePreposition will return a random preposition phrase
-func PhrasePreposition() string { return phrasePreposition(GlobalFaker) }
-
-// PhrasePreposition will return a random preposition phrase
-func (f *Faker) PhrasePreposition() string { return phrasePreposition(f) }
-
-func phrasePreposition(f *Faker) string {
- return prepositionSimple(f) + " " + phraseNoun(f)
-}
-
-func addWordPhraseLookup() {
- AddFuncLookup("phrase", Info{
- Display: "Phrase",
- Category: "word",
- Description: "A small group of words standing together",
- Example: "time will tell",
- Output: "string",
- Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
- return phrase(f), nil
- },
- })
-
- AddFuncLookup("phrasenoun", Info{
- Display: "Noun Phrase",
- Category: "word",
- Description: "Phrase with a noun as its head, functions within sentence like a noun",
- Example: "a tribe",
- Output: "string",
- Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
- return phraseNoun(f), nil
- },
- })
-
- AddFuncLookup("phraseverb", Info{
- Display: "Verb Phrase",
- Category: "word",
- Description: "Phrase that Consists of a verb and its modifiers, expressing an action or state",
- Example: "a tribe",
- Output: "string",
- Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
- return phraseVerb(f), nil
- },
- })
-
- AddFuncLookup("phraseadverb", Info{
- Display: "Adverb Phrase",
- Category: "word",
- Description: "Phrase that modifies a verb, adjective, or another adverb, providing additional information.",
- Example: "fully gladly",
- Output: "string",
- Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
- return phraseAdverb(f), nil
- },
- })
-
- AddFuncLookup("phrasepreposition", Info{
- Display: "Preposition Phrase",
- Category: "word",
- Description: "Phrase starting with a preposition, showing relation between elements in a sentence.",
- Example: "out the black thing",
- Output: "string",
- Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
- return phrasePreposition(f), nil
- },
- })
-}
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/word_preposition.go b/vendor/github.com/brianvoe/gofakeit/v7/word_preposition.go
index 17902dc6..55d0246e 100644
--- a/vendor/github.com/brianvoe/gofakeit/v7/word_preposition.go
+++ b/vendor/github.com/brianvoe/gofakeit/v7/word_preposition.go
@@ -52,6 +52,8 @@ func addWordPrepositionLookup() {
Description: "Words used to express the relationship of a noun or pronoun to other words in a sentence",
Example: "other than",
Output: "string",
+ Aliases: []string{"relationship connector", "grammar link", "sentence bridge", "word connector"},
+ Keywords: []string{"relationship", "noun", "pronoun", "sentence", "grammar", "express", "connector", "link", "relational"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return preposition(f), nil
},
@@ -63,6 +65,8 @@ func addWordPrepositionLookup() {
Description: "Single-word preposition showing relationships between 2 parts of a sentence",
Example: "out",
Output: "string",
+ Aliases: []string{"basic connector", "fundamental link", "single element", "grammar bridge"},
+ Keywords: []string{"preposition", "simple", "single-word", "relationships", "parts", "sentence", "grammar", "showing", "basic", "fundamental", "elementary"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return prepositionSimple(f), nil
},
@@ -74,6 +78,8 @@ func addWordPrepositionLookup() {
Description: "Two-word combination preposition, indicating a complex relation",
Example: "before",
Output: "string",
+ Aliases: []string{"two-word connector", "complex relation", "combination element", "grammar bridge"},
+ Keywords: []string{"preposition", "double", "two-word", "combination", "complex", "relation", "grammar", "indicating", "compound", "multi-word", "paired"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return prepositionDouble(f), nil
},
@@ -85,6 +91,8 @@ func addWordPrepositionLookup() {
Description: "Preposition that can be formed by combining two or more prepositions",
Example: "according to",
Output: "string",
+ Aliases: []string{"multi-part connector", "complex combination", "formed element", "grammar bridge"},
+ Keywords: []string{"preposition", "compound", "combining", "two", "more", "prepositions", "grammar", "formed", "complex", "multi-part", "constructed"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return prepositionCompound(f), nil
},
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/word_pronoun.go b/vendor/github.com/brianvoe/gofakeit/v7/word_pronoun.go
index f511f7d7..78cbd1e6 100644
--- a/vendor/github.com/brianvoe/gofakeit/v7/word_pronoun.go
+++ b/vendor/github.com/brianvoe/gofakeit/v7/word_pronoun.go
@@ -107,6 +107,8 @@ func addWordPronounLookup() {
Description: "Word used in place of a noun to avoid repetition",
Example: "me",
Output: "string",
+ Aliases: []string{"noun substitute", "word replacement", "grammar element", "reference word"},
+ Keywords: []string{"noun", "replacement", "grammar", "repetition", "substitute", "reference", "avoidance"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return pronoun(f), nil
},
@@ -118,6 +120,8 @@ func addWordPronounLookup() {
Description: "Pronoun referring to a specific persons or things",
Example: "it",
Output: "string",
+ Aliases: []string{"personal reference", "specific entity", "individual pronoun", "grammar element"},
+ Keywords: []string{"pronoun", "personal", "specific", "person", "thing", "grammar", "referring", "individual", "entity", "identity"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return pronounPersonal(f), nil
},
@@ -129,6 +133,8 @@ func addWordPronounLookup() {
Description: "Pronoun used as the object of a verb or preposition",
Example: "it",
Output: "string",
+ Aliases: []string{"object reference", "verb object", "preposition object", "grammar function"},
+ Keywords: []string{"pronoun", "verb", "preposition", "grammar", "used", "objective", "case", "receiver"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return pronounObject(f), nil
},
@@ -140,6 +146,8 @@ func addWordPronounLookup() {
Description: "Pronoun indicating ownership or belonging",
Example: "mine",
Output: "string",
+ Aliases: []string{"ownership indicator", "belonging reference", "possession word", "grammar element"},
+ Keywords: []string{"pronoun", "possessive", "ownership", "belonging", "grammar", "indicating", "possession", "property"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return pronounPossessive(f), nil
},
@@ -151,6 +159,8 @@ func addWordPronounLookup() {
Description: "Pronoun referring back to the subject of the sentence",
Example: "myself",
Output: "string",
+ Aliases: []string{"self reference", "subject reflection", "backward reference", "grammar element"},
+ Keywords: []string{"pronoun", "reflective", "subject", "sentence", "grammar", "referring", "reflexive", "self", "mirror"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return pronounReflective(f), nil
},
@@ -162,6 +172,8 @@ func addWordPronounLookup() {
Description: "Pronoun that does not refer to a specific person or thing",
Example: "few",
Output: "string",
+ Aliases: []string{"vague reference", "general pronoun", "unspecific word", "grammar element"},
+ Keywords: []string{"pronoun", "indefinite", "specific", "person", "grammar", "refer", "vague", "general", "unspecified"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return pronounIndefinite(f), nil
},
@@ -173,6 +185,8 @@ func addWordPronounLookup() {
Description: "Pronoun that points out specific people or things",
Example: "this",
Output: "string",
+ Aliases: []string{"pointing reference", "specific indicator", "demonstration word", "grammar element"},
+ Keywords: []string{"pronoun", "demonstrative", "specific", "people", "grammar", "points", "indicate", "reference", "pointing"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return pronounDemonstrative(f), nil
},
@@ -184,6 +198,8 @@ func addWordPronounLookup() {
Description: "Pronoun used to ask questions",
Example: "what",
Output: "string",
+ Aliases: []string{"question word", "inquiry reference", "interrogation element", "grammar function"},
+ Keywords: []string{"pronoun", "interrogative", "question", "ask", "grammar", "used", "inquiry", "wh-word", "questioning"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return pronounInterrogative(f), nil
},
@@ -195,6 +211,8 @@ func addWordPronounLookup() {
Description: "Pronoun that introduces a clause, referring back to a noun or pronoun",
Example: "as",
Output: "string",
+ Aliases: []string{"backward reference", "linking pronoun", "grammar element"},
+ Keywords: []string{"pronoun", "relative", "clause", "noun", "grammar", "introduces", "referring", "connector", "link"},
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return pronounRelative(f), nil
},
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/word_sentence.go b/vendor/github.com/brianvoe/gofakeit/v7/word_sentence.go
deleted file mode 100644
index 1cbc874e..00000000
--- a/vendor/github.com/brianvoe/gofakeit/v7/word_sentence.go
+++ /dev/null
@@ -1,212 +0,0 @@
-package gofakeit
-
-import (
- "bytes"
- "errors"
- "strings"
- "unicode"
-)
-
-type paragrapOptions struct {
- paragraphCount int
- sentenceCount int
- wordCount int
- separator string
-}
-
-const bytesPerWordEstimation = 6
-
-type sentenceGenerator func(f *Faker, wordCount int) string
-type wordGenerator func(f *Faker) string
-
-// Sentence will generate a random sentence
-func Sentence(wordCount int) string { return sentence(GlobalFaker, wordCount) }
-
-// Sentence will generate a random sentence
-func (f *Faker) Sentence(wordCount int) string { return sentence(f, wordCount) }
-
-func sentence(f *Faker, wordCount int) string {
- return sentenceGen(f, wordCount, word)
-}
-
-// Paragraph will generate a random paragraphGenerator
-func Paragraph(paragraphCount int, sentenceCount int, wordCount int, separator string) string {
- return paragraph(GlobalFaker, paragraphCount, sentenceCount, wordCount, separator)
-}
-
-// Paragraph will generate a random paragraphGenerator
-func (f *Faker) Paragraph(paragraphCount int, sentenceCount int, wordCount int, separator string) string {
- return paragraph(f, paragraphCount, sentenceCount, wordCount, separator)
-}
-
-func paragraph(f *Faker, paragraphCount int, sentenceCount int, wordCount int, separator string) string {
- return paragraphGen(f, paragrapOptions{paragraphCount, sentenceCount, wordCount, separator}, sentence)
-}
-
-func sentenceGen(f *Faker, wordCount int, word wordGenerator) string {
- if wordCount <= 0 {
- return ""
- }
-
- wordSeparator := ' '
- sentence := bytes.Buffer{}
- sentence.Grow(wordCount * bytesPerWordEstimation)
-
- for i := 0; i < wordCount; i++ {
- word := word(f)
- if i == 0 {
- runes := []rune(word)
- runes[0] = unicode.ToTitle(runes[0])
- word = string(runes)
- }
- sentence.WriteString(word)
- if i < wordCount-1 {
- sentence.WriteRune(wordSeparator)
- }
- }
- sentence.WriteRune('.')
- return sentence.String()
-}
-
-func paragraphGen(f *Faker, opts paragrapOptions, sentecer sentenceGenerator) string {
- if opts.paragraphCount <= 0 || opts.sentenceCount <= 0 || opts.wordCount <= 0 {
- return ""
- }
-
- //to avoid making Go 1.10 dependency, we cannot use strings.Builder
- paragraphs := bytes.Buffer{}
- //we presume the length
- paragraphs.Grow(opts.paragraphCount * opts.sentenceCount * opts.wordCount * bytesPerWordEstimation)
- wordSeparator := ' '
-
- for i := 0; i < opts.paragraphCount; i++ {
- for e := 0; e < opts.sentenceCount; e++ {
- paragraphs.WriteString(sentecer(f, opts.wordCount))
- if e < opts.sentenceCount-1 {
- paragraphs.WriteRune(wordSeparator)
- }
- }
-
- if i < opts.paragraphCount-1 {
- paragraphs.WriteString(opts.separator)
- }
- }
-
- return paragraphs.String()
-}
-
-// Question will return a random question
-func Question() string {
- return question(GlobalFaker)
-}
-
-// Question will return a random question
-func (f *Faker) Question() string {
- return question(f)
-}
-
-func question(f *Faker) string {
- return strings.Replace(hipsterSentence(f, number(f, 3, 10)), ".", "?", 1)
-}
-
-// Quote will return a random quote from a random person
-func Quote() string { return quote(GlobalFaker) }
-
-// Quote will return a random quote from a random person
-func (f *Faker) Quote() string { return quote(f) }
-
-func quote(f *Faker) string {
- return `"` + hipsterSentence(f, number(f, 3, 10)) + `" - ` + firstName(f) + " " + lastName(f)
-}
-
-func addWordSentenceLookup() {
- AddFuncLookup("sentence", Info{
- Display: "Sentence",
- Category: "word",
- Description: "Set of words expressing a statement, question, exclamation, or command",
- Example: "Interpret context record river mind.",
- Output: "string",
- Params: []Param{
- {Field: "wordcount", Display: "Word Count", Type: "int", Default: "5", Description: "Number of words in a sentence"},
- },
- Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
- wordCount, err := info.GetInt(m, "wordcount")
- if err != nil {
- return nil, err
- }
- if wordCount <= 0 || wordCount > 50 {
- return nil, errors.New("invalid word count, must be greater than 0, less than 50")
- }
-
- return sentence(f, wordCount), nil
- },
- })
-
- AddFuncLookup("paragraph", Info{
- Display: "Paragraph",
- Category: "word",
- Description: "Distinct section of writing covering a single theme, composed of multiple sentences",
- Example: "Interpret context record river mind press self should compare property outcome divide. Combine approach sustain consult discover explanation direct address church husband seek army. Begin own act welfare replace press suspect stay link place manchester specialist. Arrive price satisfy sign force application hair train provide basis right pay. Close mark teacher strengthen information attempt head touch aim iron tv take.",
- Output: "string",
- Params: []Param{
- {Field: "paragraphcount", Display: "Paragraph Count", Type: "int", Default: "2", Description: "Number of paragraphs"},
- {Field: "sentencecount", Display: "Sentence Count", Type: "int", Default: "2", Description: "Number of sentences in a paragraph"},
- {Field: "wordcount", Display: "Word Count", Type: "int", Default: "5", Description: "Number of words in a sentence"},
- {Field: "paragraphseparator", Display: "Paragraph Separator", Type: "string", Default: "
", Description: "String value to add between paragraphs"},
- },
- Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
- paragraphCount, err := info.GetInt(m, "paragraphcount")
- if err != nil {
- return nil, err
- }
- if paragraphCount <= 0 || paragraphCount > 20 {
- return nil, errors.New("invalid paragraph count, must be greater than 0, less than 20")
- }
-
- sentenceCount, err := info.GetInt(m, "sentencecount")
- if err != nil {
- return nil, err
- }
- if sentenceCount <= 0 || sentenceCount > 20 {
- return nil, errors.New("invalid sentence count, must be greater than 0, less than 20")
- }
-
- wordCount, err := info.GetInt(m, "wordcount")
- if err != nil {
- return nil, err
- }
- if wordCount <= 0 || wordCount > 50 {
- return nil, errors.New("invalid word count, must be greater than 0, less than 50")
- }
-
- paragraphSeparator, err := info.GetString(m, "paragraphseparator")
- if err != nil {
- return nil, err
- }
-
- return paragraph(f, paragraphCount, sentenceCount, wordCount, paragraphSeparator), nil
- },
- })
-
- AddFuncLookup("question", Info{
- Display: "Question",
- Category: "word",
- Description: "Statement formulated to inquire or seek clarification",
- Example: "Roof chia echo?",
- Output: "string",
- Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
- return question(f), nil
- },
- })
-
- AddFuncLookup("quote", Info{
- Display: "Quote",
- Category: "word",
- Description: "Direct repetition of someone else's words",
- Example: `"Roof chia echo." - Lura Lockman`,
- Output: "string",
- Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
- return quote(f), nil
- },
- })
-}
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/word_verb.go b/vendor/github.com/brianvoe/gofakeit/v7/word_verb.go
index d268784b..6d24efa1 100644
--- a/vendor/github.com/brianvoe/gofakeit/v7/word_verb.go
+++ b/vendor/github.com/brianvoe/gofakeit/v7/word_verb.go
@@ -64,6 +64,12 @@ func addWordVerbLookup() {
Description: "Word expressing an action, event or state",
Example: "release",
Output: "string",
+ Aliases: []string{
+ "action word", "doing word", "predicate word", "verb form", "process word",
+ },
+ Keywords: []string{
+ "movement", "change", "existence", "process", "condition", "happening", "expression", "statement", "activity", "function",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return verb(f), nil
},
@@ -72,9 +78,15 @@ func addWordVerbLookup() {
AddFuncLookup("verbaction", Info{
Display: "Action Verb",
Category: "word",
- Description: "Verb Indicating a physical or mental action",
+ Description: "Verb indicating a physical or mental action",
Example: "close",
Output: "string",
+ Aliases: []string{
+ "movement word", "doing action", "behavior word", "mental action", "physical action",
+ },
+ Keywords: []string{
+ "activity", "task", "operation", "motion", "effort", "performance", "gesture", "response", "execution", "behavior",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return verbAction(f), nil
},
@@ -86,6 +98,12 @@ func addWordVerbLookup() {
Description: "Verb that requires a direct object to complete its meaning",
Example: "follow",
Output: "string",
+ Aliases: []string{
+ "object verb", "requires object", "dependent verb", "object-linked", "receiver word",
+ },
+ Keywords: []string{
+ "direct", "receiver", "transfer", "target", "completion", "relation", "dependent", "object-based", "action-transfer", "link",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return verbTransitive(f), nil
},
@@ -97,6 +115,12 @@ func addWordVerbLookup() {
Description: "Verb that does not require a direct object to complete its meaning",
Example: "laugh",
Output: "string",
+ Aliases: []string{
+ "standalone verb", "independent word", "no object verb", "complete action", "self-contained verb",
+ },
+ Keywords: []string{
+ "autonomous", "independent", "non-transfer", "self-complete", "expression", "state", "behavior", "occur", "perform", "action-only",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return verbIntransitive(f), nil
},
@@ -105,9 +129,15 @@ func addWordVerbLookup() {
AddFuncLookup("verblinking", Info{
Display: "Linking Verb",
Category: "word",
- Description: "Verb that Connects the subject of a sentence to a subject complement",
+ Description: "Verb that connects the subject of a sentence to a subject complement",
Example: "was",
Output: "string",
+ Aliases: []string{
+ "connecting verb", "copular verb", "bridge word", "link word", "equating verb",
+ },
+ Keywords: []string{
+ "relation", "connection", "equivalence", "identification", "state", "being", "subject-link", "copula", "connector", "description",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return verbLinking(f), nil
},
@@ -119,8 +149,16 @@ func addWordVerbLookup() {
Description: "Auxiliary verb that helps the main verb complete the sentence",
Example: "be",
Output: "string",
+ Aliases: []string{
+ "auxiliary verb", "supporting verb", "assisting word", "helper verb", "modal verb",
+ },
+ Keywords: []string{
+ "tense", "mood", "voice", "aspect", "support", "structure",
+ "compound", "formation", "assistance",
+ },
Generate: func(f *Faker, m *MapParams, info *Info) (any, error) {
return verbHelping(f), nil
},
})
+
}
diff --git a/vendor/github.com/brianvoe/gofakeit/v7/xml.go b/vendor/github.com/brianvoe/gofakeit/v7/xml.go
index da467037..ad36a8c9 100644
--- a/vendor/github.com/brianvoe/gofakeit/v7/xml.go
+++ b/vendor/github.com/brianvoe/gofakeit/v7/xml.go
@@ -149,7 +149,7 @@ func xmlFunc(f *Faker, xo *XMLOptions) ([]byte, error) {
}
// Check fields length
- if xo.Fields == nil || len(xo.Fields) <= 0 {
+ if len(xo.Fields) <= 0 {
return nil, errors.New("must pass fields in order to build json object(s)")
}
@@ -284,6 +284,17 @@ func addFileXMLLookup() {
`,
Output: "[]byte",
ContentType: "application/xml",
+ Aliases: []string{
+ "xml document",
+ "extensible markup",
+ "tagged data",
+ "hierarchical structure",
+ "serialized tree",
+ },
+ Keywords: []string{
+ "extensible", "markup", "language", "elements", "format",
+ "structured", "generates", "tags", "attributes", "nested",
+ },
Params: []Param{
{Field: "type", Display: "Type", Type: "string", Default: "single", Options: []string{"single", "array"}, Description: "Type of XML, single or array"},
{Field: "rootelement", Display: "Root Element", Type: "string", Default: "xml", Description: "Root element wrapper name"},
diff --git a/vendor/github.com/cespare/xxhash/v2/README.md b/vendor/github.com/cespare/xxhash/v2/README.md
index 8bf0e5b7..33c88305 100644
--- a/vendor/github.com/cespare/xxhash/v2/README.md
+++ b/vendor/github.com/cespare/xxhash/v2/README.md
@@ -70,3 +70,5 @@ benchstat <(go test -benchtime 500ms -count 15 -bench 'Sum64$')
- [VictoriaMetrics](https://github.com/VictoriaMetrics/VictoriaMetrics)
- [FreeCache](https://github.com/coocood/freecache)
- [FastCache](https://github.com/VictoriaMetrics/fastcache)
+- [Ristretto](https://github.com/dgraph-io/ristretto)
+- [Badger](https://github.com/dgraph-io/badger)
diff --git a/vendor/github.com/cespare/xxhash/v2/xxhash.go b/vendor/github.com/cespare/xxhash/v2/xxhash.go
index a9e0d45c..78bddf1c 100644
--- a/vendor/github.com/cespare/xxhash/v2/xxhash.go
+++ b/vendor/github.com/cespare/xxhash/v2/xxhash.go
@@ -19,10 +19,13 @@ const (
// Store the primes in an array as well.
//
// The consts are used when possible in Go code to avoid MOVs but we need a
-// contiguous array of the assembly code.
+// contiguous array for the assembly code.
var primes = [...]uint64{prime1, prime2, prime3, prime4, prime5}
// Digest implements hash.Hash64.
+//
+// Note that a zero-valued Digest is not ready to receive writes.
+// Call Reset or create a Digest using New before calling other methods.
type Digest struct {
v1 uint64
v2 uint64
@@ -33,19 +36,31 @@ type Digest struct {
n int // how much of mem is used
}
-// New creates a new Digest that computes the 64-bit xxHash algorithm.
+// New creates a new Digest with a zero seed.
func New() *Digest {
+ return NewWithSeed(0)
+}
+
+// NewWithSeed creates a new Digest with the given seed.
+func NewWithSeed(seed uint64) *Digest {
var d Digest
- d.Reset()
+ d.ResetWithSeed(seed)
return &d
}
// Reset clears the Digest's state so that it can be reused.
+// It uses a seed value of zero.
func (d *Digest) Reset() {
- d.v1 = primes[0] + prime2
- d.v2 = prime2
- d.v3 = 0
- d.v4 = -primes[0]
+ d.ResetWithSeed(0)
+}
+
+// ResetWithSeed clears the Digest's state so that it can be reused.
+// It uses the given seed to initialize the state.
+func (d *Digest) ResetWithSeed(seed uint64) {
+ d.v1 = seed + prime1 + prime2
+ d.v2 = seed + prime2
+ d.v3 = seed
+ d.v4 = seed - prime1
d.total = 0
d.n = 0
}
diff --git a/vendor/github.com/cespare/xxhash/v2/xxhash_asm.go b/vendor/github.com/cespare/xxhash/v2/xxhash_asm.go
index 9216e0a4..78f95f25 100644
--- a/vendor/github.com/cespare/xxhash/v2/xxhash_asm.go
+++ b/vendor/github.com/cespare/xxhash/v2/xxhash_asm.go
@@ -6,7 +6,7 @@
package xxhash
-// Sum64 computes the 64-bit xxHash digest of b.
+// Sum64 computes the 64-bit xxHash digest of b with a zero seed.
//
//go:noescape
func Sum64(b []byte) uint64
diff --git a/vendor/github.com/cespare/xxhash/v2/xxhash_other.go b/vendor/github.com/cespare/xxhash/v2/xxhash_other.go
index 26df13bb..118e49e8 100644
--- a/vendor/github.com/cespare/xxhash/v2/xxhash_other.go
+++ b/vendor/github.com/cespare/xxhash/v2/xxhash_other.go
@@ -3,7 +3,7 @@
package xxhash
-// Sum64 computes the 64-bit xxHash digest of b.
+// Sum64 computes the 64-bit xxHash digest of b with a zero seed.
func Sum64(b []byte) uint64 {
// A simpler version would be
// d := New()
diff --git a/vendor/github.com/cespare/xxhash/v2/xxhash_safe.go b/vendor/github.com/cespare/xxhash/v2/xxhash_safe.go
index e86f1b5f..05f5e7df 100644
--- a/vendor/github.com/cespare/xxhash/v2/xxhash_safe.go
+++ b/vendor/github.com/cespare/xxhash/v2/xxhash_safe.go
@@ -5,7 +5,7 @@
package xxhash
-// Sum64String computes the 64-bit xxHash digest of s.
+// Sum64String computes the 64-bit xxHash digest of s with a zero seed.
func Sum64String(s string) uint64 {
return Sum64([]byte(s))
}
diff --git a/vendor/github.com/cespare/xxhash/v2/xxhash_unsafe.go b/vendor/github.com/cespare/xxhash/v2/xxhash_unsafe.go
index 1c1638fd..cf9d42ae 100644
--- a/vendor/github.com/cespare/xxhash/v2/xxhash_unsafe.go
+++ b/vendor/github.com/cespare/xxhash/v2/xxhash_unsafe.go
@@ -33,7 +33,7 @@ import (
//
// See https://github.com/golang/go/issues/42739 for discussion.
-// Sum64String computes the 64-bit xxHash digest of s.
+// Sum64String computes the 64-bit xxHash digest of s with a zero seed.
// It may be faster than Sum64([]byte(s)) by avoiding a copy.
func Sum64String(s string) uint64 {
b := *(*[]byte)(unsafe.Pointer(&sliceHeader{s, len(s)}))
diff --git a/vendor/github.com/docker/cli/AUTHORS b/vendor/github.com/docker/cli/AUTHORS
index d6d23b3d..ad1abd49 100644
--- a/vendor/github.com/docker/cli/AUTHORS
+++ b/vendor/github.com/docker/cli/AUTHORS
@@ -26,6 +26,7 @@ Akhil Mohan
Akihiro Suda
Akim Demaille
Alan Thompson
+Alano Terblanche
Albert Callarisa
Alberto Roura
Albin Kerouanton
@@ -65,6 +66,7 @@ Andrew Hsu
Andrew Macpherson
Andrew McDonnell
Andrew Po
+Andrew-Zipperer
Andrey Petrov
Andrii Berehuliak
André Martins
@@ -124,11 +126,13 @@ Bryan Bess
Bryan Boreham
Bryan Murphy
bryfry
+Calvin Liu
Cameron Spear
Cao Weiwei
Carlo Mion
Carlos Alexandro Becker
Carlos de Paula
+Casey Korver
Ce Gao
Cedric Davies
Cezar Sa Espinola
@@ -160,6 +164,8 @@ Christophe Vidal
Christopher Biscardi
Christopher Crone
Christopher Jones
+Christopher Petito <47751006+krissetto@users.noreply.github.com>
+Christopher Petito
Christopher Svensson
Christy Norman
Chun Chen
@@ -212,6 +218,7 @@ David Cramer
David Dooling
David Gageot
David Karlsson
+David le Blanc
David Lechner
David Scott
David Sheets
@@ -298,6 +305,7 @@ Gang Qiao
Gary Schaetz
Genki Takiuchi
George MacRorie
+George Margaritis
George Xie
Gianluca Borello
Gildas Cuisinier
@@ -306,6 +314,7 @@ Gleb Stsenov
Goksu Toprak
Gou Rao
Govind Rai
+Grace Choi
Graeme Wiebe
Grant Reaber
Greg Pflaum
@@ -386,6 +395,7 @@ Jezeniel Zapanta
Jian Zhang
Jie Luo
Jilles Oldenbeuving
+Jim Chen
Jim Galasyn
Jim Lin
Jimmy Leger
@@ -416,6 +426,7 @@ John Willis
Jon Johnson
Jon Zeolla
Jonatas Baldin
+Jonathan A. Sternberg
Jonathan Boulle
Jonathan Lee
Jonathan Lomas
@@ -470,6 +481,7 @@ Kevin Woblick
khaled souf
Kim Eik
Kir Kolyshkin
+Kirill A. Korinsky
Kotaro Yoshimatsu
Krasi Georgiev
Kris-Mikael Krister
@@ -530,6 +542,7 @@ Marco Vedovati
Marcus Martins
Marianna Tessel
Marius Ileana
+Marius Meschter
Marius Sturm
Mark Oates
Marsh Macy
@@ -538,6 +551,7 @@ Mary Anthony
Mason Fish
Mason Malone
Mateusz Major
+Mathias Duedahl <64321057+Lussebullen@users.noreply.github.com>
Mathieu Champlon
Mathieu Rollet
Matt Gucci
@@ -547,6 +561,7 @@ Matthew Heon
Matthieu Hauglustaine
Mauro Porras P
Max Shytikov
+Max-Julian Pogner
Maxime Petazzoni
Maximillian Fan Xavier
Mei ChunTao
@@ -610,6 +625,7 @@ Nathan McCauley
Neil Peterson
Nick Adcock
Nick Santos
+Nick Sieger
Nico Stapelbroek
Nicola Kabar
Nicolas Borboën
@@ -704,6 +720,7 @@ Rory Hunter
Ross Boucher
Rubens Figueiredo
Rui Cao
+Rui JingAn
Ryan Belgrave
Ryan Detzel
Ryan Stelly
@@ -797,6 +814,7 @@ Tim Hockin
Tim Sampson
Tim Smith
Tim Waugh
+Tim Welsh
Tim Wraight
timfeirg
Timothy Hobbs
@@ -880,9 +898,11 @@ Zhang Wei
Zhang Wentao
ZhangHang
zhenghenghuo
+Zhiwei Liang
Zhou Hao
Zhoulin Xie
Zhu Guihua
+Zhuo Zhi
Álex González
Álvaro Lázaro
Átila Camurça Alves
diff --git a/vendor/github.com/docker/cli/NOTICE b/vendor/github.com/docker/cli/NOTICE
index 58b19b6d..1c40faae 100644
--- a/vendor/github.com/docker/cli/NOTICE
+++ b/vendor/github.com/docker/cli/NOTICE
@@ -14,6 +14,6 @@ United States and other governments.
It is your responsibility to ensure that your use and/or transfer does not
violate applicable laws.
-For more information, please see https://www.bis.doc.gov
+For more information, see https://www.bis.doc.gov
See also https://www.apache.org/dev/crypto.html and/or seek legal counsel.
diff --git a/vendor/github.com/docker/cli/cli/compose/interpolation/interpolation.go b/vendor/github.com/docker/cli/cli/compose/interpolation/interpolation.go
index 584ade8a..ee11656f 100644
--- a/vendor/github.com/docker/cli/cli/compose/interpolation/interpolation.go
+++ b/vendor/github.com/docker/cli/cli/compose/interpolation/interpolation.go
@@ -1,5 +1,5 @@
// FIXME(thaJeztah): remove once we are a module; the go:build directive prevents go from downgrading language version to go1.16:
-//go:build go1.19
+//go:build go1.22
package interpolation
diff --git a/vendor/github.com/docker/cli/cli/compose/loader/full-example.yml b/vendor/github.com/docker/cli/cli/compose/loader/full-example.yml
index 76447d20..36ebf833 100644
--- a/vendor/github.com/docker/cli/cli/compose/loader/full-example.yml
+++ b/vendor/github.com/docker/cli/cli/compose/loader/full-example.yml
@@ -1,4 +1,4 @@
-version: "3.12"
+version: "3.13"
services:
foo:
@@ -207,6 +207,9 @@ services:
aliases:
- alias1
- alias3
+ driver_opts:
+ "driveropt1": "optval1"
+ "driveropt2": "optval2"
other-network:
ipv4_address: 172.16.238.10
ipv6_address: 2001:3984:3989::10
diff --git a/vendor/github.com/docker/cli/cli/compose/loader/interpolate.go b/vendor/github.com/docker/cli/cli/compose/loader/interpolate.go
index 24682614..82c36d7d 100644
--- a/vendor/github.com/docker/cli/cli/compose/loader/interpolate.go
+++ b/vendor/github.com/docker/cli/cli/compose/loader/interpolate.go
@@ -1,5 +1,5 @@
// FIXME(thaJeztah): remove once we are a module; the go:build directive prevents go from downgrading language version to go1.16:
-//go:build go1.19
+//go:build go1.22
package loader
@@ -29,6 +29,7 @@ var interpolateTypeCastMapping = map[interp.Path]interp.Cast{
servicePath("ulimits", interp.PathMatchAll, "hard"): toInt,
servicePath("ulimits", interp.PathMatchAll, "soft"): toInt,
servicePath("privileged"): toBoolean,
+ servicePath("oom_score_adj"): toInt,
servicePath("read_only"): toBoolean,
servicePath("stdin_open"): toBoolean,
servicePath("tty"): toBoolean,
diff --git a/vendor/github.com/docker/cli/cli/compose/loader/loader.go b/vendor/github.com/docker/cli/cli/compose/loader/loader.go
index 84090075..7bc420b2 100644
--- a/vendor/github.com/docker/cli/cli/compose/loader/loader.go
+++ b/vendor/github.com/docker/cli/cli/compose/loader/loader.go
@@ -1,5 +1,5 @@
// FIXME(thaJeztah): remove once we are a module; the go:build directive prevents go from downgrading language version to go1.16:
-//go:build go1.19
+//go:build go1.22
package loader
@@ -21,8 +21,8 @@ import (
"github.com/docker/docker/api/types/versions"
"github.com/docker/go-connections/nat"
units "github.com/docker/go-units"
+ "github.com/go-viper/mapstructure/v2"
"github.com/google/shlex"
- "github.com/mitchellh/mapstructure"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
yaml "gopkg.in/yaml.v2"
diff --git a/vendor/github.com/docker/cli/cli/compose/loader/merge.go b/vendor/github.com/docker/cli/cli/compose/loader/merge.go
index ab33ee61..34455d59 100644
--- a/vendor/github.com/docker/cli/cli/compose/loader/merge.go
+++ b/vendor/github.com/docker/cli/cli/compose/loader/merge.go
@@ -1,5 +1,5 @@
// FIXME(thaJeztah): remove once we are a module; the go:build directive prevents go from downgrading language version to go1.16:
-//go:build go1.19
+//go:build go1.22
package loader
diff --git a/vendor/github.com/docker/cli/cli/compose/schema/data/config_schema_v3.13.json b/vendor/github.com/docker/cli/cli/compose/schema/data/config_schema_v3.13.json
new file mode 100644
index 00000000..8daa8892
--- /dev/null
+++ b/vendor/github.com/docker/cli/cli/compose/schema/data/config_schema_v3.13.json
@@ -0,0 +1,680 @@
+{
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "id": "config_schema_v3.13.json",
+ "type": "object",
+
+ "properties": {
+ "version": {
+ "type": "string",
+ "default": "3.13"
+ },
+
+ "services": {
+ "id": "#/properties/services",
+ "type": "object",
+ "patternProperties": {
+ "^[a-zA-Z0-9._-]+$": {
+ "$ref": "#/definitions/service"
+ }
+ },
+ "additionalProperties": false
+ },
+
+ "networks": {
+ "id": "#/properties/networks",
+ "type": "object",
+ "patternProperties": {
+ "^[a-zA-Z0-9._-]+$": {
+ "$ref": "#/definitions/network"
+ }
+ }
+ },
+
+ "volumes": {
+ "id": "#/properties/volumes",
+ "type": "object",
+ "patternProperties": {
+ "^[a-zA-Z0-9._-]+$": {
+ "$ref": "#/definitions/volume"
+ }
+ },
+ "additionalProperties": false
+ },
+
+ "secrets": {
+ "id": "#/properties/secrets",
+ "type": "object",
+ "patternProperties": {
+ "^[a-zA-Z0-9._-]+$": {
+ "$ref": "#/definitions/secret"
+ }
+ },
+ "additionalProperties": false
+ },
+
+ "configs": {
+ "id": "#/properties/configs",
+ "type": "object",
+ "patternProperties": {
+ "^[a-zA-Z0-9._-]+$": {
+ "$ref": "#/definitions/config"
+ }
+ },
+ "additionalProperties": false
+ }
+ },
+
+ "patternProperties": {"^x-": {}},
+ "additionalProperties": false,
+
+ "definitions": {
+
+ "service": {
+ "id": "#/definitions/service",
+ "type": "object",
+
+ "properties": {
+ "deploy": {"$ref": "#/definitions/deployment"},
+ "build": {
+ "oneOf": [
+ {"type": "string"},
+ {
+ "type": "object",
+ "properties": {
+ "context": {"type": "string"},
+ "dockerfile": {"type": "string"},
+ "args": {"$ref": "#/definitions/list_or_dict"},
+ "labels": {"$ref": "#/definitions/list_or_dict"},
+ "cache_from": {"$ref": "#/definitions/list_of_strings"},
+ "network": {"type": "string"},
+ "target": {"type": "string"},
+ "shm_size": {"type": ["integer", "string"]},
+ "extra_hosts": {"$ref": "#/definitions/list_or_dict"}
+ },
+ "additionalProperties": true
+ }
+ ]
+ },
+ "cap_add": {"type": "array", "items": {"type": "string"}, "uniqueItems": true},
+ "cap_drop": {"type": "array", "items": {"type": "string"}, "uniqueItems": true},
+ "cgroupns_mode": {"type": "string"},
+ "cgroup_parent": {"type": "string"},
+ "command": {
+ "oneOf": [
+ {"type": "string"},
+ {"type": "array", "items": {"type": "string"}}
+ ]
+ },
+ "configs": {
+ "type": "array",
+ "items": {
+ "oneOf": [
+ {"type": "string"},
+ {
+ "type": "object",
+ "properties": {
+ "source": {"type": "string"},
+ "target": {"type": "string"},
+ "uid": {"type": "string"},
+ "gid": {"type": "string"},
+ "mode": {"type": "number"}
+ }
+ }
+ ]
+ }
+ },
+ "container_name": {"type": "string"},
+ "credential_spec": {
+ "type": "object",
+ "properties": {
+ "config": {"type": "string"},
+ "file": {"type": "string"},
+ "registry": {"type": "string"}
+ },
+ "additionalProperties": false
+ },
+ "depends_on": {"$ref": "#/definitions/list_of_strings"},
+ "devices": {"type": "array", "items": {"type": "string"}, "uniqueItems": true},
+ "dns": {"$ref": "#/definitions/string_or_list"},
+ "dns_search": {"$ref": "#/definitions/string_or_list"},
+ "domainname": {"type": "string"},
+ "entrypoint": {
+ "oneOf": [
+ {"type": "string"},
+ {"type": "array", "items": {"type": "string"}}
+ ]
+ },
+ "env_file": {"$ref": "#/definitions/string_or_list"},
+ "environment": {"$ref": "#/definitions/list_or_dict"},
+
+ "expose": {
+ "type": "array",
+ "items": {
+ "type": ["string", "number"],
+ "format": "expose"
+ },
+ "uniqueItems": true
+ },
+
+ "external_links": {"type": "array", "items": {"type": "string"}, "uniqueItems": true},
+ "extra_hosts": {"$ref": "#/definitions/list_or_dict"},
+ "healthcheck": {"$ref": "#/definitions/healthcheck"},
+ "hostname": {"type": "string"},
+ "image": {"type": "string"},
+ "init": {"type": "boolean"},
+ "ipc": {"type": "string"},
+ "isolation": {"type": "string"},
+ "labels": {"$ref": "#/definitions/list_or_dict"},
+ "links": {"type": "array", "items": {"type": "string"}, "uniqueItems": true},
+
+ "logging": {
+ "type": "object",
+
+ "properties": {
+ "driver": {"type": "string"},
+ "options": {
+ "type": "object",
+ "patternProperties": {
+ "^.+$": {"type": ["string", "number", "null"]}
+ }
+ }
+ },
+ "additionalProperties": false
+ },
+
+ "mac_address": {"type": "string"},
+ "network_mode": {"type": "string"},
+
+ "networks": {
+ "oneOf": [
+ {"$ref": "#/definitions/list_of_strings"},
+ {
+ "type": "object",
+ "patternProperties": {
+ "^[a-zA-Z0-9._-]+$": {
+ "oneOf": [
+ {
+ "type": "object",
+ "properties": {
+ "aliases": {"$ref": "#/definitions/list_of_strings"},
+ "driver_opts": {
+ "type": "object",
+ "patternProperties": {
+ "^.+$": { "type": ["string", "number"] }
+ }
+ },
+ "ipv4_address": {"type": "string"},
+ "ipv6_address": {"type": "string"}
+ },
+ "additionalProperties": false
+ },
+ {"type": "null"}
+ ]
+ }
+ },
+ "additionalProperties": false
+ }
+ ]
+ },
+ "pid": {"type": ["string", "null"]},
+
+ "ports": {
+ "type": "array",
+ "items": {
+ "oneOf": [
+ {"type": "number", "format": "ports"},
+ {"type": "string", "format": "ports"},
+ {
+ "type": "object",
+ "properties": {
+ "mode": {"type": "string"},
+ "target": {"type": "integer"},
+ "published": {"type": "integer"},
+ "protocol": {"type": "string"}
+ },
+ "additionalProperties": false
+ }
+ ]
+ },
+ "uniqueItems": true
+ },
+
+ "privileged": {"type": "boolean"},
+ "read_only": {"type": "boolean"},
+ "restart": {"type": "string"},
+ "security_opt": {"type": "array", "items": {"type": "string"}, "uniqueItems": true},
+ "shm_size": {"type": ["number", "string"]},
+ "secrets": {
+ "type": "array",
+ "items": {
+ "oneOf": [
+ {"type": "string"},
+ {
+ "type": "object",
+ "properties": {
+ "source": {"type": "string"},
+ "target": {"type": "string"},
+ "uid": {"type": "string"},
+ "gid": {"type": "string"},
+ "mode": {"type": "number"}
+ }
+ }
+ ]
+ }
+ },
+ "sysctls": {"$ref": "#/definitions/list_or_dict"},
+ "stdin_open": {"type": "boolean"},
+ "stop_grace_period": {"type": "string", "format": "duration"},
+ "stop_signal": {"type": "string"},
+ "tmpfs": {"$ref": "#/definitions/string_or_list"},
+ "tty": {"type": "boolean"},
+ "ulimits": {
+ "type": "object",
+ "patternProperties": {
+ "^[a-z]+$": {
+ "oneOf": [
+ {"type": "integer"},
+ {
+ "type":"object",
+ "properties": {
+ "hard": {"type": "integer"},
+ "soft": {"type": "integer"}
+ },
+ "required": ["soft", "hard"],
+ "additionalProperties": false
+ }
+ ]
+ }
+ }
+ },
+ "oom_score_adj": {"type": "integer"},
+ "user": {"type": "string"},
+ "userns_mode": {"type": "string"},
+ "volumes": {
+ "type": "array",
+ "items": {
+ "oneOf": [
+ {"type": "string"},
+ {
+ "type": "object",
+ "required": ["type"],
+ "properties": {
+ "type": {"type": "string"},
+ "source": {"type": "string"},
+ "target": {"type": "string"},
+ "read_only": {"type": "boolean"},
+ "consistency": {"type": "string"},
+ "bind": {
+ "type": "object",
+ "properties": {
+ "propagation": {"type": "string"}
+ }
+ },
+ "volume": {
+ "type": "object",
+ "properties": {
+ "nocopy": {"type": "boolean"}
+ }
+ },
+ "tmpfs": {
+ "type": "object",
+ "properties": {
+ "size": {
+ "type": "integer",
+ "minimum": 0
+ }
+ }
+ }
+ },
+ "additionalProperties": false
+ }
+ ],
+ "uniqueItems": true
+ }
+ },
+ "working_dir": {"type": "string"}
+ },
+ "patternProperties": {"^x-": {}},
+ "additionalProperties": false
+ },
+
+ "healthcheck": {
+ "id": "#/definitions/healthcheck",
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "disable": {"type": "boolean"},
+ "interval": {"type": "string", "format": "duration"},
+ "retries": {"type": "number"},
+ "test": {
+ "oneOf": [
+ {"type": "string"},
+ {"type": "array", "items": {"type": "string"}}
+ ]
+ },
+ "timeout": {"type": "string", "format": "duration"},
+ "start_period": {"type": "string", "format": "duration"},
+ "start_interval": {"type": "string", "format": "duration"}
+ }
+ },
+ "deployment": {
+ "id": "#/definitions/deployment",
+ "type": ["object", "null"],
+ "properties": {
+ "mode": {"type": "string"},
+ "endpoint_mode": {"type": "string"},
+ "replicas": {"type": "integer"},
+ "labels": {"$ref": "#/definitions/list_or_dict"},
+ "rollback_config": {
+ "type": "object",
+ "properties": {
+ "parallelism": {"type": "integer"},
+ "delay": {"type": "string", "format": "duration"},
+ "failure_action": {"type": "string"},
+ "monitor": {"type": "string", "format": "duration"},
+ "max_failure_ratio": {"type": "number"},
+ "order": {"type": "string", "enum": [
+ "start-first", "stop-first"
+ ]}
+ },
+ "additionalProperties": false
+ },
+ "update_config": {
+ "type": "object",
+ "properties": {
+ "parallelism": {"type": "integer"},
+ "delay": {"type": "string", "format": "duration"},
+ "failure_action": {"type": "string"},
+ "monitor": {"type": "string", "format": "duration"},
+ "max_failure_ratio": {"type": "number"},
+ "order": {"type": "string", "enum": [
+ "start-first", "stop-first"
+ ]}
+ },
+ "additionalProperties": false
+ },
+ "resources": {
+ "type": "object",
+ "properties": {
+ "limits": {
+ "type": "object",
+ "properties": {
+ "cpus": {"type": "string"},
+ "memory": {"type": "string"},
+ "pids": {"type": "integer"}
+ },
+ "additionalProperties": false
+ },
+ "reservations": {
+ "type": "object",
+ "properties": {
+ "cpus": {"type": "string"},
+ "memory": {"type": "string"},
+ "generic_resources": {"$ref": "#/definitions/generic_resources"}
+ },
+ "additionalProperties": false
+ }
+ },
+ "additionalProperties": false
+ },
+ "restart_policy": {
+ "type": "object",
+ "properties": {
+ "condition": {"type": "string"},
+ "delay": {"type": "string", "format": "duration"},
+ "max_attempts": {"type": "integer"},
+ "window": {"type": "string", "format": "duration"}
+ },
+ "additionalProperties": false
+ },
+ "placement": {
+ "type": "object",
+ "properties": {
+ "constraints": {"type": "array", "items": {"type": "string"}},
+ "preferences": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "spread": {"type": "string"}
+ },
+ "additionalProperties": false
+ }
+ },
+ "max_replicas_per_node": {"type": "integer"}
+ },
+ "additionalProperties": false
+ }
+ },
+ "additionalProperties": false
+ },
+
+ "generic_resources": {
+ "id": "#/definitions/generic_resources",
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "discrete_resource_spec": {
+ "type": "object",
+ "properties": {
+ "kind": {"type": "string"},
+ "value": {"type": "number"}
+ },
+ "additionalProperties": false
+ }
+ },
+ "additionalProperties": false
+ }
+ },
+
+ "network": {
+ "id": "#/definitions/network",
+ "type": ["object", "null"],
+ "properties": {
+ "name": {"type": "string"},
+ "driver": {"type": "string"},
+ "driver_opts": {
+ "type": "object",
+ "patternProperties": {
+ "^.+$": {"type": ["string", "number"]}
+ }
+ },
+ "ipam": {
+ "type": "object",
+ "properties": {
+ "driver": {"type": "string"},
+ "config": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "subnet": {"type": "string"}
+ },
+ "additionalProperties": false
+ }
+ }
+ },
+ "additionalProperties": false
+ },
+ "external": {
+ "type": ["boolean", "object"],
+ "properties": {
+ "name": {"type": "string"}
+ },
+ "additionalProperties": false
+ },
+ "internal": {"type": "boolean"},
+ "attachable": {"type": "boolean"},
+ "labels": {"$ref": "#/definitions/list_or_dict"}
+ },
+ "patternProperties": {"^x-": {}},
+ "additionalProperties": false
+ },
+
+ "volume": {
+ "id": "#/definitions/volume",
+ "type": ["object", "null"],
+ "properties": {
+ "name": {"type": "string"},
+ "driver": {"type": "string"},
+ "driver_opts": {
+ "type": "object",
+ "patternProperties": {
+ "^.+$": {"type": ["string", "number"]}
+ }
+ },
+ "external": {
+ "type": ["boolean", "object"],
+ "properties": {
+ "name": {"type": "string"}
+ },
+ "additionalProperties": false
+ },
+ "labels": {"$ref": "#/definitions/list_or_dict"},
+ "x-cluster-spec": {
+ "type": "object",
+ "properties": {
+ "group": {"type": "string"},
+ "access_mode": {
+ "type": "object",
+ "properties": {
+ "scope": {"type": "string"},
+ "sharing": {"type": "string"},
+ "block_volume": {"type": "object"},
+ "mount_volume": {
+ "type": "object",
+ "properties": {
+ "fs_type": {"type": "string"},
+ "mount_flags": {"type": "array", "items": {"type": "string"}}
+ }
+ }
+ }
+ },
+ "accessibility_requirements": {
+ "type": "object",
+ "properties": {
+ "requisite": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "segments": {"$ref": "#/definitions/list_or_dict"}
+ }
+ }
+ },
+ "preferred": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "segments": {"$ref": "#/definitions/list_or_dict"}
+ }
+ }
+ }
+ }
+ },
+ "capacity_range": {
+ "type": "object",
+ "properties": {
+ "required_bytes": {"type": "string"},
+ "limit_bytes": {"type": "string"}
+ }
+ },
+ "availability": {"type": "string"}
+ }
+ }
+ },
+ "patternProperties": {"^x-": {}},
+ "additionalProperties": false
+ },
+
+ "secret": {
+ "id": "#/definitions/secret",
+ "type": "object",
+ "properties": {
+ "name": {"type": "string"},
+ "file": {"type": "string"},
+ "external": {
+ "type": ["boolean", "object"],
+ "properties": {
+ "name": {"type": "string"}
+ }
+ },
+ "labels": {"$ref": "#/definitions/list_or_dict"},
+ "driver": {"type": "string"},
+ "driver_opts": {
+ "type": "object",
+ "patternProperties": {
+ "^.+$": {"type": ["string", "number"]}
+ }
+ },
+ "template_driver": {"type": "string"}
+ },
+ "patternProperties": {"^x-": {}},
+ "additionalProperties": false
+ },
+
+ "config": {
+ "id": "#/definitions/config",
+ "type": "object",
+ "properties": {
+ "name": {"type": "string"},
+ "file": {"type": "string"},
+ "external": {
+ "type": ["boolean", "object"],
+ "properties": {
+ "name": {"type": "string"}
+ }
+ },
+ "labels": {"$ref": "#/definitions/list_or_dict"},
+ "template_driver": {"type": "string"}
+ },
+ "patternProperties": {"^x-": {}},
+ "additionalProperties": false
+ },
+
+ "string_or_list": {
+ "oneOf": [
+ {"type": "string"},
+ {"$ref": "#/definitions/list_of_strings"}
+ ]
+ },
+
+ "list_of_strings": {
+ "type": "array",
+ "items": {"type": "string"},
+ "uniqueItems": true
+ },
+
+ "list_or_dict": {
+ "oneOf": [
+ {
+ "type": "object",
+ "patternProperties": {
+ ".+": {
+ "type": ["string", "number", "null"]
+ }
+ },
+ "additionalProperties": false
+ },
+ {"type": "array", "items": {"type": "string"}, "uniqueItems": true}
+ ]
+ },
+
+ "constraints": {
+ "service": {
+ "id": "#/definitions/constraints/service",
+ "anyOf": [
+ {"required": ["build"]},
+ {"required": ["image"]}
+ ],
+ "properties": {
+ "build": {
+ "required": ["context"]
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/vendor/github.com/docker/cli/cli/compose/schema/schema.go b/vendor/github.com/docker/cli/cli/compose/schema/schema.go
index 3ef704af..2ef1245b 100644
--- a/vendor/github.com/docker/cli/cli/compose/schema/schema.go
+++ b/vendor/github.com/docker/cli/cli/compose/schema/schema.go
@@ -1,5 +1,5 @@
// FIXME(thaJeztah): remove once we are a module; the go:build directive prevents go from downgrading language version to go1.16:
-//go:build go1.19
+//go:build go1.22
package schema
@@ -14,7 +14,7 @@ import (
)
const (
- defaultVersion = "3.12"
+ defaultVersion = "3.13"
versionField = "version"
)
@@ -43,7 +43,7 @@ func init() {
}
// Version returns the version of the config, defaulting to the latest "3.x"
-// version (3.12). If only the major version "3" is specified, it is used as
+// version (3.13). If only the major version "3" is specified, it is used as
// version "3.x" and returns the default version (latest 3.x).
func Version(config map[string]any) string {
version, ok := config[versionField]
@@ -102,7 +102,7 @@ func getDescription(err validationError) string {
switch err.parent.Type() {
case "invalid_type":
if expectedType, ok := err.parent.Details()["expected"].(string); ok {
- return fmt.Sprintf("must be a %s", humanReadableType(expectedType))
+ return "must be a " + humanReadableType(expectedType)
}
case jsonschemaOneOf, jsonschemaAnyOf:
if err.child == nil {
diff --git a/vendor/github.com/docker/cli/cli/compose/template/template.go b/vendor/github.com/docker/cli/cli/compose/template/template.go
index dd3acaf2..1507c0ee 100644
--- a/vendor/github.com/docker/cli/cli/compose/template/template.go
+++ b/vendor/github.com/docker/cli/cli/compose/template/template.go
@@ -1,5 +1,5 @@
// FIXME(thaJeztah): remove once we are a module; the go:build directive prevents go from downgrading language version to go1.16:
-//go:build go1.19
+//go:build go1.22
package template
@@ -48,7 +48,7 @@ type Mapping func(string) (string, bool)
// the substitution and an error.
type SubstituteFunc func(string, Mapping) (string, bool, error)
-// SubstituteWith subsitute variables in the string with their values.
+// SubstituteWith substitutes variables in the string with their values.
// It accepts additional substitute function.
func SubstituteWith(template string, mapping Mapping, pattern *regexp.Regexp, subsFuncs ...SubstituteFunc) (string, error) {
var err error
diff --git a/vendor/github.com/docker/cli/cli/compose/types/types.go b/vendor/github.com/docker/cli/cli/compose/types/types.go
index f6954ff7..55b80365 100644
--- a/vendor/github.com/docker/cli/cli/compose/types/types.go
+++ b/vendor/github.com/docker/cli/cli/compose/types/types.go
@@ -1,5 +1,5 @@
// FIXME(thaJeztah): remove once we are a module; the go:build directive prevents go from downgrading language version to go1.16:
-//go:build go1.19
+//go:build go1.22
package types
@@ -207,6 +207,7 @@ type ServiceConfig struct {
Tty bool `mapstructure:"tty" yaml:"tty,omitempty" json:"tty,omitempty"`
Ulimits map[string]*UlimitsConfig `yaml:",omitempty" json:"ulimits,omitempty"`
User string `yaml:",omitempty" json:"user,omitempty"`
+ OomScoreAdj int64 `yaml:",omitempty" json:"oom_score_adj,omitempty"`
UserNSMode string `mapstructure:"userns_mode" yaml:"userns_mode,omitempty" json:"userns_mode,omitempty"`
Volumes []ServiceVolumeConfig `yaml:",omitempty" json:"volumes,omitempty"`
WorkingDir string `mapstructure:"working_dir" yaml:"working_dir,omitempty" json:"working_dir,omitempty"`
@@ -374,9 +375,10 @@ type PlacementPreferences struct {
// ServiceNetworkConfig is the network configuration for a service
type ServiceNetworkConfig struct {
- Aliases []string `yaml:",omitempty" json:"aliases,omitempty"`
- Ipv4Address string `mapstructure:"ipv4_address" yaml:"ipv4_address,omitempty" json:"ipv4_address,omitempty"`
- Ipv6Address string `mapstructure:"ipv6_address" yaml:"ipv6_address,omitempty" json:"ipv6_address,omitempty"`
+ Aliases []string `yaml:",omitempty" json:"aliases,omitempty"`
+ DriverOpts map[string]string `mapstructure:"driver_opts" yaml:"driver_opts,omitempty" json:"driver_opts,omitempty"`
+ Ipv4Address string `mapstructure:"ipv4_address" yaml:"ipv4_address,omitempty" json:"ipv4_address,omitempty"`
+ Ipv6Address string `mapstructure:"ipv6_address" yaml:"ipv6_address,omitempty" json:"ipv6_address,omitempty"`
}
// ServicePortConfig is the port configuration for a service
diff --git a/vendor/github.com/docker/cli/opts/config.go b/vendor/github.com/docker/cli/opts/config.go
index 3be0fa93..1423ae3b 100644
--- a/vendor/github.com/docker/cli/opts/config.go
+++ b/vendor/github.com/docker/cli/opts/config.go
@@ -2,6 +2,7 @@ package opts
import (
"encoding/csv"
+ "errors"
"fmt"
"os"
"strconv"
@@ -68,7 +69,7 @@ func (o *ConfigOpt) Set(value string) error {
}
if options.ConfigName == "" {
- return fmt.Errorf("source is required")
+ return errors.New("source is required")
}
if options.File.Name == "" {
options.File.Name = options.ConfigName
diff --git a/vendor/github.com/docker/cli/opts/envfile.go b/vendor/github.com/docker/cli/opts/envfile.go
index 26aa3c3a..3a16e6c1 100644
--- a/vendor/github.com/docker/cli/opts/envfile.go
+++ b/vendor/github.com/docker/cli/opts/envfile.go
@@ -2,6 +2,8 @@ package opts
import (
"os"
+
+ "github.com/docker/cli/pkg/kvfile"
)
// ParseEnvFile reads a file with environment variables enumerated by lines
@@ -18,5 +20,5 @@ import (
// environment variables, that's why we just strip leading whitespace and
// nothing more.
func ParseEnvFile(filename string) ([]string, error) {
- return parseKeyValueFile(filename, os.LookupEnv)
+ return kvfile.Parse(filename, os.LookupEnv)
}
diff --git a/vendor/github.com/docker/cli/opts/file.go b/vendor/github.com/docker/cli/opts/file.go
deleted file mode 100644
index 72b90e11..00000000
--- a/vendor/github.com/docker/cli/opts/file.go
+++ /dev/null
@@ -1,76 +0,0 @@
-package opts
-
-import (
- "bufio"
- "bytes"
- "fmt"
- "os"
- "strings"
- "unicode"
- "unicode/utf8"
-)
-
-const whiteSpaces = " \t"
-
-// ErrBadKey typed error for bad environment variable
-type ErrBadKey struct {
- msg string
-}
-
-func (e ErrBadKey) Error() string {
- return fmt.Sprintf("poorly formatted environment: %s", e.msg)
-}
-
-func parseKeyValueFile(filename string, emptyFn func(string) (string, bool)) ([]string, error) {
- fh, err := os.Open(filename)
- if err != nil {
- return []string{}, err
- }
- defer fh.Close()
-
- lines := []string{}
- scanner := bufio.NewScanner(fh)
- currentLine := 0
- utf8bom := []byte{0xEF, 0xBB, 0xBF}
- for scanner.Scan() {
- scannedBytes := scanner.Bytes()
- if !utf8.Valid(scannedBytes) {
- return []string{}, fmt.Errorf("env file %s contains invalid utf8 bytes at line %d: %v", filename, currentLine+1, scannedBytes)
- }
- // We trim UTF8 BOM
- if currentLine == 0 {
- scannedBytes = bytes.TrimPrefix(scannedBytes, utf8bom)
- }
- // trim the line from all leading whitespace first
- line := strings.TrimLeftFunc(string(scannedBytes), unicode.IsSpace)
- currentLine++
- // line is not empty, and not starting with '#'
- if len(line) > 0 && !strings.HasPrefix(line, "#") {
- variable, value, hasValue := strings.Cut(line, "=")
-
- // trim the front of a variable, but nothing else
- variable = strings.TrimLeft(variable, whiteSpaces)
- if strings.ContainsAny(variable, whiteSpaces) {
- return []string{}, ErrBadKey{fmt.Sprintf("variable '%s' contains whitespaces", variable)}
- }
- if len(variable) == 0 {
- return []string{}, ErrBadKey{fmt.Sprintf("no variable name on line '%s'", line)}
- }
-
- if hasValue {
- // pass the value through, no trimming
- lines = append(lines, variable+"="+value)
- } else {
- var present bool
- if emptyFn != nil {
- value, present = emptyFn(line)
- }
- if present {
- // if only a pass-through variable is given, clean it up.
- lines = append(lines, strings.TrimSpace(variable)+"="+value)
- }
- }
- }
- }
- return lines, scanner.Err()
-}
diff --git a/vendor/github.com/docker/cli/opts/mount.go b/vendor/github.com/docker/cli/opts/mount.go
index 430b858e..3a4ee31a 100644
--- a/vendor/github.com/docker/cli/opts/mount.go
+++ b/vendor/github.com/docker/cli/opts/mount.go
@@ -165,11 +165,11 @@ func (m *MountOpt) Set(value string) error {
}
if mount.Type == "" {
- return fmt.Errorf("type is required")
+ return errors.New("type is required")
}
if mount.Target == "" {
- return fmt.Errorf("target is required")
+ return errors.New("target is required")
}
if mount.VolumeOptions != nil && mount.Type != mounttypes.TypeVolume {
diff --git a/vendor/github.com/docker/cli/opts/network.go b/vendor/github.com/docker/cli/opts/network.go
index e36ef405..413aec7b 100644
--- a/vendor/github.com/docker/cli/opts/network.go
+++ b/vendor/github.com/docker/cli/opts/network.go
@@ -2,6 +2,7 @@ package opts
import (
"encoding/csv"
+ "errors"
"fmt"
"regexp"
"strings"
@@ -83,11 +84,11 @@ func (n *NetworkOpt) Set(value string) error { //nolint:gocyclo
}
netOpt.DriverOpts[key] = val
default:
- return fmt.Errorf("invalid field key %s", key)
+ return errors.New("invalid field key " + key)
}
}
if len(netOpt.Target) == 0 {
- return fmt.Errorf("network name/id is not specified")
+ return errors.New("network name/id is not specified")
}
} else {
netOpt.Target = value
@@ -126,7 +127,7 @@ func parseDriverOpt(driverOpt string) (string, string, error) {
// TODO(thaJeztah): should value be converted to lowercase as well, or only the key?
key, value, ok := strings.Cut(strings.ToLower(driverOpt), "=")
if !ok || key == "" {
- return "", "", fmt.Errorf("invalid key value pair format in driver options")
+ return "", "", errors.New("invalid key value pair format in driver options")
}
key = strings.TrimSpace(key)
value = strings.TrimSpace(value)
diff --git a/vendor/github.com/docker/cli/opts/opts.go b/vendor/github.com/docker/cli/opts/opts.go
index 80de1605..157b30f3 100644
--- a/vendor/github.com/docker/cli/opts/opts.go
+++ b/vendor/github.com/docker/cli/opts/opts.go
@@ -266,6 +266,8 @@ func validateDomain(val string) (string, error) {
return "", fmt.Errorf("%s is not a valid domain", val)
}
+const whiteSpaces = " \t"
+
// ValidateLabel validates that the specified string is a valid label, and returns it.
//
// Labels are in the form of key=value; key must be a non-empty string, and not
@@ -401,7 +403,7 @@ func ParseCPUs(value string) (int64, error) {
}
nano := cpu.Mul(cpu, big.NewRat(1e9, 1))
if !nano.IsInt() {
- return 0, fmt.Errorf("value is too precise")
+ return 0, errors.New("value is too precise")
}
return nano.Num().Int64(), nil
}
@@ -409,14 +411,14 @@ func ParseCPUs(value string) (int64, error) {
// ParseLink parses and validates the specified string as a link format (name:alias)
func ParseLink(val string) (string, string, error) {
if val == "" {
- return "", "", fmt.Errorf("empty string specified for links")
+ return "", "", errors.New("empty string specified for links")
}
// We expect two parts, but restrict to three to allow detecting invalid formats.
arr := strings.SplitN(val, ":", 3)
// TODO(thaJeztah): clean up this logic!!
if len(arr) > 2 {
- return "", "", fmt.Errorf("bad format for links: %s", val)
+ return "", "", errors.New("bad format for links: " + val)
}
// TODO(thaJeztah): this should trim the "/" prefix as well??
if len(arr) == 1 {
diff --git a/vendor/github.com/docker/cli/opts/parse.go b/vendor/github.com/docker/cli/opts/parse.go
index 381648fe..996d4d7e 100644
--- a/vendor/github.com/docker/cli/opts/parse.go
+++ b/vendor/github.com/docker/cli/opts/parse.go
@@ -1,11 +1,12 @@
package opts
import (
- "fmt"
+ "errors"
"os"
"strconv"
"strings"
+ "github.com/docker/cli/pkg/kvfile"
"github.com/docker/docker/api/types/container"
)
@@ -25,7 +26,7 @@ func ReadKVEnvStrings(files []string, override []string) ([]string, error) {
func readKVStrings(files []string, override []string, emptyFn func(string) (string, bool)) ([]string, error) {
var variables []string
for _, ef := range files {
- parsedVars, err := parseKeyValueFile(ef, emptyFn)
+ parsedVars, err := kvfile.Parse(ef, emptyFn)
if err != nil {
return nil, err
}
@@ -81,12 +82,12 @@ func ParseRestartPolicy(policy string) (container.RestartPolicy, error) {
p := container.RestartPolicy{}
k, v, ok := strings.Cut(policy, ":")
if ok && k == "" {
- return container.RestartPolicy{}, fmt.Errorf("invalid restart policy format: no policy provided before colon")
+ return container.RestartPolicy{}, errors.New("invalid restart policy format: no policy provided before colon")
}
if v != "" {
count, err := strconv.Atoi(v)
if err != nil {
- return container.RestartPolicy{}, fmt.Errorf("invalid restart policy format: maximum retry count must be an integer")
+ return container.RestartPolicy{}, errors.New("invalid restart policy format: maximum retry count must be an integer")
}
p.MaximumRetryCount = count
}
diff --git a/vendor/github.com/docker/cli/opts/port.go b/vendor/github.com/docker/cli/opts/port.go
index fe41cdd2..099aae35 100644
--- a/vendor/github.com/docker/cli/opts/port.go
+++ b/vendor/github.com/docker/cli/opts/port.go
@@ -2,6 +2,7 @@ package opts
import (
"encoding/csv"
+ "errors"
"fmt"
"net"
"regexp"
@@ -102,7 +103,7 @@ func (p *PortOpt) Set(value string) error {
for _, portBindings := range portBindingMap {
for _, portBinding := range portBindings {
if portBinding.HostIP != "" {
- return fmt.Errorf("hostip is not supported")
+ return errors.New("hostip is not supported")
}
}
}
@@ -148,6 +149,7 @@ func ConvertPortToPortConfig(
for _, binding := range portBindings[port] {
if p := net.ParseIP(binding.HostIP); p != nil && !p.IsUnspecified() {
+ // TODO(thaJeztah): use context-logger, so that this output can be suppressed (in tests).
logrus.Warnf("ignoring IP-address (%s:%s) service will listen on '0.0.0.0'", net.JoinHostPort(binding.HostIP, binding.HostPort), port)
}
diff --git a/vendor/github.com/docker/cli/opts/secret.go b/vendor/github.com/docker/cli/opts/secret.go
index 750dbe4f..09d2b2b3 100644
--- a/vendor/github.com/docker/cli/opts/secret.go
+++ b/vendor/github.com/docker/cli/opts/secret.go
@@ -2,6 +2,7 @@ package opts
import (
"encoding/csv"
+ "errors"
"fmt"
"os"
"strconv"
@@ -62,12 +63,12 @@ func (o *SecretOpt) Set(value string) error {
options.File.Mode = os.FileMode(m)
default:
- return fmt.Errorf("invalid field in secret request: %s", key)
+ return errors.New("invalid field in secret request: " + key)
}
}
if options.SecretName == "" {
- return fmt.Errorf("source is required")
+ return errors.New("source is required")
}
if options.File.Name == "" {
options.File.Name = options.SecretName
diff --git a/vendor/github.com/docker/cli/opts/throttledevice.go b/vendor/github.com/docker/cli/opts/throttledevice.go
index bdf454eb..8bf12880 100644
--- a/vendor/github.com/docker/cli/opts/throttledevice.go
+++ b/vendor/github.com/docker/cli/opts/throttledevice.go
@@ -94,7 +94,7 @@ func (opt *ThrottledeviceOpt) String() string {
// GetList returns a slice of pointers to ThrottleDevices.
func (opt *ThrottledeviceOpt) GetList() []*blkiodev.ThrottleDevice {
- out := make([]*blkiodev.ThrottleDevice, 0, len(opt.values))
+ out := make([]*blkiodev.ThrottleDevice, len(opt.values))
copy(out, opt.values)
return out
}
diff --git a/vendor/github.com/docker/cli/opts/ulimit.go b/vendor/github.com/docker/cli/opts/ulimit.go
index 5176b999..1409a109 100644
--- a/vendor/github.com/docker/cli/opts/ulimit.go
+++ b/vendor/github.com/docker/cli/opts/ulimit.go
@@ -4,24 +4,27 @@ import (
"fmt"
"sort"
+ "github.com/docker/docker/api/types/container"
"github.com/docker/go-units"
)
// UlimitOpt defines a map of Ulimits
type UlimitOpt struct {
- values *map[string]*units.Ulimit
+ values *map[string]*container.Ulimit
}
// NewUlimitOpt creates a new UlimitOpt. Ulimits are not validated.
-func NewUlimitOpt(ref *map[string]*units.Ulimit) *UlimitOpt {
+func NewUlimitOpt(ref *map[string]*container.Ulimit) *UlimitOpt {
+ // TODO(thaJeztah): why do we need a map with pointers here?
if ref == nil {
- ref = &map[string]*units.Ulimit{}
+ ref = &map[string]*container.Ulimit{}
}
return &UlimitOpt{ref}
}
// Set validates a Ulimit and sets its name as a key in UlimitOpt
func (o *UlimitOpt) Set(val string) error {
+ // FIXME(thaJeztah): these functions also need to be moved over from go-units.
l, err := units.ParseUlimit(val)
if err != nil {
return err
@@ -43,8 +46,8 @@ func (o *UlimitOpt) String() string {
}
// GetList returns a slice of pointers to Ulimits. Values are sorted by name.
-func (o *UlimitOpt) GetList() []*units.Ulimit {
- ulimits := make([]*units.Ulimit, 0, len(*o.values))
+func (o *UlimitOpt) GetList() []*container.Ulimit {
+ ulimits := make([]*container.Ulimit, 0, len(*o.values))
for _, v := range *o.values {
ulimits = append(ulimits, v)
}
diff --git a/vendor/github.com/docker/cli/pkg/kvfile/kvfile.go b/vendor/github.com/docker/cli/pkg/kvfile/kvfile.go
new file mode 100644
index 00000000..f6ac8ef4
--- /dev/null
+++ b/vendor/github.com/docker/cli/pkg/kvfile/kvfile.go
@@ -0,0 +1,130 @@
+// Package kvfile provides utilities to parse line-delimited key/value files
+// such as used for label-files and env-files.
+//
+// # File format
+//
+// key/value files use the following syntax:
+//
+// - File must be valid UTF-8.
+// - BOM headers are removed.
+// - Leading whitespace is removed for each line.
+// - Lines starting with "#" are ignored.
+// - Empty lines are ignored.
+// - Key/Value pairs are provided as "KEY[=]".
+// - Maximum line-length is limited to [bufio.MaxScanTokenSize].
+//
+// # Interpolation, substitution, and escaping
+//
+// Both keys and values are used as-is; no interpolation, substitution or
+// escaping is supported, and quotes are considered part of the key or value.
+// Whitespace in values (including leading and trailing) is preserved. Given
+// that the file format is line-delimited, neither key, nor value, can contain
+// newlines.
+//
+// # Key/Value pairs
+//
+// Key/Value pairs take the following format:
+//
+// KEY[=]
+//
+// KEY is required and may not contain whitespaces or NUL characters. Any
+// other character (except for the "=" delimiter) are accepted, but it is
+// recommended to use a subset of the POSIX portable character set, as
+// outlined in [Environment Variables].
+//
+// VALUE is optional, but may be empty. If no value is provided (i.e., no
+// equal sign ("=") is present), the KEY is omitted in the result, but some
+// functions accept a lookup-function to provide a default value for the
+// given key.
+//
+// [Environment Variables]: https://pubs.opengroup.org/onlinepubs/7908799/xbd/envvar.html
+package kvfile
+
+import (
+ "bufio"
+ "bytes"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+ "unicode"
+ "unicode/utf8"
+)
+
+// Parse parses a line-delimited key/value pairs separated by equal sign.
+// It accepts a lookupFn to lookup default values for keys that do not define
+// a value. An error is produced if parsing failed, the content contains invalid
+// UTF-8 characters, or a key contains whitespaces.
+func Parse(filename string, lookupFn func(key string) (value string, found bool)) ([]string, error) {
+ fh, err := os.Open(filename)
+ if err != nil {
+ return []string{}, err
+ }
+ out, err := parseKeyValueFile(fh, lookupFn)
+ _ = fh.Close()
+ if err != nil {
+ return []string{}, fmt.Errorf("invalid env file (%s): %v", filename, err)
+ }
+ return out, nil
+}
+
+// ParseFromReader parses a line-delimited key/value pairs separated by equal sign.
+// It accepts a lookupFn to lookup default values for keys that do not define
+// a value. An error is produced if parsing failed, the content contains invalid
+// UTF-8 characters, or a key contains whitespaces.
+func ParseFromReader(r io.Reader, lookupFn func(key string) (value string, found bool)) ([]string, error) {
+ return parseKeyValueFile(r, lookupFn)
+}
+
+const whiteSpaces = " \t"
+
+func parseKeyValueFile(r io.Reader, lookupFn func(string) (string, bool)) ([]string, error) {
+ lines := []string{}
+ scanner := bufio.NewScanner(r)
+ utf8bom := []byte{0xEF, 0xBB, 0xBF}
+ for currentLine := 1; scanner.Scan(); currentLine++ {
+ scannedBytes := scanner.Bytes()
+ if !utf8.Valid(scannedBytes) {
+ return []string{}, fmt.Errorf("invalid utf8 bytes at line %d: %v", currentLine, scannedBytes)
+ }
+ // We trim UTF8 BOM
+ if currentLine == 1 {
+ scannedBytes = bytes.TrimPrefix(scannedBytes, utf8bom)
+ }
+ // trim the line from all leading whitespace first. trailing whitespace
+ // is part of the value, and is kept unmodified.
+ line := strings.TrimLeftFunc(string(scannedBytes), unicode.IsSpace)
+
+ if len(line) == 0 || line[0] == '#' {
+ // skip empty lines and comments (lines starting with '#')
+ continue
+ }
+
+ key, _, hasValue := strings.Cut(line, "=")
+ if len(key) == 0 {
+ return []string{}, fmt.Errorf("no variable name on line '%s'", line)
+ }
+
+ // leading whitespace was already removed from the line, but
+ // variables are not allowed to contain whitespace or have
+ // trailing whitespace.
+ if strings.ContainsAny(key, whiteSpaces) {
+ return []string{}, fmt.Errorf("variable '%s' contains whitespaces", key)
+ }
+
+ if hasValue {
+ // key/value pair is valid and has a value; add the line as-is.
+ lines = append(lines, line)
+ continue
+ }
+
+ if lookupFn != nil {
+ // No value given; try to look up the value. The value may be
+ // empty but if no value is found, the key is omitted.
+ if value, found := lookupFn(line); found {
+ lines = append(lines, key+"="+value)
+ }
+ }
+ }
+ return lines, scanner.Err()
+}
diff --git a/vendor/github.com/fsnotify/fsnotify/.cirrus.yml b/vendor/github.com/fsnotify/fsnotify/.cirrus.yml
deleted file mode 100644
index ffc7b992..00000000
--- a/vendor/github.com/fsnotify/fsnotify/.cirrus.yml
+++ /dev/null
@@ -1,13 +0,0 @@
-freebsd_task:
- name: 'FreeBSD'
- freebsd_instance:
- image_family: freebsd-13-2
- install_script:
- - pkg update -f
- - pkg install -y go
- test_script:
- # run tests as user "cirrus" instead of root
- - pw useradd cirrus -m
- - chown -R cirrus:cirrus .
- - FSNOTIFY_BUFFER=4096 sudo --preserve-env=FSNOTIFY_BUFFER -u cirrus go test -parallel 1 -race ./...
- - sudo --preserve-env=FSNOTIFY_BUFFER -u cirrus go test -parallel 1 -race ./...
diff --git a/vendor/github.com/fsnotify/fsnotify/.gitignore b/vendor/github.com/fsnotify/fsnotify/.gitignore
index 391cc076..4cd0cbaf 100644
--- a/vendor/github.com/fsnotify/fsnotify/.gitignore
+++ b/vendor/github.com/fsnotify/fsnotify/.gitignore
@@ -1,7 +1,6 @@
-# go test -c output
-*.test
-*.test.exe
+# Setup a Global .gitignore for OS and editor generated files:
+# https://help.github.com/articles/ignoring-files
+# git config --global core.excludesfile ~/.gitignore_global
-# Output of go build ./cmd/fsnotify
-/fsnotify
-/fsnotify.exe
+.vagrant
+*.sublime-project
diff --git a/vendor/github.com/fsnotify/fsnotify/.mailmap b/vendor/github.com/fsnotify/fsnotify/.mailmap
deleted file mode 100644
index a04f2907..00000000
--- a/vendor/github.com/fsnotify/fsnotify/.mailmap
+++ /dev/null
@@ -1,2 +0,0 @@
-Chris Howey
-Nathan Youngman <4566+nathany@users.noreply.github.com>
diff --git a/vendor/github.com/fsnotify/fsnotify/.travis.yml b/vendor/github.com/fsnotify/fsnotify/.travis.yml
new file mode 100644
index 00000000..a9c30165
--- /dev/null
+++ b/vendor/github.com/fsnotify/fsnotify/.travis.yml
@@ -0,0 +1,36 @@
+sudo: false
+language: go
+
+go:
+ - "stable"
+ - "1.11.x"
+ - "1.10.x"
+ - "1.9.x"
+
+matrix:
+ include:
+ - go: "stable"
+ env: GOLINT=true
+ allow_failures:
+ - go: tip
+ fast_finish: true
+
+
+before_install:
+ - if [ ! -z "${GOLINT}" ]; then go get -u golang.org/x/lint/golint; fi
+
+script:
+ - go test --race ./...
+
+after_script:
+ - test -z "$(gofmt -s -l -w . | tee /dev/stderr)"
+ - if [ ! -z "${GOLINT}" ]; then echo running golint; golint --set_exit_status ./...; else echo skipping golint; fi
+ - go vet ./...
+
+os:
+ - linux
+ - osx
+ - windows
+
+notifications:
+ email: false
diff --git a/vendor/github.com/fsnotify/fsnotify/AUTHORS b/vendor/github.com/fsnotify/fsnotify/AUTHORS
new file mode 100644
index 00000000..5ab5d41c
--- /dev/null
+++ b/vendor/github.com/fsnotify/fsnotify/AUTHORS
@@ -0,0 +1,52 @@
+# Names should be added to this file as
+# Name or Organization
+# The email address is not required for organizations.
+
+# You can update this list using the following command:
+#
+# $ git shortlog -se | awk '{print $2 " " $3 " " $4}'
+
+# Please keep the list sorted.
+
+Aaron L
+Adrien Bustany
+Amit Krishnan
+Anmol Sethi
+Bjørn Erik Pedersen
+Bruno Bigras
+Caleb Spare
+Case Nelson
+Chris Howey
+Christoffer Buchholz
+Daniel Wagner-Hall
+Dave Cheney
+Evan Phoenix
+Francisco Souza
+Hari haran
+John C Barstow
+Kelvin Fo
+Ken-ichirou MATSUZAWA
+Matt Layher
+Nathan Youngman
+Nickolai Zeldovich
+Patrick
+Paul Hammond
+Pawel Knap
+Pieter Droogendijk
+Pursuit92
+Riku Voipio
+Rob Figueiredo
+Rodrigo Chiossi
+Slawek Ligus
+Soge Zhang
+Tiffany Jernigan
+Tilak Sharma
+Tom Payne
+Travis Cline
+Tudor Golubenco
+Vahe Khachikyan
+Yukang
+bronze1man
+debrando
+henrikedwards
+铁哥
diff --git a/vendor/github.com/fsnotify/fsnotify/CHANGELOG.md b/vendor/github.com/fsnotify/fsnotify/CHANGELOG.md
index e0e57575..be4d7ea2 100644
--- a/vendor/github.com/fsnotify/fsnotify/CHANGELOG.md
+++ b/vendor/github.com/fsnotify/fsnotify/CHANGELOG.md
@@ -1,230 +1,6 @@
# Changelog
-Unreleased
-----------
-Nothing yet.
-
-1.7.0 - 2023-10-22
-------------------
-This version of fsnotify needs Go 1.17.
-
-### Additions
-
-- illumos: add FEN backend to support illumos and Solaris. ([#371])
-
-- all: add `NewBufferedWatcher()` to use a buffered channel, which can be useful
- in cases where you can't control the kernel buffer and receive a large number
- of events in bursts. ([#550], [#572])
-
-- all: add `AddWith()`, which is identical to `Add()` but allows passing
- options. ([#521])
-
-- windows: allow setting the ReadDirectoryChangesW() buffer size with
- `fsnotify.WithBufferSize()`; the default of 64K is the highest value that
- works on all platforms and is enough for most purposes, but in some cases a
- highest buffer is needed. ([#521])
-
-### Changes and fixes
-
-- inotify: remove watcher if a watched path is renamed ([#518])
-
- After a rename the reported name wasn't updated, or even an empty string.
- Inotify doesn't provide any good facilities to update it, so just remove the
- watcher. This is already how it worked on kqueue and FEN.
-
- On Windows this does work, and remains working.
-
-- windows: don't listen for file attribute changes ([#520])
-
- File attribute changes are sent as `FILE_ACTION_MODIFIED` by the Windows API,
- with no way to see if they're a file write or attribute change, so would show
- up as a fsnotify.Write event. This is never useful, and could result in many
- spurious Write events.
-
-- windows: return `ErrEventOverflow` if the buffer is full ([#525])
-
- Before it would merely return "short read", making it hard to detect this
- error.
-
-- kqueue: make sure events for all files are delivered properly when removing a
- watched directory ([#526])
-
- Previously they would get sent with `""` (empty string) or `"."` as the path
- name.
-
-- kqueue: don't emit spurious Create events for symbolic links ([#524])
-
- The link would get resolved but kqueue would "forget" it already saw the link
- itself, resulting on a Create for every Write event for the directory.
-
-- all: return `ErrClosed` on `Add()` when the watcher is closed ([#516])
-
-- other: add `Watcher.Errors` and `Watcher.Events` to the no-op `Watcher` in
- `backend_other.go`, making it easier to use on unsupported platforms such as
- WASM, AIX, etc. ([#528])
-
-- other: use the `backend_other.go` no-op if the `appengine` build tag is set;
- Google AppEngine forbids usage of the unsafe package so the inotify backend
- won't compile there.
-
-[#371]: https://github.com/fsnotify/fsnotify/pull/371
-[#516]: https://github.com/fsnotify/fsnotify/pull/516
-[#518]: https://github.com/fsnotify/fsnotify/pull/518
-[#520]: https://github.com/fsnotify/fsnotify/pull/520
-[#521]: https://github.com/fsnotify/fsnotify/pull/521
-[#524]: https://github.com/fsnotify/fsnotify/pull/524
-[#525]: https://github.com/fsnotify/fsnotify/pull/525
-[#526]: https://github.com/fsnotify/fsnotify/pull/526
-[#528]: https://github.com/fsnotify/fsnotify/pull/528
-[#537]: https://github.com/fsnotify/fsnotify/pull/537
-[#550]: https://github.com/fsnotify/fsnotify/pull/550
-[#572]: https://github.com/fsnotify/fsnotify/pull/572
-
-1.6.0 - 2022-10-13
-------------------
-This version of fsnotify needs Go 1.16 (this was already the case since 1.5.1,
-but not documented). It also increases the minimum Linux version to 2.6.32.
-
-### Additions
-
-- all: add `Event.Has()` and `Op.Has()` ([#477])
-
- This makes checking events a lot easier; for example:
-
- if event.Op&Write == Write && !(event.Op&Remove == Remove) {
- }
-
- Becomes:
-
- if event.Has(Write) && !event.Has(Remove) {
- }
-
-- all: add cmd/fsnotify ([#463])
-
- A command-line utility for testing and some examples.
-
-### Changes and fixes
-
-- inotify: don't ignore events for files that don't exist ([#260], [#470])
-
- Previously the inotify watcher would call `os.Lstat()` to check if a file
- still exists before emitting events.
-
- This was inconsistent with other platforms and resulted in inconsistent event
- reporting (e.g. when a file is quickly removed and re-created), and generally
- a source of confusion. It was added in 2013 to fix a memory leak that no
- longer exists.
-
-- all: return `ErrNonExistentWatch` when `Remove()` is called on a path that's
- not watched ([#460])
-
-- inotify: replace epoll() with non-blocking inotify ([#434])
-
- Non-blocking inotify was not generally available at the time this library was
- written in 2014, but now it is. As a result, the minimum Linux version is
- bumped from 2.6.27 to 2.6.32. This hugely simplifies the code and is faster.
-
-- kqueue: don't check for events every 100ms ([#480])
-
- The watcher would wake up every 100ms, even when there was nothing to do. Now
- it waits until there is something to do.
-
-- macos: retry opening files on EINTR ([#475])
-
-- kqueue: skip unreadable files ([#479])
-
- kqueue requires a file descriptor for every file in a directory; this would
- fail if a file was unreadable by the current user. Now these files are simply
- skipped.
-
-- windows: fix renaming a watched directory if the parent is also watched ([#370])
-
-- windows: increase buffer size from 4K to 64K ([#485])
-
-- windows: close file handle on Remove() ([#288])
-
-- kqueue: put pathname in the error if watching a file fails ([#471])
-
-- inotify, windows: calling Close() more than once could race ([#465])
-
-- kqueue: improve Close() performance ([#233])
-
-- all: various documentation additions and clarifications.
-
-[#233]: https://github.com/fsnotify/fsnotify/pull/233
-[#260]: https://github.com/fsnotify/fsnotify/pull/260
-[#288]: https://github.com/fsnotify/fsnotify/pull/288
-[#370]: https://github.com/fsnotify/fsnotify/pull/370
-[#434]: https://github.com/fsnotify/fsnotify/pull/434
-[#460]: https://github.com/fsnotify/fsnotify/pull/460
-[#463]: https://github.com/fsnotify/fsnotify/pull/463
-[#465]: https://github.com/fsnotify/fsnotify/pull/465
-[#470]: https://github.com/fsnotify/fsnotify/pull/470
-[#471]: https://github.com/fsnotify/fsnotify/pull/471
-[#475]: https://github.com/fsnotify/fsnotify/pull/475
-[#477]: https://github.com/fsnotify/fsnotify/pull/477
-[#479]: https://github.com/fsnotify/fsnotify/pull/479
-[#480]: https://github.com/fsnotify/fsnotify/pull/480
-[#485]: https://github.com/fsnotify/fsnotify/pull/485
-
-## [1.5.4] - 2022-04-25
-
-* Windows: add missing defer to `Watcher.WatchList` [#447](https://github.com/fsnotify/fsnotify/pull/447)
-* go.mod: use latest x/sys [#444](https://github.com/fsnotify/fsnotify/pull/444)
-* Fix compilation for OpenBSD [#443](https://github.com/fsnotify/fsnotify/pull/443)
-
-## [1.5.3] - 2022-04-22
-
-* This version is retracted. An incorrect branch is published accidentally [#445](https://github.com/fsnotify/fsnotify/issues/445)
-
-## [1.5.2] - 2022-04-21
-
-* Add a feature to return the directories and files that are being monitored [#374](https://github.com/fsnotify/fsnotify/pull/374)
-* Fix potential crash on windows if `raw.FileNameLength` exceeds `syscall.MAX_PATH` [#361](https://github.com/fsnotify/fsnotify/pull/361)
-* Allow build on unsupported GOOS [#424](https://github.com/fsnotify/fsnotify/pull/424)
-* Don't set `poller.fd` twice in `newFdPoller` [#406](https://github.com/fsnotify/fsnotify/pull/406)
-* fix go vet warnings: call to `(*T).Fatalf` from a non-test goroutine [#416](https://github.com/fsnotify/fsnotify/pull/416)
-
-## [1.5.1] - 2021-08-24
-
-* Revert Add AddRaw to not follow symlinks [#394](https://github.com/fsnotify/fsnotify/pull/394)
-
-## [1.5.0] - 2021-08-20
-
-* Go: Increase minimum required version to Go 1.12 [#381](https://github.com/fsnotify/fsnotify/pull/381)
-* Feature: Add AddRaw method which does not follow symlinks when adding a watch [#289](https://github.com/fsnotify/fsnotify/pull/298)
-* Windows: Follow symlinks by default like on all other systems [#289](https://github.com/fsnotify/fsnotify/pull/289)
-* CI: Use GitHub Actions for CI and cover go 1.12-1.17
- [#378](https://github.com/fsnotify/fsnotify/pull/378)
- [#381](https://github.com/fsnotify/fsnotify/pull/381)
- [#385](https://github.com/fsnotify/fsnotify/pull/385)
-* Go 1.14+: Fix unsafe pointer conversion [#325](https://github.com/fsnotify/fsnotify/pull/325)
-
-## [1.4.9] - 2020-03-11
-
-* Move example usage to the readme #329. This may resolve #328.
-
-## [1.4.8] - 2020-03-10
-
-* CI: test more go versions (@nathany 1d13583d846ea9d66dcabbfefbfb9d8e6fb05216)
-* Tests: Queued inotify events could have been read by the test before max_queued_events was hit (@matthias-stone #265)
-* Tests: t.Fatalf -> t.Errorf in go routines (@gdey #266)
-* CI: Less verbosity (@nathany #267)
-* Tests: Darwin: Exchangedata is deprecated on 10.13 (@nathany #267)
-* Tests: Check if channels are closed in the example (@alexeykazakov #244)
-* CI: Only run golint on latest version of go and fix issues (@cpuguy83 #284)
-* CI: Add windows to travis matrix (@cpuguy83 #284)
-* Docs: Remover appveyor badge (@nathany 11844c0959f6fff69ba325d097fce35bd85a8e93)
-* Linux: create epoll and pipe fds with close-on-exec (@JohannesEbke #219)
-* Linux: open files with close-on-exec (@linxiulei #273)
-* Docs: Plan to support fanotify (@nathany ab058b44498e8b7566a799372a39d150d9ea0119 )
-* Project: Add go.mod (@nathany #309)
-* Project: Revise editor config (@nathany #309)
-* Project: Update copyright for 2019 (@nathany #309)
-* CI: Drop go1.8 from CI matrix (@nathany #309)
-* Docs: Updating the FAQ section for supportability with NFS & FUSE filesystems (@Pratik32 4bf2d1fec78374803a39307bfb8d340688f4f28e )
-
-## [1.4.7] - 2018-01-09
+## v1.4.7 / 2018-01-09
* BSD/macOS: Fix possible deadlock on closing the watcher on kqueue (thanks @nhooyr and @glycerine)
* Tests: Fix missing verb on format string (thanks @rchiossi)
@@ -234,62 +10,62 @@ but not documented). It also increases the minimum Linux version to 2.6.32.
* Linux: Properly handle inotify's IN_Q_OVERFLOW event (thanks @zeldovich)
* Docs: replace references to OS X with macOS
-## [1.4.2] - 2016-10-10
+## v1.4.2 / 2016-10-10
* Linux: use InotifyInit1 with IN_CLOEXEC to stop leaking a file descriptor to a child process when using fork/exec [#178](https://github.com/fsnotify/fsnotify/pull/178) (thanks @pattyshack)
-## [1.4.1] - 2016-10-04
+## v1.4.1 / 2016-10-04
* Fix flaky inotify stress test on Linux [#177](https://github.com/fsnotify/fsnotify/pull/177) (thanks @pattyshack)
-## [1.4.0] - 2016-10-01
+## v1.4.0 / 2016-10-01
* add a String() method to Event.Op [#165](https://github.com/fsnotify/fsnotify/pull/165) (thanks @oozie)
-## [1.3.1] - 2016-06-28
+## v1.3.1 / 2016-06-28
* Windows: fix for double backslash when watching the root of a drive [#151](https://github.com/fsnotify/fsnotify/issues/151) (thanks @brunoqc)
-## [1.3.0] - 2016-04-19
+## v1.3.0 / 2016-04-19
* Support linux/arm64 by [patching](https://go-review.googlesource.com/#/c/21971/) x/sys/unix and switching to to it from syscall (thanks @suihkulokki) [#135](https://github.com/fsnotify/fsnotify/pull/135)
-## [1.2.10] - 2016-03-02
+## v1.2.10 / 2016-03-02
* Fix golint errors in windows.go [#121](https://github.com/fsnotify/fsnotify/pull/121) (thanks @tiffanyfj)
-## [1.2.9] - 2016-01-13
+## v1.2.9 / 2016-01-13
kqueue: Fix logic for CREATE after REMOVE [#111](https://github.com/fsnotify/fsnotify/pull/111) (thanks @bep)
-## [1.2.8] - 2015-12-17
+## v1.2.8 / 2015-12-17
* kqueue: fix race condition in Close [#105](https://github.com/fsnotify/fsnotify/pull/105) (thanks @djui for reporting the issue and @ppknap for writing a failing test)
* inotify: fix race in test
* enable race detection for continuous integration (Linux, Mac, Windows)
-## [1.2.5] - 2015-10-17
+## v1.2.5 / 2015-10-17
* inotify: use epoll_create1 for arm64 support (requires Linux 2.6.27 or later) [#100](https://github.com/fsnotify/fsnotify/pull/100) (thanks @suihkulokki)
* inotify: fix path leaks [#73](https://github.com/fsnotify/fsnotify/pull/73) (thanks @chamaken)
* kqueue: watch for rename events on subdirectories [#83](https://github.com/fsnotify/fsnotify/pull/83) (thanks @guotie)
* kqueue: avoid infinite loops from symlinks cycles [#101](https://github.com/fsnotify/fsnotify/pull/101) (thanks @illicitonion)
-## [1.2.1] - 2015-10-14
+## v1.2.1 / 2015-10-14
* kqueue: don't watch named pipes [#98](https://github.com/fsnotify/fsnotify/pull/98) (thanks @evanphx)
-## [1.2.0] - 2015-02-08
+## v1.2.0 / 2015-02-08
* inotify: use epoll to wake up readEvents [#66](https://github.com/fsnotify/fsnotify/pull/66) (thanks @PieterD)
* inotify: closing watcher should now always shut down goroutine [#63](https://github.com/fsnotify/fsnotify/pull/63) (thanks @PieterD)
* kqueue: close kqueue after removing watches, fixes [#59](https://github.com/fsnotify/fsnotify/issues/59)
-## [1.1.1] - 2015-02-05
+## v1.1.1 / 2015-02-05
* inotify: Retry read on EINTR [#61](https://github.com/fsnotify/fsnotify/issues/61) (thanks @PieterD)
-## [1.1.0] - 2014-12-12
+## v1.1.0 / 2014-12-12
* kqueue: rework internals [#43](https://github.com/fsnotify/fsnotify/pull/43)
* add low-level functions
@@ -301,22 +77,22 @@ kqueue: Fix logic for CREATE after REMOVE [#111](https://github.com/fsnotify/fsn
* kqueue: fix regression in rework causing subdirectories to be watched [#48](https://github.com/fsnotify/fsnotify/issues/48)
* kqueue: cleanup internal watch before sending remove event [#51](https://github.com/fsnotify/fsnotify/issues/51)
-## [1.0.4] - 2014-09-07
+## v1.0.4 / 2014-09-07
* kqueue: add dragonfly to the build tags.
* Rename source code files, rearrange code so exported APIs are at the top.
* Add done channel to example code. [#37](https://github.com/fsnotify/fsnotify/pull/37) (thanks @chenyukang)
-## [1.0.3] - 2014-08-19
+## v1.0.3 / 2014-08-19
* [Fix] Windows MOVED_TO now translates to Create like on BSD and Linux. [#36](https://github.com/fsnotify/fsnotify/issues/36)
-## [1.0.2] - 2014-08-17
+## v1.0.2 / 2014-08-17
* [Fix] Missing create events on macOS. [#14](https://github.com/fsnotify/fsnotify/issues/14) (thanks @zhsso)
* [Fix] Make ./path and path equivalent. (thanks @zhsso)
-## [1.0.0] - 2014-08-15
+## v1.0.0 / 2014-08-15
* [API] Remove AddWatch on Windows, use Add.
* Improve documentation for exported identifiers. [#30](https://github.com/fsnotify/fsnotify/issues/30)
@@ -370,51 +146,51 @@ kqueue: Fix logic for CREATE after REMOVE [#111](https://github.com/fsnotify/fsn
* no tests for the current implementation
* not fully implemented on Windows [#93](https://github.com/howeyc/fsnotify/issues/93#issuecomment-39285195)
-## [0.9.3] - 2014-12-31
+## v0.9.3 / 2014-12-31
* kqueue: cleanup internal watch before sending remove event [#51](https://github.com/fsnotify/fsnotify/issues/51)
-## [0.9.2] - 2014-08-17
+## v0.9.2 / 2014-08-17
* [Backport] Fix missing create events on macOS. [#14](https://github.com/fsnotify/fsnotify/issues/14) (thanks @zhsso)
-## [0.9.1] - 2014-06-12
+## v0.9.1 / 2014-06-12
* Fix data race on kevent buffer (thanks @tilaks) [#98](https://github.com/howeyc/fsnotify/pull/98)
-## [0.9.0] - 2014-01-17
+## v0.9.0 / 2014-01-17
* IsAttrib() for events that only concern a file's metadata [#79][] (thanks @abustany)
* [Fix] kqueue: fix deadlock [#77][] (thanks @cespare)
* [NOTICE] Development has moved to `code.google.com/p/go.exp/fsnotify` in preparation for inclusion in the Go standard library.
-## [0.8.12] - 2013-11-13
+## v0.8.12 / 2013-11-13
* [API] Remove FD_SET and friends from Linux adapter
-## [0.8.11] - 2013-11-02
+## v0.8.11 / 2013-11-02
* [Doc] Add Changelog [#72][] (thanks @nathany)
* [Doc] Spotlight and double modify events on macOS [#62][] (reported by @paulhammond)
-## [0.8.10] - 2013-10-19
+## v0.8.10 / 2013-10-19
* [Fix] kqueue: remove file watches when parent directory is removed [#71][] (reported by @mdwhatcott)
* [Fix] kqueue: race between Close and readEvents [#70][] (reported by @bernerdschaefer)
* [Doc] specify OS-specific limits in README (thanks @debrando)
-## [0.8.9] - 2013-09-08
+## v0.8.9 / 2013-09-08
* [Doc] Contributing (thanks @nathany)
* [Doc] update package path in example code [#63][] (thanks @paulhammond)
* [Doc] GoCI badge in README (Linux only) [#60][]
* [Doc] Cross-platform testing with Vagrant [#59][] (thanks @nathany)
-## [0.8.8] - 2013-06-17
+## v0.8.8 / 2013-06-17
* [Fix] Windows: handle `ERROR_MORE_DATA` on Windows [#49][] (thanks @jbowtie)
-## [0.8.7] - 2013-06-03
+## v0.8.7 / 2013-06-03
* [API] Make syscall flags internal
* [Fix] inotify: ignore event changes
@@ -422,74 +198,74 @@ kqueue: Fix logic for CREATE after REMOVE [#111](https://github.com/fsnotify/fsn
* [Fix] tests on Windows
* lower case error messages
-## [0.8.6] - 2013-05-23
+## v0.8.6 / 2013-05-23
* kqueue: Use EVT_ONLY flag on Darwin
* [Doc] Update README with full example
-## [0.8.5] - 2013-05-09
+## v0.8.5 / 2013-05-09
* [Fix] inotify: allow monitoring of "broken" symlinks (thanks @tsg)
-## [0.8.4] - 2013-04-07
+## v0.8.4 / 2013-04-07
* [Fix] kqueue: watch all file events [#40][] (thanks @ChrisBuchholz)
-## [0.8.3] - 2013-03-13
+## v0.8.3 / 2013-03-13
* [Fix] inoitfy/kqueue memory leak [#36][] (reported by @nbkolchin)
* [Fix] kqueue: use fsnFlags for watching a directory [#33][] (reported by @nbkolchin)
-## [0.8.2] - 2013-02-07
+## v0.8.2 / 2013-02-07
* [Doc] add Authors
* [Fix] fix data races for map access [#29][] (thanks @fsouza)
-## [0.8.1] - 2013-01-09
+## v0.8.1 / 2013-01-09
* [Fix] Windows path separators
* [Doc] BSD License
-## [0.8.0] - 2012-11-09
+## v0.8.0 / 2012-11-09
* kqueue: directory watching improvements (thanks @vmirage)
* inotify: add `IN_MOVED_TO` [#25][] (requested by @cpisto)
* [Fix] kqueue: deleting watched directory [#24][] (reported by @jakerr)
-## [0.7.4] - 2012-10-09
+## v0.7.4 / 2012-10-09
* [Fix] inotify: fixes from https://codereview.appspot.com/5418045/ (ugorji)
* [Fix] kqueue: preserve watch flags when watching for delete [#21][] (reported by @robfig)
* [Fix] kqueue: watch the directory even if it isn't a new watch (thanks @robfig)
* [Fix] kqueue: modify after recreation of file
-## [0.7.3] - 2012-09-27
+## v0.7.3 / 2012-09-27
* [Fix] kqueue: watch with an existing folder inside the watched folder (thanks @vmirage)
* [Fix] kqueue: no longer get duplicate CREATE events
-## [0.7.2] - 2012-09-01
+## v0.7.2 / 2012-09-01
* kqueue: events for created directories
-## [0.7.1] - 2012-07-14
+## v0.7.1 / 2012-07-14
* [Fix] for renaming files
-## [0.7.0] - 2012-07-02
+## v0.7.0 / 2012-07-02
* [Feature] FSNotify flags
* [Fix] inotify: Added file name back to event path
-## [0.6.0] - 2012-06-06
+## v0.6.0 / 2012-06-06
* kqueue: watch files after directory created (thanks @tmc)
-## [0.5.1] - 2012-05-22
+## v0.5.1 / 2012-05-22
* [Fix] inotify: remove all watches before Close()
-## [0.5.0] - 2012-05-03
+## v0.5.0 / 2012-05-03
* [API] kqueue: return errors during watch instead of sending over channel
* kqueue: match symlink behavior on Linux
@@ -497,22 +273,22 @@ kqueue: Fix logic for CREATE after REMOVE [#111](https://github.com/fsnotify/fsn
* [Fix] kqueue: handle EINTR (reported by @robfig)
* [Doc] Godoc example [#1][] (thanks @davecheney)
-## [0.4.0] - 2012-03-30
+## v0.4.0 / 2012-03-30
* Go 1 released: build with go tool
* [Feature] Windows support using winfsnotify
* Windows does not have attribute change notifications
* Roll attribute notifications into IsModify
-## [0.3.0] - 2012-02-19
+## v0.3.0 / 2012-02-19
* kqueue: add files when watch directory
-## [0.2.0] - 2011-12-30
+## v0.2.0 / 2011-12-30
* update to latest Go weekly code
-## [0.1.0] - 2011-10-19
+## v0.1.0 / 2011-10-19
* kqueue: add watch on file creation to match inotify
* kqueue: create file event
diff --git a/vendor/github.com/fsnotify/fsnotify/CONTRIBUTING.md b/vendor/github.com/fsnotify/fsnotify/CONTRIBUTING.md
index ea379759..828a60b2 100644
--- a/vendor/github.com/fsnotify/fsnotify/CONTRIBUTING.md
+++ b/vendor/github.com/fsnotify/fsnotify/CONTRIBUTING.md
@@ -1,26 +1,77 @@
-Thank you for your interest in contributing to fsnotify! We try to review and
-merge PRs in a reasonable timeframe, but please be aware that:
+# Contributing
-- To avoid "wasted" work, please discus changes on the issue tracker first. You
- can just send PRs, but they may end up being rejected for one reason or the
- other.
+## Issues
-- fsnotify is a cross-platform library, and changes must work reasonably well on
- all supported platforms.
+* Request features and report bugs using the [GitHub Issue Tracker](https://github.com/fsnotify/fsnotify/issues).
+* Please indicate the platform you are using fsnotify on.
+* A code example to reproduce the problem is appreciated.
-- Changes will need to be compatible; old code should still compile, and the
- runtime behaviour can't change in ways that are likely to lead to problems for
- users.
+## Pull Requests
-Testing
--------
-Just `go test ./...` runs all the tests; the CI runs this on all supported
-platforms. Testing different platforms locally can be done with something like
-[goon] or [Vagrant], but this isn't super-easy to set up at the moment.
+### Contributor License Agreement
-Use the `-short` flag to make the "stress test" run faster.
+fsnotify is derived from code in the [golang.org/x/exp](https://godoc.org/golang.org/x/exp) package and it may be included [in the standard library](https://github.com/fsnotify/fsnotify/issues/1) in the future. Therefore fsnotify carries the same [LICENSE](https://github.com/fsnotify/fsnotify/blob/master/LICENSE) as Go. Contributors retain their copyright, so you need to fill out a short form before we can accept your contribution: [Google Individual Contributor License Agreement](https://developers.google.com/open-source/cla/individual).
+Please indicate that you have signed the CLA in your pull request.
-[goon]: https://github.com/arp242/goon
-[Vagrant]: https://www.vagrantup.com/
-[integration_test.go]: /integration_test.go
+### How fsnotify is Developed
+
+* Development is done on feature branches.
+* Tests are run on BSD, Linux, macOS and Windows.
+* Pull requests are reviewed and [applied to master][am] using [hub][].
+ * Maintainers may modify or squash commits rather than asking contributors to.
+* To issue a new release, the maintainers will:
+ * Update the CHANGELOG
+ * Tag a version, which will become available through gopkg.in.
+
+### How to Fork
+
+For smooth sailing, always use the original import path. Installing with `go get` makes this easy.
+
+1. Install from GitHub (`go get -u github.com/fsnotify/fsnotify`)
+2. Create your feature branch (`git checkout -b my-new-feature`)
+3. Ensure everything works and the tests pass (see below)
+4. Commit your changes (`git commit -am 'Add some feature'`)
+
+Contribute upstream:
+
+1. Fork fsnotify on GitHub
+2. Add your remote (`git remote add fork git@github.com:mycompany/repo.git`)
+3. Push to the branch (`git push fork my-new-feature`)
+4. Create a new Pull Request on GitHub
+
+This workflow is [thoroughly explained by Katrina Owen](https://splice.com/blog/contributing-open-source-git-repositories-go/).
+
+### Testing
+
+fsnotify uses build tags to compile different code on Linux, BSD, macOS, and Windows.
+
+Before doing a pull request, please do your best to test your changes on multiple platforms, and list which platforms you were able/unable to test on.
+
+To aid in cross-platform testing there is a Vagrantfile for Linux and BSD.
+
+* Install [Vagrant](http://www.vagrantup.com/) and [VirtualBox](https://www.virtualbox.org/)
+* Setup [Vagrant Gopher](https://github.com/nathany/vagrant-gopher) in your `src` folder.
+* Run `vagrant up` from the project folder. You can also setup just one box with `vagrant up linux` or `vagrant up bsd` (note: the BSD box doesn't support Windows hosts at this time, and NFS may prompt for your host OS password)
+* Once setup, you can run the test suite on a given OS with a single command `vagrant ssh linux -c 'cd fsnotify/fsnotify; go test'`.
+* When you're done, you will want to halt or destroy the Vagrant boxes.
+
+Notice: fsnotify file system events won't trigger in shared folders. The tests get around this limitation by using the /tmp directory.
+
+Right now there is no equivalent solution for Windows and macOS, but there are Windows VMs [freely available from Microsoft](http://www.modern.ie/en-us/virtualization-tools#downloads).
+
+### Maintainers
+
+Help maintaining fsnotify is welcome. To be a maintainer:
+
+* Submit a pull request and sign the CLA as above.
+* You must be able to run the test suite on Mac, Windows, Linux and BSD.
+
+To keep master clean, the fsnotify project uses the "apply mail" workflow outlined in Nathaniel Talbott's post ["Merge pull request" Considered Harmful][am]. This requires installing [hub][].
+
+All code changes should be internal pull requests.
+
+Releases are tagged using [Semantic Versioning](http://semver.org/).
+
+[hub]: https://github.com/github/hub
+[am]: http://blog.spreedly.com/2014/06/24/merge-pull-request-considered-harmful/#.VGa5yZPF_Zs
diff --git a/vendor/github.com/fsnotify/fsnotify/LICENSE b/vendor/github.com/fsnotify/fsnotify/LICENSE
index fb03ade7..e180c8fb 100644
--- a/vendor/github.com/fsnotify/fsnotify/LICENSE
+++ b/vendor/github.com/fsnotify/fsnotify/LICENSE
@@ -1,25 +1,28 @@
-Copyright © 2012 The Go Authors. All rights reserved.
-Copyright © fsnotify Authors. All rights reserved.
+Copyright (c) 2012 The Go Authors. All rights reserved.
+Copyright (c) 2012-2019 fsnotify Authors. All rights reserved.
-Redistribution and use in source and binary forms, with or without modification,
-are permitted provided that the following conditions are met:
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
-* Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
-* Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-* Neither the name of Google Inc. nor the names of its contributors may be used
- to endorse or promote products derived from this software without specific
- prior written permission.
+ * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+ * Neither the name of Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/vendor/github.com/fsnotify/fsnotify/README.md b/vendor/github.com/fsnotify/fsnotify/README.md
index e480733d..b2629e52 100644
--- a/vendor/github.com/fsnotify/fsnotify/README.md
+++ b/vendor/github.com/fsnotify/fsnotify/README.md
@@ -1,184 +1,130 @@
-fsnotify is a Go library to provide cross-platform filesystem notifications on
-Windows, Linux, macOS, BSD, and illumos.
+# File system notifications for Go
-Go 1.17 or newer is required; the full documentation is at
-https://pkg.go.dev/github.com/fsnotify/fsnotify
+[](https://godoc.org/github.com/fsnotify/fsnotify) [](https://goreportcard.com/report/github.com/fsnotify/fsnotify)
----
+fsnotify utilizes [golang.org/x/sys](https://godoc.org/golang.org/x/sys) rather than `syscall` from the standard library. Ensure you have the latest version installed by running:
-Platform support:
+```console
+go get -u golang.org/x/sys/...
+```
-| Backend | OS | Status |
-| :-------------------- | :--------- | :------------------------------------------------------------------------ |
-| inotify | Linux | Supported |
-| kqueue | BSD, macOS | Supported |
-| ReadDirectoryChangesW | Windows | Supported |
-| FEN | illumos | Supported |
-| fanotify | Linux 5.9+ | [Not yet](https://github.com/fsnotify/fsnotify/issues/114) |
-| AHAFS | AIX | [aix branch]; experimental due to lack of maintainer and test environment |
-| FSEvents | macOS | [Needs support in x/sys/unix][fsevents] |
-| USN Journals | Windows | [Needs support in x/sys/windows][usn] |
-| Polling | *All* | [Not yet](https://github.com/fsnotify/fsnotify/issues/9) |
+Cross platform: Windows, Linux, BSD and macOS.
-Linux and illumos should include Android and Solaris, but these are currently
-untested.
+| Adapter | OS | Status |
+| --------------------- | -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- |
+| inotify | Linux 2.6.27 or later, Android\* | Supported [](https://travis-ci.org/fsnotify/fsnotify) |
+| kqueue | BSD, macOS, iOS\* | Supported [](https://travis-ci.org/fsnotify/fsnotify) |
+| ReadDirectoryChangesW | Windows | Supported [](https://travis-ci.org/fsnotify/fsnotify) |
+| FSEvents | macOS | [Planned](https://github.com/fsnotify/fsnotify/issues/11) |
+| FEN | Solaris 11 | [In Progress](https://github.com/fsnotify/fsnotify/issues/12) |
+| fanotify | Linux 2.6.37+ | [Planned](https://github.com/fsnotify/fsnotify/issues/114) |
+| USN Journals | Windows | [Maybe](https://github.com/fsnotify/fsnotify/issues/53) |
+| Polling | *All* | [Maybe](https://github.com/fsnotify/fsnotify/issues/9) |
-[fsevents]: https://github.com/fsnotify/fsnotify/issues/11#issuecomment-1279133120
-[usn]: https://github.com/fsnotify/fsnotify/issues/53#issuecomment-1279829847
-[aix branch]: https://github.com/fsnotify/fsnotify/issues/353#issuecomment-1284590129
+\* Android and iOS are untested.
-Usage
------
-A basic example:
+Please see [the documentation](https://godoc.org/github.com/fsnotify/fsnotify) and consult the [FAQ](#faq) for usage information.
+
+## API stability
+
+fsnotify is a fork of [howeyc/fsnotify](https://godoc.org/github.com/howeyc/fsnotify) with a new API as of v1.0. The API is based on [this design document](http://goo.gl/MrYxyA).
+
+All [releases](https://github.com/fsnotify/fsnotify/releases) are tagged based on [Semantic Versioning](http://semver.org/). Further API changes are [planned](https://github.com/fsnotify/fsnotify/milestones), and will be tagged with a new major revision number.
+
+Go 1.6 supports dependencies located in the `vendor/` folder. Unless you are creating a library, it is recommended that you copy fsnotify into `vendor/github.com/fsnotify/fsnotify` within your project, and likewise for `golang.org/x/sys`.
+
+## Usage
```go
package main
import (
- "log"
+ "log"
- "github.com/fsnotify/fsnotify"
+ "github.com/fsnotify/fsnotify"
)
func main() {
- // Create new watcher.
- watcher, err := fsnotify.NewWatcher()
- if err != nil {
- log.Fatal(err)
- }
- defer watcher.Close()
+ watcher, err := fsnotify.NewWatcher()
+ if err != nil {
+ log.Fatal(err)
+ }
+ defer watcher.Close()
- // Start listening for events.
- go func() {
- for {
- select {
- case event, ok := <-watcher.Events:
- if !ok {
- return
- }
- log.Println("event:", event)
- if event.Has(fsnotify.Write) {
- log.Println("modified file:", event.Name)
- }
- case err, ok := <-watcher.Errors:
- if !ok {
- return
- }
- log.Println("error:", err)
- }
- }
- }()
+ done := make(chan bool)
+ go func() {
+ for {
+ select {
+ case event, ok := <-watcher.Events:
+ if !ok {
+ return
+ }
+ log.Println("event:", event)
+ if event.Op&fsnotify.Write == fsnotify.Write {
+ log.Println("modified file:", event.Name)
+ }
+ case err, ok := <-watcher.Errors:
+ if !ok {
+ return
+ }
+ log.Println("error:", err)
+ }
+ }
+ }()
- // Add a path.
- err = watcher.Add("/tmp")
- if err != nil {
- log.Fatal(err)
- }
-
- // Block main goroutine forever.
- <-make(chan struct{})
+ err = watcher.Add("/tmp/foo")
+ if err != nil {
+ log.Fatal(err)
+ }
+ <-done
}
```
-Some more examples can be found in [cmd/fsnotify](cmd/fsnotify), which can be
-run with:
+## Contributing
- % go run ./cmd/fsnotify
+Please refer to [CONTRIBUTING][] before opening an issue or pull request.
-Further detailed documentation can be found in godoc:
-https://pkg.go.dev/github.com/fsnotify/fsnotify
+## Example
-FAQ
----
-### Will a file still be watched when it's moved to another directory?
-No, not unless you are watching the location it was moved to.
+See [example_test.go](https://github.com/fsnotify/fsnotify/blob/master/example_test.go).
-### Are subdirectories watched?
-No, you must add watches for any directory you want to watch (a recursive
-watcher is on the roadmap: [#18]).
+## FAQ
+**When a file is moved to another directory is it still being watched?**
+
+No (it shouldn't be, unless you are watching where it was moved to).
+
+**When I watch a directory, are all subdirectories watched as well?**
+
+No, you must add watches for any directory you want to watch (a recursive watcher is on the roadmap [#18][]).
+
+**Do I have to watch the Error and Event channels in a separate goroutine?**
+
+As of now, yes. Looking into making this single-thread friendly (see [howeyc #7][#7])
+
+**Why am I receiving multiple events for the same file on OS X?**
+
+Spotlight indexing on OS X can result in multiple events (see [howeyc #62][#62]). A temporary workaround is to add your folder(s) to the *Spotlight Privacy settings* until we have a native FSEvents implementation (see [#11][]).
+
+**How many files can be watched at once?**
+
+There are OS-specific limits as to how many watches can be created:
+* Linux: /proc/sys/fs/inotify/max_user_watches contains the limit, reaching this limit results in a "no space left on device" error.
+* BSD / OSX: sysctl variables "kern.maxfiles" and "kern.maxfilesperproc", reaching these limits results in a "too many open files" error.
+
+**Why don't notifications work with NFS filesystems or filesystem in userspace (FUSE)?**
+
+fsnotify requires support from underlying OS to work. The current NFS protocol does not provide network level support for file notifications.
+
+[#62]: https://github.com/howeyc/fsnotify/issues/62
[#18]: https://github.com/fsnotify/fsnotify/issues/18
-
-### Do I have to watch the Error and Event channels in a goroutine?
-Yes. You can read both channels in the same goroutine using `select` (you don't
-need a separate goroutine for both channels; see the example).
-
-### Why don't notifications work with NFS, SMB, FUSE, /proc, or /sys?
-fsnotify requires support from underlying OS to work. The current NFS and SMB
-protocols does not provide network level support for file notifications, and
-neither do the /proc and /sys virtual filesystems.
-
-This could be fixed with a polling watcher ([#9]), but it's not yet implemented.
-
-[#9]: https://github.com/fsnotify/fsnotify/issues/9
-
-### Why do I get many Chmod events?
-Some programs may generate a lot of attribute changes; for example Spotlight on
-macOS, anti-virus programs, backup applications, and some others are known to do
-this. As a rule, it's typically best to ignore Chmod events. They're often not
-useful, and tend to cause problems.
-
-Spotlight indexing on macOS can result in multiple events (see [#15]). A
-temporary workaround is to add your folder(s) to the *Spotlight Privacy
-settings* until we have a native FSEvents implementation (see [#11]).
-
[#11]: https://github.com/fsnotify/fsnotify/issues/11
-[#15]: https://github.com/fsnotify/fsnotify/issues/15
+[#7]: https://github.com/howeyc/fsnotify/issues/7
-### Watching a file doesn't work well
-Watching individual files (rather than directories) is generally not recommended
-as many programs (especially editors) update files atomically: it will write to
-a temporary file which is then moved to to destination, overwriting the original
-(or some variant thereof). The watcher on the original file is now lost, as that
-no longer exists.
+[contributing]: https://github.com/fsnotify/fsnotify/blob/master/CONTRIBUTING.md
-The upshot of this is that a power failure or crash won't leave a half-written
-file.
+## Related Projects
-Watch the parent directory and use `Event.Name` to filter out files you're not
-interested in. There is an example of this in `cmd/fsnotify/file.go`.
+* [notify](https://github.com/rjeczalik/notify)
+* [fsevents](https://github.com/fsnotify/fsevents)
-Platform-specific notes
------------------------
-### Linux
-When a file is removed a REMOVE event won't be emitted until all file
-descriptors are closed; it will emit a CHMOD instead:
-
- fp := os.Open("file")
- os.Remove("file") // CHMOD
- fp.Close() // REMOVE
-
-This is the event that inotify sends, so not much can be changed about this.
-
-The `fs.inotify.max_user_watches` sysctl variable specifies the upper limit for
-the number of watches per user, and `fs.inotify.max_user_instances` specifies
-the maximum number of inotify instances per user. Every Watcher you create is an
-"instance", and every path you add is a "watch".
-
-These are also exposed in `/proc` as `/proc/sys/fs/inotify/max_user_watches` and
-`/proc/sys/fs/inotify/max_user_instances`
-
-To increase them you can use `sysctl` or write the value to proc file:
-
- # The default values on Linux 5.18
- sysctl fs.inotify.max_user_watches=124983
- sysctl fs.inotify.max_user_instances=128
-
-To make the changes persist on reboot edit `/etc/sysctl.conf` or
-`/usr/lib/sysctl.d/50-default.conf` (details differ per Linux distro; check your
-distro's documentation):
-
- fs.inotify.max_user_watches=124983
- fs.inotify.max_user_instances=128
-
-Reaching the limit will result in a "no space left on device" or "too many open
-files" error.
-
-### kqueue (macOS, all BSD systems)
-kqueue requires opening a file descriptor for every file that's being watched;
-so if you're watching a directory with five files then that's six file
-descriptors. You will run in to your system's "max open files" limit faster on
-these platforms.
-
-The sysctl variables `kern.maxfiles` and `kern.maxfilesperproc` can be used to
-control the maximum number of open files.
diff --git a/vendor/github.com/fsnotify/fsnotify/backend_fen.go b/vendor/github.com/fsnotify/fsnotify/backend_fen.go
deleted file mode 100644
index 28497f1d..00000000
--- a/vendor/github.com/fsnotify/fsnotify/backend_fen.go
+++ /dev/null
@@ -1,640 +0,0 @@
-//go:build solaris
-// +build solaris
-
-// Note: the documentation on the Watcher type and methods is generated from
-// mkdoc.zsh
-
-package fsnotify
-
-import (
- "errors"
- "fmt"
- "os"
- "path/filepath"
- "sync"
-
- "golang.org/x/sys/unix"
-)
-
-// Watcher watches a set of paths, delivering events on a channel.
-//
-// A watcher should not be copied (e.g. pass it by pointer, rather than by
-// value).
-//
-// # Linux notes
-//
-// When a file is removed a Remove event won't be emitted until all file
-// descriptors are closed, and deletes will always emit a Chmod. For example:
-//
-// fp := os.Open("file")
-// os.Remove("file") // Triggers Chmod
-// fp.Close() // Triggers Remove
-//
-// This is the event that inotify sends, so not much can be changed about this.
-//
-// The fs.inotify.max_user_watches sysctl variable specifies the upper limit
-// for the number of watches per user, and fs.inotify.max_user_instances
-// specifies the maximum number of inotify instances per user. Every Watcher you
-// create is an "instance", and every path you add is a "watch".
-//
-// These are also exposed in /proc as /proc/sys/fs/inotify/max_user_watches and
-// /proc/sys/fs/inotify/max_user_instances
-//
-// To increase them you can use sysctl or write the value to the /proc file:
-//
-// # Default values on Linux 5.18
-// sysctl fs.inotify.max_user_watches=124983
-// sysctl fs.inotify.max_user_instances=128
-//
-// To make the changes persist on reboot edit /etc/sysctl.conf or
-// /usr/lib/sysctl.d/50-default.conf (details differ per Linux distro; check
-// your distro's documentation):
-//
-// fs.inotify.max_user_watches=124983
-// fs.inotify.max_user_instances=128
-//
-// Reaching the limit will result in a "no space left on device" or "too many open
-// files" error.
-//
-// # kqueue notes (macOS, BSD)
-//
-// kqueue requires opening a file descriptor for every file that's being watched;
-// so if you're watching a directory with five files then that's six file
-// descriptors. You will run in to your system's "max open files" limit faster on
-// these platforms.
-//
-// The sysctl variables kern.maxfiles and kern.maxfilesperproc can be used to
-// control the maximum number of open files, as well as /etc/login.conf on BSD
-// systems.
-//
-// # Windows notes
-//
-// Paths can be added as "C:\path\to\dir", but forward slashes
-// ("C:/path/to/dir") will also work.
-//
-// When a watched directory is removed it will always send an event for the
-// directory itself, but may not send events for all files in that directory.
-// Sometimes it will send events for all times, sometimes it will send no
-// events, and often only for some files.
-//
-// The default ReadDirectoryChangesW() buffer size is 64K, which is the largest
-// value that is guaranteed to work with SMB filesystems. If you have many
-// events in quick succession this may not be enough, and you will have to use
-// [WithBufferSize] to increase the value.
-type Watcher struct {
- // Events sends the filesystem change events.
- //
- // fsnotify can send the following events; a "path" here can refer to a
- // file, directory, symbolic link, or special file like a FIFO.
- //
- // fsnotify.Create A new path was created; this may be followed by one
- // or more Write events if data also gets written to a
- // file.
- //
- // fsnotify.Remove A path was removed.
- //
- // fsnotify.Rename A path was renamed. A rename is always sent with the
- // old path as Event.Name, and a Create event will be
- // sent with the new name. Renames are only sent for
- // paths that are currently watched; e.g. moving an
- // unmonitored file into a monitored directory will
- // show up as just a Create. Similarly, renaming a file
- // to outside a monitored directory will show up as
- // only a Rename.
- //
- // fsnotify.Write A file or named pipe was written to. A Truncate will
- // also trigger a Write. A single "write action"
- // initiated by the user may show up as one or multiple
- // writes, depending on when the system syncs things to
- // disk. For example when compiling a large Go program
- // you may get hundreds of Write events, and you may
- // want to wait until you've stopped receiving them
- // (see the dedup example in cmd/fsnotify).
- //
- // Some systems may send Write event for directories
- // when the directory content changes.
- //
- // fsnotify.Chmod Attributes were changed. On Linux this is also sent
- // when a file is removed (or more accurately, when a
- // link to an inode is removed). On kqueue it's sent
- // when a file is truncated. On Windows it's never
- // sent.
- Events chan Event
-
- // Errors sends any errors.
- //
- // ErrEventOverflow is used to indicate there are too many events:
- //
- // - inotify: There are too many queued events (fs.inotify.max_queued_events sysctl)
- // - windows: The buffer size is too small; WithBufferSize() can be used to increase it.
- // - kqueue, fen: Not used.
- Errors chan error
-
- mu sync.Mutex
- port *unix.EventPort
- done chan struct{} // Channel for sending a "quit message" to the reader goroutine
- dirs map[string]struct{} // Explicitly watched directories
- watches map[string]struct{} // Explicitly watched non-directories
-}
-
-// NewWatcher creates a new Watcher.
-func NewWatcher() (*Watcher, error) {
- return NewBufferedWatcher(0)
-}
-
-// NewBufferedWatcher creates a new Watcher with a buffered Watcher.Events
-// channel.
-//
-// The main use case for this is situations with a very large number of events
-// where the kernel buffer size can't be increased (e.g. due to lack of
-// permissions). An unbuffered Watcher will perform better for almost all use
-// cases, and whenever possible you will be better off increasing the kernel
-// buffers instead of adding a large userspace buffer.
-func NewBufferedWatcher(sz uint) (*Watcher, error) {
- w := &Watcher{
- Events: make(chan Event, sz),
- Errors: make(chan error),
- dirs: make(map[string]struct{}),
- watches: make(map[string]struct{}),
- done: make(chan struct{}),
- }
-
- var err error
- w.port, err = unix.NewEventPort()
- if err != nil {
- return nil, fmt.Errorf("fsnotify.NewWatcher: %w", err)
- }
-
- go w.readEvents()
- return w, nil
-}
-
-// sendEvent attempts to send an event to the user, returning true if the event
-// was put in the channel successfully and false if the watcher has been closed.
-func (w *Watcher) sendEvent(name string, op Op) (sent bool) {
- select {
- case w.Events <- Event{Name: name, Op: op}:
- return true
- case <-w.done:
- return false
- }
-}
-
-// sendError attempts to send an error to the user, returning true if the error
-// was put in the channel successfully and false if the watcher has been closed.
-func (w *Watcher) sendError(err error) (sent bool) {
- select {
- case w.Errors <- err:
- return true
- case <-w.done:
- return false
- }
-}
-
-func (w *Watcher) isClosed() bool {
- select {
- case <-w.done:
- return true
- default:
- return false
- }
-}
-
-// Close removes all watches and closes the Events channel.
-func (w *Watcher) Close() error {
- // Take the lock used by associateFile to prevent lingering events from
- // being processed after the close
- w.mu.Lock()
- defer w.mu.Unlock()
- if w.isClosed() {
- return nil
- }
- close(w.done)
- return w.port.Close()
-}
-
-// Add starts monitoring the path for changes.
-//
-// A path can only be watched once; watching it more than once is a no-op and will
-// not return an error. Paths that do not yet exist on the filesystem cannot be
-// watched.
-//
-// A watch will be automatically removed if the watched path is deleted or
-// renamed. The exception is the Windows backend, which doesn't remove the
-// watcher on renames.
-//
-// Notifications on network filesystems (NFS, SMB, FUSE, etc.) or special
-// filesystems (/proc, /sys, etc.) generally don't work.
-//
-// Returns [ErrClosed] if [Watcher.Close] was called.
-//
-// See [Watcher.AddWith] for a version that allows adding options.
-//
-// # Watching directories
-//
-// All files in a directory are monitored, including new files that are created
-// after the watcher is started. Subdirectories are not watched (i.e. it's
-// non-recursive).
-//
-// # Watching files
-//
-// Watching individual files (rather than directories) is generally not
-// recommended as many programs (especially editors) update files atomically: it
-// will write to a temporary file which is then moved to to destination,
-// overwriting the original (or some variant thereof). The watcher on the
-// original file is now lost, as that no longer exists.
-//
-// The upshot of this is that a power failure or crash won't leave a
-// half-written file.
-//
-// Watch the parent directory and use Event.Name to filter out files you're not
-// interested in. There is an example of this in cmd/fsnotify/file.go.
-func (w *Watcher) Add(name string) error { return w.AddWith(name) }
-
-// AddWith is like [Watcher.Add], but allows adding options. When using Add()
-// the defaults described below are used.
-//
-// Possible options are:
-//
-// - [WithBufferSize] sets the buffer size for the Windows backend; no-op on
-// other platforms. The default is 64K (65536 bytes).
-func (w *Watcher) AddWith(name string, opts ...addOpt) error {
- if w.isClosed() {
- return ErrClosed
- }
- if w.port.PathIsWatched(name) {
- return nil
- }
-
- _ = getOptions(opts...)
-
- // Currently we resolve symlinks that were explicitly requested to be
- // watched. Otherwise we would use LStat here.
- stat, err := os.Stat(name)
- if err != nil {
- return err
- }
-
- // Associate all files in the directory.
- if stat.IsDir() {
- err := w.handleDirectory(name, stat, true, w.associateFile)
- if err != nil {
- return err
- }
-
- w.mu.Lock()
- w.dirs[name] = struct{}{}
- w.mu.Unlock()
- return nil
- }
-
- err = w.associateFile(name, stat, true)
- if err != nil {
- return err
- }
-
- w.mu.Lock()
- w.watches[name] = struct{}{}
- w.mu.Unlock()
- return nil
-}
-
-// Remove stops monitoring the path for changes.
-//
-// Directories are always removed non-recursively. For example, if you added
-// /tmp/dir and /tmp/dir/subdir then you will need to remove both.
-//
-// Removing a path that has not yet been added returns [ErrNonExistentWatch].
-//
-// Returns nil if [Watcher.Close] was called.
-func (w *Watcher) Remove(name string) error {
- if w.isClosed() {
- return nil
- }
- if !w.port.PathIsWatched(name) {
- return fmt.Errorf("%w: %s", ErrNonExistentWatch, name)
- }
-
- // The user has expressed an intent. Immediately remove this name from
- // whichever watch list it might be in. If it's not in there the delete
- // doesn't cause harm.
- w.mu.Lock()
- delete(w.watches, name)
- delete(w.dirs, name)
- w.mu.Unlock()
-
- stat, err := os.Stat(name)
- if err != nil {
- return err
- }
-
- // Remove associations for every file in the directory.
- if stat.IsDir() {
- err := w.handleDirectory(name, stat, false, w.dissociateFile)
- if err != nil {
- return err
- }
- return nil
- }
-
- err = w.port.DissociatePath(name)
- if err != nil {
- return err
- }
-
- return nil
-}
-
-// readEvents contains the main loop that runs in a goroutine watching for events.
-func (w *Watcher) readEvents() {
- // If this function returns, the watcher has been closed and we can close
- // these channels
- defer func() {
- close(w.Errors)
- close(w.Events)
- }()
-
- pevents := make([]unix.PortEvent, 8)
- for {
- count, err := w.port.Get(pevents, 1, nil)
- if err != nil && err != unix.ETIME {
- // Interrupted system call (count should be 0) ignore and continue
- if errors.Is(err, unix.EINTR) && count == 0 {
- continue
- }
- // Get failed because we called w.Close()
- if errors.Is(err, unix.EBADF) && w.isClosed() {
- return
- }
- // There was an error not caused by calling w.Close()
- if !w.sendError(err) {
- return
- }
- }
-
- p := pevents[:count]
- for _, pevent := range p {
- if pevent.Source != unix.PORT_SOURCE_FILE {
- // Event from unexpected source received; should never happen.
- if !w.sendError(errors.New("Event from unexpected source received")) {
- return
- }
- continue
- }
-
- err = w.handleEvent(&pevent)
- if err != nil {
- if !w.sendError(err) {
- return
- }
- }
- }
- }
-}
-
-func (w *Watcher) handleDirectory(path string, stat os.FileInfo, follow bool, handler func(string, os.FileInfo, bool) error) error {
- files, err := os.ReadDir(path)
- if err != nil {
- return err
- }
-
- // Handle all children of the directory.
- for _, entry := range files {
- finfo, err := entry.Info()
- if err != nil {
- return err
- }
- err = handler(filepath.Join(path, finfo.Name()), finfo, false)
- if err != nil {
- return err
- }
- }
-
- // And finally handle the directory itself.
- return handler(path, stat, follow)
-}
-
-// handleEvent might need to emit more than one fsnotify event if the events
-// bitmap matches more than one event type (e.g. the file was both modified and
-// had the attributes changed between when the association was created and the
-// when event was returned)
-func (w *Watcher) handleEvent(event *unix.PortEvent) error {
- var (
- events = event.Events
- path = event.Path
- fmode = event.Cookie.(os.FileMode)
- reRegister = true
- )
-
- w.mu.Lock()
- _, watchedDir := w.dirs[path]
- _, watchedPath := w.watches[path]
- w.mu.Unlock()
- isWatched := watchedDir || watchedPath
-
- if events&unix.FILE_DELETE != 0 {
- if !w.sendEvent(path, Remove) {
- return nil
- }
- reRegister = false
- }
- if events&unix.FILE_RENAME_FROM != 0 {
- if !w.sendEvent(path, Rename) {
- return nil
- }
- // Don't keep watching the new file name
- reRegister = false
- }
- if events&unix.FILE_RENAME_TO != 0 {
- // We don't report a Rename event for this case, because Rename events
- // are interpreted as referring to the _old_ name of the file, and in
- // this case the event would refer to the new name of the file. This
- // type of rename event is not supported by fsnotify.
-
- // inotify reports a Remove event in this case, so we simulate this
- // here.
- if !w.sendEvent(path, Remove) {
- return nil
- }
- // Don't keep watching the file that was removed
- reRegister = false
- }
-
- // The file is gone, nothing left to do.
- if !reRegister {
- if watchedDir {
- w.mu.Lock()
- delete(w.dirs, path)
- w.mu.Unlock()
- }
- if watchedPath {
- w.mu.Lock()
- delete(w.watches, path)
- w.mu.Unlock()
- }
- return nil
- }
-
- // If we didn't get a deletion the file still exists and we're going to have
- // to watch it again. Let's Stat it now so that we can compare permissions
- // and have what we need to continue watching the file
-
- stat, err := os.Lstat(path)
- if err != nil {
- // This is unexpected, but we should still emit an event. This happens
- // most often on "rm -r" of a subdirectory inside a watched directory We
- // get a modify event of something happening inside, but by the time we
- // get here, the sudirectory is already gone. Clearly we were watching
- // this path but now it is gone. Let's tell the user that it was
- // removed.
- if !w.sendEvent(path, Remove) {
- return nil
- }
- // Suppress extra write events on removed directories; they are not
- // informative and can be confusing.
- return nil
- }
-
- // resolve symlinks that were explicitly watched as we would have at Add()
- // time. this helps suppress spurious Chmod events on watched symlinks
- if isWatched {
- stat, err = os.Stat(path)
- if err != nil {
- // The symlink still exists, but the target is gone. Report the
- // Remove similar to above.
- if !w.sendEvent(path, Remove) {
- return nil
- }
- // Don't return the error
- }
- }
-
- if events&unix.FILE_MODIFIED != 0 {
- if fmode.IsDir() {
- if watchedDir {
- if err := w.updateDirectory(path); err != nil {
- return err
- }
- } else {
- if !w.sendEvent(path, Write) {
- return nil
- }
- }
- } else {
- if !w.sendEvent(path, Write) {
- return nil
- }
- }
- }
- if events&unix.FILE_ATTRIB != 0 && stat != nil {
- // Only send Chmod if perms changed
- if stat.Mode().Perm() != fmode.Perm() {
- if !w.sendEvent(path, Chmod) {
- return nil
- }
- }
- }
-
- if stat != nil {
- // If we get here, it means we've hit an event above that requires us to
- // continue watching the file or directory
- return w.associateFile(path, stat, isWatched)
- }
- return nil
-}
-
-func (w *Watcher) updateDirectory(path string) error {
- // The directory was modified, so we must find unwatched entities and watch
- // them. If something was removed from the directory, nothing will happen,
- // as everything else should still be watched.
- files, err := os.ReadDir(path)
- if err != nil {
- return err
- }
-
- for _, entry := range files {
- path := filepath.Join(path, entry.Name())
- if w.port.PathIsWatched(path) {
- continue
- }
-
- finfo, err := entry.Info()
- if err != nil {
- return err
- }
- err = w.associateFile(path, finfo, false)
- if err != nil {
- if !w.sendError(err) {
- return nil
- }
- }
- if !w.sendEvent(path, Create) {
- return nil
- }
- }
- return nil
-}
-
-func (w *Watcher) associateFile(path string, stat os.FileInfo, follow bool) error {
- if w.isClosed() {
- return ErrClosed
- }
- // This is primarily protecting the call to AssociatePath but it is
- // important and intentional that the call to PathIsWatched is also
- // protected by this mutex. Without this mutex, AssociatePath has been seen
- // to error out that the path is already associated.
- w.mu.Lock()
- defer w.mu.Unlock()
-
- if w.port.PathIsWatched(path) {
- // Remove the old association in favor of this one If we get ENOENT,
- // then while the x/sys/unix wrapper still thought that this path was
- // associated, the underlying event port did not. This call will have
- // cleared up that discrepancy. The most likely cause is that the event
- // has fired but we haven't processed it yet.
- err := w.port.DissociatePath(path)
- if err != nil && err != unix.ENOENT {
- return err
- }
- }
- // FILE_NOFOLLOW means we watch symlinks themselves rather than their
- // targets.
- events := unix.FILE_MODIFIED | unix.FILE_ATTRIB | unix.FILE_NOFOLLOW
- if follow {
- // We *DO* follow symlinks for explicitly watched entries.
- events = unix.FILE_MODIFIED | unix.FILE_ATTRIB
- }
- return w.port.AssociatePath(path, stat,
- events,
- stat.Mode())
-}
-
-func (w *Watcher) dissociateFile(path string, stat os.FileInfo, unused bool) error {
- if !w.port.PathIsWatched(path) {
- return nil
- }
- return w.port.DissociatePath(path)
-}
-
-// WatchList returns all paths explicitly added with [Watcher.Add] (and are not
-// yet removed).
-//
-// Returns nil if [Watcher.Close] was called.
-func (w *Watcher) WatchList() []string {
- if w.isClosed() {
- return nil
- }
-
- w.mu.Lock()
- defer w.mu.Unlock()
-
- entries := make([]string, 0, len(w.watches)+len(w.dirs))
- for pathname := range w.dirs {
- entries = append(entries, pathname)
- }
- for pathname := range w.watches {
- entries = append(entries, pathname)
- }
-
- return entries
-}
diff --git a/vendor/github.com/fsnotify/fsnotify/backend_inotify.go b/vendor/github.com/fsnotify/fsnotify/backend_inotify.go
deleted file mode 100644
index 921c1c1e..00000000
--- a/vendor/github.com/fsnotify/fsnotify/backend_inotify.go
+++ /dev/null
@@ -1,594 +0,0 @@
-//go:build linux && !appengine
-// +build linux,!appengine
-
-// Note: the documentation on the Watcher type and methods is generated from
-// mkdoc.zsh
-
-package fsnotify
-
-import (
- "errors"
- "fmt"
- "io"
- "os"
- "path/filepath"
- "strings"
- "sync"
- "unsafe"
-
- "golang.org/x/sys/unix"
-)
-
-// Watcher watches a set of paths, delivering events on a channel.
-//
-// A watcher should not be copied (e.g. pass it by pointer, rather than by
-// value).
-//
-// # Linux notes
-//
-// When a file is removed a Remove event won't be emitted until all file
-// descriptors are closed, and deletes will always emit a Chmod. For example:
-//
-// fp := os.Open("file")
-// os.Remove("file") // Triggers Chmod
-// fp.Close() // Triggers Remove
-//
-// This is the event that inotify sends, so not much can be changed about this.
-//
-// The fs.inotify.max_user_watches sysctl variable specifies the upper limit
-// for the number of watches per user, and fs.inotify.max_user_instances
-// specifies the maximum number of inotify instances per user. Every Watcher you
-// create is an "instance", and every path you add is a "watch".
-//
-// These are also exposed in /proc as /proc/sys/fs/inotify/max_user_watches and
-// /proc/sys/fs/inotify/max_user_instances
-//
-// To increase them you can use sysctl or write the value to the /proc file:
-//
-// # Default values on Linux 5.18
-// sysctl fs.inotify.max_user_watches=124983
-// sysctl fs.inotify.max_user_instances=128
-//
-// To make the changes persist on reboot edit /etc/sysctl.conf or
-// /usr/lib/sysctl.d/50-default.conf (details differ per Linux distro; check
-// your distro's documentation):
-//
-// fs.inotify.max_user_watches=124983
-// fs.inotify.max_user_instances=128
-//
-// Reaching the limit will result in a "no space left on device" or "too many open
-// files" error.
-//
-// # kqueue notes (macOS, BSD)
-//
-// kqueue requires opening a file descriptor for every file that's being watched;
-// so if you're watching a directory with five files then that's six file
-// descriptors. You will run in to your system's "max open files" limit faster on
-// these platforms.
-//
-// The sysctl variables kern.maxfiles and kern.maxfilesperproc can be used to
-// control the maximum number of open files, as well as /etc/login.conf on BSD
-// systems.
-//
-// # Windows notes
-//
-// Paths can be added as "C:\path\to\dir", but forward slashes
-// ("C:/path/to/dir") will also work.
-//
-// When a watched directory is removed it will always send an event for the
-// directory itself, but may not send events for all files in that directory.
-// Sometimes it will send events for all times, sometimes it will send no
-// events, and often only for some files.
-//
-// The default ReadDirectoryChangesW() buffer size is 64K, which is the largest
-// value that is guaranteed to work with SMB filesystems. If you have many
-// events in quick succession this may not be enough, and you will have to use
-// [WithBufferSize] to increase the value.
-type Watcher struct {
- // Events sends the filesystem change events.
- //
- // fsnotify can send the following events; a "path" here can refer to a
- // file, directory, symbolic link, or special file like a FIFO.
- //
- // fsnotify.Create A new path was created; this may be followed by one
- // or more Write events if data also gets written to a
- // file.
- //
- // fsnotify.Remove A path was removed.
- //
- // fsnotify.Rename A path was renamed. A rename is always sent with the
- // old path as Event.Name, and a Create event will be
- // sent with the new name. Renames are only sent for
- // paths that are currently watched; e.g. moving an
- // unmonitored file into a monitored directory will
- // show up as just a Create. Similarly, renaming a file
- // to outside a monitored directory will show up as
- // only a Rename.
- //
- // fsnotify.Write A file or named pipe was written to. A Truncate will
- // also trigger a Write. A single "write action"
- // initiated by the user may show up as one or multiple
- // writes, depending on when the system syncs things to
- // disk. For example when compiling a large Go program
- // you may get hundreds of Write events, and you may
- // want to wait until you've stopped receiving them
- // (see the dedup example in cmd/fsnotify).
- //
- // Some systems may send Write event for directories
- // when the directory content changes.
- //
- // fsnotify.Chmod Attributes were changed. On Linux this is also sent
- // when a file is removed (or more accurately, when a
- // link to an inode is removed). On kqueue it's sent
- // when a file is truncated. On Windows it's never
- // sent.
- Events chan Event
-
- // Errors sends any errors.
- //
- // ErrEventOverflow is used to indicate there are too many events:
- //
- // - inotify: There are too many queued events (fs.inotify.max_queued_events sysctl)
- // - windows: The buffer size is too small; WithBufferSize() can be used to increase it.
- // - kqueue, fen: Not used.
- Errors chan error
-
- // Store fd here as os.File.Read() will no longer return on close after
- // calling Fd(). See: https://github.com/golang/go/issues/26439
- fd int
- inotifyFile *os.File
- watches *watches
- done chan struct{} // Channel for sending a "quit message" to the reader goroutine
- closeMu sync.Mutex
- doneResp chan struct{} // Channel to respond to Close
-}
-
-type (
- watches struct {
- mu sync.RWMutex
- wd map[uint32]*watch // wd → watch
- path map[string]uint32 // pathname → wd
- }
- watch struct {
- wd uint32 // Watch descriptor (as returned by the inotify_add_watch() syscall)
- flags uint32 // inotify flags of this watch (see inotify(7) for the list of valid flags)
- path string // Watch path.
- }
-)
-
-func newWatches() *watches {
- return &watches{
- wd: make(map[uint32]*watch),
- path: make(map[string]uint32),
- }
-}
-
-func (w *watches) len() int {
- w.mu.RLock()
- defer w.mu.RUnlock()
- return len(w.wd)
-}
-
-func (w *watches) add(ww *watch) {
- w.mu.Lock()
- defer w.mu.Unlock()
- w.wd[ww.wd] = ww
- w.path[ww.path] = ww.wd
-}
-
-func (w *watches) remove(wd uint32) {
- w.mu.Lock()
- defer w.mu.Unlock()
- delete(w.path, w.wd[wd].path)
- delete(w.wd, wd)
-}
-
-func (w *watches) removePath(path string) (uint32, bool) {
- w.mu.Lock()
- defer w.mu.Unlock()
-
- wd, ok := w.path[path]
- if !ok {
- return 0, false
- }
-
- delete(w.path, path)
- delete(w.wd, wd)
-
- return wd, true
-}
-
-func (w *watches) byPath(path string) *watch {
- w.mu.RLock()
- defer w.mu.RUnlock()
- return w.wd[w.path[path]]
-}
-
-func (w *watches) byWd(wd uint32) *watch {
- w.mu.RLock()
- defer w.mu.RUnlock()
- return w.wd[wd]
-}
-
-func (w *watches) updatePath(path string, f func(*watch) (*watch, error)) error {
- w.mu.Lock()
- defer w.mu.Unlock()
-
- var existing *watch
- wd, ok := w.path[path]
- if ok {
- existing = w.wd[wd]
- }
-
- upd, err := f(existing)
- if err != nil {
- return err
- }
- if upd != nil {
- w.wd[upd.wd] = upd
- w.path[upd.path] = upd.wd
-
- if upd.wd != wd {
- delete(w.wd, wd)
- }
- }
-
- return nil
-}
-
-// NewWatcher creates a new Watcher.
-func NewWatcher() (*Watcher, error) {
- return NewBufferedWatcher(0)
-}
-
-// NewBufferedWatcher creates a new Watcher with a buffered Watcher.Events
-// channel.
-//
-// The main use case for this is situations with a very large number of events
-// where the kernel buffer size can't be increased (e.g. due to lack of
-// permissions). An unbuffered Watcher will perform better for almost all use
-// cases, and whenever possible you will be better off increasing the kernel
-// buffers instead of adding a large userspace buffer.
-func NewBufferedWatcher(sz uint) (*Watcher, error) {
- // Need to set nonblocking mode for SetDeadline to work, otherwise blocking
- // I/O operations won't terminate on close.
- fd, errno := unix.InotifyInit1(unix.IN_CLOEXEC | unix.IN_NONBLOCK)
- if fd == -1 {
- return nil, errno
- }
-
- w := &Watcher{
- fd: fd,
- inotifyFile: os.NewFile(uintptr(fd), ""),
- watches: newWatches(),
- Events: make(chan Event, sz),
- Errors: make(chan error),
- done: make(chan struct{}),
- doneResp: make(chan struct{}),
- }
-
- go w.readEvents()
- return w, nil
-}
-
-// Returns true if the event was sent, or false if watcher is closed.
-func (w *Watcher) sendEvent(e Event) bool {
- select {
- case w.Events <- e:
- return true
- case <-w.done:
- return false
- }
-}
-
-// Returns true if the error was sent, or false if watcher is closed.
-func (w *Watcher) sendError(err error) bool {
- select {
- case w.Errors <- err:
- return true
- case <-w.done:
- return false
- }
-}
-
-func (w *Watcher) isClosed() bool {
- select {
- case <-w.done:
- return true
- default:
- return false
- }
-}
-
-// Close removes all watches and closes the Events channel.
-func (w *Watcher) Close() error {
- w.closeMu.Lock()
- if w.isClosed() {
- w.closeMu.Unlock()
- return nil
- }
- close(w.done)
- w.closeMu.Unlock()
-
- // Causes any blocking reads to return with an error, provided the file
- // still supports deadline operations.
- err := w.inotifyFile.Close()
- if err != nil {
- return err
- }
-
- // Wait for goroutine to close
- <-w.doneResp
-
- return nil
-}
-
-// Add starts monitoring the path for changes.
-//
-// A path can only be watched once; watching it more than once is a no-op and will
-// not return an error. Paths that do not yet exist on the filesystem cannot be
-// watched.
-//
-// A watch will be automatically removed if the watched path is deleted or
-// renamed. The exception is the Windows backend, which doesn't remove the
-// watcher on renames.
-//
-// Notifications on network filesystems (NFS, SMB, FUSE, etc.) or special
-// filesystems (/proc, /sys, etc.) generally don't work.
-//
-// Returns [ErrClosed] if [Watcher.Close] was called.
-//
-// See [Watcher.AddWith] for a version that allows adding options.
-//
-// # Watching directories
-//
-// All files in a directory are monitored, including new files that are created
-// after the watcher is started. Subdirectories are not watched (i.e. it's
-// non-recursive).
-//
-// # Watching files
-//
-// Watching individual files (rather than directories) is generally not
-// recommended as many programs (especially editors) update files atomically: it
-// will write to a temporary file which is then moved to to destination,
-// overwriting the original (or some variant thereof). The watcher on the
-// original file is now lost, as that no longer exists.
-//
-// The upshot of this is that a power failure or crash won't leave a
-// half-written file.
-//
-// Watch the parent directory and use Event.Name to filter out files you're not
-// interested in. There is an example of this in cmd/fsnotify/file.go.
-func (w *Watcher) Add(name string) error { return w.AddWith(name) }
-
-// AddWith is like [Watcher.Add], but allows adding options. When using Add()
-// the defaults described below are used.
-//
-// Possible options are:
-//
-// - [WithBufferSize] sets the buffer size for the Windows backend; no-op on
-// other platforms. The default is 64K (65536 bytes).
-func (w *Watcher) AddWith(name string, opts ...addOpt) error {
- if w.isClosed() {
- return ErrClosed
- }
-
- name = filepath.Clean(name)
- _ = getOptions(opts...)
-
- var flags uint32 = unix.IN_MOVED_TO | unix.IN_MOVED_FROM |
- unix.IN_CREATE | unix.IN_ATTRIB | unix.IN_MODIFY |
- unix.IN_MOVE_SELF | unix.IN_DELETE | unix.IN_DELETE_SELF
-
- return w.watches.updatePath(name, func(existing *watch) (*watch, error) {
- if existing != nil {
- flags |= existing.flags | unix.IN_MASK_ADD
- }
-
- wd, err := unix.InotifyAddWatch(w.fd, name, flags)
- if wd == -1 {
- return nil, err
- }
-
- if existing == nil {
- return &watch{
- wd: uint32(wd),
- path: name,
- flags: flags,
- }, nil
- }
-
- existing.wd = uint32(wd)
- existing.flags = flags
- return existing, nil
- })
-}
-
-// Remove stops monitoring the path for changes.
-//
-// Directories are always removed non-recursively. For example, if you added
-// /tmp/dir and /tmp/dir/subdir then you will need to remove both.
-//
-// Removing a path that has not yet been added returns [ErrNonExistentWatch].
-//
-// Returns nil if [Watcher.Close] was called.
-func (w *Watcher) Remove(name string) error {
- if w.isClosed() {
- return nil
- }
- return w.remove(filepath.Clean(name))
-}
-
-func (w *Watcher) remove(name string) error {
- wd, ok := w.watches.removePath(name)
- if !ok {
- return fmt.Errorf("%w: %s", ErrNonExistentWatch, name)
- }
-
- success, errno := unix.InotifyRmWatch(w.fd, wd)
- if success == -1 {
- // TODO: Perhaps it's not helpful to return an error here in every case;
- // The only two possible errors are:
- //
- // - EBADF, which happens when w.fd is not a valid file descriptor
- // of any kind.
- // - EINVAL, which is when fd is not an inotify descriptor or wd
- // is not a valid watch descriptor. Watch descriptors are
- // invalidated when they are removed explicitly or implicitly;
- // explicitly by inotify_rm_watch, implicitly when the file they
- // are watching is deleted.
- return errno
- }
- return nil
-}
-
-// WatchList returns all paths explicitly added with [Watcher.Add] (and are not
-// yet removed).
-//
-// Returns nil if [Watcher.Close] was called.
-func (w *Watcher) WatchList() []string {
- if w.isClosed() {
- return nil
- }
-
- entries := make([]string, 0, w.watches.len())
- w.watches.mu.RLock()
- for pathname := range w.watches.path {
- entries = append(entries, pathname)
- }
- w.watches.mu.RUnlock()
-
- return entries
-}
-
-// readEvents reads from the inotify file descriptor, converts the
-// received events into Event objects and sends them via the Events channel
-func (w *Watcher) readEvents() {
- defer func() {
- close(w.doneResp)
- close(w.Errors)
- close(w.Events)
- }()
-
- var (
- buf [unix.SizeofInotifyEvent * 4096]byte // Buffer for a maximum of 4096 raw events
- errno error // Syscall errno
- )
- for {
- // See if we have been closed.
- if w.isClosed() {
- return
- }
-
- n, err := w.inotifyFile.Read(buf[:])
- switch {
- case errors.Unwrap(err) == os.ErrClosed:
- return
- case err != nil:
- if !w.sendError(err) {
- return
- }
- continue
- }
-
- if n < unix.SizeofInotifyEvent {
- var err error
- if n == 0 {
- err = io.EOF // If EOF is received. This should really never happen.
- } else if n < 0 {
- err = errno // If an error occurred while reading.
- } else {
- err = errors.New("notify: short read in readEvents()") // Read was too short.
- }
- if !w.sendError(err) {
- return
- }
- continue
- }
-
- var offset uint32
- // We don't know how many events we just read into the buffer
- // While the offset points to at least one whole event...
- for offset <= uint32(n-unix.SizeofInotifyEvent) {
- var (
- // Point "raw" to the event in the buffer
- raw = (*unix.InotifyEvent)(unsafe.Pointer(&buf[offset]))
- mask = uint32(raw.Mask)
- nameLen = uint32(raw.Len)
- )
-
- if mask&unix.IN_Q_OVERFLOW != 0 {
- if !w.sendError(ErrEventOverflow) {
- return
- }
- }
-
- // If the event happened to the watched directory or the watched file, the kernel
- // doesn't append the filename to the event, but we would like to always fill the
- // the "Name" field with a valid filename. We retrieve the path of the watch from
- // the "paths" map.
- watch := w.watches.byWd(uint32(raw.Wd))
-
- // inotify will automatically remove the watch on deletes; just need
- // to clean our state here.
- if watch != nil && mask&unix.IN_DELETE_SELF == unix.IN_DELETE_SELF {
- w.watches.remove(watch.wd)
- }
- // We can't really update the state when a watched path is moved;
- // only IN_MOVE_SELF is sent and not IN_MOVED_{FROM,TO}. So remove
- // the watch.
- if watch != nil && mask&unix.IN_MOVE_SELF == unix.IN_MOVE_SELF {
- err := w.remove(watch.path)
- if err != nil && !errors.Is(err, ErrNonExistentWatch) {
- if !w.sendError(err) {
- return
- }
- }
- }
-
- var name string
- if watch != nil {
- name = watch.path
- }
- if nameLen > 0 {
- // Point "bytes" at the first byte of the filename
- bytes := (*[unix.PathMax]byte)(unsafe.Pointer(&buf[offset+unix.SizeofInotifyEvent]))[:nameLen:nameLen]
- // The filename is padded with NULL bytes. TrimRight() gets rid of those.
- name += "/" + strings.TrimRight(string(bytes[0:nameLen]), "\000")
- }
-
- event := w.newEvent(name, mask)
-
- // Send the events that are not ignored on the events channel
- if mask&unix.IN_IGNORED == 0 {
- if !w.sendEvent(event) {
- return
- }
- }
-
- // Move to the next event in the buffer
- offset += unix.SizeofInotifyEvent + nameLen
- }
- }
-}
-
-// newEvent returns an platform-independent Event based on an inotify mask.
-func (w *Watcher) newEvent(name string, mask uint32) Event {
- e := Event{Name: name}
- if mask&unix.IN_CREATE == unix.IN_CREATE || mask&unix.IN_MOVED_TO == unix.IN_MOVED_TO {
- e.Op |= Create
- }
- if mask&unix.IN_DELETE_SELF == unix.IN_DELETE_SELF || mask&unix.IN_DELETE == unix.IN_DELETE {
- e.Op |= Remove
- }
- if mask&unix.IN_MODIFY == unix.IN_MODIFY {
- e.Op |= Write
- }
- if mask&unix.IN_MOVE_SELF == unix.IN_MOVE_SELF || mask&unix.IN_MOVED_FROM == unix.IN_MOVED_FROM {
- e.Op |= Rename
- }
- if mask&unix.IN_ATTRIB == unix.IN_ATTRIB {
- e.Op |= Chmod
- }
- return e
-}
diff --git a/vendor/github.com/fsnotify/fsnotify/backend_kqueue.go b/vendor/github.com/fsnotify/fsnotify/backend_kqueue.go
deleted file mode 100644
index 063a0915..00000000
--- a/vendor/github.com/fsnotify/fsnotify/backend_kqueue.go
+++ /dev/null
@@ -1,782 +0,0 @@
-//go:build freebsd || openbsd || netbsd || dragonfly || darwin
-// +build freebsd openbsd netbsd dragonfly darwin
-
-// Note: the documentation on the Watcher type and methods is generated from
-// mkdoc.zsh
-
-package fsnotify
-
-import (
- "errors"
- "fmt"
- "os"
- "path/filepath"
- "sync"
-
- "golang.org/x/sys/unix"
-)
-
-// Watcher watches a set of paths, delivering events on a channel.
-//
-// A watcher should not be copied (e.g. pass it by pointer, rather than by
-// value).
-//
-// # Linux notes
-//
-// When a file is removed a Remove event won't be emitted until all file
-// descriptors are closed, and deletes will always emit a Chmod. For example:
-//
-// fp := os.Open("file")
-// os.Remove("file") // Triggers Chmod
-// fp.Close() // Triggers Remove
-//
-// This is the event that inotify sends, so not much can be changed about this.
-//
-// The fs.inotify.max_user_watches sysctl variable specifies the upper limit
-// for the number of watches per user, and fs.inotify.max_user_instances
-// specifies the maximum number of inotify instances per user. Every Watcher you
-// create is an "instance", and every path you add is a "watch".
-//
-// These are also exposed in /proc as /proc/sys/fs/inotify/max_user_watches and
-// /proc/sys/fs/inotify/max_user_instances
-//
-// To increase them you can use sysctl or write the value to the /proc file:
-//
-// # Default values on Linux 5.18
-// sysctl fs.inotify.max_user_watches=124983
-// sysctl fs.inotify.max_user_instances=128
-//
-// To make the changes persist on reboot edit /etc/sysctl.conf or
-// /usr/lib/sysctl.d/50-default.conf (details differ per Linux distro; check
-// your distro's documentation):
-//
-// fs.inotify.max_user_watches=124983
-// fs.inotify.max_user_instances=128
-//
-// Reaching the limit will result in a "no space left on device" or "too many open
-// files" error.
-//
-// # kqueue notes (macOS, BSD)
-//
-// kqueue requires opening a file descriptor for every file that's being watched;
-// so if you're watching a directory with five files then that's six file
-// descriptors. You will run in to your system's "max open files" limit faster on
-// these platforms.
-//
-// The sysctl variables kern.maxfiles and kern.maxfilesperproc can be used to
-// control the maximum number of open files, as well as /etc/login.conf on BSD
-// systems.
-//
-// # Windows notes
-//
-// Paths can be added as "C:\path\to\dir", but forward slashes
-// ("C:/path/to/dir") will also work.
-//
-// When a watched directory is removed it will always send an event for the
-// directory itself, but may not send events for all files in that directory.
-// Sometimes it will send events for all times, sometimes it will send no
-// events, and often only for some files.
-//
-// The default ReadDirectoryChangesW() buffer size is 64K, which is the largest
-// value that is guaranteed to work with SMB filesystems. If you have many
-// events in quick succession this may not be enough, and you will have to use
-// [WithBufferSize] to increase the value.
-type Watcher struct {
- // Events sends the filesystem change events.
- //
- // fsnotify can send the following events; a "path" here can refer to a
- // file, directory, symbolic link, or special file like a FIFO.
- //
- // fsnotify.Create A new path was created; this may be followed by one
- // or more Write events if data also gets written to a
- // file.
- //
- // fsnotify.Remove A path was removed.
- //
- // fsnotify.Rename A path was renamed. A rename is always sent with the
- // old path as Event.Name, and a Create event will be
- // sent with the new name. Renames are only sent for
- // paths that are currently watched; e.g. moving an
- // unmonitored file into a monitored directory will
- // show up as just a Create. Similarly, renaming a file
- // to outside a monitored directory will show up as
- // only a Rename.
- //
- // fsnotify.Write A file or named pipe was written to. A Truncate will
- // also trigger a Write. A single "write action"
- // initiated by the user may show up as one or multiple
- // writes, depending on when the system syncs things to
- // disk. For example when compiling a large Go program
- // you may get hundreds of Write events, and you may
- // want to wait until you've stopped receiving them
- // (see the dedup example in cmd/fsnotify).
- //
- // Some systems may send Write event for directories
- // when the directory content changes.
- //
- // fsnotify.Chmod Attributes were changed. On Linux this is also sent
- // when a file is removed (or more accurately, when a
- // link to an inode is removed). On kqueue it's sent
- // when a file is truncated. On Windows it's never
- // sent.
- Events chan Event
-
- // Errors sends any errors.
- //
- // ErrEventOverflow is used to indicate there are too many events:
- //
- // - inotify: There are too many queued events (fs.inotify.max_queued_events sysctl)
- // - windows: The buffer size is too small; WithBufferSize() can be used to increase it.
- // - kqueue, fen: Not used.
- Errors chan error
-
- done chan struct{}
- kq int // File descriptor (as returned by the kqueue() syscall).
- closepipe [2]int // Pipe used for closing.
- mu sync.Mutex // Protects access to watcher data
- watches map[string]int // Watched file descriptors (key: path).
- watchesByDir map[string]map[int]struct{} // Watched file descriptors indexed by the parent directory (key: dirname(path)).
- userWatches map[string]struct{} // Watches added with Watcher.Add()
- dirFlags map[string]uint32 // Watched directories to fflags used in kqueue.
- paths map[int]pathInfo // File descriptors to path names for processing kqueue events.
- fileExists map[string]struct{} // Keep track of if we know this file exists (to stop duplicate create events).
- isClosed bool // Set to true when Close() is first called
-}
-
-type pathInfo struct {
- name string
- isDir bool
-}
-
-// NewWatcher creates a new Watcher.
-func NewWatcher() (*Watcher, error) {
- return NewBufferedWatcher(0)
-}
-
-// NewBufferedWatcher creates a new Watcher with a buffered Watcher.Events
-// channel.
-//
-// The main use case for this is situations with a very large number of events
-// where the kernel buffer size can't be increased (e.g. due to lack of
-// permissions). An unbuffered Watcher will perform better for almost all use
-// cases, and whenever possible you will be better off increasing the kernel
-// buffers instead of adding a large userspace buffer.
-func NewBufferedWatcher(sz uint) (*Watcher, error) {
- kq, closepipe, err := newKqueue()
- if err != nil {
- return nil, err
- }
-
- w := &Watcher{
- kq: kq,
- closepipe: closepipe,
- watches: make(map[string]int),
- watchesByDir: make(map[string]map[int]struct{}),
- dirFlags: make(map[string]uint32),
- paths: make(map[int]pathInfo),
- fileExists: make(map[string]struct{}),
- userWatches: make(map[string]struct{}),
- Events: make(chan Event, sz),
- Errors: make(chan error),
- done: make(chan struct{}),
- }
-
- go w.readEvents()
- return w, nil
-}
-
-// newKqueue creates a new kernel event queue and returns a descriptor.
-//
-// This registers a new event on closepipe, which will trigger an event when
-// it's closed. This way we can use kevent() without timeout/polling; without
-// the closepipe, it would block forever and we wouldn't be able to stop it at
-// all.
-func newKqueue() (kq int, closepipe [2]int, err error) {
- kq, err = unix.Kqueue()
- if kq == -1 {
- return kq, closepipe, err
- }
-
- // Register the close pipe.
- err = unix.Pipe(closepipe[:])
- if err != nil {
- unix.Close(kq)
- return kq, closepipe, err
- }
-
- // Register changes to listen on the closepipe.
- changes := make([]unix.Kevent_t, 1)
- // SetKevent converts int to the platform-specific types.
- unix.SetKevent(&changes[0], closepipe[0], unix.EVFILT_READ,
- unix.EV_ADD|unix.EV_ENABLE|unix.EV_ONESHOT)
-
- ok, err := unix.Kevent(kq, changes, nil, nil)
- if ok == -1 {
- unix.Close(kq)
- unix.Close(closepipe[0])
- unix.Close(closepipe[1])
- return kq, closepipe, err
- }
- return kq, closepipe, nil
-}
-
-// Returns true if the event was sent, or false if watcher is closed.
-func (w *Watcher) sendEvent(e Event) bool {
- select {
- case w.Events <- e:
- return true
- case <-w.done:
- return false
- }
-}
-
-// Returns true if the error was sent, or false if watcher is closed.
-func (w *Watcher) sendError(err error) bool {
- select {
- case w.Errors <- err:
- return true
- case <-w.done:
- return false
- }
-}
-
-// Close removes all watches and closes the Events channel.
-func (w *Watcher) Close() error {
- w.mu.Lock()
- if w.isClosed {
- w.mu.Unlock()
- return nil
- }
- w.isClosed = true
-
- // copy paths to remove while locked
- pathsToRemove := make([]string, 0, len(w.watches))
- for name := range w.watches {
- pathsToRemove = append(pathsToRemove, name)
- }
- w.mu.Unlock() // Unlock before calling Remove, which also locks
- for _, name := range pathsToRemove {
- w.Remove(name)
- }
-
- // Send "quit" message to the reader goroutine.
- unix.Close(w.closepipe[1])
- close(w.done)
-
- return nil
-}
-
-// Add starts monitoring the path for changes.
-//
-// A path can only be watched once; watching it more than once is a no-op and will
-// not return an error. Paths that do not yet exist on the filesystem cannot be
-// watched.
-//
-// A watch will be automatically removed if the watched path is deleted or
-// renamed. The exception is the Windows backend, which doesn't remove the
-// watcher on renames.
-//
-// Notifications on network filesystems (NFS, SMB, FUSE, etc.) or special
-// filesystems (/proc, /sys, etc.) generally don't work.
-//
-// Returns [ErrClosed] if [Watcher.Close] was called.
-//
-// See [Watcher.AddWith] for a version that allows adding options.
-//
-// # Watching directories
-//
-// All files in a directory are monitored, including new files that are created
-// after the watcher is started. Subdirectories are not watched (i.e. it's
-// non-recursive).
-//
-// # Watching files
-//
-// Watching individual files (rather than directories) is generally not
-// recommended as many programs (especially editors) update files atomically: it
-// will write to a temporary file which is then moved to to destination,
-// overwriting the original (or some variant thereof). The watcher on the
-// original file is now lost, as that no longer exists.
-//
-// The upshot of this is that a power failure or crash won't leave a
-// half-written file.
-//
-// Watch the parent directory and use Event.Name to filter out files you're not
-// interested in. There is an example of this in cmd/fsnotify/file.go.
-func (w *Watcher) Add(name string) error { return w.AddWith(name) }
-
-// AddWith is like [Watcher.Add], but allows adding options. When using Add()
-// the defaults described below are used.
-//
-// Possible options are:
-//
-// - [WithBufferSize] sets the buffer size for the Windows backend; no-op on
-// other platforms. The default is 64K (65536 bytes).
-func (w *Watcher) AddWith(name string, opts ...addOpt) error {
- _ = getOptions(opts...)
-
- w.mu.Lock()
- w.userWatches[name] = struct{}{}
- w.mu.Unlock()
- _, err := w.addWatch(name, noteAllEvents)
- return err
-}
-
-// Remove stops monitoring the path for changes.
-//
-// Directories are always removed non-recursively. For example, if you added
-// /tmp/dir and /tmp/dir/subdir then you will need to remove both.
-//
-// Removing a path that has not yet been added returns [ErrNonExistentWatch].
-//
-// Returns nil if [Watcher.Close] was called.
-func (w *Watcher) Remove(name string) error {
- return w.remove(name, true)
-}
-
-func (w *Watcher) remove(name string, unwatchFiles bool) error {
- name = filepath.Clean(name)
- w.mu.Lock()
- if w.isClosed {
- w.mu.Unlock()
- return nil
- }
- watchfd, ok := w.watches[name]
- w.mu.Unlock()
- if !ok {
- return fmt.Errorf("%w: %s", ErrNonExistentWatch, name)
- }
-
- err := w.register([]int{watchfd}, unix.EV_DELETE, 0)
- if err != nil {
- return err
- }
-
- unix.Close(watchfd)
-
- w.mu.Lock()
- isDir := w.paths[watchfd].isDir
- delete(w.watches, name)
- delete(w.userWatches, name)
-
- parentName := filepath.Dir(name)
- delete(w.watchesByDir[parentName], watchfd)
-
- if len(w.watchesByDir[parentName]) == 0 {
- delete(w.watchesByDir, parentName)
- }
-
- delete(w.paths, watchfd)
- delete(w.dirFlags, name)
- delete(w.fileExists, name)
- w.mu.Unlock()
-
- // Find all watched paths that are in this directory that are not external.
- if unwatchFiles && isDir {
- var pathsToRemove []string
- w.mu.Lock()
- for fd := range w.watchesByDir[name] {
- path := w.paths[fd]
- if _, ok := w.userWatches[path.name]; !ok {
- pathsToRemove = append(pathsToRemove, path.name)
- }
- }
- w.mu.Unlock()
- for _, name := range pathsToRemove {
- // Since these are internal, not much sense in propagating error to
- // the user, as that will just confuse them with an error about a
- // path they did not explicitly watch themselves.
- w.Remove(name)
- }
- }
- return nil
-}
-
-// WatchList returns all paths explicitly added with [Watcher.Add] (and are not
-// yet removed).
-//
-// Returns nil if [Watcher.Close] was called.
-func (w *Watcher) WatchList() []string {
- w.mu.Lock()
- defer w.mu.Unlock()
- if w.isClosed {
- return nil
- }
-
- entries := make([]string, 0, len(w.userWatches))
- for pathname := range w.userWatches {
- entries = append(entries, pathname)
- }
-
- return entries
-}
-
-// Watch all events (except NOTE_EXTEND, NOTE_LINK, NOTE_REVOKE)
-const noteAllEvents = unix.NOTE_DELETE | unix.NOTE_WRITE | unix.NOTE_ATTRIB | unix.NOTE_RENAME
-
-// addWatch adds name to the watched file set; the flags are interpreted as
-// described in kevent(2).
-//
-// Returns the real path to the file which was added, with symlinks resolved.
-func (w *Watcher) addWatch(name string, flags uint32) (string, error) {
- var isDir bool
- name = filepath.Clean(name)
-
- w.mu.Lock()
- if w.isClosed {
- w.mu.Unlock()
- return "", ErrClosed
- }
- watchfd, alreadyWatching := w.watches[name]
- // We already have a watch, but we can still override flags.
- if alreadyWatching {
- isDir = w.paths[watchfd].isDir
- }
- w.mu.Unlock()
-
- if !alreadyWatching {
- fi, err := os.Lstat(name)
- if err != nil {
- return "", err
- }
-
- // Don't watch sockets or named pipes
- if (fi.Mode()&os.ModeSocket == os.ModeSocket) || (fi.Mode()&os.ModeNamedPipe == os.ModeNamedPipe) {
- return "", nil
- }
-
- // Follow Symlinks.
- if fi.Mode()&os.ModeSymlink == os.ModeSymlink {
- link, err := os.Readlink(name)
- if err != nil {
- // Return nil because Linux can add unresolvable symlinks to the
- // watch list without problems, so maintain consistency with
- // that. There will be no file events for broken symlinks.
- // TODO: more specific check; returns os.PathError; ENOENT?
- return "", nil
- }
-
- w.mu.Lock()
- _, alreadyWatching = w.watches[link]
- w.mu.Unlock()
-
- if alreadyWatching {
- // Add to watches so we don't get spurious Create events later
- // on when we diff the directories.
- w.watches[name] = 0
- w.fileExists[name] = struct{}{}
- return link, nil
- }
-
- name = link
- fi, err = os.Lstat(name)
- if err != nil {
- return "", nil
- }
- }
-
- // Retry on EINTR; open() can return EINTR in practice on macOS.
- // See #354, and Go issues 11180 and 39237.
- for {
- watchfd, err = unix.Open(name, openMode, 0)
- if err == nil {
- break
- }
- if errors.Is(err, unix.EINTR) {
- continue
- }
-
- return "", err
- }
-
- isDir = fi.IsDir()
- }
-
- err := w.register([]int{watchfd}, unix.EV_ADD|unix.EV_CLEAR|unix.EV_ENABLE, flags)
- if err != nil {
- unix.Close(watchfd)
- return "", err
- }
-
- if !alreadyWatching {
- w.mu.Lock()
- parentName := filepath.Dir(name)
- w.watches[name] = watchfd
-
- watchesByDir, ok := w.watchesByDir[parentName]
- if !ok {
- watchesByDir = make(map[int]struct{}, 1)
- w.watchesByDir[parentName] = watchesByDir
- }
- watchesByDir[watchfd] = struct{}{}
- w.paths[watchfd] = pathInfo{name: name, isDir: isDir}
- w.mu.Unlock()
- }
-
- if isDir {
- // Watch the directory if it has not been watched before, or if it was
- // watched before, but perhaps only a NOTE_DELETE (watchDirectoryFiles)
- w.mu.Lock()
-
- watchDir := (flags&unix.NOTE_WRITE) == unix.NOTE_WRITE &&
- (!alreadyWatching || (w.dirFlags[name]&unix.NOTE_WRITE) != unix.NOTE_WRITE)
- // Store flags so this watch can be updated later
- w.dirFlags[name] = flags
- w.mu.Unlock()
-
- if watchDir {
- if err := w.watchDirectoryFiles(name); err != nil {
- return "", err
- }
- }
- }
- return name, nil
-}
-
-// readEvents reads from kqueue and converts the received kevents into
-// Event values that it sends down the Events channel.
-func (w *Watcher) readEvents() {
- defer func() {
- close(w.Events)
- close(w.Errors)
- _ = unix.Close(w.kq)
- unix.Close(w.closepipe[0])
- }()
-
- eventBuffer := make([]unix.Kevent_t, 10)
- for closed := false; !closed; {
- kevents, err := w.read(eventBuffer)
- // EINTR is okay, the syscall was interrupted before timeout expired.
- if err != nil && err != unix.EINTR {
- if !w.sendError(fmt.Errorf("fsnotify.readEvents: %w", err)) {
- closed = true
- }
- continue
- }
-
- // Flush the events we received to the Events channel
- for _, kevent := range kevents {
- var (
- watchfd = int(kevent.Ident)
- mask = uint32(kevent.Fflags)
- )
-
- // Shut down the loop when the pipe is closed, but only after all
- // other events have been processed.
- if watchfd == w.closepipe[0] {
- closed = true
- continue
- }
-
- w.mu.Lock()
- path := w.paths[watchfd]
- w.mu.Unlock()
-
- event := w.newEvent(path.name, mask)
-
- if event.Has(Rename) || event.Has(Remove) {
- w.remove(event.Name, false)
- w.mu.Lock()
- delete(w.fileExists, event.Name)
- w.mu.Unlock()
- }
-
- if path.isDir && event.Has(Write) && !event.Has(Remove) {
- w.sendDirectoryChangeEvents(event.Name)
- } else {
- if !w.sendEvent(event) {
- closed = true
- continue
- }
- }
-
- if event.Has(Remove) {
- // Look for a file that may have overwritten this; for example,
- // mv f1 f2 will delete f2, then create f2.
- if path.isDir {
- fileDir := filepath.Clean(event.Name)
- w.mu.Lock()
- _, found := w.watches[fileDir]
- w.mu.Unlock()
- if found {
- err := w.sendDirectoryChangeEvents(fileDir)
- if err != nil {
- if !w.sendError(err) {
- closed = true
- }
- }
- }
- } else {
- filePath := filepath.Clean(event.Name)
- if fi, err := os.Lstat(filePath); err == nil {
- err := w.sendFileCreatedEventIfNew(filePath, fi)
- if err != nil {
- if !w.sendError(err) {
- closed = true
- }
- }
- }
- }
- }
- }
- }
-}
-
-// newEvent returns an platform-independent Event based on kqueue Fflags.
-func (w *Watcher) newEvent(name string, mask uint32) Event {
- e := Event{Name: name}
- if mask&unix.NOTE_DELETE == unix.NOTE_DELETE {
- e.Op |= Remove
- }
- if mask&unix.NOTE_WRITE == unix.NOTE_WRITE {
- e.Op |= Write
- }
- if mask&unix.NOTE_RENAME == unix.NOTE_RENAME {
- e.Op |= Rename
- }
- if mask&unix.NOTE_ATTRIB == unix.NOTE_ATTRIB {
- e.Op |= Chmod
- }
- // No point sending a write and delete event at the same time: if it's gone,
- // then it's gone.
- if e.Op.Has(Write) && e.Op.Has(Remove) {
- e.Op &^= Write
- }
- return e
-}
-
-// watchDirectoryFiles to mimic inotify when adding a watch on a directory
-func (w *Watcher) watchDirectoryFiles(dirPath string) error {
- // Get all files
- files, err := os.ReadDir(dirPath)
- if err != nil {
- return err
- }
-
- for _, f := range files {
- path := filepath.Join(dirPath, f.Name())
-
- fi, err := f.Info()
- if err != nil {
- return fmt.Errorf("%q: %w", path, err)
- }
-
- cleanPath, err := w.internalWatch(path, fi)
- if err != nil {
- // No permission to read the file; that's not a problem: just skip.
- // But do add it to w.fileExists to prevent it from being picked up
- // as a "new" file later (it still shows up in the directory
- // listing).
- switch {
- case errors.Is(err, unix.EACCES) || errors.Is(err, unix.EPERM):
- cleanPath = filepath.Clean(path)
- default:
- return fmt.Errorf("%q: %w", path, err)
- }
- }
-
- w.mu.Lock()
- w.fileExists[cleanPath] = struct{}{}
- w.mu.Unlock()
- }
-
- return nil
-}
-
-// Search the directory for new files and send an event for them.
-//
-// This functionality is to have the BSD watcher match the inotify, which sends
-// a create event for files created in a watched directory.
-func (w *Watcher) sendDirectoryChangeEvents(dir string) error {
- files, err := os.ReadDir(dir)
- if err != nil {
- // Directory no longer exists: we can ignore this safely. kqueue will
- // still give us the correct events.
- if errors.Is(err, os.ErrNotExist) {
- return nil
- }
- return fmt.Errorf("fsnotify.sendDirectoryChangeEvents: %w", err)
- }
-
- for _, f := range files {
- fi, err := f.Info()
- if err != nil {
- return fmt.Errorf("fsnotify.sendDirectoryChangeEvents: %w", err)
- }
-
- err = w.sendFileCreatedEventIfNew(filepath.Join(dir, fi.Name()), fi)
- if err != nil {
- // Don't need to send an error if this file isn't readable.
- if errors.Is(err, unix.EACCES) || errors.Is(err, unix.EPERM) {
- return nil
- }
- return fmt.Errorf("fsnotify.sendDirectoryChangeEvents: %w", err)
- }
- }
- return nil
-}
-
-// sendFileCreatedEvent sends a create event if the file isn't already being tracked.
-func (w *Watcher) sendFileCreatedEventIfNew(filePath string, fi os.FileInfo) (err error) {
- w.mu.Lock()
- _, doesExist := w.fileExists[filePath]
- w.mu.Unlock()
- if !doesExist {
- if !w.sendEvent(Event{Name: filePath, Op: Create}) {
- return
- }
- }
-
- // like watchDirectoryFiles (but without doing another ReadDir)
- filePath, err = w.internalWatch(filePath, fi)
- if err != nil {
- return err
- }
-
- w.mu.Lock()
- w.fileExists[filePath] = struct{}{}
- w.mu.Unlock()
-
- return nil
-}
-
-func (w *Watcher) internalWatch(name string, fi os.FileInfo) (string, error) {
- if fi.IsDir() {
- // mimic Linux providing delete events for subdirectories, but preserve
- // the flags used if currently watching subdirectory
- w.mu.Lock()
- flags := w.dirFlags[name]
- w.mu.Unlock()
-
- flags |= unix.NOTE_DELETE | unix.NOTE_RENAME
- return w.addWatch(name, flags)
- }
-
- // watch file to mimic Linux inotify
- return w.addWatch(name, noteAllEvents)
-}
-
-// Register events with the queue.
-func (w *Watcher) register(fds []int, flags int, fflags uint32) error {
- changes := make([]unix.Kevent_t, len(fds))
- for i, fd := range fds {
- // SetKevent converts int to the platform-specific types.
- unix.SetKevent(&changes[i], fd, unix.EVFILT_VNODE, flags)
- changes[i].Fflags = fflags
- }
-
- // Register the events.
- success, err := unix.Kevent(w.kq, changes, nil, nil)
- if success == -1 {
- return err
- }
- return nil
-}
-
-// read retrieves pending events, or waits until an event occurs.
-func (w *Watcher) read(events []unix.Kevent_t) ([]unix.Kevent_t, error) {
- n, err := unix.Kevent(w.kq, nil, events, nil)
- if err != nil {
- return nil, err
- }
- return events[0:n], nil
-}
diff --git a/vendor/github.com/fsnotify/fsnotify/backend_other.go b/vendor/github.com/fsnotify/fsnotify/backend_other.go
deleted file mode 100644
index d34a23c0..00000000
--- a/vendor/github.com/fsnotify/fsnotify/backend_other.go
+++ /dev/null
@@ -1,205 +0,0 @@
-//go:build appengine || (!darwin && !dragonfly && !freebsd && !openbsd && !linux && !netbsd && !solaris && !windows)
-// +build appengine !darwin,!dragonfly,!freebsd,!openbsd,!linux,!netbsd,!solaris,!windows
-
-// Note: the documentation on the Watcher type and methods is generated from
-// mkdoc.zsh
-
-package fsnotify
-
-import "errors"
-
-// Watcher watches a set of paths, delivering events on a channel.
-//
-// A watcher should not be copied (e.g. pass it by pointer, rather than by
-// value).
-//
-// # Linux notes
-//
-// When a file is removed a Remove event won't be emitted until all file
-// descriptors are closed, and deletes will always emit a Chmod. For example:
-//
-// fp := os.Open("file")
-// os.Remove("file") // Triggers Chmod
-// fp.Close() // Triggers Remove
-//
-// This is the event that inotify sends, so not much can be changed about this.
-//
-// The fs.inotify.max_user_watches sysctl variable specifies the upper limit
-// for the number of watches per user, and fs.inotify.max_user_instances
-// specifies the maximum number of inotify instances per user. Every Watcher you
-// create is an "instance", and every path you add is a "watch".
-//
-// These are also exposed in /proc as /proc/sys/fs/inotify/max_user_watches and
-// /proc/sys/fs/inotify/max_user_instances
-//
-// To increase them you can use sysctl or write the value to the /proc file:
-//
-// # Default values on Linux 5.18
-// sysctl fs.inotify.max_user_watches=124983
-// sysctl fs.inotify.max_user_instances=128
-//
-// To make the changes persist on reboot edit /etc/sysctl.conf or
-// /usr/lib/sysctl.d/50-default.conf (details differ per Linux distro; check
-// your distro's documentation):
-//
-// fs.inotify.max_user_watches=124983
-// fs.inotify.max_user_instances=128
-//
-// Reaching the limit will result in a "no space left on device" or "too many open
-// files" error.
-//
-// # kqueue notes (macOS, BSD)
-//
-// kqueue requires opening a file descriptor for every file that's being watched;
-// so if you're watching a directory with five files then that's six file
-// descriptors. You will run in to your system's "max open files" limit faster on
-// these platforms.
-//
-// The sysctl variables kern.maxfiles and kern.maxfilesperproc can be used to
-// control the maximum number of open files, as well as /etc/login.conf on BSD
-// systems.
-//
-// # Windows notes
-//
-// Paths can be added as "C:\path\to\dir", but forward slashes
-// ("C:/path/to/dir") will also work.
-//
-// When a watched directory is removed it will always send an event for the
-// directory itself, but may not send events for all files in that directory.
-// Sometimes it will send events for all times, sometimes it will send no
-// events, and often only for some files.
-//
-// The default ReadDirectoryChangesW() buffer size is 64K, which is the largest
-// value that is guaranteed to work with SMB filesystems. If you have many
-// events in quick succession this may not be enough, and you will have to use
-// [WithBufferSize] to increase the value.
-type Watcher struct {
- // Events sends the filesystem change events.
- //
- // fsnotify can send the following events; a "path" here can refer to a
- // file, directory, symbolic link, or special file like a FIFO.
- //
- // fsnotify.Create A new path was created; this may be followed by one
- // or more Write events if data also gets written to a
- // file.
- //
- // fsnotify.Remove A path was removed.
- //
- // fsnotify.Rename A path was renamed. A rename is always sent with the
- // old path as Event.Name, and a Create event will be
- // sent with the new name. Renames are only sent for
- // paths that are currently watched; e.g. moving an
- // unmonitored file into a monitored directory will
- // show up as just a Create. Similarly, renaming a file
- // to outside a monitored directory will show up as
- // only a Rename.
- //
- // fsnotify.Write A file or named pipe was written to. A Truncate will
- // also trigger a Write. A single "write action"
- // initiated by the user may show up as one or multiple
- // writes, depending on when the system syncs things to
- // disk. For example when compiling a large Go program
- // you may get hundreds of Write events, and you may
- // want to wait until you've stopped receiving them
- // (see the dedup example in cmd/fsnotify).
- //
- // Some systems may send Write event for directories
- // when the directory content changes.
- //
- // fsnotify.Chmod Attributes were changed. On Linux this is also sent
- // when a file is removed (or more accurately, when a
- // link to an inode is removed). On kqueue it's sent
- // when a file is truncated. On Windows it's never
- // sent.
- Events chan Event
-
- // Errors sends any errors.
- //
- // ErrEventOverflow is used to indicate there are too many events:
- //
- // - inotify: There are too many queued events (fs.inotify.max_queued_events sysctl)
- // - windows: The buffer size is too small; WithBufferSize() can be used to increase it.
- // - kqueue, fen: Not used.
- Errors chan error
-}
-
-// NewWatcher creates a new Watcher.
-func NewWatcher() (*Watcher, error) {
- return nil, errors.New("fsnotify not supported on the current platform")
-}
-
-// NewBufferedWatcher creates a new Watcher with a buffered Watcher.Events
-// channel.
-//
-// The main use case for this is situations with a very large number of events
-// where the kernel buffer size can't be increased (e.g. due to lack of
-// permissions). An unbuffered Watcher will perform better for almost all use
-// cases, and whenever possible you will be better off increasing the kernel
-// buffers instead of adding a large userspace buffer.
-func NewBufferedWatcher(sz uint) (*Watcher, error) { return NewWatcher() }
-
-// Close removes all watches and closes the Events channel.
-func (w *Watcher) Close() error { return nil }
-
-// WatchList returns all paths explicitly added with [Watcher.Add] (and are not
-// yet removed).
-//
-// Returns nil if [Watcher.Close] was called.
-func (w *Watcher) WatchList() []string { return nil }
-
-// Add starts monitoring the path for changes.
-//
-// A path can only be watched once; watching it more than once is a no-op and will
-// not return an error. Paths that do not yet exist on the filesystem cannot be
-// watched.
-//
-// A watch will be automatically removed if the watched path is deleted or
-// renamed. The exception is the Windows backend, which doesn't remove the
-// watcher on renames.
-//
-// Notifications on network filesystems (NFS, SMB, FUSE, etc.) or special
-// filesystems (/proc, /sys, etc.) generally don't work.
-//
-// Returns [ErrClosed] if [Watcher.Close] was called.
-//
-// See [Watcher.AddWith] for a version that allows adding options.
-//
-// # Watching directories
-//
-// All files in a directory are monitored, including new files that are created
-// after the watcher is started. Subdirectories are not watched (i.e. it's
-// non-recursive).
-//
-// # Watching files
-//
-// Watching individual files (rather than directories) is generally not
-// recommended as many programs (especially editors) update files atomically: it
-// will write to a temporary file which is then moved to to destination,
-// overwriting the original (or some variant thereof). The watcher on the
-// original file is now lost, as that no longer exists.
-//
-// The upshot of this is that a power failure or crash won't leave a
-// half-written file.
-//
-// Watch the parent directory and use Event.Name to filter out files you're not
-// interested in. There is an example of this in cmd/fsnotify/file.go.
-func (w *Watcher) Add(name string) error { return nil }
-
-// AddWith is like [Watcher.Add], but allows adding options. When using Add()
-// the defaults described below are used.
-//
-// Possible options are:
-//
-// - [WithBufferSize] sets the buffer size for the Windows backend; no-op on
-// other platforms. The default is 64K (65536 bytes).
-func (w *Watcher) AddWith(name string, opts ...addOpt) error { return nil }
-
-// Remove stops monitoring the path for changes.
-//
-// Directories are always removed non-recursively. For example, if you added
-// /tmp/dir and /tmp/dir/subdir then you will need to remove both.
-//
-// Removing a path that has not yet been added returns [ErrNonExistentWatch].
-//
-// Returns nil if [Watcher.Close] was called.
-func (w *Watcher) Remove(name string) error { return nil }
diff --git a/vendor/github.com/fsnotify/fsnotify/backend_windows.go b/vendor/github.com/fsnotify/fsnotify/backend_windows.go
deleted file mode 100644
index 9bc91e5d..00000000
--- a/vendor/github.com/fsnotify/fsnotify/backend_windows.go
+++ /dev/null
@@ -1,827 +0,0 @@
-//go:build windows
-// +build windows
-
-// Windows backend based on ReadDirectoryChangesW()
-//
-// https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-readdirectorychangesw
-//
-// Note: the documentation on the Watcher type and methods is generated from
-// mkdoc.zsh
-
-package fsnotify
-
-import (
- "errors"
- "fmt"
- "os"
- "path/filepath"
- "reflect"
- "runtime"
- "strings"
- "sync"
- "unsafe"
-
- "golang.org/x/sys/windows"
-)
-
-// Watcher watches a set of paths, delivering events on a channel.
-//
-// A watcher should not be copied (e.g. pass it by pointer, rather than by
-// value).
-//
-// # Linux notes
-//
-// When a file is removed a Remove event won't be emitted until all file
-// descriptors are closed, and deletes will always emit a Chmod. For example:
-//
-// fp := os.Open("file")
-// os.Remove("file") // Triggers Chmod
-// fp.Close() // Triggers Remove
-//
-// This is the event that inotify sends, so not much can be changed about this.
-//
-// The fs.inotify.max_user_watches sysctl variable specifies the upper limit
-// for the number of watches per user, and fs.inotify.max_user_instances
-// specifies the maximum number of inotify instances per user. Every Watcher you
-// create is an "instance", and every path you add is a "watch".
-//
-// These are also exposed in /proc as /proc/sys/fs/inotify/max_user_watches and
-// /proc/sys/fs/inotify/max_user_instances
-//
-// To increase them you can use sysctl or write the value to the /proc file:
-//
-// # Default values on Linux 5.18
-// sysctl fs.inotify.max_user_watches=124983
-// sysctl fs.inotify.max_user_instances=128
-//
-// To make the changes persist on reboot edit /etc/sysctl.conf or
-// /usr/lib/sysctl.d/50-default.conf (details differ per Linux distro; check
-// your distro's documentation):
-//
-// fs.inotify.max_user_watches=124983
-// fs.inotify.max_user_instances=128
-//
-// Reaching the limit will result in a "no space left on device" or "too many open
-// files" error.
-//
-// # kqueue notes (macOS, BSD)
-//
-// kqueue requires opening a file descriptor for every file that's being watched;
-// so if you're watching a directory with five files then that's six file
-// descriptors. You will run in to your system's "max open files" limit faster on
-// these platforms.
-//
-// The sysctl variables kern.maxfiles and kern.maxfilesperproc can be used to
-// control the maximum number of open files, as well as /etc/login.conf on BSD
-// systems.
-//
-// # Windows notes
-//
-// Paths can be added as "C:\path\to\dir", but forward slashes
-// ("C:/path/to/dir") will also work.
-//
-// When a watched directory is removed it will always send an event for the
-// directory itself, but may not send events for all files in that directory.
-// Sometimes it will send events for all times, sometimes it will send no
-// events, and often only for some files.
-//
-// The default ReadDirectoryChangesW() buffer size is 64K, which is the largest
-// value that is guaranteed to work with SMB filesystems. If you have many
-// events in quick succession this may not be enough, and you will have to use
-// [WithBufferSize] to increase the value.
-type Watcher struct {
- // Events sends the filesystem change events.
- //
- // fsnotify can send the following events; a "path" here can refer to a
- // file, directory, symbolic link, or special file like a FIFO.
- //
- // fsnotify.Create A new path was created; this may be followed by one
- // or more Write events if data also gets written to a
- // file.
- //
- // fsnotify.Remove A path was removed.
- //
- // fsnotify.Rename A path was renamed. A rename is always sent with the
- // old path as Event.Name, and a Create event will be
- // sent with the new name. Renames are only sent for
- // paths that are currently watched; e.g. moving an
- // unmonitored file into a monitored directory will
- // show up as just a Create. Similarly, renaming a file
- // to outside a monitored directory will show up as
- // only a Rename.
- //
- // fsnotify.Write A file or named pipe was written to. A Truncate will
- // also trigger a Write. A single "write action"
- // initiated by the user may show up as one or multiple
- // writes, depending on when the system syncs things to
- // disk. For example when compiling a large Go program
- // you may get hundreds of Write events, and you may
- // want to wait until you've stopped receiving them
- // (see the dedup example in cmd/fsnotify).
- //
- // Some systems may send Write event for directories
- // when the directory content changes.
- //
- // fsnotify.Chmod Attributes were changed. On Linux this is also sent
- // when a file is removed (or more accurately, when a
- // link to an inode is removed). On kqueue it's sent
- // when a file is truncated. On Windows it's never
- // sent.
- Events chan Event
-
- // Errors sends any errors.
- //
- // ErrEventOverflow is used to indicate there are too many events:
- //
- // - inotify: There are too many queued events (fs.inotify.max_queued_events sysctl)
- // - windows: The buffer size is too small; WithBufferSize() can be used to increase it.
- // - kqueue, fen: Not used.
- Errors chan error
-
- port windows.Handle // Handle to completion port
- input chan *input // Inputs to the reader are sent on this channel
- quit chan chan<- error
-
- mu sync.Mutex // Protects access to watches, closed
- watches watchMap // Map of watches (key: i-number)
- closed bool // Set to true when Close() is first called
-}
-
-// NewWatcher creates a new Watcher.
-func NewWatcher() (*Watcher, error) {
- return NewBufferedWatcher(50)
-}
-
-// NewBufferedWatcher creates a new Watcher with a buffered Watcher.Events
-// channel.
-//
-// The main use case for this is situations with a very large number of events
-// where the kernel buffer size can't be increased (e.g. due to lack of
-// permissions). An unbuffered Watcher will perform better for almost all use
-// cases, and whenever possible you will be better off increasing the kernel
-// buffers instead of adding a large userspace buffer.
-func NewBufferedWatcher(sz uint) (*Watcher, error) {
- port, err := windows.CreateIoCompletionPort(windows.InvalidHandle, 0, 0, 0)
- if err != nil {
- return nil, os.NewSyscallError("CreateIoCompletionPort", err)
- }
- w := &Watcher{
- port: port,
- watches: make(watchMap),
- input: make(chan *input, 1),
- Events: make(chan Event, sz),
- Errors: make(chan error),
- quit: make(chan chan<- error, 1),
- }
- go w.readEvents()
- return w, nil
-}
-
-func (w *Watcher) isClosed() bool {
- w.mu.Lock()
- defer w.mu.Unlock()
- return w.closed
-}
-
-func (w *Watcher) sendEvent(name string, mask uint64) bool {
- if mask == 0 {
- return false
- }
-
- event := w.newEvent(name, uint32(mask))
- select {
- case ch := <-w.quit:
- w.quit <- ch
- case w.Events <- event:
- }
- return true
-}
-
-// Returns true if the error was sent, or false if watcher is closed.
-func (w *Watcher) sendError(err error) bool {
- select {
- case w.Errors <- err:
- return true
- case <-w.quit:
- }
- return false
-}
-
-// Close removes all watches and closes the Events channel.
-func (w *Watcher) Close() error {
- if w.isClosed() {
- return nil
- }
-
- w.mu.Lock()
- w.closed = true
- w.mu.Unlock()
-
- // Send "quit" message to the reader goroutine
- ch := make(chan error)
- w.quit <- ch
- if err := w.wakeupReader(); err != nil {
- return err
- }
- return <-ch
-}
-
-// Add starts monitoring the path for changes.
-//
-// A path can only be watched once; watching it more than once is a no-op and will
-// not return an error. Paths that do not yet exist on the filesystem cannot be
-// watched.
-//
-// A watch will be automatically removed if the watched path is deleted or
-// renamed. The exception is the Windows backend, which doesn't remove the
-// watcher on renames.
-//
-// Notifications on network filesystems (NFS, SMB, FUSE, etc.) or special
-// filesystems (/proc, /sys, etc.) generally don't work.
-//
-// Returns [ErrClosed] if [Watcher.Close] was called.
-//
-// See [Watcher.AddWith] for a version that allows adding options.
-//
-// # Watching directories
-//
-// All files in a directory are monitored, including new files that are created
-// after the watcher is started. Subdirectories are not watched (i.e. it's
-// non-recursive).
-//
-// # Watching files
-//
-// Watching individual files (rather than directories) is generally not
-// recommended as many programs (especially editors) update files atomically: it
-// will write to a temporary file which is then moved to to destination,
-// overwriting the original (or some variant thereof). The watcher on the
-// original file is now lost, as that no longer exists.
-//
-// The upshot of this is that a power failure or crash won't leave a
-// half-written file.
-//
-// Watch the parent directory and use Event.Name to filter out files you're not
-// interested in. There is an example of this in cmd/fsnotify/file.go.
-func (w *Watcher) Add(name string) error { return w.AddWith(name) }
-
-// AddWith is like [Watcher.Add], but allows adding options. When using Add()
-// the defaults described below are used.
-//
-// Possible options are:
-//
-// - [WithBufferSize] sets the buffer size for the Windows backend; no-op on
-// other platforms. The default is 64K (65536 bytes).
-func (w *Watcher) AddWith(name string, opts ...addOpt) error {
- if w.isClosed() {
- return ErrClosed
- }
-
- with := getOptions(opts...)
- if with.bufsize < 4096 {
- return fmt.Errorf("fsnotify.WithBufferSize: buffer size cannot be smaller than 4096 bytes")
- }
-
- in := &input{
- op: opAddWatch,
- path: filepath.Clean(name),
- flags: sysFSALLEVENTS,
- reply: make(chan error),
- bufsize: with.bufsize,
- }
- w.input <- in
- if err := w.wakeupReader(); err != nil {
- return err
- }
- return <-in.reply
-}
-
-// Remove stops monitoring the path for changes.
-//
-// Directories are always removed non-recursively. For example, if you added
-// /tmp/dir and /tmp/dir/subdir then you will need to remove both.
-//
-// Removing a path that has not yet been added returns [ErrNonExistentWatch].
-//
-// Returns nil if [Watcher.Close] was called.
-func (w *Watcher) Remove(name string) error {
- if w.isClosed() {
- return nil
- }
-
- in := &input{
- op: opRemoveWatch,
- path: filepath.Clean(name),
- reply: make(chan error),
- }
- w.input <- in
- if err := w.wakeupReader(); err != nil {
- return err
- }
- return <-in.reply
-}
-
-// WatchList returns all paths explicitly added with [Watcher.Add] (and are not
-// yet removed).
-//
-// Returns nil if [Watcher.Close] was called.
-func (w *Watcher) WatchList() []string {
- if w.isClosed() {
- return nil
- }
-
- w.mu.Lock()
- defer w.mu.Unlock()
-
- entries := make([]string, 0, len(w.watches))
- for _, entry := range w.watches {
- for _, watchEntry := range entry {
- entries = append(entries, watchEntry.path)
- }
- }
-
- return entries
-}
-
-// These options are from the old golang.org/x/exp/winfsnotify, where you could
-// add various options to the watch. This has long since been removed.
-//
-// The "sys" in the name is misleading as they're not part of any "system".
-//
-// This should all be removed at some point, and just use windows.FILE_NOTIFY_*
-const (
- sysFSALLEVENTS = 0xfff
- sysFSCREATE = 0x100
- sysFSDELETE = 0x200
- sysFSDELETESELF = 0x400
- sysFSMODIFY = 0x2
- sysFSMOVE = 0xc0
- sysFSMOVEDFROM = 0x40
- sysFSMOVEDTO = 0x80
- sysFSMOVESELF = 0x800
- sysFSIGNORED = 0x8000
-)
-
-func (w *Watcher) newEvent(name string, mask uint32) Event {
- e := Event{Name: name}
- if mask&sysFSCREATE == sysFSCREATE || mask&sysFSMOVEDTO == sysFSMOVEDTO {
- e.Op |= Create
- }
- if mask&sysFSDELETE == sysFSDELETE || mask&sysFSDELETESELF == sysFSDELETESELF {
- e.Op |= Remove
- }
- if mask&sysFSMODIFY == sysFSMODIFY {
- e.Op |= Write
- }
- if mask&sysFSMOVE == sysFSMOVE || mask&sysFSMOVESELF == sysFSMOVESELF || mask&sysFSMOVEDFROM == sysFSMOVEDFROM {
- e.Op |= Rename
- }
- return e
-}
-
-const (
- opAddWatch = iota
- opRemoveWatch
-)
-
-const (
- provisional uint64 = 1 << (32 + iota)
-)
-
-type input struct {
- op int
- path string
- flags uint32
- bufsize int
- reply chan error
-}
-
-type inode struct {
- handle windows.Handle
- volume uint32
- index uint64
-}
-
-type watch struct {
- ov windows.Overlapped
- ino *inode // i-number
- recurse bool // Recursive watch?
- path string // Directory path
- mask uint64 // Directory itself is being watched with these notify flags
- names map[string]uint64 // Map of names being watched and their notify flags
- rename string // Remembers the old name while renaming a file
- buf []byte // buffer, allocated later
-}
-
-type (
- indexMap map[uint64]*watch
- watchMap map[uint32]indexMap
-)
-
-func (w *Watcher) wakeupReader() error {
- err := windows.PostQueuedCompletionStatus(w.port, 0, 0, nil)
- if err != nil {
- return os.NewSyscallError("PostQueuedCompletionStatus", err)
- }
- return nil
-}
-
-func (w *Watcher) getDir(pathname string) (dir string, err error) {
- attr, err := windows.GetFileAttributes(windows.StringToUTF16Ptr(pathname))
- if err != nil {
- return "", os.NewSyscallError("GetFileAttributes", err)
- }
- if attr&windows.FILE_ATTRIBUTE_DIRECTORY != 0 {
- dir = pathname
- } else {
- dir, _ = filepath.Split(pathname)
- dir = filepath.Clean(dir)
- }
- return
-}
-
-func (w *Watcher) getIno(path string) (ino *inode, err error) {
- h, err := windows.CreateFile(windows.StringToUTF16Ptr(path),
- windows.FILE_LIST_DIRECTORY,
- windows.FILE_SHARE_READ|windows.FILE_SHARE_WRITE|windows.FILE_SHARE_DELETE,
- nil, windows.OPEN_EXISTING,
- windows.FILE_FLAG_BACKUP_SEMANTICS|windows.FILE_FLAG_OVERLAPPED, 0)
- if err != nil {
- return nil, os.NewSyscallError("CreateFile", err)
- }
-
- var fi windows.ByHandleFileInformation
- err = windows.GetFileInformationByHandle(h, &fi)
- if err != nil {
- windows.CloseHandle(h)
- return nil, os.NewSyscallError("GetFileInformationByHandle", err)
- }
- ino = &inode{
- handle: h,
- volume: fi.VolumeSerialNumber,
- index: uint64(fi.FileIndexHigh)<<32 | uint64(fi.FileIndexLow),
- }
- return ino, nil
-}
-
-// Must run within the I/O thread.
-func (m watchMap) get(ino *inode) *watch {
- if i := m[ino.volume]; i != nil {
- return i[ino.index]
- }
- return nil
-}
-
-// Must run within the I/O thread.
-func (m watchMap) set(ino *inode, watch *watch) {
- i := m[ino.volume]
- if i == nil {
- i = make(indexMap)
- m[ino.volume] = i
- }
- i[ino.index] = watch
-}
-
-// Must run within the I/O thread.
-func (w *Watcher) addWatch(pathname string, flags uint64, bufsize int) error {
- //pathname, recurse := recursivePath(pathname)
- recurse := false
-
- dir, err := w.getDir(pathname)
- if err != nil {
- return err
- }
-
- ino, err := w.getIno(dir)
- if err != nil {
- return err
- }
- w.mu.Lock()
- watchEntry := w.watches.get(ino)
- w.mu.Unlock()
- if watchEntry == nil {
- _, err := windows.CreateIoCompletionPort(ino.handle, w.port, 0, 0)
- if err != nil {
- windows.CloseHandle(ino.handle)
- return os.NewSyscallError("CreateIoCompletionPort", err)
- }
- watchEntry = &watch{
- ino: ino,
- path: dir,
- names: make(map[string]uint64),
- recurse: recurse,
- buf: make([]byte, bufsize),
- }
- w.mu.Lock()
- w.watches.set(ino, watchEntry)
- w.mu.Unlock()
- flags |= provisional
- } else {
- windows.CloseHandle(ino.handle)
- }
- if pathname == dir {
- watchEntry.mask |= flags
- } else {
- watchEntry.names[filepath.Base(pathname)] |= flags
- }
-
- err = w.startRead(watchEntry)
- if err != nil {
- return err
- }
-
- if pathname == dir {
- watchEntry.mask &= ^provisional
- } else {
- watchEntry.names[filepath.Base(pathname)] &= ^provisional
- }
- return nil
-}
-
-// Must run within the I/O thread.
-func (w *Watcher) remWatch(pathname string) error {
- pathname, recurse := recursivePath(pathname)
-
- dir, err := w.getDir(pathname)
- if err != nil {
- return err
- }
- ino, err := w.getIno(dir)
- if err != nil {
- return err
- }
-
- w.mu.Lock()
- watch := w.watches.get(ino)
- w.mu.Unlock()
-
- if recurse && !watch.recurse {
- return fmt.Errorf("can't use \\... with non-recursive watch %q", pathname)
- }
-
- err = windows.CloseHandle(ino.handle)
- if err != nil {
- w.sendError(os.NewSyscallError("CloseHandle", err))
- }
- if watch == nil {
- return fmt.Errorf("%w: %s", ErrNonExistentWatch, pathname)
- }
- if pathname == dir {
- w.sendEvent(watch.path, watch.mask&sysFSIGNORED)
- watch.mask = 0
- } else {
- name := filepath.Base(pathname)
- w.sendEvent(filepath.Join(watch.path, name), watch.names[name]&sysFSIGNORED)
- delete(watch.names, name)
- }
-
- return w.startRead(watch)
-}
-
-// Must run within the I/O thread.
-func (w *Watcher) deleteWatch(watch *watch) {
- for name, mask := range watch.names {
- if mask&provisional == 0 {
- w.sendEvent(filepath.Join(watch.path, name), mask&sysFSIGNORED)
- }
- delete(watch.names, name)
- }
- if watch.mask != 0 {
- if watch.mask&provisional == 0 {
- w.sendEvent(watch.path, watch.mask&sysFSIGNORED)
- }
- watch.mask = 0
- }
-}
-
-// Must run within the I/O thread.
-func (w *Watcher) startRead(watch *watch) error {
- err := windows.CancelIo(watch.ino.handle)
- if err != nil {
- w.sendError(os.NewSyscallError("CancelIo", err))
- w.deleteWatch(watch)
- }
- mask := w.toWindowsFlags(watch.mask)
- for _, m := range watch.names {
- mask |= w.toWindowsFlags(m)
- }
- if mask == 0 {
- err := windows.CloseHandle(watch.ino.handle)
- if err != nil {
- w.sendError(os.NewSyscallError("CloseHandle", err))
- }
- w.mu.Lock()
- delete(w.watches[watch.ino.volume], watch.ino.index)
- w.mu.Unlock()
- return nil
- }
-
- // We need to pass the array, rather than the slice.
- hdr := (*reflect.SliceHeader)(unsafe.Pointer(&watch.buf))
- rdErr := windows.ReadDirectoryChanges(watch.ino.handle,
- (*byte)(unsafe.Pointer(hdr.Data)), uint32(hdr.Len),
- watch.recurse, mask, nil, &watch.ov, 0)
- if rdErr != nil {
- err := os.NewSyscallError("ReadDirectoryChanges", rdErr)
- if rdErr == windows.ERROR_ACCESS_DENIED && watch.mask&provisional == 0 {
- // Watched directory was probably removed
- w.sendEvent(watch.path, watch.mask&sysFSDELETESELF)
- err = nil
- }
- w.deleteWatch(watch)
- w.startRead(watch)
- return err
- }
- return nil
-}
-
-// readEvents reads from the I/O completion port, converts the
-// received events into Event objects and sends them via the Events channel.
-// Entry point to the I/O thread.
-func (w *Watcher) readEvents() {
- var (
- n uint32
- key uintptr
- ov *windows.Overlapped
- )
- runtime.LockOSThread()
-
- for {
- // This error is handled after the watch == nil check below.
- qErr := windows.GetQueuedCompletionStatus(w.port, &n, &key, &ov, windows.INFINITE)
-
- watch := (*watch)(unsafe.Pointer(ov))
- if watch == nil {
- select {
- case ch := <-w.quit:
- w.mu.Lock()
- var indexes []indexMap
- for _, index := range w.watches {
- indexes = append(indexes, index)
- }
- w.mu.Unlock()
- for _, index := range indexes {
- for _, watch := range index {
- w.deleteWatch(watch)
- w.startRead(watch)
- }
- }
-
- err := windows.CloseHandle(w.port)
- if err != nil {
- err = os.NewSyscallError("CloseHandle", err)
- }
- close(w.Events)
- close(w.Errors)
- ch <- err
- return
- case in := <-w.input:
- switch in.op {
- case opAddWatch:
- in.reply <- w.addWatch(in.path, uint64(in.flags), in.bufsize)
- case opRemoveWatch:
- in.reply <- w.remWatch(in.path)
- }
- default:
- }
- continue
- }
-
- switch qErr {
- case nil:
- // No error
- case windows.ERROR_MORE_DATA:
- if watch == nil {
- w.sendError(errors.New("ERROR_MORE_DATA has unexpectedly null lpOverlapped buffer"))
- } else {
- // The i/o succeeded but the buffer is full.
- // In theory we should be building up a full packet.
- // In practice we can get away with just carrying on.
- n = uint32(unsafe.Sizeof(watch.buf))
- }
- case windows.ERROR_ACCESS_DENIED:
- // Watched directory was probably removed
- w.sendEvent(watch.path, watch.mask&sysFSDELETESELF)
- w.deleteWatch(watch)
- w.startRead(watch)
- continue
- case windows.ERROR_OPERATION_ABORTED:
- // CancelIo was called on this handle
- continue
- default:
- w.sendError(os.NewSyscallError("GetQueuedCompletionPort", qErr))
- continue
- }
-
- var offset uint32
- for {
- if n == 0 {
- w.sendError(ErrEventOverflow)
- break
- }
-
- // Point "raw" to the event in the buffer
- raw := (*windows.FileNotifyInformation)(unsafe.Pointer(&watch.buf[offset]))
-
- // Create a buf that is the size of the path name
- size := int(raw.FileNameLength / 2)
- var buf []uint16
- // TODO: Use unsafe.Slice in Go 1.17; https://stackoverflow.com/questions/51187973
- sh := (*reflect.SliceHeader)(unsafe.Pointer(&buf))
- sh.Data = uintptr(unsafe.Pointer(&raw.FileName))
- sh.Len = size
- sh.Cap = size
- name := windows.UTF16ToString(buf)
- fullname := filepath.Join(watch.path, name)
-
- var mask uint64
- switch raw.Action {
- case windows.FILE_ACTION_REMOVED:
- mask = sysFSDELETESELF
- case windows.FILE_ACTION_MODIFIED:
- mask = sysFSMODIFY
- case windows.FILE_ACTION_RENAMED_OLD_NAME:
- watch.rename = name
- case windows.FILE_ACTION_RENAMED_NEW_NAME:
- // Update saved path of all sub-watches.
- old := filepath.Join(watch.path, watch.rename)
- w.mu.Lock()
- for _, watchMap := range w.watches {
- for _, ww := range watchMap {
- if strings.HasPrefix(ww.path, old) {
- ww.path = filepath.Join(fullname, strings.TrimPrefix(ww.path, old))
- }
- }
- }
- w.mu.Unlock()
-
- if watch.names[watch.rename] != 0 {
- watch.names[name] |= watch.names[watch.rename]
- delete(watch.names, watch.rename)
- mask = sysFSMOVESELF
- }
- }
-
- sendNameEvent := func() {
- w.sendEvent(fullname, watch.names[name]&mask)
- }
- if raw.Action != windows.FILE_ACTION_RENAMED_NEW_NAME {
- sendNameEvent()
- }
- if raw.Action == windows.FILE_ACTION_REMOVED {
- w.sendEvent(fullname, watch.names[name]&sysFSIGNORED)
- delete(watch.names, name)
- }
-
- w.sendEvent(fullname, watch.mask&w.toFSnotifyFlags(raw.Action))
- if raw.Action == windows.FILE_ACTION_RENAMED_NEW_NAME {
- fullname = filepath.Join(watch.path, watch.rename)
- sendNameEvent()
- }
-
- // Move to the next event in the buffer
- if raw.NextEntryOffset == 0 {
- break
- }
- offset += raw.NextEntryOffset
-
- // Error!
- if offset >= n {
- //lint:ignore ST1005 Windows should be capitalized
- w.sendError(errors.New(
- "Windows system assumed buffer larger than it is, events have likely been missed"))
- break
- }
- }
-
- if err := w.startRead(watch); err != nil {
- w.sendError(err)
- }
- }
-}
-
-func (w *Watcher) toWindowsFlags(mask uint64) uint32 {
- var m uint32
- if mask&sysFSMODIFY != 0 {
- m |= windows.FILE_NOTIFY_CHANGE_LAST_WRITE
- }
- if mask&(sysFSMOVE|sysFSCREATE|sysFSDELETE) != 0 {
- m |= windows.FILE_NOTIFY_CHANGE_FILE_NAME | windows.FILE_NOTIFY_CHANGE_DIR_NAME
- }
- return m
-}
-
-func (w *Watcher) toFSnotifyFlags(action uint32) uint64 {
- switch action {
- case windows.FILE_ACTION_ADDED:
- return sysFSCREATE
- case windows.FILE_ACTION_REMOVED:
- return sysFSDELETE
- case windows.FILE_ACTION_MODIFIED:
- return sysFSMODIFY
- case windows.FILE_ACTION_RENAMED_OLD_NAME:
- return sysFSMOVEDFROM
- case windows.FILE_ACTION_RENAMED_NEW_NAME:
- return sysFSMOVEDTO
- }
- return 0
-}
diff --git a/vendor/github.com/fsnotify/fsnotify/fen.go b/vendor/github.com/fsnotify/fsnotify/fen.go
new file mode 100644
index 00000000..ced39cb8
--- /dev/null
+++ b/vendor/github.com/fsnotify/fsnotify/fen.go
@@ -0,0 +1,37 @@
+// Copyright 2010 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build solaris
+
+package fsnotify
+
+import (
+ "errors"
+)
+
+// Watcher watches a set of files, delivering events to a channel.
+type Watcher struct {
+ Events chan Event
+ Errors chan error
+}
+
+// NewWatcher establishes a new watcher with the underlying OS and begins waiting for events.
+func NewWatcher() (*Watcher, error) {
+ return nil, errors.New("FEN based watcher not yet supported for fsnotify\n")
+}
+
+// Close removes all watches and closes the events channel.
+func (w *Watcher) Close() error {
+ return nil
+}
+
+// Add starts watching the named file or directory (non-recursively).
+func (w *Watcher) Add(name string) error {
+ return nil
+}
+
+// Remove stops watching the the named file or directory (non-recursively).
+func (w *Watcher) Remove(name string) error {
+ return nil
+}
diff --git a/vendor/github.com/fsnotify/fsnotify/fsnotify.go b/vendor/github.com/fsnotify/fsnotify/fsnotify.go
index 24c99cc4..89cab046 100644
--- a/vendor/github.com/fsnotify/fsnotify/fsnotify.go
+++ b/vendor/github.com/fsnotify/fsnotify/fsnotify.go
@@ -1,146 +1,68 @@
-// Package fsnotify provides a cross-platform interface for file system
-// notifications.
-//
-// Currently supported systems:
-//
-// Linux 2.6.32+ via inotify
-// BSD, macOS via kqueue
-// Windows via ReadDirectoryChangesW
-// illumos via FEN
+// Copyright 2012 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build !plan9
+
+// Package fsnotify provides a platform-independent interface for file system notifications.
package fsnotify
import (
+ "bytes"
"errors"
"fmt"
- "path/filepath"
- "strings"
)
-// Event represents a file system notification.
+// Event represents a single file system notification.
type Event struct {
- // Path to the file or directory.
- //
- // Paths are relative to the input; for example with Add("dir") the Name
- // will be set to "dir/file" if you create that file, but if you use
- // Add("/path/to/dir") it will be "/path/to/dir/file".
- Name string
-
- // File operation that triggered the event.
- //
- // This is a bitmask and some systems may send multiple operations at once.
- // Use the Event.Has() method instead of comparing with ==.
- Op Op
+ Name string // Relative path to the file or directory.
+ Op Op // File operation that triggered the event.
}
// Op describes a set of file operations.
type Op uint32
-// The operations fsnotify can trigger; see the documentation on [Watcher] for a
-// full description, and check them with [Event.Has].
+// These are the generalized file operations that can trigger a notification.
const (
- // A new pathname was created.
Create Op = 1 << iota
-
- // The pathname was written to; this does *not* mean the write has finished,
- // and a write can be followed by more writes.
Write
-
- // The path was removed; any watches on it will be removed. Some "remove"
- // operations may trigger a Rename if the file is actually moved (for
- // example "remove to trash" is often a rename).
Remove
-
- // The path was renamed to something else; any watched on it will be
- // removed.
Rename
-
- // File attributes were changed.
- //
- // It's generally not recommended to take action on this event, as it may
- // get triggered very frequently by some software. For example, Spotlight
- // indexing on macOS, anti-virus software, backup software, etc.
Chmod
)
-// Common errors that can be reported.
-var (
- ErrNonExistentWatch = errors.New("fsnotify: can't remove non-existent watch")
- ErrEventOverflow = errors.New("fsnotify: queue or buffer overflow")
- ErrClosed = errors.New("fsnotify: watcher already closed")
-)
+func (op Op) String() string {
+ // Use a buffer for efficient string concatenation
+ var buffer bytes.Buffer
-func (o Op) String() string {
- var b strings.Builder
- if o.Has(Create) {
- b.WriteString("|CREATE")
+ if op&Create == Create {
+ buffer.WriteString("|CREATE")
}
- if o.Has(Remove) {
- b.WriteString("|REMOVE")
+ if op&Remove == Remove {
+ buffer.WriteString("|REMOVE")
}
- if o.Has(Write) {
- b.WriteString("|WRITE")
+ if op&Write == Write {
+ buffer.WriteString("|WRITE")
}
- if o.Has(Rename) {
- b.WriteString("|RENAME")
+ if op&Rename == Rename {
+ buffer.WriteString("|RENAME")
}
- if o.Has(Chmod) {
- b.WriteString("|CHMOD")
+ if op&Chmod == Chmod {
+ buffer.WriteString("|CHMOD")
}
- if b.Len() == 0 {
- return "[no events]"
+ if buffer.Len() == 0 {
+ return ""
}
- return b.String()[1:]
+ return buffer.String()[1:] // Strip leading pipe
}
-// Has reports if this operation has the given operation.
-func (o Op) Has(h Op) bool { return o&h != 0 }
-
-// Has reports if this event has the given operation.
-func (e Event) Has(op Op) bool { return e.Op.Has(op) }
-
-// String returns a string representation of the event with their path.
+// String returns a string representation of the event in the form
+// "file: REMOVE|WRITE|..."
func (e Event) String() string {
- return fmt.Sprintf("%-13s %q", e.Op.String(), e.Name)
+ return fmt.Sprintf("%q: %s", e.Name, e.Op.String())
}
-type (
- addOpt func(opt *withOpts)
- withOpts struct {
- bufsize int
- }
+// Common errors that can be reported by a watcher
+var (
+ ErrEventOverflow = errors.New("fsnotify queue overflow")
)
-
-var defaultOpts = withOpts{
- bufsize: 65536, // 64K
-}
-
-func getOptions(opts ...addOpt) withOpts {
- with := defaultOpts
- for _, o := range opts {
- o(&with)
- }
- return with
-}
-
-// WithBufferSize sets the [ReadDirectoryChangesW] buffer size.
-//
-// This only has effect on Windows systems, and is a no-op for other backends.
-//
-// The default value is 64K (65536 bytes) which is the highest value that works
-// on all filesystems and should be enough for most applications, but if you
-// have a large burst of events it may not be enough. You can increase it if
-// you're hitting "queue or buffer overflow" errors ([ErrEventOverflow]).
-//
-// [ReadDirectoryChangesW]: https://learn.microsoft.com/en-gb/windows/win32/api/winbase/nf-winbase-readdirectorychangesw
-func WithBufferSize(bytes int) addOpt {
- return func(opt *withOpts) { opt.bufsize = bytes }
-}
-
-// Check if this path is recursive (ends with "/..." or "\..."), and return the
-// path with the /... stripped.
-func recursivePath(path string) (string, bool) {
- if filepath.Base(path) == "..." {
- return filepath.Dir(path), true
- }
- return path, false
-}
diff --git a/vendor/github.com/fsnotify/fsnotify/inotify.go b/vendor/github.com/fsnotify/fsnotify/inotify.go
new file mode 100644
index 00000000..d9fd1b88
--- /dev/null
+++ b/vendor/github.com/fsnotify/fsnotify/inotify.go
@@ -0,0 +1,337 @@
+// Copyright 2010 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build linux
+
+package fsnotify
+
+import (
+ "errors"
+ "fmt"
+ "io"
+ "os"
+ "path/filepath"
+ "strings"
+ "sync"
+ "unsafe"
+
+ "golang.org/x/sys/unix"
+)
+
+// Watcher watches a set of files, delivering events to a channel.
+type Watcher struct {
+ Events chan Event
+ Errors chan error
+ mu sync.Mutex // Map access
+ fd int
+ poller *fdPoller
+ watches map[string]*watch // Map of inotify watches (key: path)
+ paths map[int]string // Map of watched paths (key: watch descriptor)
+ done chan struct{} // Channel for sending a "quit message" to the reader goroutine
+ doneResp chan struct{} // Channel to respond to Close
+}
+
+// NewWatcher establishes a new watcher with the underlying OS and begins waiting for events.
+func NewWatcher() (*Watcher, error) {
+ // Create inotify fd
+ fd, errno := unix.InotifyInit1(unix.IN_CLOEXEC)
+ if fd == -1 {
+ return nil, errno
+ }
+ // Create epoll
+ poller, err := newFdPoller(fd)
+ if err != nil {
+ unix.Close(fd)
+ return nil, err
+ }
+ w := &Watcher{
+ fd: fd,
+ poller: poller,
+ watches: make(map[string]*watch),
+ paths: make(map[int]string),
+ Events: make(chan Event),
+ Errors: make(chan error),
+ done: make(chan struct{}),
+ doneResp: make(chan struct{}),
+ }
+
+ go w.readEvents()
+ return w, nil
+}
+
+func (w *Watcher) isClosed() bool {
+ select {
+ case <-w.done:
+ return true
+ default:
+ return false
+ }
+}
+
+// Close removes all watches and closes the events channel.
+func (w *Watcher) Close() error {
+ if w.isClosed() {
+ return nil
+ }
+
+ // Send 'close' signal to goroutine, and set the Watcher to closed.
+ close(w.done)
+
+ // Wake up goroutine
+ w.poller.wake()
+
+ // Wait for goroutine to close
+ <-w.doneResp
+
+ return nil
+}
+
+// Add starts watching the named file or directory (non-recursively).
+func (w *Watcher) Add(name string) error {
+ name = filepath.Clean(name)
+ if w.isClosed() {
+ return errors.New("inotify instance already closed")
+ }
+
+ const agnosticEvents = unix.IN_MOVED_TO | unix.IN_MOVED_FROM |
+ unix.IN_CREATE | unix.IN_ATTRIB | unix.IN_MODIFY |
+ unix.IN_MOVE_SELF | unix.IN_DELETE | unix.IN_DELETE_SELF
+
+ var flags uint32 = agnosticEvents
+
+ w.mu.Lock()
+ defer w.mu.Unlock()
+ watchEntry := w.watches[name]
+ if watchEntry != nil {
+ flags |= watchEntry.flags | unix.IN_MASK_ADD
+ }
+ wd, errno := unix.InotifyAddWatch(w.fd, name, flags)
+ if wd == -1 {
+ return errno
+ }
+
+ if watchEntry == nil {
+ w.watches[name] = &watch{wd: uint32(wd), flags: flags}
+ w.paths[wd] = name
+ } else {
+ watchEntry.wd = uint32(wd)
+ watchEntry.flags = flags
+ }
+
+ return nil
+}
+
+// Remove stops watching the named file or directory (non-recursively).
+func (w *Watcher) Remove(name string) error {
+ name = filepath.Clean(name)
+
+ // Fetch the watch.
+ w.mu.Lock()
+ defer w.mu.Unlock()
+ watch, ok := w.watches[name]
+
+ // Remove it from inotify.
+ if !ok {
+ return fmt.Errorf("can't remove non-existent inotify watch for: %s", name)
+ }
+
+ // We successfully removed the watch if InotifyRmWatch doesn't return an
+ // error, we need to clean up our internal state to ensure it matches
+ // inotify's kernel state.
+ delete(w.paths, int(watch.wd))
+ delete(w.watches, name)
+
+ // inotify_rm_watch will return EINVAL if the file has been deleted;
+ // the inotify will already have been removed.
+ // watches and pathes are deleted in ignoreLinux() implicitly and asynchronously
+ // by calling inotify_rm_watch() below. e.g. readEvents() goroutine receives IN_IGNORE
+ // so that EINVAL means that the wd is being rm_watch()ed or its file removed
+ // by another thread and we have not received IN_IGNORE event.
+ success, errno := unix.InotifyRmWatch(w.fd, watch.wd)
+ if success == -1 {
+ // TODO: Perhaps it's not helpful to return an error here in every case.
+ // the only two possible errors are:
+ // EBADF, which happens when w.fd is not a valid file descriptor of any kind.
+ // EINVAL, which is when fd is not an inotify descriptor or wd is not a valid watch descriptor.
+ // Watch descriptors are invalidated when they are removed explicitly or implicitly;
+ // explicitly by inotify_rm_watch, implicitly when the file they are watching is deleted.
+ return errno
+ }
+
+ return nil
+}
+
+type watch struct {
+ wd uint32 // Watch descriptor (as returned by the inotify_add_watch() syscall)
+ flags uint32 // inotify flags of this watch (see inotify(7) for the list of valid flags)
+}
+
+// readEvents reads from the inotify file descriptor, converts the
+// received events into Event objects and sends them via the Events channel
+func (w *Watcher) readEvents() {
+ var (
+ buf [unix.SizeofInotifyEvent * 4096]byte // Buffer for a maximum of 4096 raw events
+ n int // Number of bytes read with read()
+ errno error // Syscall errno
+ ok bool // For poller.wait
+ )
+
+ defer close(w.doneResp)
+ defer close(w.Errors)
+ defer close(w.Events)
+ defer unix.Close(w.fd)
+ defer w.poller.close()
+
+ for {
+ // See if we have been closed.
+ if w.isClosed() {
+ return
+ }
+
+ ok, errno = w.poller.wait()
+ if errno != nil {
+ select {
+ case w.Errors <- errno:
+ case <-w.done:
+ return
+ }
+ continue
+ }
+
+ if !ok {
+ continue
+ }
+
+ n, errno = unix.Read(w.fd, buf[:])
+ // If a signal interrupted execution, see if we've been asked to close, and try again.
+ // http://man7.org/linux/man-pages/man7/signal.7.html :
+ // "Before Linux 3.8, reads from an inotify(7) file descriptor were not restartable"
+ if errno == unix.EINTR {
+ continue
+ }
+
+ // unix.Read might have been woken up by Close. If so, we're done.
+ if w.isClosed() {
+ return
+ }
+
+ if n < unix.SizeofInotifyEvent {
+ var err error
+ if n == 0 {
+ // If EOF is received. This should really never happen.
+ err = io.EOF
+ } else if n < 0 {
+ // If an error occurred while reading.
+ err = errno
+ } else {
+ // Read was too short.
+ err = errors.New("notify: short read in readEvents()")
+ }
+ select {
+ case w.Errors <- err:
+ case <-w.done:
+ return
+ }
+ continue
+ }
+
+ var offset uint32
+ // We don't know how many events we just read into the buffer
+ // While the offset points to at least one whole event...
+ for offset <= uint32(n-unix.SizeofInotifyEvent) {
+ // Point "raw" to the event in the buffer
+ raw := (*unix.InotifyEvent)(unsafe.Pointer(&buf[offset]))
+
+ mask := uint32(raw.Mask)
+ nameLen := uint32(raw.Len)
+
+ if mask&unix.IN_Q_OVERFLOW != 0 {
+ select {
+ case w.Errors <- ErrEventOverflow:
+ case <-w.done:
+ return
+ }
+ }
+
+ // If the event happened to the watched directory or the watched file, the kernel
+ // doesn't append the filename to the event, but we would like to always fill the
+ // the "Name" field with a valid filename. We retrieve the path of the watch from
+ // the "paths" map.
+ w.mu.Lock()
+ name, ok := w.paths[int(raw.Wd)]
+ // IN_DELETE_SELF occurs when the file/directory being watched is removed.
+ // This is a sign to clean up the maps, otherwise we are no longer in sync
+ // with the inotify kernel state which has already deleted the watch
+ // automatically.
+ if ok && mask&unix.IN_DELETE_SELF == unix.IN_DELETE_SELF {
+ delete(w.paths, int(raw.Wd))
+ delete(w.watches, name)
+ }
+ w.mu.Unlock()
+
+ if nameLen > 0 {
+ // Point "bytes" at the first byte of the filename
+ bytes := (*[unix.PathMax]byte)(unsafe.Pointer(&buf[offset+unix.SizeofInotifyEvent]))
+ // The filename is padded with NULL bytes. TrimRight() gets rid of those.
+ name += "/" + strings.TrimRight(string(bytes[0:nameLen]), "\000")
+ }
+
+ event := newEvent(name, mask)
+
+ // Send the events that are not ignored on the events channel
+ if !event.ignoreLinux(mask) {
+ select {
+ case w.Events <- event:
+ case <-w.done:
+ return
+ }
+ }
+
+ // Move to the next event in the buffer
+ offset += unix.SizeofInotifyEvent + nameLen
+ }
+ }
+}
+
+// Certain types of events can be "ignored" and not sent over the Events
+// channel. Such as events marked ignore by the kernel, or MODIFY events
+// against files that do not exist.
+func (e *Event) ignoreLinux(mask uint32) bool {
+ // Ignore anything the inotify API says to ignore
+ if mask&unix.IN_IGNORED == unix.IN_IGNORED {
+ return true
+ }
+
+ // If the event is not a DELETE or RENAME, the file must exist.
+ // Otherwise the event is ignored.
+ // *Note*: this was put in place because it was seen that a MODIFY
+ // event was sent after the DELETE. This ignores that MODIFY and
+ // assumes a DELETE will come or has come if the file doesn't exist.
+ if !(e.Op&Remove == Remove || e.Op&Rename == Rename) {
+ _, statErr := os.Lstat(e.Name)
+ return os.IsNotExist(statErr)
+ }
+ return false
+}
+
+// newEvent returns an platform-independent Event based on an inotify mask.
+func newEvent(name string, mask uint32) Event {
+ e := Event{Name: name}
+ if mask&unix.IN_CREATE == unix.IN_CREATE || mask&unix.IN_MOVED_TO == unix.IN_MOVED_TO {
+ e.Op |= Create
+ }
+ if mask&unix.IN_DELETE_SELF == unix.IN_DELETE_SELF || mask&unix.IN_DELETE == unix.IN_DELETE {
+ e.Op |= Remove
+ }
+ if mask&unix.IN_MODIFY == unix.IN_MODIFY {
+ e.Op |= Write
+ }
+ if mask&unix.IN_MOVE_SELF == unix.IN_MOVE_SELF || mask&unix.IN_MOVED_FROM == unix.IN_MOVED_FROM {
+ e.Op |= Rename
+ }
+ if mask&unix.IN_ATTRIB == unix.IN_ATTRIB {
+ e.Op |= Chmod
+ }
+ return e
+}
diff --git a/vendor/github.com/fsnotify/fsnotify/inotify_poller.go b/vendor/github.com/fsnotify/fsnotify/inotify_poller.go
new file mode 100644
index 00000000..b33f2b4d
--- /dev/null
+++ b/vendor/github.com/fsnotify/fsnotify/inotify_poller.go
@@ -0,0 +1,187 @@
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build linux
+
+package fsnotify
+
+import (
+ "errors"
+
+ "golang.org/x/sys/unix"
+)
+
+type fdPoller struct {
+ fd int // File descriptor (as returned by the inotify_init() syscall)
+ epfd int // Epoll file descriptor
+ pipe [2]int // Pipe for waking up
+}
+
+func emptyPoller(fd int) *fdPoller {
+ poller := new(fdPoller)
+ poller.fd = fd
+ poller.epfd = -1
+ poller.pipe[0] = -1
+ poller.pipe[1] = -1
+ return poller
+}
+
+// Create a new inotify poller.
+// This creates an inotify handler, and an epoll handler.
+func newFdPoller(fd int) (*fdPoller, error) {
+ var errno error
+ poller := emptyPoller(fd)
+ defer func() {
+ if errno != nil {
+ poller.close()
+ }
+ }()
+ poller.fd = fd
+
+ // Create epoll fd
+ poller.epfd, errno = unix.EpollCreate1(unix.EPOLL_CLOEXEC)
+ if poller.epfd == -1 {
+ return nil, errno
+ }
+ // Create pipe; pipe[0] is the read end, pipe[1] the write end.
+ errno = unix.Pipe2(poller.pipe[:], unix.O_NONBLOCK|unix.O_CLOEXEC)
+ if errno != nil {
+ return nil, errno
+ }
+
+ // Register inotify fd with epoll
+ event := unix.EpollEvent{
+ Fd: int32(poller.fd),
+ Events: unix.EPOLLIN,
+ }
+ errno = unix.EpollCtl(poller.epfd, unix.EPOLL_CTL_ADD, poller.fd, &event)
+ if errno != nil {
+ return nil, errno
+ }
+
+ // Register pipe fd with epoll
+ event = unix.EpollEvent{
+ Fd: int32(poller.pipe[0]),
+ Events: unix.EPOLLIN,
+ }
+ errno = unix.EpollCtl(poller.epfd, unix.EPOLL_CTL_ADD, poller.pipe[0], &event)
+ if errno != nil {
+ return nil, errno
+ }
+
+ return poller, nil
+}
+
+// Wait using epoll.
+// Returns true if something is ready to be read,
+// false if there is not.
+func (poller *fdPoller) wait() (bool, error) {
+ // 3 possible events per fd, and 2 fds, makes a maximum of 6 events.
+ // I don't know whether epoll_wait returns the number of events returned,
+ // or the total number of events ready.
+ // I decided to catch both by making the buffer one larger than the maximum.
+ events := make([]unix.EpollEvent, 7)
+ for {
+ n, errno := unix.EpollWait(poller.epfd, events, -1)
+ if n == -1 {
+ if errno == unix.EINTR {
+ continue
+ }
+ return false, errno
+ }
+ if n == 0 {
+ // If there are no events, try again.
+ continue
+ }
+ if n > 6 {
+ // This should never happen. More events were returned than should be possible.
+ return false, errors.New("epoll_wait returned more events than I know what to do with")
+ }
+ ready := events[:n]
+ epollhup := false
+ epollerr := false
+ epollin := false
+ for _, event := range ready {
+ if event.Fd == int32(poller.fd) {
+ if event.Events&unix.EPOLLHUP != 0 {
+ // This should not happen, but if it does, treat it as a wakeup.
+ epollhup = true
+ }
+ if event.Events&unix.EPOLLERR != 0 {
+ // If an error is waiting on the file descriptor, we should pretend
+ // something is ready to read, and let unix.Read pick up the error.
+ epollerr = true
+ }
+ if event.Events&unix.EPOLLIN != 0 {
+ // There is data to read.
+ epollin = true
+ }
+ }
+ if event.Fd == int32(poller.pipe[0]) {
+ if event.Events&unix.EPOLLHUP != 0 {
+ // Write pipe descriptor was closed, by us. This means we're closing down the
+ // watcher, and we should wake up.
+ }
+ if event.Events&unix.EPOLLERR != 0 {
+ // If an error is waiting on the pipe file descriptor.
+ // This is an absolute mystery, and should never ever happen.
+ return false, errors.New("Error on the pipe descriptor.")
+ }
+ if event.Events&unix.EPOLLIN != 0 {
+ // This is a regular wakeup, so we have to clear the buffer.
+ err := poller.clearWake()
+ if err != nil {
+ return false, err
+ }
+ }
+ }
+ }
+
+ if epollhup || epollerr || epollin {
+ return true, nil
+ }
+ return false, nil
+ }
+}
+
+// Close the write end of the poller.
+func (poller *fdPoller) wake() error {
+ buf := make([]byte, 1)
+ n, errno := unix.Write(poller.pipe[1], buf)
+ if n == -1 {
+ if errno == unix.EAGAIN {
+ // Buffer is full, poller will wake.
+ return nil
+ }
+ return errno
+ }
+ return nil
+}
+
+func (poller *fdPoller) clearWake() error {
+ // You have to be woken up a LOT in order to get to 100!
+ buf := make([]byte, 100)
+ n, errno := unix.Read(poller.pipe[0], buf)
+ if n == -1 {
+ if errno == unix.EAGAIN {
+ // Buffer is empty, someone else cleared our wake.
+ return nil
+ }
+ return errno
+ }
+ return nil
+}
+
+// Close all poller file descriptors, but not the one passed to it.
+func (poller *fdPoller) close() {
+ if poller.pipe[1] != -1 {
+ unix.Close(poller.pipe[1])
+ }
+ if poller.pipe[0] != -1 {
+ unix.Close(poller.pipe[0])
+ }
+ if poller.epfd != -1 {
+ unix.Close(poller.epfd)
+ }
+}
diff --git a/vendor/github.com/fsnotify/fsnotify/kqueue.go b/vendor/github.com/fsnotify/fsnotify/kqueue.go
new file mode 100644
index 00000000..86e76a3d
--- /dev/null
+++ b/vendor/github.com/fsnotify/fsnotify/kqueue.go
@@ -0,0 +1,521 @@
+// Copyright 2010 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build freebsd openbsd netbsd dragonfly darwin
+
+package fsnotify
+
+import (
+ "errors"
+ "fmt"
+ "io/ioutil"
+ "os"
+ "path/filepath"
+ "sync"
+ "time"
+
+ "golang.org/x/sys/unix"
+)
+
+// Watcher watches a set of files, delivering events to a channel.
+type Watcher struct {
+ Events chan Event
+ Errors chan error
+ done chan struct{} // Channel for sending a "quit message" to the reader goroutine
+
+ kq int // File descriptor (as returned by the kqueue() syscall).
+
+ mu sync.Mutex // Protects access to watcher data
+ watches map[string]int // Map of watched file descriptors (key: path).
+ externalWatches map[string]bool // Map of watches added by user of the library.
+ dirFlags map[string]uint32 // Map of watched directories to fflags used in kqueue.
+ paths map[int]pathInfo // Map file descriptors to path names for processing kqueue events.
+ fileExists map[string]bool // Keep track of if we know this file exists (to stop duplicate create events).
+ isClosed bool // Set to true when Close() is first called
+}
+
+type pathInfo struct {
+ name string
+ isDir bool
+}
+
+// NewWatcher establishes a new watcher with the underlying OS and begins waiting for events.
+func NewWatcher() (*Watcher, error) {
+ kq, err := kqueue()
+ if err != nil {
+ return nil, err
+ }
+
+ w := &Watcher{
+ kq: kq,
+ watches: make(map[string]int),
+ dirFlags: make(map[string]uint32),
+ paths: make(map[int]pathInfo),
+ fileExists: make(map[string]bool),
+ externalWatches: make(map[string]bool),
+ Events: make(chan Event),
+ Errors: make(chan error),
+ done: make(chan struct{}),
+ }
+
+ go w.readEvents()
+ return w, nil
+}
+
+// Close removes all watches and closes the events channel.
+func (w *Watcher) Close() error {
+ w.mu.Lock()
+ if w.isClosed {
+ w.mu.Unlock()
+ return nil
+ }
+ w.isClosed = true
+
+ // copy paths to remove while locked
+ var pathsToRemove = make([]string, 0, len(w.watches))
+ for name := range w.watches {
+ pathsToRemove = append(pathsToRemove, name)
+ }
+ w.mu.Unlock()
+ // unlock before calling Remove, which also locks
+
+ for _, name := range pathsToRemove {
+ w.Remove(name)
+ }
+
+ // send a "quit" message to the reader goroutine
+ close(w.done)
+
+ return nil
+}
+
+// Add starts watching the named file or directory (non-recursively).
+func (w *Watcher) Add(name string) error {
+ w.mu.Lock()
+ w.externalWatches[name] = true
+ w.mu.Unlock()
+ _, err := w.addWatch(name, noteAllEvents)
+ return err
+}
+
+// Remove stops watching the the named file or directory (non-recursively).
+func (w *Watcher) Remove(name string) error {
+ name = filepath.Clean(name)
+ w.mu.Lock()
+ watchfd, ok := w.watches[name]
+ w.mu.Unlock()
+ if !ok {
+ return fmt.Errorf("can't remove non-existent kevent watch for: %s", name)
+ }
+
+ const registerRemove = unix.EV_DELETE
+ if err := register(w.kq, []int{watchfd}, registerRemove, 0); err != nil {
+ return err
+ }
+
+ unix.Close(watchfd)
+
+ w.mu.Lock()
+ isDir := w.paths[watchfd].isDir
+ delete(w.watches, name)
+ delete(w.paths, watchfd)
+ delete(w.dirFlags, name)
+ w.mu.Unlock()
+
+ // Find all watched paths that are in this directory that are not external.
+ if isDir {
+ var pathsToRemove []string
+ w.mu.Lock()
+ for _, path := range w.paths {
+ wdir, _ := filepath.Split(path.name)
+ if filepath.Clean(wdir) == name {
+ if !w.externalWatches[path.name] {
+ pathsToRemove = append(pathsToRemove, path.name)
+ }
+ }
+ }
+ w.mu.Unlock()
+ for _, name := range pathsToRemove {
+ // Since these are internal, not much sense in propagating error
+ // to the user, as that will just confuse them with an error about
+ // a path they did not explicitly watch themselves.
+ w.Remove(name)
+ }
+ }
+
+ return nil
+}
+
+// Watch all events (except NOTE_EXTEND, NOTE_LINK, NOTE_REVOKE)
+const noteAllEvents = unix.NOTE_DELETE | unix.NOTE_WRITE | unix.NOTE_ATTRIB | unix.NOTE_RENAME
+
+// keventWaitTime to block on each read from kevent
+var keventWaitTime = durationToTimespec(100 * time.Millisecond)
+
+// addWatch adds name to the watched file set.
+// The flags are interpreted as described in kevent(2).
+// Returns the real path to the file which was added, if any, which may be different from the one passed in the case of symlinks.
+func (w *Watcher) addWatch(name string, flags uint32) (string, error) {
+ var isDir bool
+ // Make ./name and name equivalent
+ name = filepath.Clean(name)
+
+ w.mu.Lock()
+ if w.isClosed {
+ w.mu.Unlock()
+ return "", errors.New("kevent instance already closed")
+ }
+ watchfd, alreadyWatching := w.watches[name]
+ // We already have a watch, but we can still override flags.
+ if alreadyWatching {
+ isDir = w.paths[watchfd].isDir
+ }
+ w.mu.Unlock()
+
+ if !alreadyWatching {
+ fi, err := os.Lstat(name)
+ if err != nil {
+ return "", err
+ }
+
+ // Don't watch sockets.
+ if fi.Mode()&os.ModeSocket == os.ModeSocket {
+ return "", nil
+ }
+
+ // Don't watch named pipes.
+ if fi.Mode()&os.ModeNamedPipe == os.ModeNamedPipe {
+ return "", nil
+ }
+
+ // Follow Symlinks
+ // Unfortunately, Linux can add bogus symlinks to watch list without
+ // issue, and Windows can't do symlinks period (AFAIK). To maintain
+ // consistency, we will act like everything is fine. There will simply
+ // be no file events for broken symlinks.
+ // Hence the returns of nil on errors.
+ if fi.Mode()&os.ModeSymlink == os.ModeSymlink {
+ name, err = filepath.EvalSymlinks(name)
+ if err != nil {
+ return "", nil
+ }
+
+ w.mu.Lock()
+ _, alreadyWatching = w.watches[name]
+ w.mu.Unlock()
+
+ if alreadyWatching {
+ return name, nil
+ }
+
+ fi, err = os.Lstat(name)
+ if err != nil {
+ return "", nil
+ }
+ }
+
+ watchfd, err = unix.Open(name, openMode, 0700)
+ if watchfd == -1 {
+ return "", err
+ }
+
+ isDir = fi.IsDir()
+ }
+
+ const registerAdd = unix.EV_ADD | unix.EV_CLEAR | unix.EV_ENABLE
+ if err := register(w.kq, []int{watchfd}, registerAdd, flags); err != nil {
+ unix.Close(watchfd)
+ return "", err
+ }
+
+ if !alreadyWatching {
+ w.mu.Lock()
+ w.watches[name] = watchfd
+ w.paths[watchfd] = pathInfo{name: name, isDir: isDir}
+ w.mu.Unlock()
+ }
+
+ if isDir {
+ // Watch the directory if it has not been watched before,
+ // or if it was watched before, but perhaps only a NOTE_DELETE (watchDirectoryFiles)
+ w.mu.Lock()
+
+ watchDir := (flags&unix.NOTE_WRITE) == unix.NOTE_WRITE &&
+ (!alreadyWatching || (w.dirFlags[name]&unix.NOTE_WRITE) != unix.NOTE_WRITE)
+ // Store flags so this watch can be updated later
+ w.dirFlags[name] = flags
+ w.mu.Unlock()
+
+ if watchDir {
+ if err := w.watchDirectoryFiles(name); err != nil {
+ return "", err
+ }
+ }
+ }
+ return name, nil
+}
+
+// readEvents reads from kqueue and converts the received kevents into
+// Event values that it sends down the Events channel.
+func (w *Watcher) readEvents() {
+ eventBuffer := make([]unix.Kevent_t, 10)
+
+loop:
+ for {
+ // See if there is a message on the "done" channel
+ select {
+ case <-w.done:
+ break loop
+ default:
+ }
+
+ // Get new events
+ kevents, err := read(w.kq, eventBuffer, &keventWaitTime)
+ // EINTR is okay, the syscall was interrupted before timeout expired.
+ if err != nil && err != unix.EINTR {
+ select {
+ case w.Errors <- err:
+ case <-w.done:
+ break loop
+ }
+ continue
+ }
+
+ // Flush the events we received to the Events channel
+ for len(kevents) > 0 {
+ kevent := &kevents[0]
+ watchfd := int(kevent.Ident)
+ mask := uint32(kevent.Fflags)
+ w.mu.Lock()
+ path := w.paths[watchfd]
+ w.mu.Unlock()
+ event := newEvent(path.name, mask)
+
+ if path.isDir && !(event.Op&Remove == Remove) {
+ // Double check to make sure the directory exists. This can happen when
+ // we do a rm -fr on a recursively watched folders and we receive a
+ // modification event first but the folder has been deleted and later
+ // receive the delete event
+ if _, err := os.Lstat(event.Name); os.IsNotExist(err) {
+ // mark is as delete event
+ event.Op |= Remove
+ }
+ }
+
+ if event.Op&Rename == Rename || event.Op&Remove == Remove {
+ w.Remove(event.Name)
+ w.mu.Lock()
+ delete(w.fileExists, event.Name)
+ w.mu.Unlock()
+ }
+
+ if path.isDir && event.Op&Write == Write && !(event.Op&Remove == Remove) {
+ w.sendDirectoryChangeEvents(event.Name)
+ } else {
+ // Send the event on the Events channel.
+ select {
+ case w.Events <- event:
+ case <-w.done:
+ break loop
+ }
+ }
+
+ if event.Op&Remove == Remove {
+ // Look for a file that may have overwritten this.
+ // For example, mv f1 f2 will delete f2, then create f2.
+ if path.isDir {
+ fileDir := filepath.Clean(event.Name)
+ w.mu.Lock()
+ _, found := w.watches[fileDir]
+ w.mu.Unlock()
+ if found {
+ // make sure the directory exists before we watch for changes. When we
+ // do a recursive watch and perform rm -fr, the parent directory might
+ // have gone missing, ignore the missing directory and let the
+ // upcoming delete event remove the watch from the parent directory.
+ if _, err := os.Lstat(fileDir); err == nil {
+ w.sendDirectoryChangeEvents(fileDir)
+ }
+ }
+ } else {
+ filePath := filepath.Clean(event.Name)
+ if fileInfo, err := os.Lstat(filePath); err == nil {
+ w.sendFileCreatedEventIfNew(filePath, fileInfo)
+ }
+ }
+ }
+
+ // Move to next event
+ kevents = kevents[1:]
+ }
+ }
+
+ // cleanup
+ err := unix.Close(w.kq)
+ if err != nil {
+ // only way the previous loop breaks is if w.done was closed so we need to async send to w.Errors.
+ select {
+ case w.Errors <- err:
+ default:
+ }
+ }
+ close(w.Events)
+ close(w.Errors)
+}
+
+// newEvent returns an platform-independent Event based on kqueue Fflags.
+func newEvent(name string, mask uint32) Event {
+ e := Event{Name: name}
+ if mask&unix.NOTE_DELETE == unix.NOTE_DELETE {
+ e.Op |= Remove
+ }
+ if mask&unix.NOTE_WRITE == unix.NOTE_WRITE {
+ e.Op |= Write
+ }
+ if mask&unix.NOTE_RENAME == unix.NOTE_RENAME {
+ e.Op |= Rename
+ }
+ if mask&unix.NOTE_ATTRIB == unix.NOTE_ATTRIB {
+ e.Op |= Chmod
+ }
+ return e
+}
+
+func newCreateEvent(name string) Event {
+ return Event{Name: name, Op: Create}
+}
+
+// watchDirectoryFiles to mimic inotify when adding a watch on a directory
+func (w *Watcher) watchDirectoryFiles(dirPath string) error {
+ // Get all files
+ files, err := ioutil.ReadDir(dirPath)
+ if err != nil {
+ return err
+ }
+
+ for _, fileInfo := range files {
+ filePath := filepath.Join(dirPath, fileInfo.Name())
+ filePath, err = w.internalWatch(filePath, fileInfo)
+ if err != nil {
+ return err
+ }
+
+ w.mu.Lock()
+ w.fileExists[filePath] = true
+ w.mu.Unlock()
+ }
+
+ return nil
+}
+
+// sendDirectoryEvents searches the directory for newly created files
+// and sends them over the event channel. This functionality is to have
+// the BSD version of fsnotify match Linux inotify which provides a
+// create event for files created in a watched directory.
+func (w *Watcher) sendDirectoryChangeEvents(dirPath string) {
+ // Get all files
+ files, err := ioutil.ReadDir(dirPath)
+ if err != nil {
+ select {
+ case w.Errors <- err:
+ case <-w.done:
+ return
+ }
+ }
+
+ // Search for new files
+ for _, fileInfo := range files {
+ filePath := filepath.Join(dirPath, fileInfo.Name())
+ err := w.sendFileCreatedEventIfNew(filePath, fileInfo)
+
+ if err != nil {
+ return
+ }
+ }
+}
+
+// sendFileCreatedEvent sends a create event if the file isn't already being tracked.
+func (w *Watcher) sendFileCreatedEventIfNew(filePath string, fileInfo os.FileInfo) (err error) {
+ w.mu.Lock()
+ _, doesExist := w.fileExists[filePath]
+ w.mu.Unlock()
+ if !doesExist {
+ // Send create event
+ select {
+ case w.Events <- newCreateEvent(filePath):
+ case <-w.done:
+ return
+ }
+ }
+
+ // like watchDirectoryFiles (but without doing another ReadDir)
+ filePath, err = w.internalWatch(filePath, fileInfo)
+ if err != nil {
+ return err
+ }
+
+ w.mu.Lock()
+ w.fileExists[filePath] = true
+ w.mu.Unlock()
+
+ return nil
+}
+
+func (w *Watcher) internalWatch(name string, fileInfo os.FileInfo) (string, error) {
+ if fileInfo.IsDir() {
+ // mimic Linux providing delete events for subdirectories
+ // but preserve the flags used if currently watching subdirectory
+ w.mu.Lock()
+ flags := w.dirFlags[name]
+ w.mu.Unlock()
+
+ flags |= unix.NOTE_DELETE | unix.NOTE_RENAME
+ return w.addWatch(name, flags)
+ }
+
+ // watch file to mimic Linux inotify
+ return w.addWatch(name, noteAllEvents)
+}
+
+// kqueue creates a new kernel event queue and returns a descriptor.
+func kqueue() (kq int, err error) {
+ kq, err = unix.Kqueue()
+ if kq == -1 {
+ return kq, err
+ }
+ return kq, nil
+}
+
+// register events with the queue
+func register(kq int, fds []int, flags int, fflags uint32) error {
+ changes := make([]unix.Kevent_t, len(fds))
+
+ for i, fd := range fds {
+ // SetKevent converts int to the platform-specific types:
+ unix.SetKevent(&changes[i], fd, unix.EVFILT_VNODE, flags)
+ changes[i].Fflags = fflags
+ }
+
+ // register the events
+ success, err := unix.Kevent(kq, changes, nil, nil)
+ if success == -1 {
+ return err
+ }
+ return nil
+}
+
+// read retrieves pending events, or waits until an event occurs.
+// A timeout of nil blocks indefinitely, while 0 polls the queue.
+func read(kq int, events []unix.Kevent_t, timeout *unix.Timespec) ([]unix.Kevent_t, error) {
+ n, err := unix.Kevent(kq, nil, events, timeout)
+ if err != nil {
+ return nil, err
+ }
+ return events[0:n], nil
+}
+
+// durationToTimespec prepares a timeout value
+func durationToTimespec(d time.Duration) unix.Timespec {
+ return unix.NsecToTimespec(d.Nanoseconds())
+}
diff --git a/vendor/github.com/fsnotify/fsnotify/mkdoc.zsh b/vendor/github.com/fsnotify/fsnotify/mkdoc.zsh
deleted file mode 100644
index 99012ae6..00000000
--- a/vendor/github.com/fsnotify/fsnotify/mkdoc.zsh
+++ /dev/null
@@ -1,259 +0,0 @@
-#!/usr/bin/env zsh
-[ "${ZSH_VERSION:-}" = "" ] && echo >&2 "Only works with zsh" && exit 1
-setopt err_exit no_unset pipefail extended_glob
-
-# Simple script to update the godoc comments on all watchers so you don't need
-# to update the same comment 5 times.
-
-watcher=$(</tmp/x
- print -r -- $cmt >>/tmp/x
- tail -n+$(( end + 1 )) $file >>/tmp/x
- mv /tmp/x $file
- done
-}
-
-set-cmt '^type Watcher struct ' $watcher
-set-cmt '^func NewWatcher(' $new
-set-cmt '^func NewBufferedWatcher(' $newbuffered
-set-cmt '^func (w \*Watcher) Add(' $add
-set-cmt '^func (w \*Watcher) AddWith(' $addwith
-set-cmt '^func (w \*Watcher) Remove(' $remove
-set-cmt '^func (w \*Watcher) Close(' $close
-set-cmt '^func (w \*Watcher) WatchList(' $watchlist
-set-cmt '^[[:space:]]*Events *chan Event$' $events
-set-cmt '^[[:space:]]*Errors *chan error$' $errors
diff --git a/vendor/github.com/fsnotify/fsnotify/system_bsd.go b/vendor/github.com/fsnotify/fsnotify/open_mode_bsd.go
similarity index 50%
rename from vendor/github.com/fsnotify/fsnotify/system_bsd.go
rename to vendor/github.com/fsnotify/fsnotify/open_mode_bsd.go
index 4322b0b8..2306c462 100644
--- a/vendor/github.com/fsnotify/fsnotify/system_bsd.go
+++ b/vendor/github.com/fsnotify/fsnotify/open_mode_bsd.go
@@ -1,4 +1,7 @@
-//go:build freebsd || openbsd || netbsd || dragonfly
+// Copyright 2013 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
// +build freebsd openbsd netbsd dragonfly
package fsnotify
diff --git a/vendor/github.com/fsnotify/fsnotify/system_darwin.go b/vendor/github.com/fsnotify/fsnotify/open_mode_darwin.go
similarity index 50%
rename from vendor/github.com/fsnotify/fsnotify/system_darwin.go
rename to vendor/github.com/fsnotify/fsnotify/open_mode_darwin.go
index 5da5ffa7..870c4d6d 100644
--- a/vendor/github.com/fsnotify/fsnotify/system_darwin.go
+++ b/vendor/github.com/fsnotify/fsnotify/open_mode_darwin.go
@@ -1,4 +1,7 @@
-//go:build darwin
+// Copyright 2013 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
// +build darwin
package fsnotify
diff --git a/vendor/github.com/fsnotify/fsnotify/windows.go b/vendor/github.com/fsnotify/fsnotify/windows.go
new file mode 100644
index 00000000..09436f31
--- /dev/null
+++ b/vendor/github.com/fsnotify/fsnotify/windows.go
@@ -0,0 +1,561 @@
+// Copyright 2011 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build windows
+
+package fsnotify
+
+import (
+ "errors"
+ "fmt"
+ "os"
+ "path/filepath"
+ "runtime"
+ "sync"
+ "syscall"
+ "unsafe"
+)
+
+// Watcher watches a set of files, delivering events to a channel.
+type Watcher struct {
+ Events chan Event
+ Errors chan error
+ isClosed bool // Set to true when Close() is first called
+ mu sync.Mutex // Map access
+ port syscall.Handle // Handle to completion port
+ watches watchMap // Map of watches (key: i-number)
+ input chan *input // Inputs to the reader are sent on this channel
+ quit chan chan<- error
+}
+
+// NewWatcher establishes a new watcher with the underlying OS and begins waiting for events.
+func NewWatcher() (*Watcher, error) {
+ port, e := syscall.CreateIoCompletionPort(syscall.InvalidHandle, 0, 0, 0)
+ if e != nil {
+ return nil, os.NewSyscallError("CreateIoCompletionPort", e)
+ }
+ w := &Watcher{
+ port: port,
+ watches: make(watchMap),
+ input: make(chan *input, 1),
+ Events: make(chan Event, 50),
+ Errors: make(chan error),
+ quit: make(chan chan<- error, 1),
+ }
+ go w.readEvents()
+ return w, nil
+}
+
+// Close removes all watches and closes the events channel.
+func (w *Watcher) Close() error {
+ if w.isClosed {
+ return nil
+ }
+ w.isClosed = true
+
+ // Send "quit" message to the reader goroutine
+ ch := make(chan error)
+ w.quit <- ch
+ if err := w.wakeupReader(); err != nil {
+ return err
+ }
+ return <-ch
+}
+
+// Add starts watching the named file or directory (non-recursively).
+func (w *Watcher) Add(name string) error {
+ if w.isClosed {
+ return errors.New("watcher already closed")
+ }
+ in := &input{
+ op: opAddWatch,
+ path: filepath.Clean(name),
+ flags: sysFSALLEVENTS,
+ reply: make(chan error),
+ }
+ w.input <- in
+ if err := w.wakeupReader(); err != nil {
+ return err
+ }
+ return <-in.reply
+}
+
+// Remove stops watching the the named file or directory (non-recursively).
+func (w *Watcher) Remove(name string) error {
+ in := &input{
+ op: opRemoveWatch,
+ path: filepath.Clean(name),
+ reply: make(chan error),
+ }
+ w.input <- in
+ if err := w.wakeupReader(); err != nil {
+ return err
+ }
+ return <-in.reply
+}
+
+const (
+ // Options for AddWatch
+ sysFSONESHOT = 0x80000000
+ sysFSONLYDIR = 0x1000000
+
+ // Events
+ sysFSACCESS = 0x1
+ sysFSALLEVENTS = 0xfff
+ sysFSATTRIB = 0x4
+ sysFSCLOSE = 0x18
+ sysFSCREATE = 0x100
+ sysFSDELETE = 0x200
+ sysFSDELETESELF = 0x400
+ sysFSMODIFY = 0x2
+ sysFSMOVE = 0xc0
+ sysFSMOVEDFROM = 0x40
+ sysFSMOVEDTO = 0x80
+ sysFSMOVESELF = 0x800
+
+ // Special events
+ sysFSIGNORED = 0x8000
+ sysFSQOVERFLOW = 0x4000
+)
+
+func newEvent(name string, mask uint32) Event {
+ e := Event{Name: name}
+ if mask&sysFSCREATE == sysFSCREATE || mask&sysFSMOVEDTO == sysFSMOVEDTO {
+ e.Op |= Create
+ }
+ if mask&sysFSDELETE == sysFSDELETE || mask&sysFSDELETESELF == sysFSDELETESELF {
+ e.Op |= Remove
+ }
+ if mask&sysFSMODIFY == sysFSMODIFY {
+ e.Op |= Write
+ }
+ if mask&sysFSMOVE == sysFSMOVE || mask&sysFSMOVESELF == sysFSMOVESELF || mask&sysFSMOVEDFROM == sysFSMOVEDFROM {
+ e.Op |= Rename
+ }
+ if mask&sysFSATTRIB == sysFSATTRIB {
+ e.Op |= Chmod
+ }
+ return e
+}
+
+const (
+ opAddWatch = iota
+ opRemoveWatch
+)
+
+const (
+ provisional uint64 = 1 << (32 + iota)
+)
+
+type input struct {
+ op int
+ path string
+ flags uint32
+ reply chan error
+}
+
+type inode struct {
+ handle syscall.Handle
+ volume uint32
+ index uint64
+}
+
+type watch struct {
+ ov syscall.Overlapped
+ ino *inode // i-number
+ path string // Directory path
+ mask uint64 // Directory itself is being watched with these notify flags
+ names map[string]uint64 // Map of names being watched and their notify flags
+ rename string // Remembers the old name while renaming a file
+ buf [4096]byte
+}
+
+type indexMap map[uint64]*watch
+type watchMap map[uint32]indexMap
+
+func (w *Watcher) wakeupReader() error {
+ e := syscall.PostQueuedCompletionStatus(w.port, 0, 0, nil)
+ if e != nil {
+ return os.NewSyscallError("PostQueuedCompletionStatus", e)
+ }
+ return nil
+}
+
+func getDir(pathname string) (dir string, err error) {
+ attr, e := syscall.GetFileAttributes(syscall.StringToUTF16Ptr(pathname))
+ if e != nil {
+ return "", os.NewSyscallError("GetFileAttributes", e)
+ }
+ if attr&syscall.FILE_ATTRIBUTE_DIRECTORY != 0 {
+ dir = pathname
+ } else {
+ dir, _ = filepath.Split(pathname)
+ dir = filepath.Clean(dir)
+ }
+ return
+}
+
+func getIno(path string) (ino *inode, err error) {
+ h, e := syscall.CreateFile(syscall.StringToUTF16Ptr(path),
+ syscall.FILE_LIST_DIRECTORY,
+ syscall.FILE_SHARE_READ|syscall.FILE_SHARE_WRITE|syscall.FILE_SHARE_DELETE,
+ nil, syscall.OPEN_EXISTING,
+ syscall.FILE_FLAG_BACKUP_SEMANTICS|syscall.FILE_FLAG_OVERLAPPED, 0)
+ if e != nil {
+ return nil, os.NewSyscallError("CreateFile", e)
+ }
+ var fi syscall.ByHandleFileInformation
+ if e = syscall.GetFileInformationByHandle(h, &fi); e != nil {
+ syscall.CloseHandle(h)
+ return nil, os.NewSyscallError("GetFileInformationByHandle", e)
+ }
+ ino = &inode{
+ handle: h,
+ volume: fi.VolumeSerialNumber,
+ index: uint64(fi.FileIndexHigh)<<32 | uint64(fi.FileIndexLow),
+ }
+ return ino, nil
+}
+
+// Must run within the I/O thread.
+func (m watchMap) get(ino *inode) *watch {
+ if i := m[ino.volume]; i != nil {
+ return i[ino.index]
+ }
+ return nil
+}
+
+// Must run within the I/O thread.
+func (m watchMap) set(ino *inode, watch *watch) {
+ i := m[ino.volume]
+ if i == nil {
+ i = make(indexMap)
+ m[ino.volume] = i
+ }
+ i[ino.index] = watch
+}
+
+// Must run within the I/O thread.
+func (w *Watcher) addWatch(pathname string, flags uint64) error {
+ dir, err := getDir(pathname)
+ if err != nil {
+ return err
+ }
+ if flags&sysFSONLYDIR != 0 && pathname != dir {
+ return nil
+ }
+ ino, err := getIno(dir)
+ if err != nil {
+ return err
+ }
+ w.mu.Lock()
+ watchEntry := w.watches.get(ino)
+ w.mu.Unlock()
+ if watchEntry == nil {
+ if _, e := syscall.CreateIoCompletionPort(ino.handle, w.port, 0, 0); e != nil {
+ syscall.CloseHandle(ino.handle)
+ return os.NewSyscallError("CreateIoCompletionPort", e)
+ }
+ watchEntry = &watch{
+ ino: ino,
+ path: dir,
+ names: make(map[string]uint64),
+ }
+ w.mu.Lock()
+ w.watches.set(ino, watchEntry)
+ w.mu.Unlock()
+ flags |= provisional
+ } else {
+ syscall.CloseHandle(ino.handle)
+ }
+ if pathname == dir {
+ watchEntry.mask |= flags
+ } else {
+ watchEntry.names[filepath.Base(pathname)] |= flags
+ }
+ if err = w.startRead(watchEntry); err != nil {
+ return err
+ }
+ if pathname == dir {
+ watchEntry.mask &= ^provisional
+ } else {
+ watchEntry.names[filepath.Base(pathname)] &= ^provisional
+ }
+ return nil
+}
+
+// Must run within the I/O thread.
+func (w *Watcher) remWatch(pathname string) error {
+ dir, err := getDir(pathname)
+ if err != nil {
+ return err
+ }
+ ino, err := getIno(dir)
+ if err != nil {
+ return err
+ }
+ w.mu.Lock()
+ watch := w.watches.get(ino)
+ w.mu.Unlock()
+ if watch == nil {
+ return fmt.Errorf("can't remove non-existent watch for: %s", pathname)
+ }
+ if pathname == dir {
+ w.sendEvent(watch.path, watch.mask&sysFSIGNORED)
+ watch.mask = 0
+ } else {
+ name := filepath.Base(pathname)
+ w.sendEvent(filepath.Join(watch.path, name), watch.names[name]&sysFSIGNORED)
+ delete(watch.names, name)
+ }
+ return w.startRead(watch)
+}
+
+// Must run within the I/O thread.
+func (w *Watcher) deleteWatch(watch *watch) {
+ for name, mask := range watch.names {
+ if mask&provisional == 0 {
+ w.sendEvent(filepath.Join(watch.path, name), mask&sysFSIGNORED)
+ }
+ delete(watch.names, name)
+ }
+ if watch.mask != 0 {
+ if watch.mask&provisional == 0 {
+ w.sendEvent(watch.path, watch.mask&sysFSIGNORED)
+ }
+ watch.mask = 0
+ }
+}
+
+// Must run within the I/O thread.
+func (w *Watcher) startRead(watch *watch) error {
+ if e := syscall.CancelIo(watch.ino.handle); e != nil {
+ w.Errors <- os.NewSyscallError("CancelIo", e)
+ w.deleteWatch(watch)
+ }
+ mask := toWindowsFlags(watch.mask)
+ for _, m := range watch.names {
+ mask |= toWindowsFlags(m)
+ }
+ if mask == 0 {
+ if e := syscall.CloseHandle(watch.ino.handle); e != nil {
+ w.Errors <- os.NewSyscallError("CloseHandle", e)
+ }
+ w.mu.Lock()
+ delete(w.watches[watch.ino.volume], watch.ino.index)
+ w.mu.Unlock()
+ return nil
+ }
+ e := syscall.ReadDirectoryChanges(watch.ino.handle, &watch.buf[0],
+ uint32(unsafe.Sizeof(watch.buf)), false, mask, nil, &watch.ov, 0)
+ if e != nil {
+ err := os.NewSyscallError("ReadDirectoryChanges", e)
+ if e == syscall.ERROR_ACCESS_DENIED && watch.mask&provisional == 0 {
+ // Watched directory was probably removed
+ if w.sendEvent(watch.path, watch.mask&sysFSDELETESELF) {
+ if watch.mask&sysFSONESHOT != 0 {
+ watch.mask = 0
+ }
+ }
+ err = nil
+ }
+ w.deleteWatch(watch)
+ w.startRead(watch)
+ return err
+ }
+ return nil
+}
+
+// readEvents reads from the I/O completion port, converts the
+// received events into Event objects and sends them via the Events channel.
+// Entry point to the I/O thread.
+func (w *Watcher) readEvents() {
+ var (
+ n, key uint32
+ ov *syscall.Overlapped
+ )
+ runtime.LockOSThread()
+
+ for {
+ e := syscall.GetQueuedCompletionStatus(w.port, &n, &key, &ov, syscall.INFINITE)
+ watch := (*watch)(unsafe.Pointer(ov))
+
+ if watch == nil {
+ select {
+ case ch := <-w.quit:
+ w.mu.Lock()
+ var indexes []indexMap
+ for _, index := range w.watches {
+ indexes = append(indexes, index)
+ }
+ w.mu.Unlock()
+ for _, index := range indexes {
+ for _, watch := range index {
+ w.deleteWatch(watch)
+ w.startRead(watch)
+ }
+ }
+ var err error
+ if e := syscall.CloseHandle(w.port); e != nil {
+ err = os.NewSyscallError("CloseHandle", e)
+ }
+ close(w.Events)
+ close(w.Errors)
+ ch <- err
+ return
+ case in := <-w.input:
+ switch in.op {
+ case opAddWatch:
+ in.reply <- w.addWatch(in.path, uint64(in.flags))
+ case opRemoveWatch:
+ in.reply <- w.remWatch(in.path)
+ }
+ default:
+ }
+ continue
+ }
+
+ switch e {
+ case syscall.ERROR_MORE_DATA:
+ if watch == nil {
+ w.Errors <- errors.New("ERROR_MORE_DATA has unexpectedly null lpOverlapped buffer")
+ } else {
+ // The i/o succeeded but the buffer is full.
+ // In theory we should be building up a full packet.
+ // In practice we can get away with just carrying on.
+ n = uint32(unsafe.Sizeof(watch.buf))
+ }
+ case syscall.ERROR_ACCESS_DENIED:
+ // Watched directory was probably removed
+ w.sendEvent(watch.path, watch.mask&sysFSDELETESELF)
+ w.deleteWatch(watch)
+ w.startRead(watch)
+ continue
+ case syscall.ERROR_OPERATION_ABORTED:
+ // CancelIo was called on this handle
+ continue
+ default:
+ w.Errors <- os.NewSyscallError("GetQueuedCompletionPort", e)
+ continue
+ case nil:
+ }
+
+ var offset uint32
+ for {
+ if n == 0 {
+ w.Events <- newEvent("", sysFSQOVERFLOW)
+ w.Errors <- errors.New("short read in readEvents()")
+ break
+ }
+
+ // Point "raw" to the event in the buffer
+ raw := (*syscall.FileNotifyInformation)(unsafe.Pointer(&watch.buf[offset]))
+ buf := (*[syscall.MAX_PATH]uint16)(unsafe.Pointer(&raw.FileName))
+ name := syscall.UTF16ToString(buf[:raw.FileNameLength/2])
+ fullname := filepath.Join(watch.path, name)
+
+ var mask uint64
+ switch raw.Action {
+ case syscall.FILE_ACTION_REMOVED:
+ mask = sysFSDELETESELF
+ case syscall.FILE_ACTION_MODIFIED:
+ mask = sysFSMODIFY
+ case syscall.FILE_ACTION_RENAMED_OLD_NAME:
+ watch.rename = name
+ case syscall.FILE_ACTION_RENAMED_NEW_NAME:
+ if watch.names[watch.rename] != 0 {
+ watch.names[name] |= watch.names[watch.rename]
+ delete(watch.names, watch.rename)
+ mask = sysFSMOVESELF
+ }
+ }
+
+ sendNameEvent := func() {
+ if w.sendEvent(fullname, watch.names[name]&mask) {
+ if watch.names[name]&sysFSONESHOT != 0 {
+ delete(watch.names, name)
+ }
+ }
+ }
+ if raw.Action != syscall.FILE_ACTION_RENAMED_NEW_NAME {
+ sendNameEvent()
+ }
+ if raw.Action == syscall.FILE_ACTION_REMOVED {
+ w.sendEvent(fullname, watch.names[name]&sysFSIGNORED)
+ delete(watch.names, name)
+ }
+ if w.sendEvent(fullname, watch.mask&toFSnotifyFlags(raw.Action)) {
+ if watch.mask&sysFSONESHOT != 0 {
+ watch.mask = 0
+ }
+ }
+ if raw.Action == syscall.FILE_ACTION_RENAMED_NEW_NAME {
+ fullname = filepath.Join(watch.path, watch.rename)
+ sendNameEvent()
+ }
+
+ // Move to the next event in the buffer
+ if raw.NextEntryOffset == 0 {
+ break
+ }
+ offset += raw.NextEntryOffset
+
+ // Error!
+ if offset >= n {
+ w.Errors <- errors.New("Windows system assumed buffer larger than it is, events have likely been missed.")
+ break
+ }
+ }
+
+ if err := w.startRead(watch); err != nil {
+ w.Errors <- err
+ }
+ }
+}
+
+func (w *Watcher) sendEvent(name string, mask uint64) bool {
+ if mask == 0 {
+ return false
+ }
+ event := newEvent(name, uint32(mask))
+ select {
+ case ch := <-w.quit:
+ w.quit <- ch
+ case w.Events <- event:
+ }
+ return true
+}
+
+func toWindowsFlags(mask uint64) uint32 {
+ var m uint32
+ if mask&sysFSACCESS != 0 {
+ m |= syscall.FILE_NOTIFY_CHANGE_LAST_ACCESS
+ }
+ if mask&sysFSMODIFY != 0 {
+ m |= syscall.FILE_NOTIFY_CHANGE_LAST_WRITE
+ }
+ if mask&sysFSATTRIB != 0 {
+ m |= syscall.FILE_NOTIFY_CHANGE_ATTRIBUTES
+ }
+ if mask&(sysFSMOVE|sysFSCREATE|sysFSDELETE) != 0 {
+ m |= syscall.FILE_NOTIFY_CHANGE_FILE_NAME | syscall.FILE_NOTIFY_CHANGE_DIR_NAME
+ }
+ return m
+}
+
+func toFSnotifyFlags(action uint32) uint64 {
+ switch action {
+ case syscall.FILE_ACTION_ADDED:
+ return sysFSCREATE
+ case syscall.FILE_ACTION_REMOVED:
+ return sysFSDELETE
+ case syscall.FILE_ACTION_MODIFIED:
+ return sysFSMODIFY
+ case syscall.FILE_ACTION_RENAMED_OLD_NAME:
+ return sysFSMOVEDFROM
+ case syscall.FILE_ACTION_RENAMED_NEW_NAME:
+ return sysFSMOVEDTO
+ }
+ return 0
+}
diff --git a/vendor/github.com/ghodss/yaml/.travis.yml b/vendor/github.com/ghodss/yaml/.travis.yml
deleted file mode 100644
index 0e9d6edc..00000000
--- a/vendor/github.com/ghodss/yaml/.travis.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-language: go
-go:
- - 1.3
- - 1.4
-script:
- - go test
- - go build
diff --git a/vendor/github.com/go-openapi/jsonpointer/.golangci.yml b/vendor/github.com/go-openapi/jsonpointer/.golangci.yml
deleted file mode 100644
index 22f8d21c..00000000
--- a/vendor/github.com/go-openapi/jsonpointer/.golangci.yml
+++ /dev/null
@@ -1,61 +0,0 @@
-linters-settings:
- govet:
- check-shadowing: true
- golint:
- min-confidence: 0
- gocyclo:
- min-complexity: 45
- maligned:
- suggest-new: true
- dupl:
- threshold: 200
- goconst:
- min-len: 2
- min-occurrences: 3
-
-linters:
- enable-all: true
- disable:
- - maligned
- - unparam
- - lll
- - gochecknoinits
- - gochecknoglobals
- - funlen
- - godox
- - gocognit
- - whitespace
- - wsl
- - wrapcheck
- - testpackage
- - nlreturn
- - gomnd
- - exhaustivestruct
- - goerr113
- - errorlint
- - nestif
- - godot
- - gofumpt
- - paralleltest
- - tparallel
- - thelper
- - ifshort
- - exhaustruct
- - varnamelen
- - gci
- - depguard
- - errchkjson
- - inamedparam
- - nonamedreturns
- - musttag
- - ireturn
- - forcetypeassert
- - cyclop
- # deprecated linters
- - deadcode
- - interfacer
- - scopelint
- - varcheck
- - structcheck
- - golint
- - nosnakecase
diff --git a/vendor/github.com/go-openapi/jsonpointer/README.md b/vendor/github.com/go-openapi/jsonpointer/README.md
index 0108f1d5..813788af 100644
--- a/vendor/github.com/go-openapi/jsonpointer/README.md
+++ b/vendor/github.com/go-openapi/jsonpointer/README.md
@@ -1,10 +1,6 @@
-# gojsonpointer [](https://github.com/go-openapi/jsonpointer/actions?query=workflow%3A"go+test") [](https://codecov.io/gh/go-openapi/jsonpointer)
-
-[](https://slackin.goswagger.io)
-[](https://raw.githubusercontent.com/go-openapi/jsonpointer/master/LICENSE)
-[](https://pkg.go.dev/github.com/go-openapi/jsonpointer)
-[](https://goreportcard.com/report/github.com/go-openapi/jsonpointer)
+# gojsonpointer [](https://travis-ci.org/go-openapi/jsonpointer) [](https://codecov.io/gh/go-openapi/jsonpointer) [](https://slackin.goswagger.io)
+[](https://raw.githubusercontent.com/go-openapi/jsonpointer/master/LICENSE) [](http://godoc.org/github.com/go-openapi/jsonpointer)
An implementation of JSON Pointer - Go language
## Status
diff --git a/vendor/github.com/go-openapi/jsonpointer/pointer.go b/vendor/github.com/go-openapi/jsonpointer/pointer.go
index d970c7cf..7df9853d 100644
--- a/vendor/github.com/go-openapi/jsonpointer/pointer.go
+++ b/vendor/github.com/go-openapi/jsonpointer/pointer.go
@@ -26,7 +26,6 @@
package jsonpointer
import (
- "encoding/json"
"errors"
"fmt"
"reflect"
@@ -41,7 +40,6 @@ const (
pointerSeparator = `/`
invalidStart = `JSON pointer must be empty or start with a "` + pointerSeparator
- notFound = `Can't find the pointer in the document`
)
var jsonPointableType = reflect.TypeOf(new(JSONPointable)).Elem()
@@ -50,13 +48,13 @@ var jsonSetableType = reflect.TypeOf(new(JSONSetable)).Elem()
// JSONPointable is an interface for structs to implement when they need to customize the
// json pointer process
type JSONPointable interface {
- JSONLookup(string) (any, error)
+ JSONLookup(string) (interface{}, error)
}
// JSONSetable is an interface for structs to implement when they need to customize the
// json pointer process
type JSONSetable interface {
- JSONSet(string, any) error
+ JSONSet(string, interface{}) error
}
// New creates a new json pointer for the given string
@@ -83,7 +81,9 @@ func (p *Pointer) parse(jsonPointerString string) error {
err = errors.New(invalidStart)
} else {
referenceTokens := strings.Split(jsonPointerString, pointerSeparator)
- p.referenceTokens = append(p.referenceTokens, referenceTokens[1:]...)
+ for _, referenceToken := range referenceTokens[1:] {
+ p.referenceTokens = append(p.referenceTokens, referenceToken)
+ }
}
}
@@ -91,58 +91,38 @@ func (p *Pointer) parse(jsonPointerString string) error {
}
// Get uses the pointer to retrieve a value from a JSON document
-func (p *Pointer) Get(document any) (any, reflect.Kind, error) {
+func (p *Pointer) Get(document interface{}) (interface{}, reflect.Kind, error) {
return p.get(document, swag.DefaultJSONNameProvider)
}
// Set uses the pointer to set a value from a JSON document
-func (p *Pointer) Set(document any, value any) (any, error) {
+func (p *Pointer) Set(document interface{}, value interface{}) (interface{}, error) {
return document, p.set(document, value, swag.DefaultJSONNameProvider)
}
// GetForToken gets a value for a json pointer token 1 level deep
-func GetForToken(document any, decodedToken string) (any, reflect.Kind, error) {
+func GetForToken(document interface{}, decodedToken string) (interface{}, reflect.Kind, error) {
return getSingleImpl(document, decodedToken, swag.DefaultJSONNameProvider)
}
// SetForToken gets a value for a json pointer token 1 level deep
-func SetForToken(document any, decodedToken string, value any) (any, error) {
+func SetForToken(document interface{}, decodedToken string, value interface{}) (interface{}, error) {
return document, setSingleImpl(document, value, decodedToken, swag.DefaultJSONNameProvider)
}
-func isNil(input any) bool {
- if input == nil {
- return true
- }
-
- kind := reflect.TypeOf(input).Kind()
- switch kind { //nolint:exhaustive
- case reflect.Ptr, reflect.Map, reflect.Slice, reflect.Chan:
- return reflect.ValueOf(input).IsNil()
- default:
- return false
- }
-}
-
-func getSingleImpl(node any, decodedToken string, nameProvider *swag.NameProvider) (any, reflect.Kind, error) {
+func getSingleImpl(node interface{}, decodedToken string, nameProvider *swag.NameProvider) (interface{}, reflect.Kind, error) {
rValue := reflect.Indirect(reflect.ValueOf(node))
kind := rValue.Kind()
- if isNil(node) {
- return nil, kind, fmt.Errorf("nil value has not field %q", decodedToken)
- }
- switch typed := node.(type) {
- case JSONPointable:
- r, err := typed.JSONLookup(decodedToken)
+ if rValue.Type().Implements(jsonPointableType) {
+ r, err := node.(JSONPointable).JSONLookup(decodedToken)
if err != nil {
return nil, kind, err
}
return r, kind, nil
- case *any: // case of a pointer to interface, that is not resolved by reflect.Indirect
- return getSingleImpl(*typed, decodedToken, nameProvider)
}
- switch kind { //nolint:exhaustive
+ switch kind {
case reflect.Struct:
nm, ok := nameProvider.GetGoNameForType(rValue.Type(), decodedToken)
if !ok {
@@ -179,7 +159,7 @@ func getSingleImpl(node any, decodedToken string, nameProvider *swag.NameProvide
}
-func setSingleImpl(node, data any, decodedToken string, nameProvider *swag.NameProvider) error {
+func setSingleImpl(node, data interface{}, decodedToken string, nameProvider *swag.NameProvider) error {
rValue := reflect.Indirect(reflect.ValueOf(node))
if ns, ok := node.(JSONSetable); ok { // pointer impl
@@ -190,7 +170,7 @@ func setSingleImpl(node, data any, decodedToken string, nameProvider *swag.NameP
return node.(JSONSetable).JSONSet(decodedToken, data)
}
- switch rValue.Kind() { //nolint:exhaustive
+ switch rValue.Kind() {
case reflect.Struct:
nm, ok := nameProvider.GetGoNameForType(rValue.Type(), decodedToken)
if !ok {
@@ -230,7 +210,7 @@ func setSingleImpl(node, data any, decodedToken string, nameProvider *swag.NameP
}
-func (p *Pointer) get(node any, nameProvider *swag.NameProvider) (any, reflect.Kind, error) {
+func (p *Pointer) get(node interface{}, nameProvider *swag.NameProvider) (interface{}, reflect.Kind, error) {
if nameProvider == nil {
nameProvider = swag.DefaultJSONNameProvider
@@ -251,7 +231,8 @@ func (p *Pointer) get(node any, nameProvider *swag.NameProvider) (any, reflect.K
if err != nil {
return nil, knd, err
}
- node = r
+ node, kind = r, knd
+
}
rValue := reflect.ValueOf(node)
@@ -260,11 +241,11 @@ func (p *Pointer) get(node any, nameProvider *swag.NameProvider) (any, reflect.K
return node, kind, nil
}
-func (p *Pointer) set(node, data any, nameProvider *swag.NameProvider) error {
+func (p *Pointer) set(node, data interface{}, nameProvider *swag.NameProvider) error {
knd := reflect.ValueOf(node).Kind()
if knd != reflect.Ptr && knd != reflect.Struct && knd != reflect.Map && knd != reflect.Slice && knd != reflect.Array {
- return errors.New("only structs, pointers, maps and slices are supported for setting values")
+ return fmt.Errorf("only structs, pointers, maps and slices are supported for setting values")
}
if nameProvider == nil {
@@ -303,7 +284,7 @@ func (p *Pointer) set(node, data any, nameProvider *swag.NameProvider) error {
continue
}
- switch kind { //nolint:exhaustive
+ switch kind {
case reflect.Struct:
nm, ok := nameProvider.GetGoNameForType(rValue.Type(), decodedToken)
if !ok {
@@ -382,128 +363,6 @@ func (p *Pointer) String() string {
return pointerString
}
-func (p *Pointer) Offset(document string) (int64, error) {
- dec := json.NewDecoder(strings.NewReader(document))
- var offset int64
- for _, ttk := range p.DecodedTokens() {
- tk, err := dec.Token()
- if err != nil {
- return 0, err
- }
- switch tk := tk.(type) {
- case json.Delim:
- switch tk {
- case '{':
- offset, err = offsetSingleObject(dec, ttk)
- if err != nil {
- return 0, err
- }
- case '[':
- offset, err = offsetSingleArray(dec, ttk)
- if err != nil {
- return 0, err
- }
- default:
- return 0, fmt.Errorf("invalid token %#v", tk)
- }
- default:
- return 0, fmt.Errorf("invalid token %#v", tk)
- }
- }
- return offset, nil
-}
-
-func offsetSingleObject(dec *json.Decoder, decodedToken string) (int64, error) {
- for dec.More() {
- offset := dec.InputOffset()
- tk, err := dec.Token()
- if err != nil {
- return 0, err
- }
- switch tk := tk.(type) {
- case json.Delim:
- switch tk {
- case '{':
- if err = drainSingle(dec); err != nil {
- return 0, err
- }
- case '[':
- if err = drainSingle(dec); err != nil {
- return 0, err
- }
- }
- case string:
- if tk == decodedToken {
- return offset, nil
- }
- default:
- return 0, fmt.Errorf("invalid token %#v", tk)
- }
- }
- return 0, fmt.Errorf("token reference %q not found", decodedToken)
-}
-
-func offsetSingleArray(dec *json.Decoder, decodedToken string) (int64, error) {
- idx, err := strconv.Atoi(decodedToken)
- if err != nil {
- return 0, fmt.Errorf("token reference %q is not a number: %v", decodedToken, err)
- }
- var i int
- for i = 0; i < idx && dec.More(); i++ {
- tk, err := dec.Token()
- if err != nil {
- return 0, err
- }
-
- if delim, isDelim := tk.(json.Delim); isDelim {
- switch delim {
- case '{':
- if err = drainSingle(dec); err != nil {
- return 0, err
- }
- case '[':
- if err = drainSingle(dec); err != nil {
- return 0, err
- }
- }
- }
- }
-
- if !dec.More() {
- return 0, fmt.Errorf("token reference %q not found", decodedToken)
- }
- return dec.InputOffset(), nil
-}
-
-// drainSingle drains a single level of object or array.
-// The decoder has to guarantee the beginning delim (i.e. '{' or '[') has been consumed.
-func drainSingle(dec *json.Decoder) error {
- for dec.More() {
- tk, err := dec.Token()
- if err != nil {
- return err
- }
- if delim, isDelim := tk.(json.Delim); isDelim {
- switch delim {
- case '{':
- if err = drainSingle(dec); err != nil {
- return err
- }
- case '[':
- if err = drainSingle(dec); err != nil {
- return err
- }
- }
- }
- }
-
- // Consumes the ending delim
- if _, err := dec.Token(); err != nil {
- return err
- }
- return nil
-}
-
// Specific JSON pointer encoding here
// ~0 => ~
// ~1 => /
@@ -518,14 +377,14 @@ const (
// Unescape unescapes a json pointer reference token string to the original representation
func Unescape(token string) string {
- step1 := strings.ReplaceAll(token, encRefTok1, decRefTok1)
- step2 := strings.ReplaceAll(step1, encRefTok0, decRefTok0)
+ step1 := strings.Replace(token, encRefTok1, decRefTok1, -1)
+ step2 := strings.Replace(step1, encRefTok0, decRefTok0, -1)
return step2
}
// Escape escapes a pointer reference token string
func Escape(token string) string {
- step1 := strings.ReplaceAll(token, decRefTok0, encRefTok0)
- step2 := strings.ReplaceAll(step1, decRefTok1, encRefTok1)
+ step1 := strings.Replace(token, decRefTok0, encRefTok0, -1)
+ step2 := strings.Replace(step1, decRefTok1, encRefTok1, -1)
return step2
}
diff --git a/vendor/github.com/go-openapi/jsonreference/.golangci.yml b/vendor/github.com/go-openapi/jsonreference/.golangci.yml
index 22f8d21c..013fc194 100644
--- a/vendor/github.com/go-openapi/jsonreference/.golangci.yml
+++ b/vendor/github.com/go-openapi/jsonreference/.golangci.yml
@@ -1,61 +1,50 @@
linters-settings:
govet:
check-shadowing: true
- golint:
- min-confidence: 0
gocyclo:
- min-complexity: 45
+ min-complexity: 30
maligned:
suggest-new: true
dupl:
- threshold: 200
+ threshold: 100
goconst:
min-len: 2
- min-occurrences: 3
-
+ min-occurrences: 4
+ paralleltest:
+ ignore-missing: true
linters:
enable-all: true
disable:
- maligned
- - unparam
- lll
- - gochecknoinits
- gochecknoglobals
- - funlen
- godox
- gocognit
- whitespace
- wsl
+ - funlen
+ - gochecknoglobals
+ - gochecknoinits
+ - scopelint
- wrapcheck
- - testpackage
- - nlreturn
- - gomnd
- exhaustivestruct
+ - exhaustive
+ - nlreturn
+ - testpackage
+ - gci
+ - gofumpt
- goerr113
- - errorlint
+ - gomnd
+ - tparallel
- nestif
- godot
- - gofumpt
- - paralleltest
- - tparallel
- - thelper
- - ifshort
- - exhaustruct
- - varnamelen
- - gci
- - depguard
- - errchkjson
- - inamedparam
- - nonamedreturns
- - musttag
- - ireturn
- - forcetypeassert
- - cyclop
- # deprecated linters
- - deadcode
- - interfacer
- - scopelint
+ - errorlint
- varcheck
- - structcheck
+ - interfacer
+ - deadcode
- golint
+ - ifshort
+ - structcheck
- nosnakecase
+ - varnamelen
+ - exhaustruct
diff --git a/vendor/github.com/go-openapi/jsonreference/README.md b/vendor/github.com/go-openapi/jsonreference/README.md
index c7fc2049..b94753aa 100644
--- a/vendor/github.com/go-openapi/jsonreference/README.md
+++ b/vendor/github.com/go-openapi/jsonreference/README.md
@@ -1,19 +1,15 @@
-# gojsonreference [](https://github.com/go-openapi/jsonreference/actions?query=workflow%3A"go+test") [](https://codecov.io/gh/go-openapi/jsonreference)
-
-[](https://slackin.goswagger.io)
-[](https://raw.githubusercontent.com/go-openapi/jsonreference/master/LICENSE)
-[](https://pkg.go.dev/github.com/go-openapi/jsonreference)
-[](https://goreportcard.com/report/github.com/go-openapi/jsonreference)
+# gojsonreference [](https://travis-ci.org/go-openapi/jsonreference) [](https://codecov.io/gh/go-openapi/jsonreference) [](https://slackin.goswagger.io)
+[](https://raw.githubusercontent.com/go-openapi/jsonreference/master/LICENSE) [](http://godoc.org/github.com/go-openapi/jsonreference)
An implementation of JSON Reference - Go language
## Status
Feature complete. Stable API
## Dependencies
-* https://github.com/go-openapi/jsonpointer
+https://github.com/go-openapi/jsonpointer
## References
+http://tools.ietf.org/html/draft-ietf-appsawg-json-pointer-07
-* http://tools.ietf.org/html/draft-ietf-appsawg-json-pointer-07
-* http://tools.ietf.org/html/draft-pbryan-zyp-json-ref-03
+http://tools.ietf.org/html/draft-pbryan-zyp-json-ref-03
diff --git a/vendor/github.com/go-openapi/spec/.gitignore b/vendor/github.com/go-openapi/spec/.gitignore
index f47cb204..dd91ed6a 100644
--- a/vendor/github.com/go-openapi/spec/.gitignore
+++ b/vendor/github.com/go-openapi/spec/.gitignore
@@ -1 +1,2 @@
-*.out
+secrets.yml
+coverage.out
diff --git a/vendor/github.com/go-openapi/spec/.golangci.yml b/vendor/github.com/go-openapi/spec/.golangci.yml
index 22f8d21c..835d55e7 100644
--- a/vendor/github.com/go-openapi/spec/.golangci.yml
+++ b/vendor/github.com/go-openapi/spec/.golangci.yml
@@ -11,7 +11,7 @@ linters-settings:
threshold: 200
goconst:
min-len: 2
- min-occurrences: 3
+ min-occurrences: 2
linters:
enable-all: true
@@ -40,22 +40,3 @@ linters:
- tparallel
- thelper
- ifshort
- - exhaustruct
- - varnamelen
- - gci
- - depguard
- - errchkjson
- - inamedparam
- - nonamedreturns
- - musttag
- - ireturn
- - forcetypeassert
- - cyclop
- # deprecated linters
- - deadcode
- - interfacer
- - scopelint
- - varcheck
- - structcheck
- - golint
- - nosnakecase
diff --git a/vendor/github.com/go-openapi/spec/README.md b/vendor/github.com/go-openapi/spec/README.md
index 7fd2810c..18782c6d 100644
--- a/vendor/github.com/go-openapi/spec/README.md
+++ b/vendor/github.com/go-openapi/spec/README.md
@@ -1,5 +1,8 @@
-# OpenAPI v2 object model [](https://github.com/go-openapi/spec/actions?query=workflow%3A"go+test") [](https://codecov.io/gh/go-openapi/spec)
+# OAI object model
+[](https://travis-ci.org/go-openapi/spec)
+
+[](https://codecov.io/gh/go-openapi/spec)
[](https://slackin.goswagger.io)
[](https://raw.githubusercontent.com/go-openapi/spec/master/LICENSE)
[](https://pkg.go.dev/github.com/go-openapi/spec)
@@ -29,26 +32,3 @@ The object model for OpenAPI specification documents.
> This [discussion thread](https://github.com/go-openapi/spec/issues/21) relates the full story.
>
> An early attempt to support Swagger 3 may be found at: https://github.com/go-openapi/spec3
-
-* Does the unmarshaling support YAML?
-
-> Not directly. The exposed types know only how to unmarshal from JSON.
->
-> In order to load a YAML document as a Swagger spec, you need to use the loaders provided by
-> github.com/go-openapi/loads
->
-> Take a look at the example there: https://pkg.go.dev/github.com/go-openapi/loads#example-Spec
->
-> See also https://github.com/go-openapi/spec/issues/164
-
-* How can I validate a spec?
-
-> Validation is provided by [the validate package](http://github.com/go-openapi/validate)
-
-* Why do we have an `ID` field for `Schema` which is not part of the swagger spec?
-
-> We found jsonschema compatibility more important: since `id` in jsonschema influences
-> how `$ref` are resolved.
-> This `id` does not conflict with any property named `id`.
->
-> See also https://github.com/go-openapi/spec/issues/23
diff --git a/vendor/github.com/go-openapi/spec/appveyor.yml b/vendor/github.com/go-openapi/spec/appveyor.yml
new file mode 100644
index 00000000..09035939
--- /dev/null
+++ b/vendor/github.com/go-openapi/spec/appveyor.yml
@@ -0,0 +1,32 @@
+version: "0.1.{build}"
+
+clone_folder: C:\go-openapi\spec
+shallow_clone: true # for startup speed
+pull_requests:
+ do_not_increment_build_number: true
+
+#skip_tags: true
+#skip_branch_with_pr: true
+
+# appveyor.yml
+build: off
+
+environment:
+ GOPATH: c:\gopath
+
+stack: go 1.15
+
+test_script:
+ - go test -v -timeout 20m ./...
+
+deploy: off
+
+notifications:
+ - provider: Slack
+ incoming_webhook: https://hooks.slack.com/services/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
+ auth_token:
+ secure: Sf7kZf7ZGbnwWUMpffHwMu5A0cHkLK2MYY32LNTPj4+/3qC3Ghl7+9v4TSLOqOlCwdRNjOGblAq7s+GDJed6/xgRQl1JtCi1klzZNrYX4q01pgTPvvGcwbBkIYgeMaPeIRcK9OZnud7sRXdttozgTOpytps2U6Js32ip7uj5mHSg2ub0FwoSJwlS6dbezZ8+eDhoha0F/guY99BEwx8Bd+zROrT2TFGsSGOFGN6wFc7moCqTHO/YkWib13a2QNXqOxCCVBy/lt76Wp+JkeFppjHlzs/2lP3EAk13RIUAaesdEUHvIHrzCyNJEd3/+KO2DzsWOYfpktd+KBCvgaYOsoo7ubdT3IROeAegZdCgo/6xgCEsmFc9ZcqCfN5yNx2A+BZ2Vwmpws+bQ1E1+B5HDzzaiLcYfG4X2O210QVGVDLWsv1jqD+uPYeHY2WRfh5ZsIUFvaqgUEnwHwrK44/8REAhQavt1QAj5uJpsRd7CkRVPWRNK+yIky+wgbVUFEchRNmS55E7QWf+W4+4QZkQi7vUTMc9nbTUu2Es9NfvfudOpM2wZbn98fjpb/qq/nRv6Bk+ca+7XD5/IgNLMbWp2ouDdzbiHLCOfDUiHiDJhLfFZx9Bwo7ZwfzeOlbrQX66bx7xRKYmOe4DLrXhNcpbsMa8qbfxlZRCmYbubB/Y8h4=
+ channel: bots
+ on_build_success: false
+ on_build_failure: true
+ on_build_status_changed: true
diff --git a/vendor/github.com/go-openapi/spec/bindata.go b/vendor/github.com/go-openapi/spec/bindata.go
new file mode 100644
index 00000000..afc83850
--- /dev/null
+++ b/vendor/github.com/go-openapi/spec/bindata.go
@@ -0,0 +1,297 @@
+// Code generated by go-bindata. DO NOT EDIT.
+// sources:
+// schemas/jsonschema-draft-04.json (4.357kB)
+// schemas/v2/schema.json (40.248kB)
+
+package spec
+
+import (
+ "bytes"
+ "compress/gzip"
+ "crypto/sha256"
+ "fmt"
+ "io"
+ "io/ioutil"
+ "os"
+ "path/filepath"
+ "strings"
+ "time"
+)
+
+func bindataRead(data []byte, name string) ([]byte, error) {
+ gz, err := gzip.NewReader(bytes.NewBuffer(data))
+ if err != nil {
+ return nil, fmt.Errorf("read %q: %v", name, err)
+ }
+
+ var buf bytes.Buffer
+ _, err = io.Copy(&buf, gz)
+ clErr := gz.Close()
+
+ if err != nil {
+ return nil, fmt.Errorf("read %q: %v", name, err)
+ }
+ if clErr != nil {
+ return nil, err
+ }
+
+ return buf.Bytes(), nil
+}
+
+type asset struct {
+ bytes []byte
+ info os.FileInfo
+ digest [sha256.Size]byte
+}
+
+type bindataFileInfo struct {
+ name string
+ size int64
+ mode os.FileMode
+ modTime time.Time
+}
+
+func (fi bindataFileInfo) Name() string {
+ return fi.name
+}
+func (fi bindataFileInfo) Size() int64 {
+ return fi.size
+}
+func (fi bindataFileInfo) Mode() os.FileMode {
+ return fi.mode
+}
+func (fi bindataFileInfo) ModTime() time.Time {
+ return fi.modTime
+}
+func (fi bindataFileInfo) IsDir() bool {
+ return false
+}
+func (fi bindataFileInfo) Sys() interface{} {
+ return nil
+}
+
+var _jsonschemaDraft04Json = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xc4\x57\x3d\x6f\xdb\x3c\x10\xde\xf3\x2b\x08\x26\x63\xf2\x2a\x2f\xd0\xc9\x5b\xd1\x2e\x01\x5a\x34\x43\x37\x23\x03\x6d\x9d\x6c\x06\x14\xa9\x50\x54\x60\xc3\xd0\x7f\x2f\x28\x4a\x14\x29\x91\x92\x2d\xa7\x8d\x97\x28\xbc\xaf\xe7\x8e\xf7\xc5\xd3\x0d\x42\x08\x61\x9a\xe2\x15\xc2\x7b\xa5\x8a\x55\x92\xbc\x96\x82\x3f\x94\xdb\x3d\xe4\xe4\x3f\x21\x77\x49\x2a\x49\xa6\x1e\x1e\xbf\x24\xe6\xec\x16\xdf\x1b\xa1\x3b\xf3\xff\x02\xc9\x14\xca\xad\xa4\x85\xa2\x82\x6b\xe9\x6f\x42\x02\x32\x2c\x28\x07\x45\x5a\x15\x3d\x77\x46\x39\xd5\xcc\x25\x5e\x21\x83\xb8\x21\x18\xb6\xaf\x52\x92\xa3\x47\x68\x88\xea\x58\x80\x56\x4e\x1a\xf2\xbd\x4f\xcc\x29\x7f\x52\x90\x6b\x7d\xff\x0f\x48\xb4\x3d\x3f\x21\x7c\x27\x21\xd3\x2a\x6e\x31\xaa\x2d\x53\xdd\xf3\xe3\x42\x94\x54\xd1\x77\x78\xe2\x0a\x76\x20\xe3\x20\x68\xcb\x30\x86\x41\xf3\x2a\xc7\x2b\xf4\x78\x8e\xfe\xef\x90\x91\x8a\xa9\xc7\xb1\x1d\xc2\xd8\x2f\x0d\x75\xed\xc1\x4e\x9c\xc8\x25\x43\xac\xa8\xbe\xd7\xcc\xa9\xd1\xa9\x21\xa0\x1a\xbd\x04\x61\x94\x34\x2f\x18\xfc\x3e\x16\x50\x8e\x4d\x03\x6f\x1c\x58\xdb\x48\x23\xbc\x11\x82\x01\xe1\xfa\xd3\x3a\x8e\x30\xaf\x18\x33\x7f\xf3\x8d\x39\x11\x9b\x57\xd8\x2a\xfd\x55\x2a\x49\xf9\x0e\xc7\xec\x37\xd4\x25\xf7\xec\x5c\x66\xc7\xd7\x99\xaa\xcf\x4f\x89\x8a\xd3\xb7\x0a\x3a\xaa\x92\x15\xf4\x30\x6f\x1c\xb0\xd6\x46\xe7\x98\x39\x2d\xa4\x28\x40\x2a\x3a\x88\x9e\x29\xba\x88\x37\x2d\xca\x60\x38\xfa\xba\x5b\x20\xac\xa8\x62\xb0\x4c\xd4\xaf\xda\x45\x0a\xba\x5c\x3b\xb9\xc7\x79\xc5\x14\x2d\x18\x34\x19\x1c\x51\xdb\x25\x4d\xb4\x7e\x06\x14\x38\x6c\x59\x55\xd2\x77\xf8\x69\x59\xfc\x7b\x73\xed\x93\x43\xcb\x32\x6d\x3c\x28\xdc\x1b\x9a\xd3\x62\xab\xc2\x27\xf7\x41\xc9\x08\x2b\x23\x08\xad\x13\x57\x21\x9c\xd3\x72\x0d\x42\x72\xf8\x01\x7c\xa7\xf6\x83\xce\x39\xd7\x82\x3c\x1f\x2f\xd6\x60\x1b\xa2\xdf\x35\x89\x52\x20\xe7\x73\x74\xe0\x66\x26\x64\x4e\xb4\x97\x58\xc2\x0e\x0e\xe1\x60\x92\x34\x6d\xa0\x10\xd6\xb5\x83\x61\x27\xe6\x47\xd3\x89\xbd\x63\xfd\x3b\x8d\x03\x3d\x6c\x42\x2d\x5b\x70\xee\xe8\xdf\x4b\xf4\x66\x4e\xe1\x01\x45\x17\x80\x74\xad\x4f\xc3\xf3\xae\xc6\x1d\xc6\xd7\xc2\xce\xc9\xe1\x29\x30\x86\x2f\x4a\xa6\x4b\x15\x84\x73\xc9\x6f\xfd\x7f\xa5\x6e\x9e\xbd\xf1\xb0\xd4\xdd\x45\x5a\xc2\x3e\x4b\x78\xab\xa8\x84\x74\x4a\x91\x3b\x92\x23\x05\xf2\x1c\x1e\x7b\xf3\x09\xf8\xcf\xab\x24\xb6\x60\xa2\xe8\x4c\x9f\x75\x77\xaa\x8c\xe6\x01\x45\x36\x86\xcf\xc3\x63\x3a\xea\xd4\x8d\x7e\x06\xac\x14\x0a\xe0\x29\xf0\xed\x07\x22\x1a\x65\xda\x44\xae\xa2\x73\x1a\xe6\x90\x69\xa2\x8c\x46\xb2\x2f\xde\x49\x38\x08\xed\xfe\xfd\x41\xaf\x9f\xa9\x55\xd7\xdd\x22\x8d\xfa\x45\x63\xc5\x0f\x80\xf3\xb4\x08\xd6\x79\x30\x9e\x93\xee\x59\xa6\xd0\x4b\xee\x22\xe3\x33\xc1\x3a\x27\x68\x36\x78\x7e\x87\x0a\x06\xd5\x2e\x20\xd3\xaf\x15\xfb\xd8\x3b\x73\x14\xbb\x92\xed\x05\x5d\x2e\x29\x38\x2c\x94\xe4\x42\x45\x5e\xd3\xb5\x7d\xdf\x47\xca\x38\xb4\x5c\xaf\xfb\x7d\xdd\x6d\xf4\xa1\x2d\x77\xdd\x2f\xce\x6d\xc4\x7b\x8b\x4e\x67\xa9\x6f\xfe\x04\x00\x00\xff\xff\xb1\xd1\x27\x78\x05\x11\x00\x00")
+
+func jsonschemaDraft04JsonBytes() ([]byte, error) {
+ return bindataRead(
+ _jsonschemaDraft04Json,
+ "jsonschema-draft-04.json",
+ )
+}
+
+func jsonschemaDraft04Json() (*asset, error) {
+ bytes, err := jsonschemaDraft04JsonBytes()
+ if err != nil {
+ return nil, err
+ }
+
+ info := bindataFileInfo{name: "jsonschema-draft-04.json", size: 4357, mode: os.FileMode(0640), modTime: time.Unix(1568963823, 0)}
+ a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xe1, 0x48, 0x9d, 0xb, 0x47, 0x55, 0xf0, 0x27, 0x93, 0x30, 0x25, 0x91, 0xd3, 0xfc, 0xb8, 0xf0, 0x7b, 0x68, 0x93, 0xa8, 0x2a, 0x94, 0xf2, 0x48, 0x95, 0xf8, 0xe4, 0xed, 0xf1, 0x1b, 0x82, 0xe2}}
+ return a, nil
+}
+
+var _v2SchemaJson = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5d\x4f\x93\xdb\x36\xb2\xbf\xfb\x53\xa0\x14\x57\xd9\xae\xd8\x92\xe3\xf7\x2e\xcf\x97\xd4\xbc\xd8\x49\x66\x37\x5e\x4f\x79\x26\xbb\x87\x78\x5c\x05\x91\x2d\x09\x09\x09\x30\x00\x38\x33\x5a\xef\x7c\xf7\x2d\xf0\x9f\x08\x02\x20\x41\x8a\xd2\xc8\x0e\x0f\xa9\x78\x28\xa0\xd1\xdd\x68\x34\x7e\xdd\xf8\xf7\xf9\x11\x42\x33\x49\x64\x04\xb3\xd7\x68\x76\x86\xfe\x76\xf9\xfe\x1f\xe8\x32\xd8\x40\x8c\xd1\x8a\x71\x74\x79\x8b\xd7\x6b\xe0\xe8\xd5\xfc\x25\x3a\xbb\x38\x9f\xcf\x9e\xab\x0a\x24\x54\xa5\x37\x52\x26\xaf\x17\x0b\x91\x17\x99\x13\xb6\xb8\x79\xb5\x10\x59\xdd\xf9\xef\x82\xd1\x6f\xf2\xc2\x8f\xf3\x4f\xb5\x1a\xea\xc7\x17\x45\x41\xc6\xd7\x8b\x90\xe3\x95\x7c\xf1\xf2\x7f\x8b\xca\x45\x3d\xb9\x4d\x32\xa6\xd8\xf2\x77\x08\x64\xfe\x8d\xc3\x9f\x29\xe1\xa0\x9a\xff\xed\x11\x42\x08\xcd\x8a\xd6\xb3\x9f\x15\x67\x74\xc5\xca\x7f\x27\x58\x6e\xc4\xec\x11\x42\xd7\x59\x5d\x1c\x86\x44\x12\x46\x71\x74\xc1\x59\x02\x5c\x12\x10\xb3\xd7\x68\x85\x23\x01\x59\x81\x04\x4b\x09\x9c\x6a\xbf\x7e\xce\x49\x7d\xba\x7b\x51\xfd\xa1\x44\xe2\xb0\x52\xac\x7d\xb3\x08\x61\x45\x68\x46\x56\x2c\x6e\x80\x86\x8c\xbf\xbd\x93\x40\x05\x61\x74\x96\x95\xbe\x7f\x84\xd0\x7d\x4e\xde\x42\xb7\xe4\xbe\x46\xbb\x14\x5b\x48\x4e\xe8\xba\x90\x05\xa1\x19\xd0\x34\xae\xc4\xce\xbe\xbc\x9a\xbf\x9c\x15\x7f\x5d\x57\xc5\x42\x10\x01\x27\x89\xe2\x48\x51\xb9\xda\x40\xd5\x87\x37\xc0\x15\x5f\x88\xad\x90\xdc\x10\x81\x42\x16\xa4\x31\x50\x39\x2f\x38\xad\xab\xb0\x53\xd8\xac\x94\x56\x6f\xc3\x84\xf4\x11\xa4\x50\xb3\xfa\xe9\xd3\x6f\x9f\x3e\xdf\x2f\xd0\xeb\x8f\x1f\x3f\x7e\xbc\xfe\xf6\xe9\xf7\xaf\x5f\x7f\xfc\x18\x7e\xfb\xec\xfb\xc7\xb3\x36\x79\x54\x43\xe8\x29\xc5\x31\x20\xc6\x11\x49\x9e\xe5\x12\x41\x66\xa0\xe8\xed\x1d\x8e\x93\x08\x5e\xa3\x27\x3b\xc3\x7c\xa2\x73\xba\xc4\x02\x2e\xb0\xdc\xf4\xe5\x76\xd1\xca\x96\xa2\x8a\x94\xcd\x21\xc9\x6c\xec\x2c\x70\x42\x9e\x34\x74\x9d\x19\x7c\xcd\x20\x9c\xea\x2e\x0a\xfe\x42\x84\xd4\x29\x04\x8c\x8a\xb4\x41\xa2\xc1\xdc\x19\x8a\x88\x90\x4a\x49\xef\xce\xdf\xbd\x45\x4a\x52\x81\x70\x10\x40\x22\x21\x44\xcb\x6d\xc5\xec\x4e\x3c\x1c\x45\xef\x57\x9a\xb5\x7d\xae\xfe\xe5\xe4\x31\x86\x90\xe0\xab\x6d\x02\x3b\x2e\xcb\x11\x90\xd9\xa8\xc6\x77\xc2\x59\x98\x06\xfd\xf9\x2e\x78\x45\x01\xa6\xa8\xa0\x71\x5c\xbe\x33\xa7\xd2\xd9\x5f\x95\xef\xd9\xd5\xac\xfd\xdc\x5d\xbf\x5e\xb8\xd1\x3e\xc7\x31\x48\xe0\x5e\x4c\x14\x65\xdf\xb8\xa8\x71\x10\x09\xa3\xc2\xc7\x02\xcb\xa2\x4e\x5a\x02\x82\x94\x13\xb9\xf5\x30\xe6\xb2\xa4\xb5\xfe\x9b\x3e\x7a\xb2\x55\xd2\xa8\x4a\xbc\x16\xb6\x71\x8e\x39\xc7\xdb\x9d\xe1\x10\x09\x71\xbd\x9c\xb3\x41\x89\xd7\xa5\x89\xdc\x57\xb5\x53\x4a\xfe\x4c\xe1\xbc\xa0\x21\x79\x0a\x1a\x0f\x70\xa7\x5c\x08\x8e\xde\xb0\xc0\x43\x24\xad\x74\x63\x0e\xb1\xd9\x90\xe1\xb0\x2d\x13\xa7\x6d\x78\xfd\x04\x14\x38\x8e\x90\xaa\xce\x63\xac\x3e\x23\xbc\x64\xa9\xb4\xf8\x03\x63\xde\xcd\xbe\x16\x13\x4a\x55\xac\x82\x12\xc6\xac\xd4\x35\xf7\x22\xd4\x3a\xff\x22\x73\x0e\x6e\x51\xa0\x75\x1e\xae\x8f\xe8\x5d\xc7\x59\xe6\xe4\x9a\x18\x8d\xd6\x1c\x53\x84\x4d\xb7\x67\x28\x37\x09\x84\x69\x88\x12\x0e\x01\x11\x80\x32\xa2\xf5\xb9\xaa\xc6\xd9\x73\x53\xab\xfb\xb4\x2e\x20\xc6\x54\x92\xa0\x9a\xf3\x69\x1a\x2f\x81\x77\x37\xae\x53\x1a\xce\x40\xc4\xa8\x82\x1c\xb5\xef\xda\x24\x7d\xb9\x61\x69\x14\xa2\x25\xa0\x90\xac\x56\xc0\x81\x4a\xb4\xe2\x2c\xce\x4a\x64\x7a\x9a\x23\xf4\x13\x91\x3f\xa7\x4b\xf4\x63\x84\x6f\x18\x87\x10\xbd\xc3\xfc\x8f\x90\xdd\x52\x44\x04\xc2\x51\xc4\x6e\x21\x74\x48\x21\x81\xc7\xe2\xfd\xea\x12\xf8\x0d\x09\xf6\xe9\x47\x35\xaf\x67\xc4\x14\xf7\x22\x27\x97\xe1\xe2\x76\x2d\x06\x8c\x4a\x1c\x48\x3f\x73\x2d\x0b\x5b\x29\x45\x24\x00\x2a\x0c\x11\xec\x94\xca\xc2\xa6\xc1\x37\x21\x43\x83\x3b\x5f\x97\xf1\x43\x5e\x53\x73\x19\xa5\x36\xd8\x2d\x05\x2e\x34\x0b\xeb\x39\xfc\x1d\x63\x51\x01\xbd\x3d\xbb\x90\x84\x40\x25\x59\x6d\x09\x5d\xa3\x1c\x37\xe6\x5c\x16\x9a\x40\x09\x70\xc1\xe8\x82\xf1\x35\xa6\xe4\xdf\x99\x5c\x8e\x9e\x4d\x79\xb4\x27\x2f\xbf\x7e\xf8\x05\x25\x8c\x50\xa9\x98\x29\x90\x62\x60\xea\x75\xae\x13\xca\xbf\x2b\x1a\x29\x27\x76\xd6\x20\xc6\x64\x5f\xe6\x32\x1a\x08\x87\x21\x07\x21\xbc\xb4\xe4\xe0\x32\x67\xa6\xcd\xf3\x1e\xcd\xd9\x6b\xb6\x6f\x8e\x27\xa7\xed\xdb\xe7\xbc\xcc\x1a\x07\xce\x6f\x87\x33\xf0\xba\x51\x17\x22\x66\x78\x79\x8e\xce\xe5\x13\x81\x80\x06\x2c\xe5\x78\x0d\xa1\xb2\xb8\x54\xa8\x79\x09\xbd\xbf\x3c\x47\x01\x8b\x13\x2c\xc9\x32\xaa\xaa\x1d\xd5\xee\xab\x36\xbd\x6c\xfd\x54\x6c\xc8\x08\x01\x3c\xbd\xe7\x07\x88\xb0\x24\x37\x79\x90\x28\x4a\x1d\x10\x1a\x92\x1b\x12\xa6\x38\x42\x40\xc3\x4c\x43\x62\x8e\xae\x36\xb0\x45\x71\x2a\xa4\x9a\x23\x79\x59\xb1\xa8\xf2\xa4\x0c\x60\x9f\xcc\x8d\x40\xf5\x80\xca\xa8\x99\xc3\xa7\x85\x1f\x31\x25\xa9\x82\xc5\x6d\xbd\xd8\x36\x76\x7c\x02\x28\x97\xf6\x1d\x74\x3b\x11\x7e\x91\xae\x32\xf8\x6c\xf4\xe6\x7b\x9a\xa5\x1f\x62\xc6\x21\xcf\x9a\xe5\xed\x8b\x02\xf3\x2c\x33\x33\xdf\x00\xca\xc9\x09\xb4\x04\xf5\xa5\x08\xd7\xc3\x02\x18\x66\xf1\xab\x1e\x83\x37\x4c\xcd\x12\xc1\x1d\x50\xf6\xaa\xbd\xfe\xe2\x73\x48\x38\x08\xa0\x32\x9b\x18\x44\x86\x0b\x6a\xc1\xaa\x26\x96\x2d\x96\x3c\xa0\x54\x65\x73\xe3\x08\xb5\x8b\x99\xbd\x82\xbc\x9e\xc2\xe8\x53\x46\x83\x3f\x33\x54\x2b\x5b\xad\x92\x79\xd9\x8f\x5d\x93\x98\xf2\xe6\xc6\x1c\xe6\x9a\x9e\xfc\x43\x82\x31\x66\x8e\x53\x77\xfe\x90\xe7\xf3\xf6\xe9\x62\x23\x3f\x10\x93\x18\xae\x72\x1a\x9d\xf9\x48\xcb\xcc\x5a\x65\xc7\x4a\x04\xf0\xf3\xd5\xd5\x05\x8a\x41\x08\xbc\x86\x86\x43\x51\x6c\xe0\x46\x57\xf6\x44\x40\x0d\xfb\xff\xa2\xc3\x7c\x3d\x39\x84\xdc\x09\x22\x64\x4f\x12\xd9\xba\xaa\xf6\xe3\xbd\x56\xdd\x91\x25\x6a\x14\x9c\x89\x34\x8e\x31\xdf\xee\x15\x7e\x2f\x39\x81\x15\x2a\x28\x95\x66\x51\xf5\xfd\x83\xc5\xfe\x15\x07\xcf\xf7\x08\xee\x1d\x8e\xb6\xc5\x52\xcc\x8c\x5a\x93\x66\xc5\xd8\x79\x38\x46\xd6\xa7\x88\x37\xc9\x2e\xe3\xd2\xa5\x7b\x4b\x3a\xdc\xa1\xdc\x9e\x29\xf1\x8c\x8a\x99\x16\x47\x8d\xd4\x78\x8b\xf6\x1c\xe9\x71\x54\x1b\x69\xa8\x4a\x93\x37\xe5\xb2\x2c\x4f\x0c\x92\xab\xa0\x73\x32\x72\x59\xd3\xf0\x2d\x8d\xed\xca\x37\x16\x19\x9e\xdb\x1c\xab\x17\x49\xc3\x0f\x37\xdc\x88\xb1\xb4\xd4\x42\xcb\x58\x5e\x6a\x52\x0b\x15\x10\x0a\xb0\x04\xe7\xf8\x58\x32\x16\x01\xa6\xcd\x01\xb2\xc2\x69\x24\x35\x38\x6f\x30\x6a\xae\x1b\xb4\x71\xaa\xad\x1d\xa0\xd6\x20\x2d\x8b\x3c\xc6\x82\x62\x27\x34\x6d\x15\x84\x7b\x43\xb1\x35\x78\xa6\x24\x77\x28\xc1\x6e\xfc\xe9\x48\x74\xf4\x15\xe3\xe1\x84\x42\x88\x40\x7a\x26\x49\x3b\x48\xb1\xa4\x19\x8e\x0c\xa7\xb5\x01\x6c\x0c\x97\x61\x8a\xc2\x32\xd8\x8c\x44\x69\x24\xbf\x65\x1d\x74\xd6\xe5\x44\xef\xec\x48\x5e\xb7\x8a\xa3\x29\x8e\x41\x64\xce\x1f\x88\xdc\x00\x47\x4b\x40\x98\x6e\xd1\x0d\x8e\x48\x98\x63\x5c\x21\xb1\x4c\x05\x0a\x58\x98\xc5\x6d\x4f\x0a\x77\x53\x4f\x8b\xc4\x44\x1f\xb2\xdf\x8d\x3b\xea\x9f\xfe\xf6\xf2\xc5\xff\x5d\x7f\xfe\x9f\xfb\x67\x8f\xff\xf3\xe9\x69\xd1\xfe\xb3\xc7\xfd\x3c\xf8\x3f\x71\x94\x82\x23\xd1\x72\x00\xb7\x42\x99\x6c\xc0\x60\x7b\x0f\x79\xea\xa8\x53\x4b\x56\x31\xfa\x0b\x52\x9f\x96\xdb\xcd\x2f\xd7\x67\xcd\x04\x19\x85\xfe\xdb\x02\x9a\x59\x03\xad\x63\x3c\xea\xff\x2e\x18\xfd\x00\xd9\xe2\x56\x60\x59\x93\xb9\xb6\xb2\x3e\x3c\x2c\xab\x0f\xa7\xb2\x89\x43\xc7\xf6\xd5\xce\x2e\xad\xa6\xa9\xed\xa6\xc6\x5a\xb4\xa6\x67\xdf\x8c\x26\x7b\x50\x5a\x91\x08\x2e\x6d\xd4\x3a\xc1\x9d\xf2\xdb\xde\x1e\xb2\x2c\x6c\xa5\x64\xc9\x16\xb4\x90\xaa\x4a\xb7\x0c\xde\x13\xc3\x2a\x9a\x11\x9b\x7a\x1b\x3d\x95\x97\x37\x31\x6b\x69\x7e\x34\xc0\x67\x1f\x66\x19\x49\xef\xf1\x25\xf5\xac\x0e\xea\x0a\x28\x8d\x4d\x7e\xd9\x57\x4b\x49\xe5\xc6\xb3\x25\xfd\xe6\x57\x42\x25\xac\xcd\xcf\x36\x74\x8e\xca\x24\x47\xe7\x80\xa8\x92\x72\xbd\x3d\x84\x2d\x65\xe2\x82\x1a\x9c\xc4\x44\x92\x1b\x10\x79\x8a\xc4\x4a\x2f\x60\x51\x04\x81\xaa\xf0\xa3\x95\x27\xd7\x12\x7b\xa3\x96\x03\x45\x96\xc1\x8a\x07\xc9\xb2\xb0\x95\x52\x8c\xef\x48\x9c\xc6\x7e\x94\xca\xc2\x0e\x07\x12\x44\xa9\x20\x37\xf0\xae\x0f\x49\xa3\x96\x9d\x4b\x42\x7b\x70\x59\x14\xee\xe0\xb2\x0f\x49\xa3\x96\x4b\x97\xbf\x00\x5d\x4b\x4f\xfc\xbb\x2b\xee\x92\xb9\x17\xb5\xaa\xb8\x0b\x97\x17\x9b\x43\xfd\xd6\xc2\xb2\xc2\x2e\x29\xcf\xfd\x87\x4a\x55\xda\x25\x63\x1f\x5a\x65\x69\x2b\x2d\x3d\x67\xe9\x41\xae\x5e\xc1\x6e\x2b\xd4\xdb\x3e\xa8\xd3\x26\xd2\x48\x92\x24\xca\x61\x86\x8f\x8c\xbb\xf2\x8e\x91\xdf\x1f\x06\x19\x33\xf3\x03\x4d\xba\xcd\xe2\x2d\xfb\x69\xe9\x16\x15\x13\xd5\x56\x85\x4e\x3c\x5b\x8a\xbf\x25\x72\x83\xee\x5e\x20\x22\xf2\xc8\xaa\x7b\xdb\x8e\xe4\x29\x58\xca\x38\xb7\x3f\x2e\x59\xb8\xbd\xa8\x16\x16\xf7\xdb\x79\x51\x9f\x5a\xb4\x8d\x87\x3a\x6e\xbc\x3e\xc5\xb4\xcd\x58\xf9\xf5\x3c\xb9\x6f\x49\xaf\x57\xc1\xfa\x1c\x5d\x6d\x88\x8a\x8b\xd3\x28\xcc\xb7\xef\x10\x8a\x4a\x74\xa9\x4a\xa7\x62\xbf\x0d\x76\x23\x6f\x59\xd9\x31\xee\x40\x11\xfb\x28\xec\x8d\x22\x1c\x13\x5a\x64\x94\x23\x16\x60\xbb\xd2\x7c\xa0\x98\xb2\xe5\x6e\xbc\x54\x33\xe0\x3e\xb9\x52\x17\xdb\xb7\x1b\xc8\x12\x20\x8c\x23\xca\x64\x7e\x78\xa3\x62\x5b\x75\x56\xd9\x9e\x2a\x91\x27\xb0\x70\x34\x1f\x90\x89\xb5\x86\x73\x7e\x71\xda\x1e\xfb\x3a\x72\xdc\x5e\x79\x88\xcb\x74\x79\xd9\x64\xe4\xd4\xc2\x9e\xce\xb1\xfe\x85\x5a\xc0\xe9\x0c\x34\x3d\xd0\x43\xce\xa1\x36\x39\xd5\xa1\x4e\xf5\xf8\xb1\xa9\x23\x08\x75\x84\xac\x53\x6c\x3a\xc5\xa6\x53\x6c\x3a\xc5\xa6\x7f\xc5\xd8\xf4\x51\xfd\xff\x25\x4e\xfa\x33\x05\xbe\x9d\x60\xd2\x04\x93\x6a\x5f\x33\x9b\x98\x50\xd2\xe1\x50\x52\xc6\xcc\xdb\x38\x91\xdb\xe6\xaa\xa2\x8f\xa1\x6a\xa6\xd4\xc6\x56\xd6\x8c\x40\x02\x68\x48\xe8\x1a\xe1\x9a\xd9\x2e\xb7\x05\xc3\x34\xda\x2a\xbb\xcd\x12\x36\x98\x22\x50\x4c\xa1\x1b\xc5\xd5\x84\xf0\xbe\x24\x84\xf7\x2f\x22\x37\xef\x94\xd7\x9f\xa0\xde\x04\xf5\x26\xa8\x37\x41\x3d\x64\x40\x3d\xe5\xf2\xde\x60\x89\x27\xb4\x37\xa1\xbd\xda\xd7\xd2\x2c\x26\xc0\x37\x01\x3e\x1b\xef\x5f\x06\xe0\x6b\x7c\x5c\x91\x08\x26\x10\x38\x81\xc0\x09\x04\x76\x4a\x3d\x81\xc0\xbf\x12\x08\x4c\xb0\xdc\x7c\x99\x00\xd0\x75\x70\xb4\xf8\x5a\x7c\xea\xde\x3e\x39\x08\x30\x5a\x27\x35\xed\xb4\x65\xad\x69\x74\x10\x88\x79\xe2\x30\x52\x19\xd6\x04\x21\xa7\x95\xd5\x0e\x03\xf8\xda\x20\xd7\x84\xb4\x26\xa4\x35\x21\xad\x09\x69\x21\x03\x69\x51\x46\xff\xff\x18\x9b\x54\xed\x87\x47\x06\x9d\x4e\x73\x6e\x9a\xb3\xa9\xce\x83\x5e\x4b\xc6\x71\x20\x45\xd7\x72\xf5\x40\x72\x0e\x34\x6c\xf4\x6c\xf3\xba\x5e\x4b\x97\x0e\x52\xb8\xbe\x8b\x79\xa0\x10\x86\xa1\x75\xb0\x6f\xec\xc8\xf4\x3d\x4d\x7b\x86\xc2\x02\x31\x12\x51\xbf\x07\x94\xad\x10\xd6\x2e\x79\xcf\xe9\x1c\xf5\x1e\x31\x23\x5c\x18\xfb\x9c\xfb\x70\xe0\x62\xbd\xf7\xb5\x94\xcf\xf3\xf6\xfa\xc5\x4e\x9c\x85\x76\x1d\xae\x37\xbc\xde\xa3\x41\xcb\x29\xd0\x5e\x70\x67\x50\x93\x6d\x98\xa8\xd3\x67\x0f\x68\xb1\xeb\x38\x47\x07\x10\x1b\xd2\xe2\x18\x68\x6d\x40\xbb\xa3\x40\xba\x21\xf2\x8e\x81\xfb\xf6\x92\x77\x2f\x70\xe8\xdb\xb2\x36\xbf\x30\x91\xc5\x21\xe7\x45\xcc\x34\x0c\x48\x8e\xd0\xf2\x9b\x7c\x3c\xbd\x1c\x04\x3e\x07\xe8\x7c\x2f\x84\x7a\x48\x4d\x1f\xba\xe1\x76\x45\x7b\x60\xe0\x01\xca\xee\x04\xca\x31\xbe\x73\x5f\xa3\x70\x0c\xad\x1f\xa5\xf5\x76\xd5\xbb\xd2\x7e\xfb\x30\x90\xcf\xfa\x67\x7a\xe6\xc3\x37\x42\x19\xe2\xc9\x9c\x61\x4c\xe7\xd1\x77\x55\x86\x6e\x8f\x7b\x85\x42\x33\xa3\xaa\x57\xae\xfd\xd5\xcc\x9c\x56\x68\xe2\xde\x0e\xa8\x2c\xa9\xb0\x7d\xf0\x54\x2d\x80\xf2\x48\x39\x3d\x98\x1a\x6d\x0b\x9d\xba\x53\xfb\xce\xf8\xd1\x7e\xbb\x60\x4f\x06\xf5\xce\xda\xab\xeb\xca\xcb\xd5\xac\x20\xda\x72\x3b\xa2\x4b\x38\xd7\xb5\x89\xbe\x42\xd9\xb9\x73\xc4\x0c\x6d\xb7\xd9\xf8\x8d\xbd\x3e\x9c\xf5\x53\x68\x48\x14\x36\x8f\x09\xc5\x92\xf1\x21\xd1\x09\x07\x1c\xbe\xa7\x91\xf3\x6a\xc8\xc1\x57\xb0\xdd\xc5\xc6\x1d\xad\x76\x1d\xa8\x82\x0e\x4c\x38\xfe\xa5\x8c\xc5\x0a\x40\x5d\xa1\xbb\x98\xd1\xfb\x74\x61\xed\x1a\x98\xaf\x3c\x8c\x1e\xe3\xc2\x92\x29\x74\x3e\x99\xd0\xf9\x41\x50\xd0\x38\x4b\x57\x7e\x5b\x7a\x0e\xe6\xce\x4e\xd7\x19\x35\x57\xbb\x3c\x3c\xd2\x5e\x4f\x4b\x4c\xf7\x0f\x4d\x2b\x91\x5d\x94\xa6\x95\xc8\x69\x25\x72\x5a\x89\x7c\xb8\x95\xc8\x07\x80\x8c\xda\x9c\x64\x7b\xb7\x71\xdf\x57\x12\x4b\x9a\x1f\x72\x0c\x13\x03\xad\x3c\xd5\x4e\xde\x8e\x57\x13\x6d\x34\x86\xcf\x97\xe6\xa4\x68\xc4\xb0\xf6\xc9\xc2\xeb\x8d\x0b\xd7\xcd\xfe\xba\xa6\xf5\x30\xeb\x30\x33\xbe\xc7\x56\x27\xab\x08\xd9\x6d\xbb\x09\xee\x7c\x2d\xcf\xee\x87\x38\xac\xc8\xdd\x90\x9a\x58\x4a\x4e\x96\xa9\x79\x79\xf3\xde\x20\xf0\x96\xe3\x24\x19\xeb\xba\xf2\x53\x19\xab\x12\xaf\x47\xb3\xa0\x3e\xef\x9b\x8d\x6d\x6d\x7b\xde\x3b\x3b\x1a\xc0\x3f\x95\x7e\xed\x78\xfb\x76\xb8\xaf\xb3\xdd\xc5\xeb\x95\xed\x5a\x62\x41\x82\xb3\x54\x6e\x80\x4a\x92\x6f\x36\xbd\x34\xae\xde\x6f\xa4\xc0\xbc\x08\xe3\x84\xfc\x1d\xb6\xe3\xd0\x62\x38\x95\x9b\x57\xe7\x71\x12\x91\x80\xc8\x31\x69\x5e\x60\x21\x6e\x19\x0f\xc7\xa4\x79\x96\x28\x3e\x47\x54\x65\x41\x36\x08\x40\x88\x1f\x58\x08\x56\xaa\xd5\xbf\xaf\xad\x96\xd7\xd6\xcf\x87\xf5\x34\x0f\x71\x93\x6e\x26\xed\x98\x5b\x9f\x4f\xcf\x95\x34\xc6\xd7\x11\xfa\xb0\x81\x22\x1a\xdb\xdf\x8e\xdc\xc3\xb9\xf8\xdd\x5d\x3c\x74\xe6\xea\xb7\x8b\xbf\xf5\x6e\xb3\x46\x2e\x64\xf4\xab\x3c\x4e\xcf\x36\x1d\xfe\xfa\xb8\x36\xba\x8a\xd8\xad\xf6\xc6\x41\x2a\x37\x8c\x17\x0f\xda\xfe\xda\xe7\x65\xbc\x71\x2c\x36\x57\x8a\x47\x12\x4c\xf1\xbd\x77\x6b\xa4\x50\x7e\x77\x7b\x22\x60\x89\xef\xcd\xf5\xb9\x0c\x97\x79\x0d\x2b\x35\x43\xcb\x3d\x24\xf1\x78\xfc\xf8\xcb\x1f\x15\x06\xe2\x78\xd8\x51\x21\xd9\x1f\xf0\xf5\x8f\x86\xa4\x50\xfa\xb1\x47\x43\xa5\xdd\x69\x14\xe8\xa3\xc0\x86\x91\xa7\x81\x50\xb4\x7c\xc0\x81\x80\x77\x7a\x9f\xc6\xc2\xa9\x8c\x05\x33\xb0\x3b\x31\xa4\xf4\xd7\x1b\x26\x55\x97\x7c\x65\xf8\x69\x1a\x84\x8e\x41\x78\xd9\xec\xc5\x11\x16\x1e\x74\x91\xf5\x56\xf5\x57\x49\x47\x5c\x92\xa9\x1e\x99\x36\xf4\xdb\xb1\x0e\xd3\x78\x02\xb0\x9b\x25\xcb\xe9\xe9\x1d\x0d\x44\x01\x42\x08\x91\x64\xd9\xdd\x37\x08\x17\xef\xf9\xe5\x0f\xbd\x46\x91\xf5\xf9\x89\x92\x37\xdd\x89\x59\x44\x1f\x9c\xee\x34\x1e\xbe\x47\x83\x32\x72\x8e\x37\xdf\xac\x69\x38\xef\x75\xb0\xda\xdb\xac\x83\x94\x2f\x39\xa6\x62\x05\x1c\x25\x9c\x49\x16\xb0\xa8\x3c\xc7\x7e\x76\x71\x3e\x6f\xb5\x24\xe7\xe8\xb7\xb9\xc7\x6c\x43\x92\xee\x21\xd4\x17\xa1\x7f\xba\x35\xfe\xae\x39\xbc\xde\xba\x69\xd9\x8e\xe1\x62\xde\x64\x7d\x16\x88\x1b\xed\x29\x11\xfd\x4f\xa9\xff\x99\x90\xc4\xf6\xf4\xf9\x6e\xe9\x28\x23\xd7\xca\xe5\xee\xee\x9f\x63\xb1\x5b\xfb\x10\xd7\x2f\x1d\xf2\xe3\xbf\xb9\xb5\x6f\xa4\x6d\x7d\x25\x79\xfb\x24\x31\xea\x56\xbe\x5d\x53\xcd\x2d\x36\xa3\x6d\xdf\xab\x1c\xb8\x6d\x6f\xc0\x98\xa7\xdd\xaa\x86\x8c\x1d\x39\xa3\x9d\x70\x2b\x9b\x68\xd9\xfd\x33\xfe\xa9\xb6\x4a\x2e\x63\x0f\xcf\x68\x27\xd9\x4c\xb9\x46\x6d\xcb\xbe\xa1\xa8\xd6\x5f\xc6\xd6\x9f\xf1\x4f\xf4\xd4\xb4\x78\xd0\xd6\xf4\x13\x3c\x3b\xac\xd0\xdc\x90\x34\xda\xc9\xb4\x9a\x1a\x8d\xbd\x93\x87\xd4\xe2\x21\x1b\xb3\x2b\xd1\xbe\xe7\x69\xd4\x53\x67\xd5\x40\xa0\xe3\x19\x3f\x6d\x1a\xbc\x0e\x86\x3c\x10\xb4\x3d\x2a\xcd\x78\x32\xe6\xab\xbd\x36\xc9\xf4\x3a\x58\xae\xc3\xf4\x47\xea\xbf\xfb\x47\xff\x0d\x00\x00\xff\xff\xd2\x32\x5a\x28\x38\x9d\x00\x00")
+
+func v2SchemaJsonBytes() ([]byte, error) {
+ return bindataRead(
+ _v2SchemaJson,
+ "v2/schema.json",
+ )
+}
+
+func v2SchemaJson() (*asset, error) {
+ bytes, err := v2SchemaJsonBytes()
+ if err != nil {
+ return nil, err
+ }
+
+ info := bindataFileInfo{name: "v2/schema.json", size: 40248, mode: os.FileMode(0640), modTime: time.Unix(1568964748, 0)}
+ a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xab, 0x88, 0x5e, 0xf, 0xbf, 0x17, 0x74, 0x0, 0xb2, 0x5a, 0x7f, 0xbc, 0x58, 0xcd, 0xc, 0x25, 0x73, 0xd5, 0x29, 0x1c, 0x7a, 0xd0, 0xce, 0x79, 0xd4, 0x89, 0x31, 0x27, 0x90, 0xf2, 0xff, 0xe6}}
+ return a, nil
+}
+
+// Asset loads and returns the asset for the given name.
+// It returns an error if the asset could not be found or
+// could not be loaded.
+func Asset(name string) ([]byte, error) {
+ canonicalName := strings.Replace(name, "\\", "/", -1)
+ if f, ok := _bindata[canonicalName]; ok {
+ a, err := f()
+ if err != nil {
+ return nil, fmt.Errorf("Asset %s can't read by error: %v", name, err)
+ }
+ return a.bytes, nil
+ }
+ return nil, fmt.Errorf("Asset %s not found", name)
+}
+
+// AssetString returns the asset contents as a string (instead of a []byte).
+func AssetString(name string) (string, error) {
+ data, err := Asset(name)
+ return string(data), err
+}
+
+// MustAsset is like Asset but panics when Asset would return an error.
+// It simplifies safe initialization of global variables.
+func MustAsset(name string) []byte {
+ a, err := Asset(name)
+ if err != nil {
+ panic("asset: Asset(" + name + "): " + err.Error())
+ }
+
+ return a
+}
+
+// MustAssetString is like AssetString but panics when Asset would return an
+// error. It simplifies safe initialization of global variables.
+func MustAssetString(name string) string {
+ return string(MustAsset(name))
+}
+
+// AssetInfo loads and returns the asset info for the given name.
+// It returns an error if the asset could not be found or
+// could not be loaded.
+func AssetInfo(name string) (os.FileInfo, error) {
+ canonicalName := strings.Replace(name, "\\", "/", -1)
+ if f, ok := _bindata[canonicalName]; ok {
+ a, err := f()
+ if err != nil {
+ return nil, fmt.Errorf("AssetInfo %s can't read by error: %v", name, err)
+ }
+ return a.info, nil
+ }
+ return nil, fmt.Errorf("AssetInfo %s not found", name)
+}
+
+// AssetDigest returns the digest of the file with the given name. It returns an
+// error if the asset could not be found or the digest could not be loaded.
+func AssetDigest(name string) ([sha256.Size]byte, error) {
+ canonicalName := strings.Replace(name, "\\", "/", -1)
+ if f, ok := _bindata[canonicalName]; ok {
+ a, err := f()
+ if err != nil {
+ return [sha256.Size]byte{}, fmt.Errorf("AssetDigest %s can't read by error: %v", name, err)
+ }
+ return a.digest, nil
+ }
+ return [sha256.Size]byte{}, fmt.Errorf("AssetDigest %s not found", name)
+}
+
+// Digests returns a map of all known files and their checksums.
+func Digests() (map[string][sha256.Size]byte, error) {
+ mp := make(map[string][sha256.Size]byte, len(_bindata))
+ for name := range _bindata {
+ a, err := _bindata[name]()
+ if err != nil {
+ return nil, err
+ }
+ mp[name] = a.digest
+ }
+ return mp, nil
+}
+
+// AssetNames returns the names of the assets.
+func AssetNames() []string {
+ names := make([]string, 0, len(_bindata))
+ for name := range _bindata {
+ names = append(names, name)
+ }
+ return names
+}
+
+// _bindata is a table, holding each asset generator, mapped to its name.
+var _bindata = map[string]func() (*asset, error){
+ "jsonschema-draft-04.json": jsonschemaDraft04Json,
+
+ "v2/schema.json": v2SchemaJson,
+}
+
+// AssetDir returns the file names below a certain
+// directory embedded in the file by go-bindata.
+// For example if you run go-bindata on data/... and data contains the
+// following hierarchy:
+// data/
+// foo.txt
+// img/
+// a.png
+// b.png
+// then AssetDir("data") would return []string{"foo.txt", "img"},
+// AssetDir("data/img") would return []string{"a.png", "b.png"},
+// AssetDir("foo.txt") and AssetDir("notexist") would return an error, and
+// AssetDir("") will return []string{"data"}.
+func AssetDir(name string) ([]string, error) {
+ node := _bintree
+ if len(name) != 0 {
+ canonicalName := strings.Replace(name, "\\", "/", -1)
+ pathList := strings.Split(canonicalName, "/")
+ for _, p := range pathList {
+ node = node.Children[p]
+ if node == nil {
+ return nil, fmt.Errorf("Asset %s not found", name)
+ }
+ }
+ }
+ if node.Func != nil {
+ return nil, fmt.Errorf("Asset %s not found", name)
+ }
+ rv := make([]string, 0, len(node.Children))
+ for childName := range node.Children {
+ rv = append(rv, childName)
+ }
+ return rv, nil
+}
+
+type bintree struct {
+ Func func() (*asset, error)
+ Children map[string]*bintree
+}
+
+var _bintree = &bintree{nil, map[string]*bintree{
+ "jsonschema-draft-04.json": {jsonschemaDraft04Json, map[string]*bintree{}},
+ "v2": {nil, map[string]*bintree{
+ "schema.json": {v2SchemaJson, map[string]*bintree{}},
+ }},
+}}
+
+// RestoreAsset restores an asset under the given directory.
+func RestoreAsset(dir, name string) error {
+ data, err := Asset(name)
+ if err != nil {
+ return err
+ }
+ info, err := AssetInfo(name)
+ if err != nil {
+ return err
+ }
+ err = os.MkdirAll(_filePath(dir, filepath.Dir(name)), os.FileMode(0755))
+ if err != nil {
+ return err
+ }
+ err = ioutil.WriteFile(_filePath(dir, name), data, info.Mode())
+ if err != nil {
+ return err
+ }
+ return os.Chtimes(_filePath(dir, name), info.ModTime(), info.ModTime())
+}
+
+// RestoreAssets restores an asset under the given directory recursively.
+func RestoreAssets(dir, name string) error {
+ children, err := AssetDir(name)
+ // File
+ if err != nil {
+ return RestoreAsset(dir, name)
+ }
+ // Dir
+ for _, child := range children {
+ err = RestoreAssets(dir, filepath.Join(name, child))
+ if err != nil {
+ return err
+ }
+ }
+ return nil
+}
+
+func _filePath(dir, name string) string {
+ canonicalName := strings.Replace(name, "\\", "/", -1)
+ return filepath.Join(append([]string{dir}, strings.Split(canonicalName, "/")...)...)
+}
diff --git a/vendor/github.com/go-openapi/spec/embed.go b/vendor/github.com/go-openapi/spec/embed.go
deleted file mode 100644
index 1f428475..00000000
--- a/vendor/github.com/go-openapi/spec/embed.go
+++ /dev/null
@@ -1,17 +0,0 @@
-package spec
-
-import (
- "embed"
- "path"
-)
-
-//go:embed schemas/*.json schemas/*/*.json
-var assets embed.FS
-
-func jsonschemaDraft04JSONBytes() ([]byte, error) {
- return assets.ReadFile(path.Join("schemas", "jsonschema-draft-04.json"))
-}
-
-func v2SchemaJSONBytes() ([]byte, error) {
- return assets.ReadFile(path.Join("schemas", "v2", "schema.json"))
-}
diff --git a/vendor/github.com/go-openapi/spec/expander.go b/vendor/github.com/go-openapi/spec/expander.go
index b81a5699..d4ea889d 100644
--- a/vendor/github.com/go-openapi/spec/expander.go
+++ b/vendor/github.com/go-openapi/spec/expander.go
@@ -27,6 +27,7 @@ import (
// all relative $ref's will be resolved from there.
//
// PathLoader injects a document loading method. By default, this resolves to the function provided by the SpecLoader package variable.
+//
type ExpandOptions struct {
RelativeBase string // the path to the root document to expand. This is a file, not a directory
SkipSchemas bool // do not expand schemas, just paths, parameters and responses
@@ -57,7 +58,7 @@ func ExpandSpec(spec *Swagger, options *ExpandOptions) error {
if !options.SkipSchemas {
for key, definition := range spec.Definitions {
parentRefs := make([]string, 0, 10)
- parentRefs = append(parentRefs, "#/definitions/"+key)
+ parentRefs = append(parentRefs, fmt.Sprintf("#/definitions/%s", key))
def, err := expandSchema(definition, parentRefs, resolver, specBasePath)
if resolver.shouldStopOnError(err) {
@@ -102,21 +103,15 @@ const rootBase = ".root"
// baseForRoot loads in the cache the root document and produces a fake ".root" base path entry
// for further $ref resolution
+//
+// Setting the cache is optional and this parameter may safely be left to nil.
func baseForRoot(root interface{}, cache ResolutionCache) string {
- // cache the root document to resolve $ref's
- normalizedBase := normalizeBase(rootBase)
-
if root == nil {
- // ensure that we never leave a nil root: always cache the root base pseudo-document
- cachedRoot, found := cache.Get(normalizedBase)
- if found && cachedRoot != nil {
- // the cache is already preloaded with a root
- return normalizedBase
- }
-
- root = map[string]interface{}{}
+ return ""
}
+ // cache the root document to resolve $ref's
+ normalizedBase := normalizeBase(rootBase)
cache.Set(normalizedBase, root)
return normalizedBase
@@ -213,19 +208,7 @@ func expandSchema(target Schema, parentRefs []string, resolver *schemaLoader, ba
}
if target.Ref.String() != "" {
- if !resolver.options.SkipSchemas {
- return expandSchemaRef(target, parentRefs, resolver, basePath)
- }
-
- // when "expand" with SkipSchema, we just rebase the existing $ref without replacing
- // the full schema.
- rebasedRef, err := NewRef(normalizeURI(target.Ref.String(), basePath))
- if err != nil {
- return nil, err
- }
- target.Ref = denormalizeRef(&rebasedRef, resolver.context.basePath, resolver.context.rootID)
-
- return &target, nil
+ return expandSchemaRef(target, parentRefs, resolver, basePath)
}
for k := range target.Definitions {
@@ -537,25 +520,21 @@ func getRefAndSchema(input interface{}) (*Ref, *Schema, error) {
}
func expandParameterOrResponse(input interface{}, resolver *schemaLoader, basePath string) error {
- ref, sch, err := getRefAndSchema(input)
+ ref, _, err := getRefAndSchema(input)
if err != nil {
return err
}
- if ref == nil && sch == nil { // nothing to do
+ if ref == nil {
return nil
}
parentRefs := make([]string, 0, 10)
- if ref != nil {
- // dereference this $ref
- if err = resolver.deref(input, parentRefs, basePath); resolver.shouldStopOnError(err) {
- return err
- }
-
- ref, sch, _ = getRefAndSchema(input)
+ if err = resolver.deref(input, parentRefs, basePath); resolver.shouldStopOnError(err) {
+ return err
}
+ ref, sch, _ := getRefAndSchema(input)
if ref.String() != "" {
transitiveResolver := resolver.transitiveResolver(basePath, *ref)
basePath = resolver.updateBasePath(transitiveResolver, basePath)
@@ -567,7 +546,6 @@ func expandParameterOrResponse(input interface{}, resolver *schemaLoader, basePa
if ref != nil {
*ref = Ref{}
}
-
return nil
}
@@ -577,29 +555,38 @@ func expandParameterOrResponse(input interface{}, resolver *schemaLoader, basePa
return ern
}
- if resolver.isCircular(&rebasedRef, basePath, parentRefs...) {
+ switch {
+ case resolver.isCircular(&rebasedRef, basePath, parentRefs...):
// this is a circular $ref: stop expansion
if !resolver.options.AbsoluteCircularRef {
sch.Ref = denormalizeRef(&rebasedRef, resolver.context.basePath, resolver.context.rootID)
} else {
sch.Ref = rebasedRef
}
+ case !resolver.options.SkipSchemas:
+ // schema expanded to a $ref in another root
+ sch.Ref = rebasedRef
+ debugLog("rebased to: %s", sch.Ref.String())
+ default:
+ // skip schema expansion but rebase $ref to schema
+ sch.Ref = denormalizeRef(&rebasedRef, resolver.context.basePath, resolver.context.rootID)
}
}
- // $ref expansion or rebasing is performed by expandSchema below
if ref != nil {
*ref = Ref{}
}
// expand schema
- // yes, we do it even if options.SkipSchema is true: we have to go down that rabbit hole and rebase nested $ref)
- s, err := expandSchema(*sch, parentRefs, resolver, basePath)
- if resolver.shouldStopOnError(err) {
- return err
- }
-
- if s != nil { // guard for when continuing on error
+ if !resolver.options.SkipSchemas {
+ s, err := expandSchema(*sch, parentRefs, resolver, basePath)
+ if resolver.shouldStopOnError(err) {
+ return err
+ }
+ if s == nil {
+ // guard for when continuing on error
+ return nil
+ }
*sch = *s
}
diff --git a/vendor/github.com/go-openapi/spec/normalizer_nonwindows.go b/vendor/github.com/go-openapi/spec/normalizer_nonwindows.go
index f19f1a8f..2df07231 100644
--- a/vendor/github.com/go-openapi/spec/normalizer_nonwindows.go
+++ b/vendor/github.com/go-openapi/spec/normalizer_nonwindows.go
@@ -40,5 +40,5 @@ func repairURI(in string) (*url.URL, string) {
return u, ""
}
-func fixWindowsURI(_ *url.URL, _ string) {
+func fixWindowsURI(u *url.URL, in string) {
}
diff --git a/vendor/github.com/go-openapi/spec/operation.go b/vendor/github.com/go-openapi/spec/operation.go
index a69cca88..995ce6ac 100644
--- a/vendor/github.com/go-openapi/spec/operation.go
+++ b/vendor/github.com/go-openapi/spec/operation.go
@@ -217,12 +217,9 @@ func (o *Operation) AddParam(param *Parameter) *Operation {
for i, p := range o.Parameters {
if p.Name == param.Name && p.In == param.In {
- params := make([]Parameter, 0, len(o.Parameters)+1)
- params = append(params, o.Parameters[:i]...)
- params = append(params, *param)
+ params := append(o.Parameters[:i], *param)
params = append(params, o.Parameters[i+1:]...)
o.Parameters = params
-
return o
}
}
diff --git a/vendor/github.com/go-openapi/spec/parameter.go b/vendor/github.com/go-openapi/spec/parameter.go
index bd4f1cdb..2b2b89b6 100644
--- a/vendor/github.com/go-openapi/spec/parameter.go
+++ b/vendor/github.com/go-openapi/spec/parameter.go
@@ -84,27 +84,27 @@ type ParamProps struct {
// Parameter a unique parameter is defined by a combination of a [name](#parameterName) and [location](#parameterIn).
//
// There are five possible parameter types.
-// - Path - Used together with [Path Templating](#pathTemplating), where the parameter value is actually part
-// of the operation's URL. This does not include the host or base path of the API. For example, in `/items/{itemId}`,
-// the path parameter is `itemId`.
-// - Query - Parameters that are appended to the URL. For example, in `/items?id=###`, the query parameter is `id`.
-// - Header - Custom headers that are expected as part of the request.
-// - Body - The payload that's appended to the HTTP request. Since there can only be one payload, there can only be
-// _one_ body parameter. The name of the body parameter has no effect on the parameter itself and is used for
-// documentation purposes only. Since Form parameters are also in the payload, body and form parameters cannot exist
-// together for the same operation.
-// - Form - Used to describe the payload of an HTTP request when either `application/x-www-form-urlencoded` or
-// `multipart/form-data` are used as the content type of the request (in Swagger's definition,
-// the [`consumes`](#operationConsumes) property of an operation). This is the only parameter type that can be used
-// to send files, thus supporting the `file` type. Since form parameters are sent in the payload, they cannot be
-// declared together with a body parameter for the same operation. Form parameters have a different format based on
-// the content-type used (for further details, consult http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4).
-// - `application/x-www-form-urlencoded` - Similar to the format of Query parameters but as a payload.
-// For example, `foo=1&bar=swagger` - both `foo` and `bar` are form parameters. This is normally used for simple
-// parameters that are being transferred.
-// - `multipart/form-data` - each parameter takes a section in the payload with an internal header.
-// For example, for the header `Content-Disposition: form-data; name="submit-name"` the name of the parameter is
-// `submit-name`. This type of form parameters is more commonly used for file transfers.
+// * Path - Used together with [Path Templating](#pathTemplating), where the parameter value is actually part
+// of the operation's URL. This does not include the host or base path of the API. For example, in `/items/{itemId}`,
+// the path parameter is `itemId`.
+// * Query - Parameters that are appended to the URL. For example, in `/items?id=###`, the query parameter is `id`.
+// * Header - Custom headers that are expected as part of the request.
+// * Body - The payload that's appended to the HTTP request. Since there can only be one payload, there can only be
+// _one_ body parameter. The name of the body parameter has no effect on the parameter itself and is used for
+// documentation purposes only. Since Form parameters are also in the payload, body and form parameters cannot exist
+// together for the same operation.
+// * Form - Used to describe the payload of an HTTP request when either `application/x-www-form-urlencoded` or
+// `multipart/form-data` are used as the content type of the request (in Swagger's definition,
+// the [`consumes`](#operationConsumes) property of an operation). This is the only parameter type that can be used
+// to send files, thus supporting the `file` type. Since form parameters are sent in the payload, they cannot be
+// declared together with a body parameter for the same operation. Form parameters have a different format based on
+// the content-type used (for further details, consult http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4).
+// * `application/x-www-form-urlencoded` - Similar to the format of Query parameters but as a payload.
+// For example, `foo=1&bar=swagger` - both `foo` and `bar` are form parameters. This is normally used for simple
+// parameters that are being transferred.
+// * `multipart/form-data` - each parameter takes a section in the payload with an internal header.
+// For example, for the header `Content-Disposition: form-data; name="submit-name"` the name of the parameter is
+// `submit-name`. This type of form parameters is more commonly used for file transfers.
//
// For more information: http://goo.gl/8us55a#parameterObject
type Parameter struct {
diff --git a/vendor/github.com/go-openapi/spec/schema_loader.go b/vendor/github.com/go-openapi/spec/schema_loader.go
index 0059b99a..b81175af 100644
--- a/vendor/github.com/go-openapi/spec/schema_loader.go
+++ b/vendor/github.com/go-openapi/spec/schema_loader.go
@@ -168,7 +168,14 @@ func (r *schemaLoader) load(refURL *url.URL) (interface{}, url.URL, bool, error)
normalized := normalizeBase(pth)
debugLog("loading doc from: %s", normalized)
- data, fromCache := r.cache.Get(normalized)
+ unescaped, err := url.PathUnescape(normalized)
+ if err != nil {
+ return nil, url.URL{}, false, err
+ }
+
+ u := url.URL{Path: unescaped}
+
+ data, fromCache := r.cache.Get(u.RequestURI())
if fromCache {
return data, toFetch, fromCache, nil
}
diff --git a/vendor/github.com/go-openapi/spec/schemas/jsonschema-draft-04.json b/vendor/github.com/go-openapi/spec/schemas/jsonschema-draft-04.json
deleted file mode 100644
index bcbb8474..00000000
--- a/vendor/github.com/go-openapi/spec/schemas/jsonschema-draft-04.json
+++ /dev/null
@@ -1,149 +0,0 @@
-{
- "id": "http://json-schema.org/draft-04/schema#",
- "$schema": "http://json-schema.org/draft-04/schema#",
- "description": "Core schema meta-schema",
- "definitions": {
- "schemaArray": {
- "type": "array",
- "minItems": 1,
- "items": { "$ref": "#" }
- },
- "positiveInteger": {
- "type": "integer",
- "minimum": 0
- },
- "positiveIntegerDefault0": {
- "allOf": [ { "$ref": "#/definitions/positiveInteger" }, { "default": 0 } ]
- },
- "simpleTypes": {
- "enum": [ "array", "boolean", "integer", "null", "number", "object", "string" ]
- },
- "stringArray": {
- "type": "array",
- "items": { "type": "string" },
- "minItems": 1,
- "uniqueItems": true
- }
- },
- "type": "object",
- "properties": {
- "id": {
- "type": "string"
- },
- "$schema": {
- "type": "string"
- },
- "title": {
- "type": "string"
- },
- "description": {
- "type": "string"
- },
- "default": {},
- "multipleOf": {
- "type": "number",
- "minimum": 0,
- "exclusiveMinimum": true
- },
- "maximum": {
- "type": "number"
- },
- "exclusiveMaximum": {
- "type": "boolean",
- "default": false
- },
- "minimum": {
- "type": "number"
- },
- "exclusiveMinimum": {
- "type": "boolean",
- "default": false
- },
- "maxLength": { "$ref": "#/definitions/positiveInteger" },
- "minLength": { "$ref": "#/definitions/positiveIntegerDefault0" },
- "pattern": {
- "type": "string",
- "format": "regex"
- },
- "additionalItems": {
- "anyOf": [
- { "type": "boolean" },
- { "$ref": "#" }
- ],
- "default": {}
- },
- "items": {
- "anyOf": [
- { "$ref": "#" },
- { "$ref": "#/definitions/schemaArray" }
- ],
- "default": {}
- },
- "maxItems": { "$ref": "#/definitions/positiveInteger" },
- "minItems": { "$ref": "#/definitions/positiveIntegerDefault0" },
- "uniqueItems": {
- "type": "boolean",
- "default": false
- },
- "maxProperties": { "$ref": "#/definitions/positiveInteger" },
- "minProperties": { "$ref": "#/definitions/positiveIntegerDefault0" },
- "required": { "$ref": "#/definitions/stringArray" },
- "additionalProperties": {
- "anyOf": [
- { "type": "boolean" },
- { "$ref": "#" }
- ],
- "default": {}
- },
- "definitions": {
- "type": "object",
- "additionalProperties": { "$ref": "#" },
- "default": {}
- },
- "properties": {
- "type": "object",
- "additionalProperties": { "$ref": "#" },
- "default": {}
- },
- "patternProperties": {
- "type": "object",
- "additionalProperties": { "$ref": "#" },
- "default": {}
- },
- "dependencies": {
- "type": "object",
- "additionalProperties": {
- "anyOf": [
- { "$ref": "#" },
- { "$ref": "#/definitions/stringArray" }
- ]
- }
- },
- "enum": {
- "type": "array",
- "minItems": 1,
- "uniqueItems": true
- },
- "type": {
- "anyOf": [
- { "$ref": "#/definitions/simpleTypes" },
- {
- "type": "array",
- "items": { "$ref": "#/definitions/simpleTypes" },
- "minItems": 1,
- "uniqueItems": true
- }
- ]
- },
- "format": { "type": "string" },
- "allOf": { "$ref": "#/definitions/schemaArray" },
- "anyOf": { "$ref": "#/definitions/schemaArray" },
- "oneOf": { "$ref": "#/definitions/schemaArray" },
- "not": { "$ref": "#" }
- },
- "dependencies": {
- "exclusiveMaximum": [ "maximum" ],
- "exclusiveMinimum": [ "minimum" ]
- },
- "default": {}
-}
diff --git a/vendor/github.com/go-openapi/spec/schemas/v2/schema.json b/vendor/github.com/go-openapi/spec/schemas/v2/schema.json
deleted file mode 100644
index ebe10ed3..00000000
--- a/vendor/github.com/go-openapi/spec/schemas/v2/schema.json
+++ /dev/null
@@ -1,1607 +0,0 @@
-{
- "title": "A JSON Schema for Swagger 2.0 API.",
- "id": "http://swagger.io/v2/schema.json#",
- "$schema": "http://json-schema.org/draft-04/schema#",
- "type": "object",
- "required": [
- "swagger",
- "info",
- "paths"
- ],
- "additionalProperties": false,
- "patternProperties": {
- "^x-": {
- "$ref": "#/definitions/vendorExtension"
- }
- },
- "properties": {
- "swagger": {
- "type": "string",
- "enum": [
- "2.0"
- ],
- "description": "The Swagger version of this document."
- },
- "info": {
- "$ref": "#/definitions/info"
- },
- "host": {
- "type": "string",
- "pattern": "^[^{}/ :\\\\]+(?::\\d+)?$",
- "description": "The host (name or ip) of the API. Example: 'swagger.io'"
- },
- "basePath": {
- "type": "string",
- "pattern": "^/",
- "description": "The base path to the API. Example: '/api'."
- },
- "schemes": {
- "$ref": "#/definitions/schemesList"
- },
- "consumes": {
- "description": "A list of MIME types accepted by the API.",
- "allOf": [
- {
- "$ref": "#/definitions/mediaTypeList"
- }
- ]
- },
- "produces": {
- "description": "A list of MIME types the API can produce.",
- "allOf": [
- {
- "$ref": "#/definitions/mediaTypeList"
- }
- ]
- },
- "paths": {
- "$ref": "#/definitions/paths"
- },
- "definitions": {
- "$ref": "#/definitions/definitions"
- },
- "parameters": {
- "$ref": "#/definitions/parameterDefinitions"
- },
- "responses": {
- "$ref": "#/definitions/responseDefinitions"
- },
- "security": {
- "$ref": "#/definitions/security"
- },
- "securityDefinitions": {
- "$ref": "#/definitions/securityDefinitions"
- },
- "tags": {
- "type": "array",
- "items": {
- "$ref": "#/definitions/tag"
- },
- "uniqueItems": true
- },
- "externalDocs": {
- "$ref": "#/definitions/externalDocs"
- }
- },
- "definitions": {
- "info": {
- "type": "object",
- "description": "General information about the API.",
- "required": [
- "version",
- "title"
- ],
- "additionalProperties": false,
- "patternProperties": {
- "^x-": {
- "$ref": "#/definitions/vendorExtension"
- }
- },
- "properties": {
- "title": {
- "type": "string",
- "description": "A unique and precise title of the API."
- },
- "version": {
- "type": "string",
- "description": "A semantic version number of the API."
- },
- "description": {
- "type": "string",
- "description": "A longer description of the API. Should be different from the title. GitHub Flavored Markdown is allowed."
- },
- "termsOfService": {
- "type": "string",
- "description": "The terms of service for the API."
- },
- "contact": {
- "$ref": "#/definitions/contact"
- },
- "license": {
- "$ref": "#/definitions/license"
- }
- }
- },
- "contact": {
- "type": "object",
- "description": "Contact information for the owners of the API.",
- "additionalProperties": false,
- "properties": {
- "name": {
- "type": "string",
- "description": "The identifying name of the contact person/organization."
- },
- "url": {
- "type": "string",
- "description": "The URL pointing to the contact information.",
- "format": "uri"
- },
- "email": {
- "type": "string",
- "description": "The email address of the contact person/organization.",
- "format": "email"
- }
- },
- "patternProperties": {
- "^x-": {
- "$ref": "#/definitions/vendorExtension"
- }
- }
- },
- "license": {
- "type": "object",
- "required": [
- "name"
- ],
- "additionalProperties": false,
- "properties": {
- "name": {
- "type": "string",
- "description": "The name of the license type. It's encouraged to use an OSI compatible license."
- },
- "url": {
- "type": "string",
- "description": "The URL pointing to the license.",
- "format": "uri"
- }
- },
- "patternProperties": {
- "^x-": {
- "$ref": "#/definitions/vendorExtension"
- }
- }
- },
- "paths": {
- "type": "object",
- "description": "Relative paths to the individual endpoints. They must be relative to the 'basePath'.",
- "patternProperties": {
- "^x-": {
- "$ref": "#/definitions/vendorExtension"
- },
- "^/": {
- "$ref": "#/definitions/pathItem"
- }
- },
- "additionalProperties": false
- },
- "definitions": {
- "type": "object",
- "additionalProperties": {
- "$ref": "#/definitions/schema"
- },
- "description": "One or more JSON objects describing the schemas being consumed and produced by the API."
- },
- "parameterDefinitions": {
- "type": "object",
- "additionalProperties": {
- "$ref": "#/definitions/parameter"
- },
- "description": "One or more JSON representations for parameters"
- },
- "responseDefinitions": {
- "type": "object",
- "additionalProperties": {
- "$ref": "#/definitions/response"
- },
- "description": "One or more JSON representations for responses"
- },
- "externalDocs": {
- "type": "object",
- "additionalProperties": false,
- "description": "information about external documentation",
- "required": [
- "url"
- ],
- "properties": {
- "description": {
- "type": "string"
- },
- "url": {
- "type": "string",
- "format": "uri"
- }
- },
- "patternProperties": {
- "^x-": {
- "$ref": "#/definitions/vendorExtension"
- }
- }
- },
- "examples": {
- "type": "object",
- "additionalProperties": true
- },
- "mimeType": {
- "type": "string",
- "description": "The MIME type of the HTTP message."
- },
- "operation": {
- "type": "object",
- "required": [
- "responses"
- ],
- "additionalProperties": false,
- "patternProperties": {
- "^x-": {
- "$ref": "#/definitions/vendorExtension"
- }
- },
- "properties": {
- "tags": {
- "type": "array",
- "items": {
- "type": "string"
- },
- "uniqueItems": true
- },
- "summary": {
- "type": "string",
- "description": "A brief summary of the operation."
- },
- "description": {
- "type": "string",
- "description": "A longer description of the operation, GitHub Flavored Markdown is allowed."
- },
- "externalDocs": {
- "$ref": "#/definitions/externalDocs"
- },
- "operationId": {
- "type": "string",
- "description": "A unique identifier of the operation."
- },
- "produces": {
- "description": "A list of MIME types the API can produce.",
- "allOf": [
- {
- "$ref": "#/definitions/mediaTypeList"
- }
- ]
- },
- "consumes": {
- "description": "A list of MIME types the API can consume.",
- "allOf": [
- {
- "$ref": "#/definitions/mediaTypeList"
- }
- ]
- },
- "parameters": {
- "$ref": "#/definitions/parametersList"
- },
- "responses": {
- "$ref": "#/definitions/responses"
- },
- "schemes": {
- "$ref": "#/definitions/schemesList"
- },
- "deprecated": {
- "type": "boolean",
- "default": false
- },
- "security": {
- "$ref": "#/definitions/security"
- }
- }
- },
- "pathItem": {
- "type": "object",
- "additionalProperties": false,
- "patternProperties": {
- "^x-": {
- "$ref": "#/definitions/vendorExtension"
- }
- },
- "properties": {
- "$ref": {
- "type": "string"
- },
- "get": {
- "$ref": "#/definitions/operation"
- },
- "put": {
- "$ref": "#/definitions/operation"
- },
- "post": {
- "$ref": "#/definitions/operation"
- },
- "delete": {
- "$ref": "#/definitions/operation"
- },
- "options": {
- "$ref": "#/definitions/operation"
- },
- "head": {
- "$ref": "#/definitions/operation"
- },
- "patch": {
- "$ref": "#/definitions/operation"
- },
- "parameters": {
- "$ref": "#/definitions/parametersList"
- }
- }
- },
- "responses": {
- "type": "object",
- "description": "Response objects names can either be any valid HTTP status code or 'default'.",
- "minProperties": 1,
- "additionalProperties": false,
- "patternProperties": {
- "^([0-9]{3})$|^(default)$": {
- "$ref": "#/definitions/responseValue"
- },
- "^x-": {
- "$ref": "#/definitions/vendorExtension"
- }
- },
- "not": {
- "type": "object",
- "additionalProperties": false,
- "patternProperties": {
- "^x-": {
- "$ref": "#/definitions/vendorExtension"
- }
- }
- }
- },
- "responseValue": {
- "oneOf": [
- {
- "$ref": "#/definitions/response"
- },
- {
- "$ref": "#/definitions/jsonReference"
- }
- ]
- },
- "response": {
- "type": "object",
- "required": [
- "description"
- ],
- "properties": {
- "description": {
- "type": "string"
- },
- "schema": {
- "oneOf": [
- {
- "$ref": "#/definitions/schema"
- },
- {
- "$ref": "#/definitions/fileSchema"
- }
- ]
- },
- "headers": {
- "$ref": "#/definitions/headers"
- },
- "examples": {
- "$ref": "#/definitions/examples"
- }
- },
- "additionalProperties": false,
- "patternProperties": {
- "^x-": {
- "$ref": "#/definitions/vendorExtension"
- }
- }
- },
- "headers": {
- "type": "object",
- "additionalProperties": {
- "$ref": "#/definitions/header"
- }
- },
- "header": {
- "type": "object",
- "additionalProperties": false,
- "required": [
- "type"
- ],
- "properties": {
- "type": {
- "type": "string",
- "enum": [
- "string",
- "number",
- "integer",
- "boolean",
- "array"
- ]
- },
- "format": {
- "type": "string"
- },
- "items": {
- "$ref": "#/definitions/primitivesItems"
- },
- "collectionFormat": {
- "$ref": "#/definitions/collectionFormat"
- },
- "default": {
- "$ref": "#/definitions/default"
- },
- "maximum": {
- "$ref": "#/definitions/maximum"
- },
- "exclusiveMaximum": {
- "$ref": "#/definitions/exclusiveMaximum"
- },
- "minimum": {
- "$ref": "#/definitions/minimum"
- },
- "exclusiveMinimum": {
- "$ref": "#/definitions/exclusiveMinimum"
- },
- "maxLength": {
- "$ref": "#/definitions/maxLength"
- },
- "minLength": {
- "$ref": "#/definitions/minLength"
- },
- "pattern": {
- "$ref": "#/definitions/pattern"
- },
- "maxItems": {
- "$ref": "#/definitions/maxItems"
- },
- "minItems": {
- "$ref": "#/definitions/minItems"
- },
- "uniqueItems": {
- "$ref": "#/definitions/uniqueItems"
- },
- "enum": {
- "$ref": "#/definitions/enum"
- },
- "multipleOf": {
- "$ref": "#/definitions/multipleOf"
- },
- "description": {
- "type": "string"
- }
- },
- "patternProperties": {
- "^x-": {
- "$ref": "#/definitions/vendorExtension"
- }
- }
- },
- "vendorExtension": {
- "description": "Any property starting with x- is valid.",
- "additionalProperties": true,
- "additionalItems": true
- },
- "bodyParameter": {
- "type": "object",
- "required": [
- "name",
- "in",
- "schema"
- ],
- "patternProperties": {
- "^x-": {
- "$ref": "#/definitions/vendorExtension"
- }
- },
- "properties": {
- "description": {
- "type": "string",
- "description": "A brief description of the parameter. This could contain examples of use. GitHub Flavored Markdown is allowed."
- },
- "name": {
- "type": "string",
- "description": "The name of the parameter."
- },
- "in": {
- "type": "string",
- "description": "Determines the location of the parameter.",
- "enum": [
- "body"
- ]
- },
- "required": {
- "type": "boolean",
- "description": "Determines whether or not this parameter is required or optional.",
- "default": false
- },
- "schema": {
- "$ref": "#/definitions/schema"
- }
- },
- "additionalProperties": false
- },
- "headerParameterSubSchema": {
- "additionalProperties": false,
- "patternProperties": {
- "^x-": {
- "$ref": "#/definitions/vendorExtension"
- }
- },
- "properties": {
- "required": {
- "type": "boolean",
- "description": "Determines whether or not this parameter is required or optional.",
- "default": false
- },
- "in": {
- "type": "string",
- "description": "Determines the location of the parameter.",
- "enum": [
- "header"
- ]
- },
- "description": {
- "type": "string",
- "description": "A brief description of the parameter. This could contain examples of use. GitHub Flavored Markdown is allowed."
- },
- "name": {
- "type": "string",
- "description": "The name of the parameter."
- },
- "type": {
- "type": "string",
- "enum": [
- "string",
- "number",
- "boolean",
- "integer",
- "array"
- ]
- },
- "format": {
- "type": "string"
- },
- "items": {
- "$ref": "#/definitions/primitivesItems"
- },
- "collectionFormat": {
- "$ref": "#/definitions/collectionFormat"
- },
- "default": {
- "$ref": "#/definitions/default"
- },
- "maximum": {
- "$ref": "#/definitions/maximum"
- },
- "exclusiveMaximum": {
- "$ref": "#/definitions/exclusiveMaximum"
- },
- "minimum": {
- "$ref": "#/definitions/minimum"
- },
- "exclusiveMinimum": {
- "$ref": "#/definitions/exclusiveMinimum"
- },
- "maxLength": {
- "$ref": "#/definitions/maxLength"
- },
- "minLength": {
- "$ref": "#/definitions/minLength"
- },
- "pattern": {
- "$ref": "#/definitions/pattern"
- },
- "maxItems": {
- "$ref": "#/definitions/maxItems"
- },
- "minItems": {
- "$ref": "#/definitions/minItems"
- },
- "uniqueItems": {
- "$ref": "#/definitions/uniqueItems"
- },
- "enum": {
- "$ref": "#/definitions/enum"
- },
- "multipleOf": {
- "$ref": "#/definitions/multipleOf"
- }
- }
- },
- "queryParameterSubSchema": {
- "additionalProperties": false,
- "patternProperties": {
- "^x-": {
- "$ref": "#/definitions/vendorExtension"
- }
- },
- "properties": {
- "required": {
- "type": "boolean",
- "description": "Determines whether or not this parameter is required or optional.",
- "default": false
- },
- "in": {
- "type": "string",
- "description": "Determines the location of the parameter.",
- "enum": [
- "query"
- ]
- },
- "description": {
- "type": "string",
- "description": "A brief description of the parameter. This could contain examples of use. GitHub Flavored Markdown is allowed."
- },
- "name": {
- "type": "string",
- "description": "The name of the parameter."
- },
- "allowEmptyValue": {
- "type": "boolean",
- "default": false,
- "description": "allows sending a parameter by name only or with an empty value."
- },
- "type": {
- "type": "string",
- "enum": [
- "string",
- "number",
- "boolean",
- "integer",
- "array"
- ]
- },
- "format": {
- "type": "string"
- },
- "items": {
- "$ref": "#/definitions/primitivesItems"
- },
- "collectionFormat": {
- "$ref": "#/definitions/collectionFormatWithMulti"
- },
- "default": {
- "$ref": "#/definitions/default"
- },
- "maximum": {
- "$ref": "#/definitions/maximum"
- },
- "exclusiveMaximum": {
- "$ref": "#/definitions/exclusiveMaximum"
- },
- "minimum": {
- "$ref": "#/definitions/minimum"
- },
- "exclusiveMinimum": {
- "$ref": "#/definitions/exclusiveMinimum"
- },
- "maxLength": {
- "$ref": "#/definitions/maxLength"
- },
- "minLength": {
- "$ref": "#/definitions/minLength"
- },
- "pattern": {
- "$ref": "#/definitions/pattern"
- },
- "maxItems": {
- "$ref": "#/definitions/maxItems"
- },
- "minItems": {
- "$ref": "#/definitions/minItems"
- },
- "uniqueItems": {
- "$ref": "#/definitions/uniqueItems"
- },
- "enum": {
- "$ref": "#/definitions/enum"
- },
- "multipleOf": {
- "$ref": "#/definitions/multipleOf"
- }
- }
- },
- "formDataParameterSubSchema": {
- "additionalProperties": false,
- "patternProperties": {
- "^x-": {
- "$ref": "#/definitions/vendorExtension"
- }
- },
- "properties": {
- "required": {
- "type": "boolean",
- "description": "Determines whether or not this parameter is required or optional.",
- "default": false
- },
- "in": {
- "type": "string",
- "description": "Determines the location of the parameter.",
- "enum": [
- "formData"
- ]
- },
- "description": {
- "type": "string",
- "description": "A brief description of the parameter. This could contain examples of use. GitHub Flavored Markdown is allowed."
- },
- "name": {
- "type": "string",
- "description": "The name of the parameter."
- },
- "allowEmptyValue": {
- "type": "boolean",
- "default": false,
- "description": "allows sending a parameter by name only or with an empty value."
- },
- "type": {
- "type": "string",
- "enum": [
- "string",
- "number",
- "boolean",
- "integer",
- "array",
- "file"
- ]
- },
- "format": {
- "type": "string"
- },
- "items": {
- "$ref": "#/definitions/primitivesItems"
- },
- "collectionFormat": {
- "$ref": "#/definitions/collectionFormatWithMulti"
- },
- "default": {
- "$ref": "#/definitions/default"
- },
- "maximum": {
- "$ref": "#/definitions/maximum"
- },
- "exclusiveMaximum": {
- "$ref": "#/definitions/exclusiveMaximum"
- },
- "minimum": {
- "$ref": "#/definitions/minimum"
- },
- "exclusiveMinimum": {
- "$ref": "#/definitions/exclusiveMinimum"
- },
- "maxLength": {
- "$ref": "#/definitions/maxLength"
- },
- "minLength": {
- "$ref": "#/definitions/minLength"
- },
- "pattern": {
- "$ref": "#/definitions/pattern"
- },
- "maxItems": {
- "$ref": "#/definitions/maxItems"
- },
- "minItems": {
- "$ref": "#/definitions/minItems"
- },
- "uniqueItems": {
- "$ref": "#/definitions/uniqueItems"
- },
- "enum": {
- "$ref": "#/definitions/enum"
- },
- "multipleOf": {
- "$ref": "#/definitions/multipleOf"
- }
- }
- },
- "pathParameterSubSchema": {
- "additionalProperties": false,
- "patternProperties": {
- "^x-": {
- "$ref": "#/definitions/vendorExtension"
- }
- },
- "required": [
- "required"
- ],
- "properties": {
- "required": {
- "type": "boolean",
- "enum": [
- true
- ],
- "description": "Determines whether or not this parameter is required or optional."
- },
- "in": {
- "type": "string",
- "description": "Determines the location of the parameter.",
- "enum": [
- "path"
- ]
- },
- "description": {
- "type": "string",
- "description": "A brief description of the parameter. This could contain examples of use. GitHub Flavored Markdown is allowed."
- },
- "name": {
- "type": "string",
- "description": "The name of the parameter."
- },
- "type": {
- "type": "string",
- "enum": [
- "string",
- "number",
- "boolean",
- "integer",
- "array"
- ]
- },
- "format": {
- "type": "string"
- },
- "items": {
- "$ref": "#/definitions/primitivesItems"
- },
- "collectionFormat": {
- "$ref": "#/definitions/collectionFormat"
- },
- "default": {
- "$ref": "#/definitions/default"
- },
- "maximum": {
- "$ref": "#/definitions/maximum"
- },
- "exclusiveMaximum": {
- "$ref": "#/definitions/exclusiveMaximum"
- },
- "minimum": {
- "$ref": "#/definitions/minimum"
- },
- "exclusiveMinimum": {
- "$ref": "#/definitions/exclusiveMinimum"
- },
- "maxLength": {
- "$ref": "#/definitions/maxLength"
- },
- "minLength": {
- "$ref": "#/definitions/minLength"
- },
- "pattern": {
- "$ref": "#/definitions/pattern"
- },
- "maxItems": {
- "$ref": "#/definitions/maxItems"
- },
- "minItems": {
- "$ref": "#/definitions/minItems"
- },
- "uniqueItems": {
- "$ref": "#/definitions/uniqueItems"
- },
- "enum": {
- "$ref": "#/definitions/enum"
- },
- "multipleOf": {
- "$ref": "#/definitions/multipleOf"
- }
- }
- },
- "nonBodyParameter": {
- "type": "object",
- "required": [
- "name",
- "in",
- "type"
- ],
- "oneOf": [
- {
- "$ref": "#/definitions/headerParameterSubSchema"
- },
- {
- "$ref": "#/definitions/formDataParameterSubSchema"
- },
- {
- "$ref": "#/definitions/queryParameterSubSchema"
- },
- {
- "$ref": "#/definitions/pathParameterSubSchema"
- }
- ]
- },
- "parameter": {
- "oneOf": [
- {
- "$ref": "#/definitions/bodyParameter"
- },
- {
- "$ref": "#/definitions/nonBodyParameter"
- }
- ]
- },
- "schema": {
- "type": "object",
- "description": "A deterministic version of a JSON Schema object.",
- "patternProperties": {
- "^x-": {
- "$ref": "#/definitions/vendorExtension"
- }
- },
- "properties": {
- "$ref": {
- "type": "string"
- },
- "format": {
- "type": "string"
- },
- "title": {
- "$ref": "http://json-schema.org/draft-04/schema#/properties/title"
- },
- "description": {
- "$ref": "http://json-schema.org/draft-04/schema#/properties/description"
- },
- "default": {
- "$ref": "http://json-schema.org/draft-04/schema#/properties/default"
- },
- "multipleOf": {
- "$ref": "http://json-schema.org/draft-04/schema#/properties/multipleOf"
- },
- "maximum": {
- "$ref": "http://json-schema.org/draft-04/schema#/properties/maximum"
- },
- "exclusiveMaximum": {
- "$ref": "http://json-schema.org/draft-04/schema#/properties/exclusiveMaximum"
- },
- "minimum": {
- "$ref": "http://json-schema.org/draft-04/schema#/properties/minimum"
- },
- "exclusiveMinimum": {
- "$ref": "http://json-schema.org/draft-04/schema#/properties/exclusiveMinimum"
- },
- "maxLength": {
- "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveInteger"
- },
- "minLength": {
- "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveIntegerDefault0"
- },
- "pattern": {
- "$ref": "http://json-schema.org/draft-04/schema#/properties/pattern"
- },
- "maxItems": {
- "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveInteger"
- },
- "minItems": {
- "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveIntegerDefault0"
- },
- "uniqueItems": {
- "$ref": "http://json-schema.org/draft-04/schema#/properties/uniqueItems"
- },
- "maxProperties": {
- "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveInteger"
- },
- "minProperties": {
- "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveIntegerDefault0"
- },
- "required": {
- "$ref": "http://json-schema.org/draft-04/schema#/definitions/stringArray"
- },
- "enum": {
- "$ref": "http://json-schema.org/draft-04/schema#/properties/enum"
- },
- "additionalProperties": {
- "anyOf": [
- {
- "$ref": "#/definitions/schema"
- },
- {
- "type": "boolean"
- }
- ],
- "default": {}
- },
- "type": {
- "$ref": "http://json-schema.org/draft-04/schema#/properties/type"
- },
- "items": {
- "anyOf": [
- {
- "$ref": "#/definitions/schema"
- },
- {
- "type": "array",
- "minItems": 1,
- "items": {
- "$ref": "#/definitions/schema"
- }
- }
- ],
- "default": {}
- },
- "allOf": {
- "type": "array",
- "minItems": 1,
- "items": {
- "$ref": "#/definitions/schema"
- }
- },
- "properties": {
- "type": "object",
- "additionalProperties": {
- "$ref": "#/definitions/schema"
- },
- "default": {}
- },
- "discriminator": {
- "type": "string"
- },
- "readOnly": {
- "type": "boolean",
- "default": false
- },
- "xml": {
- "$ref": "#/definitions/xml"
- },
- "externalDocs": {
- "$ref": "#/definitions/externalDocs"
- },
- "example": {}
- },
- "additionalProperties": false
- },
- "fileSchema": {
- "type": "object",
- "description": "A deterministic version of a JSON Schema object.",
- "patternProperties": {
- "^x-": {
- "$ref": "#/definitions/vendorExtension"
- }
- },
- "required": [
- "type"
- ],
- "properties": {
- "format": {
- "type": "string"
- },
- "title": {
- "$ref": "http://json-schema.org/draft-04/schema#/properties/title"
- },
- "description": {
- "$ref": "http://json-schema.org/draft-04/schema#/properties/description"
- },
- "default": {
- "$ref": "http://json-schema.org/draft-04/schema#/properties/default"
- },
- "required": {
- "$ref": "http://json-schema.org/draft-04/schema#/definitions/stringArray"
- },
- "type": {
- "type": "string",
- "enum": [
- "file"
- ]
- },
- "readOnly": {
- "type": "boolean",
- "default": false
- },
- "externalDocs": {
- "$ref": "#/definitions/externalDocs"
- },
- "example": {}
- },
- "additionalProperties": false
- },
- "primitivesItems": {
- "type": "object",
- "additionalProperties": false,
- "properties": {
- "type": {
- "type": "string",
- "enum": [
- "string",
- "number",
- "integer",
- "boolean",
- "array"
- ]
- },
- "format": {
- "type": "string"
- },
- "items": {
- "$ref": "#/definitions/primitivesItems"
- },
- "collectionFormat": {
- "$ref": "#/definitions/collectionFormat"
- },
- "default": {
- "$ref": "#/definitions/default"
- },
- "maximum": {
- "$ref": "#/definitions/maximum"
- },
- "exclusiveMaximum": {
- "$ref": "#/definitions/exclusiveMaximum"
- },
- "minimum": {
- "$ref": "#/definitions/minimum"
- },
- "exclusiveMinimum": {
- "$ref": "#/definitions/exclusiveMinimum"
- },
- "maxLength": {
- "$ref": "#/definitions/maxLength"
- },
- "minLength": {
- "$ref": "#/definitions/minLength"
- },
- "pattern": {
- "$ref": "#/definitions/pattern"
- },
- "maxItems": {
- "$ref": "#/definitions/maxItems"
- },
- "minItems": {
- "$ref": "#/definitions/minItems"
- },
- "uniqueItems": {
- "$ref": "#/definitions/uniqueItems"
- },
- "enum": {
- "$ref": "#/definitions/enum"
- },
- "multipleOf": {
- "$ref": "#/definitions/multipleOf"
- }
- },
- "patternProperties": {
- "^x-": {
- "$ref": "#/definitions/vendorExtension"
- }
- }
- },
- "security": {
- "type": "array",
- "items": {
- "$ref": "#/definitions/securityRequirement"
- },
- "uniqueItems": true
- },
- "securityRequirement": {
- "type": "object",
- "additionalProperties": {
- "type": "array",
- "items": {
- "type": "string"
- },
- "uniqueItems": true
- }
- },
- "xml": {
- "type": "object",
- "additionalProperties": false,
- "properties": {
- "name": {
- "type": "string"
- },
- "namespace": {
- "type": "string"
- },
- "prefix": {
- "type": "string"
- },
- "attribute": {
- "type": "boolean",
- "default": false
- },
- "wrapped": {
- "type": "boolean",
- "default": false
- }
- },
- "patternProperties": {
- "^x-": {
- "$ref": "#/definitions/vendorExtension"
- }
- }
- },
- "tag": {
- "type": "object",
- "additionalProperties": false,
- "required": [
- "name"
- ],
- "properties": {
- "name": {
- "type": "string"
- },
- "description": {
- "type": "string"
- },
- "externalDocs": {
- "$ref": "#/definitions/externalDocs"
- }
- },
- "patternProperties": {
- "^x-": {
- "$ref": "#/definitions/vendorExtension"
- }
- }
- },
- "securityDefinitions": {
- "type": "object",
- "additionalProperties": {
- "oneOf": [
- {
- "$ref": "#/definitions/basicAuthenticationSecurity"
- },
- {
- "$ref": "#/definitions/apiKeySecurity"
- },
- {
- "$ref": "#/definitions/oauth2ImplicitSecurity"
- },
- {
- "$ref": "#/definitions/oauth2PasswordSecurity"
- },
- {
- "$ref": "#/definitions/oauth2ApplicationSecurity"
- },
- {
- "$ref": "#/definitions/oauth2AccessCodeSecurity"
- }
- ]
- }
- },
- "basicAuthenticationSecurity": {
- "type": "object",
- "additionalProperties": false,
- "required": [
- "type"
- ],
- "properties": {
- "type": {
- "type": "string",
- "enum": [
- "basic"
- ]
- },
- "description": {
- "type": "string"
- }
- },
- "patternProperties": {
- "^x-": {
- "$ref": "#/definitions/vendorExtension"
- }
- }
- },
- "apiKeySecurity": {
- "type": "object",
- "additionalProperties": false,
- "required": [
- "type",
- "name",
- "in"
- ],
- "properties": {
- "type": {
- "type": "string",
- "enum": [
- "apiKey"
- ]
- },
- "name": {
- "type": "string"
- },
- "in": {
- "type": "string",
- "enum": [
- "header",
- "query"
- ]
- },
- "description": {
- "type": "string"
- }
- },
- "patternProperties": {
- "^x-": {
- "$ref": "#/definitions/vendorExtension"
- }
- }
- },
- "oauth2ImplicitSecurity": {
- "type": "object",
- "additionalProperties": false,
- "required": [
- "type",
- "flow",
- "authorizationUrl"
- ],
- "properties": {
- "type": {
- "type": "string",
- "enum": [
- "oauth2"
- ]
- },
- "flow": {
- "type": "string",
- "enum": [
- "implicit"
- ]
- },
- "scopes": {
- "$ref": "#/definitions/oauth2Scopes"
- },
- "authorizationUrl": {
- "type": "string",
- "format": "uri"
- },
- "description": {
- "type": "string"
- }
- },
- "patternProperties": {
- "^x-": {
- "$ref": "#/definitions/vendorExtension"
- }
- }
- },
- "oauth2PasswordSecurity": {
- "type": "object",
- "additionalProperties": false,
- "required": [
- "type",
- "flow",
- "tokenUrl"
- ],
- "properties": {
- "type": {
- "type": "string",
- "enum": [
- "oauth2"
- ]
- },
- "flow": {
- "type": "string",
- "enum": [
- "password"
- ]
- },
- "scopes": {
- "$ref": "#/definitions/oauth2Scopes"
- },
- "tokenUrl": {
- "type": "string",
- "format": "uri"
- },
- "description": {
- "type": "string"
- }
- },
- "patternProperties": {
- "^x-": {
- "$ref": "#/definitions/vendorExtension"
- }
- }
- },
- "oauth2ApplicationSecurity": {
- "type": "object",
- "additionalProperties": false,
- "required": [
- "type",
- "flow",
- "tokenUrl"
- ],
- "properties": {
- "type": {
- "type": "string",
- "enum": [
- "oauth2"
- ]
- },
- "flow": {
- "type": "string",
- "enum": [
- "application"
- ]
- },
- "scopes": {
- "$ref": "#/definitions/oauth2Scopes"
- },
- "tokenUrl": {
- "type": "string",
- "format": "uri"
- },
- "description": {
- "type": "string"
- }
- },
- "patternProperties": {
- "^x-": {
- "$ref": "#/definitions/vendorExtension"
- }
- }
- },
- "oauth2AccessCodeSecurity": {
- "type": "object",
- "additionalProperties": false,
- "required": [
- "type",
- "flow",
- "authorizationUrl",
- "tokenUrl"
- ],
- "properties": {
- "type": {
- "type": "string",
- "enum": [
- "oauth2"
- ]
- },
- "flow": {
- "type": "string",
- "enum": [
- "accessCode"
- ]
- },
- "scopes": {
- "$ref": "#/definitions/oauth2Scopes"
- },
- "authorizationUrl": {
- "type": "string",
- "format": "uri"
- },
- "tokenUrl": {
- "type": "string",
- "format": "uri"
- },
- "description": {
- "type": "string"
- }
- },
- "patternProperties": {
- "^x-": {
- "$ref": "#/definitions/vendorExtension"
- }
- }
- },
- "oauth2Scopes": {
- "type": "object",
- "additionalProperties": {
- "type": "string"
- }
- },
- "mediaTypeList": {
- "type": "array",
- "items": {
- "$ref": "#/definitions/mimeType"
- },
- "uniqueItems": true
- },
- "parametersList": {
- "type": "array",
- "description": "The parameters needed to send a valid API call.",
- "additionalItems": false,
- "items": {
- "oneOf": [
- {
- "$ref": "#/definitions/parameter"
- },
- {
- "$ref": "#/definitions/jsonReference"
- }
- ]
- },
- "uniqueItems": true
- },
- "schemesList": {
- "type": "array",
- "description": "The transfer protocol of the API.",
- "items": {
- "type": "string",
- "enum": [
- "http",
- "https",
- "ws",
- "wss"
- ]
- },
- "uniqueItems": true
- },
- "collectionFormat": {
- "type": "string",
- "enum": [
- "csv",
- "ssv",
- "tsv",
- "pipes"
- ],
- "default": "csv"
- },
- "collectionFormatWithMulti": {
- "type": "string",
- "enum": [
- "csv",
- "ssv",
- "tsv",
- "pipes",
- "multi"
- ],
- "default": "csv"
- },
- "title": {
- "$ref": "http://json-schema.org/draft-04/schema#/properties/title"
- },
- "description": {
- "$ref": "http://json-schema.org/draft-04/schema#/properties/description"
- },
- "default": {
- "$ref": "http://json-schema.org/draft-04/schema#/properties/default"
- },
- "multipleOf": {
- "$ref": "http://json-schema.org/draft-04/schema#/properties/multipleOf"
- },
- "maximum": {
- "$ref": "http://json-schema.org/draft-04/schema#/properties/maximum"
- },
- "exclusiveMaximum": {
- "$ref": "http://json-schema.org/draft-04/schema#/properties/exclusiveMaximum"
- },
- "minimum": {
- "$ref": "http://json-schema.org/draft-04/schema#/properties/minimum"
- },
- "exclusiveMinimum": {
- "$ref": "http://json-schema.org/draft-04/schema#/properties/exclusiveMinimum"
- },
- "maxLength": {
- "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveInteger"
- },
- "minLength": {
- "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveIntegerDefault0"
- },
- "pattern": {
- "$ref": "http://json-schema.org/draft-04/schema#/properties/pattern"
- },
- "maxItems": {
- "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveInteger"
- },
- "minItems": {
- "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveIntegerDefault0"
- },
- "uniqueItems": {
- "$ref": "http://json-schema.org/draft-04/schema#/properties/uniqueItems"
- },
- "enum": {
- "$ref": "http://json-schema.org/draft-04/schema#/properties/enum"
- },
- "jsonReference": {
- "type": "object",
- "required": [
- "$ref"
- ],
- "additionalProperties": false,
- "properties": {
- "$ref": {
- "type": "string"
- }
- }
- }
- }
-}
diff --git a/vendor/github.com/go-openapi/spec/spec.go b/vendor/github.com/go-openapi/spec/spec.go
index 876aa127..7d38b6e6 100644
--- a/vendor/github.com/go-openapi/spec/spec.go
+++ b/vendor/github.com/go-openapi/spec/spec.go
@@ -26,7 +26,7 @@ import (
const (
// SwaggerSchemaURL the url for the swagger 2.0 schema to validate specs
SwaggerSchemaURL = "http://swagger.io/v2/schema.json#"
- // JSONSchemaURL the url for the json schema
+ // JSONSchemaURL the url for the json schema schema
JSONSchemaURL = "http://json-schema.org/draft-04/schema#"
)
@@ -41,7 +41,7 @@ func MustLoadJSONSchemaDraft04() *Schema {
// JSONSchemaDraft04 loads the json schema document for json shema draft04
func JSONSchemaDraft04() (*Schema, error) {
- b, err := jsonschemaDraft04JSONBytes()
+ b, err := Asset("jsonschema-draft-04.json")
if err != nil {
return nil, err
}
@@ -65,7 +65,7 @@ func MustLoadSwagger20Schema() *Schema {
// Swagger20Schema loads the swagger 2.0 schema from the embedded assets
func Swagger20Schema() (*Schema, error) {
- b, err := v2SchemaJSONBytes()
+ b, err := Asset("v2/schema.json")
if err != nil {
return nil, err
}
diff --git a/vendor/github.com/go-openapi/spec/swagger.go b/vendor/github.com/go-openapi/spec/swagger.go
index 1590fd17..44722ffd 100644
--- a/vendor/github.com/go-openapi/spec/swagger.go
+++ b/vendor/github.com/go-openapi/spec/swagger.go
@@ -253,7 +253,7 @@ func (s SchemaOrBool) MarshalJSON() ([]byte, error) {
// UnmarshalJSON converts this bool or schema object from a JSON structure
func (s *SchemaOrBool) UnmarshalJSON(data []byte) error {
var nw SchemaOrBool
- if len(data) > 0 {
+ if len(data) >= 4 {
if data[0] == '{' {
var sch Schema
if err := json.Unmarshal(data, &sch); err != nil {
@@ -261,7 +261,7 @@ func (s *SchemaOrBool) UnmarshalJSON(data []byte) error {
}
nw.Schema = &sch
}
- nw.Allows = !bytes.Equal(data, []byte("false"))
+ nw.Allows = !(data[0] == 'f' && data[1] == 'a' && data[2] == 'l' && data[3] == 's' && data[4] == 'e')
}
*s = nw
return nil
diff --git a/vendor/github.com/go-openapi/spec/url_go18.go b/vendor/github.com/go-openapi/spec/url_go18.go
new file mode 100644
index 00000000..60b78515
--- /dev/null
+++ b/vendor/github.com/go-openapi/spec/url_go18.go
@@ -0,0 +1,8 @@
+//go:build !go1.19
+// +build !go1.19
+
+package spec
+
+import "net/url"
+
+var parseURL = url.Parse
diff --git a/vendor/github.com/go-openapi/spec/url_go19.go b/vendor/github.com/go-openapi/spec/url_go19.go
index 5bdfe40b..392e3e63 100644
--- a/vendor/github.com/go-openapi/spec/url_go19.go
+++ b/vendor/github.com/go-openapi/spec/url_go19.go
@@ -1,3 +1,6 @@
+//go:build go1.19
+// +build go1.19
+
package spec
import "net/url"
diff --git a/vendor/github.com/go-openapi/swag/.gitignore b/vendor/github.com/go-openapi/swag/.gitignore
index c4b1b64f..d69b53ac 100644
--- a/vendor/github.com/go-openapi/swag/.gitignore
+++ b/vendor/github.com/go-openapi/swag/.gitignore
@@ -2,4 +2,3 @@ secrets.yml
vendor
Godeps
.idea
-*.out
diff --git a/vendor/github.com/go-openapi/swag/.golangci.yml b/vendor/github.com/go-openapi/swag/.golangci.yml
index 80e2be00..bf503e40 100644
--- a/vendor/github.com/go-openapi/swag/.golangci.yml
+++ b/vendor/github.com/go-openapi/swag/.golangci.yml
@@ -4,14 +4,14 @@ linters-settings:
golint:
min-confidence: 0
gocyclo:
- min-complexity: 45
+ min-complexity: 25
maligned:
suggest-new: true
dupl:
- threshold: 200
+ threshold: 100
goconst:
min-len: 3
- min-occurrences: 3
+ min-occurrences: 2
linters:
enable-all: true
@@ -20,41 +20,35 @@ linters:
- lll
- gochecknoinits
- gochecknoglobals
- - funlen
- - godox
- - gocognit
- - whitespace
- - wsl
- - wrapcheck
- - testpackage
- nlreturn
+ - testpackage
+ - wrapcheck
- gomnd
+ - exhaustive
- exhaustivestruct
- goerr113
- - errorlint
- - nestif
- - godot
+ - wsl
+ - whitespace
- gofumpt
+ - godot
+ - nestif
+ - godox
+ - funlen
+ - gci
+ - gocognit
- paralleltest
- - tparallel
- thelper
- ifshort
- - exhaustruct
- - varnamelen
- - gci
- - depguard
- - errchkjson
- - inamedparam
- - nonamedreturns
- - musttag
- - ireturn
- - forcetypeassert
+ - gomoddirectives
- cyclop
- # deprecated linters
- - deadcode
- - interfacer
- - scopelint
- - varcheck
- - structcheck
+ - forcetypeassert
+ - ireturn
+ - tagliatelle
+ - varnamelen
+ - goimports
+ - tenv
- golint
+ - exhaustruct
+ - nilnil
+ - nonamedreturns
- nosnakecase
diff --git a/vendor/github.com/go-openapi/swag/BENCHMARK.md b/vendor/github.com/go-openapi/swag/BENCHMARK.md
deleted file mode 100644
index e7f28ed6..00000000
--- a/vendor/github.com/go-openapi/swag/BENCHMARK.md
+++ /dev/null
@@ -1,52 +0,0 @@
-# Benchmarks
-
-## Name mangling utilities
-
-```bash
-go test -bench XXX -run XXX -benchtime 30s
-```
-
-### Benchmarks at b3e7a5386f996177e4808f11acb2aa93a0f660df
-
-```
-goos: linux
-goarch: amd64
-pkg: github.com/go-openapi/swag
-cpu: Intel(R) Core(TM) i5-6200U CPU @ 2.30GHz
-BenchmarkToXXXName/ToGoName-4 862623 44101 ns/op 10450 B/op 732 allocs/op
-BenchmarkToXXXName/ToVarName-4 853656 40728 ns/op 10468 B/op 734 allocs/op
-BenchmarkToXXXName/ToFileName-4 1268312 27813 ns/op 9785 B/op 617 allocs/op
-BenchmarkToXXXName/ToCommandName-4 1276322 27903 ns/op 9785 B/op 617 allocs/op
-BenchmarkToXXXName/ToHumanNameLower-4 895334 40354 ns/op 10472 B/op 731 allocs/op
-BenchmarkToXXXName/ToHumanNameTitle-4 882441 40678 ns/op 10566 B/op 749 allocs/op
-```
-
-### Benchmarks after PR #79
-
-~ x10 performance improvement and ~ /100 memory allocations.
-
-```
-goos: linux
-goarch: amd64
-pkg: github.com/go-openapi/swag
-cpu: Intel(R) Core(TM) i5-6200U CPU @ 2.30GHz
-BenchmarkToXXXName/ToGoName-4 9595830 3991 ns/op 42 B/op 5 allocs/op
-BenchmarkToXXXName/ToVarName-4 9194276 3984 ns/op 62 B/op 7 allocs/op
-BenchmarkToXXXName/ToFileName-4 17002711 2123 ns/op 147 B/op 7 allocs/op
-BenchmarkToXXXName/ToCommandName-4 16772926 2111 ns/op 147 B/op 7 allocs/op
-BenchmarkToXXXName/ToHumanNameLower-4 9788331 3749 ns/op 92 B/op 6 allocs/op
-BenchmarkToXXXName/ToHumanNameTitle-4 9188260 3941 ns/op 104 B/op 6 allocs/op
-```
-
-```
-goos: linux
-goarch: amd64
-pkg: github.com/go-openapi/swag
-cpu: AMD Ryzen 7 5800X 8-Core Processor
-BenchmarkToXXXName/ToGoName-16 18527378 1972 ns/op 42 B/op 5 allocs/op
-BenchmarkToXXXName/ToVarName-16 15552692 2093 ns/op 62 B/op 7 allocs/op
-BenchmarkToXXXName/ToFileName-16 32161176 1117 ns/op 147 B/op 7 allocs/op
-BenchmarkToXXXName/ToCommandName-16 32256634 1137 ns/op 147 B/op 7 allocs/op
-BenchmarkToXXXName/ToHumanNameLower-16 18599661 1946 ns/op 92 B/op 6 allocs/op
-BenchmarkToXXXName/ToHumanNameTitle-16 17581353 2054 ns/op 105 B/op 6 allocs/op
-```
diff --git a/vendor/github.com/go-openapi/swag/README.md b/vendor/github.com/go-openapi/swag/README.md
index a7292229..217f6fa5 100644
--- a/vendor/github.com/go-openapi/swag/README.md
+++ b/vendor/github.com/go-openapi/swag/README.md
@@ -1,8 +1,7 @@
-# Swag [](https://github.com/go-openapi/swag/actions?query=workflow%3A"go+test") [](https://codecov.io/gh/go-openapi/swag)
+# Swag [](https://travis-ci.org/go-openapi/swag) [](https://codecov.io/gh/go-openapi/swag) [](https://slackin.goswagger.io)
-[](https://slackin.goswagger.io)
[](https://raw.githubusercontent.com/go-openapi/swag/master/LICENSE)
-[](https://pkg.go.dev/github.com/go-openapi/swag)
+[](http://godoc.org/github.com/go-openapi/swag)
[](https://goreportcard.com/report/github.com/go-openapi/swag)
Contains a bunch of helper functions for go-openapi and go-swagger projects.
@@ -19,5 +18,4 @@ You may also use it standalone for your projects.
This repo has only few dependencies outside of the standard library:
-* YAML utilities depend on `gopkg.in/yaml.v3`
-* `github.com/mailru/easyjson v0.7.7`
+* YAML utilities depend on gopkg.in/yaml.v2
diff --git a/vendor/github.com/go-openapi/swag/initialism_index.go b/vendor/github.com/go-openapi/swag/initialism_index.go
deleted file mode 100644
index 20a359bb..00000000
--- a/vendor/github.com/go-openapi/swag/initialism_index.go
+++ /dev/null
@@ -1,202 +0,0 @@
-// Copyright 2015 go-swagger maintainers
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package swag
-
-import (
- "sort"
- "strings"
- "sync"
-)
-
-var (
- // commonInitialisms are common acronyms that are kept as whole uppercased words.
- commonInitialisms *indexOfInitialisms
-
- // initialisms is a slice of sorted initialisms
- initialisms []string
-
- // a copy of initialisms pre-baked as []rune
- initialismsRunes [][]rune
- initialismsUpperCased [][]rune
-
- isInitialism func(string) bool
-
- maxAllocMatches int
-)
-
-func init() {
- // Taken from https://github.com/golang/lint/blob/3390df4df2787994aea98de825b964ac7944b817/lint.go#L732-L769
- configuredInitialisms := map[string]bool{
- "ACL": true,
- "API": true,
- "ASCII": true,
- "CPU": true,
- "CSS": true,
- "DNS": true,
- "EOF": true,
- "GUID": true,
- "HTML": true,
- "HTTPS": true,
- "HTTP": true,
- "ID": true,
- "IP": true,
- "IPv4": true,
- "IPv6": true,
- "JSON": true,
- "LHS": true,
- "OAI": true,
- "QPS": true,
- "RAM": true,
- "RHS": true,
- "RPC": true,
- "SLA": true,
- "SMTP": true,
- "SQL": true,
- "SSH": true,
- "TCP": true,
- "TLS": true,
- "TTL": true,
- "UDP": true,
- "UI": true,
- "UID": true,
- "UUID": true,
- "URI": true,
- "URL": true,
- "UTF8": true,
- "VM": true,
- "XML": true,
- "XMPP": true,
- "XSRF": true,
- "XSS": true,
- }
-
- // a thread-safe index of initialisms
- commonInitialisms = newIndexOfInitialisms().load(configuredInitialisms)
- initialisms = commonInitialisms.sorted()
- initialismsRunes = asRunes(initialisms)
- initialismsUpperCased = asUpperCased(initialisms)
- maxAllocMatches = maxAllocHeuristic(initialismsRunes)
-
- // a test function
- isInitialism = commonInitialisms.isInitialism
-}
-
-func asRunes(in []string) [][]rune {
- out := make([][]rune, len(in))
- for i, initialism := range in {
- out[i] = []rune(initialism)
- }
-
- return out
-}
-
-func asUpperCased(in []string) [][]rune {
- out := make([][]rune, len(in))
-
- for i, initialism := range in {
- out[i] = []rune(upper(trim(initialism)))
- }
-
- return out
-}
-
-func maxAllocHeuristic(in [][]rune) int {
- heuristic := make(map[rune]int)
- for _, initialism := range in {
- heuristic[initialism[0]]++
- }
-
- var maxAlloc int
- for _, val := range heuristic {
- if val > maxAlloc {
- maxAlloc = val
- }
- }
-
- return maxAlloc
-}
-
-// AddInitialisms add additional initialisms
-func AddInitialisms(words ...string) {
- for _, word := range words {
- // commonInitialisms[upper(word)] = true
- commonInitialisms.add(upper(word))
- }
- // sort again
- initialisms = commonInitialisms.sorted()
- initialismsRunes = asRunes(initialisms)
- initialismsUpperCased = asUpperCased(initialisms)
-}
-
-// indexOfInitialisms is a thread-safe implementation of the sorted index of initialisms.
-// Since go1.9, this may be implemented with sync.Map.
-type indexOfInitialisms struct {
- sortMutex *sync.Mutex
- index *sync.Map
-}
-
-func newIndexOfInitialisms() *indexOfInitialisms {
- return &indexOfInitialisms{
- sortMutex: new(sync.Mutex),
- index: new(sync.Map),
- }
-}
-
-func (m *indexOfInitialisms) load(initial map[string]bool) *indexOfInitialisms {
- m.sortMutex.Lock()
- defer m.sortMutex.Unlock()
- for k, v := range initial {
- m.index.Store(k, v)
- }
- return m
-}
-
-func (m *indexOfInitialisms) isInitialism(key string) bool {
- _, ok := m.index.Load(key)
- return ok
-}
-
-func (m *indexOfInitialisms) add(key string) *indexOfInitialisms {
- m.index.Store(key, true)
- return m
-}
-
-func (m *indexOfInitialisms) sorted() (result []string) {
- m.sortMutex.Lock()
- defer m.sortMutex.Unlock()
- m.index.Range(func(key, _ interface{}) bool {
- k := key.(string)
- result = append(result, k)
- return true
- })
- sort.Sort(sort.Reverse(byInitialism(result)))
- return
-}
-
-type byInitialism []string
-
-func (s byInitialism) Len() int {
- return len(s)
-}
-func (s byInitialism) Swap(i, j int) {
- s[i], s[j] = s[j], s[i]
-}
-func (s byInitialism) Less(i, j int) bool {
- if len(s[i]) != len(s[j]) {
- return len(s[i]) < len(s[j])
- }
-
- return strings.Compare(s[i], s[j]) > 0
-}
diff --git a/vendor/github.com/go-openapi/swag/loading.go b/vendor/github.com/go-openapi/swag/loading.go
index 783442fd..00038c37 100644
--- a/vendor/github.com/go-openapi/swag/loading.go
+++ b/vendor/github.com/go-openapi/swag/loading.go
@@ -21,7 +21,6 @@ import (
"net/http"
"net/url"
"os"
- "path"
"path/filepath"
"runtime"
"strings"
@@ -41,97 +40,43 @@ var LoadHTTPBasicAuthPassword = ""
var LoadHTTPCustomHeaders = map[string]string{}
// LoadFromFileOrHTTP loads the bytes from a file or a remote http server based on the path passed in
-func LoadFromFileOrHTTP(pth string) ([]byte, error) {
- return LoadStrategy(pth, os.ReadFile, loadHTTPBytes(LoadHTTPTimeout))(pth)
+func LoadFromFileOrHTTP(path string) ([]byte, error) {
+ return LoadStrategy(path, os.ReadFile, loadHTTPBytes(LoadHTTPTimeout))(path)
}
// LoadFromFileOrHTTPWithTimeout loads the bytes from a file or a remote http server based on the path passed in
// timeout arg allows for per request overriding of the request timeout
-func LoadFromFileOrHTTPWithTimeout(pth string, timeout time.Duration) ([]byte, error) {
- return LoadStrategy(pth, os.ReadFile, loadHTTPBytes(timeout))(pth)
+func LoadFromFileOrHTTPWithTimeout(path string, timeout time.Duration) ([]byte, error) {
+ return LoadStrategy(path, os.ReadFile, loadHTTPBytes(timeout))(path)
}
-// LoadStrategy returns a loader function for a given path or URI.
-//
-// The load strategy returns the remote load for any path starting with `http`.
-// So this works for any URI with a scheme `http` or `https`.
-//
-// The fallback strategy is to call the local loader.
-//
-// The local loader takes a local file system path (absolute or relative) as argument,
-// or alternatively a `file://...` URI, **without host** (see also below for windows).
-//
-// There are a few liberalities, initially intended to be tolerant regarding the URI syntax,
-// especially on windows.
-//
-// Before the local loader is called, the given path is transformed:
-// - percent-encoded characters are unescaped
-// - simple paths (e.g. `./folder/file`) are passed as-is
-// - on windows, occurrences of `/` are replaced by `\`, so providing a relative path such a `folder/file` works too.
-//
-// For paths provided as URIs with the "file" scheme, please note that:
-// - `file://` is simply stripped.
-// This means that the host part of the URI is not parsed at all.
-// For example, `file:///folder/file" becomes "/folder/file`,
-// but `file://localhost/folder/file` becomes `localhost/folder/file` on unix systems.
-// Similarly, `file://./folder/file` yields `./folder/file`.
-// - on windows, `file://...` can take a host so as to specify an UNC share location.
-//
-// Reminder about windows-specifics:
-// - `file://host/folder/file` becomes an UNC path like `\\host\folder\file` (no port specification is supported)
-// - `file:///c:/folder/file` becomes `C:\folder\file`
-// - `file://c:/folder/file` is tolerated (without leading `/`) and becomes `c:\folder\file`
-func LoadStrategy(pth string, local, remote func(string) ([]byte, error)) func(string) ([]byte, error) {
- if strings.HasPrefix(pth, "http") {
+// LoadStrategy returns a loader function for a given path or uri
+func LoadStrategy(path string, local, remote func(string) ([]byte, error)) func(string) ([]byte, error) {
+ if strings.HasPrefix(path, "http") {
return remote
}
-
- return func(p string) ([]byte, error) {
- upth, err := url.PathUnescape(p)
+ return func(pth string) ([]byte, error) {
+ upth, err := pathUnescape(pth)
if err != nil {
return nil, err
}
- if !strings.HasPrefix(p, `file://`) {
- // regular file path provided: just normalize slashes
- return local(filepath.FromSlash(upth))
- }
-
- if runtime.GOOS != "windows" {
- // crude processing: this leaves full URIs with a host with a (mostly) unexpected result
- upth = strings.TrimPrefix(upth, `file://`)
-
- return local(filepath.FromSlash(upth))
- }
-
- // windows-only pre-processing of file://... URIs
-
- // support for canonical file URIs on windows.
- u, err := url.Parse(filepath.ToSlash(upth))
- if err != nil {
- return nil, err
- }
-
- if u.Host != "" {
- // assume UNC name (volume share)
- // NOTE: UNC port not yet supported
-
- // when the "host" segment is a drive letter:
- // file://C:/folder/... => C:\folder
- upth = path.Clean(strings.Join([]string{u.Host, u.Path}, `/`))
- if !strings.HasSuffix(u.Host, ":") && u.Host[0] != '.' {
- // tolerance: if we have a leading dot, this can't be a host
- // file://host/share/folder\... ==> \\host\share\path\folder
- upth = "//" + upth
- }
- } else {
- // no host, let's figure out if this is a drive letter
- upth = strings.TrimPrefix(upth, `file://`)
- first, _, _ := strings.Cut(strings.TrimPrefix(u.Path, "/"), "/")
- if strings.HasSuffix(first, ":") {
- // drive letter in the first segment:
- // file:///c:/folder/... ==> strip the leading slash
- upth = strings.TrimPrefix(upth, `/`)
+ if strings.HasPrefix(pth, `file://`) {
+ if runtime.GOOS == "windows" {
+ // support for canonical file URIs on windows.
+ // Zero tolerance here for dodgy URIs.
+ u, _ := url.Parse(upth)
+ if u.Host != "" {
+ // assume UNC name (volume share)
+ // file://host/share/folder\... ==> \\host\share\path\folder
+ // NOTE: UNC port not yet supported
+ upth = strings.Join([]string{`\`, u.Host, u.Path}, `\`)
+ } else {
+ // file:///c:/folder/... ==> just remove the leading slash
+ upth = strings.TrimPrefix(upth, `file:///`)
+ }
+ } else {
+ upth = strings.TrimPrefix(upth, `file://`)
}
}
diff --git a/vendor/github.com/go-openapi/swag/name_lexem.go b/vendor/github.com/go-openapi/swag/name_lexem.go
index 8bb64ac3..aa7f6a9b 100644
--- a/vendor/github.com/go-openapi/swag/name_lexem.go
+++ b/vendor/github.com/go-openapi/swag/name_lexem.go
@@ -14,80 +14,74 @@
package swag
-import (
- "unicode"
- "unicode/utf8"
-)
+import "unicode"
type (
- lexemKind uint8
+ nameLexem interface {
+ GetUnsafeGoName() string
+ GetOriginal() string
+ IsInitialism() bool
+ }
- nameLexem struct {
+ initialismNameLexem struct {
original string
matchedInitialism string
- kind lexemKind
+ }
+
+ casualNameLexem struct {
+ original string
}
)
-const (
- lexemKindCasualName lexemKind = iota
- lexemKindInitialismName
-)
-
-func newInitialismNameLexem(original, matchedInitialism string) nameLexem {
- return nameLexem{
- kind: lexemKindInitialismName,
+func newInitialismNameLexem(original, matchedInitialism string) *initialismNameLexem {
+ return &initialismNameLexem{
original: original,
matchedInitialism: matchedInitialism,
}
}
-func newCasualNameLexem(original string) nameLexem {
- return nameLexem{
- kind: lexemKindCasualName,
+func newCasualNameLexem(original string) *casualNameLexem {
+ return &casualNameLexem{
original: original,
}
}
-func (l nameLexem) GetUnsafeGoName() string {
- if l.kind == lexemKindInitialismName {
- return l.matchedInitialism
- }
-
- var (
- first rune
- rest string
- )
+func (l *initialismNameLexem) GetUnsafeGoName() string {
+ return l.matchedInitialism
+}
+func (l *casualNameLexem) GetUnsafeGoName() string {
+ var first rune
+ var rest string
for i, orig := range l.original {
if i == 0 {
first = orig
continue
}
-
if i > 0 {
rest = l.original[i:]
break
}
}
-
if len(l.original) > 1 {
- b := poolOfBuffers.BorrowBuffer(utf8.UTFMax + len(rest))
- defer func() {
- poolOfBuffers.RedeemBuffer(b)
- }()
- b.WriteRune(unicode.ToUpper(first))
- b.WriteString(lower(rest))
- return b.String()
+ return string(unicode.ToUpper(first)) + lower(rest)
}
return l.original
}
-func (l nameLexem) GetOriginal() string {
+func (l *initialismNameLexem) GetOriginal() string {
return l.original
}
-func (l nameLexem) IsInitialism() bool {
- return l.kind == lexemKindInitialismName
+func (l *casualNameLexem) GetOriginal() string {
+ return l.original
+}
+
+func (l *initialismNameLexem) IsInitialism() bool {
+ return true
+}
+
+func (l *casualNameLexem) IsInitialism() bool {
+ return false
}
diff --git a/vendor/github.com/go-openapi/swag/post_go18.go b/vendor/github.com/go-openapi/swag/post_go18.go
new file mode 100644
index 00000000..f5228b82
--- /dev/null
+++ b/vendor/github.com/go-openapi/swag/post_go18.go
@@ -0,0 +1,24 @@
+// Copyright 2015 go-swagger maintainers
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+//go:build go1.8
+// +build go1.8
+
+package swag
+
+import "net/url"
+
+func pathUnescape(path string) (string, error) {
+ return url.PathUnescape(path)
+}
diff --git a/vendor/github.com/go-openapi/swag/post_go19.go b/vendor/github.com/go-openapi/swag/post_go19.go
new file mode 100644
index 00000000..7c7da9c0
--- /dev/null
+++ b/vendor/github.com/go-openapi/swag/post_go19.go
@@ -0,0 +1,68 @@
+// Copyright 2015 go-swagger maintainers
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+//go:build go1.9
+// +build go1.9
+
+package swag
+
+import (
+ "sort"
+ "sync"
+)
+
+// indexOfInitialisms is a thread-safe implementation of the sorted index of initialisms.
+// Since go1.9, this may be implemented with sync.Map.
+type indexOfInitialisms struct {
+ sortMutex *sync.Mutex
+ index *sync.Map
+}
+
+func newIndexOfInitialisms() *indexOfInitialisms {
+ return &indexOfInitialisms{
+ sortMutex: new(sync.Mutex),
+ index: new(sync.Map),
+ }
+}
+
+func (m *indexOfInitialisms) load(initial map[string]bool) *indexOfInitialisms {
+ m.sortMutex.Lock()
+ defer m.sortMutex.Unlock()
+ for k, v := range initial {
+ m.index.Store(k, v)
+ }
+ return m
+}
+
+func (m *indexOfInitialisms) isInitialism(key string) bool {
+ _, ok := m.index.Load(key)
+ return ok
+}
+
+func (m *indexOfInitialisms) add(key string) *indexOfInitialisms {
+ m.index.Store(key, true)
+ return m
+}
+
+func (m *indexOfInitialisms) sorted() (result []string) {
+ m.sortMutex.Lock()
+ defer m.sortMutex.Unlock()
+ m.index.Range(func(key, value interface{}) bool {
+ k := key.(string)
+ result = append(result, k)
+ return true
+ })
+ sort.Sort(sort.Reverse(byInitialism(result)))
+ return
+}
diff --git a/vendor/github.com/go-openapi/swag/pre_go18.go b/vendor/github.com/go-openapi/swag/pre_go18.go
new file mode 100644
index 00000000..2757d9b9
--- /dev/null
+++ b/vendor/github.com/go-openapi/swag/pre_go18.go
@@ -0,0 +1,24 @@
+// Copyright 2015 go-swagger maintainers
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+//go:build !go1.8
+// +build !go1.8
+
+package swag
+
+import "net/url"
+
+func pathUnescape(path string) (string, error) {
+ return url.QueryUnescape(path)
+}
diff --git a/vendor/github.com/go-openapi/swag/pre_go19.go b/vendor/github.com/go-openapi/swag/pre_go19.go
new file mode 100644
index 00000000..0565db37
--- /dev/null
+++ b/vendor/github.com/go-openapi/swag/pre_go19.go
@@ -0,0 +1,70 @@
+// Copyright 2015 go-swagger maintainers
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+//go:build !go1.9
+// +build !go1.9
+
+package swag
+
+import (
+ "sort"
+ "sync"
+)
+
+// indexOfInitialisms is a thread-safe implementation of the sorted index of initialisms.
+// Before go1.9, this may be implemented with a mutex on the map.
+type indexOfInitialisms struct {
+ getMutex *sync.Mutex
+ index map[string]bool
+}
+
+func newIndexOfInitialisms() *indexOfInitialisms {
+ return &indexOfInitialisms{
+ getMutex: new(sync.Mutex),
+ index: make(map[string]bool, 50),
+ }
+}
+
+func (m *indexOfInitialisms) load(initial map[string]bool) *indexOfInitialisms {
+ m.getMutex.Lock()
+ defer m.getMutex.Unlock()
+ for k, v := range initial {
+ m.index[k] = v
+ }
+ return m
+}
+
+func (m *indexOfInitialisms) isInitialism(key string) bool {
+ m.getMutex.Lock()
+ defer m.getMutex.Unlock()
+ _, ok := m.index[key]
+ return ok
+}
+
+func (m *indexOfInitialisms) add(key string) *indexOfInitialisms {
+ m.getMutex.Lock()
+ defer m.getMutex.Unlock()
+ m.index[key] = true
+ return m
+}
+
+func (m *indexOfInitialisms) sorted() (result []string) {
+ m.getMutex.Lock()
+ defer m.getMutex.Unlock()
+ for k := range m.index {
+ result = append(result, k)
+ }
+ sort.Sort(sort.Reverse(byInitialism(result)))
+ return
+}
diff --git a/vendor/github.com/go-openapi/swag/split.go b/vendor/github.com/go-openapi/swag/split.go
index 274727a8..a1825fb7 100644
--- a/vendor/github.com/go-openapi/swag/split.go
+++ b/vendor/github.com/go-openapi/swag/split.go
@@ -15,269 +15,124 @@
package swag
import (
- "bytes"
- "sync"
"unicode"
- "unicode/utf8"
)
+var nameReplaceTable = map[rune]string{
+ '@': "At ",
+ '&': "And ",
+ '|': "Pipe ",
+ '$': "Dollar ",
+ '!': "Bang ",
+ '-': "",
+ '_': "",
+}
+
type (
splitter struct {
- initialisms []string
- initialismsRunes [][]rune
- initialismsUpperCased [][]rune // initialisms cached in their trimmed, upper-cased version
postSplitInitialismCheck bool
+ initialisms []string
}
- splitterOption func(*splitter)
-
- initialismMatch struct {
- body []rune
- start, end int
- complete bool
- }
- initialismMatches []initialismMatch
+ splitterOption func(*splitter) *splitter
)
-type (
- // memory pools of temporary objects.
- //
- // These are used to recycle temporarily allocated objects
- // and relieve the GC from undue pressure.
-
- matchesPool struct {
- *sync.Pool
- }
-
- buffersPool struct {
- *sync.Pool
- }
-
- lexemsPool struct {
- *sync.Pool
- }
-
- splittersPool struct {
- *sync.Pool
- }
-)
-
-var (
- // poolOfMatches holds temporary slices for recycling during the initialism match process
- poolOfMatches = matchesPool{
- Pool: &sync.Pool{
- New: func() any {
- s := make(initialismMatches, 0, maxAllocMatches)
-
- return &s
- },
- },
- }
-
- poolOfBuffers = buffersPool{
- Pool: &sync.Pool{
- New: func() any {
- return new(bytes.Buffer)
- },
- },
- }
-
- poolOfLexems = lexemsPool{
- Pool: &sync.Pool{
- New: func() any {
- s := make([]nameLexem, 0, maxAllocMatches)
-
- return &s
- },
- },
- }
-
- poolOfSplitters = splittersPool{
- Pool: &sync.Pool{
- New: func() any {
- s := newSplitter()
-
- return &s
- },
- },
- }
-)
-
-// nameReplaceTable finds a word representation for special characters.
-func nameReplaceTable(r rune) (string, bool) {
- switch r {
- case '@':
- return "At ", true
- case '&':
- return "And ", true
- case '|':
- return "Pipe ", true
- case '$':
- return "Dollar ", true
- case '!':
- return "Bang ", true
- case '-':
- return "", true
- case '_':
- return "", true
- default:
- return "", false
- }
-}
-
-// split calls the splitter.
-//
-// Use newSplitter for more control and options
+// split calls the splitter; splitter provides more control and post options
func split(str string) []string {
- s := poolOfSplitters.BorrowSplitter()
- lexems := s.split(str)
- result := make([]string, 0, len(*lexems))
+ lexems := newSplitter().split(str)
+ result := make([]string, 0, len(lexems))
- for _, lexem := range *lexems {
+ for _, lexem := range lexems {
result = append(result, lexem.GetOriginal())
}
- poolOfLexems.RedeemLexems(lexems)
- poolOfSplitters.RedeemSplitter(s)
return result
}
-func newSplitter(options ...splitterOption) splitter {
- s := splitter{
+func (s *splitter) split(str string) []nameLexem {
+ return s.toNameLexems(str)
+}
+
+func newSplitter(options ...splitterOption) *splitter {
+ splitter := &splitter{
postSplitInitialismCheck: false,
initialisms: initialisms,
- initialismsRunes: initialismsRunes,
- initialismsUpperCased: initialismsUpperCased,
}
for _, option := range options {
- option(&s)
+ splitter = option(splitter)
}
- return s
+ return splitter
}
// withPostSplitInitialismCheck allows to catch initialisms after main split process
-func withPostSplitInitialismCheck(s *splitter) {
+func withPostSplitInitialismCheck(s *splitter) *splitter {
s.postSplitInitialismCheck = true
-}
-
-func (p matchesPool) BorrowMatches() *initialismMatches {
- s := p.Get().(*initialismMatches)
- *s = (*s)[:0] // reset slice, keep allocated capacity
-
return s
}
-func (p buffersPool) BorrowBuffer(size int) *bytes.Buffer {
- s := p.Get().(*bytes.Buffer)
- s.Reset()
-
- if s.Cap() < size {
- s.Grow(size)
+type (
+ initialismMatch struct {
+ start, end int
+ body []rune
+ complete bool
}
+ initialismMatches []*initialismMatch
+)
- return s
-}
-
-func (p lexemsPool) BorrowLexems() *[]nameLexem {
- s := p.Get().(*[]nameLexem)
- *s = (*s)[:0] // reset slice, keep allocated capacity
-
- return s
-}
-
-func (p splittersPool) BorrowSplitter(options ...splitterOption) *splitter {
- s := p.Get().(*splitter)
- s.postSplitInitialismCheck = false // reset options
- for _, apply := range options {
- apply(s)
- }
-
- return s
-}
-
-func (p matchesPool) RedeemMatches(s *initialismMatches) {
- p.Put(s)
-}
-
-func (p buffersPool) RedeemBuffer(s *bytes.Buffer) {
- p.Put(s)
-}
-
-func (p lexemsPool) RedeemLexems(s *[]nameLexem) {
- p.Put(s)
-}
-
-func (p splittersPool) RedeemSplitter(s *splitter) {
- p.Put(s)
-}
-
-func (m initialismMatch) isZero() bool {
- return m.start == 0 && m.end == 0
-}
-
-func (s splitter) split(name string) *[]nameLexem {
+func (s *splitter) toNameLexems(name string) []nameLexem {
nameRunes := []rune(name)
matches := s.gatherInitialismMatches(nameRunes)
- if matches == nil {
- return poolOfLexems.BorrowLexems()
- }
-
return s.mapMatchesToNameLexems(nameRunes, matches)
}
-func (s splitter) gatherInitialismMatches(nameRunes []rune) *initialismMatches {
- var matches *initialismMatches
+func (s *splitter) gatherInitialismMatches(nameRunes []rune) initialismMatches {
+ matches := make(initialismMatches, 0)
for currentRunePosition, currentRune := range nameRunes {
- // recycle these allocations as we loop over runes
- // with such recycling, only 2 slices should be allocated per call
- // instead of o(n).
- newMatches := poolOfMatches.BorrowMatches()
+ newMatches := make(initialismMatches, 0, len(matches))
// check current initialism matches
- if matches != nil { // skip first iteration
- for _, match := range *matches {
- if keepCompleteMatch := match.complete; keepCompleteMatch {
- *newMatches = append(*newMatches, match)
- continue
- }
-
- // drop failed match
- currentMatchRune := match.body[currentRunePosition-match.start]
- if currentMatchRune != currentRune {
- continue
- }
-
- // try to complete ongoing match
- if currentRunePosition-match.start == len(match.body)-1 {
- // we are close; the next step is to check the symbol ahead
- // if it is a small letter, then it is not the end of match
- // but beginning of the next word
-
- if currentRunePosition < len(nameRunes)-1 {
- nextRune := nameRunes[currentRunePosition+1]
- if newWord := unicode.IsLower(nextRune); newWord {
- // oh ok, it was the start of a new word
- continue
- }
- }
-
- match.complete = true
- match.end = currentRunePosition
- }
-
- *newMatches = append(*newMatches, match)
+ for _, match := range matches {
+ if keepCompleteMatch := match.complete; keepCompleteMatch {
+ newMatches = append(newMatches, match)
+ continue
}
+
+ // drop failed match
+ currentMatchRune := match.body[currentRunePosition-match.start]
+ if !s.initialismRuneEqual(currentMatchRune, currentRune) {
+ continue
+ }
+
+ // try to complete ongoing match
+ if currentRunePosition-match.start == len(match.body)-1 {
+ // we are close; the next step is to check the symbol ahead
+ // if it is a small letter, then it is not the end of match
+ // but beginning of the next word
+
+ if currentRunePosition < len(nameRunes)-1 {
+ nextRune := nameRunes[currentRunePosition+1]
+ if newWord := unicode.IsLower(nextRune); newWord {
+ // oh ok, it was the start of a new word
+ continue
+ }
+ }
+
+ match.complete = true
+ match.end = currentRunePosition
+ }
+
+ newMatches = append(newMatches, match)
}
// check for new initialism matches
- for i := range s.initialisms {
- initialismRunes := s.initialismsRunes[i]
- if initialismRunes[0] == currentRune {
- *newMatches = append(*newMatches, initialismMatch{
+ for _, initialism := range s.initialisms {
+ initialismRunes := []rune(initialism)
+ if s.initialismRuneEqual(initialismRunes[0], currentRune) {
+ newMatches = append(newMatches, &initialismMatch{
start: currentRunePosition,
body: initialismRunes,
complete: false,
@@ -285,28 +140,24 @@ func (s splitter) gatherInitialismMatches(nameRunes []rune) *initialismMatches {
}
}
- if matches != nil {
- poolOfMatches.RedeemMatches(matches)
- }
matches = newMatches
}
- // up to the caller to redeem this last slice
return matches
}
-func (s splitter) mapMatchesToNameLexems(nameRunes []rune, matches *initialismMatches) *[]nameLexem {
- nameLexems := poolOfLexems.BorrowLexems()
+func (s *splitter) mapMatchesToNameLexems(nameRunes []rune, matches initialismMatches) []nameLexem {
+ nameLexems := make([]nameLexem, 0)
- var lastAcceptedMatch initialismMatch
- for _, match := range *matches {
+ var lastAcceptedMatch *initialismMatch
+ for _, match := range matches {
if !match.complete {
continue
}
- if firstMatch := lastAcceptedMatch.isZero(); firstMatch {
- s.appendBrokenDownCasualString(nameLexems, nameRunes[:match.start])
- *nameLexems = append(*nameLexems, s.breakInitialism(string(match.body)))
+ if firstMatch := lastAcceptedMatch == nil; firstMatch {
+ nameLexems = append(nameLexems, s.breakCasualString(nameRunes[:match.start])...)
+ nameLexems = append(nameLexems, s.breakInitialism(string(match.body)))
lastAcceptedMatch = match
@@ -318,66 +169,63 @@ func (s splitter) mapMatchesToNameLexems(nameRunes []rune, matches *initialismMa
}
middle := nameRunes[lastAcceptedMatch.end+1 : match.start]
- s.appendBrokenDownCasualString(nameLexems, middle)
- *nameLexems = append(*nameLexems, s.breakInitialism(string(match.body)))
+ nameLexems = append(nameLexems, s.breakCasualString(middle)...)
+ nameLexems = append(nameLexems, s.breakInitialism(string(match.body)))
lastAcceptedMatch = match
}
// we have not found any accepted matches
- if lastAcceptedMatch.isZero() {
- *nameLexems = (*nameLexems)[:0]
- s.appendBrokenDownCasualString(nameLexems, nameRunes)
- } else if lastAcceptedMatch.end+1 != len(nameRunes) {
- rest := nameRunes[lastAcceptedMatch.end+1:]
- s.appendBrokenDownCasualString(nameLexems, rest)
+ if lastAcceptedMatch == nil {
+ return s.breakCasualString(nameRunes)
}
- poolOfMatches.RedeemMatches(matches)
+ if lastAcceptedMatch.end+1 != len(nameRunes) {
+ rest := nameRunes[lastAcceptedMatch.end+1:]
+ nameLexems = append(nameLexems, s.breakCasualString(rest)...)
+ }
return nameLexems
}
-func (s splitter) breakInitialism(original string) nameLexem {
+func (s *splitter) initialismRuneEqual(a, b rune) bool {
+ return a == b
+}
+
+func (s *splitter) breakInitialism(original string) nameLexem {
return newInitialismNameLexem(original, original)
}
-func (s splitter) appendBrokenDownCasualString(segments *[]nameLexem, str []rune) {
- currentSegment := poolOfBuffers.BorrowBuffer(len(str)) // unlike strings.Builder, bytes.Buffer initial storage can reused
- defer func() {
- poolOfBuffers.RedeemBuffer(currentSegment)
- }()
+func (s *splitter) breakCasualString(str []rune) []nameLexem {
+ segments := make([]nameLexem, 0)
+ currentSegment := ""
addCasualNameLexem := func(original string) {
- *segments = append(*segments, newCasualNameLexem(original))
+ segments = append(segments, newCasualNameLexem(original))
}
addInitialismNameLexem := func(original, match string) {
- *segments = append(*segments, newInitialismNameLexem(original, match))
+ segments = append(segments, newInitialismNameLexem(original, match))
}
- var addNameLexem func(string)
- if s.postSplitInitialismCheck {
- addNameLexem = func(original string) {
- for i := range s.initialisms {
- if isEqualFoldIgnoreSpace(s.initialismsUpperCased[i], original) {
- addInitialismNameLexem(original, s.initialisms[i])
-
+ addNameLexem := func(original string) {
+ if s.postSplitInitialismCheck {
+ for _, initialism := range s.initialisms {
+ if upper(initialism) == upper(original) {
+ addInitialismNameLexem(original, initialism)
return
}
}
-
- addCasualNameLexem(original)
}
- } else {
- addNameLexem = addCasualNameLexem
+
+ addCasualNameLexem(original)
}
- for _, rn := range str {
- if replace, found := nameReplaceTable(rn); found {
- if currentSegment.Len() > 0 {
- addNameLexem(currentSegment.String())
- currentSegment.Reset()
+ for _, rn := range string(str) {
+ if replace, found := nameReplaceTable[rn]; found {
+ if currentSegment != "" {
+ addNameLexem(currentSegment)
+ currentSegment = ""
}
if replace != "" {
@@ -388,121 +236,27 @@ func (s splitter) appendBrokenDownCasualString(segments *[]nameLexem, str []rune
}
if !unicode.In(rn, unicode.L, unicode.M, unicode.N, unicode.Pc) {
- if currentSegment.Len() > 0 {
- addNameLexem(currentSegment.String())
- currentSegment.Reset()
+ if currentSegment != "" {
+ addNameLexem(currentSegment)
+ currentSegment = ""
}
continue
}
if unicode.IsUpper(rn) {
- if currentSegment.Len() > 0 {
- addNameLexem(currentSegment.String())
+ if currentSegment != "" {
+ addNameLexem(currentSegment)
}
- currentSegment.Reset()
+ currentSegment = ""
}
- currentSegment.WriteRune(rn)
+ currentSegment += string(rn)
}
- if currentSegment.Len() > 0 {
- addNameLexem(currentSegment.String())
+ if currentSegment != "" {
+ addNameLexem(currentSegment)
}
-}
-
-// isEqualFoldIgnoreSpace is the same as strings.EqualFold, but
-// it ignores leading and trailing blank spaces in the compared
-// string.
-//
-// base is assumed to be composed of upper-cased runes, and be already
-// trimmed.
-//
-// This code is heavily inspired from strings.EqualFold.
-func isEqualFoldIgnoreSpace(base []rune, str string) bool {
- var i, baseIndex int
- // equivalent to b := []byte(str), but without data copy
- b := hackStringBytes(str)
-
- for i < len(b) {
- if c := b[i]; c < utf8.RuneSelf {
- // fast path for ASCII
- if c != ' ' && c != '\t' {
- break
- }
- i++
-
- continue
- }
-
- // unicode case
- r, size := utf8.DecodeRune(b[i:])
- if !unicode.IsSpace(r) {
- break
- }
- i += size
- }
-
- if i >= len(b) {
- return len(base) == 0
- }
-
- for _, baseRune := range base {
- if i >= len(b) {
- break
- }
-
- if c := b[i]; c < utf8.RuneSelf {
- // single byte rune case (ASCII)
- if baseRune >= utf8.RuneSelf {
- return false
- }
-
- baseChar := byte(baseRune)
- if c != baseChar &&
- !('a' <= c && c <= 'z' && c-'a'+'A' == baseChar) {
- return false
- }
-
- baseIndex++
- i++
-
- continue
- }
-
- // unicode case
- r, size := utf8.DecodeRune(b[i:])
- if unicode.ToUpper(r) != baseRune {
- return false
- }
- baseIndex++
- i += size
- }
-
- if baseIndex != len(base) {
- return false
- }
-
- // all passed: now we should only have blanks
- for i < len(b) {
- if c := b[i]; c < utf8.RuneSelf {
- // fast path for ASCII
- if c != ' ' && c != '\t' {
- return false
- }
- i++
-
- continue
- }
-
- // unicode case
- r, size := utf8.DecodeRune(b[i:])
- if !unicode.IsSpace(r) {
- return false
- }
-
- i += size
- }
-
- return true
+
+ return segments
}
diff --git a/vendor/github.com/go-openapi/swag/string_bytes.go b/vendor/github.com/go-openapi/swag/string_bytes.go
deleted file mode 100644
index 90745d5c..00000000
--- a/vendor/github.com/go-openapi/swag/string_bytes.go
+++ /dev/null
@@ -1,8 +0,0 @@
-package swag
-
-import "unsafe"
-
-// hackStringBytes returns the (unsafe) underlying bytes slice of a string.
-func hackStringBytes(str string) []byte {
- return unsafe.Slice(unsafe.StringData(str), len(str))
-}
diff --git a/vendor/github.com/go-openapi/swag/util.go b/vendor/github.com/go-openapi/swag/util.go
index 5051401c..f78ab684 100644
--- a/vendor/github.com/go-openapi/swag/util.go
+++ b/vendor/github.com/go-openapi/swag/util.go
@@ -18,25 +18,76 @@ import (
"reflect"
"strings"
"unicode"
- "unicode/utf8"
)
+// commonInitialisms are common acronyms that are kept as whole uppercased words.
+var commonInitialisms *indexOfInitialisms
+
+// initialisms is a slice of sorted initialisms
+var initialisms []string
+
+var isInitialism func(string) bool
+
// GoNamePrefixFunc sets an optional rule to prefix go names
// which do not start with a letter.
//
-// The prefix function is assumed to return a string that starts with an upper case letter.
-//
// e.g. to help convert "123" into "{prefix}123"
//
// The default is to prefix with "X"
var GoNamePrefixFunc func(string) string
-func prefixFunc(name, in string) string {
- if GoNamePrefixFunc == nil {
- return "X" + in
+func init() {
+ // Taken from https://github.com/golang/lint/blob/3390df4df2787994aea98de825b964ac7944b817/lint.go#L732-L769
+ var configuredInitialisms = map[string]bool{
+ "ACL": true,
+ "API": true,
+ "ASCII": true,
+ "CPU": true,
+ "CSS": true,
+ "DNS": true,
+ "EOF": true,
+ "GUID": true,
+ "HTML": true,
+ "HTTPS": true,
+ "HTTP": true,
+ "ID": true,
+ "IP": true,
+ "IPv4": true,
+ "IPv6": true,
+ "JSON": true,
+ "LHS": true,
+ "OAI": true,
+ "QPS": true,
+ "RAM": true,
+ "RHS": true,
+ "RPC": true,
+ "SLA": true,
+ "SMTP": true,
+ "SQL": true,
+ "SSH": true,
+ "TCP": true,
+ "TLS": true,
+ "TTL": true,
+ "UDP": true,
+ "UI": true,
+ "UID": true,
+ "UUID": true,
+ "URI": true,
+ "URL": true,
+ "UTF8": true,
+ "VM": true,
+ "XML": true,
+ "XMPP": true,
+ "XSRF": true,
+ "XSS": true,
}
- return GoNamePrefixFunc(name) + in
+ // a thread-safe index of initialisms
+ commonInitialisms = newIndexOfInitialisms().load(configuredInitialisms)
+ initialisms = commonInitialisms.sorted()
+
+ // a test function
+ isInitialism = commonInitialisms.isInitialism
}
const (
@@ -105,9 +156,25 @@ func SplitByFormat(data, format string) []string {
return result
}
+type byInitialism []string
+
+func (s byInitialism) Len() int {
+ return len(s)
+}
+func (s byInitialism) Swap(i, j int) {
+ s[i], s[j] = s[j], s[i]
+}
+func (s byInitialism) Less(i, j int) bool {
+ if len(s[i]) != len(s[j]) {
+ return len(s[i]) < len(s[j])
+ }
+
+ return strings.Compare(s[i], s[j]) > 0
+}
+
// Removes leading whitespaces
func trim(str string) string {
- return strings.TrimSpace(str)
+ return strings.Trim(str, " ")
}
// Shortcut to strings.ToUpper()
@@ -121,20 +188,15 @@ func lower(str string) string {
}
// Camelize an uppercased word
-func Camelize(word string) string {
- camelized := poolOfBuffers.BorrowBuffer(len(word))
- defer func() {
- poolOfBuffers.RedeemBuffer(camelized)
- }()
-
+func Camelize(word string) (camelized string) {
for pos, ru := range []rune(word) {
if pos > 0 {
- camelized.WriteRune(unicode.ToLower(ru))
+ camelized += string(unicode.ToLower(ru))
} else {
- camelized.WriteRune(unicode.ToUpper(ru))
+ camelized += string(unicode.ToUpper(ru))
}
}
- return camelized.String()
+ return
}
// ToFileName lowercases and underscores a go type name
@@ -162,40 +224,33 @@ func ToCommandName(name string) string {
// ToHumanNameLower represents a code name as a human series of words
func ToHumanNameLower(name string) string {
- s := poolOfSplitters.BorrowSplitter(withPostSplitInitialismCheck)
- in := s.split(name)
- poolOfSplitters.RedeemSplitter(s)
- out := make([]string, 0, len(*in))
+ in := newSplitter(withPostSplitInitialismCheck).split(name)
+ out := make([]string, 0, len(in))
- for _, w := range *in {
+ for _, w := range in {
if !w.IsInitialism() {
out = append(out, lower(w.GetOriginal()))
} else {
- out = append(out, trim(w.GetOriginal()))
+ out = append(out, w.GetOriginal())
}
}
- poolOfLexems.RedeemLexems(in)
return strings.Join(out, " ")
}
// ToHumanNameTitle represents a code name as a human series of words with the first letters titleized
func ToHumanNameTitle(name string) string {
- s := poolOfSplitters.BorrowSplitter(withPostSplitInitialismCheck)
- in := s.split(name)
- poolOfSplitters.RedeemSplitter(s)
+ in := newSplitter(withPostSplitInitialismCheck).split(name)
- out := make([]string, 0, len(*in))
- for _, w := range *in {
- original := trim(w.GetOriginal())
+ out := make([]string, 0, len(in))
+ for _, w := range in {
+ original := w.GetOriginal()
if !w.IsInitialism() {
out = append(out, Camelize(original))
} else {
out = append(out, original)
}
}
- poolOfLexems.RedeemLexems(in)
-
return strings.Join(out, " ")
}
@@ -209,7 +264,7 @@ func ToJSONName(name string) string {
out = append(out, lower(w))
continue
}
- out = append(out, Camelize(trim(w)))
+ out = append(out, Camelize(w))
}
return strings.Join(out, "")
}
@@ -228,70 +283,35 @@ func ToVarName(name string) string {
// ToGoName translates a swagger name which can be underscored or camel cased to a name that golint likes
func ToGoName(name string) string {
- s := poolOfSplitters.BorrowSplitter(withPostSplitInitialismCheck)
- lexems := s.split(name)
- poolOfSplitters.RedeemSplitter(s)
- defer func() {
- poolOfLexems.RedeemLexems(lexems)
- }()
- lexemes := *lexems
+ lexems := newSplitter(withPostSplitInitialismCheck).split(name)
- if len(lexemes) == 0 {
- return ""
- }
-
- result := poolOfBuffers.BorrowBuffer(len(name))
- defer func() {
- poolOfBuffers.RedeemBuffer(result)
- }()
-
- // check if not starting with a letter, upper case
- firstPart := lexemes[0].GetUnsafeGoName()
- if lexemes[0].IsInitialism() {
- firstPart = upper(firstPart)
- }
-
- if c := firstPart[0]; c < utf8.RuneSelf {
- // ASCII
- switch {
- case 'A' <= c && c <= 'Z':
- result.WriteString(firstPart)
- case 'a' <= c && c <= 'z':
- result.WriteByte(c - 'a' + 'A')
- result.WriteString(firstPart[1:])
- default:
- result.WriteString(prefixFunc(name, firstPart))
- // NOTE: no longer check if prefixFunc returns a string that starts with uppercase:
- // assume this is always the case
- }
- } else {
- // unicode
- firstRune, _ := utf8.DecodeRuneInString(firstPart)
- switch {
- case !unicode.IsLetter(firstRune):
- result.WriteString(prefixFunc(name, firstPart))
- case !unicode.IsUpper(firstRune):
- result.WriteString(prefixFunc(name, firstPart))
- /*
- result.WriteRune(unicode.ToUpper(firstRune))
- result.WriteString(firstPart[offset:])
- */
- default:
- result.WriteString(firstPart)
- }
- }
-
- for _, lexem := range lexemes[1:] {
+ result := ""
+ for _, lexem := range lexems {
goName := lexem.GetUnsafeGoName()
// to support old behavior
if lexem.IsInitialism() {
goName = upper(goName)
}
- result.WriteString(goName)
+ result += goName
}
- return result.String()
+ if len(result) > 0 {
+ // Only prefix with X when the first character isn't an ascii letter
+ first := []rune(result)[0]
+ if !unicode.IsLetter(first) || (first > unicode.MaxASCII && !unicode.IsUpper(first)) {
+ if GoNamePrefixFunc == nil {
+ return "X" + result
+ }
+ result = GoNamePrefixFunc(name) + result
+ }
+ first = []rune(result)[0]
+ if unicode.IsLetter(first) && !unicode.IsUpper(first) {
+ result = string(append([]rune{unicode.ToUpper(first)}, []rune(result)[1:]...))
+ }
+ }
+
+ return result
}
// ContainsStrings searches a slice of strings for a case-sensitive match
@@ -321,22 +341,13 @@ type zeroable interface {
// IsZero returns true when the value passed into the function is a zero value.
// This allows for safer checking of interface values.
func IsZero(data interface{}) bool {
- v := reflect.ValueOf(data)
- // check for nil data
- switch v.Kind() { //nolint:exhaustive
- case reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice:
- if v.IsNil() {
- return true
- }
- }
-
// check for things that have an IsZero method instead
if vv, ok := data.(zeroable); ok {
return vv.IsZero()
}
-
// continue with slightly more complex reflection
- switch v.Kind() { //nolint:exhaustive
+ v := reflect.ValueOf(data)
+ switch v.Kind() {
case reflect.String:
return v.Len() == 0
case reflect.Bool:
@@ -347,13 +358,24 @@ func IsZero(data interface{}) bool {
return v.Uint() == 0
case reflect.Float32, reflect.Float64:
return v.Float() == 0
+ case reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice:
+ return v.IsNil()
case reflect.Struct, reflect.Array:
return reflect.DeepEqual(data, reflect.Zero(v.Type()).Interface())
case reflect.Invalid:
return true
- default:
- return false
}
+ return false
+}
+
+// AddInitialisms add additional initialisms
+func AddInitialisms(words ...string) {
+ for _, word := range words {
+ // commonInitialisms[upper(word)] = true
+ commonInitialisms.add(upper(word))
+ }
+ // sort again
+ initialisms = commonInitialisms.sorted()
}
// CommandLineOptionsGroup represents a group of user-defined command line options
diff --git a/vendor/github.com/go-openapi/swag/yaml.go b/vendor/github.com/go-openapi/swag/yaml.go
index f59e0259..f09ee609 100644
--- a/vendor/github.com/go-openapi/swag/yaml.go
+++ b/vendor/github.com/go-openapi/swag/yaml.go
@@ -16,11 +16,8 @@ package swag
import (
"encoding/json"
- "errors"
"fmt"
"path/filepath"
- "reflect"
- "sort"
"strconv"
"github.com/mailru/easyjson/jlexer"
@@ -51,7 +48,7 @@ func BytesToYAMLDoc(data []byte) (interface{}, error) {
return nil, err
}
if document.Kind != yaml.DocumentNode || len(document.Content) != 1 || document.Content[0].Kind != yaml.MappingNode {
- return nil, errors.New("only YAML documents that are objects are supported")
+ return nil, fmt.Errorf("only YAML documents that are objects are supported")
}
return &document, nil
}
@@ -150,7 +147,7 @@ func yamlScalar(node *yaml.Node) (interface{}, error) {
case yamlTimestamp:
return node.Value, nil
case yamlNull:
- return nil, nil //nolint:nilnil
+ return nil, nil
default:
return nil, fmt.Errorf("YAML tag %q is not supported", node.LongTag())
}
@@ -248,27 +245,7 @@ func (s JSONMapSlice) MarshalYAML() (interface{}, error) {
return yaml.Marshal(&n)
}
-func isNil(input interface{}) bool {
- if input == nil {
- return true
- }
- kind := reflect.TypeOf(input).Kind()
- switch kind { //nolint:exhaustive
- case reflect.Ptr, reflect.Map, reflect.Slice, reflect.Chan:
- return reflect.ValueOf(input).IsNil()
- default:
- return false
- }
-}
-
func json2yaml(item interface{}) (*yaml.Node, error) {
- if isNil(item) {
- return &yaml.Node{
- Kind: yaml.ScalarNode,
- Value: "null",
- }, nil
- }
-
switch val := item.(type) {
case JSONMapSlice:
var n yaml.Node
@@ -288,14 +265,7 @@ func json2yaml(item interface{}) (*yaml.Node, error) {
case map[string]interface{}:
var n yaml.Node
n.Kind = yaml.MappingNode
- keys := make([]string, 0, len(val))
- for k := range val {
- keys = append(keys, k)
- }
- sort.Strings(keys)
-
- for _, k := range keys {
- v := val[k]
+ for k, v := range val {
childNode, err := json2yaml(v)
if err != nil {
return nil, err
@@ -348,9 +318,8 @@ func json2yaml(item interface{}) (*yaml.Node, error) {
Tag: yamlBoolScalar,
Value: strconv.FormatBool(val),
}, nil
- default:
- return nil, fmt.Errorf("unhandled type: %T", val)
}
+ return nil, nil
}
// JSONMapItem represents the value of a key in a JSON object held by JSONMapSlice
diff --git a/vendor/github.com/go-sql-driver/mysql/AUTHORS b/vendor/github.com/go-sql-driver/mysql/AUTHORS
index 4021b96c..ec346e20 100644
--- a/vendor/github.com/go-sql-driver/mysql/AUTHORS
+++ b/vendor/github.com/go-sql-driver/mysql/AUTHORS
@@ -20,7 +20,12 @@ Andrew Reid
Animesh Ray
Arne Hormann
Ariel Mashraki
+Artur Melanchyk
Asta Xie
+B Lamarche
+Bes Dollma
+Bogdan Constantinescu
+Brad Higgins
Brian Hendriks
Bulat Gaifullin
Caine Jette
@@ -33,6 +38,8 @@ Daniel Montoya
Daniel Nichter
Daniël van Eeden
Dave Protasowski
+Diego Dupin
+Dirkjan Bussink
DisposaBoy
Egor Smolyakov
Erwan Martin
@@ -50,6 +57,7 @@ ICHINOSE Shogo
Ilia Cimpoes
INADA Naoki
Jacek Szwec
+Jakub Adamus
James Harr
Janek Vedock
Jason Ng
@@ -60,6 +68,7 @@ Jennifer Purevsuren
Jerome Meyer
Jiajia Zhong
Jian Zhen
+Joe Mann
Joshua Prunier
Julien Lefevre
Julien Schmidt
@@ -80,6 +89,7 @@ Lunny Xiao
Luke Scott
Maciej Zimnoch
Michael Woolnough
+Nao Yokotsuka
Nathanial Murphy
Nicola Peduzzi
Oliver Bone
@@ -89,6 +99,7 @@ Paul Bonser
Paulius Lozys
Peter Schultz
Phil Porada
+Minh Quang
Rebecca Chin
Reed Allman
Richard Wilkes
@@ -124,6 +135,7 @@ Ziheng Lyu
Barracuda Networks, Inc.
Counting Ltd.
+Defined Networking Inc.
DigitalOcean Inc.
Dolthub Inc.
dyves labs AG
@@ -139,4 +151,5 @@ PingCAP Inc.
Pivotal Inc.
Shattered Silicon Ltd.
Stripe Inc.
+ThousandEyes
Zendesk Inc.
diff --git a/vendor/github.com/go-sql-driver/mysql/CHANGELOG.md b/vendor/github.com/go-sql-driver/mysql/CHANGELOG.md
index 0c9bd9b1..75674b60 100644
--- a/vendor/github.com/go-sql-driver/mysql/CHANGELOG.md
+++ b/vendor/github.com/go-sql-driver/mysql/CHANGELOG.md
@@ -1,3 +1,55 @@
+# Changelog
+
+## v1.9.3 (2025-06-13)
+
+* `tx.Commit()` and `tx.Rollback()` returned `ErrInvalidConn` always.
+ Now they return cached real error if present. (#1690)
+
+* Optimize reading small resultsets to fix performance regression
+ introduced by compression protocol support. (#1707)
+
+* Fix `db.Ping()` on compressed connection. (#1723)
+
+
+## v1.9.2 (2025-04-07)
+
+v1.9.2 is a re-release of v1.9.1 due to a release process issue; no changes were made to the content.
+
+
+## v1.9.1 (2025-03-21)
+
+### Major Changes
+
+* Add Charset() option. (#1679)
+
+### Bugfixes
+
+* go.mod: fix go version format (#1682)
+* Fix FormatDSN missing ConnectionAttributes (#1619)
+
+## v1.9.0 (2025-02-18)
+
+### Major Changes
+
+- Implement zlib compression. (#1487)
+- Supported Go version is updated to Go 1.21+. (#1639)
+- Add support for VECTOR type introduced in MySQL 9.0. (#1609)
+- Config object can have custom dial function. (#1527)
+
+### Bugfixes
+
+- Fix auth errors when username/password are too long. (#1625)
+- Check if MySQL supports CLIENT_CONNECT_ATTRS before sending client attributes. (#1640)
+- Fix auth switch request handling. (#1666)
+
+### Other changes
+
+- Add "filename:line" prefix to log in go-mysql. Custom loggers now show it. (#1589)
+- Improve error handling. It reduces the "busy buffer" errors. (#1595, #1601, #1641)
+- Use `strconv.Atoi` to parse max_allowed_packet. (#1661)
+- `rejectReadOnly` option now handles ER_READ_ONLY_MODE (1290) error too. (#1660)
+
+
## Version 1.8.1 (2024-03-26)
Bugfixes:
diff --git a/vendor/github.com/go-sql-driver/mysql/README.md b/vendor/github.com/go-sql-driver/mysql/README.md
index 4968cb06..da4593cc 100644
--- a/vendor/github.com/go-sql-driver/mysql/README.md
+++ b/vendor/github.com/go-sql-driver/mysql/README.md
@@ -38,11 +38,12 @@ A MySQL-Driver for Go's [database/sql](https://golang.org/pkg/database/sql/) pac
* Secure `LOAD DATA LOCAL INFILE` support with file allowlisting and `io.Reader` support
* Optional `time.Time` parsing
* Optional placeholder interpolation
+ * Supports zlib compression.
## Requirements
-* Go 1.19 or higher. We aim to support the 3 latest versions of Go.
-* MySQL (5.7+) and MariaDB (10.3+) are supported.
+* Go 1.21 or higher. We aim to support the 3 latest versions of Go.
+* MySQL (5.7+) and MariaDB (10.5+) are supported.
* [TiDB](https://github.com/pingcap/tidb) is supported by PingCAP.
* Do not ask questions about TiDB in our issue tracker or forum.
* [Document](https://docs.pingcap.com/tidb/v6.1/dev-guide-sample-application-golang)
@@ -267,6 +268,16 @@ SELECT u.id FROM users as u
will return `u.id` instead of just `id` if `columnsWithAlias=true`.
+##### `compress`
+
+```
+Type: bool
+Valid Values: true, false
+Default: false
+```
+
+Toggles zlib compression. false by default.
+
##### `interpolateParams`
```
@@ -519,6 +530,9 @@ This driver supports the [`ColumnType` interface](https://golang.org/pkg/databas
Go 1.8 added `database/sql` support for `context.Context`. This driver supports query timeouts and cancellation via contexts.
See [context support in the database/sql package](https://golang.org/doc/go1.8#database_sql) for more details.
+> [!IMPORTANT]
+> The `QueryContext`, `ExecContext`, etc. variants provided by `database/sql` will cause the connection to be closed if the provided context is cancelled or timed out before the result is received by the driver.
+
### `LOAD DATA LOCAL INFILE` support
For this feature you need direct access to the package. Therefore you must change the import path (no `_`):
diff --git a/vendor/github.com/go-sql-driver/mysql/atomic_bool.go b/vendor/github.com/go-sql-driver/mysql/atomic_bool.go
deleted file mode 100644
index 1b7e19f3..00000000
--- a/vendor/github.com/go-sql-driver/mysql/atomic_bool.go
+++ /dev/null
@@ -1,19 +0,0 @@
-// Go MySQL Driver - A MySQL-Driver for Go's database/sql package.
-//
-// Copyright 2022 The Go-MySQL-Driver Authors. All rights reserved.
-//
-// This Source Code Form is subject to the terms of the Mozilla Public
-// License, v. 2.0. If a copy of the MPL was not distributed with this file,
-// You can obtain one at http://mozilla.org/MPL/2.0/.
-//go:build go1.19
-// +build go1.19
-
-package mysql
-
-import "sync/atomic"
-
-/******************************************************************************
-* Sync utils *
-******************************************************************************/
-
-type atomicBool = atomic.Bool
diff --git a/vendor/github.com/go-sql-driver/mysql/atomic_bool_go118.go b/vendor/github.com/go-sql-driver/mysql/atomic_bool_go118.go
deleted file mode 100644
index 2e9a7f0b..00000000
--- a/vendor/github.com/go-sql-driver/mysql/atomic_bool_go118.go
+++ /dev/null
@@ -1,47 +0,0 @@
-// Go MySQL Driver - A MySQL-Driver for Go's database/sql package.
-//
-// Copyright 2022 The Go-MySQL-Driver Authors. All rights reserved.
-//
-// This Source Code Form is subject to the terms of the Mozilla Public
-// License, v. 2.0. If a copy of the MPL was not distributed with this file,
-// You can obtain one at http://mozilla.org/MPL/2.0/.
-//go:build !go1.19
-// +build !go1.19
-
-package mysql
-
-import "sync/atomic"
-
-/******************************************************************************
-* Sync utils *
-******************************************************************************/
-
-// atomicBool is an implementation of atomic.Bool for older version of Go.
-// it is a wrapper around uint32 for usage as a boolean value with
-// atomic access.
-type atomicBool struct {
- _ noCopy
- value uint32
-}
-
-// Load returns whether the current boolean value is true
-func (ab *atomicBool) Load() bool {
- return atomic.LoadUint32(&ab.value) > 0
-}
-
-// Store sets the value of the bool regardless of the previous value
-func (ab *atomicBool) Store(value bool) {
- if value {
- atomic.StoreUint32(&ab.value, 1)
- } else {
- atomic.StoreUint32(&ab.value, 0)
- }
-}
-
-// Swap sets the value of the bool and returns the old value.
-func (ab *atomicBool) Swap(value bool) bool {
- if value {
- return atomic.SwapUint32(&ab.value, 1) > 0
- }
- return atomic.SwapUint32(&ab.value, 0) > 0
-}
diff --git a/vendor/github.com/go-sql-driver/mysql/buffer.go b/vendor/github.com/go-sql-driver/mysql/buffer.go
index 0774c5c8..f895e87b 100644
--- a/vendor/github.com/go-sql-driver/mysql/buffer.go
+++ b/vendor/github.com/go-sql-driver/mysql/buffer.go
@@ -10,54 +10,47 @@ package mysql
import (
"io"
- "net"
- "time"
)
const defaultBufSize = 4096
const maxCachedBufSize = 256 * 1024
+// readerFunc is a function that compatible with io.Reader.
+// We use this function type instead of io.Reader because we want to
+// just pass mc.readWithTimeout.
+type readerFunc func([]byte) (int, error)
+
// A buffer which is used for both reading and writing.
// This is possible since communication on each connection is synchronous.
// In other words, we can't write and read simultaneously on the same connection.
// The buffer is similar to bufio.Reader / Writer but zero-copy-ish
// Also highly optimized for this particular use case.
-// This buffer is backed by two byte slices in a double-buffering scheme
type buffer struct {
- buf []byte // buf is a byte buffer who's length and capacity are equal.
- nc net.Conn
- idx int
- length int
- timeout time.Duration
- dbuf [2][]byte // dbuf is an array with the two byte slices that back this buffer
- flipcnt uint // flipccnt is the current buffer counter for double-buffering
+ buf []byte // read buffer.
+ cachedBuf []byte // buffer that will be reused. len(cachedBuf) <= maxCachedBufSize.
}
// newBuffer allocates and returns a new buffer.
-func newBuffer(nc net.Conn) buffer {
- fg := make([]byte, defaultBufSize)
+func newBuffer() buffer {
return buffer{
- buf: fg,
- nc: nc,
- dbuf: [2][]byte{fg, nil},
+ cachedBuf: make([]byte, defaultBufSize),
}
}
-// flip replaces the active buffer with the background buffer
-// this is a delayed flip that simply increases the buffer counter;
-// the actual flip will be performed the next time we call `buffer.fill`
-func (b *buffer) flip() {
- b.flipcnt += 1
+// busy returns true if the read buffer is not empty.
+func (b *buffer) busy() bool {
+ return len(b.buf) > 0
}
-// fill reads into the buffer until at least _need_ bytes are in it
-func (b *buffer) fill(need int) error {
- n := b.length
- // fill data into its double-buffering target: if we've called
- // flip on this buffer, we'll be copying to the background buffer,
- // and then filling it with network data; otherwise we'll just move
- // the contents of the current buffer to the front before filling it
- dest := b.dbuf[b.flipcnt&1]
+// len returns how many bytes in the read buffer.
+func (b *buffer) len() int {
+ return len(b.buf)
+}
+
+// fill reads into the read buffer until at least _need_ bytes are in it.
+func (b *buffer) fill(need int, r readerFunc) error {
+ // we'll move the contents of the current buffer to dest before filling it.
+ dest := b.cachedBuf
// grow buffer if necessary to fit the whole packet.
if need > len(dest) {
@@ -67,64 +60,41 @@ func (b *buffer) fill(need int) error {
// if the allocated buffer is not too large, move it to backing storage
// to prevent extra allocations on applications that perform large reads
if len(dest) <= maxCachedBufSize {
- b.dbuf[b.flipcnt&1] = dest
+ b.cachedBuf = dest
}
}
- // if we're filling the fg buffer, move the existing data to the start of it.
- // if we're filling the bg buffer, copy over the data
- if n > 0 {
- copy(dest[:n], b.buf[b.idx:])
- }
-
- b.buf = dest
- b.idx = 0
+ // move the existing data to the start of the buffer.
+ n := len(b.buf)
+ copy(dest[:n], b.buf)
for {
- if b.timeout > 0 {
- if err := b.nc.SetReadDeadline(time.Now().Add(b.timeout)); err != nil {
- return err
- }
- }
-
- nn, err := b.nc.Read(b.buf[n:])
+ nn, err := r(dest[n:])
n += nn
- switch err {
- case nil:
- if n < need {
- continue
- }
- b.length = n
- return nil
-
- case io.EOF:
- if n >= need {
- b.length = n
- return nil
- }
- return io.ErrUnexpectedEOF
-
- default:
- return err
+ if err == nil && n < need {
+ continue
}
+
+ b.buf = dest[:n]
+
+ if err == io.EOF {
+ if n < need {
+ err = io.ErrUnexpectedEOF
+ } else {
+ err = nil
+ }
+ }
+ return err
}
}
// returns next N bytes from buffer.
// The returned slice is only guaranteed to be valid until the next read
-func (b *buffer) readNext(need int) ([]byte, error) {
- if b.length < need {
- // refill
- if err := b.fill(need); err != nil {
- return nil, err
- }
- }
-
- offset := b.idx
- b.idx += need
- b.length -= need
- return b.buf[offset:b.idx], nil
+func (b *buffer) readNext(need int) []byte {
+ data := b.buf[:need:need]
+ b.buf = b.buf[need:]
+ return data
}
// takeBuffer returns a buffer with the requested size.
@@ -132,18 +102,18 @@ func (b *buffer) readNext(need int) ([]byte, error) {
// Otherwise a bigger buffer is made.
// Only one buffer (total) can be used at a time.
func (b *buffer) takeBuffer(length int) ([]byte, error) {
- if b.length > 0 {
+ if b.busy() {
return nil, ErrBusyBuffer
}
// test (cheap) general case first
- if length <= cap(b.buf) {
- return b.buf[:length], nil
+ if length <= len(b.cachedBuf) {
+ return b.cachedBuf[:length], nil
}
- if length < maxPacketSize {
- b.buf = make([]byte, length)
- return b.buf, nil
+ if length < maxCachedBufSize {
+ b.cachedBuf = make([]byte, length)
+ return b.cachedBuf, nil
}
// buffer is larger than we want to store.
@@ -154,10 +124,10 @@ func (b *buffer) takeBuffer(length int) ([]byte, error) {
// known to be smaller than defaultBufSize.
// Only one buffer (total) can be used at a time.
func (b *buffer) takeSmallBuffer(length int) ([]byte, error) {
- if b.length > 0 {
+ if b.busy() {
return nil, ErrBusyBuffer
}
- return b.buf[:length], nil
+ return b.cachedBuf[:length], nil
}
// takeCompleteBuffer returns the complete existing buffer.
@@ -165,18 +135,15 @@ func (b *buffer) takeSmallBuffer(length int) ([]byte, error) {
// cap and len of the returned buffer will be equal.
// Only one buffer (total) can be used at a time.
func (b *buffer) takeCompleteBuffer() ([]byte, error) {
- if b.length > 0 {
+ if b.busy() {
return nil, ErrBusyBuffer
}
- return b.buf, nil
+ return b.cachedBuf, nil
}
// store stores buf, an updated buffer, if its suitable to do so.
-func (b *buffer) store(buf []byte) error {
- if b.length > 0 {
- return ErrBusyBuffer
- } else if cap(buf) <= maxPacketSize && cap(buf) > cap(b.buf) {
- b.buf = buf[:cap(buf)]
+func (b *buffer) store(buf []byte) {
+ if cap(buf) <= maxCachedBufSize && cap(buf) > cap(b.cachedBuf) {
+ b.cachedBuf = buf[:cap(buf)]
}
- return nil
}
diff --git a/vendor/github.com/go-sql-driver/mysql/collations.go b/vendor/github.com/go-sql-driver/mysql/collations.go
index 1cdf97b6..29b1aa43 100644
--- a/vendor/github.com/go-sql-driver/mysql/collations.go
+++ b/vendor/github.com/go-sql-driver/mysql/collations.go
@@ -8,7 +8,7 @@
package mysql
-const defaultCollation = "utf8mb4_general_ci"
+const defaultCollationID = 45 // utf8mb4_general_ci
const binaryCollationID = 63
// A list of available collations mapped to the internal ID.
diff --git a/vendor/github.com/go-sql-driver/mysql/compress.go b/vendor/github.com/go-sql-driver/mysql/compress.go
new file mode 100644
index 00000000..38bfa000
--- /dev/null
+++ b/vendor/github.com/go-sql-driver/mysql/compress.go
@@ -0,0 +1,213 @@
+// Go MySQL Driver - A MySQL-Driver for Go's database/sql package
+//
+// Copyright 2024 The Go-MySQL-Driver Authors. All rights reserved.
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this file,
+// You can obtain one at http://mozilla.org/MPL/2.0/.
+
+package mysql
+
+import (
+ "bytes"
+ "compress/zlib"
+ "fmt"
+ "io"
+ "sync"
+)
+
+var (
+ zrPool *sync.Pool // Do not use directly. Use zDecompress() instead.
+ zwPool *sync.Pool // Do not use directly. Use zCompress() instead.
+)
+
+func init() {
+ zrPool = &sync.Pool{
+ New: func() any { return nil },
+ }
+ zwPool = &sync.Pool{
+ New: func() any {
+ zw, err := zlib.NewWriterLevel(new(bytes.Buffer), 2)
+ if err != nil {
+ panic(err) // compress/zlib return non-nil error only if level is invalid
+ }
+ return zw
+ },
+ }
+}
+
+func zDecompress(src []byte, dst *bytes.Buffer) (int, error) {
+ br := bytes.NewReader(src)
+ var zr io.ReadCloser
+ var err error
+
+ if a := zrPool.Get(); a == nil {
+ if zr, err = zlib.NewReader(br); err != nil {
+ return 0, err
+ }
+ } else {
+ zr = a.(io.ReadCloser)
+ if err := zr.(zlib.Resetter).Reset(br, nil); err != nil {
+ return 0, err
+ }
+ }
+
+ n, _ := dst.ReadFrom(zr) // ignore err because zr.Close() will return it again.
+ err = zr.Close() // zr.Close() may return chuecksum error.
+ zrPool.Put(zr)
+ return int(n), err
+}
+
+func zCompress(src []byte, dst io.Writer) error {
+ zw := zwPool.Get().(*zlib.Writer)
+ zw.Reset(dst)
+ if _, err := zw.Write(src); err != nil {
+ return err
+ }
+ err := zw.Close()
+ zwPool.Put(zw)
+ return err
+}
+
+type compIO struct {
+ mc *mysqlConn
+ buff bytes.Buffer
+}
+
+func newCompIO(mc *mysqlConn) *compIO {
+ return &compIO{
+ mc: mc,
+ }
+}
+
+func (c *compIO) reset() {
+ c.buff.Reset()
+}
+
+func (c *compIO) readNext(need int) ([]byte, error) {
+ for c.buff.Len() < need {
+ if err := c.readCompressedPacket(); err != nil {
+ return nil, err
+ }
+ }
+ data := c.buff.Next(need)
+ return data[:need:need], nil // prevent caller writes into c.buff
+}
+
+func (c *compIO) readCompressedPacket() error {
+ header, err := c.mc.readNext(7)
+ if err != nil {
+ return err
+ }
+ _ = header[6] // bounds check hint to compiler; guaranteed by readNext
+
+ // compressed header structure
+ comprLength := getUint24(header[0:3])
+ compressionSequence := header[3]
+ uncompressedLength := getUint24(header[4:7])
+ if debug {
+ fmt.Printf("uncompress cmplen=%v uncomplen=%v pkt_cmp_seq=%v expected_cmp_seq=%v\n",
+ comprLength, uncompressedLength, compressionSequence, c.mc.sequence)
+ }
+ // Do not return ErrPktSync here.
+ // Server may return error packet (e.g. 1153 Got a packet bigger than 'max_allowed_packet' bytes)
+ // before receiving all packets from client. In this case, seqnr is younger than expected.
+ // NOTE: Both of mariadbclient and mysqlclient do not check seqnr. Only server checks it.
+ if debug && compressionSequence != c.mc.compressSequence {
+ fmt.Printf("WARN: unexpected cmpress seq nr: expected %v, got %v",
+ c.mc.compressSequence, compressionSequence)
+ }
+ c.mc.compressSequence = compressionSequence + 1
+
+ comprData, err := c.mc.readNext(comprLength)
+ if err != nil {
+ return err
+ }
+
+ // if payload is uncompressed, its length will be specified as zero, and its
+ // true length is contained in comprLength
+ if uncompressedLength == 0 {
+ c.buff.Write(comprData)
+ return nil
+ }
+
+ // use existing capacity in bytesBuf if possible
+ c.buff.Grow(uncompressedLength)
+ nread, err := zDecompress(comprData, &c.buff)
+ if err != nil {
+ return err
+ }
+ if nread != uncompressedLength {
+ return fmt.Errorf("invalid compressed packet: uncompressed length in header is %d, actual %d",
+ uncompressedLength, nread)
+ }
+ return nil
+}
+
+const minCompressLength = 150
+const maxPayloadLen = maxPacketSize - 4
+
+// writePackets sends one or some packets with compression.
+// Use this instead of mc.netConn.Write() when mc.compress is true.
+func (c *compIO) writePackets(packets []byte) (int, error) {
+ totalBytes := len(packets)
+ blankHeader := make([]byte, 7)
+ buf := &c.buff
+
+ for len(packets) > 0 {
+ payloadLen := min(maxPayloadLen, len(packets))
+ payload := packets[:payloadLen]
+ uncompressedLen := payloadLen
+
+ buf.Reset()
+ buf.Write(blankHeader) // Buffer.Write() never returns error
+
+ // If payload is less than minCompressLength, don't compress.
+ if uncompressedLen < minCompressLength {
+ buf.Write(payload)
+ uncompressedLen = 0
+ } else {
+ err := zCompress(payload, buf)
+ if debug && err != nil {
+ fmt.Printf("zCompress error: %v", err)
+ }
+ // do not compress if compressed data is larger than uncompressed data
+ // I intentionally miss 7 byte header in the buf; zCompress must compress more than 7 bytes.
+ if err != nil || buf.Len() >= uncompressedLen {
+ buf.Reset()
+ buf.Write(blankHeader)
+ buf.Write(payload)
+ uncompressedLen = 0
+ }
+ }
+
+ if n, err := c.writeCompressedPacket(buf.Bytes(), uncompressedLen); err != nil {
+ // To allow returning ErrBadConn when sending really 0 bytes, we sum
+ // up compressed bytes that is returned by underlying Write().
+ return totalBytes - len(packets) + n, err
+ }
+ packets = packets[payloadLen:]
+ }
+
+ return totalBytes, nil
+}
+
+// writeCompressedPacket writes a compressed packet with header.
+// data should start with 7 size space for header followed by payload.
+func (c *compIO) writeCompressedPacket(data []byte, uncompressedLen int) (int, error) {
+ mc := c.mc
+ comprLength := len(data) - 7
+ if debug {
+ fmt.Printf(
+ "writeCompressedPacket: comprLength=%v, uncompressedLen=%v, seq=%v\n",
+ comprLength, uncompressedLen, mc.compressSequence)
+ }
+
+ // compression header
+ putUint24(data[0:3], comprLength)
+ data[3] = mc.compressSequence
+ putUint24(data[4:7], uncompressedLen)
+
+ mc.compressSequence++
+ return mc.writeWithTimeout(data)
+}
diff --git a/vendor/github.com/go-sql-driver/mysql/connection.go b/vendor/github.com/go-sql-driver/mysql/connection.go
index eff978d9..3e455a3f 100644
--- a/vendor/github.com/go-sql-driver/mysql/connection.go
+++ b/vendor/github.com/go-sql-driver/mysql/connection.go
@@ -13,10 +13,13 @@ import (
"database/sql"
"database/sql/driver"
"encoding/json"
+ "fmt"
"io"
"net"
+ "runtime"
"strconv"
"strings"
+ "sync/atomic"
"time"
)
@@ -25,15 +28,17 @@ type mysqlConn struct {
netConn net.Conn
rawConn net.Conn // underlying connection when netConn is TLS connection.
result mysqlResult // managed by clearResult() and handleOkPacket().
+ compIO *compIO
cfg *Config
connector *connector
maxAllowedPacket int
maxWriteSize int
- writeTimeout time.Duration
flags clientFlag
status statusFlag
sequence uint8
+ compressSequence uint8
parseTime bool
+ compress bool
// for context support (Go 1.8+)
watching bool
@@ -41,71 +46,92 @@ type mysqlConn struct {
closech chan struct{}
finished chan<- struct{}
canceled atomicError // set non-nil if conn is canceled
- closed atomicBool // set when conn is closed, before closech is closed
+ closed atomic.Bool // set when conn is closed, before closech is closed
}
// Helper function to call per-connection logger.
func (mc *mysqlConn) log(v ...any) {
+ _, filename, lineno, ok := runtime.Caller(1)
+ if ok {
+ pos := strings.LastIndexByte(filename, '/')
+ if pos != -1 {
+ filename = filename[pos+1:]
+ }
+ prefix := fmt.Sprintf("%s:%d ", filename, lineno)
+ v = append([]any{prefix}, v...)
+ }
+
mc.cfg.Logger.Print(v...)
}
+func (mc *mysqlConn) readWithTimeout(b []byte) (int, error) {
+ to := mc.cfg.ReadTimeout
+ if to > 0 {
+ if err := mc.netConn.SetReadDeadline(time.Now().Add(to)); err != nil {
+ return 0, err
+ }
+ }
+ return mc.netConn.Read(b)
+}
+
+func (mc *mysqlConn) writeWithTimeout(b []byte) (int, error) {
+ to := mc.cfg.WriteTimeout
+ if to > 0 {
+ if err := mc.netConn.SetWriteDeadline(time.Now().Add(to)); err != nil {
+ return 0, err
+ }
+ }
+ return mc.netConn.Write(b)
+}
+
+func (mc *mysqlConn) resetSequence() {
+ mc.sequence = 0
+ mc.compressSequence = 0
+}
+
+// syncSequence must be called when finished writing some packet and before start reading.
+func (mc *mysqlConn) syncSequence() {
+ // Syncs compressionSequence to sequence.
+ // This is not documented but done in `net_flush()` in MySQL and MariaDB.
+ // https://github.com/mariadb-corporation/mariadb-connector-c/blob/8228164f850b12353da24df1b93a1e53cc5e85e9/libmariadb/ma_net.c#L170-L171
+ // https://github.com/mysql/mysql-server/blob/824e2b4064053f7daf17d7f3f84b7a3ed92e5fb4/sql-common/net_serv.cc#L293
+ if mc.compress {
+ mc.sequence = mc.compressSequence
+ mc.compIO.reset()
+ }
+}
+
// Handles parameters set in DSN after the connection is established
func (mc *mysqlConn) handleParams() (err error) {
var cmdSet strings.Builder
for param, val := range mc.cfg.Params {
- switch param {
- // Charset: character_set_connection, character_set_client, character_set_results
- case "charset":
- charsets := strings.Split(val, ",")
- for _, cs := range charsets {
- // ignore errors here - a charset may not exist
- if mc.cfg.Collation != "" {
- err = mc.exec("SET NAMES " + cs + " COLLATE " + mc.cfg.Collation)
- } else {
- err = mc.exec("SET NAMES " + cs)
- }
- if err == nil {
- break
- }
- }
- if err != nil {
- return
- }
-
- // Other system vars accumulated in a single SET command
- default:
- if cmdSet.Len() == 0 {
- // Heuristic: 29 chars for each other key=value to reduce reallocations
- cmdSet.Grow(4 + len(param) + 3 + len(val) + 30*(len(mc.cfg.Params)-1))
- cmdSet.WriteString("SET ")
- } else {
- cmdSet.WriteString(", ")
- }
- cmdSet.WriteString(param)
- cmdSet.WriteString(" = ")
- cmdSet.WriteString(val)
+ if cmdSet.Len() == 0 {
+ // Heuristic: 29 chars for each other key=value to reduce reallocations
+ cmdSet.Grow(4 + len(param) + 3 + len(val) + 30*(len(mc.cfg.Params)-1))
+ cmdSet.WriteString("SET ")
+ } else {
+ cmdSet.WriteString(", ")
}
+ cmdSet.WriteString(param)
+ cmdSet.WriteString(" = ")
+ cmdSet.WriteString(val)
}
if cmdSet.Len() > 0 {
err = mc.exec(cmdSet.String())
- if err != nil {
- return
- }
}
return
}
+// markBadConn replaces errBadConnNoWrite with driver.ErrBadConn.
+// This function is used to return driver.ErrBadConn only when safe to retry.
func (mc *mysqlConn) markBadConn(err error) error {
- if mc == nil {
- return err
+ if err == errBadConnNoWrite {
+ return driver.ErrBadConn
}
- if err != errBadConnNoWrite {
- return err
- }
- return driver.ErrBadConn
+ return err
}
func (mc *mysqlConn) Begin() (driver.Tx, error) {
@@ -114,7 +140,6 @@ func (mc *mysqlConn) Begin() (driver.Tx, error) {
func (mc *mysqlConn) begin(readOnly bool) (driver.Tx, error) {
if mc.closed.Load() {
- mc.log(ErrInvalidConn)
return nil, driver.ErrBadConn
}
var q string
@@ -135,10 +160,14 @@ func (mc *mysqlConn) Close() (err error) {
if !mc.closed.Load() {
err = mc.writeCommandPacket(comQuit)
}
+ mc.close()
+ return
+}
+// close closes the network connection and clear results without sending COM_QUIT.
+func (mc *mysqlConn) close() {
mc.cleanup()
mc.clearResult()
- return
}
// Closes the network connection and unsets internal variables. Do not call this
@@ -157,7 +186,7 @@ func (mc *mysqlConn) cleanup() {
return
}
if err := conn.Close(); err != nil {
- mc.log(err)
+ mc.log("closing connection:", err)
}
// This function can be called from multiple goroutines.
// So we can not mc.clearResult() here.
@@ -176,7 +205,6 @@ func (mc *mysqlConn) error() error {
func (mc *mysqlConn) Prepare(query string) (driver.Stmt, error) {
if mc.closed.Load() {
- mc.log(ErrInvalidConn)
return nil, driver.ErrBadConn
}
// Send command
@@ -217,8 +245,10 @@ func (mc *mysqlConn) interpolateParams(query string, args []driver.Value) (strin
buf, err := mc.buf.takeCompleteBuffer()
if err != nil {
// can not take the buffer. Something must be wrong with the connection
- mc.log(err)
- return "", ErrInvalidConn
+ mc.cleanup()
+ // interpolateParams would be called before sending any query.
+ // So its safe to retry.
+ return "", driver.ErrBadConn
}
buf = buf[:0]
argPos := 0
@@ -309,7 +339,6 @@ func (mc *mysqlConn) interpolateParams(query string, args []driver.Value) (strin
func (mc *mysqlConn) Exec(query string, args []driver.Value) (driver.Result, error) {
if mc.closed.Load() {
- mc.log(ErrInvalidConn)
return nil, driver.ErrBadConn
}
if len(args) != 0 {
@@ -369,7 +398,6 @@ func (mc *mysqlConn) query(query string, args []driver.Value) (*textRows, error)
handleOk := mc.clearResult()
if mc.closed.Load() {
- mc.log(ErrInvalidConn)
return nil, driver.ErrBadConn
}
if len(args) != 0 {
@@ -385,31 +413,34 @@ func (mc *mysqlConn) query(query string, args []driver.Value) (*textRows, error)
}
// Send command
err := mc.writeCommandPacketStr(comQuery, query)
- if err == nil {
- // Read Result
- var resLen int
- resLen, err = handleOk.readResultSetHeaderPacket()
- if err == nil {
- rows := new(textRows)
- rows.mc = mc
+ if err != nil {
+ return nil, mc.markBadConn(err)
+ }
- if resLen == 0 {
- rows.rs.done = true
+ // Read Result
+ var resLen int
+ resLen, err = handleOk.readResultSetHeaderPacket()
+ if err != nil {
+ return nil, err
+ }
- switch err := rows.NextResultSet(); err {
- case nil, io.EOF:
- return rows, nil
- default:
- return nil, err
- }
- }
+ rows := new(textRows)
+ rows.mc = mc
- // Columns
- rows.rs.columns, err = mc.readColumns(resLen)
- return rows, err
+ if resLen == 0 {
+ rows.rs.done = true
+
+ switch err := rows.NextResultSet(); err {
+ case nil, io.EOF:
+ return rows, nil
+ default:
+ return nil, err
}
}
- return nil, mc.markBadConn(err)
+
+ // Columns
+ rows.rs.columns, err = mc.readColumns(resLen)
+ return rows, err
}
// Gets the value of the given MySQL System Variable
@@ -443,7 +474,7 @@ func (mc *mysqlConn) getSystemVar(name string) ([]byte, error) {
return nil, err
}
-// finish is called when the query has canceled.
+// cancel is called when the query has canceled.
func (mc *mysqlConn) cancel(err error) {
mc.canceled.Set(err)
mc.cleanup()
@@ -464,7 +495,6 @@ func (mc *mysqlConn) finish() {
// Ping implements driver.Pinger interface
func (mc *mysqlConn) Ping(ctx context.Context) (err error) {
if mc.closed.Load() {
- mc.log(ErrInvalidConn)
return driver.ErrBadConn
}
@@ -650,7 +680,7 @@ func (mc *mysqlConn) CheckNamedValue(nv *driver.NamedValue) (err error) {
// ResetSession implements driver.SessionResetter.
// (From Go 1.10)
func (mc *mysqlConn) ResetSession(ctx context.Context) error {
- if mc.closed.Load() {
+ if mc.closed.Load() || mc.buf.busy() {
return driver.ErrBadConn
}
@@ -684,5 +714,8 @@ func (mc *mysqlConn) ResetSession(ctx context.Context) error {
// IsValid implements driver.Validator interface
// (From Go 1.15)
func (mc *mysqlConn) IsValid() bool {
- return !mc.closed.Load()
+ return !mc.closed.Load() && !mc.buf.busy()
}
+
+var _ driver.SessionResetter = &mysqlConn{}
+var _ driver.Validator = &mysqlConn{}
diff --git a/vendor/github.com/go-sql-driver/mysql/connector.go b/vendor/github.com/go-sql-driver/mysql/connector.go
index b6707759..bc1d46af 100644
--- a/vendor/github.com/go-sql-driver/mysql/connector.go
+++ b/vendor/github.com/go-sql-driver/mysql/connector.go
@@ -11,6 +11,7 @@ package mysql
import (
"context"
"database/sql/driver"
+ "fmt"
"net"
"os"
"strconv"
@@ -87,20 +88,25 @@ func (c *connector) Connect(ctx context.Context) (driver.Conn, error) {
mc.parseTime = mc.cfg.ParseTime
// Connect to Server
- dialsLock.RLock()
- dial, ok := dials[mc.cfg.Net]
- dialsLock.RUnlock()
- if ok {
- dctx := ctx
- if mc.cfg.Timeout > 0 {
- var cancel context.CancelFunc
- dctx, cancel = context.WithTimeout(ctx, c.cfg.Timeout)
- defer cancel()
- }
- mc.netConn, err = dial(dctx, mc.cfg.Addr)
+ dctx := ctx
+ if mc.cfg.Timeout > 0 {
+ var cancel context.CancelFunc
+ dctx, cancel = context.WithTimeout(ctx, c.cfg.Timeout)
+ defer cancel()
+ }
+
+ if c.cfg.DialFunc != nil {
+ mc.netConn, err = c.cfg.DialFunc(dctx, mc.cfg.Net, mc.cfg.Addr)
} else {
- nd := net.Dialer{Timeout: mc.cfg.Timeout}
- mc.netConn, err = nd.DialContext(ctx, mc.cfg.Net, mc.cfg.Addr)
+ dialsLock.RLock()
+ dial, ok := dials[mc.cfg.Net]
+ dialsLock.RUnlock()
+ if ok {
+ mc.netConn, err = dial(dctx, mc.cfg.Addr)
+ } else {
+ nd := net.Dialer{}
+ mc.netConn, err = nd.DialContext(dctx, mc.cfg.Net, mc.cfg.Addr)
+ }
}
if err != nil {
return nil, err
@@ -122,11 +128,7 @@ func (c *connector) Connect(ctx context.Context) (driver.Conn, error) {
}
defer mc.finish()
- mc.buf = newBuffer(mc.netConn)
-
- // Set I/O timeouts
- mc.buf.timeout = mc.cfg.ReadTimeout
- mc.writeTimeout = mc.cfg.WriteTimeout
+ mc.buf = newBuffer()
// Reading Handshake Initialization Packet
authData, plugin, err := mc.readHandshakePacket()
@@ -165,6 +167,10 @@ func (c *connector) Connect(ctx context.Context) (driver.Conn, error) {
return nil, err
}
+ if mc.cfg.compress && mc.flags&clientCompress == clientCompress {
+ mc.compress = true
+ mc.compIO = newCompIO(mc)
+ }
if mc.cfg.MaxAllowedPacket > 0 {
mc.maxAllowedPacket = mc.cfg.MaxAllowedPacket
} else {
@@ -174,12 +180,36 @@ func (c *connector) Connect(ctx context.Context) (driver.Conn, error) {
mc.Close()
return nil, err
}
- mc.maxAllowedPacket = stringToInt(maxap) - 1
+ n, err := strconv.Atoi(string(maxap))
+ if err != nil {
+ mc.Close()
+ return nil, fmt.Errorf("invalid max_allowed_packet value (%q): %w", maxap, err)
+ }
+ mc.maxAllowedPacket = n - 1
}
if mc.maxAllowedPacket < maxPacketSize {
mc.maxWriteSize = mc.maxAllowedPacket
}
+ // Charset: character_set_connection, character_set_client, character_set_results
+ if len(mc.cfg.charsets) > 0 {
+ for _, cs := range mc.cfg.charsets {
+ // ignore errors here - a charset may not exist
+ if mc.cfg.Collation != "" {
+ err = mc.exec("SET NAMES " + cs + " COLLATE " + mc.cfg.Collation)
+ } else {
+ err = mc.exec("SET NAMES " + cs)
+ }
+ if err == nil {
+ break
+ }
+ }
+ if err != nil {
+ mc.Close()
+ return nil, err
+ }
+ }
+
// Handle DSN Params
err = mc.handleParams()
if err != nil {
diff --git a/vendor/github.com/go-sql-driver/mysql/const.go b/vendor/github.com/go-sql-driver/mysql/const.go
index 22526e03..4aadcd64 100644
--- a/vendor/github.com/go-sql-driver/mysql/const.go
+++ b/vendor/github.com/go-sql-driver/mysql/const.go
@@ -11,6 +11,8 @@ package mysql
import "runtime"
const (
+ debug = false // for debugging. Set true only in development.
+
defaultAuthPlugin = "mysql_native_password"
defaultMaxAllowedPacket = 64 << 20 // 64 MiB. See https://github.com/go-sql-driver/mysql/issues/1355
minProtocolVersion = 10
@@ -125,7 +127,10 @@ const (
fieldTypeBit
)
const (
- fieldTypeJSON fieldType = iota + 0xf5
+ fieldTypeVector fieldType = iota + 0xf2
+ fieldTypeInvalid
+ fieldTypeBool
+ fieldTypeJSON
fieldTypeNewDecimal
fieldTypeEnum
fieldTypeSet
diff --git a/vendor/github.com/go-sql-driver/mysql/dsn.go b/vendor/github.com/go-sql-driver/mysql/dsn.go
index 65f5a024..ecf62567 100644
--- a/vendor/github.com/go-sql-driver/mysql/dsn.go
+++ b/vendor/github.com/go-sql-driver/mysql/dsn.go
@@ -44,7 +44,7 @@ type Config struct {
DBName string // Database name
Params map[string]string // Connection parameters
ConnectionAttributes string // Connection Attributes, comma-delimited string of user-defined "key:value" pairs
- Collation string // Connection collation
+ Collation string // Connection collation. When set, this will be set in SET NAMES COLLATE query
Loc *time.Location // Location for time.Time values
MaxAllowedPacket int // Max packet size allowed
ServerPubKey string // Server public key name
@@ -54,6 +54,8 @@ type Config struct {
ReadTimeout time.Duration // I/O read timeout
WriteTimeout time.Duration // I/O write timeout
Logger Logger // Logger
+ // DialFunc specifies the dial function for creating connections
+ DialFunc func(ctx context.Context, network, addr string) (net.Conn, error)
// boolean fields
@@ -70,11 +72,15 @@ type Config struct {
ParseTime bool // Parse time values to time.Time
RejectReadOnly bool // Reject read-only connections
- // unexported fields. new options should be come here
+ // unexported fields. new options should be come here.
+ // boolean first. alphabetical order.
+
+ compress bool // Enable zlib compression
beforeConnect func(context.Context, *Config) error // Invoked before a connection is established
pubKey *rsa.PublicKey // Server public key
timeTruncate time.Duration // Truncate time.Time values to the specified duration
+ charsets []string // Connection charset. When set, this will be set in SET NAMES query
}
// Functional Options Pattern
@@ -90,7 +96,6 @@ func NewConfig() *Config {
AllowNativePasswords: true,
CheckConnLiveness: true,
}
-
return cfg
}
@@ -122,6 +127,29 @@ func BeforeConnect(fn func(context.Context, *Config) error) Option {
}
}
+// EnableCompress sets the compression mode.
+func EnableCompression(yes bool) Option {
+ return func(cfg *Config) error {
+ cfg.compress = yes
+ return nil
+ }
+}
+
+// Charset sets the connection charset and collation.
+//
+// charset is the connection charset.
+// collation is the connection collation. It can be null or empty string.
+//
+// When collation is not specified, `SET NAMES ` command is sent when the connection is established.
+// When collation is specified, `SET NAMES COLLATE