feat: Keep Website List Order Stable After Editing (#13424)

This commit is contained in:
CityFun
2026-07-31 11:05:23 +08:00
committed by GitHub
parent e11dc5fadd
commit 7bd11fe73e
30 changed files with 651 additions and 172 deletions

View File

@@ -165,7 +165,12 @@ func (w WebsiteService) PageWebsite(req request.WebsiteSearch) (int64, []respons
websiteDTOs []response.WebsiteRes
opts []repo.DBOption
)
opts = append(opts, repo.WithOrderRuleBy(req.OrderBy, req.Order), repo.WithOrderRuleBy("updated_at", "descending"))
opts = append(
opts,
repo.WithOrderRuleBy(req.OrderBy, req.Order),
repo.WithOrderRuleBy("created_at", "descending"),
repo.WithOrderRuleBy("id", "descending"),
)
if req.Name != "" {
domains, _ := websiteDomainRepo.GetBy(websiteDomainRepo.WithDomainLike(req.Name))
var websiteIds []uint

View File

@@ -12,7 +12,7 @@ require (
github.com/creack/pty v1.1.24
github.com/docker/cli v29.6.2+incompatible
github.com/docker/docker v28.5.2+incompatible
github.com/docker/go-connections v0.7.0
github.com/docker/go-connections v0.8.1
github.com/fsnotify/fsnotify v1.10.1
github.com/gin-gonic/gin v1.12.0
github.com/glebarez/sqlite v1.11.0
@@ -39,7 +39,7 @@ require (
github.com/patrickmn/go-cache v2.1.0+incompatible
github.com/pkg/errors v0.9.1
github.com/pkg/sftp v1.13.11
github.com/qiniu/go-sdk/v7 v7.26.17
github.com/qiniu/go-sdk/v7 v7.27.0
github.com/robfig/cron/v3 v3.0.1
github.com/shirou/gopsutil/v4 v4.26.6
github.com/sirupsen/logrus v1.9.4
@@ -48,7 +48,7 @@ require (
github.com/spf13/cobra v1.10.2
github.com/spf13/viper v1.21.0
github.com/subosito/gotenv v1.6.0
github.com/tencentyun/cos-go-sdk-v5 v0.7.74
github.com/tencentyun/cos-go-sdk-v5 v0.7.75
github.com/tomasen/fcgi_client v0.0.0-20180423082037-2bb3d819fd19
github.com/upyun/go-sdk v2.1.0+incompatible
go.mongodb.org/mongo-driver/v2 v2.8.0

View File

@@ -234,8 +234,8 @@ github.com/docker/docker v28.5.2+incompatible h1:DBX0Y0zAjZbSrm1uzOkdr1onVghKaft
github.com/docker/docker v28.5.2+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
github.com/docker/docker-credential-helpers v0.9.5 h1:EFNN8DHvaiK8zVqFA2DT6BjXE0GzfLOZ38ggPTKePkY=
github.com/docker/docker-credential-helpers v0.9.5/go.mod h1:v1S+hepowrQXITkEfw6o4+BMbGot02wiKpzWhGUZK6c=
github.com/docker/go-connections v0.7.0 h1:6SsRfJddP22WMrCkj19x9WKjEDTB+ahsdiGYf0mN39c=
github.com/docker/go-connections v0.7.0/go.mod h1:no1qkHdjq7kLMGUXYAduOhYPSJxxvgWBh7ogVvptn3Q=
github.com/docker/go-connections v0.8.1 h1:JibmG5hULs5qXSr/cp/w3Pw5fZuStt4MOHMUExb29/M=
github.com/docker/go-connections v0.8.1/go.mod h1:no1qkHdjq7kLMGUXYAduOhYPSJxxvgWBh7ogVvptn3Q=
github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4=
github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
github.com/dsnet/compress v0.0.2-0.20230904184137-39efe44ab707 h1:2tV76y6Q9BB+NEBasnqvs7e49aEBFI8ejC89PSnWH+4=
@@ -724,8 +724,8 @@ github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+Gx
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/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
github.com/qiniu/go-sdk/v7 v7.26.17 h1:SMjjdKak2j1eedAHreMiS6sObDOLuUrvRqPtlV4KPQo=
github.com/qiniu/go-sdk/v7 v7.26.17/go.mod h1:pTwVR1B+8SXcPLhDzBUasiKFTD9F7jRglRDR553BW3k=
github.com/qiniu/go-sdk/v7 v7.27.0 h1:n+2U0S5fhbmG/lN/agO8KcYJaQDqROUVShtnp56Mkw8=
github.com/qiniu/go-sdk/v7 v7.27.0/go.mod h1:pTwVR1B+8SXcPLhDzBUasiKFTD9F7jRglRDR553BW3k=
github.com/quic-go/qpack v0.6.0 h1:g7W+BMYynC1LbYLSqRt8PBg5Tgwxn214ZZR34VIOjz8=
github.com/quic-go/qpack v0.6.0/go.mod h1:lUpLKChi8njB4ty2bFLX2x4gzDqXwUpaO1DP9qMDZII=
github.com/quic-go/quic-go v0.59.0 h1:OLJkp1Mlm/aS7dpKgTc6cnpynnD2Xg7C1pwL6vy/SAw=
@@ -813,8 +813,8 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.3.133/go.mod
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod v1.3.131 h1:YfzhVkH30GipMEOGIx6nkaJv2E/mWN+G6Vvg+M7SqGg=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod v1.3.131/go.mod h1:Eejvn572HmciFhWFMg6a+eZvkegnEzJrPSnJYKYZX2s=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/kms v1.0.563/go.mod h1:uom4Nvi9W+Qkom0exYiJ9VWJjXwyxtPYTkKkaLMlfE0=
github.com/tencentyun/cos-go-sdk-v5 v0.7.74 h1:YCsGhIK+Q5vMcmAiQqPuMyhSQ3zN1p7U+dhlHQD++6c=
github.com/tencentyun/cos-go-sdk-v5 v0.7.74/go.mod h1:STbTNaNKq03u+gscPEGOahKzLcGSYOj6Dzc5zNay7Pg=
github.com/tencentyun/cos-go-sdk-v5 v0.7.75 h1:eRCGP5chujSYGFnsCPxlhQcN9wtlSO/4eXrxKtLVAIw=
github.com/tencentyun/cos-go-sdk-v5 v0.7.75/go.mod h1:STbTNaNKq03u+gscPEGOahKzLcGSYOj6Dzc5zNay7Pg=
github.com/tencentyun/qcloud-cos-sts-sdk v0.0.0-20250515025012-e0eec8a5d123/go.mod h1:b18KQa4IxHbxeseW1GcZox53d7J0z39VNONTxvvlkXw=
github.com/therootcompany/xz v1.0.1 h1:CmOtsn1CbtmyYiusbfmhmkpAAETj0wBIH6kCYaX+xzw=
github.com/therootcompany/xz v1.0.1/go.mod h1:3K3UH1yCKgBneZYhuQUvJ9HPD19UEXEI0BWbMn8qNMY=

View File

@@ -1708,6 +1708,9 @@ var AddWebsiteTemplateTable = &gormigrate.Migration{
&model.WebsiteTemplate{},
&model.WebsiteTemplateOutput{},
)
},
}
var AddComposePinned = &gormigrate.Migration{
ID: "20260729-add-compose-pinned",
Migrate: func(tx *gorm.DB) error {

View File

@@ -10,7 +10,7 @@ require (
github.com/gin-gonic/gin v1.12.0
github.com/glebarez/sqlite v1.11.0
github.com/go-gormigrate/gormigrate/v2 v2.1.6
github.com/go-ldap/ldap/v3 v3.4.13
github.com/go-ldap/ldap/v3 v3.4.14
github.com/go-playground/validator/v10 v10.30.3
github.com/go-resty/resty/v2 v2.17.2
github.com/go-webauthn/webauthn v0.17.4
@@ -44,7 +44,7 @@ require (
)
require (
github.com/Azure/go-ntlmssp v0.1.0 // indirect
github.com/Azure/go-ntlmssp v0.1.1 // indirect
github.com/KyleBanks/depth v1.2.1 // indirect
github.com/boombuler/barcode v1.1.0 // indirect
github.com/bytedance/gopkg v0.1.4 // indirect
@@ -59,7 +59,7 @@ require (
github.com/gabriel-vasile/mimetype v1.4.13 // indirect
github.com/gin-contrib/sse v1.1.1 // indirect
github.com/glebarez/go-sqlite v1.22.0 // indirect
github.com/go-asn1-ber/asn1-ber v1.5.8-0.20250403174932-29230038a667 // indirect
github.com/go-asn1-ber/asn1-ber v1.5.8 // indirect
github.com/go-ole/go-ole v1.2.6 // indirect
github.com/go-openapi/jsonpointer v0.23.0 // indirect
github.com/go-openapi/jsonreference v0.21.5 // indirect

View File

@@ -1,11 +1,13 @@
github.com/1panel-dev/base64Captcha v1.3.8 h1:GbQ2IuGMp4ai4erpwf4BMjm5eLC8Efb+dATVwgpPIII=
github.com/1panel-dev/base64Captcha v1.3.8/go.mod h1:gVpwyGm9+g4rg3pXdYnsFAouP73qMOSBfnT3bxCFzco=
github.com/Azure/go-ntlmssp v0.1.0 h1:DjFo6YtWzNqNvQdrwEyr/e4nhU3vRiwenz5QX7sFz+A=
github.com/Azure/go-ntlmssp v0.1.0/go.mod h1:NYqdhxd/8aAct/s4qSYZEerdPuH1liG2/X9DiVTbhpk=
github.com/Azure/go-ntlmssp v0.1.1 h1:l+FM/EEMb0U9QZE7mKNEDw5Mu3mFiaa2GKOoTSsNDPw=
github.com/Azure/go-ntlmssp v0.1.1/go.mod h1:NYqdhxd/8aAct/s4qSYZEerdPuH1liG2/X9DiVTbhpk=
github.com/BurntSushi/toml v1.6.0 h1:dRaEfpa2VI55EwlIW72hMRHdWouJeRF7TPYhI+AUQjk=
github.com/BurntSushi/toml v1.6.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc=
github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE=
github.com/alexbrainman/sspi v0.0.0-20250919150558-7d374ff0d59e h1:4dAU9FXIyQktpoUAgOJK3OTFc/xug0PCXYCqU0FgDKI=
github.com/alexbrainman/sspi v0.0.0-20250919150558-7d374ff0d59e/go.mod h1:cEWa1LVoE5KvSD9ONXsZrj0z6KqySlCCNKHlLzbqAt4=
github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=
github.com/boombuler/barcode v1.1.0 h1:ChaYjBR63fr4LFyGn8E8nt7dBSt3MiU3zMOZqFvVkHo=
github.com/boombuler/barcode v1.1.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=
@@ -49,12 +51,12 @@ github.com/glebarez/go-sqlite v1.22.0 h1:uAcMJhaA6r3LHMTFgP0SifzgXg46yJkgxqyuyec
github.com/glebarez/go-sqlite v1.22.0/go.mod h1:PlBIdHe0+aUEFn+r2/uthrWq4FxbzugL0L8Li6yQJbc=
github.com/glebarez/sqlite v1.11.0 h1:wSG0irqzP6VurnMEpFGer5Li19RpIRi2qvQz++w0GMw=
github.com/glebarez/sqlite v1.11.0/go.mod h1:h8/o8j5wiAsqSPoWELDUdJXhjAhsVliSn7bWZjOhrgQ=
github.com/go-asn1-ber/asn1-ber v1.5.8-0.20250403174932-29230038a667 h1:BP4M0CvQ4S3TGls2FvczZtj5Re/2ZzkV9VwqPHH/3Bo=
github.com/go-asn1-ber/asn1-ber v1.5.8-0.20250403174932-29230038a667/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0=
github.com/go-asn1-ber/asn1-ber v1.5.8 h1:H9AZkK22UOmfX8J84ubyaZxKJZ3FMHVwn8swoMML7iQ=
github.com/go-asn1-ber/asn1-ber v1.5.8/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0=
github.com/go-gormigrate/gormigrate/v2 v2.1.6 h1:VtX+l1Stj2v5RGubVQk0LS/8EPGXR+ldcOyCmlmKoyg=
github.com/go-gormigrate/gormigrate/v2 v2.1.6/go.mod h1:PZpedQc4tWaxn6kvXicwhinh3L0seLpMc5ReKRX5id4=
github.com/go-ldap/ldap/v3 v3.4.13 h1:+x1nG9h+MZN7h/lUi5Q3UZ0fJ1GyDQYbPvbuH38baDQ=
github.com/go-ldap/ldap/v3 v3.4.13/go.mod h1:LxsGZV6vbaK0sIvYfsv47rfh4ca0JXokCoKjZxsszv0=
github.com/go-ldap/ldap/v3 v3.4.14 h1:D6PYdEgsaVzsXyr6w/yDC06Ria4uUhWm+Rb+er8lfAs=
github.com/go-ldap/ldap/v3 v3.4.14/go.mod h1:S4eJUMUNjDkE0ZJtIZdybwyb03sGGLW6gxXT1Hs8VKA=
github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY=
github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
github.com/go-openapi/jsonpointer v0.23.0 h1:c25HFTJ6uWGmoe5BQI6p72p4o7KnlWYsy1MeFlAumsw=
@@ -122,6 +124,8 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg=
github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=
github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k=
github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM=
github.com/hhrutter/lzw v1.0.0 h1:laL89Llp86W3rRs83LvKbwYRx6INE8gDn0XNb1oXtm0=
@@ -132,6 +136,18 @@ github.com/hhrutter/tiff v1.0.2 h1:7H3FQQpKu/i5WaSChoD1nnJbGx4MxU5TlNqqpxw55z8=
github.com/hhrutter/tiff v1.0.2/go.mod h1:pcOeuK5loFUE7Y/WnzGw20YxUdnqjY1P0Jlcieb/cCw=
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
github.com/jcmturner/aescts/v2 v2.0.0 h1:9YKLH6ey7H4eDBXW8khjYslgyqG2xZikXP0EQFKrle8=
github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs=
github.com/jcmturner/dnsutils/v2 v2.0.0 h1:lltnkeZGL0wILNvrNiVCR6Ro5PGU/SeBvVO/8c/iPbo=
github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM=
github.com/jcmturner/gofork v1.7.6 h1:QH0l3hzAU1tfT3rZCnW5zXl+orbkNMMRGJfdJjHVETg=
github.com/jcmturner/gofork v1.7.6/go.mod h1:1622LH6i/EZqLloHfE7IeZ0uEJwMSUyQ/nDd82IeqRo=
github.com/jcmturner/goidentity/v6 v6.0.1 h1:VKnZd2oEIMorCTsFBnJWbExfNN7yZr3EhJAxwOkZg6o=
github.com/jcmturner/goidentity/v6 v6.0.1/go.mod h1:X1YW3bgtvwAXju7V3LCIMpY0Gbxyjn/mY9zx4tFonSg=
github.com/jcmturner/gokrb5/v8 v8.4.4 h1:x1Sv4HaTpepFkXbt2IkL29DXRf8sOfZXo8eRKh687T8=
github.com/jcmturner/gokrb5/v8 v8.4.4/go.mod h1:1btQEpgT6k+unzCwX1KdWMEwPPkkgBtP+F6aCACiMrs=
github.com/jcmturner/rpc/v2 v2.0.3 h1:7FXXj8Ti1IaVFpSAziCZWNzbNuZmnvw/i6CqLNdWfZY=
github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc=
github.com/jinzhu/copier v0.4.0 h1:w3ciUoD19shMCRargcpm0cm91ytaBhDvuRpz1ODO/U8=
github.com/jinzhu/copier v0.4.0/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S8hyyg=
github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=

View File

@@ -32,7 +32,7 @@
"jsencrypt": "^3.3.2",
"lodash-es": "^4.18.1",
"md-editor-v3": "^6.5.4",
"monaco-editor": "^0.53.0",
"monaco-editor": "^0.56.0",
"nprogress": "^0.2.0",
"pinia": "^3.0.4",
"pinia-plugin-persistedstate": "^4.7.1",
@@ -59,15 +59,15 @@
"@vue/compiler-sfc": "^3.5.35",
"autoprefixer": "^10.5.4",
"esbuild": "^0.28.1",
"eslint": "^10.6.0",
"eslint": "^10.7.0",
"eslint-config-prettier": "^10.1.8",
"eslint-plugin-prettier": "^5.5.5",
"eslint-plugin-prettier": "^5.5.6",
"eslint-plugin-vue": "^10.10.0",
"lint-staged": "^17.0.7",
"postcss": "^8.5.14",
"postcss-html": "^1.8.1",
"prettier": "^3.9.6",
"rollup-plugin-visualizer": "^5.5.4",
"rollup-plugin-visualizer": "^7.0.1",
"sass": "^1.101.3",
"standard-version": "^9.5.0",
"tailwindcss": "^4.3.3",
@@ -2339,13 +2339,13 @@
}
},
"node_modules/@pkgr/core": {
"version": "0.2.9",
"resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz",
"integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==",
"version": "0.3.6",
"resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.3.6.tgz",
"integrity": "sha512-SEeaJLb3qBNF/OaXnaR1NmmBbFYk1zC0ZH/52fATcRPLFg/p791YrcyFFy44Bo9sLaGuSuLp5Q6axbb/O+v/RA==",
"dev": true,
"license": "MIT",
"engines": {
"node": "^12.20.0 || ^14.18.0 || >=16.0.0"
"node": "^14.18.0 || >=16.0.0"
},
"funding": {
"url": "https://opencollective.com/pkgr"
@@ -3043,10 +3043,11 @@
"license": "MIT"
},
"node_modules/@types/trusted-types": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-1.0.6.tgz",
"integrity": "sha512-230RC8sFeHoT6sSUlRO6a8cAnclO06eeiq1QDfiv2FGCLWFvvERWgwIQD4FWqD9A69BN7Lzee4OXwoMVnnsWDw==",
"license": "MIT"
"version": "2.0.7",
"resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz",
"integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==",
"license": "MIT",
"optional": true
},
"node_modules/@types/uuid": {
"version": "11.0.0",
@@ -4259,6 +4260,22 @@
"dev": true,
"license": "MIT"
},
"node_modules/bundle-name": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz",
"integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==",
"dev": true,
"license": "MIT",
"dependencies": {
"run-applescript": "^7.0.0"
},
"engines": {
"node": ">=18"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/call-bind-apply-helpers": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
@@ -4458,18 +4475,103 @@
}
},
"node_modules/cliui": {
"version": "8.0.1",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
"integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
"version": "9.0.1",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz",
"integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==",
"dev": true,
"license": "ISC",
"dependencies": {
"string-width": "^4.2.0",
"strip-ansi": "^6.0.1",
"wrap-ansi": "^7.0.0"
"string-width": "^7.2.0",
"strip-ansi": "^7.1.0",
"wrap-ansi": "^9.0.0"
},
"engines": {
"node": ">=20"
}
},
"node_modules/cliui/node_modules/ansi-regex": {
"version": "6.2.2",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz",
"integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/chalk/ansi-regex?sponsor=1"
}
},
"node_modules/cliui/node_modules/ansi-styles": {
"version": "6.2.3",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz",
"integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/cliui/node_modules/emoji-regex": {
"version": "10.6.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz",
"integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==",
"dev": true,
"license": "MIT"
},
"node_modules/cliui/node_modules/string-width": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz",
"integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"emoji-regex": "^10.3.0",
"get-east-asian-width": "^1.0.0",
"strip-ansi": "^7.1.0"
},
"engines": {
"node": ">=18"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/cliui/node_modules/strip-ansi": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz",
"integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==",
"dev": true,
"license": "MIT",
"dependencies": {
"ansi-regex": "^6.2.2"
},
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/chalk/strip-ansi?sponsor=1"
}
},
"node_modules/cliui/node_modules/wrap-ansi": {
"version": "9.0.2",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz",
"integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==",
"dev": true,
"license": "MIT",
"dependencies": {
"ansi-styles": "^6.2.1",
"string-width": "^7.0.0",
"strip-ansi": "^7.1.0"
},
"engines": {
"node": ">=18"
},
"funding": {
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
}
},
"node_modules/codemirror": {
@@ -5084,14 +5186,47 @@
"dev": true,
"license": "MIT"
},
"node_modules/define-lazy-prop": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz",
"integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==",
"node_modules/default-browser": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.0.tgz",
"integrity": "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==",
"dev": true,
"license": "MIT",
"dependencies": {
"bundle-name": "^4.1.0",
"default-browser-id": "^5.0.0"
},
"engines": {
"node": ">=18"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/default-browser-id": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz",
"integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
"node": ">=18"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/define-lazy-prop": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz",
"integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/defu": {
@@ -5202,13 +5337,6 @@
"@types/trusted-types": "^2.0.7"
}
},
"node_modules/dompurify/node_modules/@types/trusted-types": {
"version": "2.0.7",
"resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz",
"integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==",
"license": "MIT",
"optional": true
},
"node_modules/domutils": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz",
@@ -5548,9 +5676,9 @@
}
},
"node_modules/eslint": {
"version": "10.6.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-10.6.0.tgz",
"integrity": "sha512-6lVbcqSodALYo+4ELD0heG6lFiFxnLMuLkiMi2qV8LMp54N8tE8FT1GMH+ev4Ti00nFjNze2+Su6DsV5OQW3Dg==",
"version": "10.7.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-10.7.0.tgz",
"integrity": "sha512-GVTD7s1vdIl6UYvAfriOPeY1Df8LIZjfofLvHwde+erDHGGuHyuM6xoxRxmHiebhYuD2p1vN4wWh0XzPARSGDQ==",
"dev": true,
"license": "MIT",
"peer": true,
@@ -5625,14 +5753,14 @@
}
},
"node_modules/eslint-plugin-prettier": {
"version": "5.5.5",
"resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.5.tgz",
"integrity": "sha512-hscXkbqUZ2sPithAuLm5MXL+Wph+U7wHngPBv9OMWwlP8iaflyxpjTYZkmdgB4/vPIhemRlBEoLrH7UC1n7aUw==",
"version": "5.5.6",
"resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.6.tgz",
"integrity": "sha512-ifetmTcxWfz+4qRW3pH/ujdTq2jQIj59AxJMIN26K5avYgU8dxycUETQonWiW+wPrYXA0j3Try0l1CnwVQtDqQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"prettier-linter-helpers": "^1.0.1",
"synckit": "^0.11.12"
"synckit": "^0.11.13"
},
"engines": {
"node": "^14.18.0 || >=16.0.0"
@@ -6601,16 +6729,16 @@
}
},
"node_modules/is-docker": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
"integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz",
"integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==",
"dev": true,
"license": "MIT",
"bin": {
"is-docker": "cli.js"
},
"engines": {
"node": ">=8"
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
@@ -6655,6 +6783,38 @@
"node": ">=0.10.0"
}
},
"node_modules/is-in-ssh": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-in-ssh/-/is-in-ssh-1.0.0.tgz",
"integrity": "sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=20"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/is-inside-container": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz",
"integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==",
"dev": true,
"license": "MIT",
"dependencies": {
"is-docker": "^3.0.0"
},
"bin": {
"is-inside-container": "cli.js"
},
"engines": {
"node": ">=14.16"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/is-number": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
@@ -6712,16 +6872,19 @@
}
},
"node_modules/is-wsl": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
"integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz",
"integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==",
"dev": true,
"license": "MIT",
"dependencies": {
"is-docker": "^2.0.0"
"is-inside-container": "^1.0.0"
},
"engines": {
"node": ">=8"
"node": ">=16"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/isarray": {
@@ -7662,6 +7825,18 @@
"integrity": "sha512-5VgmdKlkBd8sgXuoDoxMpiU+BiEt3I49GItBzzw7Mxq9CxvnhE/k09HFli09zgfFDRixDQDfDxi0mgBCXtaTvA==",
"license": "MIT"
},
"node_modules/marked": {
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/marked/-/marked-14.0.0.tgz",
"integrity": "sha512-uIj4+faQ+MgHgwUW1l2PsPglZLOLOT1uErt06dAPtx2kjteLAkbsd/0FiYg/MGS+i7ZKLb7w2WClxHkzOOuryQ==",
"license": "MIT",
"bin": {
"marked": "bin/marked.js"
},
"engines": {
"node": ">= 18"
}
},
"node_modules/math-intrinsics": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
@@ -8033,12 +8208,22 @@
}
},
"node_modules/monaco-editor": {
"version": "0.53.0",
"resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.53.0.tgz",
"integrity": "sha512-0WNThgC6CMWNXXBxTbaYYcunj08iB5rnx4/G56UOPeL9UVIUGGHA1GR0EWIh9Ebabj7NpCRawQ5b0hfN1jQmYQ==",
"version": "0.56.0",
"resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.56.0.tgz",
"integrity": "sha512-sXboRm3BeBeLm938eaiyLMe0OxzfXIlZvbv4ir/jVgQy1zDhWjgmny0WoN45fuDKhCCQsYMbBJrv/A6jd8aCUg==",
"license": "MIT",
"dependencies": {
"@types/trusted-types": "^1.0.6"
"dompurify": "3.4.8",
"marked": "14.0.0"
}
},
"node_modules/monaco-editor/node_modules/dompurify": {
"version": "3.4.8",
"resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.8.tgz",
"integrity": "sha512-yb1cEmaOum7wFvOCSQxyfgVlv5D47Rc30iZWoMpbDIWTnJ6grDDQyu2KFJzB2k7u0pMuJcQ1zphH//fFnw2tjQ==",
"license": "(MPL-2.0 OR Apache-2.0)",
"optionalDependencies": {
"@types/trusted-types": "^2.0.7"
}
},
"node_modules/ms": {
@@ -8190,18 +8375,21 @@
}
},
"node_modules/open": {
"version": "8.4.2",
"resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz",
"integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==",
"version": "11.0.0",
"resolved": "https://registry.npmjs.org/open/-/open-11.0.0.tgz",
"integrity": "sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw==",
"dev": true,
"license": "MIT",
"dependencies": {
"define-lazy-prop": "^2.0.0",
"is-docker": "^2.1.1",
"is-wsl": "^2.2.0"
"default-browser": "^5.4.0",
"define-lazy-prop": "^3.0.0",
"is-in-ssh": "^1.0.0",
"is-inside-container": "^1.0.0",
"powershell-utils": "^0.1.0",
"wsl-utils": "^0.3.0"
},
"engines": {
"node": ">=12"
"node": ">=20"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
@@ -8519,6 +8707,19 @@
"dev": true,
"license": "MIT"
},
"node_modules/powershell-utils": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/powershell-utils/-/powershell-utils-0.1.0.tgz",
"integrity": "sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=20"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/prelude-ls": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
@@ -8934,25 +9135,25 @@
}
},
"node_modules/rollup-plugin-visualizer": {
"version": "5.14.0",
"resolved": "https://registry.npmjs.org/rollup-plugin-visualizer/-/rollup-plugin-visualizer-5.14.0.tgz",
"integrity": "sha512-VlDXneTDaKsHIw8yzJAFWtrzguoJ/LnQ+lMpoVfYJ3jJF4Ihe5oYLAqLklIK/35lgUY+1yEzCkHyZ1j4A5w5fA==",
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/rollup-plugin-visualizer/-/rollup-plugin-visualizer-7.0.1.tgz",
"integrity": "sha512-UJUT4+1Ho4OcWmPYU3sYXgUqI8B8Ayfe06MX7y0qCJ1K8aGoKtR/NDd/2nZqM7ADkrzny+I99Ul7GgyoiVNAgg==",
"dev": true,
"license": "MIT",
"dependencies": {
"open": "^8.4.0",
"open": "^11.0.0",
"picomatch": "^4.0.2",
"source-map": "^0.7.4",
"yargs": "^17.5.1"
"yargs": "^18.0.0"
},
"bin": {
"rollup-plugin-visualizer": "dist/bin/cli.js"
},
"engines": {
"node": ">=18"
"node": ">=22"
},
"peerDependencies": {
"rolldown": "1.x",
"rolldown": "1.x || ^1.0.0-beta || ^1.0.0-rc",
"rollup": "2.x || 3.x || 4.x"
},
"peerDependenciesMeta": {
@@ -8977,6 +9178,19 @@
"url": "https://github.com/sponsors/jonschlinkert"
}
},
"node_modules/run-applescript": {
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz",
"integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=18"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/safe-buffer": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
@@ -9561,13 +9775,13 @@
}
},
"node_modules/synckit": {
"version": "0.11.12",
"resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.12.tgz",
"integrity": "sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==",
"version": "0.11.13",
"resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.13.tgz",
"integrity": "sha512-eNRKgb3z66Yp3D2CixVujOUvXLFUTij/zVnV8KRyvFdQwpz7I5DS8UfRkTeLzb64u+dkzDSdelE24izu+zSSUg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@pkgr/core": "^0.2.9"
"@pkgr/core": "^0.3.6"
},
"engines": {
"node": "^14.18.0 || >=16.0.0"
@@ -10873,6 +11087,23 @@
"dev": true,
"license": "MIT"
},
"node_modules/wsl-utils": {
"version": "0.3.1",
"resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.3.1.tgz",
"integrity": "sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg==",
"dev": true,
"license": "MIT",
"dependencies": {
"is-wsl": "^3.1.0",
"powershell-utils": "^0.1.0"
},
"engines": {
"node": ">=20"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/xml-name-validator": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz",
@@ -10948,22 +11179,21 @@
}
},
"node_modules/yargs": {
"version": "17.7.2",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
"integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
"version": "18.1.0",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-18.1.0.tgz",
"integrity": "sha512-2rAgRKu54VsHkqI0/tYkmluGXHD4KW7yZoycuqDQ15QOTnc2VVfy0nN/1eMhnQLO00A+dwtK20xuCnc1YGeUyg==",
"dev": true,
"license": "MIT",
"dependencies": {
"cliui": "^8.0.1",
"cliui": "^9.0.1",
"escalade": "^3.1.1",
"get-caller-file": "^2.0.5",
"require-directory": "^2.1.1",
"string-width": "^4.2.3",
"string-width": "^8.2.1",
"y18n": "^5.0.5",
"yargs-parser": "^21.1.1"
"yargs-parser": "^22.0.0"
},
"engines": {
"node": ">=12"
"node": "^20.19.0 || ^22.12.0 || >=23"
}
},
"node_modules/yargs-parser": {
@@ -10976,14 +11206,60 @@
"node": ">=10"
}
},
"node_modules/yargs/node_modules/ansi-regex": {
"version": "6.2.2",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz",
"integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/chalk/ansi-regex?sponsor=1"
}
},
"node_modules/yargs/node_modules/string-width": {
"version": "8.2.2",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.2.tgz",
"integrity": "sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg==",
"dev": true,
"license": "MIT",
"dependencies": {
"get-east-asian-width": "^1.5.0",
"strip-ansi": "^7.1.2"
},
"engines": {
"node": ">=20"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/yargs/node_modules/strip-ansi": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz",
"integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==",
"dev": true,
"license": "MIT",
"dependencies": {
"ansi-regex": "^6.2.2"
},
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/chalk/strip-ansi?sponsor=1"
}
},
"node_modules/yargs/node_modules/yargs-parser": {
"version": "21.1.1",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
"integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
"version": "22.0.0",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz",
"integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==",
"dev": true,
"license": "ISC",
"engines": {
"node": ">=12"
"node": "^20.19.0 || ^22.12.0 || >=23"
}
},
"node_modules/yocto-queue": {

View File

@@ -43,7 +43,7 @@
"jsencrypt": "^3.3.2",
"lodash-es": "^4.18.1",
"md-editor-v3": "^6.5.4",
"monaco-editor": "^0.53.0",
"monaco-editor": "^0.56.0",
"nprogress": "^0.2.0",
"pinia": "^3.0.4",
"pinia-plugin-persistedstate": "^4.7.1",
@@ -70,15 +70,15 @@
"@vue/compiler-sfc": "^3.5.35",
"autoprefixer": "^10.5.4",
"esbuild": "^0.28.1",
"eslint": "^10.6.0",
"eslint": "^10.7.0",
"eslint-config-prettier": "^10.1.8",
"eslint-plugin-prettier": "^5.5.5",
"eslint-plugin-prettier": "^5.5.6",
"eslint-plugin-vue": "^10.10.0",
"lint-staged": "^17.0.7",
"postcss": "^8.5.14",
"postcss-html": "^1.8.1",
"prettier": "^3.9.6",
"rollup-plugin-visualizer": "^5.5.4",
"rollup-plugin-visualizer": "^7.0.1",
"sass": "^1.101.3",
"standard-version": "^9.5.0",
"tailwindcss": "^4.3.3",

View File

@@ -425,7 +425,11 @@ export const getTemplate = (id: number) => {
export const uploadTemplateZip = (file: globalThis.File) => {
const formData = new FormData();
formData.append('file', file);
return http.post<{ filePath: string; variables: string[] }>(`/websites/templates/upload`, formData, TimeoutEnum.T_5M);
return http.post<{ filePath: string; variables: string[] }>(
`/websites/templates/upload`,
formData,
TimeoutEnum.T_5M,
);
};
export const previewTemplate = (req: Website.PreviewReq) => {

View File

@@ -254,11 +254,13 @@ function initChart() {
...itemSelect,
right: grid.right || 10,
itemWidth: 8,
icon: 'circle',
...props.option.legend,
textStyle: {
...itemSelect?.textStyle,
...props.option.legend?.textStyle,
color: regularTextColor,
},
icon: 'circle',
},
xAxis: {
...props.option.xAxis,

View File

@@ -1011,6 +1011,17 @@ const message = {
unlimitedWithAuto: 'Unlimited, includes auto',
apiKeyCount: 'API Keys',
lastUsedAt: 'Last Used',
validityPeriod: 'Validity Period',
keepCurrentValidity: 'Keep current validity',
neverExpires: 'Never expires',
validForDays: 'Valid for {0} days',
customDays: 'Custom days',
enterValidityDays: 'Enter the validity period in days',
currentExpiresAt: 'Current expiration: {0}',
currentNeverExpires: 'Currently never expires',
expiresAt: 'Expiration Time',
expired: 'Expired',
reactivate: 'Reactivate',
settingTitle: 'AI Gateway Settings',
basicSetting: 'Basic Settings',
performanceSetting: 'Performance Settings',
@@ -1019,6 +1030,8 @@ const message = {
protocolConversion: 'Protocol Conversion',
protocolConversionDesc:
'Allow supported direct conversion between Chat Completions, Responses, and Anthropic Messages. Native protocols always take priority.',
protocolConversionRisk:
'Protocol conversion is not lossless. Protocol-specific fields, tool calls, reasoning, or multimodal content may be degraded or lost. Use it after weighing the trade-offs.',
lbPolicyRoundRobin: 'Round Robin',
lbPolicyRoundRobinDesc:
'Select available model accounts in order. Use this when backends have similar capacity.',
@@ -1072,6 +1085,7 @@ const message = {
userFallback: 'Deleted user (ID: {0})',
requestModel: 'Request Model',
upstreamModel: 'Upstream Model',
upstreamDuration: 'Upstream Time',
requestModelPlaceholder: 'e.g. qwen2.5-coder',
upstreamModelPlaceholder: 'e.g. Qwen/Qwen2.5-Coder-32B-Instruct',
addMapping: 'Add Mapping',

View File

@@ -1021,6 +1021,17 @@ const message = {
unlimited: 'Ilimitado',
unlimitedWithAuto: 'Ilimitado, incluye auto',
lastUsedAt: 'Último uso',
validityPeriod: 'Periodo de validez',
keepCurrentValidity: 'Mantener la validez actual',
neverExpires: 'Nunca caduca',
validForDays: 'Válido durante {0} días',
customDays: 'Días personalizados',
enterValidityDays: 'Introduzca el periodo de validez en días',
currentExpiresAt: 'Caducidad actual: {0}',
currentNeverExpires: 'Actualmente no caduca',
expiresAt: 'Fecha de caducidad',
expired: 'Caducado',
reactivate: 'Reactivar',
settingTitle: 'Configuración del gateway de IA',
basicSetting: 'Configuración básica',
performanceSetting: 'Configuración de rendimiento',
@@ -1029,6 +1040,8 @@ const message = {
protocolConversion: 'Conversión de protocolo',
protocolConversionDesc:
'Permite la conversión directa compatible entre Chat Completions, Responses y Anthropic Messages. Los protocolos nativos siempre tienen prioridad.',
protocolConversionRisk:
'La conversión de protocolos no es sin pérdidas. Los campos específicos, las llamadas a herramientas, el razonamiento o el contenido multimodal pueden degradarse o perderse. Úsela después de evaluar los riesgos.',
lbPolicyRoundRobin: 'Round Robin',
lbPolicyRoundRobinDesc:
'Selecciona las cuentas de modelo disponibles en orden. Úselo cuando los backends tengan capacidad similar.',
@@ -1082,6 +1095,7 @@ const message = {
userFallback: 'Usuario eliminado (ID: {0})',
requestModel: 'Modelo solicitado',
upstreamModel: 'Modelo upstream',
upstreamDuration: 'Tiempo upstream',
requestModelPlaceholder: 'p. ej. qwen2.5-coder',
upstreamModelPlaceholder: 'p. ej. Qwen/Qwen2.5-Coder-32B-Instruct',
addMapping: 'Agregar mapeo',

View File

@@ -995,6 +995,17 @@ const message = {
unlimitedWithAuto: 'نامحدود، شامل auto',
apiKeyCount: 'کلیدهای API',
lastUsedAt: 'آخرین استفاده',
validityPeriod: 'دوره اعتبار',
keepCurrentValidity: 'حفظ اعتبار فعلی',
neverExpires: 'بدون انقضا',
validForDays: 'معتبر برای {0} روز',
customDays: 'تعداد روز سفارشی',
enterValidityDays: 'مدت اعتبار را به روز وارد کنید',
currentExpiresAt: 'زمان انقضای فعلی: {0}',
currentNeverExpires: 'در حال حاضر بدون انقضا',
expiresAt: 'زمان انقضا',
expired: 'منقضی شده',
reactivate: 'فعال‌سازی مجدد',
settingTitle: 'تنظیمات دروازه AI',
basicSetting: 'تنظیمات پایه',
performanceSetting: 'تنظیمات عملکرد',
@@ -1003,6 +1014,8 @@ const message = {
protocolConversion: 'تبدیل پروتکل',
protocolConversionDesc:
'تبدیل مستقیم پشتیبانی‌شده بین Chat Completions، Responses و Anthropic Messages را فعال می‌کند. پروتکل بومی همیشه اولویت دارد.',
protocolConversionRisk:
'تبدیل پروتکل بدون اتلاف تضمین نمی‌شود. فیلدهای اختصاصی، فراخوانی ابزارها، استدلال یا محتوای چندوجهی ممکن است ساده‌سازی یا حذف شوند. پس از سنجیدن ریسک‌ها استفاده کنید.',
lbPolicyRoundRobin: 'چرخه‌ای',
lbPolicyRoundRobinDesc:
'حساب‌های مدل موجود را به ترتیب انتخاب کنید. زمانی استفاده شود که بک‌اندها ظرفیت مشابهی دارند.',
@@ -1056,6 +1069,7 @@ const message = {
userFallback: 'کاربر حذف شده (شناسه: {0})',
requestModel: 'مدل درخواست',
upstreamModel: 'مدل بالادست',
upstreamDuration: 'زمان بالادست',
requestModelPlaceholder: 'مثلاً qwen2.5-coder',
upstreamModelPlaceholder: 'مثلاً Qwen/Qwen2.5-Coder-32B-Instruct',
addMapping: 'افزودن نگاشت',

View File

@@ -1008,6 +1008,17 @@ const message = {
unlimited: '無制限',
unlimitedWithAuto: '無制限、auto を含む',
lastUsedAt: '最終使用日時',
validityPeriod: '有効期間',
keepCurrentValidity: '現在の有効期間を維持',
neverExpires: '無期限',
validForDays: '{0} 日間有効',
customDays: '日数を指定',
enterValidityDays: '有効日数を入力してください',
currentExpiresAt: '現在の有効期限:{0}',
currentNeverExpires: '現在は無期限です',
expiresAt: '有効期限',
expired: '期限切れ',
reactivate: '再有効化',
settingTitle: 'AI ゲートウェイ設定',
basicSetting: '基本設定',
performanceSetting: 'パフォーマンス設定',
@@ -1016,6 +1027,8 @@ const message = {
protocolConversion: 'プロトコル変換',
protocolConversionDesc:
'Chat Completions、Responses、Anthropic Messages 間でサポートされる直接変換を有効にします。ネイティブプロトコルが常に優先されます。',
protocolConversionRisk:
'プロトコル変換は完全に可逆ではありません。プロトコル固有のフィールド、ツール呼び出し、推論、マルチモーダルコンテンツが劣化または失われる可能性があります。リスクを考慮したうえで使用してください。',
lbPolicyRoundRobin: 'ラウンドロビン',
lbPolicyRoundRobinDesc:
'利用可能なモデルアカウントを順番に選択します。バックエンドの性能が近い場合に適しています。',
@@ -1069,6 +1082,7 @@ const message = {
userFallback: '削除済みユーザー (ID: {0})',
requestModel: 'リクエストモデル',
upstreamModel: '上流モデル',
upstreamDuration: 'アップストリーム時間',
requestModelPlaceholder: '例: qwen2.5-coder',
upstreamModelPlaceholder: '例: Qwen/Qwen2.5-Coder-32B-Instruct',
addMapping: 'マッピングを追加',

View File

@@ -992,6 +992,17 @@ const message = {
unlimited: '무제한',
unlimitedWithAuto: '무제한, auto 포함',
lastUsedAt: '최근 사용 시간',
validityPeriod: '유효 기간',
keepCurrentValidity: '현재 유효 기간 유지',
neverExpires: '만료 없음',
validForDays: '{0}일 동안 유효',
customDays: '사용자 지정 일수',
enterValidityDays: '유효 일수를 입력하세요',
currentExpiresAt: '현재 만료 시간: {0}',
currentNeverExpires: '현재 만료되지 않음',
expiresAt: '만료 시간',
expired: '만료됨',
reactivate: '다시 활성화',
settingTitle: 'AI 게이트웨이 설정',
basicSetting: '기본 설정',
performanceSetting: '성능 설정',
@@ -1000,6 +1011,8 @@ const message = {
protocolConversion: '프로토콜 변환',
protocolConversionDesc:
'Chat Completions, Responses 및 Anthropic Messages 간에 지원되는 직접 변환을 허용합니다. 네이티브 프로토콜이 항상 우선합니다.',
protocolConversionRisk:
'프로토콜 변환은 무손실을 보장하지 않습니다. 프로토콜 전용 필드, 도구 호출, 추론 또는 멀티모달 콘텐츠가 축소되거나 손실될 수 있으므로 위험을 고려한 후 사용하세요.',
lbPolicyRoundRobin: '라운드 로빈',
lbPolicyRoundRobinDesc:
'사용 가능한 모델 계정을 순서대로 선택합니다. 백엔드 성능이 비슷한 경우에 적합합니다.',
@@ -1053,6 +1066,7 @@ const message = {
userFallback: '삭제된 사용자 (ID: {0})',
requestModel: '요청 모델',
upstreamModel: '업스트림 모델',
upstreamDuration: '업스트림 시간',
requestModelPlaceholder: '예: qwen2.5-coder',
upstreamModelPlaceholder: '예: Qwen/Qwen2.5-Coder-32B-Instruct',
addMapping: '매핑 추가',

View File

@@ -1002,6 +1002,17 @@ const message = {
unlimitedWithAuto: 'ບໍ່ຈຳກັດ, ລວມ auto',
apiKeyCount: 'API Keys',
lastUsedAt: 'ໃຊ້ງານລ່າສຸດ',
validityPeriod: 'ໄລຍະເວລາໃຊ້ງານ',
keepCurrentValidity: 'ຮັກສາໄລຍະເວລາປັດຈຸບັນ',
neverExpires: 'ບໍ່ມີວັນໝົດອາຍຸ',
validForDays: 'ໃຊ້ໄດ້ {0} ມື້',
customDays: 'ກຳນົດຈຳນວນມື້',
enterValidityDays: 'ກະລຸນາປ້ອນຈຳນວນມື້',
currentExpiresAt: 'ເວລາໝົດອາຍຸປັດຈຸບັນ: {0}',
currentNeverExpires: 'ປັດຈຸບັນບໍ່ມີວັນໝົດອາຍຸ',
expiresAt: 'ເວລາໝົດອາຍຸ',
expired: 'ໝົດອາຍຸແລ້ວ',
reactivate: 'ເປີດໃຊ້ຄືນໃໝ່',
settingTitle: 'ຕັ້ງຄ່າ AI Gateway',
basicSetting: 'ຕັ້ງຄ່າພື້ນຖານ',
performanceSetting: 'ຕັ້ງຄ່າປະສິດທິພາບ',
@@ -1010,6 +1021,8 @@ const message = {
protocolConversion: 'ການປ່ຽນໂປຣໂຕຄອນ',
protocolConversionDesc:
'ອະນຸຍາດການປ່ຽນໂດຍກົງທີ່ຮອງຮັບລະຫວ່າງ Chat Completions, Responses ແລະ Anthropic Messages. ໂປຣໂຕຄອນເດີມຈະຖືກໃຫ້ສິດກ່ອນສະເໝີ.',
protocolConversionRisk:
'ການປ່ຽນໂປຣໂຕຄອນບໍ່ຮັບປະກັນວ່າຈະບໍ່ສູນເສຍຂໍ້ມູນ. ຟິວສະເພາະ, ການເອີ້ນໃຊ້ເຄື່ອງມື, ການໃຫ້ເຫດຜົນ ຫຼືເນື້ອຫາຫຼາຍຮູບແບບອາດຖືກຫຼຸດຄຸນນະພາບ ຫຼືສູນເສຍ. ກະລຸນາພິຈາລະນາຄວາມສ່ຽງກ່ອນນຳໃຊ້.',
lbPolicyRoundRobin: 'Round Robin',
lbPolicyRoundRobinDesc: 'ເລືອກບັນຊີໂມເດວຕາມລຳດັບ. ໃຊ້ເມື່ອລະບົບຫຼັງບ້ານມີຄວາມສາມາດໃກ້ຄຽງກັນ.',
lbPolicyWeightedRoundRobin: 'Weighted Round Robin',
@@ -1062,6 +1075,7 @@ const message = {
userFallback: 'ຜູ້ໃຊ້ທີ່ຖືກລຶບ (ID: {0})',
requestModel: 'ໂມເດວທີ່ຮ້ອງຂໍ',
upstreamModel: 'ໂມເດວຕົ້ນທາງ (Upstream)',
upstreamDuration: 'ເວລາຕົ້ນທາງ',
requestModelPlaceholder: 'ຕົວຢ່າງ: qwen2.5-coder',
upstreamModelPlaceholder: 'ຕົວຢ່າງ: Qwen/Qwen2.5-Coder-32B-Instruct',
addMapping: 'ເພີ່ມການຈັບຄູ່',

View File

@@ -1018,6 +1018,17 @@ const message = {
unlimited: 'Tanpa had',
unlimitedWithAuto: 'Tanpa had, termasuk auto',
lastUsedAt: 'Terakhir digunakan',
validityPeriod: 'Tempoh sah',
keepCurrentValidity: 'Kekalkan tempoh sah semasa',
neverExpires: 'Tidak luput',
validForDays: 'Sah selama {0} hari',
customDays: 'Hari tersuai',
enterValidityDays: 'Masukkan tempoh sah dalam hari',
currentExpiresAt: 'Tarikh luput semasa: {0}',
currentNeverExpires: 'Pada masa ini tidak luput',
expiresAt: 'Tarikh luput',
expired: 'Telah luput',
reactivate: 'Aktifkan semula',
settingTitle: 'Tetapan gateway AI',
basicSetting: 'Tetapan Asas',
performanceSetting: 'Tetapan Prestasi',
@@ -1026,6 +1037,8 @@ const message = {
protocolConversion: 'Penukaran protokol',
protocolConversionDesc:
'Benarkan penukaran terus yang disokong antara Chat Completions, Responses dan Anthropic Messages. Protokol asli sentiasa diutamakan.',
protocolConversionRisk:
'Penukaran protokol tidak menjamin tanpa kehilangan. Medan khusus protokol, panggilan alat, penaakulan atau kandungan multimodal mungkin diturunkan atau hilang. Gunakan selepas mempertimbangkan risikonya.',
lbPolicyRoundRobin: 'Round Robin',
lbPolicyRoundRobinDesc:
'Pilih akaun model tersedia mengikut turutan. Sesuai apabila kapasiti backend hampir sama.',
@@ -1079,6 +1092,7 @@ const message = {
userFallback: 'Pengguna dipadam (ID: {0})',
requestModel: 'Model permintaan',
upstreamModel: 'Model upstream',
upstreamDuration: 'Masa upstream',
requestModelPlaceholder: 'cth. qwen2.5-coder',
upstreamModelPlaceholder: 'cth. Qwen/Qwen2.5-Coder-32B-Instruct',
addMapping: 'Tambah pemetaan',

View File

@@ -1014,6 +1014,17 @@ const message = {
unlimited: 'Ilimitado',
unlimitedWithAuto: 'Ilimitado, inclui auto',
lastUsedAt: 'Último uso',
validityPeriod: 'Período de validade',
keepCurrentValidity: 'Manter validade atual',
neverExpires: 'Nunca expira',
validForDays: 'Válido por {0} dias',
customDays: 'Dias personalizados',
enterValidityDays: 'Informe o período de validade em dias',
currentExpiresAt: 'Expiração atual: {0}',
currentNeverExpires: 'Atualmente não expira',
expiresAt: 'Data de expiração',
expired: 'Expirado',
reactivate: 'Reativar',
settingTitle: 'Configurações do gateway de IA',
basicSetting: 'Configurações básicas',
performanceSetting: 'Configurações de desempenho',
@@ -1022,6 +1033,8 @@ const message = {
protocolConversion: 'Conversão de protocolo',
protocolConversionDesc:
'Permite conversão direta compatível entre Chat Completions, Responses e Anthropic Messages. Protocolos nativos sempre têm prioridade.',
protocolConversionRisk:
'A conversão de protocolo não é sem perdas. Campos específicos, chamadas de ferramentas, raciocínio ou conteúdo multimodal podem ser degradados ou perdidos. Use após avaliar os riscos.',
lbPolicyRoundRobin: 'Round Robin',
lbPolicyRoundRobinDesc:
'Seleciona contas de modelo disponíveis em ordem. Use quando os backends tiverem capacidade semelhante.',
@@ -1075,6 +1088,7 @@ const message = {
userFallback: 'Usuário excluído (ID: {0})',
requestModel: 'Modelo solicitado',
upstreamModel: 'Modelo upstream',
upstreamDuration: 'Tempo do upstream',
requestModelPlaceholder: 'ex.: qwen2.5-coder',
upstreamModelPlaceholder: 'ex.: Qwen/Qwen2.5-Coder-32B-Instruct',
addMapping: 'Adicionar mapeamento',

View File

@@ -1007,6 +1007,17 @@ const message = {
unlimited: 'Без ограничений',
unlimitedWithAuto: 'Без ограничений, включая auto',
lastUsedAt: 'Последнее использование',
validityPeriod: 'Срок действия',
keepCurrentValidity: 'Сохранить текущий срок',
neverExpires: 'Без срока действия',
validForDays: 'Действителен {0} дней',
customDays: 'Указать дни',
enterValidityDays: 'Введите срок действия в днях',
currentExpiresAt: 'Текущий срок действия: {0}',
currentNeverExpires: 'Срок действия не ограничен',
expiresAt: 'Истекает',
expired: 'Истёк',
reactivate: 'Повторно активировать',
settingTitle: 'Настройки AI-шлюза',
basicSetting: 'Основные настройки',
performanceSetting: 'Настройки производительности',
@@ -1015,6 +1026,8 @@ const message = {
protocolConversion: 'Преобразование протокола',
protocolConversionDesc:
'Разрешает поддерживаемое прямое преобразование между Chat Completions, Responses и Anthropic Messages. Нативный протокол всегда имеет приоритет.',
protocolConversionRisk:
'Преобразование протоколов не гарантирует отсутствие потерь. Специфичные поля, вызовы инструментов, рассуждения или мультимодальные данные могут быть упрощены или потеряны. Используйте после оценки рисков.',
lbPolicyRoundRobin: 'Round Robin',
lbPolicyRoundRobinDesc:
'Выбирает доступные аккаунты моделей по очереди. Подходит, когда бэкенды имеют схожую производительность.',
@@ -1068,6 +1081,7 @@ const message = {
userFallback: 'Удаленный пользователь (ID: {0})',
requestModel: 'Запрошенная модель',
upstreamModel: 'Upstream-модель',
upstreamDuration: 'Время upstream',
requestModelPlaceholder: 'например: qwen2.5-coder',
upstreamModelPlaceholder: 'например: Qwen/Qwen2.5-Coder-32B-Instruct',
addMapping: 'Добавить сопоставление',

View File

@@ -1017,6 +1017,17 @@ const message = {
unlimited: 'Sınırsız',
unlimitedWithAuto: 'Sınırsız, auto dahil',
lastUsedAt: 'Son kullanım',
validityPeriod: 'Geçerlilik süresi',
keepCurrentValidity: 'Mevcut süreyi koru',
neverExpires: 'Süresiz',
validForDays: '{0} gün geçerli',
customDays: 'Özel gün sayısı',
enterValidityDays: 'Geçerlilik süresini gün olarak girin',
currentExpiresAt: 'Mevcut sona erme: {0}',
currentNeverExpires: 'Şu anda süresiz',
expiresAt: 'Sona erme zamanı',
expired: 'Süresi doldu',
reactivate: 'Yeniden etkinleştir',
settingTitle: 'AI Ağ Geçidi ayarları',
basicSetting: 'Temel Ayarlar',
performanceSetting: 'Performans Ayarları',
@@ -1025,6 +1036,8 @@ const message = {
protocolConversion: 'Protokol dönüştürme',
protocolConversionDesc:
'Chat Completions, Responses ve Anthropic Messages arasında desteklenen doğrudan dönüşüme izin verir. Yerel protokol her zaman önceliklidir.',
protocolConversionRisk:
'Protokol dönüşümü kayıpsız değildir. Protokole özgü alanlar, araç çağrıları, akıl yürütme veya çok modlu içerik azaltılabilir ya da kaybolabilir. Riskleri değerlendirdikten sonra kullanın.',
lbPolicyRoundRobin: 'Round Robin',
lbPolicyRoundRobinDesc:
'Kullanılabilir model hesaplarını sırayla seçer. Backend kapasiteleri benzer olduğunda kullanın.',
@@ -1078,6 +1091,7 @@ const message = {
userFallback: 'Silinen kullanıcı (ID: {0})',
requestModel: 'İstek modeli',
upstreamModel: 'Upstream model',
upstreamDuration: 'Upstream süresi',
requestModelPlaceholder: 'örn. qwen2.5-coder',
upstreamModelPlaceholder: 'örn. Qwen/Qwen2.5-Coder-32B-Instruct',
addMapping: 'Eşleme ekle',

View File

@@ -953,6 +953,17 @@ const message = {
unlimited: '不限',
unlimitedWithAuto: '不限,包含 auto',
lastUsedAt: '最近使用時間',
validityPeriod: '有效期',
keepCurrentValidity: '保留目前有效期',
neverExpires: '永不過期',
validForDays: '有效 {0} 天',
customDays: '自訂天數',
enterValidityDays: '請輸入有效天數',
currentExpiresAt: '目前到期時間:{0}',
currentNeverExpires: '目前為永不過期',
expiresAt: '到期時間',
expired: '已過期',
reactivate: '重新啟用',
settingTitle: 'AI 閘道設定',
basicSetting: '基礎設定',
performanceSetting: '效能設定',
@@ -961,6 +972,8 @@ const message = {
protocolConversion: '協議轉換',
protocolConversionDesc:
'啟用後,文字請求可在 Chat Completions、Responses 和 Anthropic Messages 的支援協議間直接轉換,原生協議始終優先。',
protocolConversionRisk:
'協議轉換無法保證無損,協議專屬欄位、工具呼叫、思考內容或多模態內容可能被降級或遺失,請權衡後使用。',
lbPolicyRoundRobin: '輪詢',
lbPolicyRoundRobinDesc: '按順序依次選擇可用模型帳號,適合後端能力接近的場景。',
lbPolicyWeightedRoundRobin: '加權輪詢',
@@ -1010,6 +1023,7 @@ const message = {
userFallback: '已刪除使用者 (ID: {0})',
requestModel: '請求模型',
upstreamModel: '上游模型',
upstreamDuration: '上游耗時',
requestModelPlaceholder: '如 qwen2.5-coder',
upstreamModelPlaceholder: '如 Qwen/Qwen2.5-Coder-32B-Instruct',
addMapping: '新增映射',

View File

@@ -950,6 +950,17 @@ const message = {
unlimitedWithAuto: '不限,包含 auto',
apiKeyCount: 'API Key 数',
lastUsedAt: '最近使用时间',
validityPeriod: '有效期',
keepCurrentValidity: '保持当前有效期',
neverExpires: '永不过期',
validForDays: '有效 {0} 天',
customDays: '自定义天数',
enterValidityDays: '请输入有效天数',
currentExpiresAt: '当前到期时间:{0}',
currentNeverExpires: '当前为永不过期',
expiresAt: '到期时间',
expired: '已过期',
reactivate: '重新激活',
settingTitle: 'AI 网关设置',
basicSetting: '基础设置',
performanceSetting: '性能设置',
@@ -958,6 +969,8 @@ const message = {
protocolConversion: '协议转换',
protocolConversionDesc:
'开启后,文本请求可在 Chat Completions、Responses 和 Anthropic Messages 的受支持协议间直接转换,原生协议始终优先。',
protocolConversionRisk:
'协议转换无法保证无损,协议专属字段、工具调用、思考内容或多模态内容可能被降级或丢失,请权衡之后使用。',
lbPolicyRoundRobin: '轮询',
lbPolicyRoundRobinDesc: '按顺序依次选择可用模型账号,适合后端能力接近的场景。',
lbPolicyWeightedRoundRobin: '加权轮询',
@@ -1007,6 +1020,7 @@ const message = {
userFallback: '已删除用户 (ID: {0})',
requestModel: '请求模型',
upstreamModel: '上游模型',
upstreamDuration: '上游耗时',
requestModelPlaceholder: '如 qwen2.5-coder',
upstreamModelPlaceholder: '如 Qwen/Qwen2.5-Coder-32B-Instruct',
addMapping: '添加映射',

View File

@@ -1,16 +1,20 @@
import jsonWorker from 'monaco-editor/esm/vs/language/json/json.worker?worker';
import cssWorker from 'monaco-editor/esm/vs/language/css/css.worker?worker';
import htmlWorker from 'monaco-editor/esm/vs/language/html/html.worker?worker';
import tsWorker from 'monaco-editor/esm/vs/language/typescript/ts.worker?worker';
import EditorWorker from 'monaco-editor/esm/vs/editor/editor.worker?worker';
import type { languages } from 'monaco-editor/editor';
import jsonWorker from 'monaco-editor/languages/features/json/json.worker?worker';
import cssWorker from 'monaco-editor/languages/features/css/css.worker?worker';
import htmlWorker from 'monaco-editor/languages/features/html/html.worker?worker';
import tsWorker from 'monaco-editor/languages/features/typescript/ts.worker?worker';
import EditorWorker from 'monaco-editor/editor/editor.worker?worker';
let initialized = false;
let languageSupportPromise: Promise<void> | null = null;
type MonacoEditorApi = typeof import('monaco-editor/esm/vs/editor/editor.api');
type PythonLanguageModule = typeof import('monaco-editor/esm/vs/basic-languages/python/python.js');
type MonacoEditorApi = typeof import('monaco-editor/editor');
type PythonLanguageModule = {
conf: languages.LanguageConfiguration;
language: languages.IMonarchLanguage;
};
export const buildPatchedPythonLanguage = (language: PythonLanguageModule['language']) => ({
export const buildPatchedPythonLanguage = (language: PythonLanguageModule['language']): languages.IMonarchLanguage => ({
...language,
tokenizer: {
...language.tokenizer,
@@ -40,8 +44,8 @@ export const buildPatchedPythonLanguage = (language: PythonLanguageModule['langu
const patchPythonLanguageSupport = async () => {
const [monaco, python] = await Promise.all([
import('monaco-editor/esm/vs/editor/editor.api'),
import('monaco-editor/esm/vs/basic-languages/python/python.js'),
import('monaco-editor/editor'),
import('monaco-editor/languages/definitions/python/python.js'),
]);
const monacoApi = monaco as MonacoEditorApi;
const pythonModule = python as PythonLanguageModule;
@@ -88,20 +92,20 @@ export function setupMonacoEnvironment() {
export async function loadMonacoLanguageSupport() {
if (!languageSupportPromise) {
languageSupportPromise = Promise.all([
import('monaco-editor/esm/vs/base/browser/ui/codicons/codiconStyles.js'),
import('monaco-editor/esm/vs/editor/contrib/folding/browser/folding.js'),
import('monaco-editor/esm/vs/editor/contrib/contextmenu/browser/contextmenu.js'),
import('monaco-editor/esm/vs/editor/contrib/clipboard/browser/clipboard.js'),
import('monaco-editor/esm/vs/editor/contrib/comment/browser/comment.js'),
import('monaco-editor/esm/vs/editor/contrib/dropOrPasteInto/browser/copyPasteContribution.js'),
import('monaco-editor/esm/vs/editor/contrib/find/browser/findController.js'),
import('monaco-editor/esm/vs/editor/contrib/multicursor/browser/multicursor.js'),
import('monaco-editor/esm/vs/editor/standalone/browser/quickAccess/standaloneCommandsQuickAccess.js'),
import('monaco-editor/esm/vs/basic-languages/monaco.contribution'),
import('monaco-editor/esm/vs/language/json/monaco.contribution'),
import('monaco-editor/esm/vs/language/css/monaco.contribution'),
import('monaco-editor/esm/vs/language/html/monaco.contribution'),
import('monaco-editor/esm/vs/language/typescript/monaco.contribution'),
import('monaco-editor/features/codicon/register'),
import('monaco-editor/features/folding/register'),
import('monaco-editor/features/contextmenu/register'),
import('monaco-editor/features/clipboard/register'),
import('monaco-editor/features/comment/register'),
import('monaco-editor/features/dropOrPasteInto/register'),
import('monaco-editor/features/find/register'),
import('monaco-editor/features/multicursor/register'),
import('monaco-editor/features/quickCommand/register'),
import('monaco-editor/languages/definitions/register.all'),
import('monaco-editor/languages/features/json/register'),
import('monaco-editor/languages/features/css/register'),
import('monaco-editor/languages/features/html/register'),
import('monaco-editor/languages/features/typescript/register'),
])
.then(() => patchPythonLanguageSupportSafely())
.then(() => undefined);

View File

@@ -22,7 +22,7 @@
import { nextTick, ref } from 'vue';
import { loadMonacoLanguageSupport, setupMonacoEnvironment } from '@/utils/monaco';
type MonacoEditorApi = typeof import('monaco-editor/esm/vs/editor/editor.api');
type MonacoEditorApi = typeof import('monaco-editor/editor');
const open = ref(false);
const newContent = ref('');
@@ -30,9 +30,9 @@ const oldContent = ref('');
const em = defineEmits(['confirm']);
let monaco: MonacoEditorApi | null = null;
let originalModel: MonacoEditorApi['editor']['ITextModel'] | null = null;
let modifiedModel: MonacoEditorApi['editor']['ITextModel'] | null = null;
let editor: MonacoEditorApi['editor']['IStandaloneDiffEditor'] | null = null;
let originalModel: ReturnType<MonacoEditorApi['editor']['createModel']> | null = null;
let modifiedModel: ReturnType<MonacoEditorApi['editor']['createModel']> | null = null;
let editor: ReturnType<MonacoEditorApi['editor']['createDiffEditor']> | null = null;
const container = ref();
@@ -41,10 +41,7 @@ const ensureMonaco = async () => {
return monaco;
}
setupMonacoEnvironment();
const [monacoModule] = await Promise.all([
import('monaco-editor/esm/vs/editor/editor.api'),
loadMonacoLanguageSupport(),
]);
const [monacoModule] = await Promise.all([import('monaco-editor/editor'), loadMonacoLanguageSupport()]);
monaco = monacoModule;
return monaco;
};

View File

@@ -237,7 +237,7 @@ import { Languages } from '@/global/mimetype';
import i18n from '@/lang';
import ComplexTable from '@/components/table/complex/ComplexTable.vue';
type MonacoEditorApi = typeof import('monaco-editor/esm/vs/editor/editor.api');
type MonacoEditorApi = typeof import('monaco-editor/editor');
interface HistoryDrawerProps {
path: string;
@@ -414,10 +414,7 @@ const ensureMonaco = async () => {
return monacoApi;
}
setupMonacoEnvironment();
const [monacoModule] = await Promise.all([
import('monaco-editor/esm/vs/editor/editor.api'),
loadMonacoLanguageSupport(),
]);
const [monacoModule] = await Promise.all([import('monaco-editor/editor'), loadMonacoLanguageSupport()]);
monacoApi = monacoModule;
return monacoApi;
};

View File

@@ -481,7 +481,7 @@ import {
const { isDarkTheme, isMobile } = useGlobalStore();
type MonacoEditorApi = typeof import('monaco-editor/esm/vs/editor/editor.api');
type MonacoEditorApi = typeof import('monaco-editor/editor');
let monacoApi: MonacoEditorApi | null = null;
let monacoThemeInitialized = false;
@@ -496,10 +496,7 @@ const ensureMonaco = async () => {
}
setupMonacoEnvironment();
const [monacoModule] = await Promise.all([
import('monaco-editor/esm/vs/editor/editor.api'),
loadMonacoLanguageSupport(),
]);
const [monacoModule] = await Promise.all([import('monaco-editor/editor'), loadMonacoLanguageSupport()]);
monacoApi = monacoModule;
eolLf.value = monacoApi.editor.EndOfLineSequence.LF;
eolCrlf.value = monacoApi.editor.EndOfLineSequence.CRLF;

View File

@@ -1,5 +1,6 @@
<template>
<div>
<RouterButton :buttons="routerButton" />
<LayoutContent :title="$t('menu.template')">
<template #leftToolBar>
<el-button v-permission type="primary" @click="openCreate()">
@@ -14,12 +15,7 @@
<TableRefresh @search="search()" />
</template>
<template #main>
<ComplexTable
:data="data"
:pagination-config="paginationConfig"
@search="search()"
v-loading="loading"
>
<ComplexTable :data="data" :pagination-config="paginationConfig" @search="search()" v-loading="loading">
<el-table-column :label="$t('template.name')" prop="name" min-width="120px" show-overflow-tooltip />
<el-table-column :label="$t('template.type')" prop="type" width="150px">
<template #default="{ row }">
@@ -80,6 +76,13 @@ const operateRef = ref();
const outputCreateRef = ref();
const outputListRef = ref();
const routerButton = [
{
label: i18n.global.t('menu.template'),
path: '/websites/templates',
},
];
const paginationConfig = reactive({
cacheSizeKey: 'website-template-page-size',
currentPage: 1,

View File

@@ -16,7 +16,13 @@
</el-radio-group>
</el-form-item>
<el-form-item v-if="form.type === 'single'" :label="$t('template.content')" prop="content">
<el-input v-model="form.content" type="textarea" :rows="12" :placeholder="contentPlaceholder" />
<el-input
v-model="form.content"
type="textarea"
:rows="12"
:placeholder="contentPlaceholder"
@change="detectContentVariables"
/>
<span class="input-help">{{ $t('template.autoDetectHelper') }}</span>
</el-form-item>
<el-form-item v-if="form.type === 'multi'" :label="$t('template.upload')">
@@ -104,7 +110,7 @@ import { Website } from '@/api/interface/website';
import { createTemplate, getTemplate, updateTemplate, uploadTemplateZip } from '@/api/modules/website';
import i18n from '@/lang';
import { MsgSuccess } from '@/utils/message';
import { reactive, ref, watch } from 'vue';
import { reactive, ref } from 'vue';
const open = ref(false);
const loading = ref(false);
@@ -157,19 +163,16 @@ const mergeDetectedKeys = (keys: string[]) => {
}
};
watch(
() => form.content,
(content) => {
if (form.type !== 'single' || !content) return;
const keys: string[] = [];
for (const match of content.matchAll(/\{\{(\w+)\}\}/g)) {
if (!keys.includes(match[1])) {
keys.push(match[1]);
}
const detectContentVariables = () => {
if (form.type !== 'single' || !form.content) return;
const keys: string[] = [];
for (const match of form.content.matchAll(/\{\{(\w+)\}\}/g)) {
if (!keys.includes(match[1])) {
keys.push(match[1]);
}
mergeDetectedKeys(keys);
},
);
}
mergeDetectedKeys(keys);
};
const handleUpload = async (file: globalThis.File) => {
try {
@@ -182,6 +185,7 @@ const handleUpload = async (file: globalThis.File) => {
};
const onSubmit = async () => {
detectContentVariables();
await formRef.value.validate();
form.variables = JSON.stringify(variables.value.filter((v) => v.key));
loading.value = true;

View File

@@ -39,10 +39,7 @@
>
<el-option v-for="opt in getOptions(variable)" :key="opt" :value="opt" :label="opt" />
</el-select>
<el-color-picker
v-else-if="variable.type === 'color'"
v-model="variableValues[variable.key]"
/>
<el-color-picker v-else-if="variable.type === 'color'" v-model="variableValues[variable.key]" />
<el-input v-else v-model="variableValues[variable.key]" />
</el-form-item>
<el-divider content-position="left">

View File

@@ -22,7 +22,13 @@
show-overflow-tooltip
/>
<el-table-column prop="createdAt" :label="$t('commons.table.date')" :formatter="dateFormat" width="165px" />
<fu-table-operations :ellipsis="1" :buttons="buttons" :label="$t('commons.table.operate')" fixed="right" fix />
<fu-table-operations
:ellipsis="1"
:buttons="buttons"
:label="$t('commons.table.operate')"
fixed="right"
fix
/>
</ComplexTable>
<OpDialog ref="opRef" @search="search" />
<OutputCreate ref="outputCreateRef" @search="search" />