diff --git a/.gitignore b/.gitignore index 0790de3846..c654323d9d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,10 @@ +# environment variables +.env +.env.production + +# macOS-specific files +.DS_Store + # Binaries for programs and plugins *.exe *.exe~ @@ -23,12 +30,4 @@ node_modules/ npm-debug.log* yarn-debug.log* yarn-error.log* -pnpm-debug.log* - - -# environment variables -.env -.env.production - -# macOS-specific files -.DS_Store +pnpm-debug.log* \ No newline at end of file diff --git a/README.md b/README.md index 4a7c3b51e0..f9f6d31c6e 100644 --- a/README.md +++ b/README.md @@ -1,50 +1,54 @@ +# Starlight Starter Kit: Basics -# Gin website +[![Built with Starlight](https://astro.badg.es/v2/built-with-starlight/tiny.svg)](https://starlight.astro.build) -[![Run Deploy](https://github.com/gin-gonic/website/actions/workflows/node.yml/badge.svg)](https://github.com/gin-gonic/website/actions/workflows/node.yml) - -Welcome! This repository houses all the assets required to build the Gin website and documentation. We're pleased that you want to contribute! The website is hosted at https://gin-gonic.com. - -We use [Hugo](https://gohugo.io/) to format and generate our website, the [Docsy](https://github.com/google/docsy) theme for styling and site structure. Thanks!. - -**Note:** We only support hugo [v0.75.1 version](https://github.com/gohugoio/hugo/releases/tag/v0.75.1). +``` +npm create astro@latest -- --template starlight +``` -## Contribution +[![Open in StackBlitz](https://developer.stackblitz.com/img/open_in_stackblitz.svg)](https://stackblitz.com/github/withastro/starlight/tree/main/examples/basics) +[![Open with CodeSandbox](https://assets.codesandbox.io/github/button-edit-lime.svg)](https://codesandbox.io/p/sandbox/github/withastro/starlight/tree/main/examples/basics) +[![Deploy to Netlify](https://www.netlify.com/img/deploy/button.svg)](https://app.netlify.com/start/deploy?repository=https://github.com/withastro/starlight&create_from_path=examples/basics) +[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2Fwithastro%2Fstarlight%2Ftree%2Fmain%2Fexamples%2Fbasics&project-name=my-starlight-docs&repository-name=my-starlight-docs) -- Fork the repository +> 🧑‍🚀 **Seasoned astronaut?** Delete this file. Have fun! -You can click the Fork button in the upper-right area of the screen to create a copy of this repository in your GitHub account. This copy is called as fork. +## 🚀 Project Structure -> You need to use the below command to clone code for docsy theme. +Inside of your Astro + Starlight project, you'll see the following folders and files: -```sh -git clone --recurse-submodules --depth 1 https://github.com/google/docsy.git themes/docsy +``` +. +├── public/ +├── src/ +│ ├── assets/ +│ ├── content/ +│ │ ├── docs/ +│ └── content.config.ts +├── astro.config.mjs +├── package.json +└── tsconfig.json ``` -- Create one pull request - -Make any changes you want in your fork, and when you are ready to send those changes to us, go to your fork and create a new pull request to let us know about it. - -- Merge the pull request - -Once your pull request is created, a Gin reviewer will take responsibility for providing clear, actionable feedback, re-improve and merge. +Starlight looks for `.md` or `.mdx` files in the `src/content/docs/` directory. Each file is exposed as a route based on its file name. -## Running +Images can be added to `src/assets/` and embedded in Markdown with a relative link. -See the [official Hugo documentation](https://gohugo.io/getting-started/installing/) for Hugo installation instructions. +Static assets, like favicons, can be placed in the `public/` directory. -To run the site locally when you have Hugo installed: +## 🧞 Commands -```sh -# If use `hugo` command, you need to use `npm install` command -$ npm install -$ hugo -# Or use `hugo server`, it not need `npm install` command -$ hugo server -``` +All commands are run from the root of the project, from a terminal: -This will start the local Hugo server on port 1313. Open up your browser to http://localhost:1313 to view the site. As you make changes to the source files, Hugo updates the site and forces a browser refresh. +| Command | Action | +| :------------------------ | :----------------------------------------------- | +| `npm install` | Installs dependencies | +| `npm run dev` | Starts local dev server at `localhost:4321` | +| `npm run build` | Build your production site to `./dist/` | +| `npm run preview` | Preview your build locally, before deploying | +| `npm run astro ...` | Run CLI commands like `astro add`, `astro check` | +| `npm run astro -- --help` | Get help using the Astro CLI | -## Thanks +## 👀 Want to learn more? -Gin thrives on community participation, and we really appreciate your contributions to our site and our documentation! +Check out [Starlight’s docs](https://starlight.astro.build/), read [the Astro documentation](https://docs.astro.build), or jump into the [Astro Discord server](https://astro.build/chat). diff --git a/astro.config.mjs b/astro.config.mjs index 0cd52785dd..3b4da16442 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -3,96 +3,91 @@ import { defineConfig } from 'astro/config'; import starlight from '@astrojs/starlight'; import starlightUtils from "@lorenzo_lewis/starlight-utils"; +import sitemap from "@astrojs/sitemap"; + // https://astro.build/config export default defineConfig({ + integrations: [starlight({ + plugins: [starlightUtils({ + multiSidebar: { + switcherStyle: "horizontalList", + }, + })], - integrations: [ - starlight({ - plugins: [starlightUtils({ - multiSidebar: { - switcherStyle: "horizontalList", - }, - })], - - title: 'Gin Web Framework', - favicon: '/favicon.ico', - logo: { - src: "./src/assets/gin.png", - }, - - defaultLocale: 'en', - locales: { - 'en': { - label: 'English', - lang: 'en', - }, - 'es': { - label: 'Español', - lang: 'es', - }, - "fa": { - label: "Persian", - lang: "fa", - }, - "ja": { - label: "日本語", - lang: "ja", - }, - "ko-kr": { - label: "한국어", - lang: "ko-kr", - }, - "pt": { - label: "Português", - lang: "pt", - }, - "ru": { - label: "Russian", - lang: "ru", - }, - "tr": { - label: "Turkish", - lang: "tr", - }, - "zh-cn": { - label: "简体中文", - lang: "zh-cn", - }, - "zh-tw": { - label: "繁體中文", - lang: "zh-tw", - }, - }, - - social: { - github: 'https://github.com/gin-gonic/gin', - gitter: "https://gitter.im/gin-gonic/gin" - }, - sidebar: [ - { - label: "Docs", - autogenerate: { directory: "docs" } - }, - { - label: "Blog", - autogenerate: { directory: "blog" } - }, - ], - - customCss: [ - './src/styles/custom.css', - ], - - expressiveCode: { - themes: ['github-dark', 'github-light'], - }, + title: 'Gin Web Framework', + favicon: '/favicon.ico', + logo: { + src: "./src/assets/gin.png", + }, - editLink: { - baseUrl: 'https://github.com/gin-gonic/website/edit/master/', - }, + defaultLocale: 'en', + locales: { + 'en': { + label: 'English', + lang: 'en', + }, + 'es': { + label: 'Español', + lang: 'es', + }, + "fa": { + label: "Persian", + lang: "fa", + }, + "ja": { + label: "日本語", + lang: "ja", + }, + "ko-kr": { + label: "한국어", + lang: "ko-kr", + }, + "pt": { + label: "Português", + lang: "pt", + }, + "ru": { + label: "Russian", + lang: "ru", + }, + "tr": { + label: "Turkish", + lang: "tr", + }, + "zh-cn": { + label: "简体中文", + lang: "zh-cn", + }, + "zh-tw": { + label: "繁體中文", + lang: "zh-tw", + }, + }, - lastUpdated: true, - credits: false, // Opcional - }), - ], -}); + social: { + github: 'https://github.com/gin-gonic/gin', + gitter: "https://gitter.im/gin-gonic/gin" + }, + sidebar: [ + { + label: "Docs", + autogenerate: { directory: "docs" } + }, + { + label: "Blog", + autogenerate: { directory: "blog" } + }, + ], + expressiveCode: { + themes: ['github-dark', 'github-light'], + }, + editLink: { + baseUrl: 'https://github.com/gin-gonic/website/edit/master/', + }, + customCss: [ + './src/styles/custom.css', + ], + lastUpdated: true, + credits: false, // Opcional + }), sitemap()], +}); \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000000..90caf472c8 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,6749 @@ +{ + "name": "gin", + "version": "0.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "gin", + "version": "0.0.1", + "dependencies": { + "@astrojs/sitemap": "^3.3.0", + "@astrojs/starlight": "^0.32.5", + "@lorenzo_lewis/starlight-utils": "^0.3.2", + "astro": "^5.5.3", + "sharp": "^0.32.5" + } + }, + "node_modules/@astrojs/compiler": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@astrojs/compiler/-/compiler-2.11.0.tgz", + "integrity": "sha512-zZOO7i+JhojO8qmlyR/URui6LyfHJY6m+L9nwyX5GiKD78YoRaZ5tzz6X0fkl+5bD3uwlDHayf6Oe8Fu36RKNg==", + "license": "MIT" + }, + "node_modules/@astrojs/internal-helpers": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.6.1.tgz", + "integrity": "sha512-l5Pqf6uZu31aG+3Lv8nl/3s4DbUzdlxTWDof4pEpto6GUJNhhCbelVi9dEyurOVyqaelwmS9oSyOWOENSfgo9A==", + "license": "MIT" + }, + "node_modules/@astrojs/markdown-remark": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@astrojs/markdown-remark/-/markdown-remark-6.3.1.tgz", + "integrity": "sha512-c5F5gGrkczUaTVgmMW9g1YMJGzOtRvjjhw6IfGuxarM6ct09MpwysP10US729dy07gg8y+ofVifezvP3BNsWZg==", + "license": "MIT", + "dependencies": { + "@astrojs/internal-helpers": "0.6.1", + "@astrojs/prism": "3.2.0", + "github-slugger": "^2.0.0", + "hast-util-from-html": "^2.0.3", + "hast-util-to-text": "^4.0.2", + "import-meta-resolve": "^4.1.0", + "js-yaml": "^4.1.0", + "mdast-util-definitions": "^6.0.0", + "rehype-raw": "^7.0.0", + "rehype-stringify": "^10.0.1", + "remark-gfm": "^4.0.1", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.1.1", + "remark-smartypants": "^3.0.2", + "shiki": "^3.0.0", + "smol-toml": "^1.3.1", + "unified": "^11.0.5", + "unist-util-remove-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "unist-util-visit-parents": "^6.0.1", + "vfile": "^6.0.3" + } + }, + "node_modules/@astrojs/mdx": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@astrojs/mdx/-/mdx-4.2.3.tgz", + "integrity": "sha512-oteB88udzzZmix5kWWUMeMJfeB2Dj8g7jy9LVNuTzGlBh3mEkGhQr6FsIR43p0JKCN11fl5J7P/Ev4Q0Nf0KQQ==", + "license": "MIT", + "dependencies": { + "@astrojs/markdown-remark": "6.3.1", + "@mdx-js/mdx": "^3.1.0", + "acorn": "^8.14.1", + "es-module-lexer": "^1.6.0", + "estree-util-visit": "^2.0.0", + "hast-util-to-html": "^9.0.5", + "kleur": "^4.1.5", + "rehype-raw": "^7.0.0", + "remark-gfm": "^4.0.1", + "remark-smartypants": "^3.0.2", + "source-map": "^0.7.4", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.3" + }, + "engines": { + "node": "^18.17.1 || ^20.3.0 || >=22.0.0" + }, + "peerDependencies": { + "astro": "^5.0.0" + } + }, + "node_modules/@astrojs/prism": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@astrojs/prism/-/prism-3.2.0.tgz", + "integrity": "sha512-GilTHKGCW6HMq7y3BUv9Ac7GMe/MO9gi9GW62GzKtth0SwukCu/qp2wLiGpEujhY+VVhaG9v7kv/5vFzvf4NYw==", + "license": "MIT", + "dependencies": { + "prismjs": "^1.29.0" + }, + "engines": { + "node": "^18.17.1 || ^20.3.0 || >=22.0.0" + } + }, + "node_modules/@astrojs/sitemap": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@astrojs/sitemap/-/sitemap-3.3.0.tgz", + "integrity": "sha512-nYE4lKQtk+Kbrw/w0G0TTgT724co0jUsU4tPlHY9au5HmTBKbwiCLwO/15b1/y13aZ4Kr9ZbMeMHlXuwn0ty4Q==", + "license": "MIT", + "dependencies": { + "sitemap": "^8.0.0", + "stream-replace-string": "^2.0.0", + "zod": "^3.24.2" + } + }, + "node_modules/@astrojs/starlight": { + "version": "0.32.5", + "resolved": "https://registry.npmjs.org/@astrojs/starlight/-/starlight-0.32.5.tgz", + "integrity": "sha512-KYZsYbA5eEAsCO3XNc6DWDPml1JCD6GVusuB15fYq5dbxyB7RtC6kgwbtiEmr84maIjcQUmDtFJCz3sN4CdaSg==", + "license": "MIT", + "dependencies": { + "@astrojs/mdx": "^4.0.5", + "@astrojs/sitemap": "^3.2.1", + "@pagefind/default-ui": "^1.3.0", + "@types/hast": "^3.0.4", + "@types/js-yaml": "^4.0.9", + "@types/mdast": "^4.0.4", + "astro-expressive-code": "^0.40.0", + "bcp-47": "^2.1.0", + "hast-util-from-html": "^2.0.1", + "hast-util-select": "^6.0.2", + "hast-util-to-string": "^3.0.0", + "hastscript": "^9.0.0", + "i18next": "^23.11.5", + "js-yaml": "^4.1.0", + "klona": "^2.0.6", + "mdast-util-directive": "^3.0.0", + "mdast-util-to-markdown": "^2.1.0", + "mdast-util-to-string": "^4.0.0", + "pagefind": "^1.3.0", + "rehype": "^13.0.1", + "rehype-format": "^5.0.0", + "remark-directive": "^3.0.0", + "unified": "^11.0.5", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.2" + }, + "peerDependencies": { + "astro": "^5.1.5" + } + }, + "node_modules/@astrojs/telemetry": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@astrojs/telemetry/-/telemetry-3.2.0.tgz", + "integrity": "sha512-wxhSKRfKugLwLlr4OFfcqovk+LIFtKwLyGPqMsv+9/ibqqnW3Gv7tBhtKEb0gAyUAC4G9BTVQeQahqnQAhd6IQ==", + "license": "MIT", + "dependencies": { + "ci-info": "^4.1.0", + "debug": "^4.3.7", + "dlv": "^1.1.3", + "dset": "^3.1.4", + "is-docker": "^3.0.0", + "is-wsl": "^3.1.0", + "which-pm-runs": "^1.1.0" + }, + "engines": { + "node": "^18.17.1 || ^20.3.0 || >=22.0.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.0.tgz", + "integrity": "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.0.tgz", + "integrity": "sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==", + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.0.tgz", + "integrity": "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@ctrl/tinycolor": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-4.1.0.tgz", + "integrity": "sha512-WyOx8cJQ+FQus4Mm4uPIZA64gbk3Wxh0so5Lcii0aJifqwoVOlfFtorjLE0Hen4OYyHZMXDWqMmaQemBhgxFRQ==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.0.tgz", + "integrity": "sha512-64WYIf4UYcdLnbKn/umDlNjQDSS8AgZrI/R9+x5ilkUVFxXcA1Ebl+gQLc/6mERA4407Xof0R7wEyEuj091CVw==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.2.tgz", + "integrity": "sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.2.tgz", + "integrity": "sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.2.tgz", + "integrity": "sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.2.tgz", + "integrity": "sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.2.tgz", + "integrity": "sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.2.tgz", + "integrity": "sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.2.tgz", + "integrity": "sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.2.tgz", + "integrity": "sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.2.tgz", + "integrity": "sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.2.tgz", + "integrity": "sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.2.tgz", + "integrity": "sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.2.tgz", + "integrity": "sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.2.tgz", + "integrity": "sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.2.tgz", + "integrity": "sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.2.tgz", + "integrity": "sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.2.tgz", + "integrity": "sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.2.tgz", + "integrity": "sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.2.tgz", + "integrity": "sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.2.tgz", + "integrity": "sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.2.tgz", + "integrity": "sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.2.tgz", + "integrity": "sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.2.tgz", + "integrity": "sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.2.tgz", + "integrity": "sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.2.tgz", + "integrity": "sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.2.tgz", + "integrity": "sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@expressive-code/core": { + "version": "0.40.2", + "resolved": "https://registry.npmjs.org/@expressive-code/core/-/core-0.40.2.tgz", + "integrity": "sha512-gXY3v7jbgz6nWKvRpoDxK4AHUPkZRuJsM79vHX/5uhV9/qX6Qnctp/U/dMHog/LCVXcuOps+5nRmf1uxQVPb3w==", + "license": "MIT", + "dependencies": { + "@ctrl/tinycolor": "^4.0.4", + "hast-util-select": "^6.0.2", + "hast-util-to-html": "^9.0.1", + "hast-util-to-text": "^4.0.1", + "hastscript": "^9.0.0", + "postcss": "^8.4.38", + "postcss-nested": "^6.0.1", + "unist-util-visit": "^5.0.0", + "unist-util-visit-parents": "^6.0.1" + } + }, + "node_modules/@expressive-code/plugin-frames": { + "version": "0.40.2", + "resolved": "https://registry.npmjs.org/@expressive-code/plugin-frames/-/plugin-frames-0.40.2.tgz", + "integrity": "sha512-aLw5IlDlZWb10Jo/TTDCVsmJhKfZ7FJI83Zo9VDrV0OBlmHAg7klZqw68VDz7FlftIBVAmMby53/MNXPnMjTSQ==", + "license": "MIT", + "dependencies": { + "@expressive-code/core": "^0.40.2" + } + }, + "node_modules/@expressive-code/plugin-shiki": { + "version": "0.40.2", + "resolved": "https://registry.npmjs.org/@expressive-code/plugin-shiki/-/plugin-shiki-0.40.2.tgz", + "integrity": "sha512-t2HMR5BO6GdDW1c1ISBTk66xO503e/Z8ecZdNcr6E4NpUfvY+MRje+LtrcvbBqMwWBBO8RpVKcam/Uy+1GxwKQ==", + "license": "MIT", + "dependencies": { + "@expressive-code/core": "^0.40.2", + "shiki": "^1.26.1" + } + }, + "node_modules/@expressive-code/plugin-shiki/node_modules/@shikijs/core": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.29.2.tgz", + "integrity": "sha512-vju0lY9r27jJfOY4Z7+Rt/nIOjzJpZ3y+nYpqtUZInVoXQ/TJZcfGnNOGnKjFdVZb8qexiCuSlZRKcGfhhTTZQ==", + "license": "MIT", + "dependencies": { + "@shikijs/engine-javascript": "1.29.2", + "@shikijs/engine-oniguruma": "1.29.2", + "@shikijs/types": "1.29.2", + "@shikijs/vscode-textmate": "^10.0.1", + "@types/hast": "^3.0.4", + "hast-util-to-html": "^9.0.4" + } + }, + "node_modules/@expressive-code/plugin-shiki/node_modules/@shikijs/engine-javascript": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-1.29.2.tgz", + "integrity": "sha512-iNEZv4IrLYPv64Q6k7EPpOCE/nuvGiKl7zxdq0WFuRPF5PAE9PRo2JGq/d8crLusM59BRemJ4eOqrFrC4wiQ+A==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "1.29.2", + "@shikijs/vscode-textmate": "^10.0.1", + "oniguruma-to-es": "^2.2.0" + } + }, + "node_modules/@expressive-code/plugin-shiki/node_modules/@shikijs/engine-oniguruma": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-1.29.2.tgz", + "integrity": "sha512-7iiOx3SG8+g1MnlzZVDYiaeHe7Ez2Kf2HrJzdmGwkRisT7r4rak0e655AcM/tF9JG/kg5fMNYlLLKglbN7gBqA==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "1.29.2", + "@shikijs/vscode-textmate": "^10.0.1" + } + }, + "node_modules/@expressive-code/plugin-shiki/node_modules/@shikijs/langs": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-1.29.2.tgz", + "integrity": "sha512-FIBA7N3LZ+223U7cJDUYd5shmciFQlYkFXlkKVaHsCPgfVLiO+e12FmQE6Tf9vuyEsFe3dIl8qGWKXgEHL9wmQ==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "1.29.2" + } + }, + "node_modules/@expressive-code/plugin-shiki/node_modules/@shikijs/themes": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-1.29.2.tgz", + "integrity": "sha512-i9TNZlsq4uoyqSbluIcZkmPL9Bfi3djVxRnofUHwvx/h6SRW3cwgBC5SML7vsDcWyukY0eCzVN980rqP6qNl9g==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "1.29.2" + } + }, + "node_modules/@expressive-code/plugin-shiki/node_modules/@shikijs/types": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.29.2.tgz", + "integrity": "sha512-VJjK0eIijTZf0QSTODEXCqinjBn0joAHQ+aPSBzrv4O2d/QSbsMw+ZeSRx03kV34Hy7NzUvV/7NqfYGRLrASmw==", + "license": "MIT", + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.1", + "@types/hast": "^3.0.4" + } + }, + "node_modules/@expressive-code/plugin-shiki/node_modules/oniguruma-to-es": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-2.3.0.tgz", + "integrity": "sha512-bwALDxriqfKGfUufKGGepCzu9x7nJQuoRoAFp4AnwehhC2crqrDIAP/uN2qdlsAvSMpeRC3+Yzhqc7hLmle5+g==", + "license": "MIT", + "dependencies": { + "emoji-regex-xs": "^1.0.0", + "regex": "^5.1.1", + "regex-recursion": "^5.1.1" + } + }, + "node_modules/@expressive-code/plugin-shiki/node_modules/regex": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/regex/-/regex-5.1.1.tgz", + "integrity": "sha512-dN5I359AVGPnwzJm2jN1k0W9LPZ+ePvoOeVMMfqIMFz53sSwXkxaJoxr50ptnsC771lK95BnTrVSZxq0b9yCGw==", + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/@expressive-code/plugin-shiki/node_modules/regex-recursion": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-5.1.1.tgz", + "integrity": "sha512-ae7SBCbzVNrIjgSbh7wMznPcQel1DNlDtzensnFxpiNpXt1U2ju/bHugH422r+4LAVS1FpW1YCwilmnNsjum9w==", + "license": "MIT", + "dependencies": { + "regex": "^5.1.1", + "regex-utilities": "^2.3.0" + } + }, + "node_modules/@expressive-code/plugin-shiki/node_modules/shiki": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.29.2.tgz", + "integrity": "sha512-njXuliz/cP+67jU2hukkxCNuH1yUi4QfdZZY+sMr5PPrIyXSu5iTb/qYC4BiWWB0vZ+7TbdvYUCeL23zpwCfbg==", + "license": "MIT", + "dependencies": { + "@shikijs/core": "1.29.2", + "@shikijs/engine-javascript": "1.29.2", + "@shikijs/engine-oniguruma": "1.29.2", + "@shikijs/langs": "1.29.2", + "@shikijs/themes": "1.29.2", + "@shikijs/types": "1.29.2", + "@shikijs/vscode-textmate": "^10.0.1", + "@types/hast": "^3.0.4" + } + }, + "node_modules/@expressive-code/plugin-text-markers": { + "version": "0.40.2", + "resolved": "https://registry.npmjs.org/@expressive-code/plugin-text-markers/-/plugin-text-markers-0.40.2.tgz", + "integrity": "sha512-/XoLjD67K9nfM4TgDlXAExzMJp6ewFKxNpfUw4F7q5Ecy+IU3/9zQQG/O70Zy+RxYTwKGw2MA9kd7yelsxnSmw==", + "license": "MIT", + "dependencies": { + "@expressive-code/core": "^0.40.2" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz", + "integrity": "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz", + "integrity": "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz", + "integrity": "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz", + "integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz", + "integrity": "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==", + "cpu": [ + "arm" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz", + "integrity": "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz", + "integrity": "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==", + "cpu": [ + "s390x" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz", + "integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz", + "integrity": "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz", + "integrity": "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz", + "integrity": "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.0.5" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz", + "integrity": "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz", + "integrity": "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.0.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz", + "integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz", + "integrity": "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz", + "integrity": "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz", + "integrity": "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.2.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz", + "integrity": "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz", + "integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "license": "MIT" + }, + "node_modules/@lorenzo_lewis/starlight-utils": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@lorenzo_lewis/starlight-utils/-/starlight-utils-0.3.2.tgz", + "integrity": "sha512-9GCZLyfIUTkXuE39jHjcCSwnOzm6hSGnC8DrHlo2imegiZmZSdG0eBMA/sTb/shLkvCzE2SGCaKM+EwIeO6oDw==", + "license": "MIT", + "dependencies": { + "astro-integration-kit": "^0.18.0" + }, + "peerDependencies": { + "@astrojs/starlight": ">=0.32.0", + "astro": ">=5" + } + }, + "node_modules/@mdx-js/mdx": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.1.0.tgz", + "integrity": "sha512-/QxEhPAvGwbQmy1Px8F899L5Uc2KZ6JtXwlCgJmjSTBedwOZkByYcBG4GceIGPXRDsmfxhHazuS+hlOShRLeDw==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdx": "^2.0.0", + "collapse-white-space": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-util-scope": "^1.0.0", + "estree-walker": "^3.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "markdown-extensions": "^2.0.0", + "recma-build-jsx": "^1.0.0", + "recma-jsx": "^1.0.0", + "recma-stringify": "^1.0.0", + "rehype-recma": "^1.0.0", + "remark-mdx": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "source-map": "^0.7.0", + "unified": "^11.0.0", + "unist-util-position-from-estree": "^2.0.0", + "unist-util-stringify-position": "^4.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@oslojs/encoding": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@oslojs/encoding/-/encoding-1.1.0.tgz", + "integrity": "sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==", + "license": "MIT" + }, + "node_modules/@pagefind/darwin-arm64": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@pagefind/darwin-arm64/-/darwin-arm64-1.3.0.tgz", + "integrity": "sha512-365BEGl6ChOsauRjyVpBjXybflXAOvoMROw3TucAROHIcdBvXk9/2AmEvGFU0r75+vdQI4LJdJdpH4Y6Yqaj4A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@pagefind/darwin-x64": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@pagefind/darwin-x64/-/darwin-x64-1.3.0.tgz", + "integrity": "sha512-zlGHA23uuXmS8z3XxEGmbHpWDxXfPZ47QS06tGUq0HDcZjXjXHeLG+cboOy828QIV5FXsm9MjfkP5e4ZNbOkow==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@pagefind/default-ui": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@pagefind/default-ui/-/default-ui-1.3.0.tgz", + "integrity": "sha512-CGKT9ccd3+oRK6STXGgfH+m0DbOKayX6QGlq38TfE1ZfUcPc5+ulTuzDbZUnMo+bubsEOIypm4Pl2iEyzZ1cNg==", + "license": "MIT" + }, + "node_modules/@pagefind/linux-arm64": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@pagefind/linux-arm64/-/linux-arm64-1.3.0.tgz", + "integrity": "sha512-8lsxNAiBRUk72JvetSBXs4WRpYrQrVJXjlRRnOL6UCdBN9Nlsz0t7hWstRk36+JqHpGWOKYiuHLzGYqYAqoOnQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@pagefind/linux-x64": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@pagefind/linux-x64/-/linux-x64-1.3.0.tgz", + "integrity": "sha512-hAvqdPJv7A20Ucb6FQGE6jhjqy+vZ6pf+s2tFMNtMBG+fzcdc91uTw7aP/1Vo5plD0dAOHwdxfkyw0ugal4kcQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@pagefind/windows-x64": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@pagefind/windows-x64/-/windows-x64-1.3.0.tgz", + "integrity": "sha512-BR1bIRWOMqkf8IoU576YDhij1Wd/Zf2kX/kCI0b2qzCKC8wcc2GQJaaRMCpzvCCrmliO4vtJ6RITp/AnoYUUmQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/pluginutils": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.4.tgz", + "integrity": "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.39.0.tgz", + "integrity": "sha512-lGVys55Qb00Wvh8DMAocp5kIcaNzEFTmGhfFd88LfaogYTRKrdxgtlO5H6S49v2Nd8R2C6wLOal0qv6/kCkOwA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.39.0.tgz", + "integrity": "sha512-It9+M1zE31KWfqh/0cJLrrsCPiF72PoJjIChLX+rEcujVRCb4NLQ5QzFkzIZW8Kn8FTbvGQBY5TkKBau3S8cCQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.39.0.tgz", + "integrity": "sha512-lXQnhpFDOKDXiGxsU9/l8UEGGM65comrQuZ+lDcGUx+9YQ9dKpF3rSEGepyeR5AHZ0b5RgiligsBhWZfSSQh8Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.39.0.tgz", + "integrity": "sha512-mKXpNZLvtEbgu6WCkNij7CGycdw9cJi2k9v0noMb++Vab12GZjFgUXD69ilAbBh034Zwn95c2PNSz9xM7KYEAQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.39.0.tgz", + "integrity": "sha512-jivRRlh2Lod/KvDZx2zUR+I4iBfHcu2V/BA2vasUtdtTN2Uk3jfcZczLa81ESHZHPHy4ih3T/W5rPFZ/hX7RtQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.39.0.tgz", + "integrity": "sha512-8RXIWvYIRK9nO+bhVz8DwLBepcptw633gv/QT4015CpJ0Ht8punmoHU/DuEd3iw9Hr8UwUV+t+VNNuZIWYeY7Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.39.0.tgz", + "integrity": "sha512-mz5POx5Zu58f2xAG5RaRRhp3IZDK7zXGk5sdEDj4o96HeaXhlUwmLFzNlc4hCQi5sGdR12VDgEUqVSHer0lI9g==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.39.0.tgz", + "integrity": "sha512-+YDwhM6gUAyakl0CD+bMFpdmwIoRDzZYaTWV3SDRBGkMU/VpIBYXXEvkEcTagw/7VVkL2vA29zU4UVy1mP0/Yw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.39.0.tgz", + "integrity": "sha512-EKf7iF7aK36eEChvlgxGnk7pdJfzfQbNvGV/+l98iiMwU23MwvmV0Ty3pJ0p5WQfm3JRHOytSIqD9LB7Bq7xdQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.39.0.tgz", + "integrity": "sha512-vYanR6MtqC7Z2SNr8gzVnzUul09Wi1kZqJaek3KcIlI/wq5Xtq4ZPIZ0Mr/st/sv/NnaPwy/D4yXg5x0B3aUUA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.39.0.tgz", + "integrity": "sha512-NMRUT40+h0FBa5fb+cpxtZoGAggRem16ocVKIv5gDB5uLDgBIwrIsXlGqYbLwW8YyO3WVTk1FkFDjMETYlDqiw==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.39.0.tgz", + "integrity": "sha512-0pCNnmxgduJ3YRt+D+kJ6Ai/r+TaePu9ZLENl+ZDV/CdVczXl95CbIiwwswu4L+K7uOIGf6tMo2vm8uadRaICQ==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.39.0.tgz", + "integrity": "sha512-t7j5Zhr7S4bBtksT73bO6c3Qa2AV/HqiGlj9+KB3gNF5upcVkx+HLgxTm8DK4OkzsOYqbdqbLKwvGMhylJCPhQ==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.39.0.tgz", + "integrity": "sha512-m6cwI86IvQ7M93MQ2RF5SP8tUjD39Y7rjb1qjHgYh28uAPVU8+k/xYWvxRO3/tBN2pZkSMa5RjnPuUIbrwVxeA==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.39.0.tgz", + "integrity": "sha512-iRDJd2ebMunnk2rsSBYlsptCyuINvxUfGwOUldjv5M4tpa93K8tFMeYGpNk2+Nxl+OBJnBzy2/JCscGeO507kA==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.39.0.tgz", + "integrity": "sha512-t9jqYw27R6Lx0XKfEFe5vUeEJ5pF3SGIM6gTfONSMb7DuG6z6wfj2yjcoZxHg129veTqU7+wOhY6GX8wmf90dA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.39.0.tgz", + "integrity": "sha512-ThFdkrFDP55AIsIZDKSBWEt/JcWlCzydbZHinZ0F/r1h83qbGeenCt/G/wG2O0reuENDD2tawfAj2s8VK7Bugg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.39.0.tgz", + "integrity": "sha512-jDrLm6yUtbOg2TYB3sBF3acUnAwsIksEYjLeHL+TJv9jg+TmTwdyjnDex27jqEMakNKf3RwwPahDIt7QXCSqRQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.39.0.tgz", + "integrity": "sha512-6w9uMuza+LbLCVoNKL5FSLE7yvYkq9laSd09bwS0tMjkwXrmib/4KmoJcrKhLWHvw19mwU+33ndC69T7weNNjQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.39.0.tgz", + "integrity": "sha512-yAkUOkIKZlK5dl7u6dg897doBgLXmUHhIINM2c+sND3DZwnrdQkkSiDh7N75Ll4mM4dxSkYfXqU9fW3lLkMFug==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@shikijs/core": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-3.2.1.tgz", + "integrity": "sha512-FhsdxMWYu/C11sFisEp7FMGBtX/OSSbnXZDMBhGuUDBNTdsoZlMSgQv5f90rwvzWAdWIW6VobD+G3IrazxA6dQ==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.2.1", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4", + "hast-util-to-html": "^9.0.5" + } + }, + "node_modules/@shikijs/engine-javascript": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-3.2.1.tgz", + "integrity": "sha512-eMdcUzN3FMQYxOmRf2rmU8frikzoSHbQDFH2hIuXsrMO+IBOCI9BeeRkCiBkcLDHeRKbOCtYMJK3D6U32ooU9Q==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.2.1", + "@shikijs/vscode-textmate": "^10.0.2", + "oniguruma-to-es": "^4.1.0" + } + }, + "node_modules/@shikijs/engine-oniguruma": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.2.1.tgz", + "integrity": "sha512-wZZAkayEn6qu2+YjenEoFqj0OyQI64EWsNR6/71d1EkG4sxEOFooowKivsWPpaWNBu3sxAG+zPz5kzBL/SsreQ==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.2.1", + "@shikijs/vscode-textmate": "^10.0.2" + } + }, + "node_modules/@shikijs/langs": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-3.2.1.tgz", + "integrity": "sha512-If0iDHYRSGbihiA8+7uRsgb1er1Yj11pwpX1c6HLYnizDsKAw5iaT3JXj5ZpaimXSWky/IhxTm7C6nkiYVym+A==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.2.1" + } + }, + "node_modules/@shikijs/themes": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-3.2.1.tgz", + "integrity": "sha512-k5DKJUT8IldBvAm8WcrDT5+7GA7se6lLksR+2E3SvyqGTyFMzU2F9Gb7rmD+t+Pga1MKrYFxDIeyWjMZWM6uBQ==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.2.1" + } + }, + "node_modules/@shikijs/types": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.2.1.tgz", + "integrity": "sha512-/NTWAk4KE2M8uac0RhOsIhYQf4pdU0OywQuYDGIGAJ6Mjunxl2cGiuLkvu4HLCMn+OTTLRWkjZITp+aYJv60yA==", + "license": "MIT", + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + } + }, + "node_modules/@shikijs/vscode-textmate": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", + "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", + "license": "MIT" + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", + "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", + "license": "MIT" + }, + "node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/js-yaml": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.9.tgz", + "integrity": "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==", + "license": "MIT" + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdx": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz", + "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==", + "license": "MIT" + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "license": "MIT" + }, + "node_modules/@types/nlcst": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/nlcst/-/nlcst-2.0.3.tgz", + "integrity": "sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/node": { + "version": "22.14.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.14.0.tgz", + "integrity": "sha512-Kmpl+z84ILoG+3T/zQFyAJsU6EPTmOCj8/2+83fSN6djd6I4o7uOuGIH6vq3PrjY5BGitSbFuMN18j3iknubbA==", + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/sax": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz", + "integrity": "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "license": "ISC" + }, + "node_modules/acorn": { + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", + "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "license": "ISC", + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/ansi-align/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-align/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/ansi-align/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-align/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array-iterate": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/array-iterate/-/array-iterate-2.0.1.tgz", + "integrity": "sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/ast-types": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz", + "integrity": "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/astring": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", + "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==", + "license": "MIT", + "bin": { + "astring": "bin/astring" + } + }, + "node_modules/astro": { + "version": "5.5.6", + "resolved": "https://registry.npmjs.org/astro/-/astro-5.5.6.tgz", + "integrity": "sha512-SjU6zAlRe/gQrZ558Qhm211Yl8XOZBfjMpZig3XtQpG6zlyHJkElbWQIWXAVPzMg17cFVdv/qZPVHfcP2YOGGw==", + "license": "MIT", + "dependencies": { + "@astrojs/compiler": "^2.11.0", + "@astrojs/internal-helpers": "0.6.1", + "@astrojs/markdown-remark": "6.3.1", + "@astrojs/telemetry": "3.2.0", + "@oslojs/encoding": "^1.1.0", + "@rollup/pluginutils": "^5.1.4", + "acorn": "^8.14.1", + "aria-query": "^5.3.2", + "axobject-query": "^4.1.0", + "boxen": "8.0.1", + "ci-info": "^4.2.0", + "clsx": "^2.1.1", + "common-ancestor-path": "^1.0.1", + "cookie": "^1.0.2", + "cssesc": "^3.0.0", + "debug": "^4.4.0", + "deterministic-object-hash": "^2.0.2", + "devalue": "^5.1.1", + "diff": "^5.2.0", + "dlv": "^1.1.3", + "dset": "^3.1.4", + "es-module-lexer": "^1.6.0", + "esbuild": "^0.25.0", + "estree-walker": "^3.0.3", + "flattie": "^1.1.1", + "github-slugger": "^2.0.0", + "html-escaper": "3.0.3", + "http-cache-semantics": "^4.1.1", + "js-yaml": "^4.1.0", + "kleur": "^4.1.5", + "magic-string": "^0.30.17", + "magicast": "^0.3.5", + "mrmime": "^2.0.1", + "neotraverse": "^0.6.18", + "p-limit": "^6.2.0", + "p-queue": "^8.1.0", + "package-manager-detector": "^1.1.0", + "picomatch": "^4.0.2", + "prompts": "^2.4.2", + "rehype": "^13.0.2", + "semver": "^7.7.1", + "shiki": "^3.2.1", + "tinyexec": "^0.3.2", + "tinyglobby": "^0.2.12", + "tsconfck": "^3.1.5", + "ultrahtml": "^1.5.3", + "unist-util-visit": "^5.0.0", + "unstorage": "^1.15.0", + "vfile": "^6.0.3", + "vite": "^6.2.4", + "vitefu": "^1.0.6", + "xxhash-wasm": "^1.1.0", + "yargs-parser": "^21.1.1", + "yocto-spinner": "^0.2.1", + "zod": "^3.24.2", + "zod-to-json-schema": "^3.24.5", + "zod-to-ts": "^1.2.0" + }, + "bin": { + "astro": "astro.js" + }, + "engines": { + "node": "^18.17.1 || ^20.3.0 || >=22.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/astrodotbuild" + }, + "optionalDependencies": { + "sharp": "^0.33.3" + } + }, + "node_modules/astro-expressive-code": { + "version": "0.40.2", + "resolved": "https://registry.npmjs.org/astro-expressive-code/-/astro-expressive-code-0.40.2.tgz", + "integrity": "sha512-yJMQId0yXSAbW9I6yqvJ3FcjKzJ8zRL7elbJbllkv1ZJPlsI0NI83Pxn1YL1IapEM347EvOOkSW2GL+2+NO61w==", + "license": "MIT", + "dependencies": { + "rehype-expressive-code": "^0.40.2" + }, + "peerDependencies": { + "astro": "^4.0.0-beta || ^5.0.0-beta || ^3.3.0" + } + }, + "node_modules/astro-integration-kit": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/astro-integration-kit/-/astro-integration-kit-0.18.0.tgz", + "integrity": "sha512-Z0QW5IQjosuKQDEGYYkvUX6EhEtrmE4/oViqWz23QveV8U7AuyFsTdg00WRNPevWZl/5a4lLUeDpv4bCRynRRg==", + "license": "MIT", + "dependencies": { + "pathe": "^1.1.2", + "recast": "^0.23.7" + }, + "peerDependencies": { + "astro": "^4.12.0 || ^5.0.0" + } + }, + "node_modules/astro/node_modules/sharp": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz", + "integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==", + "hasInstallScript": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "color": "^4.2.3", + "detect-libc": "^2.0.3", + "semver": "^7.6.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.33.5", + "@img/sharp-darwin-x64": "0.33.5", + "@img/sharp-libvips-darwin-arm64": "1.0.4", + "@img/sharp-libvips-darwin-x64": "1.0.4", + "@img/sharp-libvips-linux-arm": "1.0.5", + "@img/sharp-libvips-linux-arm64": "1.0.4", + "@img/sharp-libvips-linux-s390x": "1.0.4", + "@img/sharp-libvips-linux-x64": "1.0.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", + "@img/sharp-libvips-linuxmusl-x64": "1.0.4", + "@img/sharp-linux-arm": "0.33.5", + "@img/sharp-linux-arm64": "0.33.5", + "@img/sharp-linux-s390x": "0.33.5", + "@img/sharp-linux-x64": "0.33.5", + "@img/sharp-linuxmusl-arm64": "0.33.5", + "@img/sharp-linuxmusl-x64": "0.33.5", + "@img/sharp-wasm32": "0.33.5", + "@img/sharp-win32-ia32": "0.33.5", + "@img/sharp-win32-x64": "0.33.5" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/b4a": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", + "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==", + "license": "Apache-2.0" + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/bare-events": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz", + "integrity": "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==", + "license": "Apache-2.0", + "optional": true + }, + "node_modules/bare-fs": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.0.2.tgz", + "integrity": "sha512-S5mmkMesiduMqnz51Bfh0Et9EX0aTCJxhsI4bvzFFLs8Z1AV8RDHadfY5CyLwdoLHgXbNBEN1gQcbEtGwuvixw==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-events": "^2.5.4", + "bare-path": "^3.0.0", + "bare-stream": "^2.6.4" + }, + "engines": { + "bare": ">=1.16.0" + }, + "peerDependencies": { + "bare-buffer": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + } + } + }, + "node_modules/bare-os": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.1.tgz", + "integrity": "sha512-uaIjxokhFidJP+bmmvKSgiMzj2sV5GPHaZVAIktcxcpCyBFFWO+YlikVAdhmUo2vYFvFhOXIAlldqV29L8126g==", + "license": "Apache-2.0", + "optional": true, + "engines": { + "bare": ">=1.14.0" + } + }, + "node_modules/bare-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", + "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-os": "^3.0.1" + } + }, + "node_modules/bare-stream": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.6.5.tgz", + "integrity": "sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "streamx": "^2.21.0" + }, + "peerDependencies": { + "bare-buffer": "*", + "bare-events": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + }, + "bare-events": { + "optional": true + } + } + }, + "node_modules/base-64": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base-64/-/base-64-1.0.0.tgz", + "integrity": "sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==", + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/bcp-47": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/bcp-47/-/bcp-47-2.1.0.tgz", + "integrity": "sha512-9IIS3UPrvIa1Ej+lVDdDwO7zLehjqsaByECw0bu2RRGP73jALm6FYbzI5gWbgHLvNdkvfXB5YrSbocZdOS0c0w==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/bcp-47-match": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/bcp-47-match/-/bcp-47-match-2.0.3.tgz", + "integrity": "sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "license": "ISC" + }, + "node_modules/boxen": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-8.0.1.tgz", + "integrity": "sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==", + "license": "MIT", + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^8.0.0", + "chalk": "^5.3.0", + "cli-boxes": "^3.0.0", + "string-width": "^7.2.0", + "type-fest": "^4.21.0", + "widest-line": "^5.0.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/camelcase": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-8.0.0.tgz", + "integrity": "sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chalk": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", + "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "license": "ISC" + }, + "node_modules/ci-info": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.2.0.tgz", + "integrity": "sha512-cYY9mypksY8NRqgDB1XD1RiJL338v/551niynFTGkZOO2LHuB2OmOYxDIe/ttN9AHwrqdum1360G3ald0W9kCg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-boxes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/collapse-white-space": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz", + "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "license": "MIT", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/common-ancestor-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz", + "integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==", + "license": "ISC" + }, + "node_modules/cookie": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz", + "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/cookie-es": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-1.2.2.tgz", + "integrity": "sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==", + "license": "MIT" + }, + "node_modules/crossws": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/crossws/-/crossws-0.3.4.tgz", + "integrity": "sha512-uj0O1ETYX1Bh6uSgktfPvwDiPYGQ3aI4qVsaC/LWpkIzGj1nUYm5FK3K+t11oOlpN01lGbprFCH4wBlKdJjVgw==", + "license": "MIT", + "dependencies": { + "uncrypto": "^0.1.3" + } + }, + "node_modules/css-selector-parser": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/css-selector-parser/-/css-selector-parser-3.1.1.tgz", + "integrity": "sha512-Y+DuvJ7JAjpL1f4DeILe5sXCC3kRXMl0DxM4lAWbS8/jEZ29o3V0L5TL6zIifj4Csmj6c+jiF2ENjida2OVOGA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ], + "license": "MIT" + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-named-character-reference": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.1.0.tgz", + "integrity": "sha512-Wy+JTSbFThEOXQIR2L6mxJvEs+veIzpmqD7ynWxMXGpnk3smkHQOp6forLdHsKpAMW9iJpaBBIxz285t1n1C3w==", + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/defu": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", + "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", + "license": "MIT" + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/destr": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.3.tgz", + "integrity": "sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==", + "license": "MIT" + }, + "node_modules/detect-libc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/deterministic-object-hash": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/deterministic-object-hash/-/deterministic-object-hash-2.0.2.tgz", + "integrity": "sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ==", + "license": "MIT", + "dependencies": { + "base-64": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/devalue": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.1.1.tgz", + "integrity": "sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw==", + "license": "MIT" + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/diff": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/direction": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/direction/-/direction-2.0.1.tgz", + "integrity": "sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA==", + "license": "MIT", + "bin": { + "direction": "cli.js" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "license": "MIT" + }, + "node_modules/dset": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/dset/-/dset-3.1.4.tgz", + "integrity": "sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/emoji-regex": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "license": "MIT" + }, + "node_modules/emoji-regex-xs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex-xs/-/emoji-regex-xs-1.0.0.tgz", + "integrity": "sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==", + "license": "MIT" + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/es-module-lexer": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", + "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==", + "license": "MIT" + }, + "node_modules/esast-util-from-estree": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz", + "integrity": "sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/esast-util-from-js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esast-util-from-js/-/esast-util-from-js-2.0.1.tgz", + "integrity": "sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "acorn": "^8.0.0", + "esast-util-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/esbuild": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.2.tgz", + "integrity": "sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.2", + "@esbuild/android-arm": "0.25.2", + "@esbuild/android-arm64": "0.25.2", + "@esbuild/android-x64": "0.25.2", + "@esbuild/darwin-arm64": "0.25.2", + "@esbuild/darwin-x64": "0.25.2", + "@esbuild/freebsd-arm64": "0.25.2", + "@esbuild/freebsd-x64": "0.25.2", + "@esbuild/linux-arm": "0.25.2", + "@esbuild/linux-arm64": "0.25.2", + "@esbuild/linux-ia32": "0.25.2", + "@esbuild/linux-loong64": "0.25.2", + "@esbuild/linux-mips64el": "0.25.2", + "@esbuild/linux-ppc64": "0.25.2", + "@esbuild/linux-riscv64": "0.25.2", + "@esbuild/linux-s390x": "0.25.2", + "@esbuild/linux-x64": "0.25.2", + "@esbuild/netbsd-arm64": "0.25.2", + "@esbuild/netbsd-x64": "0.25.2", + "@esbuild/openbsd-arm64": "0.25.2", + "@esbuild/openbsd-x64": "0.25.2", + "@esbuild/sunos-x64": "0.25.2", + "@esbuild/win32-arm64": "0.25.2", + "@esbuild/win32-ia32": "0.25.2", + "@esbuild/win32-x64": "0.25.2" + } + }, + "node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/estree-util-attach-comments": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz", + "integrity": "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-build-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz", + "integrity": "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-walker": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-is-identifier-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", + "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-scope": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/estree-util-scope/-/estree-util-scope-1.0.0.tgz", + "integrity": "sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-to-js": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz", + "integrity": "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "astring": "^1.8.0", + "source-map": "^0.7.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-visit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz", + "integrity": "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "license": "MIT" + }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "license": "(MIT OR WTFPL)", + "engines": { + "node": ">=6" + } + }, + "node_modules/expressive-code": { + "version": "0.40.2", + "resolved": "https://registry.npmjs.org/expressive-code/-/expressive-code-0.40.2.tgz", + "integrity": "sha512-1zIda2rB0qiDZACawzw2rbdBQiWHBT56uBctS+ezFe5XMAaFaHLnnSYND/Kd+dVzO9HfCXRDpzH3d+3fvOWRcw==", + "license": "MIT", + "dependencies": { + "@expressive-code/core": "^0.40.2", + "@expressive-code/plugin-frames": "^0.40.2", + "@expressive-code/plugin-shiki": "^0.40.2", + "@expressive-code/plugin-text-markers": "^0.40.2" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "license": "MIT" + }, + "node_modules/fdir": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.3.tgz", + "integrity": "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==", + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/flattie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flattie/-/flattie-1.1.1.tgz", + "integrity": "sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "license": "MIT" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz", + "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "license": "MIT" + }, + "node_modules/github-slugger": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", + "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==", + "license": "ISC" + }, + "node_modules/h3": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/h3/-/h3-1.15.1.tgz", + "integrity": "sha512-+ORaOBttdUm1E2Uu/obAyCguiI7MbBvsLTndc3gyK3zU+SYLoZXlyCP9Xgy0gikkGufFLTZXCXD6+4BsufnmHA==", + "license": "MIT", + "dependencies": { + "cookie-es": "^1.2.2", + "crossws": "^0.3.3", + "defu": "^6.1.4", + "destr": "^2.0.3", + "iron-webcrypto": "^1.2.1", + "node-mock-http": "^1.0.0", + "radix3": "^1.1.2", + "ufo": "^1.5.4", + "uncrypto": "^0.1.3" + } + }, + "node_modules/hast-util-embedded": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-embedded/-/hast-util-embedded-3.0.0.tgz", + "integrity": "sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-is-element": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-format": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hast-util-format/-/hast-util-format-1.1.0.tgz", + "integrity": "sha512-yY1UDz6bC9rDvCWHpx12aIBGRG7krurX0p0Fm6pT547LwDIZZiNr8a+IHDogorAdreULSEzP82Nlv5SZkHZcjA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-embedded": "^3.0.0", + "hast-util-minify-whitespace": "^1.0.0", + "hast-util-phrasing": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "html-whitespace-sensitive-tag-names": "^3.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-html": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-html/-/hast-util-from-html-2.0.3.tgz", + "integrity": "sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "devlop": "^1.1.0", + "hast-util-from-parse5": "^8.0.0", + "parse5": "^7.0.0", + "vfile": "^6.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz", + "integrity": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "hastscript": "^9.0.0", + "property-information": "^7.0.0", + "vfile": "^6.0.0", + "vfile-location": "^5.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-has-property": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-has-property/-/hast-util-has-property-3.0.0.tgz", + "integrity": "sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-is-body-ok-link": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/hast-util-is-body-ok-link/-/hast-util-is-body-ok-link-3.0.1.tgz", + "integrity": "sha512-0qpnzOBLztXHbHQenVB8uNuxTnm/QBFUOmdOSsEn7GnBtyY07+ENTWVFBAnXd/zEgd9/SUG3lRY7hSIBWRgGpQ==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-is-element": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz", + "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-minify-whitespace": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hast-util-minify-whitespace/-/hast-util-minify-whitespace-1.0.1.tgz", + "integrity": "sha512-L96fPOVpnclQE0xzdWb/D12VT5FabA7SnZOUMtL1DbXmYiHJMXZvFkIZfiMmTCNJHUeO2K9UYNXoVyfz+QHuOw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-embedded": "^3.0.0", + "hast-util-is-element": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", + "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-phrasing": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/hast-util-phrasing/-/hast-util-phrasing-3.0.1.tgz", + "integrity": "sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-embedded": "^3.0.0", + "hast-util-has-property": "^3.0.0", + "hast-util-is-body-ok-link": "^3.0.0", + "hast-util-is-element": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz", + "integrity": "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-from-parse5": "^8.0.0", + "hast-util-to-parse5": "^8.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "parse5": "^7.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-select": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/hast-util-select/-/hast-util-select-6.0.4.tgz", + "integrity": "sha512-RqGS1ZgI0MwxLaKLDxjprynNzINEkRHY2i8ln4DDjgv9ZhcYVIHN9rlpiYsqtFwrgpYU361SyWDQcGNIBVu3lw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "bcp-47-match": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "css-selector-parser": "^3.0.0", + "devlop": "^1.0.0", + "direction": "^2.0.0", + "hast-util-has-property": "^3.0.0", + "hast-util-to-string": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "nth-check": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-estree": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.3.tgz", + "integrity": "sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-attach-comments": "^3.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-html": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", + "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^3.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-jsx-runtime": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", + "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz", + "integrity": "sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5/node_modules/property-information": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", + "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hast-util-to-string": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/hast-util-to-string/-/hast-util-to-string-3.0.1.tgz", + "integrity": "sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-text": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-4.0.2.tgz", + "integrity": "sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "hast-util-is-element": "^3.0.0", + "unist-util-find-after": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz", + "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/html-escaper": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-3.0.3.tgz", + "integrity": "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==", + "license": "MIT" + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/html-whitespace-sensitive-tag-names": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/html-whitespace-sensitive-tag-names/-/html-whitespace-sensitive-tag-names-3.0.1.tgz", + "integrity": "sha512-q+310vW8zmymYHALr1da4HyXUQ0zgiIwIicEfotYPWGN0OJVEN/58IJ3A4GBYcEq3LGAZqKb+ugvP0GNB9CEAA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "license": "BSD-2-Clause" + }, + "node_modules/i18next": { + "version": "23.16.8", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.16.8.tgz", + "integrity": "sha512-06r/TitrM88Mg5FdUXAKL96dJMzgqLE5dv3ryBAra4KCwD9mJ4ndOTS95ZuymIGoE+2hzfdaMak2X11/es7ZWg==", + "funding": [ + { + "type": "individual", + "url": "https://locize.com" + }, + { + "type": "individual", + "url": "https://locize.com/i18next.html" + }, + { + "type": "individual", + "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" + } + ], + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.2" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/import-meta-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", + "integrity": "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" + }, + "node_modules/inline-style-parser": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.4.tgz", + "integrity": "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==", + "license": "MIT" + }, + "node_modules/iron-webcrypto": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/iron-webcrypto/-/iron-webcrypto-1.2.1.tgz", + "integrity": "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/brc-dd" + } + }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "license": "MIT" + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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==", + "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-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-wsl": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/klona": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" + }, + "node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/magicast": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.5.tgz", + "integrity": "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.25.4", + "@babel/types": "^7.25.4", + "source-map-js": "^1.2.0" + } + }, + "node_modules/markdown-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz", + "integrity": "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/markdown-table": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", + "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-definitions": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-6.0.0.tgz", + "integrity": "sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-directive": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-3.1.0.tgz", + "integrity": "sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", + "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", + "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", + "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", + "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz", + "integrity": "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", + "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", + "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", + "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", + "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-directive": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-3.0.2.tgz", + "integrity": "sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "parse-entities": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "license": "MIT", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", + "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", + "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", + "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", + "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdx-expression": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.1.tgz", + "integrity": "sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-jsx": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.2.tgz", + "integrity": "sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdx-md": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz", + "integrity": "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz", + "integrity": "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==", + "license": "MIT", + "dependencies": { + "acorn": "^8.0.0", + "acorn-jsx": "^5.0.0", + "micromark-extension-mdx-expression": "^3.0.0", + "micromark-extension-mdx-jsx": "^3.0.0", + "micromark-extension-mdx-md": "^2.0.0", + "micromark-extension-mdxjs-esm": "^3.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs-esm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz", + "integrity": "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-mdx-expression": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.3.tgz", + "integrity": "sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-events-to-acorn": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.3.tgz", + "integrity": "sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "license": "MIT" + }, + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/napi-build-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", + "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==", + "license": "MIT" + }, + "node_modules/neotraverse": { + "version": "0.6.18", + "resolved": "https://registry.npmjs.org/neotraverse/-/neotraverse-0.6.18.tgz", + "integrity": "sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/nlcst-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/nlcst-to-string/-/nlcst-to-string-4.0.0.tgz", + "integrity": "sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/node-abi": { + "version": "3.74.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.74.0.tgz", + "integrity": "sha512-c5XK0MjkGBrQPGYG24GBADZud0NCbznxNx0ZkS+ebUTrmV1qTDxPxSL8zEAPURXSbLRWVexxmP4986BziahL5w==", + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-addon-api": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", + "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==", + "license": "MIT" + }, + "node_modules/node-fetch-native": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.6.tgz", + "integrity": "sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ==", + "license": "MIT" + }, + "node_modules/node-mock-http": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-mock-http/-/node-mock-http-1.0.0.tgz", + "integrity": "sha512-0uGYQ1WQL1M5kKvGRXWQ3uZCHtLTO8hln3oBjIusM75WoesZ909uQJs/Hb946i2SS+Gsrhkaa6iAO17jRIv6DQ==", + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/ofetch": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-1.4.1.tgz", + "integrity": "sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw==", + "license": "MIT", + "dependencies": { + "destr": "^2.0.3", + "node-fetch-native": "^1.6.4", + "ufo": "^1.5.4" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/oniguruma-parser": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.5.4.tgz", + "integrity": "sha512-yNxcQ8sKvURiTwP0mV6bLQCYE7NKfKRRWunhbZnXgxSmB1OXa1lHrN3o4DZd+0Si0kU5blidK7BcROO8qv5TZA==", + "license": "MIT" + }, + "node_modules/oniguruma-to-es": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.1.0.tgz", + "integrity": "sha512-SNwG909cSLo4vPyyPbU/VJkEc9WOXqu2ycBlfd1UCXLqk1IijcQktSBb2yRQ2UFPsDhpkaf+C1dtT3PkLK/yWA==", + "license": "MIT", + "dependencies": { + "emoji-regex-xs": "^1.0.0", + "oniguruma-parser": "^0.5.4", + "regex": "^6.0.1", + "regex-recursion": "^6.0.2" + } + }, + "node_modules/p-limit": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-6.2.0.tgz", + "integrity": "sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA==", + "license": "MIT", + "dependencies": { + "yocto-queue": "^1.1.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-queue": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-8.1.0.tgz", + "integrity": "sha512-mxLDbbGIBEXTJL0zEx8JIylaj3xQ7Z/7eEVjcF9fJX4DBiH9oqe+oahYnlKKxm0Ci9TlWTyhSHgygxMxjIB2jw==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^5.0.1", + "p-timeout": "^6.1.2" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-timeout": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.4.tgz", + "integrity": "sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-manager-detector": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.1.0.tgz", + "integrity": "sha512-Y8f9qUlBzW8qauJjd/eu6jlpJZsuPJm2ZAV0cDVd420o4EdpH5RPdoCv+60/TdJflGatr4sDfpAL6ArWZbM5tA==", + "license": "MIT" + }, + "node_modules/pagefind": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/pagefind/-/pagefind-1.3.0.tgz", + "integrity": "sha512-8KPLGT5g9s+olKMRTU9LFekLizkVIu9tes90O1/aigJ0T5LmyPqTzGJrETnSw3meSYg58YH7JTzhTTW/3z6VAw==", + "license": "MIT", + "bin": { + "pagefind": "lib/runner/bin.cjs" + }, + "optionalDependencies": { + "@pagefind/darwin-arm64": "1.3.0", + "@pagefind/darwin-x64": "1.3.0", + "@pagefind/linux-arm64": "1.3.0", + "@pagefind/linux-x64": "1.3.0", + "@pagefind/windows-x64": "1.3.0" + } + }, + "node_modules/parse-entities": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", + "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" + }, + "node_modules/parse-latin": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse-latin/-/parse-latin-7.0.0.tgz", + "integrity": "sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "@types/unist": "^3.0.0", + "nlcst-to-string": "^4.0.0", + "unist-util-modify-children": "^4.0.0", + "unist-util-visit-children": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse5": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", + "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", + "license": "MIT", + "dependencies": { + "entities": "^4.5.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", + "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/prebuild-install": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", + "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", + "license": "MIT", + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^2.0.0", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/prebuild-install/node_modules/tar-fs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.2.tgz", + "integrity": "sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==", + "license": "MIT", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/prebuild-install/node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "license": "MIT", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/prismjs": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", + "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prompts/node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/property-information": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.0.0.tgz", + "integrity": "sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/pump": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", + "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/radix3": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/radix3/-/radix3-1.1.2.tgz", + "integrity": "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==", + "license": "MIT" + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/recast": { + "version": "0.23.11", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.11.tgz", + "integrity": "sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==", + "license": "MIT", + "dependencies": { + "ast-types": "^0.16.1", + "esprima": "~4.0.0", + "source-map": "~0.6.1", + "tiny-invariant": "^1.3.3", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/recast/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/recma-build-jsx": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-build-jsx/-/recma-build-jsx-1.0.0.tgz", + "integrity": "sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-util-build-jsx": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/recma-jsx": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-jsx/-/recma-jsx-1.0.0.tgz", + "integrity": "sha512-5vwkv65qWwYxg+Atz95acp8DMu1JDSqdGkA2Of1j6rCreyFUE/gp15fC8MnGEuG1W68UKjM6x6+YTWIh7hZM/Q==", + "license": "MIT", + "dependencies": { + "acorn-jsx": "^5.0.0", + "estree-util-to-js": "^2.0.0", + "recma-parse": "^1.0.0", + "recma-stringify": "^1.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/recma-parse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-parse/-/recma-parse-1.0.0.tgz", + "integrity": "sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "esast-util-from-js": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/recma-stringify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-stringify/-/recma-stringify-1.0.0.tgz", + "integrity": "sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-util-to-js": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "license": "MIT" + }, + "node_modules/regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/regex/-/regex-6.0.1.tgz", + "integrity": "sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA==", + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-recursion": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz", + "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==", + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-utilities": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", + "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", + "license": "MIT" + }, + "node_modules/rehype": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/rehype/-/rehype-13.0.2.tgz", + "integrity": "sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "rehype-parse": "^9.0.0", + "rehype-stringify": "^10.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-expressive-code": { + "version": "0.40.2", + "resolved": "https://registry.npmjs.org/rehype-expressive-code/-/rehype-expressive-code-0.40.2.tgz", + "integrity": "sha512-+kn+AMGCrGzvtH8Q5lC6Y5lnmTV/r33fdmi5QU/IH1KPHKobKr5UnLwJuqHv5jBTSN/0v2wLDS7RTM73FVzqmQ==", + "license": "MIT", + "dependencies": { + "expressive-code": "^0.40.2" + } + }, + "node_modules/rehype-format": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/rehype-format/-/rehype-format-5.0.1.tgz", + "integrity": "sha512-zvmVru9uB0josBVpr946OR8ui7nJEdzZobwLOOqHb/OOD88W0Vk2SqLwoVOj0fM6IPCCO6TaV9CvQvJMWwukFQ==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-format": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-parse": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-9.0.1.tgz", + "integrity": "sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-from-html": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-raw": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", + "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-raw": "^9.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-recma": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rehype-recma/-/rehype-recma-1.0.0.tgz", + "integrity": "sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "hast-util-to-estree": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-stringify": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-10.0.1.tgz", + "integrity": "sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-to-html": "^9.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-directive": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/remark-directive/-/remark-directive-3.0.1.tgz", + "integrity": "sha512-gwglrEQEZcZYgVyG1tQuA+h58EZfq5CSULw7J90AFuCTyib1thgHPoqQ+h9iFvU6R+vnZ5oNFQR5QKgGpk741A==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-directive": "^3.0.0", + "micromark-extension-directive": "^3.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-gfm": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", + "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-gfm": "^3.0.0", + "micromark-extension-gfm": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-mdx": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.1.0.tgz", + "integrity": "sha512-Ngl/H3YXyBV9RcRNdlYsZujAmhsxwzxpDzpDEhFBVAGthS4GDgnctpDjgFl/ULx5UEDzqtW1cyBSNKqYYrqLBA==", + "license": "MIT", + "dependencies": { + "mdast-util-mdx": "^3.0.0", + "micromark-extension-mdxjs": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", + "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-smartypants": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/remark-smartypants/-/remark-smartypants-3.0.2.tgz", + "integrity": "sha512-ILTWeOriIluwEvPjv67v7Blgrcx+LZOkAUVtKI3putuhlZm84FnqDORNXPPm+HY3NdZOMhyDwZ1E+eZB/Df5dA==", + "license": "MIT", + "dependencies": { + "retext": "^9.0.0", + "retext-smartypants": "^6.0.0", + "unified": "^11.0.4", + "unist-util-visit": "^5.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/remark-stringify": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", + "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-to-markdown": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/retext/-/retext-9.0.0.tgz", + "integrity": "sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "retext-latin": "^4.0.0", + "retext-stringify": "^4.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-latin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/retext-latin/-/retext-latin-4.0.0.tgz", + "integrity": "sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "parse-latin": "^7.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-smartypants": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/retext-smartypants/-/retext-smartypants-6.2.0.tgz", + "integrity": "sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ==", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "nlcst-to-string": "^4.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-stringify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/retext-stringify/-/retext-stringify-4.0.0.tgz", + "integrity": "sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA==", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "nlcst-to-string": "^4.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rollup": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.39.0.tgz", + "integrity": "sha512-thI8kNc02yNvnmJp8dr3fNWJ9tCONDhp6TV35X6HkKGGs9E6q7YWCHbe5vKiTa7TAiNcFEmXKj3X/pG2b3ci0g==", + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.7" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.39.0", + "@rollup/rollup-android-arm64": "4.39.0", + "@rollup/rollup-darwin-arm64": "4.39.0", + "@rollup/rollup-darwin-x64": "4.39.0", + "@rollup/rollup-freebsd-arm64": "4.39.0", + "@rollup/rollup-freebsd-x64": "4.39.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.39.0", + "@rollup/rollup-linux-arm-musleabihf": "4.39.0", + "@rollup/rollup-linux-arm64-gnu": "4.39.0", + "@rollup/rollup-linux-arm64-musl": "4.39.0", + "@rollup/rollup-linux-loongarch64-gnu": "4.39.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.39.0", + "@rollup/rollup-linux-riscv64-gnu": "4.39.0", + "@rollup/rollup-linux-riscv64-musl": "4.39.0", + "@rollup/rollup-linux-s390x-gnu": "4.39.0", + "@rollup/rollup-linux-x64-gnu": "4.39.0", + "@rollup/rollup-linux-x64-musl": "4.39.0", + "@rollup/rollup-win32-arm64-msvc": "4.39.0", + "@rollup/rollup-win32-ia32-msvc": "4.39.0", + "@rollup/rollup-win32-x64-msvc": "4.39.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/sax": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", + "license": "ISC" + }, + "node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sharp": { + "version": "0.32.6", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.32.6.tgz", + "integrity": "sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "color": "^4.2.3", + "detect-libc": "^2.0.2", + "node-addon-api": "^6.1.0", + "prebuild-install": "^7.1.1", + "semver": "^7.5.4", + "simple-get": "^4.0.1", + "tar-fs": "^3.0.4", + "tunnel-agent": "^0.6.0" + }, + "engines": { + "node": ">=14.15.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/shiki": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-3.2.1.tgz", + "integrity": "sha512-VML/2o1/KGYkEf/stJJ+s9Ypn7jUKQPomGLGYso4JJFMFxVDyPNsjsI3MB3KLjlMOeH44gyaPdXC6rik2WXvUQ==", + "license": "MIT", + "dependencies": { + "@shikijs/core": "3.2.1", + "@shikijs/engine-javascript": "3.2.1", + "@shikijs/engine-oniguruma": "3.2.1", + "@shikijs/langs": "3.2.1", + "@shikijs/themes": "3.2.1", + "@shikijs/types": "3.2.1", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + } + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "license": "MIT" + }, + "node_modules/sitemap": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-8.0.0.tgz", + "integrity": "sha512-+AbdxhM9kJsHtruUF39bwS/B0Fytw6Fr1o4ZAIAEqA6cke2xcoO2GleBw9Zw7nRzILVEgz7zBM5GiTJjie1G9A==", + "license": "MIT", + "dependencies": { + "@types/node": "^17.0.5", + "@types/sax": "^1.2.1", + "arg": "^5.0.0", + "sax": "^1.2.4" + }, + "bin": { + "sitemap": "dist/cli.js" + }, + "engines": { + "node": ">=14.0.0", + "npm": ">=6.0.0" + } + }, + "node_modules/sitemap/node_modules/@types/node": { + "version": "17.0.45", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", + "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==", + "license": "MIT" + }, + "node_modules/smol-toml": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.3.1.tgz", + "integrity": "sha512-tEYNll18pPKHroYSmLLrksq233j021G0giwW7P3D24jC54pQ5W5BXMsQ/Mvw1OJCmEYDgY+lrzT+3nNUtoNfXQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 18" + }, + "funding": { + "url": "https://github.com/sponsors/cyyynthia" + } + }, + "node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 8" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/stream-replace-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/stream-replace-string/-/stream-replace-string-2.0.0.tgz", + "integrity": "sha512-TlnjJ1C0QrmxRNrON00JvaFFlNh5TTG00APw23j74ET7gkQpTASi6/L2fuiav8pzK715HXtUeClpBTw2NPSn6w==", + "license": "MIT" + }, + "node_modules/streamx": { + "version": "2.22.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.0.tgz", + "integrity": "sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==", + "license": "MIT", + "dependencies": { + "fast-fifo": "^1.3.2", + "text-decoder": "^1.1.0" + }, + "optionalDependencies": { + "bare-events": "^2.2.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "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==", + "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/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/style-to-js": { + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.16.tgz", + "integrity": "sha512-/Q6ld50hKYPH3d/r6nr117TZkHR0w0kGGIVfpG9N6D8NymRPM9RqCUv4pRpJ62E5DqOYx2AFpbZMyCPnjQCnOw==", + "license": "MIT", + "dependencies": { + "style-to-object": "1.0.8" + } + }, + "node_modules/style-to-object": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.8.tgz", + "integrity": "sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==", + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.2.4" + } + }, + "node_modules/tar-fs": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.8.tgz", + "integrity": "sha512-ZoROL70jptorGAlgAYiLoBLItEKw/fUxg9BSYK/dF/GAGYFJOJJJMvjPAKDJraCXFwadD456FCuvLWgfhMsPwg==", + "license": "MIT", + "dependencies": { + "pump": "^3.0.0", + "tar-stream": "^3.1.5" + }, + "optionalDependencies": { + "bare-fs": "^4.0.1", + "bare-path": "^3.0.0" + } + }, + "node_modules/tar-stream": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", + "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "license": "MIT", + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "node_modules/text-decoder": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", + "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", + "license": "Apache-2.0", + "dependencies": { + "b4a": "^1.6.4" + } + }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.12.tgz", + "integrity": "sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==", + "license": "MIT", + "dependencies": { + "fdir": "^6.4.3", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/tsconfck": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.5.tgz", + "integrity": "sha512-CLDfGgUp7XPswWnezWwsCRxNmgQjhYq3VXHM0/XIRxhVrKw0M1if9agzryh1QS3nxjCROvV+xWxoJO1YctzzWg==", + "license": "MIT", + "bin": { + "tsconfck": "bin/tsconfck.js" + }, + "engines": { + "node": "^18 || >=20" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/type-fest": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.39.0.tgz", + "integrity": "sha512-w2IGJU1tIgcrepg9ZJ82d8UmItNQtOFJG0HCUE3SzMokKkTsruVDALl2fAdiEzJlfduoU+VyXJWIIUZ+6jV+nw==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.8.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz", + "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==", + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ufo": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.4.tgz", + "integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==", + "license": "MIT" + }, + "node_modules/ultrahtml": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/ultrahtml/-/ultrahtml-1.5.3.tgz", + "integrity": "sha512-GykOvZwgDWZlTQMtp5jrD4BVL+gNn2NVlVafjcFUJ7taY20tqYdwdoWBFy6GBJsNTZe1GkGPkSl5knQAjtgceg==", + "license": "MIT" + }, + "node_modules/uncrypto": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/uncrypto/-/uncrypto-0.1.3.tgz", + "integrity": "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==", + "license": "MIT" + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "license": "MIT" + }, + "node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-find-after": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-5.0.0.tgz", + "integrity": "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-modify-children": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-modify-children/-/unist-util-modify-children-4.0.0.tgz", + "integrity": "sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "array-iterate": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position-from-estree": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz", + "integrity": "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz", + "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-children": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit-children/-/unist-util-visit-children-3.0.0.tgz", + "integrity": "sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unstorage": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.15.0.tgz", + "integrity": "sha512-m40eHdGY/gA6xAPqo8eaxqXgBuzQTlAKfmB1iF7oCKXE1HfwHwzDJBywK+qQGn52dta+bPlZluPF7++yR3p/bg==", + "license": "MIT", + "dependencies": { + "anymatch": "^3.1.3", + "chokidar": "^4.0.3", + "destr": "^2.0.3", + "h3": "^1.15.0", + "lru-cache": "^10.4.3", + "node-fetch-native": "^1.6.6", + "ofetch": "^1.4.1", + "ufo": "^1.5.4" + }, + "peerDependencies": { + "@azure/app-configuration": "^1.8.0", + "@azure/cosmos": "^4.2.0", + "@azure/data-tables": "^13.3.0", + "@azure/identity": "^4.6.0", + "@azure/keyvault-secrets": "^4.9.0", + "@azure/storage-blob": "^12.26.0", + "@capacitor/preferences": "^6.0.3", + "@deno/kv": ">=0.9.0", + "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0", + "@planetscale/database": "^1.19.0", + "@upstash/redis": "^1.34.3", + "@vercel/blob": ">=0.27.1", + "@vercel/kv": "^1.0.1", + "aws4fetch": "^1.0.20", + "db0": ">=0.2.1", + "idb-keyval": "^6.2.1", + "ioredis": "^5.4.2", + "uploadthing": "^7.4.4" + }, + "peerDependenciesMeta": { + "@azure/app-configuration": { + "optional": true + }, + "@azure/cosmos": { + "optional": true + }, + "@azure/data-tables": { + "optional": true + }, + "@azure/identity": { + "optional": true + }, + "@azure/keyvault-secrets": { + "optional": true + }, + "@azure/storage-blob": { + "optional": true + }, + "@capacitor/preferences": { + "optional": true + }, + "@deno/kv": { + "optional": true + }, + "@netlify/blobs": { + "optional": true + }, + "@planetscale/database": { + "optional": true + }, + "@upstash/redis": { + "optional": true + }, + "@vercel/blob": { + "optional": true + }, + "@vercel/kv": { + "optional": true + }, + "aws4fetch": { + "optional": true + }, + "db0": { + "optional": true + }, + "idb-keyval": { + "optional": true + }, + "ioredis": { + "optional": true + }, + "uploadthing": { + "optional": true + } + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz", + "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vite": { + "version": "6.2.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.4.tgz", + "integrity": "sha512-veHMSew8CcRzhL5o8ONjy8gkfmFJAd5Ac16oxBUjlwgX3Gq2Wqr+qNC3TjPIpy7TPV/KporLga5GT9HqdrCizw==", + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "postcss": "^8.5.3", + "rollup": "^4.30.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vitefu": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.0.6.tgz", + "integrity": "sha512-+Rex1GlappUyNN6UfwbVZne/9cYC4+R2XDk9xkNXBKMw6HQagdX9PgZ8V2v1WUSK1wfBLp7qbI1+XSNIlB1xmA==", + "license": "MIT", + "workspaces": [ + "tests/deps/*", + "tests/projects/*" + ], + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/web-namespaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/which-pm-runs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.1.0.tgz", + "integrity": "sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/widest-line": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-5.0.0.tgz", + "integrity": "sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==", + "license": "MIT", + "dependencies": { + "string-width": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wrap-ansi": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "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/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/xxhash-wasm": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/xxhash-wasm/-/xxhash-wasm-1.1.0.tgz", + "integrity": "sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==", + "license": "MIT" + }, + "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==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.1.tgz", + "integrity": "sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==", + "license": "MIT", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yocto-spinner": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/yocto-spinner/-/yocto-spinner-0.2.1.tgz", + "integrity": "sha512-lHHxjh0bXaLgdJy3cNnVb/F9myx3CkhrvSOEVTkaUgNMXnYFa2xYPVhtGnqhh3jErY2gParBOHallCbc7NrlZQ==", + "license": "MIT", + "dependencies": { + "yoctocolors": "^2.1.1" + }, + "engines": { + "node": ">=18.19" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yoctocolors": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.1.tgz", + "integrity": "sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "3.24.2", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.2.tgz", + "integrity": "sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-to-json-schema": { + "version": "3.24.5", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.5.tgz", + "integrity": "sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==", + "license": "ISC", + "peerDependencies": { + "zod": "^3.24.1" + } + }, + "node_modules/zod-to-ts": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/zod-to-ts/-/zod-to-ts-1.2.0.tgz", + "integrity": "sha512-x30XE43V+InwGpvTySRNz9kB7qFU8DlyEy7BsSTCHPH1R0QasMmHWZDCzYm6bVXtj/9NNJAZF3jW8rzFvH5OFA==", + "peerDependencies": { + "typescript": "^4.9.4 || ^5.0.2", + "zod": "^3" + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/package.json b/package.json index 40b16a76c9..7cae081d78 100644 --- a/package.json +++ b/package.json @@ -1,20 +1,19 @@ { - "name": "", + "name": "gin", "type": "module", "version": "0.0.1", "scripts": { "dev": "astro dev", "start": "astro dev", - "build": "astro check && astro build", + "build": "astro build", "preview": "astro preview", "astro": "astro" }, "dependencies": { - "@astrojs/check": "^0.9.3", - "@astrojs/starlight": "^0.27.1", - "@lorenzo_lewis/starlight-utils": "^0.1.2", - "astro": "^4.15.3", - "sharp": "^0.32.5", - "typescript": "^5.6.2" + "@astrojs/sitemap": "^3.3.0", + "@astrojs/starlight": "^0.32.5", + "@lorenzo_lewis/starlight-utils": "^0.3.2", + "astro": "^5.5.3", + "sharp": "^0.32.5" } -} \ No newline at end of file +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml deleted file mode 100644 index 6c437ed4bd..0000000000 --- a/pnpm-lock.yaml +++ /dev/null @@ -1,5316 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: - dependencies: - '@astrojs/check': - specifier: ^0.9.3 - version: 0.9.3(typescript@5.6.2) - '@astrojs/starlight': - specifier: ^0.27.1 - version: 0.27.1(astro@4.15.5(rollup@4.21.3)(typescript@5.6.2)) - '@lorenzo_lewis/starlight-utils': - specifier: ^0.1.2 - version: 0.1.2(@astrojs/starlight@0.27.1(astro@4.15.5(rollup@4.21.3)(typescript@5.6.2)))(astro@4.15.5(rollup@4.21.3)(typescript@5.6.2)) - astro: - specifier: ^4.15.3 - version: 4.15.5(rollup@4.21.3)(typescript@5.6.2) - sharp: - specifier: ^0.32.5 - version: 0.32.6 - typescript: - specifier: ^5.6.2 - version: 5.6.2 - -packages: - - '@ampproject/remapping@2.3.0': - resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} - engines: {node: '>=6.0.0'} - - '@astrojs/check@0.9.3': - resolution: {integrity: sha512-I6Dz45bMI5YRbp4yK2LKWsHH3/kkHRGdPGruGkLap6pqxhdcNh7oCgN04Ac+haDfc9ow5BYPGPmEhkwef15GQQ==} - hasBin: true - peerDependencies: - typescript: ^5.0.0 - - '@astrojs/compiler@2.10.3': - resolution: {integrity: sha512-bL/O7YBxsFt55YHU021oL+xz+B/9HvGNId3F9xURN16aeqDK9juHGktdkCSXz+U4nqFACq6ZFvWomOzhV+zfPw==} - - '@astrojs/internal-helpers@0.4.1': - resolution: {integrity: sha512-bMf9jFihO8YP940uD70SI/RDzIhUHJAolWVcO1v5PUivxGKvfLZTLTVVxEYzGYyPsA3ivdLNqMnL5VgmQySa+g==} - - '@astrojs/language-server@2.14.2': - resolution: {integrity: sha512-daUJ/+/2pPF3eGG4tVdXKyw0tabUDrJKwLzU8VTuNhEHIn3VZAIES6VT3+mX0lmKcMiKM8/bjZdfY+fPfmnsMA==} - hasBin: true - peerDependencies: - prettier: ^3.0.0 - prettier-plugin-astro: '>=0.11.0' - peerDependenciesMeta: - prettier: - optional: true - prettier-plugin-astro: - optional: true - - '@astrojs/markdown-remark@5.2.0': - resolution: {integrity: sha512-vWGM24KZXz11jR3JO+oqYU3T2qpuOi4uGivJ9SQLCAI01+vEkHC60YJMRvHPc+hwd60F7euNs1PeOEixIIiNQw==} - - '@astrojs/mdx@3.1.6': - resolution: {integrity: sha512-YCEIvNgoQG3oVhe9codH4TX6zjvkl7KGla19yZO5RCnvjv2d9zyrfWqJ98I6/m18PbEY3k8Wjvha0IIf5eZ2sQ==} - engines: {node: ^18.17.1 || ^20.3.0 || >=21.0.0} - peerDependencies: - astro: ^4.8.0 - - '@astrojs/prism@3.1.0': - resolution: {integrity: sha512-Z9IYjuXSArkAUx3N6xj6+Bnvx8OdUSHA8YoOgyepp3+zJmtVYJIl/I18GozdJVW1p5u/CNpl3Km7/gwTJK85cw==} - engines: {node: ^18.17.1 || ^20.3.0 || >=21.0.0} - - '@astrojs/sitemap@3.1.6': - resolution: {integrity: sha512-1Qp2NvAzVImqA6y+LubKi1DVhve/hXXgFvB0szxiipzh7BvtuKe4oJJ9dXSqaubaTkt4nMa6dv6RCCAYeB6xaQ==} - - '@astrojs/starlight@0.27.1': - resolution: {integrity: sha512-L2hEgN/Tk7tfBDeaqUOgOpey5NcUL78FuQa06iNxyZ6RjyYyuXSniOoFxZYIo5PpY9O1dLdK22PkZyCDpO729g==} - peerDependencies: - astro: ^4.8.6 - - '@astrojs/telemetry@3.1.0': - resolution: {integrity: sha512-/ca/+D8MIKEC8/A9cSaPUqQNZm+Es/ZinRv0ZAzvu2ios7POQSsVD+VOj7/hypWNsNM3T7RpfgNq7H2TU1KEHA==} - engines: {node: ^18.17.1 || ^20.3.0 || >=21.0.0} - - '@astrojs/yaml2ts@0.2.1': - resolution: {integrity: sha512-CBaNwDQJz20E5WxzQh4thLVfhB3JEEGz72wRA+oJp6fQR37QLAqXZJU0mHC+yqMOQ6oj0GfRPJrz6hjf+zm6zA==} - - '@babel/code-frame@7.24.7': - resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} - engines: {node: '>=6.9.0'} - - '@babel/compat-data@7.25.4': - resolution: {integrity: sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==} - engines: {node: '>=6.9.0'} - - '@babel/core@7.25.2': - resolution: {integrity: sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==} - engines: {node: '>=6.9.0'} - - '@babel/generator@7.25.6': - resolution: {integrity: sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-annotate-as-pure@7.24.7': - resolution: {integrity: sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==} - engines: {node: '>=6.9.0'} - - '@babel/helper-compilation-targets@7.25.2': - resolution: {integrity: sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-module-imports@7.24.7': - resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} - engines: {node: '>=6.9.0'} - - '@babel/helper-module-transforms@7.25.2': - resolution: {integrity: sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-plugin-utils@7.24.8': - resolution: {integrity: sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==} - engines: {node: '>=6.9.0'} - - '@babel/helper-simple-access@7.24.7': - resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} - engines: {node: '>=6.9.0'} - - '@babel/helper-string-parser@7.24.8': - resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-identifier@7.24.7': - resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-option@7.24.8': - resolution: {integrity: sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==} - engines: {node: '>=6.9.0'} - - '@babel/helpers@7.25.6': - resolution: {integrity: sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q==} - engines: {node: '>=6.9.0'} - - '@babel/highlight@7.24.7': - resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} - engines: {node: '>=6.9.0'} - - '@babel/parser@7.25.6': - resolution: {integrity: sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==} - engines: {node: '>=6.0.0'} - hasBin: true - - '@babel/plugin-syntax-jsx@7.24.7': - resolution: {integrity: sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-react-jsx@7.25.2': - resolution: {integrity: sha512-KQsqEAVBpU82NM/B/N9j9WOdphom1SZH3R+2V7INrQUH+V9EBFwZsEJl8eBIVeQE62FxJCc70jzEZwqU7RcVqA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/template@7.25.0': - resolution: {integrity: sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==} - engines: {node: '>=6.9.0'} - - '@babel/traverse@7.25.6': - resolution: {integrity: sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==} - engines: {node: '>=6.9.0'} - - '@babel/types@7.25.6': - resolution: {integrity: sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==} - engines: {node: '>=6.9.0'} - - '@ctrl/tinycolor@4.1.0': - resolution: {integrity: sha512-WyOx8cJQ+FQus4Mm4uPIZA64gbk3Wxh0so5Lcii0aJifqwoVOlfFtorjLE0Hen4OYyHZMXDWqMmaQemBhgxFRQ==} - engines: {node: '>=14'} - - '@emmetio/abbreviation@2.3.3': - resolution: {integrity: sha512-mgv58UrU3rh4YgbE/TzgLQwJ3pFsHHhCLqY20aJq+9comytTXUDNGG/SMtSeMJdkpxgXSXunBGLD8Boka3JyVA==} - - '@emmetio/css-abbreviation@2.1.8': - resolution: {integrity: sha512-s9yjhJ6saOO/uk1V74eifykk2CBYi01STTK3WlXWGOepyKa23ymJ053+DNQjpFcy1ingpaO7AxCcwLvHFY9tuw==} - - '@emmetio/css-parser@0.4.0': - resolution: {integrity: sha512-z7wkxRSZgrQHXVzObGkXG+Vmj3uRlpM11oCZ9pbaz0nFejvCDmAiNDpY75+wgXOcffKpj4rzGtwGaZxfJKsJxw==} - - '@emmetio/html-matcher@1.3.0': - resolution: {integrity: sha512-NTbsvppE5eVyBMuyGfVu2CRrLvo7J4YHb6t9sBFLyY03WYhXET37qA4zOYUjBWFCRHO7pS1B9khERtY0f5JXPQ==} - - '@emmetio/scanner@1.0.4': - resolution: {integrity: sha512-IqRuJtQff7YHHBk4G8YZ45uB9BaAGcwQeVzgj/zj8/UdOhtQpEIupUhSk8dys6spFIWVZVeK20CzGEnqR5SbqA==} - - '@emmetio/stream-reader-utils@0.1.0': - resolution: {integrity: sha512-ZsZ2I9Vzso3Ho/pjZFsmmZ++FWeEd/txqybHTm4OgaZzdS8V9V/YYWQwg5TC38Z7uLWUV1vavpLLbjJtKubR1A==} - - '@emmetio/stream-reader@2.2.0': - resolution: {integrity: sha512-fXVXEyFA5Yv3M3n8sUGT7+fvecGrZP4k6FnWWMSZVQf69kAq0LLpaBQLGcPR30m3zMmKYhECP4k/ZkzvhEW5kw==} - - '@emnapi/runtime@1.2.0': - resolution: {integrity: sha512-bV21/9LQmcQeCPEg3BDFtvwL6cwiTMksYNWQQ4KOxCZikEGalWtenoZ0wCiukJINlGCIi2KXx01g4FoH/LxpzQ==} - - '@esbuild/aix-ppc64@0.21.5': - resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [aix] - - '@esbuild/android-arm64@0.21.5': - resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - - '@esbuild/android-arm@0.21.5': - resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - - '@esbuild/android-x64@0.21.5': - resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - - '@esbuild/darwin-arm64@0.21.5': - resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - - '@esbuild/darwin-x64@0.21.5': - resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - - '@esbuild/freebsd-arm64@0.21.5': - resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - - '@esbuild/freebsd-x64@0.21.5': - resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - - '@esbuild/linux-arm64@0.21.5': - resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - - '@esbuild/linux-arm@0.21.5': - resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - - '@esbuild/linux-ia32@0.21.5': - resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - - '@esbuild/linux-loong64@0.21.5': - resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - - '@esbuild/linux-mips64el@0.21.5': - resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - - '@esbuild/linux-ppc64@0.21.5': - resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - - '@esbuild/linux-riscv64@0.21.5': - resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - - '@esbuild/linux-s390x@0.21.5': - resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - - '@esbuild/linux-x64@0.21.5': - resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - - '@esbuild/netbsd-x64@0.21.5': - resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - - '@esbuild/openbsd-x64@0.21.5': - resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - - '@esbuild/sunos-x64@0.21.5': - resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - - '@esbuild/win32-arm64@0.21.5': - resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - - '@esbuild/win32-ia32@0.21.5': - resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - - '@esbuild/win32-x64@0.21.5': - resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - - '@expressive-code/core@0.35.6': - resolution: {integrity: sha512-xGqCkmfkgT7lr/rvmfnYdDSeTdCSp1otAHgoFS6wNEeO7wGDPpxdosVqYiIcQ8CfWUABh/pGqWG90q+MV3824A==} - - '@expressive-code/plugin-frames@0.35.6': - resolution: {integrity: sha512-CqjSWjDJ3wabMJZfL9ZAzH5UAGKg7KWsf1TBzr4xvUbZvWoBtLA/TboBML0U1Ls8h/4TRCIvR4VEb8dv5+QG3w==} - - '@expressive-code/plugin-shiki@0.35.6': - resolution: {integrity: sha512-xm+hzi9BsmhkDUGuyAWIydOAWer7Cs9cj8FM0t4HXaQ+qCubprT6wJZSKUxuvFJIUsIOqk1xXFaJzGJGnWtKMg==} - - '@expressive-code/plugin-text-markers@0.35.6': - resolution: {integrity: sha512-/k9eWVZSCs+uEKHR++22Uu6eIbHWEciVHbIuD8frT8DlqTtHYaaiwHPncO6KFWnGDz5i/gL7oyl6XmOi/E6GVg==} - - '@img/sharp-darwin-arm64@0.33.5': - resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [arm64] - os: [darwin] - - '@img/sharp-darwin-x64@0.33.5': - resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [x64] - os: [darwin] - - '@img/sharp-libvips-darwin-arm64@1.0.4': - resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==} - cpu: [arm64] - os: [darwin] - - '@img/sharp-libvips-darwin-x64@1.0.4': - resolution: {integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==} - cpu: [x64] - os: [darwin] - - '@img/sharp-libvips-linux-arm64@1.0.4': - resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} - cpu: [arm64] - os: [linux] - - '@img/sharp-libvips-linux-arm@1.0.5': - resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} - cpu: [arm] - os: [linux] - - '@img/sharp-libvips-linux-s390x@1.0.4': - resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} - cpu: [s390x] - os: [linux] - - '@img/sharp-libvips-linux-x64@1.0.4': - resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} - cpu: [x64] - os: [linux] - - '@img/sharp-libvips-linuxmusl-arm64@1.0.4': - resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==} - cpu: [arm64] - os: [linux] - - '@img/sharp-libvips-linuxmusl-x64@1.0.4': - resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==} - cpu: [x64] - os: [linux] - - '@img/sharp-linux-arm64@0.33.5': - resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [arm64] - os: [linux] - - '@img/sharp-linux-arm@0.33.5': - resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [arm] - os: [linux] - - '@img/sharp-linux-s390x@0.33.5': - resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [s390x] - os: [linux] - - '@img/sharp-linux-x64@0.33.5': - resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [x64] - os: [linux] - - '@img/sharp-linuxmusl-arm64@0.33.5': - resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [arm64] - os: [linux] - - '@img/sharp-linuxmusl-x64@0.33.5': - resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [x64] - os: [linux] - - '@img/sharp-wasm32@0.33.5': - resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [wasm32] - - '@img/sharp-win32-ia32@0.33.5': - resolution: {integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [ia32] - os: [win32] - - '@img/sharp-win32-x64@0.33.5': - resolution: {integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [x64] - os: [win32] - - '@jridgewell/gen-mapping@0.3.5': - resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} - engines: {node: '>=6.0.0'} - - '@jridgewell/resolve-uri@3.1.2': - resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} - engines: {node: '>=6.0.0'} - - '@jridgewell/set-array@1.2.1': - resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} - engines: {node: '>=6.0.0'} - - '@jridgewell/sourcemap-codec@1.5.0': - resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} - - '@jridgewell/trace-mapping@0.3.25': - resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - - '@lorenzo_lewis/starlight-utils@0.1.2': - resolution: {integrity: sha512-qj7pXh+L0dzt3rryVt6WxqTILqhmUVAwepwJN5C65fk1YaB7dx6SrPk65h3E7Q2An+2GWnnADQX7Fnb56Msx9Q==} - peerDependencies: - '@astrojs/starlight': '>=0.16.0' - astro: '>=4.0.0' - - '@mdx-js/mdx@3.0.1': - resolution: {integrity: sha512-eIQ4QTrOWyL3LWEe/bu6Taqzq2HQvHcyTMaOrI95P2/LmJE7AsfPfgJGuFLPVqBUE1BC1rik3VIhU+s9u72arA==} - - '@nodelib/fs.scandir@2.1.5': - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - - '@nodelib/fs.stat@2.0.5': - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - - '@nodelib/fs.walk@1.2.8': - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - - '@oslojs/encoding@0.4.1': - resolution: {integrity: sha512-hkjo6MuIK/kQR5CrGNdAPZhS01ZCXuWDRJ187zh6qqF2+yMHZpD9fAYpX8q2bOO6Ryhl3XpCT6kUX76N8hhm4Q==} - - '@pagefind/darwin-arm64@1.1.1': - resolution: {integrity: sha512-tZ9tysUmQpFs2EqWG2+E1gc+opDAhSyZSsgKmFzhnWfkK02YHZhvL5XJXEZDqYy3s1FAKhwjTg8XDxneuBlDZQ==} - cpu: [arm64] - os: [darwin] - - '@pagefind/darwin-x64@1.1.1': - resolution: {integrity: sha512-ChohLQ39dLwaxQv0jIQB/SavP3TM5K5ENfDTqIdzLkmfs3+JlzSDyQKcJFjTHYcCzQOZVeieeGq8PdqvLJxJxQ==} - cpu: [x64] - os: [darwin] - - '@pagefind/default-ui@1.1.1': - resolution: {integrity: sha512-ZM0zDatWDnac/VGHhQCiM7UgA4ca8jpjA+VfuTJyHJBaxGqZMQnm4WoTz9E0KFcue1Bh9kxpu7uWFZfwpZZk0A==} - - '@pagefind/linux-arm64@1.1.1': - resolution: {integrity: sha512-H5P6wDoCoAbdsWp0Zx0DxnLUrwTGWGLu/VI1rcN2CyFdY2EGSvPQsbGBMrseKRNuIrJDFtxHHHyjZ7UbzaM9EA==} - cpu: [arm64] - os: [linux] - - '@pagefind/linux-x64@1.1.1': - resolution: {integrity: sha512-yJs7tTYbL2MI3HT+ngs9E1BfUbY9M4/YzA0yEM5xBo4Xl8Yu8Qg2xZTOQ1/F6gwvMrjCUFo8EoACs6LRDhtMrQ==} - cpu: [x64] - os: [linux] - - '@pagefind/windows-x64@1.1.1': - resolution: {integrity: sha512-b7/qPqgIl+lMzkQ8fJt51SfguB396xbIIR+VZ3YrL2tLuyifDJ1wL5mEm+ddmHxJ2Fki340paPcDan9en5OmAw==} - cpu: [x64] - os: [win32] - - '@rollup/pluginutils@5.1.0': - resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true - - '@rollup/rollup-android-arm-eabi@4.21.3': - resolution: {integrity: sha512-MmKSfaB9GX+zXl6E8z4koOr/xU63AMVleLEa64v7R0QF/ZloMs5vcD1sHgM64GXXS1csaJutG+ddtzcueI/BLg==} - cpu: [arm] - os: [android] - - '@rollup/rollup-android-arm64@4.21.3': - resolution: {integrity: sha512-zrt8ecH07PE3sB4jPOggweBjJMzI1JG5xI2DIsUbkA+7K+Gkjys6eV7i9pOenNSDJH3eOr/jLb/PzqtmdwDq5g==} - cpu: [arm64] - os: [android] - - '@rollup/rollup-darwin-arm64@4.21.3': - resolution: {integrity: sha512-P0UxIOrKNBFTQaXTxOH4RxuEBVCgEA5UTNV6Yz7z9QHnUJ7eLX9reOd/NYMO3+XZO2cco19mXTxDMXxit4R/eQ==} - cpu: [arm64] - os: [darwin] - - '@rollup/rollup-darwin-x64@4.21.3': - resolution: {integrity: sha512-L1M0vKGO5ASKntqtsFEjTq/fD91vAqnzeaF6sfNAy55aD+Hi2pBI5DKwCO+UNDQHWsDViJLqshxOahXyLSh3EA==} - cpu: [x64] - os: [darwin] - - '@rollup/rollup-linux-arm-gnueabihf@4.21.3': - resolution: {integrity: sha512-btVgIsCjuYFKUjopPoWiDqmoUXQDiW2A4C3Mtmp5vACm7/GnyuprqIDPNczeyR5W8rTXEbkmrJux7cJmD99D2g==} - cpu: [arm] - os: [linux] - - '@rollup/rollup-linux-arm-musleabihf@4.21.3': - resolution: {integrity: sha512-zmjbSphplZlau6ZTkxd3+NMtE4UKVy7U4aVFMmHcgO5CUbw17ZP6QCgyxhzGaU/wFFdTfiojjbLG3/0p9HhAqA==} - cpu: [arm] - os: [linux] - - '@rollup/rollup-linux-arm64-gnu@4.21.3': - resolution: {integrity: sha512-nSZfcZtAnQPRZmUkUQwZq2OjQciR6tEoJaZVFvLHsj0MF6QhNMg0fQ6mUOsiCUpTqxTx0/O6gX0V/nYc7LrgPw==} - cpu: [arm64] - os: [linux] - - '@rollup/rollup-linux-arm64-musl@4.21.3': - resolution: {integrity: sha512-MnvSPGO8KJXIMGlQDYfvYS3IosFN2rKsvxRpPO2l2cum+Z3exiExLwVU+GExL96pn8IP+GdH8Tz70EpBhO0sIQ==} - cpu: [arm64] - os: [linux] - - '@rollup/rollup-linux-powerpc64le-gnu@4.21.3': - resolution: {integrity: sha512-+W+p/9QNDr2vE2AXU0qIy0qQE75E8RTwTwgqS2G5CRQ11vzq0tbnfBd6brWhS9bCRjAjepJe2fvvkvS3dno+iw==} - cpu: [ppc64] - os: [linux] - - '@rollup/rollup-linux-riscv64-gnu@4.21.3': - resolution: {integrity: sha512-yXH6K6KfqGXaxHrtr+Uoy+JpNlUlI46BKVyonGiaD74ravdnF9BUNC+vV+SIuB96hUMGShhKV693rF9QDfO6nQ==} - cpu: [riscv64] - os: [linux] - - '@rollup/rollup-linux-s390x-gnu@4.21.3': - resolution: {integrity: sha512-R8cwY9wcnApN/KDYWTH4gV/ypvy9yZUHlbJvfaiXSB48JO3KpwSpjOGqO4jnGkLDSk1hgjYkTbTt6Q7uvPf8eg==} - cpu: [s390x] - os: [linux] - - '@rollup/rollup-linux-x64-gnu@4.21.3': - resolution: {integrity: sha512-kZPbX/NOPh0vhS5sI+dR8L1bU2cSO9FgxwM8r7wHzGydzfSjLRCFAT87GR5U9scj2rhzN3JPYVC7NoBbl4FZ0g==} - cpu: [x64] - os: [linux] - - '@rollup/rollup-linux-x64-musl@4.21.3': - resolution: {integrity: sha512-S0Yq+xA1VEH66uiMNhijsWAafffydd2X5b77eLHfRmfLsRSpbiAWiRHV6DEpz6aOToPsgid7TI9rGd6zB1rhbg==} - cpu: [x64] - os: [linux] - - '@rollup/rollup-win32-arm64-msvc@4.21.3': - resolution: {integrity: sha512-9isNzeL34yquCPyerog+IMCNxKR8XYmGd0tHSV+OVx0TmE0aJOo9uw4fZfUuk2qxobP5sug6vNdZR6u7Mw7Q+Q==} - cpu: [arm64] - os: [win32] - - '@rollup/rollup-win32-ia32-msvc@4.21.3': - resolution: {integrity: sha512-nMIdKnfZfzn1Vsk+RuOvl43ONTZXoAPUUxgcU0tXooqg4YrAqzfKzVenqqk2g5efWh46/D28cKFrOzDSW28gTA==} - cpu: [ia32] - os: [win32] - - '@rollup/rollup-win32-x64-msvc@4.21.3': - resolution: {integrity: sha512-fOvu7PCQjAj4eWDEuD8Xz5gpzFqXzGlxHZozHP4b9Jxv9APtdxL6STqztDzMLuRXEc4UpXGGhx029Xgm91QBeA==} - cpu: [x64] - os: [win32] - - '@shikijs/core@1.17.6': - resolution: {integrity: sha512-9ztslig6/YmCg/XwESAXbKjAjOhaq6HVced9NY6qcbDz1X5g/S90Wco2vMjBNX/6V71ASkzri76JewSGPa7kiQ==} - - '@shikijs/engine-javascript@1.17.6': - resolution: {integrity: sha512-5EEZj8tVcierNxm4V0UMS2PVoflb0UJPalWWV8l9rRg+oOfnr5VivqBJbkyq5grltVPvByIXvVbY8GSM/356jQ==} - - '@shikijs/engine-oniguruma@1.17.6': - resolution: {integrity: sha512-NLfWDMXFYe0nDHFbEoyZdz89aIIey3bTfF3zLYSUNTXks5s4uinZVmuPOFf1HfTeGqIn8uErJSBc3VnpJO7Alw==} - - '@shikijs/types@1.17.6': - resolution: {integrity: sha512-ndTFa2TJi2w51ddKQDn3Jy8f6K4E5Q2x3dA3Hmsd3+YmxDQ10UWHjcw7VbVbKzv3VcUvYPLy+z9neqytSzUMUg==} - - '@shikijs/vscode-textmate@9.2.2': - resolution: {integrity: sha512-TMp15K+GGYrWlZM8+Lnj9EaHEFmOen0WJBrfa17hF7taDOYthuPPV0GWzfd/9iMij0akS/8Yw2ikquH7uVi/fg==} - - '@types/acorn@4.0.6': - resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} - - '@types/babel__core@7.20.5': - resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} - - '@types/babel__generator@7.6.8': - resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} - - '@types/babel__template@7.4.4': - resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} - - '@types/babel__traverse@7.20.6': - resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} - - '@types/cookie@0.6.0': - resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} - - '@types/debug@4.1.12': - resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} - - '@types/estree-jsx@1.0.5': - resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} - - '@types/estree@1.0.5': - resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - - '@types/hast@3.0.4': - resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} - - '@types/mdast@4.0.4': - resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} - - '@types/mdx@2.0.13': - resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} - - '@types/ms@0.7.34': - resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} - - '@types/nlcst@2.0.3': - resolution: {integrity: sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==} - - '@types/node@17.0.45': - resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} - - '@types/sax@1.2.7': - resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==} - - '@types/unist@2.0.11': - resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} - - '@types/unist@3.0.3': - resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} - - '@ungap/structured-clone@1.2.0': - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - - '@volar/kit@2.4.4': - resolution: {integrity: sha512-6WusqQ4YhtIYbqY3nlLnkSbfBRSakx5HcTKdF+WjGKBj5D74ux9nsLq3uAqQlbpKgVkkt425KEDymQTb4C36Kg==} - peerDependencies: - typescript: '*' - - '@volar/language-core@2.4.4': - resolution: {integrity: sha512-kO9k4kTLfxpg+6lq7/KAIv3m2d62IHuCL6GbVgYZTpfKvIGoAIlDxK7pFcB/eczN2+ydg/vnyaeZ6SGyZrJw2w==} - - '@volar/language-server@2.4.4': - resolution: {integrity: sha512-rBzTgRw4/msZSFRSJURFU53qcDfBNm40NtYoMwOyaZuPcLzdgDAZ3hzVE80Rj0pk82LQJ0AfH13Y+EYFvUWkfQ==} - - '@volar/language-service@2.4.4': - resolution: {integrity: sha512-QXfZV3IpJdcNQcdWFEG+iXOIb3NiC6/cNIQeH2QAOMx2vpkshuMcWD7AzrhVavobircOXJNiGmRGwqf2okYE3A==} - - '@volar/source-map@2.4.4': - resolution: {integrity: sha512-xG3PZqOP2haG8XG4Pg3PD1UGDAdqZg24Ru8c/qYjYAnmcj6GBR64mstx+bZux5QOyRaJK+/lNM/RnpvBD3489g==} - - '@volar/typescript@2.4.4': - resolution: {integrity: sha512-QQMQRVj0fVHJ3XdRKiS1LclhG0VBXdFYlyuHRQF/xLk2PuJuHNWP26MDZNvEVCvnyUQuUQhIAfylwY5TGPgc6w==} - - '@vscode/emmet-helper@2.9.3': - resolution: {integrity: sha512-rB39LHWWPQYYlYfpv9qCoZOVioPCftKXXqrsyqN1mTWZM6dTnONT63Db+03vgrBbHzJN45IrgS/AGxw9iiqfEw==} - - '@vscode/l10n@0.0.18': - resolution: {integrity: sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==} - - acorn-jsx@5.3.2: - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - - acorn@8.12.1: - resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} - engines: {node: '>=0.4.0'} - hasBin: true - - ajv@8.17.1: - resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} - - ansi-align@3.0.1: - resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-regex@6.1.0: - resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} - engines: {node: '>=12'} - - ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} - - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - - arg@5.0.2: - resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} - - argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - aria-query@5.3.1: - resolution: {integrity: sha512-Z/ZeOgVl7bcSYZ/u/rh0fOpvEpq//LZmdbkXyc7syVzjPAhfOa9ebsdTSjEBDU4vs5nC98Kfduj1uFo0qyET3g==} - engines: {node: '>= 0.4'} - - array-iterate@2.0.1: - resolution: {integrity: sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==} - - ast-types@0.16.1: - resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} - engines: {node: '>=4'} - - astring@1.9.0: - resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==} - hasBin: true - - astro-expressive-code@0.35.6: - resolution: {integrity: sha512-1U4KrvFuodaCV3z4I1bIR16SdhQlPkolGsYTtiANxPZUVv/KitGSCTjzksrkPonn1XuwVqvnwmUUVzTLWngnBA==} - peerDependencies: - astro: ^4.0.0-beta || ^3.3.0 - - astro-integration-kit@0.14.0: - resolution: {integrity: sha512-Tg85rlRRKEkTK2a02XJByvNOuzGN1eDIfAJxwHPUTOn/iE7yFxL9RaLqSdO8X8PxnbL4e1H6OkK6AVFnHZob9A==} - peerDependencies: - '@astrojs/db': ^0.9 || ^0.10 || ^0.11 - astro: ^4.4.1 - peerDependenciesMeta: - '@astrojs/db': - optional: true - - astro@4.15.5: - resolution: {integrity: sha512-zcHXpRav0dtYpddxoGMDN7A7SKrGL9wsu5IxLjqCcZhylfZ/5mfLfoGYnSg7aFwuAleUXP66lyfY+GDbFTbF2w==} - engines: {node: ^18.17.1 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0'} - hasBin: true - - axobject-query@4.1.0: - resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} - engines: {node: '>= 0.4'} - - b4a@1.6.6: - resolution: {integrity: sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==} - - bail@2.0.2: - resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} - - bare-events@2.4.2: - resolution: {integrity: sha512-qMKFd2qG/36aA4GwvKq8MxnPgCQAmBWmSyLWsJcbn8v03wvIPQ/hG1Ms8bPzndZxMDoHpxez5VOS+gC9Yi24/Q==} - - bare-fs@2.3.5: - resolution: {integrity: sha512-SlE9eTxifPDJrT6YgemQ1WGFleevzwY+XAP1Xqgl56HtcrisC2CHCZ2tq6dBpcH2TnNxwUEUGhweo+lrQtYuiw==} - - bare-os@2.4.4: - resolution: {integrity: sha512-z3UiI2yi1mK0sXeRdc4O1Kk8aOa/e+FNWZcTiPB/dfTWyLypuE99LibgRaQki914Jq//yAWylcAt+mknKdixRQ==} - - bare-path@2.1.3: - resolution: {integrity: sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==} - - bare-stream@2.3.0: - resolution: {integrity: sha512-pVRWciewGUeCyKEuRxwv06M079r+fRjAQjBEK2P6OYGrO43O+Z0LrPZZEjlc4mB6C2RpZ9AxJ1s7NLEtOHO6eA==} - - base-64@1.0.0: - resolution: {integrity: sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==} - - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - bcp-47-match@2.0.3: - resolution: {integrity: sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==} - - bcp-47@2.1.0: - resolution: {integrity: sha512-9IIS3UPrvIa1Ej+lVDdDwO7zLehjqsaByECw0bu2RRGP73jALm6FYbzI5gWbgHLvNdkvfXB5YrSbocZdOS0c0w==} - - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - - bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - - boolbase@1.0.0: - resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} - - boxen@7.1.1: - resolution: {integrity: sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==} - engines: {node: '>=14.16'} - - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - - browserslist@4.23.3: - resolution: {integrity: sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - - buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - - camelcase@7.0.1: - resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} - engines: {node: '>=14.16'} - - caniuse-lite@1.0.30001660: - resolution: {integrity: sha512-GacvNTTuATm26qC74pt+ad1fW15mlQ/zuTzzY1ZoIzECTP8HURDfF43kNxPgf7H1jmelCBQTTbBNxdSXOA7Bqg==} - - ccount@2.0.1: - resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} - - chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} - - chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - character-entities-html4@2.1.0: - resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} - - character-entities-legacy@3.0.0: - resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} - - character-entities@2.0.2: - resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} - - character-reference-invalid@2.0.1: - resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} - - chokidar@3.6.0: - resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} - engines: {node: '>= 8.10.0'} - - chownr@1.1.4: - resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - - ci-info@4.0.0: - resolution: {integrity: sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==} - engines: {node: '>=8'} - - cli-boxes@3.0.0: - resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} - engines: {node: '>=10'} - - cli-cursor@5.0.0: - resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} - engines: {node: '>=18'} - - cli-spinners@2.9.2: - resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} - engines: {node: '>=6'} - - cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} - - clsx@2.1.1: - resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} - engines: {node: '>=6'} - - collapse-white-space@2.1.0: - resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==} - - color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - color-string@1.9.1: - resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} - - color@4.2.3: - resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} - engines: {node: '>=12.5.0'} - - comma-separated-tokens@2.0.3: - resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} - - common-ancestor-path@1.0.1: - resolution: {integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==} - - convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - - cookie@0.6.0: - resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} - engines: {node: '>= 0.6'} - - css-selector-parser@3.0.5: - resolution: {integrity: sha512-3itoDFbKUNx1eKmVpYMFyqKX04Ww9osZ+dLgrk6GEv6KMVeXUhUnp4I5X+evw+u3ZxVU6RFXSSRxlTeMh8bA+g==} - - cssesc@3.0.0: - resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} - engines: {node: '>=4'} - hasBin: true - - debug@4.3.7: - resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - decode-named-character-reference@1.0.2: - resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} - - decompress-response@6.0.0: - resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} - engines: {node: '>=10'} - - deep-extend@0.6.0: - resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} - engines: {node: '>=4.0.0'} - - dequal@2.0.3: - resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} - engines: {node: '>=6'} - - detect-libc@2.0.3: - resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} - engines: {node: '>=8'} - - deterministic-object-hash@2.0.2: - resolution: {integrity: sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ==} - engines: {node: '>=18'} - - devalue@5.0.0: - resolution: {integrity: sha512-gO+/OMXF7488D+u3ue+G7Y4AA3ZmUnB3eHJXmBTgNHvr4ZNzl36A0ZtG+XCRNYCkYx/bFmw4qtkoFLa+wSrwAA==} - - devlop@1.1.0: - resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} - - diff@5.2.0: - resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} - engines: {node: '>=0.3.1'} - - direction@2.0.1: - resolution: {integrity: sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA==} - hasBin: true - - dlv@1.1.3: - resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} - - dset@3.1.4: - resolution: {integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==} - engines: {node: '>=4'} - - eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - - electron-to-chromium@1.5.22: - resolution: {integrity: sha512-tKYm5YHPU1djz0O+CGJ+oJIvimtsCcwR2Z9w7Skh08lUdyzXY5djods3q+z2JkWdb7tCcmM//eVavSRAiaPRNg==} - - emmet@2.4.7: - resolution: {integrity: sha512-O5O5QNqtdlnQM2bmKHtJgyChcrFMgQuulI+WdiOw2NArzprUqqxUW6bgYtKvzKgrsYpuLWalOkdhNP+1jluhCA==} - - emoji-regex@10.4.0: - resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - - end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - - entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} - - es-module-lexer@1.5.4: - resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==} - - esbuild@0.21.5: - resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} - engines: {node: '>=12'} - hasBin: true - - escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} - - escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - - escape-string-regexp@5.0.0: - resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} - engines: {node: '>=12'} - - esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true - - estree-util-attach-comments@3.0.0: - resolution: {integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==} - - estree-util-build-jsx@3.0.1: - resolution: {integrity: sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==} - - estree-util-is-identifier-name@3.0.0: - resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} - - estree-util-to-js@2.0.0: - resolution: {integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==} - - estree-util-visit@2.0.0: - resolution: {integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==} - - estree-walker@2.0.2: - resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} - - estree-walker@3.0.3: - resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} - - eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - - expand-template@2.0.3: - resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} - engines: {node: '>=6'} - - expressive-code@0.35.6: - resolution: {integrity: sha512-+mx+TPTbMqgo0mL92Xh9QgjW0kSQIsEivMgEcOnaqKqL7qCw8Vkqc5Rg/di7ZYw4aMUSr74VTc+w8GQWu05j1g==} - - extend-shallow@2.0.1: - resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} - engines: {node: '>=0.10.0'} - - extend@3.0.2: - resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - - fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - - fast-fifo@1.3.2: - resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} - - fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} - engines: {node: '>=8.6.0'} - - fast-uri@3.0.1: - resolution: {integrity: sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==} - - fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} - - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - - find-up-simple@1.0.0: - resolution: {integrity: sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw==} - engines: {node: '>=18'} - - find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} - - find-yarn-workspace-root2@1.2.16: - resolution: {integrity: sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==} - - flattie@1.1.1: - resolution: {integrity: sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==} - engines: {node: '>=8'} - - fs-constants@1.0.0: - resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} - - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - get-east-asian-width@1.2.0: - resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==} - engines: {node: '>=18'} - - github-from-package@0.0.0: - resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} - - github-slugger@2.0.0: - resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} - - graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - - gray-matter@4.0.3: - resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} - engines: {node: '>=6.0'} - - has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - - hast-util-embedded@3.0.0: - resolution: {integrity: sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA==} - - hast-util-from-html@2.0.2: - resolution: {integrity: sha512-HwOHwxdt2zC5KQ/CNoybBntRook2zJvfZE/u5/Ap7aLPe22bDqen7KwGkOqOyzL5zIqKwiYX/OTtE0FWgr6XXA==} - - hast-util-from-parse5@8.0.1: - resolution: {integrity: sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==} - - hast-util-has-property@3.0.0: - resolution: {integrity: sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==} - - hast-util-is-body-ok-link@3.0.0: - resolution: {integrity: sha512-VFHY5bo2nY8HiV6nir2ynmEB1XkxzuUffhEGeVx7orbu/B1KaGyeGgMZldvMVx5xWrDlLLG/kQ6YkJAMkBEx0w==} - - hast-util-is-element@3.0.0: - resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} - - hast-util-parse-selector@4.0.0: - resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} - - hast-util-phrasing@3.0.1: - resolution: {integrity: sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ==} - - hast-util-raw@9.0.4: - resolution: {integrity: sha512-LHE65TD2YiNsHD3YuXcKPHXPLuYh/gjp12mOfU8jxSrm1f/yJpsb0F/KKljS6U9LJoP0Ux+tCe8iJ2AsPzTdgA==} - - hast-util-select@6.0.2: - resolution: {integrity: sha512-hT/SD/d/Meu+iobvgkffo1QecV8WeKWxwsNMzcTJsKw1cKTQKSR/7ArJeURLNJF9HDjp9nVoORyNNJxrvBye8Q==} - - hast-util-to-estree@3.1.0: - resolution: {integrity: sha512-lfX5g6hqVh9kjS/B9E2gSkvHH4SZNiQFiqWS0x9fENzEl+8W12RqdRxX6d/Cwxi30tPQs3bIO+aolQJNp1bIyw==} - - hast-util-to-html@9.0.2: - resolution: {integrity: sha512-RP5wNpj5nm1Z8cloDv4Sl4RS8jH5HYa0v93YB6Wb4poEzgMo/dAAL0KcT4974dCjcNG5pkLqTImeFHHCwwfY3g==} - - hast-util-to-jsx-runtime@2.3.0: - resolution: {integrity: sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==} - - hast-util-to-parse5@8.0.0: - resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} - - hast-util-to-string@3.0.0: - resolution: {integrity: sha512-OGkAxX1Ua3cbcW6EJ5pT/tslVb90uViVkcJ4ZZIMW/R33DX/AkcJcRrPebPwJkHYwlDHXz4aIwvAAaAdtrACFA==} - - hast-util-to-text@4.0.2: - resolution: {integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==} - - hast-util-whitespace@3.0.0: - resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} - - hastscript@8.0.0: - resolution: {integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==} - - hastscript@9.0.0: - resolution: {integrity: sha512-jzaLBGavEDKHrc5EfFImKN7nZKKBdSLIdGvCwDZ9TfzbF2ffXiov8CKE445L2Z1Ek2t/m4SKQ2j6Ipv7NyUolw==} - - html-escaper@3.0.3: - resolution: {integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==} - - html-void-elements@3.0.0: - resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} - - html-whitespace-sensitive-tag-names@3.0.0: - resolution: {integrity: sha512-KlClZ3/Qy5UgvpvVvDomGhnQhNWH5INE8GwvSIQ9CWt1K0zbbXrl7eN5bWaafOZgtmO3jMPwUqmrmEwinhPq1w==} - - http-cache-semantics@4.1.1: - resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} - - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - - import-meta-resolve@4.1.0: - resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - - inline-style-parser@0.1.1: - resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} - - inline-style-parser@0.2.4: - resolution: {integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==} - - is-alphabetical@2.0.1: - resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} - - is-alphanumerical@2.0.1: - resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} - - is-arrayish@0.3.2: - resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} - - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - - is-decimal@2.0.1: - resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} - - is-docker@3.0.0: - resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - hasBin: true - - is-extendable@0.1.1: - resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} - engines: {node: '>=0.10.0'} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-hexadecimal@2.0.1: - resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} - - is-inside-container@1.0.0: - resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} - engines: {node: '>=14.16'} - hasBin: true - - is-interactive@2.0.0: - resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} - engines: {node: '>=12'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-plain-obj@4.1.0: - resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} - engines: {node: '>=12'} - - is-reference@3.0.2: - resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==} - - is-unicode-supported@1.3.0: - resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} - engines: {node: '>=12'} - - is-unicode-supported@2.1.0: - resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} - engines: {node: '>=18'} - - is-wsl@3.1.0: - resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} - engines: {node: '>=16'} - - js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - - js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} - hasBin: true - - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - - jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} - hasBin: true - - json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - - json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - - jsonc-parser@2.3.1: - resolution: {integrity: sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==} - - jsonc-parser@3.3.1: - resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} - - kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} - - kleur@3.0.3: - resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} - engines: {node: '>=6'} - - kleur@4.1.5: - resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} - engines: {node: '>=6'} - - load-yaml-file@0.2.0: - resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==} - engines: {node: '>=6'} - - locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} - - lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - - log-symbols@6.0.0: - resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==} - engines: {node: '>=18'} - - longest-streak@3.1.0: - resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} - - lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - - magic-string@0.30.11: - resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==} - - magicast@0.3.5: - resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} - - markdown-extensions@2.0.0: - resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} - engines: {node: '>=16'} - - markdown-table@3.0.3: - resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} - - mdast-util-definitions@6.0.0: - resolution: {integrity: sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==} - - mdast-util-directive@3.0.0: - resolution: {integrity: sha512-JUpYOqKI4mM3sZcNxmF/ox04XYFFkNwr0CFlrQIkCwbvH0xzMCqkMqAde9wRd80VAhaUrwFwKm2nxretdT1h7Q==} - - mdast-util-find-and-replace@3.0.1: - resolution: {integrity: sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==} - - mdast-util-from-markdown@2.0.1: - resolution: {integrity: sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==} - - mdast-util-gfm-autolink-literal@2.0.1: - resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} - - mdast-util-gfm-footnote@2.0.0: - resolution: {integrity: sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==} - - mdast-util-gfm-strikethrough@2.0.0: - resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} - - mdast-util-gfm-table@2.0.0: - resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} - - mdast-util-gfm-task-list-item@2.0.0: - resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} - - mdast-util-gfm@3.0.0: - resolution: {integrity: sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==} - - mdast-util-mdx-expression@2.0.1: - resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==} - - mdast-util-mdx-jsx@3.1.3: - resolution: {integrity: sha512-bfOjvNt+1AcbPLTFMFWY149nJz0OjmewJs3LQQ5pIyVGxP4CdOqNVJL6kTaM5c68p8q82Xv3nCyFfUnuEcH3UQ==} - - mdast-util-mdx@3.0.0: - resolution: {integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==} - - mdast-util-mdxjs-esm@2.0.1: - resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} - - mdast-util-phrasing@4.1.0: - resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} - - mdast-util-to-hast@13.2.0: - resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} - - mdast-util-to-markdown@2.1.0: - resolution: {integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==} - - mdast-util-to-string@4.0.0: - resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} - - merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - - micromark-core-commonmark@2.0.1: - resolution: {integrity: sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==} - - micromark-extension-directive@3.0.1: - resolution: {integrity: sha512-VGV2uxUzhEZmaP7NSFo2vtq7M2nUD+WfmYQD+d8i/1nHbzE+rMy9uzTvUybBbNiVbrhOZibg3gbyoARGqgDWyg==} - - micromark-extension-gfm-autolink-literal@2.1.0: - resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} - - micromark-extension-gfm-footnote@2.1.0: - resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} - - micromark-extension-gfm-strikethrough@2.1.0: - resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} - - micromark-extension-gfm-table@2.1.0: - resolution: {integrity: sha512-Ub2ncQv+fwD70/l4ou27b4YzfNaCJOvyX4HxXU15m7mpYY+rjuWzsLIPZHJL253Z643RpbcP1oeIJlQ/SKW67g==} - - micromark-extension-gfm-tagfilter@2.0.0: - resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} - - micromark-extension-gfm-task-list-item@2.1.0: - resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} - - micromark-extension-gfm@3.0.0: - resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} - - micromark-extension-mdx-expression@3.0.0: - resolution: {integrity: sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ==} - - micromark-extension-mdx-jsx@3.0.1: - resolution: {integrity: sha512-vNuFb9czP8QCtAQcEJn0UJQJZA8Dk6DXKBqx+bg/w0WGuSxDxNr7hErW89tHUY31dUW4NqEOWwmEUNhjTFmHkg==} - - micromark-extension-mdx-md@2.0.0: - resolution: {integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==} - - micromark-extension-mdxjs-esm@3.0.0: - resolution: {integrity: sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==} - - micromark-extension-mdxjs@3.0.0: - resolution: {integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==} - - micromark-factory-destination@2.0.0: - resolution: {integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==} - - micromark-factory-label@2.0.0: - resolution: {integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==} - - micromark-factory-mdx-expression@2.0.2: - resolution: {integrity: sha512-5E5I2pFzJyg2CtemqAbcyCktpHXuJbABnsb32wX2U8IQKhhVFBqkcZR5LRm1WVoFqa4kTueZK4abep7wdo9nrw==} - - micromark-factory-space@2.0.0: - resolution: {integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==} - - micromark-factory-title@2.0.0: - resolution: {integrity: sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==} - - micromark-factory-whitespace@2.0.0: - resolution: {integrity: sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==} - - micromark-util-character@2.1.0: - resolution: {integrity: sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==} - - micromark-util-chunked@2.0.0: - resolution: {integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==} - - micromark-util-classify-character@2.0.0: - resolution: {integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==} - - micromark-util-combine-extensions@2.0.0: - resolution: {integrity: sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==} - - micromark-util-decode-numeric-character-reference@2.0.1: - resolution: {integrity: sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==} - - micromark-util-decode-string@2.0.0: - resolution: {integrity: sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==} - - micromark-util-encode@2.0.0: - resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==} - - micromark-util-events-to-acorn@2.0.2: - resolution: {integrity: sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA==} - - micromark-util-html-tag-name@2.0.0: - resolution: {integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==} - - micromark-util-normalize-identifier@2.0.0: - resolution: {integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==} - - micromark-util-resolve-all@2.0.0: - resolution: {integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==} - - micromark-util-sanitize-uri@2.0.0: - resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==} - - micromark-util-subtokenize@2.0.1: - resolution: {integrity: sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==} - - micromark-util-symbol@2.0.0: - resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==} - - micromark-util-types@2.0.0: - resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==} - - micromark@4.0.0: - resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==} - - micromatch@4.0.8: - resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} - engines: {node: '>=8.6'} - - mimic-function@5.0.1: - resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} - engines: {node: '>=18'} - - mimic-response@3.1.0: - resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} - engines: {node: '>=10'} - - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - mkdirp-classic@0.5.3: - resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} - - mrmime@2.0.0: - resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==} - engines: {node: '>=10'} - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - muggle-string@0.4.1: - resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} - - nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - napi-build-utils@1.0.2: - resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} - - neotraverse@0.6.18: - resolution: {integrity: sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==} - engines: {node: '>= 10'} - - nlcst-to-string@4.0.0: - resolution: {integrity: sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==} - - node-abi@3.67.0: - resolution: {integrity: sha512-bLn/fU/ALVBE9wj+p4Y21ZJWYFjUXLXPi/IewyLZkx3ApxKDNBWCKdReeKOtD8dWpOdDCeMyLh6ZewzcLsG2Nw==} - engines: {node: '>=10'} - - node-addon-api@6.1.0: - resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} - - node-releases@2.0.18: - resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} - - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - not@0.1.0: - resolution: {integrity: sha512-5PDmaAsVfnWUgTUbJ3ERwn7u79Z0dYxN9ErxCpVJJqe2RK0PJ3z+iFUxuqjwtlDDegXvtWoxD/3Fzxox7tFGWA==} - - nth-check@2.1.1: - resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - onetime@7.0.0: - resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} - engines: {node: '>=18'} - - oniguruma-to-js@0.4.3: - resolution: {integrity: sha512-X0jWUcAlxORhOqqBREgPMgnshB7ZGYszBNspP+tS9hPD3l13CdaXcHbgImoHUHlrvGx/7AvFEkTRhAGYh+jzjQ==} - - ora@8.1.0: - resolution: {integrity: sha512-GQEkNkH/GHOhPFXcqZs3IDahXEQcQxsSjEkK4KvEEST4t7eNzoMjxTzef+EZ+JluDEV+Raoi3WQ2CflnRdSVnQ==} - engines: {node: '>=18'} - - p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} - - p-limit@6.1.0: - resolution: {integrity: sha512-H0jc0q1vOzlEk0TqAKXKZxdl7kX3OFUzCnNVUnq5Pc3DGo0kpeaMuPqxQn235HibwBEb0/pm9dgKTjXy66fBkg==} - engines: {node: '>=18'} - - p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} - - p-queue@8.0.1: - resolution: {integrity: sha512-NXzu9aQJTAzbBqOt2hwsR63ea7yvxJc0PwN/zobNAudYfb1B7R08SzB4TsLeSbUCuG467NhnoT0oO6w1qRO+BA==} - engines: {node: '>=18'} - - p-timeout@6.1.2: - resolution: {integrity: sha512-UbD77BuZ9Bc9aABo74gfXhNvzC9Tx7SxtHSh1fxvx3jTLLYvmVhiQZZrJzqqU0jKbN32kb5VOKiLEQI/3bIjgQ==} - engines: {node: '>=14.16'} - - p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} - - pagefind@1.1.1: - resolution: {integrity: sha512-U2YR0dQN5B2fbIXrLtt/UXNS0yWSSYfePaad1KcBPTi0p+zRtsVjwmoPaMQgTks5DnHNbmDxyJUL5TGaLljK3A==} - hasBin: true - - parse-entities@4.0.1: - resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==} - - parse-latin@7.0.0: - resolution: {integrity: sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==} - - parse5@7.1.2: - resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} - - path-browserify@1.0.1: - resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - pathe@1.1.2: - resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} - - periscopic@3.1.0: - resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} - - picocolors@1.1.0: - resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - pify@4.0.1: - resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} - engines: {node: '>=6'} - - pkg-dir@4.2.0: - resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} - engines: {node: '>=8'} - - postcss-nested@6.2.0: - resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} - engines: {node: '>=12.0'} - peerDependencies: - postcss: ^8.2.14 - - postcss-selector-parser@6.1.2: - resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} - engines: {node: '>=4'} - - postcss@8.4.45: - resolution: {integrity: sha512-7KTLTdzdZZYscUc65XmjFiB73vBhBfbPztCYdUNvlaso9PrzjzcmjqBPR0lNGkcVlcO4BjiO5rK/qNz+XAen1Q==} - engines: {node: ^10 || ^12 || >=14} - - prebuild-install@7.1.2: - resolution: {integrity: sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==} - engines: {node: '>=10'} - hasBin: true - - preferred-pm@4.0.0: - resolution: {integrity: sha512-gYBeFTZLu055D8Vv3cSPox/0iTPtkzxpLroSYYA7WXgRi31WCJ51Uyl8ZiPeUUjyvs2MBzK+S8v9JVUgHU/Sqw==} - engines: {node: '>=18.12'} - - prettier@2.8.7: - resolution: {integrity: sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==} - engines: {node: '>=10.13.0'} - hasBin: true - - prismjs@1.29.0: - resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==} - engines: {node: '>=6'} - - prompts@2.4.2: - resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} - engines: {node: '>= 6'} - - property-information@6.5.0: - resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} - - pump@3.0.2: - resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} - - queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - - queue-tick@1.0.1: - resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} - - rc@1.2.8: - resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} - hasBin: true - - readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} - - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - - recast@0.23.9: - resolution: {integrity: sha512-Hx/BGIbwj+Des3+xy5uAtAbdCyqK9y9wbBcDFDYanLS9JnMqf7OeF87HQwUimE87OEc72mr6tkKUKMBBL+hF9Q==} - engines: {node: '>= 4'} - - regex@4.3.2: - resolution: {integrity: sha512-kK/AA3A9K6q2js89+VMymcboLOlF5lZRCYJv3gzszXFHBr6kO6qLGzbm+UIugBEV8SMMKCTR59txoY6ctRHYVw==} - - rehype-expressive-code@0.35.6: - resolution: {integrity: sha512-pPdE+pRcRw01kxMOwHQjuRxgwlblZt5+wAc3w2aPGgmcnn57wYjn07iKO7zaznDxYVxMYVvYlnL+R3vWFQS4Gw==} - - rehype-format@5.0.0: - resolution: {integrity: sha512-kM4II8krCHmUhxrlvzFSptvaWh280Fr7UGNJU5DCMuvmAwGCNmGfi9CvFAQK6JDjsNoRMWQStglK3zKJH685Wg==} - - rehype-minify-whitespace@6.0.0: - resolution: {integrity: sha512-i9It4YHR0Sf3GsnlR5jFUKXRr9oayvEk9GKQUkwZv6hs70OH9q3OCZrq9PpLvIGKt3W+JxBOxCidNVpH/6rWdA==} - - rehype-parse@9.0.0: - resolution: {integrity: sha512-WG7nfvmWWkCR++KEkZevZb/uw41E8TsH4DsY9UxsTbIXCVGbAs4S+r8FrQ+OtH5EEQAs+5UxKC42VinkmpA1Yw==} - - rehype-raw@7.0.0: - resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} - - rehype-stringify@10.0.0: - resolution: {integrity: sha512-1TX1i048LooI9QoecrXy7nGFFbFSufxVRAfc6Y9YMRAi56l+oB0zP51mLSV312uRuvVLPV1opSlJmslozR1XHQ==} - - rehype@13.0.1: - resolution: {integrity: sha512-AcSLS2mItY+0fYu9xKxOu1LhUZeBZZBx8//5HKzF+0XP+eP8+6a5MXn2+DW2kfXR6Dtp1FEXMVrjyKAcvcU8vg==} - - remark-directive@3.0.0: - resolution: {integrity: sha512-l1UyWJ6Eg1VPU7Hm/9tt0zKtReJQNOA4+iDMAxTyZNWnJnFlbS/7zhiel/rogTLQ2vMYwDzSJa4BiVNqGlqIMA==} - - remark-gfm@4.0.0: - resolution: {integrity: sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==} - - remark-mdx@3.0.1: - resolution: {integrity: sha512-3Pz3yPQ5Rht2pM5R+0J2MrGoBSrzf+tJG94N+t/ilfdh8YLyyKYtidAYwTveB20BoHAcwIopOUqhcmh2F7hGYA==} - - remark-parse@11.0.0: - resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} - - remark-rehype@11.1.0: - resolution: {integrity: sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==} - - remark-smartypants@3.0.2: - resolution: {integrity: sha512-ILTWeOriIluwEvPjv67v7Blgrcx+LZOkAUVtKI3putuhlZm84FnqDORNXPPm+HY3NdZOMhyDwZ1E+eZB/Df5dA==} - engines: {node: '>=16.0.0'} - - remark-stringify@11.0.0: - resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} - - request-light@0.5.8: - resolution: {integrity: sha512-3Zjgh+8b5fhRJBQZoy+zbVKpAQGLyka0MPgW3zruTF4dFFJ8Fqcfu9YsAvi/rvdcaTeWG3MkbZv4WKxAn/84Lg==} - - request-light@0.7.0: - resolution: {integrity: sha512-lMbBMrDoxgsyO+yB3sDcrDuX85yYt7sS8BfQd11jtbW/z5ZWgLZRcEGLsLoYw7I0WSUGQBs8CC8ScIxkTX1+6Q==} - - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - - require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} - - restore-cursor@5.1.0: - resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} - engines: {node: '>=18'} - - retext-latin@4.0.0: - resolution: {integrity: sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==} - - retext-smartypants@6.1.1: - resolution: {integrity: sha512-onsHf34i/GzgElJgtT1K2V+31yEhWs7NJboKNxXJcmVMMPxLpgxZ9iADoMdydd6j/bHic5F/aNq0CGqElEtu2g==} - - retext-stringify@4.0.0: - resolution: {integrity: sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA==} - - retext@9.0.0: - resolution: {integrity: sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==} - - reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - - rollup@4.21.3: - resolution: {integrity: sha512-7sqRtBNnEbcBtMeRVc6VRsJMmpI+JU1z9VTvW8D4gXIYQFz0aLcsE6rRkyghZkLfEgUZgVvOG7A5CVz/VW5GIA==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true - - run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - sax@1.4.1: - resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} - - section-matter@1.0.0: - resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} - engines: {node: '>=4'} - - semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true - - semver@7.6.3: - resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} - engines: {node: '>=10'} - hasBin: true - - sharp@0.32.6: - resolution: {integrity: sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==} - engines: {node: '>=14.15.0'} - - sharp@0.33.5: - resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - - shiki@1.17.6: - resolution: {integrity: sha512-RejGugKpDM75vh6YtF9R771acxHRDikC/01kxsUGW+Pnaz3pTY+c8aZB5CnD7p0vuFPs1HaoAIU/4E+NCfS+mQ==} - - signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} - - simple-concat@1.0.1: - resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} - - simple-get@4.0.1: - resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} - - simple-swizzle@0.2.2: - resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} - - sisteransi@1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - - sitemap@7.1.2: - resolution: {integrity: sha512-ARCqzHJ0p4gWt+j7NlU5eDlIO9+Rkr/JhPFZKKQ1l5GCus7rJH4UdrlVAh0xC/gDS/Qir2UMxqYNHtsKr2rpCw==} - engines: {node: '>=12.0.0', npm: '>=5.6.0'} - hasBin: true - - source-map-js@1.2.1: - resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} - engines: {node: '>=0.10.0'} - - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - source-map@0.7.4: - resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} - engines: {node: '>= 8'} - - space-separated-tokens@2.0.2: - resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} - - sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - - stdin-discarder@0.2.2: - resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==} - engines: {node: '>=18'} - - stream-replace-string@2.0.0: - resolution: {integrity: sha512-TlnjJ1C0QrmxRNrON00JvaFFlNh5TTG00APw23j74ET7gkQpTASi6/L2fuiav8pzK715HXtUeClpBTw2NPSn6w==} - - streamx@2.20.1: - resolution: {integrity: sha512-uTa0mU6WUC65iUvzKH4X9hEdvSW7rbPxPtwfWiLMSj3qTdQbAiUboZTxauKfpFuGIGa1C2BYijZ7wgdUXICJhA==} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} - - string-width@7.2.0: - resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} - engines: {node: '>=18'} - - string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - - stringify-entities@4.0.4: - resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} - - strip-bom-string@1.0.0: - resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} - engines: {node: '>=0.10.0'} - - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - - strip-json-comments@2.0.1: - resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} - engines: {node: '>=0.10.0'} - - style-to-object@0.4.4: - resolution: {integrity: sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==} - - style-to-object@1.0.8: - resolution: {integrity: sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==} - - supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} - - tar-fs@2.1.1: - resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} - - tar-fs@3.0.6: - resolution: {integrity: sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w==} - - tar-stream@2.2.0: - resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} - engines: {node: '>=6'} - - tar-stream@3.1.7: - resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} - - text-decoder@1.2.0: - resolution: {integrity: sha512-n1yg1mOj9DNpk3NeZOx7T6jchTbyJS3i3cucbNN6FcdPriMZx7NsgrGpWWdWZZGxD7ES1XB+3uoqHMgOKaN+fg==} - - tiny-invariant@1.3.3: - resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} - - tinyexec@0.3.0: - resolution: {integrity: sha512-tVGE0mVJPGb0chKhqmsoosjsS+qUnJVGJpZgsHYQcGoPlG3B51R3PouqTgEGH2Dc9jjFyOqOpix6ZHNMXp1FZg==} - - to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - trim-lines@3.0.1: - resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} - - trough@2.2.0: - resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} - - tsconfck@3.1.3: - resolution: {integrity: sha512-ulNZP1SVpRDesxeMLON/LtWM8HIgAJEIVpVVhBM6gsmvQ8+Rh+ZG7FWGvHh7Ah3pRABwVJWklWCr/BTZSv0xnQ==} - engines: {node: ^18 || >=20} - hasBin: true - peerDependencies: - typescript: ^5.0.0 - peerDependenciesMeta: - typescript: - optional: true - - tslib@2.7.0: - resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} - - tunnel-agent@0.6.0: - resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} - - type-fest@2.19.0: - resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} - engines: {node: '>=12.20'} - - typesafe-path@0.2.2: - resolution: {integrity: sha512-OJabfkAg1WLZSqJAJ0Z6Sdt3utnbzr/jh+NAHoyWHJe8CMSy79Gm085094M9nvTPy22KzTVn5Zq5mbapCI/hPA==} - - typescript-auto-import-cache@0.3.3: - resolution: {integrity: sha512-ojEC7+Ci1ij9eE6hp8Jl9VUNnsEKzztktP5gtYNRMrTmfXVwA1PITYYAkpxCvvupdSYa/Re51B6KMcv1CTZEUA==} - - typescript@5.6.2: - resolution: {integrity: sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==} - engines: {node: '>=14.17'} - hasBin: true - - unified@11.0.5: - resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} - - unist-util-find-after@5.0.0: - resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} - - unist-util-is@6.0.0: - resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} - - unist-util-modify-children@4.0.0: - resolution: {integrity: sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==} - - unist-util-position-from-estree@2.0.0: - resolution: {integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==} - - unist-util-position@5.0.0: - resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} - - unist-util-remove-position@5.0.0: - resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} - - unist-util-stringify-position@4.0.0: - resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} - - unist-util-visit-children@3.0.0: - resolution: {integrity: sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA==} - - unist-util-visit-parents@6.0.1: - resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} - - unist-util-visit@5.0.0: - resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} - - update-browserslist-db@1.1.0: - resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - - util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - - vfile-location@5.0.3: - resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} - - vfile-message@4.0.2: - resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} - - vfile@6.0.3: - resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - - vite@5.4.5: - resolution: {integrity: sha512-pXqR0qtb2bTwLkev4SE3r4abCNioP3GkjvIDLlzziPpXtHgiJIjuKl+1GN6ESOT3wMjG3JTeARopj2SwYaHTOA==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@types/node': ^18.0.0 || >=20.0.0 - less: '*' - lightningcss: ^1.21.0 - sass: '*' - sass-embedded: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - sass-embedded: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - - vitefu@1.0.2: - resolution: {integrity: sha512-0/iAvbXyM3RiPPJ4lyD4w6Mjgtf4ejTK6TPvTNG3H32PLwuT0N/ZjJLiXug7ETE/LWtTeHw9WRv7uX/tIKYyKg==} - peerDependencies: - vite: ^3.0.0 || ^4.0.0 || ^5.0.0 - peerDependenciesMeta: - vite: - optional: true - - volar-service-css@0.0.61: - resolution: {integrity: sha512-Ct9L/w+IB1JU8F4jofcNCGoHy6TF83aiapfZq9A0qYYpq+Kk5dH+ONS+rVZSsuhsunq8UvAuF8Gk6B8IFLfniw==} - peerDependencies: - '@volar/language-service': ~2.4.0 - peerDependenciesMeta: - '@volar/language-service': - optional: true - - volar-service-emmet@0.0.61: - resolution: {integrity: sha512-iiYqBxjjcekqrRruw4COQHZME6EZYWVbkHjHDbULpml3g8HGJHzpAMkj9tXNCPxf36A+f1oUYjsvZt36qPg4cg==} - peerDependencies: - '@volar/language-service': ~2.4.0 - peerDependenciesMeta: - '@volar/language-service': - optional: true - - volar-service-html@0.0.61: - resolution: {integrity: sha512-yFE+YmmgqIL5HI4ORqP++IYb1QaGcv+xBboI0WkCxJJ/M35HZj7f5rbT3eQ24ECLXFbFCFanckwyWJVz5KmN3Q==} - peerDependencies: - '@volar/language-service': ~2.4.0 - peerDependenciesMeta: - '@volar/language-service': - optional: true - - volar-service-prettier@0.0.61: - resolution: {integrity: sha512-F612nql5I0IS8HxXemCGvOR2Uxd4XooIwqYVUvk7WSBxP/+xu1jYvE3QJ7EVpl8Ty3S4SxPXYiYTsG3bi+gzIQ==} - peerDependencies: - '@volar/language-service': ~2.4.0 - prettier: ^2.2 || ^3.0 - peerDependenciesMeta: - '@volar/language-service': - optional: true - prettier: - optional: true - - volar-service-typescript-twoslash-queries@0.0.61: - resolution: {integrity: sha512-99FICGrEF0r1E2tV+SvprHPw9Knyg7BdW2fUch0tf59kG+KG+Tj4tL6tUg+cy8f23O/VXlmsWFMIE+bx1dXPnQ==} - peerDependencies: - '@volar/language-service': ~2.4.0 - peerDependenciesMeta: - '@volar/language-service': - optional: true - - volar-service-typescript@0.0.61: - resolution: {integrity: sha512-4kRHxVbW7wFBHZWRU6yWxTgiKETBDIJNwmJUAWeP0mHaKpnDGj/astdRFKqGFRYVeEYl45lcUPhdJyrzanjsdQ==} - peerDependencies: - '@volar/language-service': ~2.4.0 - peerDependenciesMeta: - '@volar/language-service': - optional: true - - volar-service-yaml@0.0.61: - resolution: {integrity: sha512-L+gbDiLDQQ1rZUbJ3mf3doDsoQUa8OZM/xdpk/unMg1Vz24Zmi2Ign8GrZyBD7bRoIQDwOH9gdktGDKzRPpUNw==} - peerDependencies: - '@volar/language-service': ~2.4.0 - peerDependenciesMeta: - '@volar/language-service': - optional: true - - vscode-css-languageservice@6.3.1: - resolution: {integrity: sha512-1BzTBuJfwMc3A0uX4JBdJgoxp74cjj4q2mDJdp49yD/GuAq4X0k5WtK6fNcMYr+FfJ9nqgR6lpfCSZDkARJ5qQ==} - - vscode-html-languageservice@5.3.1: - resolution: {integrity: sha512-ysUh4hFeW/WOWz/TO9gm08xigiSsV/FOAZ+DolgJfeLftna54YdmZ4A+lIn46RbdO3/Qv5QHTn1ZGqmrXQhZyA==} - - vscode-json-languageservice@4.1.8: - resolution: {integrity: sha512-0vSpg6Xd9hfV+eZAaYN63xVVMOTmJ4GgHxXnkLCh+9RsQBkWKIghzLhW2B9ebfG+LQQg8uLtsQ2aUKjTgE+QOg==} - engines: {npm: '>=7.0.0'} - - vscode-jsonrpc@6.0.0: - resolution: {integrity: sha512-wnJA4BnEjOSyFMvjZdpiOwhSq9uDoK8e/kpRJDTaMYzwlkrhG1fwDIZI94CLsLzlCK5cIbMMtFlJlfR57Lavmg==} - engines: {node: '>=8.0.0 || >=10.0.0'} - - vscode-jsonrpc@8.2.0: - resolution: {integrity: sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==} - engines: {node: '>=14.0.0'} - - vscode-languageserver-protocol@3.16.0: - resolution: {integrity: sha512-sdeUoAawceQdgIfTI+sdcwkiK2KU+2cbEYA0agzM2uqaUy2UpnnGHtWTHVEtS0ES4zHU0eMFRGN+oQgDxlD66A==} - - vscode-languageserver-protocol@3.17.5: - resolution: {integrity: sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==} - - vscode-languageserver-textdocument@1.0.12: - resolution: {integrity: sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==} - - vscode-languageserver-types@3.16.0: - resolution: {integrity: sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA==} - - vscode-languageserver-types@3.17.5: - resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==} - - vscode-languageserver@7.0.0: - resolution: {integrity: sha512-60HTx5ID+fLRcgdHfmz0LDZAXYEV68fzwG0JWwEPBode9NuMYTIxuYXPg4ngO8i8+Ou0lM7y6GzaYWbiDL0drw==} - hasBin: true - - vscode-languageserver@9.0.1: - resolution: {integrity: sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==} - hasBin: true - - vscode-nls@5.2.0: - resolution: {integrity: sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==} - - vscode-uri@2.1.2: - resolution: {integrity: sha512-8TEXQxlldWAuIODdukIb+TR5s+9Ds40eSJrw+1iDDA9IFORPjMELarNQE3myz5XIkWWpdprmJjm1/SxMlWOC8A==} - - vscode-uri@3.0.8: - resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} - - web-namespaces@2.0.1: - resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} - - which-pm-runs@1.1.0: - resolution: {integrity: sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==} - engines: {node: '>=4'} - - which-pm@3.0.0: - resolution: {integrity: sha512-ysVYmw6+ZBhx3+ZkcPwRuJi38ZOTLJJ33PSHaitLxSKUMsh0LkKd0nC69zZCwt5D+AYUcMK2hhw4yWny20vSGg==} - engines: {node: '>=18.12'} - - widest-line@4.0.1: - resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} - engines: {node: '>=12'} - - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - xxhash-wasm@1.0.2: - resolution: {integrity: sha512-ibF0Or+FivM9lNrg+HGJfVX8WJqgo+kCLDc4vx6xMeTce7Aj+DLttKbxxRR/gNLSAelRc1omAPlJ77N/Jem07A==} - - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - - yaml-language-server@1.15.0: - resolution: {integrity: sha512-N47AqBDCMQmh6mBLmI6oqxryHRzi33aPFPsJhYy3VTUGCdLHYjGh4FZzpUjRlphaADBBkDmnkM/++KNIOHi5Rw==} - hasBin: true - - yaml@2.2.2: - resolution: {integrity: sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA==} - engines: {node: '>= 14'} - - yaml@2.5.1: - resolution: {integrity: sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==} - engines: {node: '>= 14'} - hasBin: true - - yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} - - yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} - - yocto-queue@1.1.1: - resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==} - engines: {node: '>=12.20'} - - zod-to-json-schema@3.23.3: - resolution: {integrity: sha512-TYWChTxKQbRJp5ST22o/Irt9KC5nj7CdBKYB/AosCRdj/wxEMvv4NNaj9XVUHDOIp53ZxArGhnw5HMZziPFjog==} - peerDependencies: - zod: ^3.23.3 - - zod-to-ts@1.2.0: - resolution: {integrity: sha512-x30XE43V+InwGpvTySRNz9kB7qFU8DlyEy7BsSTCHPH1R0QasMmHWZDCzYm6bVXtj/9NNJAZF3jW8rzFvH5OFA==} - peerDependencies: - typescript: ^4.9.4 || ^5.0.2 - zod: ^3 - - zod@3.23.8: - resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} - - zwitch@2.0.4: - resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} - -snapshots: - - '@ampproject/remapping@2.3.0': - dependencies: - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - - '@astrojs/check@0.9.3(typescript@5.6.2)': - dependencies: - '@astrojs/language-server': 2.14.2(typescript@5.6.2) - chokidar: 3.6.0 - fast-glob: 3.3.2 - kleur: 4.1.5 - typescript: 5.6.2 - yargs: 17.7.2 - transitivePeerDependencies: - - prettier - - prettier-plugin-astro - - '@astrojs/compiler@2.10.3': {} - - '@astrojs/internal-helpers@0.4.1': {} - - '@astrojs/language-server@2.14.2(typescript@5.6.2)': - dependencies: - '@astrojs/compiler': 2.10.3 - '@astrojs/yaml2ts': 0.2.1 - '@jridgewell/sourcemap-codec': 1.5.0 - '@volar/kit': 2.4.4(typescript@5.6.2) - '@volar/language-core': 2.4.4 - '@volar/language-server': 2.4.4 - '@volar/language-service': 2.4.4 - '@volar/typescript': 2.4.4 - fast-glob: 3.3.2 - muggle-string: 0.4.1 - volar-service-css: 0.0.61(@volar/language-service@2.4.4) - volar-service-emmet: 0.0.61(@volar/language-service@2.4.4) - volar-service-html: 0.0.61(@volar/language-service@2.4.4) - volar-service-prettier: 0.0.61(@volar/language-service@2.4.4) - volar-service-typescript: 0.0.61(@volar/language-service@2.4.4) - volar-service-typescript-twoslash-queries: 0.0.61(@volar/language-service@2.4.4) - volar-service-yaml: 0.0.61(@volar/language-service@2.4.4) - vscode-html-languageservice: 5.3.1 - vscode-uri: 3.0.8 - transitivePeerDependencies: - - typescript - - '@astrojs/markdown-remark@5.2.0': - dependencies: - '@astrojs/prism': 3.1.0 - github-slugger: 2.0.0 - hast-util-from-html: 2.0.2 - hast-util-to-text: 4.0.2 - import-meta-resolve: 4.1.0 - mdast-util-definitions: 6.0.0 - rehype-raw: 7.0.0 - rehype-stringify: 10.0.0 - remark-gfm: 4.0.0 - remark-parse: 11.0.0 - remark-rehype: 11.1.0 - remark-smartypants: 3.0.2 - shiki: 1.17.6 - unified: 11.0.5 - unist-util-remove-position: 5.0.0 - unist-util-visit: 5.0.0 - unist-util-visit-parents: 6.0.1 - vfile: 6.0.3 - transitivePeerDependencies: - - supports-color - - '@astrojs/mdx@3.1.6(astro@4.15.5(rollup@4.21.3)(typescript@5.6.2))': - dependencies: - '@astrojs/markdown-remark': 5.2.0 - '@mdx-js/mdx': 3.0.1 - acorn: 8.12.1 - astro: 4.15.5(rollup@4.21.3)(typescript@5.6.2) - es-module-lexer: 1.5.4 - estree-util-visit: 2.0.0 - gray-matter: 4.0.3 - hast-util-to-html: 9.0.2 - kleur: 4.1.5 - rehype-raw: 7.0.0 - remark-gfm: 4.0.0 - remark-smartypants: 3.0.2 - source-map: 0.7.4 - unist-util-visit: 5.0.0 - vfile: 6.0.3 - transitivePeerDependencies: - - supports-color - - '@astrojs/prism@3.1.0': - dependencies: - prismjs: 1.29.0 - - '@astrojs/sitemap@3.1.6': - dependencies: - sitemap: 7.1.2 - stream-replace-string: 2.0.0 - zod: 3.23.8 - - '@astrojs/starlight@0.27.1(astro@4.15.5(rollup@4.21.3)(typescript@5.6.2))': - dependencies: - '@astrojs/mdx': 3.1.6(astro@4.15.5(rollup@4.21.3)(typescript@5.6.2)) - '@astrojs/sitemap': 3.1.6 - '@pagefind/default-ui': 1.1.1 - '@types/hast': 3.0.4 - '@types/mdast': 4.0.4 - astro: 4.15.5(rollup@4.21.3)(typescript@5.6.2) - astro-expressive-code: 0.35.6(astro@4.15.5(rollup@4.21.3)(typescript@5.6.2)) - bcp-47: 2.1.0 - hast-util-from-html: 2.0.2 - hast-util-select: 6.0.2 - hast-util-to-string: 3.0.0 - hastscript: 9.0.0 - mdast-util-directive: 3.0.0 - mdast-util-to-markdown: 2.1.0 - mdast-util-to-string: 4.0.0 - pagefind: 1.1.1 - rehype: 13.0.1 - rehype-format: 5.0.0 - remark-directive: 3.0.0 - unified: 11.0.5 - unist-util-visit: 5.0.0 - vfile: 6.0.3 - transitivePeerDependencies: - - supports-color - - '@astrojs/telemetry@3.1.0': - dependencies: - ci-info: 4.0.0 - debug: 4.3.7 - dlv: 1.1.3 - dset: 3.1.4 - is-docker: 3.0.0 - is-wsl: 3.1.0 - which-pm-runs: 1.1.0 - transitivePeerDependencies: - - supports-color - - '@astrojs/yaml2ts@0.2.1': - dependencies: - yaml: 2.5.1 - - '@babel/code-frame@7.24.7': - dependencies: - '@babel/highlight': 7.24.7 - picocolors: 1.1.0 - - '@babel/compat-data@7.25.4': {} - - '@babel/core@7.25.2': - dependencies: - '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.24.7 - '@babel/generator': 7.25.6 - '@babel/helper-compilation-targets': 7.25.2 - '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) - '@babel/helpers': 7.25.6 - '@babel/parser': 7.25.6 - '@babel/template': 7.25.0 - '@babel/traverse': 7.25.6 - '@babel/types': 7.25.6 - convert-source-map: 2.0.0 - debug: 4.3.7 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/generator@7.25.6': - dependencies: - '@babel/types': 7.25.6 - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - jsesc: 2.5.2 - - '@babel/helper-annotate-as-pure@7.24.7': - dependencies: - '@babel/types': 7.25.6 - - '@babel/helper-compilation-targets@7.25.2': - dependencies: - '@babel/compat-data': 7.25.4 - '@babel/helper-validator-option': 7.24.8 - browserslist: 4.23.3 - lru-cache: 5.1.1 - semver: 6.3.1 - - '@babel/helper-module-imports@7.24.7': - dependencies: - '@babel/traverse': 7.25.6 - '@babel/types': 7.25.6 - transitivePeerDependencies: - - supports-color - - '@babel/helper-module-transforms@7.25.2(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-module-imports': 7.24.7 - '@babel/helper-simple-access': 7.24.7 - '@babel/helper-validator-identifier': 7.24.7 - '@babel/traverse': 7.25.6 - transitivePeerDependencies: - - supports-color - - '@babel/helper-plugin-utils@7.24.8': {} - - '@babel/helper-simple-access@7.24.7': - dependencies: - '@babel/traverse': 7.25.6 - '@babel/types': 7.25.6 - transitivePeerDependencies: - - supports-color - - '@babel/helper-string-parser@7.24.8': {} - - '@babel/helper-validator-identifier@7.24.7': {} - - '@babel/helper-validator-option@7.24.8': {} - - '@babel/helpers@7.25.6': - dependencies: - '@babel/template': 7.25.0 - '@babel/types': 7.25.6 - - '@babel/highlight@7.24.7': - dependencies: - '@babel/helper-validator-identifier': 7.24.7 - chalk: 2.4.2 - js-tokens: 4.0.0 - picocolors: 1.1.0 - - '@babel/parser@7.25.6': - dependencies: - '@babel/types': 7.25.6 - - '@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - - '@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-annotate-as-pure': 7.24.7 - '@babel/helper-module-imports': 7.24.7 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.25.2) - '@babel/types': 7.25.6 - transitivePeerDependencies: - - supports-color - - '@babel/template@7.25.0': - dependencies: - '@babel/code-frame': 7.24.7 - '@babel/parser': 7.25.6 - '@babel/types': 7.25.6 - - '@babel/traverse@7.25.6': - dependencies: - '@babel/code-frame': 7.24.7 - '@babel/generator': 7.25.6 - '@babel/parser': 7.25.6 - '@babel/template': 7.25.0 - '@babel/types': 7.25.6 - debug: 4.3.7 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - - '@babel/types@7.25.6': - dependencies: - '@babel/helper-string-parser': 7.24.8 - '@babel/helper-validator-identifier': 7.24.7 - to-fast-properties: 2.0.0 - - '@ctrl/tinycolor@4.1.0': {} - - '@emmetio/abbreviation@2.3.3': - dependencies: - '@emmetio/scanner': 1.0.4 - - '@emmetio/css-abbreviation@2.1.8': - dependencies: - '@emmetio/scanner': 1.0.4 - - '@emmetio/css-parser@0.4.0': - dependencies: - '@emmetio/stream-reader': 2.2.0 - '@emmetio/stream-reader-utils': 0.1.0 - - '@emmetio/html-matcher@1.3.0': - dependencies: - '@emmetio/scanner': 1.0.4 - - '@emmetio/scanner@1.0.4': {} - - '@emmetio/stream-reader-utils@0.1.0': {} - - '@emmetio/stream-reader@2.2.0': {} - - '@emnapi/runtime@1.2.0': - dependencies: - tslib: 2.7.0 - optional: true - - '@esbuild/aix-ppc64@0.21.5': - optional: true - - '@esbuild/android-arm64@0.21.5': - optional: true - - '@esbuild/android-arm@0.21.5': - optional: true - - '@esbuild/android-x64@0.21.5': - optional: true - - '@esbuild/darwin-arm64@0.21.5': - optional: true - - '@esbuild/darwin-x64@0.21.5': - optional: true - - '@esbuild/freebsd-arm64@0.21.5': - optional: true - - '@esbuild/freebsd-x64@0.21.5': - optional: true - - '@esbuild/linux-arm64@0.21.5': - optional: true - - '@esbuild/linux-arm@0.21.5': - optional: true - - '@esbuild/linux-ia32@0.21.5': - optional: true - - '@esbuild/linux-loong64@0.21.5': - optional: true - - '@esbuild/linux-mips64el@0.21.5': - optional: true - - '@esbuild/linux-ppc64@0.21.5': - optional: true - - '@esbuild/linux-riscv64@0.21.5': - optional: true - - '@esbuild/linux-s390x@0.21.5': - optional: true - - '@esbuild/linux-x64@0.21.5': - optional: true - - '@esbuild/netbsd-x64@0.21.5': - optional: true - - '@esbuild/openbsd-x64@0.21.5': - optional: true - - '@esbuild/sunos-x64@0.21.5': - optional: true - - '@esbuild/win32-arm64@0.21.5': - optional: true - - '@esbuild/win32-ia32@0.21.5': - optional: true - - '@esbuild/win32-x64@0.21.5': - optional: true - - '@expressive-code/core@0.35.6': - dependencies: - '@ctrl/tinycolor': 4.1.0 - hast-util-select: 6.0.2 - hast-util-to-html: 9.0.2 - hast-util-to-text: 4.0.2 - hastscript: 9.0.0 - postcss: 8.4.45 - postcss-nested: 6.2.0(postcss@8.4.45) - unist-util-visit: 5.0.0 - unist-util-visit-parents: 6.0.1 - - '@expressive-code/plugin-frames@0.35.6': - dependencies: - '@expressive-code/core': 0.35.6 - - '@expressive-code/plugin-shiki@0.35.6': - dependencies: - '@expressive-code/core': 0.35.6 - shiki: 1.17.6 - - '@expressive-code/plugin-text-markers@0.35.6': - dependencies: - '@expressive-code/core': 0.35.6 - - '@img/sharp-darwin-arm64@0.33.5': - optionalDependencies: - '@img/sharp-libvips-darwin-arm64': 1.0.4 - optional: true - - '@img/sharp-darwin-x64@0.33.5': - optionalDependencies: - '@img/sharp-libvips-darwin-x64': 1.0.4 - optional: true - - '@img/sharp-libvips-darwin-arm64@1.0.4': - optional: true - - '@img/sharp-libvips-darwin-x64@1.0.4': - optional: true - - '@img/sharp-libvips-linux-arm64@1.0.4': - optional: true - - '@img/sharp-libvips-linux-arm@1.0.5': - optional: true - - '@img/sharp-libvips-linux-s390x@1.0.4': - optional: true - - '@img/sharp-libvips-linux-x64@1.0.4': - optional: true - - '@img/sharp-libvips-linuxmusl-arm64@1.0.4': - optional: true - - '@img/sharp-libvips-linuxmusl-x64@1.0.4': - optional: true - - '@img/sharp-linux-arm64@0.33.5': - optionalDependencies: - '@img/sharp-libvips-linux-arm64': 1.0.4 - optional: true - - '@img/sharp-linux-arm@0.33.5': - optionalDependencies: - '@img/sharp-libvips-linux-arm': 1.0.5 - optional: true - - '@img/sharp-linux-s390x@0.33.5': - optionalDependencies: - '@img/sharp-libvips-linux-s390x': 1.0.4 - optional: true - - '@img/sharp-linux-x64@0.33.5': - optionalDependencies: - '@img/sharp-libvips-linux-x64': 1.0.4 - optional: true - - '@img/sharp-linuxmusl-arm64@0.33.5': - optionalDependencies: - '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 - optional: true - - '@img/sharp-linuxmusl-x64@0.33.5': - optionalDependencies: - '@img/sharp-libvips-linuxmusl-x64': 1.0.4 - optional: true - - '@img/sharp-wasm32@0.33.5': - dependencies: - '@emnapi/runtime': 1.2.0 - optional: true - - '@img/sharp-win32-ia32@0.33.5': - optional: true - - '@img/sharp-win32-x64@0.33.5': - optional: true - - '@jridgewell/gen-mapping@0.3.5': - dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.5.0 - '@jridgewell/trace-mapping': 0.3.25 - - '@jridgewell/resolve-uri@3.1.2': {} - - '@jridgewell/set-array@1.2.1': {} - - '@jridgewell/sourcemap-codec@1.5.0': {} - - '@jridgewell/trace-mapping@0.3.25': - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 - - '@lorenzo_lewis/starlight-utils@0.1.2(@astrojs/starlight@0.27.1(astro@4.15.5(rollup@4.21.3)(typescript@5.6.2)))(astro@4.15.5(rollup@4.21.3)(typescript@5.6.2))': - dependencies: - '@astrojs/starlight': 0.27.1(astro@4.15.5(rollup@4.21.3)(typescript@5.6.2)) - astro: 4.15.5(rollup@4.21.3)(typescript@5.6.2) - astro-integration-kit: 0.14.0(astro@4.15.5(rollup@4.21.3)(typescript@5.6.2)) - transitivePeerDependencies: - - '@astrojs/db' - - '@mdx-js/mdx@3.0.1': - dependencies: - '@types/estree': 1.0.5 - '@types/estree-jsx': 1.0.5 - '@types/hast': 3.0.4 - '@types/mdx': 2.0.13 - collapse-white-space: 2.1.0 - devlop: 1.1.0 - estree-util-build-jsx: 3.0.1 - estree-util-is-identifier-name: 3.0.0 - estree-util-to-js: 2.0.0 - estree-walker: 3.0.3 - hast-util-to-estree: 3.1.0 - hast-util-to-jsx-runtime: 2.3.0 - markdown-extensions: 2.0.0 - periscopic: 3.1.0 - remark-mdx: 3.0.1 - remark-parse: 11.0.0 - remark-rehype: 11.1.0 - source-map: 0.7.4 - unified: 11.0.5 - unist-util-position-from-estree: 2.0.0 - unist-util-stringify-position: 4.0.0 - unist-util-visit: 5.0.0 - vfile: 6.0.3 - transitivePeerDependencies: - - supports-color - - '@nodelib/fs.scandir@2.1.5': - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - - '@nodelib/fs.stat@2.0.5': {} - - '@nodelib/fs.walk@1.2.8': - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.17.1 - - '@oslojs/encoding@0.4.1': {} - - '@pagefind/darwin-arm64@1.1.1': - optional: true - - '@pagefind/darwin-x64@1.1.1': - optional: true - - '@pagefind/default-ui@1.1.1': {} - - '@pagefind/linux-arm64@1.1.1': - optional: true - - '@pagefind/linux-x64@1.1.1': - optional: true - - '@pagefind/windows-x64@1.1.1': - optional: true - - '@rollup/pluginutils@5.1.0(rollup@4.21.3)': - dependencies: - '@types/estree': 1.0.5 - estree-walker: 2.0.2 - picomatch: 2.3.1 - optionalDependencies: - rollup: 4.21.3 - - '@rollup/rollup-android-arm-eabi@4.21.3': - optional: true - - '@rollup/rollup-android-arm64@4.21.3': - optional: true - - '@rollup/rollup-darwin-arm64@4.21.3': - optional: true - - '@rollup/rollup-darwin-x64@4.21.3': - optional: true - - '@rollup/rollup-linux-arm-gnueabihf@4.21.3': - optional: true - - '@rollup/rollup-linux-arm-musleabihf@4.21.3': - optional: true - - '@rollup/rollup-linux-arm64-gnu@4.21.3': - optional: true - - '@rollup/rollup-linux-arm64-musl@4.21.3': - optional: true - - '@rollup/rollup-linux-powerpc64le-gnu@4.21.3': - optional: true - - '@rollup/rollup-linux-riscv64-gnu@4.21.3': - optional: true - - '@rollup/rollup-linux-s390x-gnu@4.21.3': - optional: true - - '@rollup/rollup-linux-x64-gnu@4.21.3': - optional: true - - '@rollup/rollup-linux-x64-musl@4.21.3': - optional: true - - '@rollup/rollup-win32-arm64-msvc@4.21.3': - optional: true - - '@rollup/rollup-win32-ia32-msvc@4.21.3': - optional: true - - '@rollup/rollup-win32-x64-msvc@4.21.3': - optional: true - - '@shikijs/core@1.17.6': - dependencies: - '@shikijs/engine-javascript': 1.17.6 - '@shikijs/engine-oniguruma': 1.17.6 - '@shikijs/types': 1.17.6 - '@shikijs/vscode-textmate': 9.2.2 - '@types/hast': 3.0.4 - hast-util-to-html: 9.0.2 - - '@shikijs/engine-javascript@1.17.6': - dependencies: - '@shikijs/types': 1.17.6 - oniguruma-to-js: 0.4.3 - - '@shikijs/engine-oniguruma@1.17.6': - dependencies: - '@shikijs/types': 1.17.6 - '@shikijs/vscode-textmate': 9.2.2 - - '@shikijs/types@1.17.6': - dependencies: - '@shikijs/vscode-textmate': 9.2.2 - '@types/hast': 3.0.4 - - '@shikijs/vscode-textmate@9.2.2': {} - - '@types/acorn@4.0.6': - dependencies: - '@types/estree': 1.0.5 - - '@types/babel__core@7.20.5': - dependencies: - '@babel/parser': 7.25.6 - '@babel/types': 7.25.6 - '@types/babel__generator': 7.6.8 - '@types/babel__template': 7.4.4 - '@types/babel__traverse': 7.20.6 - - '@types/babel__generator@7.6.8': - dependencies: - '@babel/types': 7.25.6 - - '@types/babel__template@7.4.4': - dependencies: - '@babel/parser': 7.25.6 - '@babel/types': 7.25.6 - - '@types/babel__traverse@7.20.6': - dependencies: - '@babel/types': 7.25.6 - - '@types/cookie@0.6.0': {} - - '@types/debug@4.1.12': - dependencies: - '@types/ms': 0.7.34 - - '@types/estree-jsx@1.0.5': - dependencies: - '@types/estree': 1.0.5 - - '@types/estree@1.0.5': {} - - '@types/hast@3.0.4': - dependencies: - '@types/unist': 3.0.3 - - '@types/mdast@4.0.4': - dependencies: - '@types/unist': 3.0.3 - - '@types/mdx@2.0.13': {} - - '@types/ms@0.7.34': {} - - '@types/nlcst@2.0.3': - dependencies: - '@types/unist': 3.0.3 - - '@types/node@17.0.45': {} - - '@types/sax@1.2.7': - dependencies: - '@types/node': 17.0.45 - - '@types/unist@2.0.11': {} - - '@types/unist@3.0.3': {} - - '@ungap/structured-clone@1.2.0': {} - - '@volar/kit@2.4.4(typescript@5.6.2)': - dependencies: - '@volar/language-service': 2.4.4 - '@volar/typescript': 2.4.4 - typesafe-path: 0.2.2 - typescript: 5.6.2 - vscode-languageserver-textdocument: 1.0.12 - vscode-uri: 3.0.8 - - '@volar/language-core@2.4.4': - dependencies: - '@volar/source-map': 2.4.4 - - '@volar/language-server@2.4.4': - dependencies: - '@volar/language-core': 2.4.4 - '@volar/language-service': 2.4.4 - '@volar/typescript': 2.4.4 - path-browserify: 1.0.1 - request-light: 0.7.0 - vscode-languageserver: 9.0.1 - vscode-languageserver-protocol: 3.17.5 - vscode-languageserver-textdocument: 1.0.12 - vscode-uri: 3.0.8 - - '@volar/language-service@2.4.4': - dependencies: - '@volar/language-core': 2.4.4 - vscode-languageserver-protocol: 3.17.5 - vscode-languageserver-textdocument: 1.0.12 - vscode-uri: 3.0.8 - - '@volar/source-map@2.4.4': {} - - '@volar/typescript@2.4.4': - dependencies: - '@volar/language-core': 2.4.4 - path-browserify: 1.0.1 - vscode-uri: 3.0.8 - - '@vscode/emmet-helper@2.9.3': - dependencies: - emmet: 2.4.7 - jsonc-parser: 2.3.1 - vscode-languageserver-textdocument: 1.0.12 - vscode-languageserver-types: 3.17.5 - vscode-uri: 2.1.2 - - '@vscode/l10n@0.0.18': {} - - acorn-jsx@5.3.2(acorn@8.12.1): - dependencies: - acorn: 8.12.1 - - acorn@8.12.1: {} - - ajv@8.17.1: - dependencies: - fast-deep-equal: 3.1.3 - fast-uri: 3.0.1 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 - - ansi-align@3.0.1: - dependencies: - string-width: 4.2.3 - - ansi-regex@5.0.1: {} - - ansi-regex@6.1.0: {} - - ansi-styles@3.2.1: - dependencies: - color-convert: 1.9.3 - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - ansi-styles@6.2.1: {} - - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - arg@5.0.2: {} - - argparse@1.0.10: - dependencies: - sprintf-js: 1.0.3 - - argparse@2.0.1: {} - - aria-query@5.3.1: {} - - array-iterate@2.0.1: {} - - ast-types@0.16.1: - dependencies: - tslib: 2.7.0 - - astring@1.9.0: {} - - astro-expressive-code@0.35.6(astro@4.15.5(rollup@4.21.3)(typescript@5.6.2)): - dependencies: - astro: 4.15.5(rollup@4.21.3)(typescript@5.6.2) - rehype-expressive-code: 0.35.6 - - astro-integration-kit@0.14.0(astro@4.15.5(rollup@4.21.3)(typescript@5.6.2)): - dependencies: - astro: 4.15.5(rollup@4.21.3)(typescript@5.6.2) - pathe: 1.1.2 - recast: 0.23.9 - - astro@4.15.5(rollup@4.21.3)(typescript@5.6.2): - dependencies: - '@astrojs/compiler': 2.10.3 - '@astrojs/internal-helpers': 0.4.1 - '@astrojs/markdown-remark': 5.2.0 - '@astrojs/telemetry': 3.1.0 - '@babel/core': 7.25.2 - '@babel/plugin-transform-react-jsx': 7.25.2(@babel/core@7.25.2) - '@babel/types': 7.25.6 - '@oslojs/encoding': 0.4.1 - '@rollup/pluginutils': 5.1.0(rollup@4.21.3) - '@types/babel__core': 7.20.5 - '@types/cookie': 0.6.0 - acorn: 8.12.1 - aria-query: 5.3.1 - axobject-query: 4.1.0 - boxen: 7.1.1 - ci-info: 4.0.0 - clsx: 2.1.1 - common-ancestor-path: 1.0.1 - cookie: 0.6.0 - cssesc: 3.0.0 - debug: 4.3.7 - deterministic-object-hash: 2.0.2 - devalue: 5.0.0 - diff: 5.2.0 - dlv: 1.1.3 - dset: 3.1.4 - es-module-lexer: 1.5.4 - esbuild: 0.21.5 - estree-walker: 3.0.3 - fast-glob: 3.3.2 - fastq: 1.17.1 - flattie: 1.1.1 - github-slugger: 2.0.0 - gray-matter: 4.0.3 - html-escaper: 3.0.3 - http-cache-semantics: 4.1.1 - js-yaml: 4.1.0 - kleur: 4.1.5 - magic-string: 0.30.11 - magicast: 0.3.5 - micromatch: 4.0.8 - mrmime: 2.0.0 - neotraverse: 0.6.18 - ora: 8.1.0 - p-limit: 6.1.0 - p-queue: 8.0.1 - preferred-pm: 4.0.0 - prompts: 2.4.2 - rehype: 13.0.1 - semver: 7.6.3 - shiki: 1.17.6 - string-width: 7.2.0 - strip-ansi: 7.1.0 - tinyexec: 0.3.0 - tsconfck: 3.1.3(typescript@5.6.2) - unist-util-visit: 5.0.0 - vfile: 6.0.3 - vite: 5.4.5 - vitefu: 1.0.2(vite@5.4.5) - which-pm: 3.0.0 - xxhash-wasm: 1.0.2 - yargs-parser: 21.1.1 - zod: 3.23.8 - zod-to-json-schema: 3.23.3(zod@3.23.8) - zod-to-ts: 1.2.0(typescript@5.6.2)(zod@3.23.8) - optionalDependencies: - sharp: 0.33.5 - transitivePeerDependencies: - - '@types/node' - - less - - lightningcss - - rollup - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - typescript - - axobject-query@4.1.0: {} - - b4a@1.6.6: {} - - bail@2.0.2: {} - - bare-events@2.4.2: - optional: true - - bare-fs@2.3.5: - dependencies: - bare-events: 2.4.2 - bare-path: 2.1.3 - bare-stream: 2.3.0 - optional: true - - bare-os@2.4.4: - optional: true - - bare-path@2.1.3: - dependencies: - bare-os: 2.4.4 - optional: true - - bare-stream@2.3.0: - dependencies: - b4a: 1.6.6 - streamx: 2.20.1 - optional: true - - base-64@1.0.0: {} - - base64-js@1.5.1: {} - - bcp-47-match@2.0.3: {} - - bcp-47@2.1.0: - dependencies: - is-alphabetical: 2.0.1 - is-alphanumerical: 2.0.1 - is-decimal: 2.0.1 - - binary-extensions@2.3.0: {} - - bl@4.1.0: - dependencies: - buffer: 5.7.1 - inherits: 2.0.4 - readable-stream: 3.6.2 - - boolbase@1.0.0: {} - - boxen@7.1.1: - dependencies: - ansi-align: 3.0.1 - camelcase: 7.0.1 - chalk: 5.3.0 - cli-boxes: 3.0.0 - string-width: 5.1.2 - type-fest: 2.19.0 - widest-line: 4.0.1 - wrap-ansi: 8.1.0 - - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - - browserslist@4.23.3: - dependencies: - caniuse-lite: 1.0.30001660 - electron-to-chromium: 1.5.22 - node-releases: 2.0.18 - update-browserslist-db: 1.1.0(browserslist@4.23.3) - - buffer@5.7.1: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - camelcase@7.0.1: {} - - caniuse-lite@1.0.30001660: {} - - ccount@2.0.1: {} - - chalk@2.4.2: - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 - - chalk@5.3.0: {} - - character-entities-html4@2.1.0: {} - - character-entities-legacy@3.0.0: {} - - character-entities@2.0.2: {} - - character-reference-invalid@2.0.1: {} - - chokidar@3.6.0: - dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - chownr@1.1.4: {} - - ci-info@4.0.0: {} - - cli-boxes@3.0.0: {} - - cli-cursor@5.0.0: - dependencies: - restore-cursor: 5.1.0 - - cli-spinners@2.9.2: {} - - cliui@8.0.1: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - clsx@2.1.1: {} - - collapse-white-space@2.1.0: {} - - color-convert@1.9.3: - dependencies: - color-name: 1.1.3 - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.3: {} - - color-name@1.1.4: {} - - color-string@1.9.1: - dependencies: - color-name: 1.1.4 - simple-swizzle: 0.2.2 - - color@4.2.3: - dependencies: - color-convert: 2.0.1 - color-string: 1.9.1 - - comma-separated-tokens@2.0.3: {} - - common-ancestor-path@1.0.1: {} - - convert-source-map@2.0.0: {} - - cookie@0.6.0: {} - - css-selector-parser@3.0.5: {} - - cssesc@3.0.0: {} - - debug@4.3.7: - dependencies: - ms: 2.1.3 - - decode-named-character-reference@1.0.2: - dependencies: - character-entities: 2.0.2 - - decompress-response@6.0.0: - dependencies: - mimic-response: 3.1.0 - - deep-extend@0.6.0: {} - - dequal@2.0.3: {} - - detect-libc@2.0.3: {} - - deterministic-object-hash@2.0.2: - dependencies: - base-64: 1.0.0 - - devalue@5.0.0: {} - - devlop@1.1.0: - dependencies: - dequal: 2.0.3 - - diff@5.2.0: {} - - direction@2.0.1: {} - - dlv@1.1.3: {} - - dset@3.1.4: {} - - eastasianwidth@0.2.0: {} - - electron-to-chromium@1.5.22: {} - - emmet@2.4.7: - dependencies: - '@emmetio/abbreviation': 2.3.3 - '@emmetio/css-abbreviation': 2.1.8 - - emoji-regex@10.4.0: {} - - emoji-regex@8.0.0: {} - - emoji-regex@9.2.2: {} - - end-of-stream@1.4.4: - dependencies: - once: 1.4.0 - - entities@4.5.0: {} - - es-module-lexer@1.5.4: {} - - esbuild@0.21.5: - optionalDependencies: - '@esbuild/aix-ppc64': 0.21.5 - '@esbuild/android-arm': 0.21.5 - '@esbuild/android-arm64': 0.21.5 - '@esbuild/android-x64': 0.21.5 - '@esbuild/darwin-arm64': 0.21.5 - '@esbuild/darwin-x64': 0.21.5 - '@esbuild/freebsd-arm64': 0.21.5 - '@esbuild/freebsd-x64': 0.21.5 - '@esbuild/linux-arm': 0.21.5 - '@esbuild/linux-arm64': 0.21.5 - '@esbuild/linux-ia32': 0.21.5 - '@esbuild/linux-loong64': 0.21.5 - '@esbuild/linux-mips64el': 0.21.5 - '@esbuild/linux-ppc64': 0.21.5 - '@esbuild/linux-riscv64': 0.21.5 - '@esbuild/linux-s390x': 0.21.5 - '@esbuild/linux-x64': 0.21.5 - '@esbuild/netbsd-x64': 0.21.5 - '@esbuild/openbsd-x64': 0.21.5 - '@esbuild/sunos-x64': 0.21.5 - '@esbuild/win32-arm64': 0.21.5 - '@esbuild/win32-ia32': 0.21.5 - '@esbuild/win32-x64': 0.21.5 - - escalade@3.2.0: {} - - escape-string-regexp@1.0.5: {} - - escape-string-regexp@5.0.0: {} - - esprima@4.0.1: {} - - estree-util-attach-comments@3.0.0: - dependencies: - '@types/estree': 1.0.5 - - estree-util-build-jsx@3.0.1: - dependencies: - '@types/estree-jsx': 1.0.5 - devlop: 1.1.0 - estree-util-is-identifier-name: 3.0.0 - estree-walker: 3.0.3 - - estree-util-is-identifier-name@3.0.0: {} - - estree-util-to-js@2.0.0: - dependencies: - '@types/estree-jsx': 1.0.5 - astring: 1.9.0 - source-map: 0.7.4 - - estree-util-visit@2.0.0: - dependencies: - '@types/estree-jsx': 1.0.5 - '@types/unist': 3.0.3 - - estree-walker@2.0.2: {} - - estree-walker@3.0.3: - dependencies: - '@types/estree': 1.0.5 - - eventemitter3@5.0.1: {} - - expand-template@2.0.3: {} - - expressive-code@0.35.6: - dependencies: - '@expressive-code/core': 0.35.6 - '@expressive-code/plugin-frames': 0.35.6 - '@expressive-code/plugin-shiki': 0.35.6 - '@expressive-code/plugin-text-markers': 0.35.6 - - extend-shallow@2.0.1: - dependencies: - is-extendable: 0.1.1 - - extend@3.0.2: {} - - fast-deep-equal@3.1.3: {} - - fast-fifo@1.3.2: {} - - fast-glob@3.3.2: - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.8 - - fast-uri@3.0.1: {} - - fastq@1.17.1: - dependencies: - reusify: 1.0.4 - - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - - find-up-simple@1.0.0: {} - - find-up@4.1.0: - dependencies: - locate-path: 5.0.0 - path-exists: 4.0.0 - - find-yarn-workspace-root2@1.2.16: - dependencies: - micromatch: 4.0.8 - pkg-dir: 4.2.0 - - flattie@1.1.1: {} - - fs-constants@1.0.0: {} - - fsevents@2.3.3: - optional: true - - gensync@1.0.0-beta.2: {} - - get-caller-file@2.0.5: {} - - get-east-asian-width@1.2.0: {} - - github-from-package@0.0.0: {} - - github-slugger@2.0.0: {} - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - globals@11.12.0: {} - - graceful-fs@4.2.11: {} - - gray-matter@4.0.3: - dependencies: - js-yaml: 3.14.1 - kind-of: 6.0.3 - section-matter: 1.0.0 - strip-bom-string: 1.0.0 - - has-flag@3.0.0: {} - - hast-util-embedded@3.0.0: - dependencies: - '@types/hast': 3.0.4 - hast-util-is-element: 3.0.0 - - hast-util-from-html@2.0.2: - dependencies: - '@types/hast': 3.0.4 - devlop: 1.1.0 - hast-util-from-parse5: 8.0.1 - parse5: 7.1.2 - vfile: 6.0.3 - vfile-message: 4.0.2 - - hast-util-from-parse5@8.0.1: - dependencies: - '@types/hast': 3.0.4 - '@types/unist': 3.0.3 - devlop: 1.1.0 - hastscript: 8.0.0 - property-information: 6.5.0 - vfile: 6.0.3 - vfile-location: 5.0.3 - web-namespaces: 2.0.1 - - hast-util-has-property@3.0.0: - dependencies: - '@types/hast': 3.0.4 - - hast-util-is-body-ok-link@3.0.0: - dependencies: - '@types/hast': 3.0.4 - - hast-util-is-element@3.0.0: - dependencies: - '@types/hast': 3.0.4 - - hast-util-parse-selector@4.0.0: - dependencies: - '@types/hast': 3.0.4 - - hast-util-phrasing@3.0.1: - dependencies: - '@types/hast': 3.0.4 - hast-util-embedded: 3.0.0 - hast-util-has-property: 3.0.0 - hast-util-is-body-ok-link: 3.0.0 - hast-util-is-element: 3.0.0 - - hast-util-raw@9.0.4: - dependencies: - '@types/hast': 3.0.4 - '@types/unist': 3.0.3 - '@ungap/structured-clone': 1.2.0 - hast-util-from-parse5: 8.0.1 - hast-util-to-parse5: 8.0.0 - html-void-elements: 3.0.0 - mdast-util-to-hast: 13.2.0 - parse5: 7.1.2 - unist-util-position: 5.0.0 - unist-util-visit: 5.0.0 - vfile: 6.0.3 - web-namespaces: 2.0.1 - zwitch: 2.0.4 - - hast-util-select@6.0.2: - dependencies: - '@types/hast': 3.0.4 - '@types/unist': 3.0.3 - bcp-47-match: 2.0.3 - comma-separated-tokens: 2.0.3 - css-selector-parser: 3.0.5 - devlop: 1.1.0 - direction: 2.0.1 - hast-util-has-property: 3.0.0 - hast-util-to-string: 3.0.0 - hast-util-whitespace: 3.0.0 - not: 0.1.0 - nth-check: 2.1.1 - property-information: 6.5.0 - space-separated-tokens: 2.0.2 - unist-util-visit: 5.0.0 - zwitch: 2.0.4 - - hast-util-to-estree@3.1.0: - dependencies: - '@types/estree': 1.0.5 - '@types/estree-jsx': 1.0.5 - '@types/hast': 3.0.4 - comma-separated-tokens: 2.0.3 - devlop: 1.1.0 - estree-util-attach-comments: 3.0.0 - estree-util-is-identifier-name: 3.0.0 - hast-util-whitespace: 3.0.0 - mdast-util-mdx-expression: 2.0.1 - mdast-util-mdx-jsx: 3.1.3 - mdast-util-mdxjs-esm: 2.0.1 - property-information: 6.5.0 - space-separated-tokens: 2.0.2 - style-to-object: 0.4.4 - unist-util-position: 5.0.0 - zwitch: 2.0.4 - transitivePeerDependencies: - - supports-color - - hast-util-to-html@9.0.2: - dependencies: - '@types/hast': 3.0.4 - '@types/unist': 3.0.3 - ccount: 2.0.1 - comma-separated-tokens: 2.0.3 - hast-util-whitespace: 3.0.0 - html-void-elements: 3.0.0 - mdast-util-to-hast: 13.2.0 - property-information: 6.5.0 - space-separated-tokens: 2.0.2 - stringify-entities: 4.0.4 - zwitch: 2.0.4 - - hast-util-to-jsx-runtime@2.3.0: - dependencies: - '@types/estree': 1.0.5 - '@types/hast': 3.0.4 - '@types/unist': 3.0.3 - comma-separated-tokens: 2.0.3 - devlop: 1.1.0 - estree-util-is-identifier-name: 3.0.0 - hast-util-whitespace: 3.0.0 - mdast-util-mdx-expression: 2.0.1 - mdast-util-mdx-jsx: 3.1.3 - mdast-util-mdxjs-esm: 2.0.1 - property-information: 6.5.0 - space-separated-tokens: 2.0.2 - style-to-object: 1.0.8 - unist-util-position: 5.0.0 - vfile-message: 4.0.2 - transitivePeerDependencies: - - supports-color - - hast-util-to-parse5@8.0.0: - dependencies: - '@types/hast': 3.0.4 - comma-separated-tokens: 2.0.3 - devlop: 1.1.0 - property-information: 6.5.0 - space-separated-tokens: 2.0.2 - web-namespaces: 2.0.1 - zwitch: 2.0.4 - - hast-util-to-string@3.0.0: - dependencies: - '@types/hast': 3.0.4 - - hast-util-to-text@4.0.2: - dependencies: - '@types/hast': 3.0.4 - '@types/unist': 3.0.3 - hast-util-is-element: 3.0.0 - unist-util-find-after: 5.0.0 - - hast-util-whitespace@3.0.0: - dependencies: - '@types/hast': 3.0.4 - - hastscript@8.0.0: - dependencies: - '@types/hast': 3.0.4 - comma-separated-tokens: 2.0.3 - hast-util-parse-selector: 4.0.0 - property-information: 6.5.0 - space-separated-tokens: 2.0.2 - - hastscript@9.0.0: - dependencies: - '@types/hast': 3.0.4 - comma-separated-tokens: 2.0.3 - hast-util-parse-selector: 4.0.0 - property-information: 6.5.0 - space-separated-tokens: 2.0.2 - - html-escaper@3.0.3: {} - - html-void-elements@3.0.0: {} - - html-whitespace-sensitive-tag-names@3.0.0: {} - - http-cache-semantics@4.1.1: {} - - ieee754@1.2.1: {} - - import-meta-resolve@4.1.0: {} - - inherits@2.0.4: {} - - ini@1.3.8: {} - - inline-style-parser@0.1.1: {} - - inline-style-parser@0.2.4: {} - - is-alphabetical@2.0.1: {} - - is-alphanumerical@2.0.1: - dependencies: - is-alphabetical: 2.0.1 - is-decimal: 2.0.1 - - is-arrayish@0.3.2: {} - - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 - - is-decimal@2.0.1: {} - - is-docker@3.0.0: {} - - is-extendable@0.1.1: {} - - is-extglob@2.1.1: {} - - is-fullwidth-code-point@3.0.0: {} - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-hexadecimal@2.0.1: {} - - is-inside-container@1.0.0: - dependencies: - is-docker: 3.0.0 - - is-interactive@2.0.0: {} - - is-number@7.0.0: {} - - is-plain-obj@4.1.0: {} - - is-reference@3.0.2: - dependencies: - '@types/estree': 1.0.5 - - is-unicode-supported@1.3.0: {} - - is-unicode-supported@2.1.0: {} - - is-wsl@3.1.0: - dependencies: - is-inside-container: 1.0.0 - - js-tokens@4.0.0: {} - - js-yaml@3.14.1: - dependencies: - argparse: 1.0.10 - esprima: 4.0.1 - - js-yaml@4.1.0: - dependencies: - argparse: 2.0.1 - - jsesc@2.5.2: {} - - json-schema-traverse@1.0.0: {} - - json5@2.2.3: {} - - jsonc-parser@2.3.1: {} - - jsonc-parser@3.3.1: {} - - kind-of@6.0.3: {} - - kleur@3.0.3: {} - - kleur@4.1.5: {} - - load-yaml-file@0.2.0: - dependencies: - graceful-fs: 4.2.11 - js-yaml: 3.14.1 - pify: 4.0.1 - strip-bom: 3.0.0 - - locate-path@5.0.0: - dependencies: - p-locate: 4.1.0 - - lodash@4.17.21: {} - - log-symbols@6.0.0: - dependencies: - chalk: 5.3.0 - is-unicode-supported: 1.3.0 - - longest-streak@3.1.0: {} - - lru-cache@5.1.1: - dependencies: - yallist: 3.1.1 - - magic-string@0.30.11: - dependencies: - '@jridgewell/sourcemap-codec': 1.5.0 - - magicast@0.3.5: - dependencies: - '@babel/parser': 7.25.6 - '@babel/types': 7.25.6 - source-map-js: 1.2.1 - - markdown-extensions@2.0.0: {} - - markdown-table@3.0.3: {} - - mdast-util-definitions@6.0.0: - dependencies: - '@types/mdast': 4.0.4 - '@types/unist': 3.0.3 - unist-util-visit: 5.0.0 - - mdast-util-directive@3.0.0: - dependencies: - '@types/mdast': 4.0.4 - '@types/unist': 3.0.3 - devlop: 1.1.0 - mdast-util-from-markdown: 2.0.1 - mdast-util-to-markdown: 2.1.0 - parse-entities: 4.0.1 - stringify-entities: 4.0.4 - unist-util-visit-parents: 6.0.1 - transitivePeerDependencies: - - supports-color - - mdast-util-find-and-replace@3.0.1: - dependencies: - '@types/mdast': 4.0.4 - escape-string-regexp: 5.0.0 - unist-util-is: 6.0.0 - unist-util-visit-parents: 6.0.1 - - mdast-util-from-markdown@2.0.1: - dependencies: - '@types/mdast': 4.0.4 - '@types/unist': 3.0.3 - decode-named-character-reference: 1.0.2 - devlop: 1.1.0 - mdast-util-to-string: 4.0.0 - micromark: 4.0.0 - micromark-util-decode-numeric-character-reference: 2.0.1 - micromark-util-decode-string: 2.0.0 - micromark-util-normalize-identifier: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - unist-util-stringify-position: 4.0.0 - transitivePeerDependencies: - - supports-color - - mdast-util-gfm-autolink-literal@2.0.1: - dependencies: - '@types/mdast': 4.0.4 - ccount: 2.0.1 - devlop: 1.1.0 - mdast-util-find-and-replace: 3.0.1 - micromark-util-character: 2.1.0 - - mdast-util-gfm-footnote@2.0.0: - dependencies: - '@types/mdast': 4.0.4 - devlop: 1.1.0 - mdast-util-from-markdown: 2.0.1 - mdast-util-to-markdown: 2.1.0 - micromark-util-normalize-identifier: 2.0.0 - transitivePeerDependencies: - - supports-color - - mdast-util-gfm-strikethrough@2.0.0: - dependencies: - '@types/mdast': 4.0.4 - mdast-util-from-markdown: 2.0.1 - mdast-util-to-markdown: 2.1.0 - transitivePeerDependencies: - - supports-color - - mdast-util-gfm-table@2.0.0: - dependencies: - '@types/mdast': 4.0.4 - devlop: 1.1.0 - markdown-table: 3.0.3 - mdast-util-from-markdown: 2.0.1 - mdast-util-to-markdown: 2.1.0 - transitivePeerDependencies: - - supports-color - - mdast-util-gfm-task-list-item@2.0.0: - dependencies: - '@types/mdast': 4.0.4 - devlop: 1.1.0 - mdast-util-from-markdown: 2.0.1 - mdast-util-to-markdown: 2.1.0 - transitivePeerDependencies: - - supports-color - - mdast-util-gfm@3.0.0: - dependencies: - mdast-util-from-markdown: 2.0.1 - mdast-util-gfm-autolink-literal: 2.0.1 - mdast-util-gfm-footnote: 2.0.0 - mdast-util-gfm-strikethrough: 2.0.0 - mdast-util-gfm-table: 2.0.0 - mdast-util-gfm-task-list-item: 2.0.0 - mdast-util-to-markdown: 2.1.0 - transitivePeerDependencies: - - supports-color - - mdast-util-mdx-expression@2.0.1: - dependencies: - '@types/estree-jsx': 1.0.5 - '@types/hast': 3.0.4 - '@types/mdast': 4.0.4 - devlop: 1.1.0 - mdast-util-from-markdown: 2.0.1 - mdast-util-to-markdown: 2.1.0 - transitivePeerDependencies: - - supports-color - - mdast-util-mdx-jsx@3.1.3: - dependencies: - '@types/estree-jsx': 1.0.5 - '@types/hast': 3.0.4 - '@types/mdast': 4.0.4 - '@types/unist': 3.0.3 - ccount: 2.0.1 - devlop: 1.1.0 - mdast-util-from-markdown: 2.0.1 - mdast-util-to-markdown: 2.1.0 - parse-entities: 4.0.1 - stringify-entities: 4.0.4 - unist-util-stringify-position: 4.0.0 - vfile-message: 4.0.2 - transitivePeerDependencies: - - supports-color - - mdast-util-mdx@3.0.0: - dependencies: - mdast-util-from-markdown: 2.0.1 - mdast-util-mdx-expression: 2.0.1 - mdast-util-mdx-jsx: 3.1.3 - mdast-util-mdxjs-esm: 2.0.1 - mdast-util-to-markdown: 2.1.0 - transitivePeerDependencies: - - supports-color - - mdast-util-mdxjs-esm@2.0.1: - dependencies: - '@types/estree-jsx': 1.0.5 - '@types/hast': 3.0.4 - '@types/mdast': 4.0.4 - devlop: 1.1.0 - mdast-util-from-markdown: 2.0.1 - mdast-util-to-markdown: 2.1.0 - transitivePeerDependencies: - - supports-color - - mdast-util-phrasing@4.1.0: - dependencies: - '@types/mdast': 4.0.4 - unist-util-is: 6.0.0 - - mdast-util-to-hast@13.2.0: - dependencies: - '@types/hast': 3.0.4 - '@types/mdast': 4.0.4 - '@ungap/structured-clone': 1.2.0 - devlop: 1.1.0 - micromark-util-sanitize-uri: 2.0.0 - trim-lines: 3.0.1 - unist-util-position: 5.0.0 - unist-util-visit: 5.0.0 - vfile: 6.0.3 - - mdast-util-to-markdown@2.1.0: - dependencies: - '@types/mdast': 4.0.4 - '@types/unist': 3.0.3 - longest-streak: 3.1.0 - mdast-util-phrasing: 4.1.0 - mdast-util-to-string: 4.0.0 - micromark-util-decode-string: 2.0.0 - unist-util-visit: 5.0.0 - zwitch: 2.0.4 - - mdast-util-to-string@4.0.0: - dependencies: - '@types/mdast': 4.0.4 - - merge2@1.4.1: {} - - micromark-core-commonmark@2.0.1: - dependencies: - decode-named-character-reference: 1.0.2 - devlop: 1.1.0 - micromark-factory-destination: 2.0.0 - micromark-factory-label: 2.0.0 - micromark-factory-space: 2.0.0 - micromark-factory-title: 2.0.0 - micromark-factory-whitespace: 2.0.0 - micromark-util-character: 2.1.0 - micromark-util-chunked: 2.0.0 - micromark-util-classify-character: 2.0.0 - micromark-util-html-tag-name: 2.0.0 - micromark-util-normalize-identifier: 2.0.0 - micromark-util-resolve-all: 2.0.0 - micromark-util-subtokenize: 2.0.1 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - - micromark-extension-directive@3.0.1: - dependencies: - devlop: 1.1.0 - micromark-factory-space: 2.0.0 - micromark-factory-whitespace: 2.0.0 - micromark-util-character: 2.1.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - parse-entities: 4.0.1 - - micromark-extension-gfm-autolink-literal@2.1.0: - dependencies: - micromark-util-character: 2.1.0 - micromark-util-sanitize-uri: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - - micromark-extension-gfm-footnote@2.1.0: - dependencies: - devlop: 1.1.0 - micromark-core-commonmark: 2.0.1 - micromark-factory-space: 2.0.0 - micromark-util-character: 2.1.0 - micromark-util-normalize-identifier: 2.0.0 - micromark-util-sanitize-uri: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - - micromark-extension-gfm-strikethrough@2.1.0: - dependencies: - devlop: 1.1.0 - micromark-util-chunked: 2.0.0 - micromark-util-classify-character: 2.0.0 - micromark-util-resolve-all: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - - micromark-extension-gfm-table@2.1.0: - dependencies: - devlop: 1.1.0 - micromark-factory-space: 2.0.0 - micromark-util-character: 2.1.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - - micromark-extension-gfm-tagfilter@2.0.0: - dependencies: - micromark-util-types: 2.0.0 - - micromark-extension-gfm-task-list-item@2.1.0: - dependencies: - devlop: 1.1.0 - micromark-factory-space: 2.0.0 - micromark-util-character: 2.1.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - - micromark-extension-gfm@3.0.0: - dependencies: - micromark-extension-gfm-autolink-literal: 2.1.0 - micromark-extension-gfm-footnote: 2.1.0 - micromark-extension-gfm-strikethrough: 2.1.0 - micromark-extension-gfm-table: 2.1.0 - micromark-extension-gfm-tagfilter: 2.0.0 - micromark-extension-gfm-task-list-item: 2.1.0 - micromark-util-combine-extensions: 2.0.0 - micromark-util-types: 2.0.0 - - micromark-extension-mdx-expression@3.0.0: - dependencies: - '@types/estree': 1.0.5 - devlop: 1.1.0 - micromark-factory-mdx-expression: 2.0.2 - micromark-factory-space: 2.0.0 - micromark-util-character: 2.1.0 - micromark-util-events-to-acorn: 2.0.2 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - - micromark-extension-mdx-jsx@3.0.1: - dependencies: - '@types/acorn': 4.0.6 - '@types/estree': 1.0.5 - devlop: 1.1.0 - estree-util-is-identifier-name: 3.0.0 - micromark-factory-mdx-expression: 2.0.2 - micromark-factory-space: 2.0.0 - micromark-util-character: 2.1.0 - micromark-util-events-to-acorn: 2.0.2 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - vfile-message: 4.0.2 - - micromark-extension-mdx-md@2.0.0: - dependencies: - micromark-util-types: 2.0.0 - - micromark-extension-mdxjs-esm@3.0.0: - dependencies: - '@types/estree': 1.0.5 - devlop: 1.1.0 - micromark-core-commonmark: 2.0.1 - micromark-util-character: 2.1.0 - micromark-util-events-to-acorn: 2.0.2 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - unist-util-position-from-estree: 2.0.0 - vfile-message: 4.0.2 - - micromark-extension-mdxjs@3.0.0: - dependencies: - acorn: 8.12.1 - acorn-jsx: 5.3.2(acorn@8.12.1) - micromark-extension-mdx-expression: 3.0.0 - micromark-extension-mdx-jsx: 3.0.1 - micromark-extension-mdx-md: 2.0.0 - micromark-extension-mdxjs-esm: 3.0.0 - micromark-util-combine-extensions: 2.0.0 - micromark-util-types: 2.0.0 - - micromark-factory-destination@2.0.0: - dependencies: - micromark-util-character: 2.1.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - - micromark-factory-label@2.0.0: - dependencies: - devlop: 1.1.0 - micromark-util-character: 2.1.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - - micromark-factory-mdx-expression@2.0.2: - dependencies: - '@types/estree': 1.0.5 - devlop: 1.1.0 - micromark-factory-space: 2.0.0 - micromark-util-character: 2.1.0 - micromark-util-events-to-acorn: 2.0.2 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - unist-util-position-from-estree: 2.0.0 - vfile-message: 4.0.2 - - micromark-factory-space@2.0.0: - dependencies: - micromark-util-character: 2.1.0 - micromark-util-types: 2.0.0 - - micromark-factory-title@2.0.0: - dependencies: - micromark-factory-space: 2.0.0 - micromark-util-character: 2.1.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - - micromark-factory-whitespace@2.0.0: - dependencies: - micromark-factory-space: 2.0.0 - micromark-util-character: 2.1.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - - micromark-util-character@2.1.0: - dependencies: - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - - micromark-util-chunked@2.0.0: - dependencies: - micromark-util-symbol: 2.0.0 - - micromark-util-classify-character@2.0.0: - dependencies: - micromark-util-character: 2.1.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - - micromark-util-combine-extensions@2.0.0: - dependencies: - micromark-util-chunked: 2.0.0 - micromark-util-types: 2.0.0 - - micromark-util-decode-numeric-character-reference@2.0.1: - dependencies: - micromark-util-symbol: 2.0.0 - - micromark-util-decode-string@2.0.0: - dependencies: - decode-named-character-reference: 1.0.2 - micromark-util-character: 2.1.0 - micromark-util-decode-numeric-character-reference: 2.0.1 - micromark-util-symbol: 2.0.0 - - micromark-util-encode@2.0.0: {} - - micromark-util-events-to-acorn@2.0.2: - dependencies: - '@types/acorn': 4.0.6 - '@types/estree': 1.0.5 - '@types/unist': 3.0.3 - devlop: 1.1.0 - estree-util-visit: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - vfile-message: 4.0.2 - - micromark-util-html-tag-name@2.0.0: {} - - micromark-util-normalize-identifier@2.0.0: - dependencies: - micromark-util-symbol: 2.0.0 - - micromark-util-resolve-all@2.0.0: - dependencies: - micromark-util-types: 2.0.0 - - micromark-util-sanitize-uri@2.0.0: - dependencies: - micromark-util-character: 2.1.0 - micromark-util-encode: 2.0.0 - micromark-util-symbol: 2.0.0 - - micromark-util-subtokenize@2.0.1: - dependencies: - devlop: 1.1.0 - micromark-util-chunked: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - - micromark-util-symbol@2.0.0: {} - - micromark-util-types@2.0.0: {} - - micromark@4.0.0: - dependencies: - '@types/debug': 4.1.12 - debug: 4.3.7 - decode-named-character-reference: 1.0.2 - devlop: 1.1.0 - micromark-core-commonmark: 2.0.1 - micromark-factory-space: 2.0.0 - micromark-util-character: 2.1.0 - micromark-util-chunked: 2.0.0 - micromark-util-combine-extensions: 2.0.0 - micromark-util-decode-numeric-character-reference: 2.0.1 - micromark-util-encode: 2.0.0 - micromark-util-normalize-identifier: 2.0.0 - micromark-util-resolve-all: 2.0.0 - micromark-util-sanitize-uri: 2.0.0 - micromark-util-subtokenize: 2.0.1 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - transitivePeerDependencies: - - supports-color - - micromatch@4.0.8: - dependencies: - braces: 3.0.3 - picomatch: 2.3.1 - - mimic-function@5.0.1: {} - - mimic-response@3.1.0: {} - - minimist@1.2.8: {} - - mkdirp-classic@0.5.3: {} - - mrmime@2.0.0: {} - - ms@2.1.3: {} - - muggle-string@0.4.1: {} - - nanoid@3.3.7: {} - - napi-build-utils@1.0.2: {} - - neotraverse@0.6.18: {} - - nlcst-to-string@4.0.0: - dependencies: - '@types/nlcst': 2.0.3 - - node-abi@3.67.0: - dependencies: - semver: 7.6.3 - - node-addon-api@6.1.0: {} - - node-releases@2.0.18: {} - - normalize-path@3.0.0: {} - - not@0.1.0: {} - - nth-check@2.1.1: - dependencies: - boolbase: 1.0.0 - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - onetime@7.0.0: - dependencies: - mimic-function: 5.0.1 - - oniguruma-to-js@0.4.3: - dependencies: - regex: 4.3.2 - - ora@8.1.0: - dependencies: - chalk: 5.3.0 - cli-cursor: 5.0.0 - cli-spinners: 2.9.2 - is-interactive: 2.0.0 - is-unicode-supported: 2.1.0 - log-symbols: 6.0.0 - stdin-discarder: 0.2.2 - string-width: 7.2.0 - strip-ansi: 7.1.0 - - p-limit@2.3.0: - dependencies: - p-try: 2.2.0 - - p-limit@6.1.0: - dependencies: - yocto-queue: 1.1.1 - - p-locate@4.1.0: - dependencies: - p-limit: 2.3.0 - - p-queue@8.0.1: - dependencies: - eventemitter3: 5.0.1 - p-timeout: 6.1.2 - - p-timeout@6.1.2: {} - - p-try@2.2.0: {} - - pagefind@1.1.1: - optionalDependencies: - '@pagefind/darwin-arm64': 1.1.1 - '@pagefind/darwin-x64': 1.1.1 - '@pagefind/linux-arm64': 1.1.1 - '@pagefind/linux-x64': 1.1.1 - '@pagefind/windows-x64': 1.1.1 - - parse-entities@4.0.1: - dependencies: - '@types/unist': 2.0.11 - character-entities: 2.0.2 - character-entities-legacy: 3.0.0 - character-reference-invalid: 2.0.1 - decode-named-character-reference: 1.0.2 - is-alphanumerical: 2.0.1 - is-decimal: 2.0.1 - is-hexadecimal: 2.0.1 - - parse-latin@7.0.0: - dependencies: - '@types/nlcst': 2.0.3 - '@types/unist': 3.0.3 - nlcst-to-string: 4.0.0 - unist-util-modify-children: 4.0.0 - unist-util-visit-children: 3.0.0 - vfile: 6.0.3 - - parse5@7.1.2: - dependencies: - entities: 4.5.0 - - path-browserify@1.0.1: {} - - path-exists@4.0.0: {} - - pathe@1.1.2: {} - - periscopic@3.1.0: - dependencies: - '@types/estree': 1.0.5 - estree-walker: 3.0.3 - is-reference: 3.0.2 - - picocolors@1.1.0: {} - - picomatch@2.3.1: {} - - pify@4.0.1: {} - - pkg-dir@4.2.0: - dependencies: - find-up: 4.1.0 - - postcss-nested@6.2.0(postcss@8.4.45): - dependencies: - postcss: 8.4.45 - postcss-selector-parser: 6.1.2 - - postcss-selector-parser@6.1.2: - dependencies: - cssesc: 3.0.0 - util-deprecate: 1.0.2 - - postcss@8.4.45: - dependencies: - nanoid: 3.3.7 - picocolors: 1.1.0 - source-map-js: 1.2.1 - - prebuild-install@7.1.2: - dependencies: - detect-libc: 2.0.3 - expand-template: 2.0.3 - github-from-package: 0.0.0 - minimist: 1.2.8 - mkdirp-classic: 0.5.3 - napi-build-utils: 1.0.2 - node-abi: 3.67.0 - pump: 3.0.2 - rc: 1.2.8 - simple-get: 4.0.1 - tar-fs: 2.1.1 - tunnel-agent: 0.6.0 - - preferred-pm@4.0.0: - dependencies: - find-up-simple: 1.0.0 - find-yarn-workspace-root2: 1.2.16 - which-pm: 3.0.0 - - prettier@2.8.7: - optional: true - - prismjs@1.29.0: {} - - prompts@2.4.2: - dependencies: - kleur: 3.0.3 - sisteransi: 1.0.5 - - property-information@6.5.0: {} - - pump@3.0.2: - dependencies: - end-of-stream: 1.4.4 - once: 1.4.0 - - queue-microtask@1.2.3: {} - - queue-tick@1.0.1: {} - - rc@1.2.8: - dependencies: - deep-extend: 0.6.0 - ini: 1.3.8 - minimist: 1.2.8 - strip-json-comments: 2.0.1 - - readable-stream@3.6.2: - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 - - recast@0.23.9: - dependencies: - ast-types: 0.16.1 - esprima: 4.0.1 - source-map: 0.6.1 - tiny-invariant: 1.3.3 - tslib: 2.7.0 - - regex@4.3.2: {} - - rehype-expressive-code@0.35.6: - dependencies: - expressive-code: 0.35.6 - - rehype-format@5.0.0: - dependencies: - '@types/hast': 3.0.4 - hast-util-embedded: 3.0.0 - hast-util-is-element: 3.0.0 - hast-util-phrasing: 3.0.1 - hast-util-whitespace: 3.0.0 - html-whitespace-sensitive-tag-names: 3.0.0 - rehype-minify-whitespace: 6.0.0 - unist-util-visit-parents: 6.0.1 - - rehype-minify-whitespace@6.0.0: - dependencies: - '@types/hast': 3.0.4 - hast-util-embedded: 3.0.0 - hast-util-is-element: 3.0.0 - hast-util-whitespace: 3.0.0 - unist-util-is: 6.0.0 - - rehype-parse@9.0.0: - dependencies: - '@types/hast': 3.0.4 - hast-util-from-html: 2.0.2 - unified: 11.0.5 - - rehype-raw@7.0.0: - dependencies: - '@types/hast': 3.0.4 - hast-util-raw: 9.0.4 - vfile: 6.0.3 - - rehype-stringify@10.0.0: - dependencies: - '@types/hast': 3.0.4 - hast-util-to-html: 9.0.2 - unified: 11.0.5 - - rehype@13.0.1: - dependencies: - '@types/hast': 3.0.4 - rehype-parse: 9.0.0 - rehype-stringify: 10.0.0 - unified: 11.0.5 - - remark-directive@3.0.0: - dependencies: - '@types/mdast': 4.0.4 - mdast-util-directive: 3.0.0 - micromark-extension-directive: 3.0.1 - unified: 11.0.5 - transitivePeerDependencies: - - supports-color - - remark-gfm@4.0.0: - dependencies: - '@types/mdast': 4.0.4 - mdast-util-gfm: 3.0.0 - micromark-extension-gfm: 3.0.0 - remark-parse: 11.0.0 - remark-stringify: 11.0.0 - unified: 11.0.5 - transitivePeerDependencies: - - supports-color - - remark-mdx@3.0.1: - dependencies: - mdast-util-mdx: 3.0.0 - micromark-extension-mdxjs: 3.0.0 - transitivePeerDependencies: - - supports-color - - remark-parse@11.0.0: - dependencies: - '@types/mdast': 4.0.4 - mdast-util-from-markdown: 2.0.1 - micromark-util-types: 2.0.0 - unified: 11.0.5 - transitivePeerDependencies: - - supports-color - - remark-rehype@11.1.0: - dependencies: - '@types/hast': 3.0.4 - '@types/mdast': 4.0.4 - mdast-util-to-hast: 13.2.0 - unified: 11.0.5 - vfile: 6.0.3 - - remark-smartypants@3.0.2: - dependencies: - retext: 9.0.0 - retext-smartypants: 6.1.1 - unified: 11.0.5 - unist-util-visit: 5.0.0 - - remark-stringify@11.0.0: - dependencies: - '@types/mdast': 4.0.4 - mdast-util-to-markdown: 2.1.0 - unified: 11.0.5 - - request-light@0.5.8: {} - - request-light@0.7.0: {} - - require-directory@2.1.1: {} - - require-from-string@2.0.2: {} - - restore-cursor@5.1.0: - dependencies: - onetime: 7.0.0 - signal-exit: 4.1.0 - - retext-latin@4.0.0: - dependencies: - '@types/nlcst': 2.0.3 - parse-latin: 7.0.0 - unified: 11.0.5 - - retext-smartypants@6.1.1: - dependencies: - '@types/nlcst': 2.0.3 - nlcst-to-string: 4.0.0 - unist-util-visit: 5.0.0 - - retext-stringify@4.0.0: - dependencies: - '@types/nlcst': 2.0.3 - nlcst-to-string: 4.0.0 - unified: 11.0.5 - - retext@9.0.0: - dependencies: - '@types/nlcst': 2.0.3 - retext-latin: 4.0.0 - retext-stringify: 4.0.0 - unified: 11.0.5 - - reusify@1.0.4: {} - - rollup@4.21.3: - dependencies: - '@types/estree': 1.0.5 - optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.21.3 - '@rollup/rollup-android-arm64': 4.21.3 - '@rollup/rollup-darwin-arm64': 4.21.3 - '@rollup/rollup-darwin-x64': 4.21.3 - '@rollup/rollup-linux-arm-gnueabihf': 4.21.3 - '@rollup/rollup-linux-arm-musleabihf': 4.21.3 - '@rollup/rollup-linux-arm64-gnu': 4.21.3 - '@rollup/rollup-linux-arm64-musl': 4.21.3 - '@rollup/rollup-linux-powerpc64le-gnu': 4.21.3 - '@rollup/rollup-linux-riscv64-gnu': 4.21.3 - '@rollup/rollup-linux-s390x-gnu': 4.21.3 - '@rollup/rollup-linux-x64-gnu': 4.21.3 - '@rollup/rollup-linux-x64-musl': 4.21.3 - '@rollup/rollup-win32-arm64-msvc': 4.21.3 - '@rollup/rollup-win32-ia32-msvc': 4.21.3 - '@rollup/rollup-win32-x64-msvc': 4.21.3 - fsevents: 2.3.3 - - run-parallel@1.2.0: - dependencies: - queue-microtask: 1.2.3 - - safe-buffer@5.2.1: {} - - sax@1.4.1: {} - - section-matter@1.0.0: - dependencies: - extend-shallow: 2.0.1 - kind-of: 6.0.3 - - semver@6.3.1: {} - - semver@7.6.3: {} - - sharp@0.32.6: - dependencies: - color: 4.2.3 - detect-libc: 2.0.3 - node-addon-api: 6.1.0 - prebuild-install: 7.1.2 - semver: 7.6.3 - simple-get: 4.0.1 - tar-fs: 3.0.6 - tunnel-agent: 0.6.0 - - sharp@0.33.5: - dependencies: - color: 4.2.3 - detect-libc: 2.0.3 - semver: 7.6.3 - optionalDependencies: - '@img/sharp-darwin-arm64': 0.33.5 - '@img/sharp-darwin-x64': 0.33.5 - '@img/sharp-libvips-darwin-arm64': 1.0.4 - '@img/sharp-libvips-darwin-x64': 1.0.4 - '@img/sharp-libvips-linux-arm': 1.0.5 - '@img/sharp-libvips-linux-arm64': 1.0.4 - '@img/sharp-libvips-linux-s390x': 1.0.4 - '@img/sharp-libvips-linux-x64': 1.0.4 - '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 - '@img/sharp-libvips-linuxmusl-x64': 1.0.4 - '@img/sharp-linux-arm': 0.33.5 - '@img/sharp-linux-arm64': 0.33.5 - '@img/sharp-linux-s390x': 0.33.5 - '@img/sharp-linux-x64': 0.33.5 - '@img/sharp-linuxmusl-arm64': 0.33.5 - '@img/sharp-linuxmusl-x64': 0.33.5 - '@img/sharp-wasm32': 0.33.5 - '@img/sharp-win32-ia32': 0.33.5 - '@img/sharp-win32-x64': 0.33.5 - optional: true - - shiki@1.17.6: - dependencies: - '@shikijs/core': 1.17.6 - '@shikijs/engine-javascript': 1.17.6 - '@shikijs/engine-oniguruma': 1.17.6 - '@shikijs/types': 1.17.6 - '@shikijs/vscode-textmate': 9.2.2 - '@types/hast': 3.0.4 - - signal-exit@4.1.0: {} - - simple-concat@1.0.1: {} - - simple-get@4.0.1: - dependencies: - decompress-response: 6.0.0 - once: 1.4.0 - simple-concat: 1.0.1 - - simple-swizzle@0.2.2: - dependencies: - is-arrayish: 0.3.2 - - sisteransi@1.0.5: {} - - sitemap@7.1.2: - dependencies: - '@types/node': 17.0.45 - '@types/sax': 1.2.7 - arg: 5.0.2 - sax: 1.4.1 - - source-map-js@1.2.1: {} - - source-map@0.6.1: {} - - source-map@0.7.4: {} - - space-separated-tokens@2.0.2: {} - - sprintf-js@1.0.3: {} - - stdin-discarder@0.2.2: {} - - stream-replace-string@2.0.0: {} - - streamx@2.20.1: - dependencies: - fast-fifo: 1.3.2 - queue-tick: 1.0.1 - text-decoder: 1.2.0 - optionalDependencies: - bare-events: 2.4.2 - - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - string-width@5.1.2: - dependencies: - eastasianwidth: 0.2.0 - emoji-regex: 9.2.2 - strip-ansi: 7.1.0 - - string-width@7.2.0: - dependencies: - emoji-regex: 10.4.0 - get-east-asian-width: 1.2.0 - strip-ansi: 7.1.0 - - string_decoder@1.3.0: - dependencies: - safe-buffer: 5.2.1 - - stringify-entities@4.0.4: - dependencies: - character-entities-html4: 2.1.0 - character-entities-legacy: 3.0.0 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-ansi@7.1.0: - dependencies: - ansi-regex: 6.1.0 - - strip-bom-string@1.0.0: {} - - strip-bom@3.0.0: {} - - strip-json-comments@2.0.1: {} - - style-to-object@0.4.4: - dependencies: - inline-style-parser: 0.1.1 - - style-to-object@1.0.8: - dependencies: - inline-style-parser: 0.2.4 - - supports-color@5.5.0: - dependencies: - has-flag: 3.0.0 - - tar-fs@2.1.1: - dependencies: - chownr: 1.1.4 - mkdirp-classic: 0.5.3 - pump: 3.0.2 - tar-stream: 2.2.0 - - tar-fs@3.0.6: - dependencies: - pump: 3.0.2 - tar-stream: 3.1.7 - optionalDependencies: - bare-fs: 2.3.5 - bare-path: 2.1.3 - - tar-stream@2.2.0: - dependencies: - bl: 4.1.0 - end-of-stream: 1.4.4 - fs-constants: 1.0.0 - inherits: 2.0.4 - readable-stream: 3.6.2 - - tar-stream@3.1.7: - dependencies: - b4a: 1.6.6 - fast-fifo: 1.3.2 - streamx: 2.20.1 - - text-decoder@1.2.0: - dependencies: - b4a: 1.6.6 - - tiny-invariant@1.3.3: {} - - tinyexec@0.3.0: {} - - to-fast-properties@2.0.0: {} - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - - trim-lines@3.0.1: {} - - trough@2.2.0: {} - - tsconfck@3.1.3(typescript@5.6.2): - optionalDependencies: - typescript: 5.6.2 - - tslib@2.7.0: {} - - tunnel-agent@0.6.0: - dependencies: - safe-buffer: 5.2.1 - - type-fest@2.19.0: {} - - typesafe-path@0.2.2: {} - - typescript-auto-import-cache@0.3.3: - dependencies: - semver: 7.6.3 - - typescript@5.6.2: {} - - unified@11.0.5: - dependencies: - '@types/unist': 3.0.3 - bail: 2.0.2 - devlop: 1.1.0 - extend: 3.0.2 - is-plain-obj: 4.1.0 - trough: 2.2.0 - vfile: 6.0.3 - - unist-util-find-after@5.0.0: - dependencies: - '@types/unist': 3.0.3 - unist-util-is: 6.0.0 - - unist-util-is@6.0.0: - dependencies: - '@types/unist': 3.0.3 - - unist-util-modify-children@4.0.0: - dependencies: - '@types/unist': 3.0.3 - array-iterate: 2.0.1 - - unist-util-position-from-estree@2.0.0: - dependencies: - '@types/unist': 3.0.3 - - unist-util-position@5.0.0: - dependencies: - '@types/unist': 3.0.3 - - unist-util-remove-position@5.0.0: - dependencies: - '@types/unist': 3.0.3 - unist-util-visit: 5.0.0 - - unist-util-stringify-position@4.0.0: - dependencies: - '@types/unist': 3.0.3 - - unist-util-visit-children@3.0.0: - dependencies: - '@types/unist': 3.0.3 - - unist-util-visit-parents@6.0.1: - dependencies: - '@types/unist': 3.0.3 - unist-util-is: 6.0.0 - - unist-util-visit@5.0.0: - dependencies: - '@types/unist': 3.0.3 - unist-util-is: 6.0.0 - unist-util-visit-parents: 6.0.1 - - update-browserslist-db@1.1.0(browserslist@4.23.3): - dependencies: - browserslist: 4.23.3 - escalade: 3.2.0 - picocolors: 1.1.0 - - util-deprecate@1.0.2: {} - - vfile-location@5.0.3: - dependencies: - '@types/unist': 3.0.3 - vfile: 6.0.3 - - vfile-message@4.0.2: - dependencies: - '@types/unist': 3.0.3 - unist-util-stringify-position: 4.0.0 - - vfile@6.0.3: - dependencies: - '@types/unist': 3.0.3 - vfile-message: 4.0.2 - - vite@5.4.5: - dependencies: - esbuild: 0.21.5 - postcss: 8.4.45 - rollup: 4.21.3 - optionalDependencies: - fsevents: 2.3.3 - - vitefu@1.0.2(vite@5.4.5): - optionalDependencies: - vite: 5.4.5 - - volar-service-css@0.0.61(@volar/language-service@2.4.4): - dependencies: - vscode-css-languageservice: 6.3.1 - vscode-languageserver-textdocument: 1.0.12 - vscode-uri: 3.0.8 - optionalDependencies: - '@volar/language-service': 2.4.4 - - volar-service-emmet@0.0.61(@volar/language-service@2.4.4): - dependencies: - '@emmetio/css-parser': 0.4.0 - '@emmetio/html-matcher': 1.3.0 - '@vscode/emmet-helper': 2.9.3 - vscode-uri: 3.0.8 - optionalDependencies: - '@volar/language-service': 2.4.4 - - volar-service-html@0.0.61(@volar/language-service@2.4.4): - dependencies: - vscode-html-languageservice: 5.3.1 - vscode-languageserver-textdocument: 1.0.12 - vscode-uri: 3.0.8 - optionalDependencies: - '@volar/language-service': 2.4.4 - - volar-service-prettier@0.0.61(@volar/language-service@2.4.4): - dependencies: - vscode-uri: 3.0.8 - optionalDependencies: - '@volar/language-service': 2.4.4 - - volar-service-typescript-twoslash-queries@0.0.61(@volar/language-service@2.4.4): - dependencies: - vscode-uri: 3.0.8 - optionalDependencies: - '@volar/language-service': 2.4.4 - - volar-service-typescript@0.0.61(@volar/language-service@2.4.4): - dependencies: - path-browserify: 1.0.1 - semver: 7.6.3 - typescript-auto-import-cache: 0.3.3 - vscode-languageserver-textdocument: 1.0.12 - vscode-nls: 5.2.0 - vscode-uri: 3.0.8 - optionalDependencies: - '@volar/language-service': 2.4.4 - - volar-service-yaml@0.0.61(@volar/language-service@2.4.4): - dependencies: - vscode-uri: 3.0.8 - yaml-language-server: 1.15.0 - optionalDependencies: - '@volar/language-service': 2.4.4 - - vscode-css-languageservice@6.3.1: - dependencies: - '@vscode/l10n': 0.0.18 - vscode-languageserver-textdocument: 1.0.12 - vscode-languageserver-types: 3.17.5 - vscode-uri: 3.0.8 - - vscode-html-languageservice@5.3.1: - dependencies: - '@vscode/l10n': 0.0.18 - vscode-languageserver-textdocument: 1.0.12 - vscode-languageserver-types: 3.17.5 - vscode-uri: 3.0.8 - - vscode-json-languageservice@4.1.8: - dependencies: - jsonc-parser: 3.3.1 - vscode-languageserver-textdocument: 1.0.12 - vscode-languageserver-types: 3.17.5 - vscode-nls: 5.2.0 - vscode-uri: 3.0.8 - - vscode-jsonrpc@6.0.0: {} - - vscode-jsonrpc@8.2.0: {} - - vscode-languageserver-protocol@3.16.0: - dependencies: - vscode-jsonrpc: 6.0.0 - vscode-languageserver-types: 3.16.0 - - vscode-languageserver-protocol@3.17.5: - dependencies: - vscode-jsonrpc: 8.2.0 - vscode-languageserver-types: 3.17.5 - - vscode-languageserver-textdocument@1.0.12: {} - - vscode-languageserver-types@3.16.0: {} - - vscode-languageserver-types@3.17.5: {} - - vscode-languageserver@7.0.0: - dependencies: - vscode-languageserver-protocol: 3.16.0 - - vscode-languageserver@9.0.1: - dependencies: - vscode-languageserver-protocol: 3.17.5 - - vscode-nls@5.2.0: {} - - vscode-uri@2.1.2: {} - - vscode-uri@3.0.8: {} - - web-namespaces@2.0.1: {} - - which-pm-runs@1.1.0: {} - - which-pm@3.0.0: - dependencies: - load-yaml-file: 0.2.0 - - widest-line@4.0.1: - dependencies: - string-width: 5.1.2 - - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrap-ansi@8.1.0: - dependencies: - ansi-styles: 6.2.1 - string-width: 5.1.2 - strip-ansi: 7.1.0 - - wrappy@1.0.2: {} - - xxhash-wasm@1.0.2: {} - - y18n@5.0.8: {} - - yallist@3.1.1: {} - - yaml-language-server@1.15.0: - dependencies: - ajv: 8.17.1 - lodash: 4.17.21 - request-light: 0.5.8 - vscode-json-languageservice: 4.1.8 - vscode-languageserver: 7.0.0 - vscode-languageserver-textdocument: 1.0.12 - vscode-languageserver-types: 3.17.5 - vscode-nls: 5.2.0 - vscode-uri: 3.0.8 - yaml: 2.2.2 - optionalDependencies: - prettier: 2.8.7 - - yaml@2.2.2: {} - - yaml@2.5.1: {} - - yargs-parser@21.1.1: {} - - yargs@17.7.2: - dependencies: - cliui: 8.0.1 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 21.1.1 - - yocto-queue@1.1.1: {} - - zod-to-json-schema@3.23.3(zod@3.23.8): - dependencies: - zod: 3.23.8 - - zod-to-ts@1.2.0(typescript@5.6.2)(zod@3.23.8): - dependencies: - typescript: 5.6.2 - zod: 3.23.8 - - zod@3.23.8: {} - - zwitch@2.0.4: {} diff --git a/public/comment.js b/public/comment.js deleted file mode 100644 index 572225f611..0000000000 --- a/public/comment.js +++ /dev/null @@ -1,7 +0,0 @@ - diff --git a/public/favicons/browserconfig.xml b/public/favicons/browserconfig.xml deleted file mode 100644 index b3930d0f04..0000000000 --- a/public/favicons/browserconfig.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - #da532c - - - diff --git a/public/favicons/site.webmanifest b/public/favicons/site.webmanifest deleted file mode 100644 index b20abb7cbb..0000000000 --- a/public/favicons/site.webmanifest +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "", - "short_name": "", - "icons": [ - { - "src": "/android-chrome-192x192.png", - "sizes": "192x192", - "type": "image/png" - }, - { - "src": "/android-chrome-512x512.png", - "sizes": "512x512", - "type": "image/png" - } - ], - "theme_color": "#ffffff", - "background_color": "#ffffff", - "display": "standalone" -} diff --git a/src/content/config.ts b/src/content.config.ts similarity index 51% rename from src/content/config.ts rename to src/content.config.ts index 45f60b0154..d9ee8c9d1c 100644 --- a/src/content/config.ts +++ b/src/content.config.ts @@ -1,6 +1,7 @@ import { defineCollection } from 'astro:content'; +import { docsLoader } from '@astrojs/starlight/loaders'; import { docsSchema } from '@astrojs/starlight/schema'; export const collections = { - docs: defineCollection({ schema: docsSchema() }), + docs: defineCollection({ loader: docsLoader(), schema: docsSchema() }), }; diff --git a/src/content/docs/en/blog/index.md b/src/content/docs/en/blog/index.md index 07fd81571f..63a2f96df4 100644 --- a/src/content/docs/en/blog/index.md +++ b/src/content/docs/en/blog/index.md @@ -1,6 +1,5 @@ --- title: "Blog" -linkTitle: "Blog" sidebar: order: 30 --- diff --git a/src/content/docs/en/blog/news/how-to-build-one-effective-middleware.md b/src/content/docs/en/blog/news/how-to-build-one-effective-middleware.md index d93e7cbc3e..f33833df25 100644 --- a/src/content/docs/en/blog/news/how-to-build-one-effective-middleware.md +++ b/src/content/docs/en/blog/news/how-to-build-one-effective-middleware.md @@ -1,7 +1,7 @@ --- title: "How to build one effective middleware?" linkTitle: "How to build one effective middleware?" -date: 2019-02-26 +lastUpdated: 2019-02-26 --- ## Constituent parts diff --git a/src/content/docs/en/blog/releases/release110.md b/src/content/docs/en/blog/releases/release110.md new file mode 100644 index 0000000000..0a72a06cb6 --- /dev/null +++ b/src/content/docs/en/blog/releases/release110.md @@ -0,0 +1,76 @@ +--- +title: "Gin 1.10.0 is released" +linkTitle: "Gin 1.10.0 is released" +lastUpdated: 2024-05-07 +--- + +### CHANGELOG + +#### Features + * [`5f458dd`](https://github.com/gin-gonic/gin/commit/5f458dd1a6d631f324e4af9a4f5429ffdf199342): feat(auth): add proxy-server authentication ([#3877](https://github.com/gin-gonic/gin/pull/3877)) ([@EndlessParadox1](https://github.com/EndlessParadox1)) + * [`7a865dc`](https://github.com/gin-gonic/gin/commit/7a865dc): feat(bind): ShouldBindBodyWith shortcut and change doc ([#3871](https://github.com/gin-gonic/gin/pull/3871)) ([@RedCrazyGhost](https://github.com/RedCrazyGhost)) + * [`a182195`](https://github.com/gin-gonic/gin/commit/a182195): feat(binding): Support custom BindUnmarshaler for binding. ([#3933](https://github.com/gin-gonic/gin/pull/3933)) ([@dkkb](https://github.com/dkkb)) + * [`fd1faad`](https://github.com/gin-gonic/gin/commit/fd1faad): feat(binding): support override default binding implement ([#3514](https://github.com/gin-gonic/gin/pull/3514)) ([@ssfyn](https://github.com/ssfyn)) + * [`ac5e84d`](https://github.com/gin-gonic/gin/commit/ac5e84d): feat(engine): Added `OptionFunc` and `With` ([#3572](https://github.com/gin-gonic/gin/pull/3572)) ([@flc1125](https://github.com/flc1125)) + * [`c6ae2e6`](https://github.com/gin-gonic/gin/commit/c6ae2e6): feat(logger): ability to skip logs based on user-defined logic ([#3593](https://github.com/gin-gonic/gin/pull/3593)) ([@palvaneh](https://github.com/palvaneh)) + + +#### Bug fixes + * [`d4e4136`](https://github.com/gin-gonic/gin/commit/d4e4136): Revert "fix(uri): query binding bug ([#3236](https://github.com/gin-gonic/gin/pull/3236))" ([#3899](https://github.com/gin-gonic/gin/pull/3899)) ([@appleboy](https://github.com/appleboy)) + * [`3dc1cd6`](https://github.com/gin-gonic/gin/commit/3dc1cd6): fix(binding): binding error while not upload file ([#3819](https://github.com/gin-gonic/gin/pull/3819)) ([#3820](https://github.com/gin-gonic/gin/pull/3820)) ([@clearcodecn](https://github.com/clearcodecn)) + * [`82bcd6d`](https://github.com/gin-gonic/gin/commit/82bcd6d): fix(binding): dereference pointer to struct ([#3199](https://github.com/gin-gonic/gin/pull/3199)) ([@echovl](https://github.com/echovl)) + * [`2b1da2b`](https://github.com/gin-gonic/gin/commit/2b1da2b): fix(context): make context Value method adhere to Go standards ([#3897](https://github.com/gin-gonic/gin/pull/3897)) ([@FarmerChillax](https://github.com/FarmerChillax)) + * [`f70dd00`](https://github.com/gin-gonic/gin/commit/f70dd00): fix(engine): fix unit test ([#3878](https://github.com/gin-gonic/gin/pull/3878)) ([@flc1125](https://github.com/flc1125)) + * [`86ff4a6`](https://github.com/gin-gonic/gin/commit/86ff4a6): fix(header): Allow header according to RFC 7231 (HTTP 405) ([#3759](https://github.com/gin-gonic/gin/pull/3759)) ([@Crocmagnon](https://github.com/Crocmagnon)) + * [`09f8224`](https://github.com/gin-gonic/gin/commit/09f8224): fix(route): Add fullPath in context copy ([#3784](https://github.com/gin-gonic/gin/pull/3784)) ([@KarthikReddyPuli](https://github.com/KarthikReddyPuli)) + * [`9f598a3`](https://github.com/gin-gonic/gin/commit/9f598a3): fix(router): catch-all conflicting wildcard ([#3812](https://github.com/gin-gonic/gin/pull/3812)) ([@FirePing32](https://github.com/FirePing32)) + * [`4a40f8f`](https://github.com/gin-gonic/gin/commit/4a40f8f): fix(sec): upgrade golang.org/x/crypto to 0.17.0 ([#3832](https://github.com/gin-gonic/gin/pull/3832)) ([@chncaption](https://github.com/chncaption)) + * [`386d244`](https://github.com/gin-gonic/gin/commit/386d244): fix(tree): correctly expand the capacity of params ([#3502](https://github.com/gin-gonic/gin/pull/3502)) ([@georgijd-form3](https://github.com/georgijd-form3)) + * [`8790d08`](https://github.com/gin-gonic/gin/commit/8790d08): fix(uri): query binding bug ([#3236](https://github.com/gin-gonic/gin/pull/3236)) ([@illiafox](https://github.com/illiafox)) + * [`44d0dd7`](https://github.com/gin-gonic/gin/commit/44d0dd7): fix: Add pointer support for url query params ([#3659](https://github.com/gin-gonic/gin/pull/3659)) ([#3666](https://github.com/gin-gonic/gin/pull/3666)) ([@omkar-foss](https://github.com/omkar-foss)) + * [`646312a`](https://github.com/gin-gonic/gin/commit/646312a): fix: protect Context.Keys map when call Copy method ([#3873](https://github.com/gin-gonic/gin/pull/3873)) ([@kingcanfish](https://github.com/kingcanfish)) + + +#### Enhancements + * [`d4a6426`](https://github.com/gin-gonic/gin/commit/d4a6426): chore(CI): update release args ([#3595](https://github.com/gin-gonic/gin/pull/3595)) ([@qloog](https://github.com/qloog)) + * [`bb3519d`](https://github.com/gin-gonic/gin/commit/bb3519d): chore(IP): add TrustedPlatform constant for Fly.io. ([#3839](https://github.com/gin-gonic/gin/pull/3839)) ([@ab](https://github.com/ab)) + * [`1b3c085`](https://github.com/gin-gonic/gin/commit/1b3c085): chore(debug): add ability to override the debugPrint statement ([#2337](https://github.com/gin-gonic/gin/pull/2337)) ([@josegonzalez](https://github.com/josegonzalez)) + * [`a64286a`](https://github.com/gin-gonic/gin/commit/a64286a): chore(deps): update dependencies to latest versions ([#3835](https://github.com/gin-gonic/gin/pull/3835)) ([@appleboy](https://github.com/appleboy)) + * [`9c61295`](https://github.com/gin-gonic/gin/commit/9c61295): chore(header): Add support for RFC 9512: application/yaml ([#3851](https://github.com/gin-gonic/gin/pull/3851)) ([@vincentbernat](https://github.com/vincentbernat)) + * [`a481ee2`](https://github.com/gin-gonic/gin/commit/a481ee2): chore(http): use white color for HTTP 1XX ([#3741](https://github.com/gin-gonic/gin/pull/3741)) ([@viralparmarme](https://github.com/viralparmarme)) + * [`c964ad3`](https://github.com/gin-gonic/gin/commit/c964ad3): chore(optimize): the ShouldBindUri method of the Context struct ([#3911](https://github.com/gin-gonic/gin/pull/3911)) ([@1911860538](https://github.com/1911860538)) + * [`739d2d9`](https://github.com/gin-gonic/gin/commit/739d2d9): chore(perf): Optimize the Copy method of the Context struct ([#3859](https://github.com/gin-gonic/gin/pull/3859)) ([@1911860538](https://github.com/1911860538)) + * [`3ea8bd9`](https://github.com/gin-gonic/gin/commit/3ea8bd9): chore(refactor): modify interface check way ([#3855](https://github.com/gin-gonic/gin/pull/3855)) ([@demoManito](https://github.com/demoManito)) + * [`ab8042e`](https://github.com/gin-gonic/gin/commit/ab8042e): chore(request): check reader if it's nil before reading ([#3419](https://github.com/gin-gonic/gin/pull/3419)) ([@noahyao1024](https://github.com/noahyao1024)) + * [`0d9dbbb`](https://github.com/gin-gonic/gin/commit/0d9dbbb): chore(security): upgrade Protobuf for CVE-2024-24786 ([#3893](https://github.com/gin-gonic/gin/pull/3893)) ([@Fotkurz](https://github.com/Fotkurz)) + * [`ecdbbbe`](https://github.com/gin-gonic/gin/commit/ecdbbbe): chore: refactor CI and update dependencies ([#3848](https://github.com/gin-gonic/gin/pull/3848)) ([@appleboy](https://github.com/appleboy)) + * [`39089af`](https://github.com/gin-gonic/gin/commit/39089af): chore: refactor configuration files for better readability ([#3951](https://github.com/gin-gonic/gin/pull/3951)) ([@appleboy](https://github.com/appleboy)) + * [`160c173`](https://github.com/gin-gonic/gin/commit/160c173): chore: update GitHub Actions configuration ([#3792](https://github.com/gin-gonic/gin/pull/3792)) ([@appleboy](https://github.com/appleboy)) + * [`0397e5e`](https://github.com/gin-gonic/gin/commit/0397e5e): chore: update changelog categories and improve documentation ([#3917](https://github.com/gin-gonic/gin/pull/3917)) ([@appleboy](https://github.com/appleboy)) + * [`62b50cf`](https://github.com/gin-gonic/gin/commit/62b50cf): chore: update dependencies to latest versions ([#3694](https://github.com/gin-gonic/gin/pull/3694)) ([@appleboy](https://github.com/appleboy)) + * [`638aa19`](https://github.com/gin-gonic/gin/commit/638aa19): chore: update external dependencies to latest versions ([#3950](https://github.com/gin-gonic/gin/pull/3950)) ([@appleboy](https://github.com/appleboy)) + * [`c6f90df`](https://github.com/gin-gonic/gin/commit/c6f90df): chore: update various Go dependencies to latest versions ([#3901](https://github.com/gin-gonic/gin/pull/3901)) ([@appleboy](https://github.com/appleboy)) + +#### Build process updates + * [`78f4687`](https://github.com/gin-gonic/gin/commit/78f4687): build(codecov): Added a codecov configuration ([#3891](https://github.com/gin-gonic/gin/pull/3891)) ([@flc1125](https://github.com/flc1125)) + * [`56dc72c`](https://github.com/gin-gonic/gin/commit/56dc72c): ci(Makefile): vet command add .PHONY ([#3915](https://github.com/gin-gonic/gin/pull/3915)) ([@imalasong](https://github.com/imalasong)) + * [`8ab47c6`](https://github.com/gin-gonic/gin/commit/8ab47c6): ci(lint): update tooling and workflows for consistency ([#3834](https://github.com/gin-gonic/gin/pull/3834)) ([@appleboy](https://github.com/appleboy)) + * [`8acbe65`](https://github.com/gin-gonic/gin/commit/8acbe65): ci(release): refactor changelog regex patterns and exclusions ([#3914](https://github.com/gin-gonic/gin/pull/3914)) ([@appleboy](https://github.com/appleboy)) + * [`000fdb3`](https://github.com/gin-gonic/gin/commit/000fdb3): ci(testing): add go1.22 version ([#3842](https://github.com/gin-gonic/gin/pull/3842)) ([@appleboy](https://github.com/appleboy)) + + +#### Documentation updates + * [`990c44a`](https://github.com/gin-gonic/gin/commit/990c44aebf20f0796d99051e53d6ee75b7ed52fb): docs(context): Added deprecation comments to BindWith ([#3880](https://github.com/gin-gonic/gin/pull/3880)) ([@flc1125](https://github.com/flc1125)) + * [`861ffb9`](https://github.com/gin-gonic/gin/commit/861ffb9181dc811dc5d76fc450b36d3e68850b95): docs(middleware): comments to function `BasicAuthForProxy` ([#3881](https://github.com/gin-gonic/gin/pull/3881)) ([@EndlessParadox1](https://github.com/EndlessParadox1)) + * [`ee70b30`](https://github.com/gin-gonic/gin/commit/ee70b30a97205ac1f32889f41d8a494b3b2c81a5): docs: Add document to constant `AuthProxyUserKey` and `BasicAuthForProxy`. ([#3887](https://github.com/gin-gonic/gin/pull/3887)) ([@EndlessParadox1](https://github.com/EndlessParadox1)) + * [`f75144a`](https://github.com/gin-gonic/gin/commit/f75144a356e57c95bd21a048f0a40492dcdb33c5): docs: fix typo in comment ([#3868](https://github.com/gin-gonic/gin/pull/3868)) ([@testwill](https://github.com/testwill)) + * [`83fc767`](https://github.com/gin-gonic/gin/commit/83fc7673f9797b4c7d8d1c41b94e9922303e6275): docs: fix typo in function documentation ([#3872](https://github.com/gin-gonic/gin/pull/3872)) ([@TotomiEcio](https://github.com/TotomiEcio)) + * [`49f45a5`](https://github.com/gin-gonic/gin/commit/49f45a542719df661bd71dd48f1595f0bc1ff6f7): docs: remove redundant comments ([#3765](https://github.com/gin-gonic/gin/pull/3765)) ([@WeiTheShinobi](https://github.com/WeiTheShinobi)) + * [`75ccf94`](https://github.com/gin-gonic/gin/commit/75ccf94d605a05fe24817fc2f166f6f2959d5cea): feat: update version constant to v1.10.0 ([#3952](https://github.com/gin-gonic/gin/pull/3952)) ([@appleboy](https://github.com/appleboy)) + +#### Others + * [`02e754b`](https://github.com/gin-gonic/gin/commit/02e754be9c4889f7ee56db0660cc611eb82b61d6): Upgrade golang.org/x/net -> v0.13.0 ([#3684](https://github.com/gin-gonic/gin/pull/3684)) ([@cpcf](https://github.com/cpcf)) + * [`97eab7d`](https://github.com/gin-gonic/gin/commit/97eab7d09a8b048cab4a3d8ebd6c0ea78284c716): test(git): gitignore add develop tools ([#3370](https://github.com/gin-gonic/gin/pull/3370)) ([@demoManito](https://github.com/demoManito)) + * [`ae15646`](https://github.com/gin-gonic/gin/commit/ae15646aba14cd8245fbebd263cc7740c6789ef3): test(http): use constant instead of numeric literal ([#3863](https://github.com/gin-gonic/gin/pull/3863)) ([@testwill](https://github.com/testwill)) + * [`fd60a24`](https://github.com/gin-gonic/gin/commit/fd60a24ab76c3c92955ba253c1f7eda9e4981c3c): test(path): Optimize unit test execution results ([#3883](https://github.com/gin-gonic/gin/pull/3883)) ([@flc1125](https://github.com/flc1125)) + * [`bb2d8cf`](https://github.com/gin-gonic/gin/commit/bb2d8cf486bde2dc69bf05ea917095260ac13723): test(render): increased unit tests coverage ([#3691](https://github.com/gin-gonic/gin/pull/3691)) ([@araujo88](https://github.com/araujo88)) diff --git a/src/content/docs/en/blog/releases/release13.md b/src/content/docs/en/blog/releases/release13.md index 43f4656f4e..8d5057ad72 100644 --- a/src/content/docs/en/blog/releases/release13.md +++ b/src/content/docs/en/blog/releases/release13.md @@ -1,7 +1,7 @@ --- title: "Gin 1.3.0 is released" linkTitle: "Gin 1.3.0 is released" -date: 2018-08-14 +lastUpdated: 2018-08-14 --- ### CHANGELOG diff --git a/src/content/docs/en/blog/releases/release14.md b/src/content/docs/en/blog/releases/release14.md index 23fd648294..c145f3b520 100644 --- a/src/content/docs/en/blog/releases/release14.md +++ b/src/content/docs/en/blog/releases/release14.md @@ -1,7 +1,7 @@ --- title: "Gin 1.4.0 is released" linkTitle: "Gin 1.4.0 is released" -date: 2019-05-08 +lastUpdated: 2019-05-08 --- ### CHANGELOG diff --git a/src/content/docs/en/blog/releases/release15.md b/src/content/docs/en/blog/releases/release15.md index e4593b3ceb..4f5707a177 100644 --- a/src/content/docs/en/blog/releases/release15.md +++ b/src/content/docs/en/blog/releases/release15.md @@ -1,7 +1,7 @@ --- title: "Gin 1.5.0 is released" linkTitle: "Gin 1.5.0 is released" -date: 2019-11-28 +lastUpdated: 2019-11-28 --- ### CHANGELOG diff --git a/src/content/docs/en/blog/releases/release16.md b/src/content/docs/en/blog/releases/release16.md index 539997c964..dfc0c6ef58 100644 --- a/src/content/docs/en/blog/releases/release16.md +++ b/src/content/docs/en/blog/releases/release16.md @@ -1,7 +1,7 @@ --- title: "Gin 1.6.0 is released" linkTitle: "Gin 1.6.0 is released" -date: 2020-03-22 +lastUpdated: 2020-03-22 --- ### CHANGELOG diff --git a/src/content/docs/en/blog/releases/release17.md b/src/content/docs/en/blog/releases/release17.md new file mode 100644 index 0000000000..51652aa94f --- /dev/null +++ b/src/content/docs/en/blog/releases/release17.md @@ -0,0 +1,38 @@ +--- +title: "Gin 1.7.0 is released" +linkTitle: "Gin 1.7.0 is released" +lastUpdated: 2021-04-08 +--- + +### CHANGELOG + + +#### BUGFIXES + * Fix compile error from [#2572](https://github.com/gin-gonic/gin/pull/2572) ([#2600](https://github.com/gin-gonic/gin/pull/2600)) + * Fix: print headers without Authorization header on broken pipe ([#2528](https://github.com/gin-gonic/gin/pull/2528)) + * Fix(tree): reassign fullpath when register new node ([#2366](https://github.com/gin-gonic/gin/pull/2366)) + + +#### ENHANCEMENTS + * Support params and exact routes without creating conflicts ([#2663](https://github.com/gin-gonic/gin/pull/2663)) + * Chore: improve render string performance ([#2365](https://github.com/gin-gonic/gin/pull/2365)) + * Sync route tree to httprouter latest code ([#2368](https://github.com/gin-gonic/gin/pull/2368)) + * Chore: rename getQueryCache/getFormCache to initQueryCache/initFormCa ([#2375](https://github.com/gin-gonic/gin/pull/2375)) + * Chore(performance): improve countParams ([#2378](https://github.com/gin-gonic/gin/pull/2378)) + * Remove some functions that have the same effect as the bytes package ([#2387](https://github.com/gin-gonic/gin/pull/2387)) + * Update: SetMode function ([#2321](https://github.com/gin-gonic/gin/pull/2321)) + * Remove a unused type SecureJSONPrefix ([#2391](https://github.com/gin-gonic/gin/pull/2391)) + * Add a redirect sample for POST method ([#2389](https://github.com/gin-gonic/gin/pull/2389)) + * Add CustomRecovery builtin middleware ([#2322](https://github.com/gin-gonic/gin/pull/2322)) + * Binding: avoid 2038 problem on 32-bit architectures ([#2450](https://github.com/gin-gonic/gin/pull/2450)) + * Prevent panic in Context.GetQuery() when there is no Request ([#2412](https://github.com/gin-gonic/gin/pull/2412)) + * Add GetUint and GetUint64 method on gin.context ([#2487](https://github.com/gin-gonic/gin/pull/2487)) + * Update content-disposition header to MIME-style ([#2512](https://github.com/gin-gonic/gin/pull/2512)) + * Reduce allocs and improve the render `WriteString` ([#2508](https://github.com/gin-gonic/gin/pull/2508)) + * Implement ".Unwrap() error" on Error type ([#2525](https://github.com/gin-gonic/gin/issues/2525)) ([#2526](https://github.com/gin-gonic/gin/pull/2526)) + * Allow bind with a map[string]string ([#2484](https://github.com/gin-gonic/gin/pull/2484)) + * Chore: update tree ([#2371](https://github.com/gin-gonic/gin/pull/2371)) + * Support binding for slice/array obj [Rewrite] ([#2302](https://github.com/gin-gonic/gin/pull/2302)) + * Basic auth: fix timing oracle ([#2609](https://github.com/gin-gonic/gin/pull/2609)) + * Add mixed param and non-param paths (port of httprouter[#329](https://github.com/gin-gonic/gin/issues/329)) ([#2663](https://github.com/gin-gonic/gin/pull/2663)) + * Feat(engine): add trustedproxies and remoteIP ([#2632](https://github.com/gin-gonic/gin/pull/2632)) diff --git a/src/content/docs/en/blog/releases/release18.md b/src/content/docs/en/blog/releases/release18.md new file mode 100644 index 0000000000..470e75471c --- /dev/null +++ b/src/content/docs/en/blog/releases/release18.md @@ -0,0 +1,44 @@ +--- +title: "Gin 1.8.0 is released" +linkTitle: "Gin 1.8.0 is released" +lastUpdated: 2022-05-30 +--- + +### CHANGELOG + +#### Break Changes + * TrustedProxies: Add default IPv6 support and refactor ([#2967](https://github.com/gin-gonic/gin/pull/2967)). Please replace `RemoteIP() (net.IP, bool)` with `RemoteIP() net.IP` + * gin.Context with fallback value from gin.Context.Request.Context() ([#2751](https://github.com/gin-gonic/gin/pull/2751)) + +#### BUGFIXES + * Fixed SetOutput() panics on go 1.17 ([#2861](https://github.com/gin-gonic/gin/pull/2861)) + * Fix: wrong when wildcard follows named param ([#2983](https://github.com/gin-gonic/gin/pull/2983)) + * Fix: missing sameSite when do context.reset() ([#3123](https://github.com/gin-gonic/gin/pull/3123)) + + +#### ENHANCEMENTS + * Use Header() instead of deprecated HeaderMap ([#2694](https://github.com/gin-gonic/gin/pull/2694)) + * RouterGroup.Handle regular match optimization of http method ([#2685](https://github.com/gin-gonic/gin/pull/2685)) + * Add support go-json, another drop-in json replacement ([#2680](https://github.com/gin-gonic/gin/pull/2680)) + * Use errors.New to replace fmt.Errorf will much better ([#2707](https://github.com/gin-gonic/gin/pull/2707)) + * Use Duration.Truncate for truncating precision ([#2711](https://github.com/gin-gonic/gin/pull/2711)) + * Get client IP when using Cloudflare ([#2723](https://github.com/gin-gonic/gin/pull/2723)) + * Optimize code adjust ([#2700](https://github.com/gin-gonic/gin/pull/2700)) + * Optimize code and reduce code cyclomatic complexity ([#2737](https://github.com/gin-gonic/gin/pull/2737)) + * gin.Context with fallback value from gin.Context.Request.Context() ([#2751](https://github.com/gin-gonic/gin/pull/2751)) + * Improve sliceValidateError.Error performance ([#2765](https://github.com/gin-gonic/gin/pull/2765)) + * Support custom struct tag ([#2720](https://github.com/gin-gonic/gin/pull/2720)) + * Improve router group tests ([#2787](https://github.com/gin-gonic/gin/pull/2787)) + * Fallback Context.Deadline() Context.Done() Context.Err() to Context.Request.Context() ([#2769](https://github.com/gin-gonic/gin/pull/2769)) + * Some codes optimize [#2830](https://github.com/gin-gonic/gin/pull/2830), [#2834](https://github.com/gin-gonic/gin/pull/2834), [#2838](https://github.com/gin-gonic/gin/pull/2838), [#2837](https://github.com/gin-gonic/gin/pull/2837), [#2788](https://github.com/gin-gonic/gin/pull/2788), [#2848](https://github.com/gin-gonic/gin/pull/2848), [#2851](https://github.com/gin-gonic/gin/pull/2851), [#2701](https://github.com/gin-gonic/gin/pull/2701) + * Test(route): expose performRequest func ([#3012](https://github.com/gin-gonic/gin/pull/3012)) + * Support h2c with prior knowledge ([#1398](https://github.com/gin-gonic/gin/pull/1398)) + * Feat attachment filename support utf8 ([#3071](https://github.com/gin-gonic/gin/pull/3071)) + * Feat: add StaticFileFS ([#2749](https://github.com/gin-gonic/gin/pull/2749)) + * Feat(context): return GIN Context from Value method ([#2825](https://github.com/gin-gonic/gin/pull/2825)) + * Feat: automatically SetMode to TestMode when run go test ([#3139](https://github.com/gin-gonic/gin/pull/3139)) + * Add TOML binding for gin ([#3081](https://github.com/gin-gonic/gin/pull/3081)) + * IPv6 add default trusted proxies ([#3033](https://github.com/gin-gonic/gin/pull/3033)) + +#### DOCS + * Add note about nomsgpack tag to the readme ([#2703](https://github.com/gin-gonic/gin/pull/2703)) diff --git a/src/content/docs/en/blog/releases/release19.md b/src/content/docs/en/blog/releases/release19.md new file mode 100644 index 0000000000..93414794f8 --- /dev/null +++ b/src/content/docs/en/blog/releases/release19.md @@ -0,0 +1,36 @@ +--- +title: "Gin 1.9.0 is released" +linkTitle: "Gin 1.9.0 is released" +lastUpdated: 2023-02-21 +--- + +### CHANGELOG + +#### BREAK CHANGES + * Stop useless panicking in context and render ([#2150](https://github.com/gin-gonic/gin/pull/2150)) + +#### BUG FIXES + * Fix(router): tree bug where loop index is not decremented ([#3460](https://github.com/gin-gonic/gin/pull/3460)) + * Fix(context): panic on NegotiateFormat - index out of range ([#3397](https://github.com/gin-gonic/gin/pull/3397)) + * Add escape logic for header ([#3500](https://github.com/gin-gonic/gin/pull/3500) and [#3503](https://github.com/gin-gonic/gin/pull/3503)) + +#### SECURITY + * Fix the GO-2022-0969 and GO-2022-0288 vulnerabilities ([#3333](https://github.com/gin-gonic/gin/pull/3333)) + * Fix(security): vulnerability GO-2023-1571 ([#3505](https://github.com/gin-gonic/gin/pull/3505)) + +#### ENHANCEMENTS + * Feat: add sonic json support ([#3184](https://github.com/gin-gonic/gin/pull/3184)) + * Chore(file): Creates a directory named path ([#3316](https://github.com/gin-gonic/gin/pull/3316)) + * Fix: modify interface check way ([#3327](https://github.com/gin-gonic/gin/pull/3327)) + * Remove deprecated of package io/ioutil ([#3395](https://github.com/gin-gonic/gin/pull/3395)) + * Refactor: avoid calling strings.ToLower twice ([#3433](https://github.com/gin-gonic/gin/pull/3343)) + * Console logger HTTP status code bug fixed ([#3453](https://github.com/gin-gonic/gin/pull/3453)) + * Chore(yaml): upgrade dependency to v3 version ([#3456](https://github.com/gin-gonic/gin/pull/3456)) + * Chore(router): match method added to routergroup for multiple HTTP methods supporting ([#3464](https://github.com/gin-gonic/gin/pull/3464)) + * Chore(http): add support for go1.20 http.rwUnwrapper to gin.responseWriter ([#3489](https://github.com/gin-gonic/gin/pull/3489)) + +#### DOCS + * Docs: update markdown format ([#3260](https://github.com/gin-gonic/gin/pull/3260)) + * Docs(readme): Add the TOML rendering example ([#3400](https://github.com/gin-gonic/gin/pull/3400)) + * Docs(readme): move more example to docs/doc.md ([#3449](https://github.com/gin-gonic/gin/pull/3449)) + * Docs: update markdown format ([#3446](https://github.com/gin-gonic/gin/pull/3446)) diff --git a/src/content/docs/en/docs/benchmarks/index.md b/src/content/docs/en/docs/benchmarks/index.md index 3f4ae2915a..6ca637fa20 100644 --- a/src/content/docs/en/docs/benchmarks/index.md +++ b/src/content/docs/en/docs/benchmarks/index.md @@ -1,48 +1,117 @@ --- title: "Benchmarks" - sidebar: order: 3 --- +**VM HOST:** Travis +**Machine:** Ubuntu 16.04.6 LTS x64 +**Date:** May 04th, 2020 +**Version:** Gin v1.6.3 +**Go Version:** 1.14.2 linux/amd64 +**Source:** [Go HTTP Router Benchmark](https://github.com/gin-gonic/go-http-routing-benchmark) +**Result:** [See the gist](https://gist.github.com/appleboy/b5f2ecfaf50824ae9c64dcfb9165ae5e) or [Travis result](https://travis-ci.org/github/gin-gonic/go-http-routing-benchmark/jobs/682947061) + Gin uses a custom version of [HttpRouter](https://github.com/julienschmidt/httprouter) [See all benchmarks](https://github.com/gin-gonic/gin/blob/master/BENCHMARKS.md) -| Benchmark name | (1) | (2) | (3) | (4) | -| ------------------------------ | ---------:| ---------------:| ------------:| ---------------:| -| BenchmarkGin_GithubAll | **43550** | **27364 ns/op** | **0 B/op** | **0 allocs/op** | -| BenchmarkAce_GithubAll | 40543 | 29670 ns/op | 0 B/op | 0 allocs/op | -| BenchmarkAero_GithubAll | 57632 | 20648 ns/op | 0 B/op | 0 allocs/op | -| BenchmarkBear_GithubAll | 9234 | 216179 ns/op | 86448 B/op | 943 allocs/op | -| BenchmarkBeego_GithubAll | 7407 | 243496 ns/op | 71456 B/op | 609 allocs/op | -| BenchmarkBone_GithubAll | 420 | 2922835 ns/op | 720160 B/op | 8620 allocs/op | -| BenchmarkChi_GithubAll | 7620 | 238331 ns/op | 87696 B/op | 609 allocs/op | -| BenchmarkDenco_GithubAll | 18355 | 64494 ns/op | 20224 B/op | 167 allocs/op | -| BenchmarkEcho_GithubAll | 31251 | 38479 ns/op | 0 B/op | 0 allocs/op | -| BenchmarkGocraftWeb_GithubAll | 4117 | 300062 ns/op | 131656 B/op | 1686 allocs/op | -| BenchmarkGoji_GithubAll | 3274 | 416158 ns/op | 56112 B/op | 334 allocs/op | -| BenchmarkGojiv2_GithubAll | 1402 | 870518 ns/op | 352720 B/op | 4321 allocs/op | -| BenchmarkGoJsonRest_GithubAll | 2976 | 401507 ns/op | 134371 B/op | 2737 allocs/op | -| BenchmarkGoRestful_GithubAll | 410 | 2913158 ns/op | 910144 B/op | 2938 allocs/op | -| BenchmarkGorillaMux_GithubAll | 346 | 3384987 ns/op | 251650 B/op | 1994 allocs/op | -| BenchmarkGowwwRouter_GithubAll | 10000 | 143025 ns/op | 72144 B/op | 501 allocs/op | -| BenchmarkHttpRouter_GithubAll | 55938 | 21360 ns/op | 0 B/op | 0 allocs/op | -| BenchmarkHttpTreeMux_GithubAll | 10000 | 153944 ns/op | 65856 B/op | 671 allocs/op | -| BenchmarkKocha_GithubAll | 10000 | 106315 ns/op | 23304 B/op | 843 allocs/op | -| BenchmarkLARS_GithubAll | 47779 | 25084 ns/op | 0 B/op | 0 allocs/op | -| BenchmarkMacaron_GithubAll | 3266 | 371907 ns/op | 149409 B/op | 1624 allocs/op | -| BenchmarkMartini_GithubAll | 331 | 3444706 ns/op | 226551 B/op | 2325 allocs/op | -| BenchmarkPat_GithubAll | 273 | 4381818 ns/op | 1483152 B/op | 26963 allocs/op | -| BenchmarkPossum_GithubAll | 10000 | 164367 ns/op | 84448 B/op | 609 allocs/op | -| BenchmarkR2router_GithubAll | 10000 | 160220 ns/op | 77328 B/op | 979 allocs/op | -| BenchmarkRivet_GithubAll | 14625 | 82453 ns/op | 16272 B/op | 167 allocs/op | -| BenchmarkTango_GithubAll | 6255 | 279611 ns/op | 63826 B/op | 1618 allocs/op | -| BenchmarkTigerTonic_GithubAll | 2008 | 687874 ns/op | 193856 B/op | 4474 allocs/op | -| BenchmarkTraffic_GithubAll | 355 | 3478508 ns/op | 820744 B/op | 14114 allocs/op | -| BenchmarkVulcan_GithubAll | 6885 | 193333 ns/op | 19894 B/op | 609 allocs/op | +| Test | Repetitions | Time (ns/op) | Bytes (B/op) | Allocations (allocs/op) | +| --------------------------------- | ----------- | ------------ | ------------ | ----------------------- | +| BenchmarkGin_GithubStatic | 15629472 | 76.7 | 0 | 0 | +| BenchmarkAce_GithubStatic | 15542612 | 75.9 | 0 | 0 | +| BenchmarkAero_GithubStatic | 24777151 | 48.5 | 0 | 0 | +| BenchmarkBear_GithubStatic | 2788894 | 435 | 120 | 3 | +| BenchmarkBeego_GithubStatic | 1000000 | 1064 | 352 | 3 | +| BenchmarkBone_GithubStatic | 93507 | 12838 | 2880 | 60 | +| BenchmarkChi_GithubStatic | 1387743 | 860 | 432 | 3 | +| BenchmarkDenco_GithubStatic | 39384996 | 30.4 | 0 | 0 | +| BenchmarkEcho_GithubStatic | 12076382 | 99.1 | 0 | 0 | +| BenchmarkGocraftWeb_GithubStatic | 1596495 | 756 | 296 | 5 | +| BenchmarkGoji_GithubStatic | 6364876 | 189 | 0 | 0 | +| BenchmarkGojiv2_GithubStatic | 550202 | 2098 | 1312 | 10 | +| BenchmarkGoRestful_GithubStatic | 102183 | 12552 | 4256 | 13 | +| BenchmarkGoJsonRest_GithubStatic | 1000000 | 1029 | 329 | 11 | +| BenchmarkGorillaMux_GithubStatic | 255552 | 5190 | 976 | 9 | +| BenchmarkGowwwRouter_GithubStatic | 15531916 | 77.1 | 0 | 0 | +| BenchmarkHttpRouter_GithubStatic | 27920724 | 43.1 | 0 | 0 | +| BenchmarkHttpTreeMux_GithubStatic | 21448953 | 55.8 | 0 | 0 | +| BenchmarkKocha_GithubStatic | 21405310 | 56.0 | 0 | 0 | +| BenchmarkLARS_GithubStatic | 13625156 | 89.0 | 0 | 0 | +| BenchmarkMacaron_GithubStatic | 1000000 | 1747 | 736 | 8 | +| BenchmarkMartini_GithubStatic | 187186 | 7326 | 768 | 9 | +| BenchmarkPat_GithubStatic | 109143 | 11563 | 3648 | 76 | +| BenchmarkPossum_GithubStatic | 1575898 | 770 | 416 | 3 | +| BenchmarkR2router_GithubStatic | 3046231 | 404 | 144 | 4 | +| BenchmarkRivet_GithubStatic | 11484826 | 105 | 0 | 0 | +| BenchmarkTango_GithubStatic | 1000000 | 1153 | 248 | 8 | +| BenchmarkTigerTonic_GithubStatic | 4929780 | 249 | 48 | 1 | +| BenchmarkTraffic_GithubStatic | 106351 | 11819 | 4664 | 90 | +| BenchmarkVulcan_GithubStatic | 1613271 | 722 | 98 | 3 | +| BenchmarkAce_GithubParam | 8386032 | 143 | 0 | 0 | +| BenchmarkAero_GithubParam | 11816200 | 102 | 0 | 0 | +| BenchmarkBear_GithubParam | 1000000 | 1012 | 496 | 5 | +| BenchmarkBeego_GithubParam | 1000000 | 1157 | 352 | 3 | +| BenchmarkBone_GithubParam | 184653 | 6912 | 1888 | 19 | +| BenchmarkChi_GithubParam | 1000000 | 1102 | 432 | 3 | +| BenchmarkDenco_GithubParam | 3484798 | 352 | 128 | 1 | +| BenchmarkEcho_GithubParam | 6337380 | 189 | 0 | 0 | +| BenchmarkGin_GithubParam | 9132032 | 131 | 0 | 0 | +| BenchmarkGocraftWeb_GithubParam | 1000000 | 1446 | 712 | 9 | +| BenchmarkGoji_GithubParam | 1248640 | 977 | 336 | 2 | +| BenchmarkGojiv2_GithubParam | 383233 | 2784 | 1408 | 13 | +| BenchmarkGoJsonRest_GithubParam | 1000000 | 1991 | 713 | 14 | +| BenchmarkGoRestful_GithubParam | 76414 | 16015 | 4352 | 16 | +| BenchmarkGorillaMux_GithubParam | 150026 | 7663 | 1296 | 10 | +| BenchmarkGowwwRouter_GithubParam | 1592044 | 751 | 432 | 3 | +| BenchmarkHttpRouter_GithubParam | 10420628 | 115 | 0 | 0 | +| BenchmarkHttpTreeMux_GithubParam | 1403755 | 835 | 384 | 4 | +| BenchmarkKocha_GithubParam | 2286170 | 533 | 128 | 5 | +| BenchmarkLARS_GithubParam | 9540374 | 129 | 0 | 0 | +| BenchmarkMacaron_GithubParam | 533154 | 2742 | 1072 | 10 | +| BenchmarkMartini_GithubParam | 119397 | 9638 | 1152 | 11 | +| BenchmarkPat_GithubParam | 150675 | 8858 | 2408 | 48 | +| BenchmarkPossum_GithubParam | 1000000 | 1001 | 496 | 5 | +| BenchmarkR2router_GithubParam | 1602886 | 761 | 432 | 5 | +| BenchmarkRivet_GithubParam | 2986579 | 409 | 96 | 1 | +| BenchmarkTango_GithubParam | 1000000 | 1356 | 344 | 8 | +| BenchmarkTigerTonic_GithubParam | 388899 | 3429 | 1176 | 22 | +| BenchmarkTraffic_GithubParam | 123160 | 9734 | 2816 | 40 | +| BenchmarkVulcan_GithubParam | 1000000 | 1138 | 98 | 3 | +| BenchmarkAce_GithubAll | 40543 | 29670 | 0 | 0 | +| BenchmarkAero_GithubAll | 57632 | 20648 | 0 | 0 | +| BenchmarkBear_GithubAll | 9234 | 216179 | 86448 | 943 | +| BenchmarkBeego_GithubAll | 7407 | 243496 | 71456 | 609 | +| BenchmarkBone_GithubAll | 420 | 2922835 | 720160 | 8620 | +| BenchmarkChi_GithubAll | 7620 | 238331 | 87696 | 609 | +| BenchmarkDenco_GithubAll | 18355 | 64494 | 20224 | 167 | +| BenchmarkEcho_GithubAll | 31251 | 38479 | 0 | 0 | +| BenchmarkGin_GithubAll | 43550 | 27364 | 0 | 0 | +| BenchmarkGocraftWeb_GithubAll | 4117 | 300062 | 131656 | 1686 | +| BenchmarkGoji_GithubAll | 3274 | 416158 | 56112 | 334 | +| BenchmarkGojiv2_GithubAll | 1402 | 870518 | 352720 | 4321 | +| BenchmarkGoJsonRest_GithubAll | 2976 | 401507 | 134371 | 2737 | +| BenchmarkGoRestful_GithubAll | 410 | 2913158 | 910144 | 2938 | +| BenchmarkGorillaMux_GithubAll | 346 | 3384987 | 251650 | 1994 | +| BenchmarkGowwwRouter_GithubAll | 10000 | 143025 | 72144 | 501 | +| BenchmarkHttpRouter_GithubAll | 55938 | 21360 | 0 | 0 | +| BenchmarkHttpTreeMux_GithubAll | 10000 | 153944 | 65856 | 671 | +| BenchmarkKocha_GithubAll | 10000 | 106315 | 23304 | 843 | +| BenchmarkLARS_GithubAll | 47779 | 25084 | 0 | 0 | +| BenchmarkMacaron_GithubAll | 3266 | 371907 | 149409 | 1624 | +| BenchmarkMartini_GithubAll | 331 | 3444706 | 226551 | 2325 | +| BenchmarkPat_GithubAll | 273 | 4381818 | 1483152 | 26963 | +| BenchmarkPossum_GithubAll | 10000 | 164367 | 84448 | 609 | +| BenchmarkR2router_GithubAll | 10000 | 160220 | 77328 | 979 | +| BenchmarkRivet_GithubAll | 14625 | 82453 | 16272 | 167 | +| BenchmarkTango_GithubAll | 6255 | 279611 | 63826 | 1618 | +| BenchmarkTigerTonic_GithubAll | 2008 | 687874 | 193856 | 4474 | +| BenchmarkTraffic_GithubAll | 355 | 3478508 | 820744 | 14114 | +| BenchmarkVulcan_GithubAll | 6885 | 193333 | 19894 | 609 | + +Notes: -- (1): Total Repetitions achieved in constant time, higher means more confident result -- (2): Single Repetition Duration (ns/op), lower is better -- (3): Heap Memory (B/op), lower is better -- (4): Average Allocations per Repetition (allocs/op), lower is better +- Repetitions: Total repetitions achieved in constant time, higher means more confident result +- Time: Single repetition duration (ns/op), lower is better +- Bytes: Heap memory (B/op), lower is better +- Allocations: Average allocations per repetition (allocs/op), lower is better diff --git a/src/content/docs/en/docs/deployment/index.md b/src/content/docs/en/docs/deployment/index.md index 334b018054..e6b0a7bbf8 100644 --- a/src/content/docs/en/docs/deployment/index.md +++ b/src/content/docs/en/docs/deployment/index.md @@ -1,12 +1,17 @@ --- title: "Deployment" - sidebar: order: 6 --- Gin projects can be deployed easily on any cloud provider. +## [Railway](https://www.railway.com) + +Railway is a cutting-edge cloud development platform for deploying, managing, and scaling applications and services. It simplifies your infrastructure stack from servers to observability with a single, scalable, easy-to-use platform. + +Follow the Railway [guide to deploy your Gin projects](https://docs.railway.com/guides/gin). + ## [Koyeb](https://www.koyeb.com) Koyeb is a developer-friendly serverless platform to deploy apps globally with git-based deployment, TLS encryption, native autoscaling, a global edge network, and built-in service mesh & discovery. @@ -30,3 +35,113 @@ Follow the Render [guide to deploying Gin projects](https://render.com/docs/depl GAE has two ways to deploy Go applications. The standard environment is easier to use but less customizable and prevents [syscalls](https://github.com/gin-gonic/gin/issues/1639) for security reasons. The flexible environment can run any framework or library. Learn more and pick your preferred environment at [Go on Google App Engine](https://cloud.google.com/appengine/docs/go/). + +## Self Hosted + +Gin projects can also be deployed in a self-hosted manner. Deployment architecture and security considerations vary depending on the target environment. The following section only presents a high level overview of configuration options to consider when planning the deployment. + +## Configuration Options + +Gin project deployments can be tuned by using environment variables or directly in code. + +The following environment variables are available for configuring Gin: + +| Environment Variable | Description | +| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| PORT | The TCP port to listen on when starting the Gin server with `router.Run()` (i.e. without any arguments). | +| GIN_MODE | Set to one of `debug`, `release`, or `test`. Handles management of Gin modes, such as when to emit debug outputs. Can also be set in code using `gin.SetMode(gin.ReleaseMode)` or `gin.SetMode(gin.TestMode)` | + +The following code can be used to configure Gin. + +```go +// Don't specify the bind address or port for Gin. Defaults to binding on all interfaces on port 8080. +// Can use the `PORT` environment variable to change the listen port when using `Run()` without any arguments. +router := gin.Default() +router.Run() + +// Specify the bind address and port for Gin. +router := gin.Default() +router.Run("192.168.1.100:8080") + +// Specify only the listen port. Will bind on all interfaces. +router := gin.Default() +router.Run(":8080") + +// Set which IP addresses or CIDRs, are considered to be trusted for setting headers to document real client IP addresses. +// See the documentation for additional details. +router := gin.Default() +router.SetTrustedProxies([]string{"192.168.1.2"}) +``` + +## Don't trust all proxies + +Gin lets you specify which headers to hold the real client IP (if any), +as well as specifying which proxies (or direct clients) you trust to +specify one of these headers. + +Use function `SetTrustedProxies()` on your `gin.Engine` to specify network addresses +or network CIDRs from where clients which their request headers related to client +IP can be trusted. They can be IPv4 addresses, IPv4 CIDRs, IPv6 addresses or +IPv6 CIDRs. + +**Attention:** Gin trust all proxies by default if you don't specify a trusted +proxy using the function above, **this is NOT safe**. At the same time, if you don't +use any proxy, you can disable this feature by using `Engine.SetTrustedProxies(nil)`, +then `Context.ClientIP()` will return the remote address directly to avoid some +unnecessary computation. + +```go +import ( + "fmt" + + "github.com/gin-gonic/gin" +) + +func main() { + router := gin.Default() + router.SetTrustedProxies([]string{"192.168.1.2"}) + + router.GET("/", func(c *gin.Context) { + // If the client is 192.168.1.2, use the X-Forwarded-For + // header to deduce the original client IP from the trust- + // worthy parts of that header. + // Otherwise, simply return the direct client IP + fmt.Printf("ClientIP: %s\n", c.ClientIP()) + }) + router.Run() +} +``` + +**Notice:** If you are using a CDN service, you can set the `Engine.TrustedPlatform` +to skip TrustedProxies check, it has a higher priority than TrustedProxies. +Look at the example below: + +```go +import ( + "fmt" + + "github.com/gin-gonic/gin" +) + +func main() { + router := gin.Default() + // Use predefined header gin.PlatformXXX + // Google App Engine + router.TrustedPlatform = gin.PlatformGoogleAppEngine + // Cloudflare + router.TrustedPlatform = gin.PlatformCloudflare + // Fly.io + router.TrustedPlatform = gin.PlatformFlyIO + // Or, you can set your own trusted request header. But be sure your CDN + // prevents users from passing this header! For example, if your CDN puts + // the client IP in X-CDN-Client-IP: + router.TrustedPlatform = "X-CDN-Client-IP" + + router.GET("/", func(c *gin.Context) { + // If you set TrustedPlatform, ClientIP() will resolve the + // corresponding header and return IP directly + fmt.Printf("ClientIP: %s\n", c.ClientIP()) + }) + router.Run() +} +``` diff --git a/src/content/docs/en/docs/examples/ascii-json.md b/src/content/docs/en/docs/examples/ascii-json.md index 7e2d2b0d04..bafbe964f3 100644 --- a/src/content/docs/en/docs/examples/ascii-json.md +++ b/src/content/docs/en/docs/examples/ascii-json.md @@ -1,15 +1,14 @@ --- title: "AsciiJSON" - --- Using AsciiJSON to Generates ASCII-only JSON with escaped non-ASCII characters. ```go func main() { - r := gin.Default() + router := gin.Default() - r.GET("/someJSON", func(c *gin.Context) { + router.GET("/someJSON", func(c *gin.Context) { data := map[string]interface{}{ "lang": "GO语言", "tag": "
", @@ -20,6 +19,6 @@ func main() { }) // Listen and serve on 0.0.0.0:8080 - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/en/docs/examples/bind-body-into-dirrerent-structs.md b/src/content/docs/en/docs/examples/bind-body-into-dirrerent-structs.md index 138179eea1..60701cb187 100644 --- a/src/content/docs/en/docs/examples/bind-body-into-dirrerent-structs.md +++ b/src/content/docs/en/docs/examples/bind-body-into-dirrerent-structs.md @@ -1,6 +1,5 @@ --- title: "Try to bind body into different structs" - --- The normal methods for binding request body consumes `c.Request.Body` and they diff --git a/src/content/docs/en/docs/examples/bind-form-data-request-with-custom-struct.md b/src/content/docs/en/docs/examples/bind-form-data-request-with-custom-struct.md index 92ab2f4b88..19997854d1 100644 --- a/src/content/docs/en/docs/examples/bind-form-data-request-with-custom-struct.md +++ b/src/content/docs/en/docs/examples/bind-form-data-request-with-custom-struct.md @@ -1,6 +1,5 @@ --- title: "Bind form-data request with custom struct" - --- The follow example using custom struct: @@ -55,18 +54,18 @@ func GetDataD(c *gin.Context) { } func main() { - r := gin.Default() - r.GET("/getb", GetDataB) - r.GET("/getc", GetDataC) - r.GET("/getd", GetDataD) + router := gin.Default() + router.GET("/getb", GetDataB) + router.GET("/getc", GetDataC) + router.GET("/getd", GetDataD) - r.Run() + router.Run() } ``` Using the command `curl` command result: -``` +```bash $ curl "http://localhost:8080/getb?field_a=hello&field_b=world" {"a":{"FieldA":"hello"},"b":"world"} $ curl "http://localhost:8080/getc?field_a=hello&field_c=world" diff --git a/src/content/docs/en/docs/examples/bind-html-checkbox.md b/src/content/docs/en/docs/examples/bind-html-checkbox.md index 4b1ee65efa..0de0cad363 100644 --- a/src/content/docs/en/docs/examples/bind-html-checkbox.md +++ b/src/content/docs/en/docs/examples/bind-html-checkbox.md @@ -1,6 +1,5 @@ --- title: "Bind html checkboxes" - --- See the [detail information](https://github.com/gin-gonic/gin/issues/129#issuecomment-124260092) diff --git a/src/content/docs/en/docs/examples/bind-query-or-post.md b/src/content/docs/en/docs/examples/bind-query-or-post.md index 9912d908a2..f25b161401 100644 --- a/src/content/docs/en/docs/examples/bind-query-or-post.md +++ b/src/content/docs/en/docs/examples/bind-query-or-post.md @@ -1,6 +1,5 @@ --- title: "Bind query string or post data" - --- See the [detail information](https://github.com/gin-gonic/gin/issues/742#issuecomment-264681292). @@ -32,12 +31,16 @@ func startPage(c *gin.Context) { // If `GET`, only `Form` binding engine (`query`) used. // If `POST`, first checks the `content-type` for `JSON` or `XML`, then uses `Form` (`form-data`). // See more at https://github.com/gin-gonic/gin/blob/master/binding/binding.go#L48 - if c.ShouldBind(&person) == nil { - log.Println(person.Name) - log.Println(person.Address) - log.Println(person.Birthday) + err := c.ShouldBind(&person) + if err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) + return } + log.Println(person.Name) + log.Println(person.Address) + log.Println(person.Birthday) + c.String(200, "Success") } ``` diff --git a/src/content/docs/en/docs/examples/bind-single-binary-with-template.md b/src/content/docs/en/docs/examples/bind-single-binary-with-template.md index 09e8b02fc7..5fa393039e 100644 --- a/src/content/docs/en/docs/examples/bind-single-binary-with-template.md +++ b/src/content/docs/en/docs/examples/bind-single-binary-with-template.md @@ -1,6 +1,5 @@ --- title: "Build a single binary with templates" - --- ## Use the third-party package @@ -14,12 +13,12 @@ func main() { if err != nil { panic(err) } - r.SetHTMLTemplate(t) + router.SetHTMLTemplate(t) - r.GET("/", func(c *gin.Context) { + router.GET("/", func(c *gin.Context) { c.HTML(http.StatusOK, "/html/index.tmpl", nil) }) - r.Run(":8080") + router.Run(":8080") } // loadTemplate loads templates embedded by go-assets-builder diff --git a/src/content/docs/en/docs/examples/bind-uri.md b/src/content/docs/en/docs/examples/bind-uri.md index 4c74abfab0..b53254c368 100644 --- a/src/content/docs/en/docs/examples/bind-uri.md +++ b/src/content/docs/en/docs/examples/bind-uri.md @@ -1,6 +1,5 @@ --- title: "Bind Uri" - --- See the [detail information](https://github.com/gin-gonic/gin/issues/846). diff --git a/src/content/docs/en/docs/examples/binding-and-validation.md b/src/content/docs/en/docs/examples/binding-and-validation.md index 40684022c6..f89a5c24a2 100644 --- a/src/content/docs/en/docs/examples/binding-and-validation.md +++ b/src/content/docs/en/docs/examples/binding-and-validation.md @@ -1,6 +1,5 @@ --- title: "Model binding and validation" - --- To bind a request body into a type, use model binding. We currently support binding of JSON, XML, YAML and standard form values (foo=bar&boo=baz). diff --git a/src/content/docs/en/docs/examples/controlling-log-output-coloring.md b/src/content/docs/en/docs/examples/controlling-log-output-coloring.md index c0973a85af..08f4c84557 100644 --- a/src/content/docs/en/docs/examples/controlling-log-output-coloring.md +++ b/src/content/docs/en/docs/examples/controlling-log-output-coloring.md @@ -1,6 +1,5 @@ --- title: "Controlling Log output coloring" - --- By default, logs output on console should be colorized depending on the detected TTY. diff --git a/src/content/docs/en/docs/examples/cookie.md b/src/content/docs/en/docs/examples/cookie.md index 090e66354a..3efb30edf5 100644 --- a/src/content/docs/en/docs/examples/cookie.md +++ b/src/content/docs/en/docs/examples/cookie.md @@ -1,8 +1,9 @@ --- -title: "Set and get a cookie" - +title: "Cookie" --- +Set and get cookie. + ```go import ( "fmt" @@ -29,3 +30,9 @@ func main() { router.Run() } ``` + +Delete cookie by set max age to -1. + +```go +c.SetCookie("gin_cookie", "test", -1, "/", "localhost", false, true) +``` diff --git a/src/content/docs/en/docs/examples/custom-http-config.md b/src/content/docs/en/docs/examples/custom-http-config.md index 42de783145..748cf840f2 100644 --- a/src/content/docs/en/docs/examples/custom-http-config.md +++ b/src/content/docs/en/docs/examples/custom-http-config.md @@ -1,6 +1,5 @@ --- title: "Custom HTTP configuration" - --- Use `http.ListenAndServe()` directly, like this: diff --git a/src/content/docs/en/docs/examples/custom-log-format.md b/src/content/docs/en/docs/examples/custom-log-format.md index 6d64503414..fbe543ca4f 100644 --- a/src/content/docs/en/docs/examples/custom-log-format.md +++ b/src/content/docs/en/docs/examples/custom-log-format.md @@ -1,6 +1,5 @@ --- title: "Custom log file" - --- For example: diff --git a/src/content/docs/en/docs/examples/custom-middleware.md b/src/content/docs/en/docs/examples/custom-middleware.md index 8de8438b07..86b6cfadbc 100644 --- a/src/content/docs/en/docs/examples/custom-middleware.md +++ b/src/content/docs/en/docs/examples/custom-middleware.md @@ -1,6 +1,5 @@ --- title: "Custom Middleware" - --- ```go @@ -27,9 +26,9 @@ func Logger() gin.HandlerFunc { func main() { r := gin.New() - r.Use(Logger()) + router.Use(Logger()) - r.GET("/test", func(c *gin.Context) { + router.GET("/test", func(c *gin.Context) { example := c.MustGet("example").(string) // it would print: "12345" @@ -37,7 +36,7 @@ func main() { }) // Listen and serve on 0.0.0.0:8080 - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/en/docs/examples/custom-validators.md b/src/content/docs/en/docs/examples/custom-validators.md index 114de29af1..ac322e6ee7 100644 --- a/src/content/docs/en/docs/examples/custom-validators.md +++ b/src/content/docs/en/docs/examples/custom-validators.md @@ -1,6 +1,5 @@ --- title: "Custom validators" - --- It is also possible to register custom validators. See the [example code](https://github.com/gin-gonic/examples/tree/master/struct-lvl-validations). diff --git a/src/content/docs/en/docs/examples/define-format-for-the-log-of-routes.md b/src/content/docs/en/docs/examples/define-format-for-the-log-of-routes.md index 44bd991a9d..3df58b9ea8 100644 --- a/src/content/docs/en/docs/examples/define-format-for-the-log-of-routes.md +++ b/src/content/docs/en/docs/examples/define-format-for-the-log-of-routes.md @@ -1,6 +1,5 @@ --- title: "Define format for the log of routes" - --- The default log of routes is: @@ -21,24 +20,24 @@ import ( ) func main() { - r := gin.Default() + router := gin.Default() gin.DebugPrintRouteFunc = func(httpMethod, absolutePath, handlerName string, nuHandlers int) { log.Printf("endpoint %v %v %v %v\n", httpMethod, absolutePath, handlerName, nuHandlers) } - r.POST("/foo", func(c *gin.Context) { + router.POST("/foo", func(c *gin.Context) { c.JSON(http.StatusOK, "foo") }) - r.GET("/bar", func(c *gin.Context) { + router.GET("/bar", func(c *gin.Context) { c.JSON(http.StatusOK, "bar") }) - r.GET("/status", func(c *gin.Context) { + router.GET("/status", func(c *gin.Context) { c.JSON(http.StatusOK, "ok") }) // Listen and Server in http://0.0.0.0:8080 - r.Run() + router.Run() } ``` diff --git a/src/content/docs/en/docs/examples/goroutines-inside-a-middleware.md b/src/content/docs/en/docs/examples/goroutines-inside-a-middleware.md index f3a6b10d6e..d06d064a78 100644 --- a/src/content/docs/en/docs/examples/goroutines-inside-a-middleware.md +++ b/src/content/docs/en/docs/examples/goroutines-inside-a-middleware.md @@ -1,15 +1,14 @@ --- title: "Goroutines inside a middleware" - --- When starting new Goroutines inside a middleware or handler, you **SHOULD NOT** use the original context inside it, you have to use a read-only copy. ```go func main() { - r := gin.Default() + router := gin.Default() - r.GET("/long_async", func(c *gin.Context) { + router.GET("/long_async", func(c *gin.Context) { // create copy to be used inside the goroutine cCp := c.Copy() go func() { @@ -21,7 +20,7 @@ func main() { }() }) - r.GET("/long_sync", func(c *gin.Context) { + router.GET("/long_sync", func(c *gin.Context) { // simulate a long task with time.Sleep(). 5 seconds time.Sleep(5 * time.Second) @@ -30,6 +29,6 @@ func main() { }) // Listen and serve on 0.0.0.0:8080 - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/en/docs/examples/graceful-restart-or-stop.md b/src/content/docs/en/docs/examples/graceful-restart-or-stop.md index 26e6a67bc5..4166a1a583 100644 --- a/src/content/docs/en/docs/examples/graceful-restart-or-stop.md +++ b/src/content/docs/en/docs/examples/graceful-restart-or-stop.md @@ -1,6 +1,5 @@ --- title: "Graceful restart or stop" - --- Do you want to graceful restart or stop your web server? @@ -21,9 +20,10 @@ An alternative to endless: * [graceful](https://github.com/tylerb/graceful): Graceful is a Go package enabling graceful shutdown of an http.Handler server. * [grace](https://github.com/facebookgo/grace): Graceful restart & zero downtime deploy for Go servers. -If you are using Go 1.8, you may not need to use this library! Consider using http.Server's built-in [Shutdown()](https://golang.org/pkg/net/http/#Server.Shutdown) method for graceful shutdowns. See the full [graceful-shutdown](https://github.com/gin-gonic/examples/tree/master/graceful-shutdown) example with gin. +If you are using Go 1.8 and later, you may not need to use this library! Consider using `http.Server`'s built-in [Shutdown()](https://golang.org/pkg/net/http/#Server.Shutdown) method for graceful shutdowns. See the full [graceful-shutdown](https://github.com/gin-gonic/examples/tree/master/graceful-shutdown) example with gin. ```go +//go:build go1.8 // +build go1.8 package main @@ -62,9 +62,9 @@ func main() { // Wait for interrupt signal to gracefully shutdown the server with // a timeout of 5 seconds. quit := make(chan os.Signal, 1) - // kill (no param) default send syscall.SIGTERM + // kill (no params) by default sends syscall.SIGTERM // kill -2 is syscall.SIGINT - // kill -9 is syscall. SIGKILL but can"t be catch, so don't need add it + // kill -9 is syscall.SIGKILL but can't be caught, so don't need add it signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM) <-quit log.Println("Shutdown Server ...") @@ -72,13 +72,11 @@ func main() { ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() if err := srv.Shutdown(ctx); err != nil { - log.Fatal("Server Shutdown:", err) + log.Println("Server Shutdown:", err) } // catching ctx.Done(). timeout of 5 seconds. - select { - case <-ctx.Done(): - log.Println("timeout of 5 seconds.") - } + <-ctx.Done() + log.Println("timeout of 5 seconds.") log.Println("Server exiting") } ``` diff --git a/src/content/docs/en/docs/examples/grouping-routes.md b/src/content/docs/en/docs/examples/grouping-routes.md index c7f7a72459..416e5597d2 100644 --- a/src/content/docs/en/docs/examples/grouping-routes.md +++ b/src/content/docs/en/docs/examples/grouping-routes.md @@ -1,6 +1,5 @@ --- title: "Grouping routes" - --- ```go @@ -8,16 +7,16 @@ func main() { router := gin.Default() // Simple group: v1 - v1 := router.Group("/v1") { + v1 := router.Group("/v1") v1.POST("/login", loginEndpoint) v1.POST("/submit", submitEndpoint) v1.POST("/read", readEndpoint) } // Simple group: v2 - v2 := router.Group("/v2") { + v2 := router.Group("/v2") v2.POST("/login", loginEndpoint) v2.POST("/submit", submitEndpoint) v2.POST("/read", readEndpoint) diff --git a/src/content/docs/en/docs/examples/html-rendering.md b/src/content/docs/en/docs/examples/html-rendering.md index 7872487959..2fef3d5a5d 100644 --- a/src/content/docs/en/docs/examples/html-rendering.md +++ b/src/content/docs/en/docs/examples/html-rendering.md @@ -1,9 +1,11 @@ --- title: "HTML rendering" - --- -Using LoadHTMLGlob() or LoadHTMLFiles() +Gin uses the [html/template](https://pkg.go.dev/html/template) package for HTML rendering. +For more information about how to use them, including available placeholders, see the documentation for [text/template](https://pkg.go.dev/text/template) + +Use LoadHTMLGlob() or LoadHTMLFiles() to select the HTML files to load. ```go func main() { @@ -49,6 +51,8 @@ func main() { } ``` +**Note:** Please wrap your HTML template in the `{{define }} {{end}}` block and define your template file with the relative path ``. Otherwise, GIN will not properly parse the template files. + templates/posts/index.tmpl ```html @@ -93,9 +97,9 @@ func main() { You may use custom delims ```go - r := gin.Default() - r.Delims("{[{", "}]}") - r.LoadHTMLGlob("/path/to/templates") + router := gin.Default() + router.Delims("{[{", "}]}") + router.LoadHTMLGlob("/path/to/templates") ``` ### Custom Template Funcs diff --git a/src/content/docs/en/docs/examples/http-method.md b/src/content/docs/en/docs/examples/http-method.md index b8d41d6968..a0c8d09c62 100644 --- a/src/content/docs/en/docs/examples/http-method.md +++ b/src/content/docs/en/docs/examples/http-method.md @@ -1,6 +1,5 @@ --- title: "Using HTTP method" - --- ```go diff --git a/src/content/docs/en/docs/examples/http2-server-push.md b/src/content/docs/en/docs/examples/http2-server-push.md index 79dc31a7d3..8dd981116e 100644 --- a/src/content/docs/en/docs/examples/http2-server-push.md +++ b/src/content/docs/en/docs/examples/http2-server-push.md @@ -1,6 +1,5 @@ --- title: "HTTP2 server push" - --- http.Pusher is supported only **go1.8+**. See the [golang blog](https://blog.golang.org/h2push) for detail information. @@ -28,11 +27,11 @@ var html = template.Must(template.New("https").Parse(` `)) func main() { - r := gin.Default() - r.Static("/assets", "./assets") - r.SetHTMLTemplate(html) + router := gin.Default() + router.Static("/assets", "./assets") + router.SetHTMLTemplate(html) - r.GET("/", func(c *gin.Context) { + router.GET("/", func(c *gin.Context) { if pusher := c.Writer.Pusher(); pusher != nil { // use pusher.Push() to do server push if err := pusher.Push("/assets/app.js", nil); err != nil { @@ -45,7 +44,7 @@ func main() { }) // Listen and Serve in https://127.0.0.1:8080 - r.RunTLS(":8080", "./testdata/server.pem", "./testdata/server.key") + router.RunTLS(":8080", "./testdata/server.pem", "./testdata/server.key") } ``` diff --git a/src/content/docs/en/docs/examples/index.md b/src/content/docs/en/docs/examples/index.md index 8ad0c08282..e34f8f7467 100644 --- a/src/content/docs/en/docs/examples/index.md +++ b/src/content/docs/en/docs/examples/index.md @@ -1,6 +1,5 @@ --- title: "Examples" - sidebar: order: 6 --- diff --git a/src/content/docs/en/docs/examples/jsonp.md b/src/content/docs/en/docs/examples/jsonp.md index bc4439a44f..3fd42f7859 100644 --- a/src/content/docs/en/docs/examples/jsonp.md +++ b/src/content/docs/en/docs/examples/jsonp.md @@ -1,25 +1,25 @@ --- title: "JSONP" - --- Using JSONP to request data from a server in a different domain. Add callback to response body if the query parameter callback exists. ```go func main() { - r := gin.Default() + router := gin.Default() - r.GET("/JSONP?callback=x", func(c *gin.Context) { + router.GET("/JSONP?callback=x", func(c *gin.Context) { data := map[string]interface{}{ "foo": "bar", } - - //callback is x + + // GET /JSONP?callback=x + // callback is x // Will output : x({\"foo\":\"bar\"}) c.JSONP(http.StatusOK, data) }) // Listen and serve on 0.0.0.0:8080 - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/en/docs/examples/map-as-querystring-or-postform.md b/src/content/docs/en/docs/examples/map-as-querystring-or-postform.md index 5ed88b0b5c..6f2267cc28 100644 --- a/src/content/docs/en/docs/examples/map-as-querystring-or-postform.md +++ b/src/content/docs/en/docs/examples/map-as-querystring-or-postform.md @@ -1,6 +1,5 @@ --- title: "Map as querystring or postform parameters" - --- ```sh @@ -10,6 +9,12 @@ Content-Type: application/x-www-form-urlencoded names[first]=thinkerou&names[second]=tianou ``` +```bash +curl 'http://localhost:8080/post?ids\[a\]=1234&ids\[b\]=hello' \ +--data-raw 'names[first]=pure&names[seconds]=maslak' \ +--compressed +``` + ```go func main() { router := gin.Default() diff --git a/src/content/docs/en/docs/examples/multipart-urlencoded-binding.md b/src/content/docs/en/docs/examples/multipart-urlencoded-binding.md index 73fee286a1..e2e8073f1c 100644 --- a/src/content/docs/en/docs/examples/multipart-urlencoded-binding.md +++ b/src/content/docs/en/docs/examples/multipart-urlencoded-binding.md @@ -1,6 +1,5 @@ --- title: "Multipart/Urlencoded binding" - --- ```go diff --git a/src/content/docs/en/docs/examples/multipart-urlencoded-form.md b/src/content/docs/en/docs/examples/multipart-urlencoded-form.md index 04eab23737..21502a7b30 100644 --- a/src/content/docs/en/docs/examples/multipart-urlencoded-form.md +++ b/src/content/docs/en/docs/examples/multipart-urlencoded-form.md @@ -1,6 +1,5 @@ --- title: "Multipart/Urlencoded form" - --- ```go diff --git a/src/content/docs/en/docs/examples/multiple-template.md b/src/content/docs/en/docs/examples/multiple-template.md index 28b58c213b..9584899ac5 100644 --- a/src/content/docs/en/docs/examples/multiple-template.md +++ b/src/content/docs/en/docs/examples/multiple-template.md @@ -1,6 +1,5 @@ --- title: "Multitemplate" - --- Gin allow by default use only one html.Template. Check [a multitemplate render](https://github.com/gin-contrib/multitemplate) for using features like go 1.6 `block template`. diff --git a/src/content/docs/en/docs/examples/only-bind-query-string.md b/src/content/docs/en/docs/examples/only-bind-query-string.md index bdd6c174e7..18fd177106 100644 --- a/src/content/docs/en/docs/examples/only-bind-query-string.md +++ b/src/content/docs/en/docs/examples/only-bind-query-string.md @@ -1,6 +1,5 @@ --- title: "Only bind query string" - --- `ShouldBindQuery` function only binds the query params and not the post data. See the [detail information](https://github.com/gin-gonic/gin/issues/742#issuecomment-315953017). diff --git a/src/content/docs/en/docs/examples/param-in-path.md b/src/content/docs/en/docs/examples/param-in-path.md index b0a4a3b680..8ca7067ab7 100644 --- a/src/content/docs/en/docs/examples/param-in-path.md +++ b/src/content/docs/en/docs/examples/param-in-path.md @@ -1,6 +1,5 @@ --- title: "Parameters in path" - --- ```go diff --git a/src/content/docs/en/docs/examples/pure-json.md b/src/content/docs/en/docs/examples/pure-json.md index 5fbf8bfc1f..c5ac565e6a 100644 --- a/src/content/docs/en/docs/examples/pure-json.md +++ b/src/content/docs/en/docs/examples/pure-json.md @@ -1,6 +1,5 @@ --- title: "PureJSON" - --- Normally, JSON replaces special HTML characters with their unicode entities, e.g. `<` becomes `\u003c`. If you want to encode such characters literally, you can use PureJSON instead. @@ -8,23 +7,23 @@ This feature is unavailable in Go 1.6 and lower. ```go func main() { - r := gin.Default() + router := gin.Default() // Serves unicode entities - r.GET("/json", func(c *gin.Context) { + router.GET("/json", func(c *gin.Context) { c.JSON(200, gin.H{ "html": "Hello, world!", }) }) // Serves literal characters - r.GET("/purejson", func(c *gin.Context) { + router.GET("/purejson", func(c *gin.Context) { c.PureJSON(200, gin.H{ "html": "Hello, world!", }) }) // listen and serve on 0.0.0.0:8080 - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/en/docs/examples/query-and-post-form.md b/src/content/docs/en/docs/examples/query-and-post-form.md index 5c8e6d21e7..f02af5daa9 100644 --- a/src/content/docs/en/docs/examples/query-and-post-form.md +++ b/src/content/docs/en/docs/examples/query-and-post-form.md @@ -1,6 +1,5 @@ --- title: "Query and post form" - --- ```sh diff --git a/src/content/docs/en/docs/examples/querystring-param.md b/src/content/docs/en/docs/examples/querystring-param.md index cba891746e..afef1b61e8 100644 --- a/src/content/docs/en/docs/examples/querystring-param.md +++ b/src/content/docs/en/docs/examples/querystring-param.md @@ -1,6 +1,5 @@ --- title: "Query string parameters" - --- ```go diff --git a/src/content/docs/en/docs/examples/redirects.md b/src/content/docs/en/docs/examples/redirects.md index e62a9952ea..a682207aed 100644 --- a/src/content/docs/en/docs/examples/redirects.md +++ b/src/content/docs/en/docs/examples/redirects.md @@ -1,12 +1,11 @@ --- title: "Redirects" - --- Issuing a HTTP redirect is easy. Both internal and external locations are supported. ```go -r.GET("/test", func(c *gin.Context) { +router.GET("/test", func(c *gin.Context) { c.Redirect(http.StatusMovedPermanently, "http://www.google.com/") }) ``` @@ -14,7 +13,7 @@ r.GET("/test", func(c *gin.Context) { Issuing a HTTP redirect from POST. Refer to issue: [#444](https://github.com/gin-gonic/gin/issues/444) ```go -r.POST("/test", func(c *gin.Context) { +router.POST("/test", func(c *gin.Context) { c.Redirect(http.StatusFound, "/foo") }) ``` @@ -22,11 +21,11 @@ r.POST("/test", func(c *gin.Context) { Issuing a Router redirect, use `HandleContext` like below. ``` go -r.GET("/test", func(c *gin.Context) { +router.GET("/test", func(c *gin.Context) { c.Request.URL.Path = "/test2" - r.HandleContext(c) + router.HandleContext(c) }) -r.GET("/test2", func(c *gin.Context) { +router.GET("/test2", func(c *gin.Context) { c.JSON(200, gin.H{"hello": "world"}) }) ``` diff --git a/src/content/docs/en/docs/examples/rendering.md b/src/content/docs/en/docs/examples/rendering.md index c9c705c656..c8ec88e99d 100644 --- a/src/content/docs/en/docs/examples/rendering.md +++ b/src/content/docs/en/docs/examples/rendering.md @@ -1,18 +1,17 @@ --- title: "XML/JSON/YAML/ProtoBuf rendering" - --- ```go func main() { - r := gin.Default() + router := gin.Default() // gin.H is a shortcut for map[string]interface{} - r.GET("/someJSON", func(c *gin.Context) { + router.GET("/someJSON", func(c *gin.Context) { c.JSON(http.StatusOK, gin.H{"message": "hey", "status": http.StatusOK}) }) - r.GET("/moreJSON", func(c *gin.Context) { + router.GET("/moreJSON", func(c *gin.Context) { // You also can use a struct var msg struct { Name string `json:"user"` @@ -27,15 +26,15 @@ func main() { c.JSON(http.StatusOK, msg) }) - r.GET("/someXML", func(c *gin.Context) { + router.GET("/someXML", func(c *gin.Context) { c.XML(http.StatusOK, gin.H{"message": "hey", "status": http.StatusOK}) }) - r.GET("/someYAML", func(c *gin.Context) { + router.GET("/someYAML", func(c *gin.Context) { c.YAML(http.StatusOK, gin.H{"message": "hey", "status": http.StatusOK}) }) - r.GET("/someProtoBuf", func(c *gin.Context) { + router.GET("/someProtoBuf", func(c *gin.Context) { reps := []int64{int64(1), int64(2)} label := "test" // The specific definition of protobuf is written in the testdata/protoexample file. @@ -49,6 +48,6 @@ func main() { }) // Listen and serve on 0.0.0.0:8080 - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/en/docs/examples/run-multiple-service.md b/src/content/docs/en/docs/examples/run-multiple-service.md index 0dba2ab954..9ad1e6baf3 100644 --- a/src/content/docs/en/docs/examples/run-multiple-service.md +++ b/src/content/docs/en/docs/examples/run-multiple-service.md @@ -1,6 +1,5 @@ --- title: "Run multiple service" - --- See the [question](https://github.com/gin-gonic/gin/issues/346) and try the following example: diff --git a/src/content/docs/en/docs/examples/secure-json.md b/src/content/docs/en/docs/examples/secure-json.md index 82e63a4c44..4a2653eeed 100644 --- a/src/content/docs/en/docs/examples/secure-json.md +++ b/src/content/docs/en/docs/examples/secure-json.md @@ -1,18 +1,17 @@ --- title: "SecureJSON" - --- Using SecureJSON to prevent json hijacking. Default prepends `"while(1),"` to response body if the given struct is array values. ```go func main() { - r := gin.Default() + router := gin.Default() // You can also use your own secure json prefix - // r.SecureJsonPrefix(")]}',\n") + // router.SecureJsonPrefix(")]}',\n") - r.GET("/someJSON", func(c *gin.Context) { + router.GET("/someJSON", func(c *gin.Context) { names := []string{"lena", "austin", "foo"} // Will output : while(1);["lena","austin","foo"] @@ -20,6 +19,6 @@ func main() { }) // Listen and serve on 0.0.0.0:8080 - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/en/docs/examples/security-headers.md b/src/content/docs/en/docs/examples/security-headers.md index 9fa5378945..462712d7ff 100644 --- a/src/content/docs/en/docs/examples/security-headers.md +++ b/src/content/docs/en/docs/examples/security-headers.md @@ -1,6 +1,5 @@ --- title: "Security Headers" - --- It's important to use security headers to protect your web application from common security vulnerabilities. This example shows you how to add security headers to your Gin application and also how to avoid Host Header Injection related attacks (SSRF, Open Redirection). diff --git a/src/content/docs/en/docs/examples/serving-data-from-reader.md b/src/content/docs/en/docs/examples/serving-data-from-reader.md index 614db12ce2..1b871d5251 100644 --- a/src/content/docs/en/docs/examples/serving-data-from-reader.md +++ b/src/content/docs/en/docs/examples/serving-data-from-reader.md @@ -1,6 +1,5 @@ --- title: "Serving data from reader" - --- ```go diff --git a/src/content/docs/en/docs/examples/serving-static-files.md b/src/content/docs/en/docs/examples/serving-static-files.md index bda67da070..3f96749752 100644 --- a/src/content/docs/en/docs/examples/serving-static-files.md +++ b/src/content/docs/en/docs/examples/serving-static-files.md @@ -1,6 +1,5 @@ --- title: "Serving static files" - --- ```go diff --git a/src/content/docs/en/docs/examples/support-lets-encrypt.md b/src/content/docs/en/docs/examples/support-lets-encrypt.md index 841c1a7f99..50e6b21c3d 100644 --- a/src/content/docs/en/docs/examples/support-lets-encrypt.md +++ b/src/content/docs/en/docs/examples/support-lets-encrypt.md @@ -1,6 +1,5 @@ --- title: "Support Let's Encrypt" - --- example for 1-line LetsEncrypt HTTPS servers. @@ -16,10 +15,10 @@ import ( ) func main() { - r := gin.Default() + router := gin.Default() // Ping handler - r.GET("/ping", func(c *gin.Context) { + router.GET("/ping", func(c *gin.Context) { c.String(200, "pong") }) @@ -41,10 +40,10 @@ import ( ) func main() { - r := gin.Default() + router := gin.Default() // Ping handler - r.GET("/ping", func(c *gin.Context) { + router.GET("/ping", func(c *gin.Context) { c.String(200, "pong") }) diff --git a/src/content/docs/en/docs/examples/upload-file/index.md b/src/content/docs/en/docs/examples/upload-file/index.md index d0ff99e858..8399cc637b 100644 --- a/src/content/docs/en/docs/examples/upload-file/index.md +++ b/src/content/docs/en/docs/examples/upload-file/index.md @@ -1,6 +1,5 @@ --- title: "Upload files" - --- The section lists upload file api usage. diff --git a/src/content/docs/en/docs/examples/upload-file/multiple-file.md b/src/content/docs/en/docs/examples/upload-file/multiple-file.md index 185b7b5f66..6cf00cbd51 100644 --- a/src/content/docs/en/docs/examples/upload-file/multiple-file.md +++ b/src/content/docs/en/docs/examples/upload-file/multiple-file.md @@ -1,6 +1,5 @@ --- title: "Multiple files" - --- See the detail [example code](https://github.com/gin-gonic/examples/tree/master/upload-file/multiple). @@ -13,13 +12,13 @@ func main() { router.POST("/upload", func(c *gin.Context) { // Multipart form form, _ := c.MultipartForm() - files := form.File["upload[]"] + files := form.File["files"] for _, file := range files { log.Println(file.Filename) // Upload the file to specific dst. - c.SaveUploadedFile(file, dst) + c.SaveUploadedFile(file, "./files/" + file.Filename) } c.String(http.StatusOK, fmt.Sprintf("%d files uploaded!", len(files))) }) @@ -31,7 +30,7 @@ How to `curl`: ```sh curl -X POST http://localhost:8080/upload \ - -F "upload[]=@/Users/appleboy/test1.zip" \ - -F "upload[]=@/Users/appleboy/test2.zip" \ + -F "files=@/Users/appleboy/test1.zip" \ + -F "files=@/Users/appleboy/test2.zip" \ -H "Content-Type: multipart/form-data" ``` diff --git a/src/content/docs/en/docs/examples/upload-file/single-file.md b/src/content/docs/en/docs/examples/upload-file/single-file.md index 5fe274dc7c..f9db82e0d8 100644 --- a/src/content/docs/en/docs/examples/upload-file/single-file.md +++ b/src/content/docs/en/docs/examples/upload-file/single-file.md @@ -1,6 +1,5 @@ --- title: "Single file" - --- References issue [#774](https://github.com/gin-gonic/gin/issues/774) and detail [example code](https://github.com/gin-gonic/examples/tree/master/upload-file/single). @@ -20,7 +19,7 @@ func main() { log.Println(file.Filename) // Upload the file to specific dst. - c.SaveUploadedFile(file, dst) + c.SaveUploadedFile(file, "./files/" + file.Filename) c.String(http.StatusOK, fmt.Sprintf("'%s' uploaded!", file.Filename)) }) diff --git a/src/content/docs/en/docs/examples/using-basicauth-middleware.md b/src/content/docs/en/docs/examples/using-basicauth-middleware.md index cc68db4a0d..a1f1a03ebc 100644 --- a/src/content/docs/en/docs/examples/using-basicauth-middleware.md +++ b/src/content/docs/en/docs/examples/using-basicauth-middleware.md @@ -1,6 +1,5 @@ --- title: "Using BasicAuth middleware" - --- ```go @@ -12,11 +11,11 @@ var secrets = gin.H{ } func main() { - r := gin.Default() + router := gin.Default() // Group using gin.BasicAuth() middleware // gin.Accounts is a shortcut for map[string]string - authorized := r.Group("/admin", gin.BasicAuth(gin.Accounts{ + authorized := router.Group("/admin", gin.BasicAuth(gin.Accounts{ "foo": "bar", "austin": "1234", "lena": "hello2", @@ -36,6 +35,6 @@ func main() { }) // Listen and serve on 0.0.0.0:8080 - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/en/docs/examples/using-middleware.md b/src/content/docs/en/docs/examples/using-middleware.md index 5fc4154dbf..7c44cd3eba 100644 --- a/src/content/docs/en/docs/examples/using-middleware.md +++ b/src/content/docs/en/docs/examples/using-middleware.md @@ -1,6 +1,5 @@ --- title: "Using middleware" - --- ```go @@ -11,18 +10,18 @@ func main() { // Global middleware // Logger middleware will write the logs to gin.DefaultWriter even if you set with GIN_MODE=release. // By default gin.DefaultWriter = os.Stdout - r.Use(gin.Logger()) + router.Use(gin.Logger()) // Recovery middleware recovers from any panics and writes a 500 if there was one. - r.Use(gin.Recovery()) + router.Use(gin.Recovery()) // Per route middleware, you can add as many as you desire. - r.GET("/benchmark", MyBenchLogger(), benchEndpoint) + router.GET("/benchmark", MyBenchLogger(), benchEndpoint) // Authorization group - // authorized := r.Group("/", AuthRequired()) + // authorized := router.Group("/", AuthRequired()) // exactly the same as: - authorized := r.Group("/") + authorized := router.Group("/") // per group middleware! in this case we use the custom created // AuthRequired() middleware just in the "authorized" group. authorized.Use(AuthRequired()) @@ -37,7 +36,7 @@ func main() { } // Listen and serve on 0.0.0.0:8080 - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/en/docs/examples/without-middleware.md b/src/content/docs/en/docs/examples/without-middleware.md index 6ef54bda06..5ae5558125 100644 --- a/src/content/docs/en/docs/examples/without-middleware.md +++ b/src/content/docs/en/docs/examples/without-middleware.md @@ -1,6 +1,5 @@ --- title: "Without middleware by default" - --- Use diff --git a/src/content/docs/en/docs/examples/write-log.md b/src/content/docs/en/docs/examples/write-log.md index 759423de4b..a26be48277 100644 --- a/src/content/docs/en/docs/examples/write-log.md +++ b/src/content/docs/en/docs/examples/write-log.md @@ -1,6 +1,5 @@ --- title: "How to write log file" - --- ```go diff --git a/src/content/docs/en/docs/faq/index.md b/src/content/docs/en/docs/faq/index.md index ad348f11fe..b0f8930821 100644 --- a/src/content/docs/en/docs/faq/index.md +++ b/src/content/docs/en/docs/faq/index.md @@ -1,9 +1,7 @@ --- title: "FAQ" - sidebar: order: 9 --- TODO: record some frequently asked question from GitHub Issue tab. - diff --git a/src/content/docs/en/docs/features/index.md b/src/content/docs/en/docs/features/index.md index 862f6a687c..88ff14e565 100644 --- a/src/content/docs/en/docs/features/index.md +++ b/src/content/docs/en/docs/features/index.md @@ -1,18 +1,13 @@ --- title: "Features" - sidebar: order: 4 --- -## Gin v1 stable features: +## Gin v1 stable features - Zero allocation router. - - Still the fastest http router and framework. From routing to writing. - - Complete suite of unit tests. - - Battle tested. - - API frozen, new releases will not break your code. diff --git a/src/content/docs/en/docs/index.md b/src/content/docs/en/docs/index.md index ebd9854a12..0dc75e4460 100644 --- a/src/content/docs/en/docs/index.md +++ b/src/content/docs/en/docs/index.md @@ -1,8 +1,7 @@ --- title: "Documentation" -linkTitle: "Documentation" sidebar: - order: 1 + order: 20 --- ## What is Gin? @@ -15,8 +14,7 @@ We provide API usage [examples](https://github.com/gin-gonic/examples) and list ## How to contribute to Gin? -* Help people on the discussion forums -* Tell us your success stories using Gin -* Tell us how we can improve Gin and help us do it -* Contribute to an existing library - +- Help people on the discussion forums +- Tell us your success stories using Gin +- Tell us how we can improve Gin and help us do it +- Contribute to an existing library diff --git a/src/content/docs/en/docs/introduction/index.md b/src/content/docs/en/docs/introduction/index.md index cc36bab4b9..88ace05387 100644 --- a/src/content/docs/en/docs/introduction/index.md +++ b/src/content/docs/en/docs/introduction/index.md @@ -1,6 +1,5 @@ --- title: "Introduction" - sidebar: order: 1 --- @@ -15,18 +14,18 @@ Or, if you are ready to use Gin in to your project, visit the [Quickstart](https ### Fast -Radix tree based routing, small memory foot print. No reflection. Predictable API performance. +Radix tree based routing, small memory foot print. No reflection. Predictable API performance. ### Middleware support -An incoming HTTP request can be handled by a chain of middlewares and the final action. +An incoming HTTP request can be handled by a chain of middlewares and the final action. For example: Logger, Authorization, GZIP and finally post a message in the DB. ### Crash-free Gin can catch a panic occurred during a HTTP request and recover it. This way, your server will be always available. As an example - it’s also possible to report this panic to Sentry! -### JSON validation +### JSON validation Gin can parse and validate the JSON of a request - for example, checking the existence of required values. @@ -45,4 +44,3 @@ Gin provides an easy to use API for JSON, XML and HTML rendering. ### Extendable Creating a new middleware is so easy, just check out the sample codes. - diff --git a/src/content/docs/en/docs/jsoniter/index.md b/src/content/docs/en/docs/jsoniter/index.md index e06c641be7..d9739a921e 100644 --- a/src/content/docs/en/docs/jsoniter/index.md +++ b/src/content/docs/en/docs/jsoniter/index.md @@ -1,6 +1,5 @@ --- title: "Jsoniter" - sidebar: order: 5 --- @@ -10,5 +9,5 @@ sidebar: Gin uses `encoding/json` as default json package but you can change to [jsoniter](https://github.com/json-iterator/go) by build from other tags. ```sh -$ go build -tags=jsoniter . -``` +go build -tags=jsoniter . +``` diff --git a/src/content/docs/en/docs/quickstart/index.md b/src/content/docs/en/docs/quickstart/index.md index 7145791579..21a7a22d4e 100644 --- a/src/content/docs/en/docs/quickstart/index.md +++ b/src/content/docs/en/docs/quickstart/index.md @@ -1,6 +1,5 @@ --- title: "Quickstart" - sidebar: order: 2 --- @@ -14,15 +13,18 @@ In this quickstart, we’ll glean insights from code segments and learn how to: ## Installation To install Gin package, you need to install Go and set your Go workspace first. +If you don't have a go.mod file, create it with `go mod init gin`. 1. Download and install it: ```sh -$ go get -u github.com/gin-gonic/gin +go get -u github.com/gin-gonic/gin ``` + Or install: + ```sh -$ go install github.com/gin-gonic/gin@latest +go install github.com/gin-gonic/gin@latest ``` 2. Import it in your code: @@ -37,22 +39,22 @@ import "github.com/gin-gonic/gin" import "net/http" ``` -1. Create your project folder and `cd` inside +4. Create your project folder and `cd` inside ```sh -$ mkdir -p $GOPATH/src/github.com/myusername/project && cd "$_" +mkdir -p project && cd "$_" ``` -2. Copy a starting template inside your project +5. Copy a starting template inside your project ```sh -$ curl https://raw.githubusercontent.com/gin-gonic/examples/master/basic/main.go > main.go +curl https://raw.githubusercontent.com/gin-gonic/examples/master/basic/main.go > main.go ``` -3. Run your project +6. Run your project ```sh -$ go run main.go +go run main.go ``` ## Getting Started @@ -74,13 +76,13 @@ package main import "github.com/gin-gonic/gin" func main() { - r := gin.Default() - r.GET("/ping", func(c *gin.Context) { - c.JSON(200, gin.H{ - "message": "pong", - }) - }) - r.Run() // listen and serve on 0.0.0.0:8080 + router := gin.Default() + router.GET("/ping", func(c *gin.Context) { + c.JSON(200, gin.H{ + "message": "pong", + }) + }) + router.Run() // listen and serve on 0.0.0.0:8080 } ``` @@ -90,3 +92,28 @@ And, You can run the code via `go run example.go`: # run example.go and visit 0.0.0.0:8080/ping on browser $ go run example.go ``` + +If you prefer to use the `net/http` package, follow the code snippet below + +```go +package main + +import ( + "github.com/gin-gonic/gin" + "net/http" +) + +func main() { + router := gin.Default() + + router.GET("/ping", func(c *gin.Context) { + c.JSON(http.StatusOK, gin.H{ + "message": "pong", + }) + }) + + router.Run() // listen and serve on 0.0.0.0:8080 +} +``` + +Additional information is available from the [Gin source code repository](https://github.com/gin-gonic/gin/blob/master/docs/doc.md). diff --git a/src/content/docs/en/docs/testing/index.md b/src/content/docs/en/docs/testing/index.md index afd8c7f3ed..b772e3a207 100644 --- a/src/content/docs/en/docs/testing/index.md +++ b/src/content/docs/en/docs/testing/index.md @@ -1,6 +1,5 @@ --- title: "Testing" - sidebar: order: 7 --- @@ -15,31 +14,31 @@ package main import "github.com/gin-gonic/gin" type User struct { - Username string `json:"username"` - Gender string `json:"gender"` + Username string `json:"username"` + Gender string `json:"gender"` } func setupRouter() *gin.Engine { - r := gin.Default() - r.GET("/ping", func(c *gin.Context) { - c.String(200, "pong") - }) - return r + router := gin.Default() + router.GET("/ping", func(c *gin.Context) { + c.String(200, "pong") + }) + return router } -func postUser(r *gin.Engine) *gin.Engine { - r.POST("/user/add", func(c *gin.Context) { - var user User - c.BindJSON(&user) - c.JSON(200, user) - }) - return r +func postUser(router *gin.Engine) *gin.Engine { + router.POST("/user/add", func(c *gin.Context) { + var user User + c.BindJSON(&user) + c.JSON(200, user) + }) + return router } func main() { - r := setupRouter() - r = postUser(r) - r.Run(":8080") + router := setupRouter() + router = postUser(r) + router.Run(":8080") } ``` @@ -49,42 +48,44 @@ Test for code example above: package main import ( - "net/http" - "net/http/httptest" - "testing" + "net/http" + "net/http/httptest" + "encoding/json" + "testing" + "strings" - "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/assert" ) func TestPingRoute(t *testing.T) { - router := setupRouter() + router := setupRouter() - w := httptest.NewRecorder() - req, _ := http.NewRequest("GET", "/ping", nil) - router.ServeHTTP(w, req) + w := httptest.NewRecorder() + req, _ := http.NewRequest("GET", "/ping", nil) + router.ServeHTTP(w, req) - assert.Equal(t, 200, w.Code) - assert.Equal(t, "pong", w.Body.String()) + assert.Equal(t, 200, w.Code) + assert.Equal(t, "pong", w.Body.String()) } // Test for POST /user/add func TestPostUser(t *testing.T) { - router := setupRouter() - router = postUser(router) - - w := httptest.NewRecorder() - - // Create an example user for testing - exampleUser := User{ - Username: "test_name", - Gender: "male", - } - userJson, _ := json.Marshal(exampleUser) - req, _ := http.NewRequest("POST", "/user/add", strings.NewReader(string(userJson))) - router.ServeHTTP(w, req) - - assert.Equal(t, 200, w.Code) - // Compare the response body with the json data of exampleUser - assert.Equal(t, string(userJson), w.Body.String()) + router := setupRouter() + router = postUser(router) + + w := httptest.NewRecorder() + + // Create an example user for testing + exampleUser := User{ + Username: "test_name", + Gender: "male", + } + userJson, _ := json.Marshal(exampleUser) + req, _ := http.NewRequest("POST", "/user/add", strings.NewReader(string(userJson))) + router.ServeHTTP(w, req) + + assert.Equal(t, 200, w.Code) + // Compare the response body with the json data of exampleUser + assert.Equal(t, string(userJson), w.Body.String()) } ``` diff --git a/src/content/docs/en/docs/users/index.md b/src/content/docs/en/docs/users/index.md index 4b3e43ce0b..1095c21b1a 100644 --- a/src/content/docs/en/docs/users/index.md +++ b/src/content/docs/en/docs/users/index.md @@ -1,22 +1,15 @@ --- title: "Users" - sidebar: order: 8 --- -##### Awesome project lists using [Gin](https://github.com/gin-gonic/gin) web framework: - -* [gorush](https://github.com/appleboy/gorush): A push notification server written in Go. - -* [fnproject](https://github.com/fnproject/fn): The container native, cloud agnostic serverless platform. - -* [photoprism](https://github.com/photoprism/photoprism): Personal photo management powered by Go and Google TensorFlow. - -* [krakend](https://github.com/devopsfaith/krakend): Ultra performant API Gateway with middlewares. - -* [picfit](https://github.com/thoas/picfit): An image resizing server written in Go. - -* [gotify](https://github.com/gotify/server): A simple server for sending and receiving messages in real-time per web socket. +## Awesome Project Lists -* [cds](https://github.com/ovh/cds): Enterprise-Grade Continuous Delivery & DevOps Automation Open Source Platform. +- [gorush](https://github.com/appleboy/gorush): A push notification server written in Go. +- [fnproject](https://github.com/fnproject/fn): The container native, cloud agnostic serverless platform. +- [photoprism](https://github.com/photoprism/photoprism): Personal photo management powered by Go and Google TensorFlow. +- [krakend](https://github.com/devopsfaith/krakend): Ultra performant API Gateway with middlewares. +- [picfit](https://github.com/thoas/picfit): An image resizing server written in Go. +- [gotify](https://github.com/gotify/server): A simple server for sending and receiving messages in real-time per web socket. +- [cds](https://github.com/ovh/cds): Enterprise-Grade Continuous Delivery & DevOps Automation Open Source Platform. diff --git a/src/content/docs/es/blog/index.md b/src/content/docs/es/blog/index.md index 07fd81571f..63a2f96df4 100644 --- a/src/content/docs/es/blog/index.md +++ b/src/content/docs/es/blog/index.md @@ -1,6 +1,5 @@ --- title: "Blog" -linkTitle: "Blog" sidebar: order: 30 --- diff --git a/src/content/docs/es/blog/news/how-to-build-one-effective-middleware.md b/src/content/docs/es/blog/news/how-to-build-one-effective-middleware.md index d93e7cbc3e..f33833df25 100644 --- a/src/content/docs/es/blog/news/how-to-build-one-effective-middleware.md +++ b/src/content/docs/es/blog/news/how-to-build-one-effective-middleware.md @@ -1,7 +1,7 @@ --- title: "How to build one effective middleware?" linkTitle: "How to build one effective middleware?" -date: 2019-02-26 +lastUpdated: 2019-02-26 --- ## Constituent parts diff --git a/src/content/docs/es/blog/releases/release13.md b/src/content/docs/es/blog/releases/release13.md index 43f4656f4e..8d5057ad72 100644 --- a/src/content/docs/es/blog/releases/release13.md +++ b/src/content/docs/es/blog/releases/release13.md @@ -1,7 +1,7 @@ --- title: "Gin 1.3.0 is released" linkTitle: "Gin 1.3.0 is released" -date: 2018-08-14 +lastUpdated: 2018-08-14 --- ### CHANGELOG diff --git a/src/content/docs/es/blog/releases/release14.md b/src/content/docs/es/blog/releases/release14.md index 23fd648294..c145f3b520 100644 --- a/src/content/docs/es/blog/releases/release14.md +++ b/src/content/docs/es/blog/releases/release14.md @@ -1,7 +1,7 @@ --- title: "Gin 1.4.0 is released" linkTitle: "Gin 1.4.0 is released" -date: 2019-05-08 +lastUpdated: 2019-05-08 --- ### CHANGELOG diff --git a/src/content/docs/es/blog/releases/release15.md b/src/content/docs/es/blog/releases/release15.md index e4593b3ceb..4f5707a177 100644 --- a/src/content/docs/es/blog/releases/release15.md +++ b/src/content/docs/es/blog/releases/release15.md @@ -1,7 +1,7 @@ --- title: "Gin 1.5.0 is released" linkTitle: "Gin 1.5.0 is released" -date: 2019-11-28 +lastUpdated: 2019-11-28 --- ### CHANGELOG diff --git a/src/content/docs/es/blog/releases/release16.md b/src/content/docs/es/blog/releases/release16.md index 539997c964..dfc0c6ef58 100644 --- a/src/content/docs/es/blog/releases/release16.md +++ b/src/content/docs/es/blog/releases/release16.md @@ -1,7 +1,7 @@ --- title: "Gin 1.6.0 is released" linkTitle: "Gin 1.6.0 is released" -date: 2020-03-22 +lastUpdated: 2020-03-22 --- ### CHANGELOG diff --git a/src/content/docs/es/docs/benchmarks/index.md b/src/content/docs/es/docs/benchmarks/index.md index 73cceab901..1238dace52 100644 --- a/src/content/docs/es/docs/benchmarks/index.md +++ b/src/content/docs/es/docs/benchmarks/index.md @@ -1,6 +1,5 @@ --- title: "Benchmarks" - sidebar: order: 3 --- diff --git a/src/content/docs/es/docs/deployment/index.md b/src/content/docs/es/docs/deployment/index.md index 40135b23e1..58babff2e7 100644 --- a/src/content/docs/es/docs/deployment/index.md +++ b/src/content/docs/es/docs/deployment/index.md @@ -1,6 +1,5 @@ --- title: "Despliegue" - sidebar: order: 6 --- @@ -18,3 +17,113 @@ Sigue la [guía para desplegar proyectos Gin en Render](https://render.com/docs/ Google App Engine tiene dos formas de implementar aplicaciones Go. El entorno estándar es más fácil de usar, pero menos personalizable y evita [llamadas al sistema](https://github.com/gin-gonic/gin/issues/1639) por razones de seguridad. El entorno flexible puede ejecutar cualquier framework o librería. Conoce más información y elije el entorno preferido en [Go on Google App Engine](https://cloud.google.com/appengine/docs/go/). + +## Self Hosted + +Gin projects can also be deployed in a self-hosted manner. Deployment architecture and security considerations vary depending on the target environment. The following section only presents a high level overview of configuration options to consider when planning the deployment. + +## Configuration Options + +Gin project deployments can be tuned by using environment variables or directly in code. + +The following environment variables are available for configuring Gin: + +| Environment Variable | Description | +| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| PORT | The TCP port to listen on when starting the Gin server with `router.Run()` (i.e. without any arguments). | +| GIN_MODE | Set to one of `debug`, `release`, or `test`. Handles management of Gin modes, such as when to emit debug outputs. Can also be set in code using `gin.SetMode(gin.ReleaseMode)` or `gin.SetMode(gin.TestMode)` | + +The following code can be used to configure Gin. + +```go +// Don't specify the bind address or port for Gin. Defaults to binding on all interfaces on port 8080. +// Can use the `PORT` environment variable to change the listen port when using `Run()` without any arguments. +router := gin.Default() +router.Run() + +// Specify the bind address and port for Gin. +router := gin.Default() +router.Run("192.168.1.100:8080") + +// Specify only the listen port. Will bind on all interfaces. +router := gin.Default() +router.Run(":8080") + +// Set which IP addresses or CIDRs, are considered to be trusted for setting headers to document real client IP addresses. +// See the documentation for additional details. +router := gin.Default() +router.SetTrustedProxies([]string{"192.168.1.2"}) +``` + +## Don't trust all proxies + +Gin lets you specify which headers to hold the real client IP (if any), +as well as specifying which proxies (or direct clients) you trust to +specify one of these headers. + +Use function `SetTrustedProxies()` on your `gin.Engine` to specify network addresses +or network CIDRs from where clients which their request headers related to client +IP can be trusted. They can be IPv4 addresses, IPv4 CIDRs, IPv6 addresses or +IPv6 CIDRs. + +**Attention:** Gin trust all proxies by default if you don't specify a trusted +proxy using the function above, **this is NOT safe**. At the same time, if you don't +use any proxy, you can disable this feature by using `Engine.SetTrustedProxies(nil)`, +then `Context.ClientIP()` will return the remote address directly to avoid some +unnecessary computation. + +```go +import ( + "fmt" + + "github.com/gin-gonic/gin" +) + +func main() { + router := gin.Default() + router.SetTrustedProxies([]string{"192.168.1.2"}) + + router.GET("/", func(c *gin.Context) { + // If the client is 192.168.1.2, use the X-Forwarded-For + // header to deduce the original client IP from the trust- + // worthy parts of that header. + // Otherwise, simply return the direct client IP + fmt.Printf("ClientIP: %s\n", c.ClientIP()) + }) + router.Run() +} +``` + +**Notice:** If you are using a CDN service, you can set the `Engine.TrustedPlatform` +to skip TrustedProxies check, it has a higher priority than TrustedProxies. +Look at the example below: + +```go +import ( + "fmt" + + "github.com/gin-gonic/gin" +) + +func main() { + router := gin.Default() + // Use predefined header gin.PlatformXXX + // Google App Engine + router.TrustedPlatform = gin.PlatformGoogleAppEngine + // Cloudflare + router.TrustedPlatform = gin.PlatformCloudflare + // Fly.io + router.TrustedPlatform = gin.PlatformFlyIO + // Or, you can set your own trusted request header. But be sure your CDN + // prevents users from passing this header! For example, if your CDN puts + // the client IP in X-CDN-Client-IP: + router.TrustedPlatform = "X-CDN-Client-IP" + + router.GET("/", func(c *gin.Context) { + // If you set TrustedPlatform, ClientIP() will resolve the + // corresponding header and return IP directly + fmt.Printf("ClientIP: %s\n", c.ClientIP()) + }) + router.Run() +} +``` diff --git a/src/content/docs/es/docs/examples/ascii-json.md b/src/content/docs/es/docs/examples/ascii-json.md index 89bd3f8325..625ff5ec6a 100644 --- a/src/content/docs/es/docs/examples/ascii-json.md +++ b/src/content/docs/es/docs/examples/ascii-json.md @@ -1,15 +1,14 @@ --- title: "AsciiJSON" - --- Uso de AsciiJSON para generar respuestas JSON únicamente con caracteres ASCII y escape de caracteres no-ASCII. ```go func main() { - r := gin.Default() + router := gin.Default() - r.GET("/someJSON", func(c *gin.Context) { + router.GET("/someJSON", func(c *gin.Context) { data := map[string]interface{}{ "lang": "GO语言", "tag": "
", @@ -20,6 +19,6 @@ func main() { }) // Escucha y sirve peticiones en 0.0.0.0:8080 - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/es/docs/examples/bind-body-into-dirrerent-structs.md b/src/content/docs/es/docs/examples/bind-body-into-dirrerent-structs.md index 028b3282e6..1d4a8c7780 100644 --- a/src/content/docs/es/docs/examples/bind-body-into-dirrerent-structs.md +++ b/src/content/docs/es/docs/examples/bind-body-into-dirrerent-structs.md @@ -1,6 +1,5 @@ --- title: "Vincular el cuerpo de un request en distintos tipos de structs" - --- El método común para vincular el cuerpo de un request emplea `c.Request.Body` pero presenta diff --git a/src/content/docs/es/docs/examples/bind-form-data-request-with-custom-struct.md b/src/content/docs/es/docs/examples/bind-form-data-request-with-custom-struct.md index aa68ca52bf..bd61459e1e 100644 --- a/src/content/docs/es/docs/examples/bind-form-data-request-with-custom-struct.md +++ b/src/content/docs/es/docs/examples/bind-form-data-request-with-custom-struct.md @@ -1,6 +1,5 @@ --- title: "Vincular una petición form-data con un struct personalizado" - --- El siguiente es el ejemplo para un struct personalizado: @@ -55,18 +54,18 @@ func GetDataD(c *gin.Context) { } func main() { - r := gin.Default() - r.GET("/getb", GetDataB) - r.GET("/getc", GetDataC) - r.GET("/getd", GetDataD) + router := gin.Default() + router.GET("/getb", GetDataB) + router.GET("/getc", GetDataC) + router.GET("/getd", GetDataD) - r.Run() + router.Run() } ``` Empleando el comando `curl` las respuestas serían: -``` +```bash $ curl "http://localhost:8080/getb?field_a=hello&field_b=world" {"a":{"FieldA":"hello"},"b":"world"} $ curl "http://localhost:8080/getc?field_a=hello&field_c=world" diff --git a/src/content/docs/es/docs/examples/bind-html-checkbox.md b/src/content/docs/es/docs/examples/bind-html-checkbox.md index 2b0acfb016..f6d713407a 100644 --- a/src/content/docs/es/docs/examples/bind-html-checkbox.md +++ b/src/content/docs/es/docs/examples/bind-html-checkbox.md @@ -1,6 +1,5 @@ --- title: "Vincular checkboxes html" - --- Revise la [información detallada](https://github.com/gin-gonic/gin/issues/129#issuecomment-124260092) diff --git a/src/content/docs/es/docs/examples/bind-query-or-post.md b/src/content/docs/es/docs/examples/bind-query-or-post.md index aa4c294541..3f14bb38dd 100644 --- a/src/content/docs/es/docs/examples/bind-query-or-post.md +++ b/src/content/docs/es/docs/examples/bind-query-or-post.md @@ -1,6 +1,5 @@ --- title: "Vincular parámetros get o data Post" - --- Revise la [información detallada](https://github.com/gin-gonic/gin/issues/742#issuecomment-264681292). diff --git a/src/content/docs/es/docs/examples/bind-single-binary-with-template.md b/src/content/docs/es/docs/examples/bind-single-binary-with-template.md index fa2b0c7db7..247cf680e8 100644 --- a/src/content/docs/es/docs/examples/bind-single-binary-with-template.md +++ b/src/content/docs/es/docs/examples/bind-single-binary-with-template.md @@ -1,6 +1,5 @@ --- title: "Crear un ejecutable individual con templates" - --- Puede crear un servidor en un solo binario que contenga templates usando [go-assets](https://github.com/jessevdk/go-assets). @@ -13,12 +12,12 @@ func main() { if err != nil { panic(err) } - r.SetHTMLTemplate(t) + router.SetHTMLTemplate(t) - r.GET("/", func(c *gin.Context) { + router.GET("/", func(c *gin.Context) { c.HTML(http.StatusOK, "/html/index.tmpl", nil) }) - r.Run(":8080") + router.Run(":8080") } // loadTemplate carga templates incrustadas por medio de go-assets-builder diff --git a/src/content/docs/es/docs/examples/bind-uri.md b/src/content/docs/es/docs/examples/bind-uri.md index 5d99350b45..4dd9c5a08e 100644 --- a/src/content/docs/es/docs/examples/bind-uri.md +++ b/src/content/docs/es/docs/examples/bind-uri.md @@ -1,6 +1,5 @@ --- title: "Vincular un Uri" - --- Revise la [información detallada](https://github.com/gin-gonic/gin/issues/846). diff --git a/src/content/docs/es/docs/examples/binding-and-validation.md b/src/content/docs/es/docs/examples/binding-and-validation.md index 91bdc00ded..42789ff756 100644 --- a/src/content/docs/es/docs/examples/binding-and-validation.md +++ b/src/content/docs/es/docs/examples/binding-and-validation.md @@ -1,6 +1,5 @@ --- title: "Vincular y validar un Modelo" - --- Para vincular el cuerpo de un request en un tipo, puede hacerse el vínculo a un modelo. Actualmente se soporta el vínculo a JSON, XML, YAML y valores estandar para formularios (foo=bar&boo=baz). diff --git a/src/content/docs/es/docs/examples/controlling-log-output-coloring.md b/src/content/docs/es/docs/examples/controlling-log-output-coloring.md index f62e9bb131..46761dbb38 100644 --- a/src/content/docs/es/docs/examples/controlling-log-output-coloring.md +++ b/src/content/docs/es/docs/examples/controlling-log-output-coloring.md @@ -1,6 +1,5 @@ --- title: "Controlar el color del texto del Log en cónsola" - --- Por defecto la la salida en cónsola puede tener color, dependiendo del TTY detectado. diff --git a/src/content/docs/es/docs/examples/cookie.md b/src/content/docs/es/docs/examples/cookie.md index 82e377cebf..8db64909f9 100644 --- a/src/content/docs/es/docs/examples/cookie.md +++ b/src/content/docs/es/docs/examples/cookie.md @@ -1,8 +1,9 @@ --- -title: "Crear y obtener una cookie" - +title: "Cookie" --- +Crear y obtener una cookie + ```go import ( "fmt" @@ -29,3 +30,9 @@ func main() { router.Run() } ``` + +Delete cookie by set max age to -1. + +```go +c.SetCookie("gin_cookie", "test", -1, "/", "localhost", false, true) +``` diff --git a/src/content/docs/es/docs/examples/custom-http-config.md b/src/content/docs/es/docs/examples/custom-http-config.md index a61d08e790..dfb28e1992 100644 --- a/src/content/docs/es/docs/examples/custom-http-config.md +++ b/src/content/docs/es/docs/examples/custom-http-config.md @@ -1,6 +1,5 @@ --- title: "Configuración personalizada HTTP" - --- Se puede utilizar `http.ListenAndServe()` directamente, como se muestra: diff --git a/src/content/docs/es/docs/examples/custom-log-format.md b/src/content/docs/es/docs/examples/custom-log-format.md index 12711aaf0e..a6177a5e8b 100644 --- a/src/content/docs/es/docs/examples/custom-log-format.md +++ b/src/content/docs/es/docs/examples/custom-log-format.md @@ -1,6 +1,5 @@ --- title: "Personalizar formato de Logs" - --- For example: diff --git a/src/content/docs/es/docs/examples/custom-middleware.md b/src/content/docs/es/docs/examples/custom-middleware.md index 0ad0b44471..e185494eee 100644 --- a/src/content/docs/es/docs/examples/custom-middleware.md +++ b/src/content/docs/es/docs/examples/custom-middleware.md @@ -1,6 +1,5 @@ --- title: "Personalizar un Middleware" - --- ```go @@ -27,9 +26,9 @@ func Logger() gin.HandlerFunc { func main() { r := gin.New() - r.Use(Logger()) + router.Use(Logger()) - r.GET("/test", func(c *gin.Context) { + router.GET("/test", func(c *gin.Context) { example := c.MustGet("example").(string) // debe retornar: "12345" @@ -37,7 +36,7 @@ func main() { }) // Escucha y sirve peticiones en 0.0.0.0:8080 - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/es/docs/examples/custom-validators.md b/src/content/docs/es/docs/examples/custom-validators.md index 8d4b170dc9..480b9e2cce 100644 --- a/src/content/docs/es/docs/examples/custom-validators.md +++ b/src/content/docs/es/docs/examples/custom-validators.md @@ -1,6 +1,5 @@ --- title: "Personalizar Validaciones" - --- Es posible registrar validaciones personalizadas como puede verse en el [código de ejemplo](https://github.com/gin-gonic/examples/tree/master/struct-lvl-validations). diff --git a/src/content/docs/es/docs/examples/define-format-for-the-log-of-routes.md b/src/content/docs/es/docs/examples/define-format-for-the-log-of-routes.md index 487ed467ed..425811e361 100644 --- a/src/content/docs/es/docs/examples/define-format-for-the-log-of-routes.md +++ b/src/content/docs/es/docs/examples/define-format-for-the-log-of-routes.md @@ -1,6 +1,5 @@ --- title: "Definir el formato para el log de rutas" - --- El log de rutas por defecto es: @@ -22,24 +21,24 @@ import ( ) func main() { - r := gin.Default() + router := gin.Default() gin.DebugPrintRouteFunc = func(httpMethod, absolutePath, handlerName string, nuHandlers int) { log.Printf("endpoint %v %v %v %v\n", httpMethod, absolutePath, handlerName, nuHandlers) } - r.POST("/foo", func(c *gin.Context) { + router.POST("/foo", func(c *gin.Context) { c.JSON(http.StatusOK, "foo") }) - r.GET("/bar", func(c *gin.Context) { + router.GET("/bar", func(c *gin.Context) { c.JSON(http.StatusOK, "bar") }) - r.GET("/status", func(c *gin.Context) { + router.GET("/status", func(c *gin.Context) { c.JSON(http.StatusOK, "ok") }) // Escucha y sirve peticiones en 0.0.0.0:8080 - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/es/docs/examples/goroutines-inside-a-middleware.md b/src/content/docs/es/docs/examples/goroutines-inside-a-middleware.md index 8a43a09e0e..0784bd7f3e 100644 --- a/src/content/docs/es/docs/examples/goroutines-inside-a-middleware.md +++ b/src/content/docs/es/docs/examples/goroutines-inside-a-middleware.md @@ -1,15 +1,14 @@ --- title: "Goroutines dentro de un middleware" - --- Cuando se inicia una goroutine dentro de un middleware o un handler, **NO SE DEBE** utilizar el context dentro de él, debe emplearse una copia de lectura. ```go func main() { - r := gin.Default() + router := gin.Default() - r.GET("/long_async", func(c *gin.Context) { + router.GET("/long_async", func(c *gin.Context) { // crear una copia para usar dentro de la rutina cCp := c.Copy() go func() { @@ -21,7 +20,7 @@ func main() { }() }) - r.GET("/long_sync", func(c *gin.Context) { + router.GET("/long_sync", func(c *gin.Context) { // se simula una tarea prolongada con un time.Sleep(). de 5 seconds time.Sleep(5 * time.Second) @@ -30,6 +29,6 @@ func main() { }) // Escucha y sirve peticiones en 0.0.0.0:8080 - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/es/docs/examples/graceful-restart-or-stop.md b/src/content/docs/es/docs/examples/graceful-restart-or-stop.md index a91dad8e6a..cc6f2c5d54 100644 --- a/src/content/docs/es/docs/examples/graceful-restart-or-stop.md +++ b/src/content/docs/es/docs/examples/graceful-restart-or-stop.md @@ -1,6 +1,5 @@ --- title: "Apagado o reinicio controlado del servidor web" - --- Estas son algunas formas de reiniciar o detener el servidor web controladamente. @@ -61,7 +60,7 @@ func main() { // Espera por la señal de interrupción para el apagado controlado del servidor // con un tiempo de espera de 5 segundos. quit := make(chan os.Signal, 1) - // kill (sin parámetro) envío por defecto de la señal syscanll.SIGTERM + // kill (sin parámetro) envío por defecto de la señal syscall.SIGTERM // kill -2 es syscall.SIGINT // kill -9 es syscall.SIGKILL pero no se puede atrapar, así que no es necesario agregarlo signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM) diff --git a/src/content/docs/es/docs/examples/grouping-routes.md b/src/content/docs/es/docs/examples/grouping-routes.md index 33f65749c5..42c1f098f4 100644 --- a/src/content/docs/es/docs/examples/grouping-routes.md +++ b/src/content/docs/es/docs/examples/grouping-routes.md @@ -1,6 +1,5 @@ --- title: "Grouping routes" - --- ```go @@ -8,16 +7,16 @@ func main() { router := gin.Default() // Grupo simple con ruta: v1 - v1 := router.Group("/v1") { + v1 := router.Group("/v1") v1.POST("/login", loginEndpoint) v1.POST("/submit", submitEndpoint) v1.POST("/read", readEndpoint) } // Grupo simple con ruta: v2 - v2 := router.Group("/v2") { + v2 := router.Group("/v2") v2.POST("/login", loginEndpoint) v2.POST("/submit", submitEndpoint) v2.POST("/read", readEndpoint) diff --git a/src/content/docs/es/docs/examples/html-rendering.md b/src/content/docs/es/docs/examples/html-rendering.md index 2b31270928..cdf967c090 100644 --- a/src/content/docs/es/docs/examples/html-rendering.md +++ b/src/content/docs/es/docs/examples/html-rendering.md @@ -1,6 +1,5 @@ --- title: "Representación de HTML" - --- Using LoadHTMLGlob() or LoadHTMLFiles() @@ -93,9 +92,9 @@ func main() { Pueden establecerse separadores personalizados ```go - r := gin.Default() - r.Delims("{[{", "}]}") - r.LoadHTMLGlob("/path/to/templates") + router := gin.Default() + router.Delims("{[{", "}]}") + router.LoadHTMLGlob("/path/to/templates") ``` ### Funciones personalizadas en plantillas diff --git a/src/content/docs/es/docs/examples/http-method.md b/src/content/docs/es/docs/examples/http-method.md index 34e755b7a0..269a5491e5 100644 --- a/src/content/docs/es/docs/examples/http-method.md +++ b/src/content/docs/es/docs/examples/http-method.md @@ -1,6 +1,5 @@ --- title: "Uso de un método específico de HTTP" - --- ```go diff --git a/src/content/docs/es/docs/examples/http2-server-push.md b/src/content/docs/es/docs/examples/http2-server-push.md index 521b6d009e..660eef118c 100644 --- a/src/content/docs/es/docs/examples/http2-server-push.md +++ b/src/content/docs/es/docs/examples/http2-server-push.md @@ -1,6 +1,5 @@ --- title: "HTTP2 server push" - --- http.Pusher sólo es compatible con versiones **go1.8+ en adelante**. Véase el [blog de golang](https://blog.golang.org/h2push) para información detallada. @@ -28,11 +27,11 @@ var html = template.Must(template.New("https").Parse(` `)) func main() { - r := gin.Default() - r.Static("/assets", "./assets") - r.SetHTMLTemplate(html) + router := gin.Default() + router.Static("/assets", "./assets") + router.SetHTMLTemplate(html) - r.GET("/", func(c *gin.Context) { + router.GET("/", func(c *gin.Context) { if pusher := c.Writer.Pusher(); pusher != nil { // Utilice pusher.Push() para hacer server push if err := pusher.Push("/assets/app.js", nil); err != nil { @@ -45,7 +44,7 @@ func main() { }) // Escucha y sirve peticiones en https://127.0.0.1:8080 - r.RunTLS(":8080", "./testdata/server.pem", "./testdata/server.key") + router.RunTLS(":8080", "./testdata/server.pem", "./testdata/server.key") } ``` diff --git a/src/content/docs/es/docs/examples/index.md b/src/content/docs/es/docs/examples/index.md index 2fb4034198..5cec58a2d1 100644 --- a/src/content/docs/es/docs/examples/index.md +++ b/src/content/docs/es/docs/examples/index.md @@ -1,6 +1,5 @@ --- title: "Ejemplos" - sidebar: order: 6 --- diff --git a/src/content/docs/es/docs/examples/jsonp.md b/src/content/docs/es/docs/examples/jsonp.md index 2d82c30549..c2976d33ca 100644 --- a/src/content/docs/es/docs/examples/jsonp.md +++ b/src/content/docs/es/docs/examples/jsonp.md @@ -1,6 +1,5 @@ --- title: "JSONP" - --- Uso de JSONP para realizar una petición de datos desde un servidor en un dominio diferente @@ -8,9 +7,9 @@ Using JSONP to request data from a server in a different domain. Agregue un cal ```go func main() { - r := gin.Default() + router := gin.Default() - r.GET("/JSONP?callback=x", func(c *gin.Context) { + router.GET("/JSONP?callback=x", func(c *gin.Context) { data := map[string]interface{}{ "foo": "bar", } @@ -21,6 +20,6 @@ func main() { }) // Escucha y sirve peticiones en 0.0.0.0:8080 - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/es/docs/examples/map-as-querystring-or-postform.md b/src/content/docs/es/docs/examples/map-as-querystring-or-postform.md index 9468104ebc..931ecbb178 100644 --- a/src/content/docs/es/docs/examples/map-as-querystring-or-postform.md +++ b/src/content/docs/es/docs/examples/map-as-querystring-or-postform.md @@ -1,6 +1,5 @@ --- title: "Map a partir de una cadena de parámetros GET o parámetros de un formulario POST" - --- ```sh diff --git a/src/content/docs/es/docs/examples/multipart-urlencoded-binding.md b/src/content/docs/es/docs/examples/multipart-urlencoded-binding.md index 99d4bc5949..1ba152564f 100644 --- a/src/content/docs/es/docs/examples/multipart-urlencoded-binding.md +++ b/src/content/docs/es/docs/examples/multipart-urlencoded-binding.md @@ -1,6 +1,5 @@ --- title: "Vincular formularios Multipart/Urlencoded" - --- ```go diff --git a/src/content/docs/es/docs/examples/multipart-urlencoded-form.md b/src/content/docs/es/docs/examples/multipart-urlencoded-form.md index 3a15a5e6c8..cca73ecd12 100644 --- a/src/content/docs/es/docs/examples/multipart-urlencoded-form.md +++ b/src/content/docs/es/docs/examples/multipart-urlencoded-form.md @@ -1,6 +1,5 @@ --- title: "Formulario Multipart/Urlencoded" - --- ```go diff --git a/src/content/docs/es/docs/examples/multiple-template.md b/src/content/docs/es/docs/examples/multiple-template.md index cbbdffd8ee..a51c011a96 100644 --- a/src/content/docs/es/docs/examples/multiple-template.md +++ b/src/content/docs/es/docs/examples/multiple-template.md @@ -1,6 +1,5 @@ --- title: "Multiplantillas" - --- Gin permite por defecto el úso de sólo una html.Template. Puede revisar [un interpretador multi plantilas](https://github.com/gin-contrib/multitemplate) para emplear características como `block template` de go 1.6. diff --git a/src/content/docs/es/docs/examples/only-bind-query-string.md b/src/content/docs/es/docs/examples/only-bind-query-string.md index 9c6e483087..1ef1d7b813 100644 --- a/src/content/docs/es/docs/examples/only-bind-query-string.md +++ b/src/content/docs/es/docs/examples/only-bind-query-string.md @@ -1,6 +1,5 @@ --- title: "Vincular únicamente un parámetros GET" - --- La función `ShouldBindQuery` sólo vincula parámetros GET y excluye los datos POST. Véase la [información detallada](https://github.com/gin-gonic/gin/issues/742#issuecomment-315953017). diff --git a/src/content/docs/es/docs/examples/param-in-path.md b/src/content/docs/es/docs/examples/param-in-path.md index efd67bd2e5..7b3bd5e504 100644 --- a/src/content/docs/es/docs/examples/param-in-path.md +++ b/src/content/docs/es/docs/examples/param-in-path.md @@ -1,6 +1,5 @@ --- title: "Parámetros en rutas" - --- ```go diff --git a/src/content/docs/es/docs/examples/pure-json.md b/src/content/docs/es/docs/examples/pure-json.md index 30bd67c04f..084cb2115c 100644 --- a/src/content/docs/es/docs/examples/pure-json.md +++ b/src/content/docs/es/docs/examples/pure-json.md @@ -1,30 +1,29 @@ --- title: "PureJSON" - --- Usualmente, JSON sustituye carácteres especiales HTML con sus entidades unicode. Por ejemplo `<` se convierte a `\u003c`. Si se requiere condificar este tipo de caracteres literalmente, se puede utilizar PureJSON. Esta característica no está disponible en Go 1.6 o versiones inferiores. ```go func main() { - r := gin.Default() + router := gin.Default() // Sirve entidades unicode - r.GET("/json", func(c *gin.Context) { + router.GET("/json", func(c *gin.Context) { c.JSON(200, gin.H{ "html": "Hello, world!", }) }) // Sirve carácteres literales - r.GET("/purejson", func(c *gin.Context) { + router.GET("/purejson", func(c *gin.Context) { c.PureJSON(200, gin.H{ "html": "Hello, world!", }) }) // Escucha y sirve peticiones en 0.0.0.0:8080 - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/es/docs/examples/query-and-post-form.md b/src/content/docs/es/docs/examples/query-and-post-form.md index 78e0eb6528..116cd1831a 100644 --- a/src/content/docs/es/docs/examples/query-and-post-form.md +++ b/src/content/docs/es/docs/examples/query-and-post-form.md @@ -1,6 +1,5 @@ --- title: "Formulario POST y parámetros GET en URL" - --- ```sh diff --git a/src/content/docs/es/docs/examples/querystring-param.md b/src/content/docs/es/docs/examples/querystring-param.md index 546dbad01a..407a878435 100644 --- a/src/content/docs/es/docs/examples/querystring-param.md +++ b/src/content/docs/es/docs/examples/querystring-param.md @@ -1,6 +1,5 @@ --- title: "Parámetros GET en URL" - --- ```go diff --git a/src/content/docs/es/docs/examples/redirects.md b/src/content/docs/es/docs/examples/redirects.md index ee2c28dd43..002fec58f2 100644 --- a/src/content/docs/es/docs/examples/redirects.md +++ b/src/content/docs/es/docs/examples/redirects.md @@ -1,12 +1,11 @@ --- title: "Redirección" - --- Emitir una redirección HTTP es sencillo. Son soportadas las rutas internas o externas. ```go -r.GET("/test", func(c *gin.Context) { +router.GET("/test", func(c *gin.Context) { c.Redirect(http.StatusMovedPermanently, "http://www.google.com/") }) ``` @@ -14,7 +13,7 @@ r.GET("/test", func(c *gin.Context) { Emitir una redirección HTTP desde POST. Véase en el issue: [#444](https://github.com/gin-gonic/gin/issues/444) ```go -r.POST("/test", func(c *gin.Context) { +router.POST("/test", func(c *gin.Context) { c.Redirect(http.StatusFound, "/foo") }) ``` @@ -22,11 +21,11 @@ r.POST("/test", func(c *gin.Context) { Emitir una redirección hacia un Router, puede emplearse `HandleContext` como en el ejemplo inferior. ``` go -r.GET("/test", func(c *gin.Context) { +router.GET("/test", func(c *gin.Context) { c.Request.URL.Path = "/test2" - r.HandleContext(c) + router.HandleContext(c) }) -r.GET("/test2", func(c *gin.Context) { +router.GET("/test2", func(c *gin.Context) { c.JSON(200, gin.H{"hello": "world"}) }) ``` diff --git a/src/content/docs/es/docs/examples/rendering.md b/src/content/docs/es/docs/examples/rendering.md index 60cbb2e1a8..377426a1ed 100644 --- a/src/content/docs/es/docs/examples/rendering.md +++ b/src/content/docs/es/docs/examples/rendering.md @@ -1,18 +1,17 @@ --- title: "Procesamiento de XML/JSON/YAML/ProtoBuf" - --- ```go func main() { - r := gin.Default() + router := gin.Default() // gin.H es un método abreviado para map[string]interface{} - r.GET("/someJSON", func(c *gin.Context) { + router.GET("/someJSON", func(c *gin.Context) { c.JSON(http.StatusOK, gin.H{"message": "hey", "status": http.StatusOK}) }) - r.GET("/moreJSON", func(c *gin.Context) { + router.GET("/moreJSON", func(c *gin.Context) { // También puedes usar un struct var msg struct { Name string `json:"user"` @@ -27,15 +26,15 @@ func main() { c.JSON(http.StatusOK, msg) }) - r.GET("/someXML", func(c *gin.Context) { + router.GET("/someXML", func(c *gin.Context) { c.XML(http.StatusOK, gin.H{"message": "hey", "status": http.StatusOK}) }) - r.GET("/someYAML", func(c *gin.Context) { + router.GET("/someYAML", func(c *gin.Context) { c.YAML(http.StatusOK, gin.H{"message": "hey", "status": http.StatusOK}) }) - r.GET("/someProtoBuf", func(c *gin.Context) { + router.GET("/someProtoBuf", func(c *gin.Context) { reps := []int64{int64(1), int64(2)} label := "test" // La definición del protobuf se encuentra escrita en el archivo testdata/protoexample. @@ -48,6 +47,6 @@ func main() { c.ProtoBuf(http.StatusOK, data) }) - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/es/docs/examples/run-multiple-service.md b/src/content/docs/es/docs/examples/run-multiple-service.md index 109e0fc05d..5416d7fa54 100644 --- a/src/content/docs/es/docs/examples/run-multiple-service.md +++ b/src/content/docs/es/docs/examples/run-multiple-service.md @@ -1,6 +1,5 @@ --- title: "Ejecutar múltiples servicios a la vez" - --- Véase la [pregunta](https://github.com/gin-gonic/gin/issues/346) e intente el siguiente ejemplo: diff --git a/src/content/docs/es/docs/examples/secure-json.md b/src/content/docs/es/docs/examples/secure-json.md index 5221d0845d..014e823acc 100644 --- a/src/content/docs/es/docs/examples/secure-json.md +++ b/src/content/docs/es/docs/examples/secure-json.md @@ -1,23 +1,22 @@ --- title: "Uso de SecureJSON" - --- Usando SecureJSON para evitar el secuestro de JSON. Por defecto se antepone `"while(1),"` al cuerpo de respuesta si la estructura dada son valores de array. ```go func main() { - r := gin.Default() + router := gin.Default() // Se puede emplear un prefijo JSON seguro propio - // r.SecureJsonPrefix(")]}',\n") + // router.SecureJsonPrefix(")]}',\n") - r.GET("/someJSON", func(c *gin.Context) { + router.GET("/someJSON", func(c *gin.Context) { names := []string{"lena", "austin", "foo"} // Retornará : while(1);["lena","austin","foo"] c.SecureJSON(http.StatusOK, names) }) - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/es/docs/examples/security-headers.md b/src/content/docs/es/docs/examples/security-headers.md index fa0ee9e34b..ef0851580c 100644 --- a/src/content/docs/es/docs/examples/security-headers.md +++ b/src/content/docs/es/docs/examples/security-headers.md @@ -1,6 +1,5 @@ --- title: "Encabezados de seguridad" - --- Es importante utilizar cabeceras de seguridad para proteger su aplicación web de vulnerabilidades de seguridad comunes. Este ejemplo le muestra cómo añadir cabeceras de seguridad a su aplicación Gin y también cómo evitar ataques relacionados con Host Header Injection (SSRF, Open Redirection). diff --git a/src/content/docs/es/docs/examples/serving-data-from-reader.md b/src/content/docs/es/docs/examples/serving-data-from-reader.md index 8dbed958b2..eee8768783 100644 --- a/src/content/docs/es/docs/examples/serving-data-from-reader.md +++ b/src/content/docs/es/docs/examples/serving-data-from-reader.md @@ -1,6 +1,5 @@ --- title: "Retornando data a partir de un reader" - --- ```go diff --git a/src/content/docs/es/docs/examples/serving-static-files.md b/src/content/docs/es/docs/examples/serving-static-files.md index 608e3896aa..4f7ce0f598 100644 --- a/src/content/docs/es/docs/examples/serving-static-files.md +++ b/src/content/docs/es/docs/examples/serving-static-files.md @@ -1,6 +1,5 @@ --- title: "Sirviendo archivos estáticos" - --- ```go diff --git a/src/content/docs/es/docs/examples/support-lets-encrypt.md b/src/content/docs/es/docs/examples/support-lets-encrypt.md index 4f6449b398..fa23f096f6 100644 --- a/src/content/docs/es/docs/examples/support-lets-encrypt.md +++ b/src/content/docs/es/docs/examples/support-lets-encrypt.md @@ -1,6 +1,5 @@ --- title: "Soporte de certificados Let's Encrypt" - --- Ejemplo para servidores HTTPS 1-line LetsEncrypt HTTPS. @@ -16,10 +15,10 @@ import ( ) func main() { - r := gin.Default() + router := gin.Default() // Manejador de Ping - r.GET("/ping", func(c *gin.Context) { + router.GET("/ping", func(c *gin.Context) { c.String(200, "pong") }) @@ -41,10 +40,10 @@ import ( ) func main() { - r := gin.Default() + router := gin.Default() // Manejador de Ping - r.GET("/ping", func(c *gin.Context) { + router.GET("/ping", func(c *gin.Context) { c.String(200, "pong") }) diff --git a/src/content/docs/es/docs/examples/upload-file/index.md b/src/content/docs/es/docs/examples/upload-file/index.md index 67d8d1f995..aa086b98eb 100644 --- a/src/content/docs/es/docs/examples/upload-file/index.md +++ b/src/content/docs/es/docs/examples/upload-file/index.md @@ -1,6 +1,5 @@ --- title: "Subir archivos" - --- La sección enumera el uso de la API para subir archivos. diff --git a/src/content/docs/es/docs/examples/upload-file/multiple-file.md b/src/content/docs/es/docs/examples/upload-file/multiple-file.md index acc0715ea8..a6cc7212a9 100644 --- a/src/content/docs/es/docs/examples/upload-file/multiple-file.md +++ b/src/content/docs/es/docs/examples/upload-file/multiple-file.md @@ -1,6 +1,5 @@ --- title: "Múltiples archivos" - --- Vea el código de [ejemplo detallado](https://github.com/gin-gonic/examples/tree/master/upload-file/multiple). @@ -19,7 +18,7 @@ func main() { log.Println(file.Filename) // Guarda el archivo recibido a un destino específico - c.SaveUploadedFile(file, dst) + c.SaveUploadedFile(file, "./files/" + file.Filename) } c.String(http.StatusOK, fmt.Sprintf("%d files uploaded!", len(files))) }) diff --git a/src/content/docs/es/docs/examples/upload-file/single-file.md b/src/content/docs/es/docs/examples/upload-file/single-file.md index 02d8d74747..dd93416a27 100644 --- a/src/content/docs/es/docs/examples/upload-file/single-file.md +++ b/src/content/docs/es/docs/examples/upload-file/single-file.md @@ -1,6 +1,5 @@ --- title: "Subir un archivo individual" - --- Issue de referencia [#774](https://github.com/gin-gonic/gin/issues/774) y código [detallado de ejemplo](https://github.com/gin-gonic/examples/tree/master/upload-file/single). @@ -20,7 +19,7 @@ func main() { log.Println(file.Filename) // Guarda el archivo recibido a un destino específico - c.SaveUploadedFile(file, dst) + c.SaveUploadedFile(file, "./files/" + file.Filename) c.String(http.StatusOK, fmt.Sprintf("'%s' uploaded!", file.Filename)) }) diff --git a/src/content/docs/es/docs/examples/using-basicauth-middleware.md b/src/content/docs/es/docs/examples/using-basicauth-middleware.md index 35a72c25e3..ea121ff9d7 100644 --- a/src/content/docs/es/docs/examples/using-basicauth-middleware.md +++ b/src/content/docs/es/docs/examples/using-basicauth-middleware.md @@ -1,6 +1,5 @@ --- title: "Uso del middleware BasicAuth" - --- ```go @@ -12,11 +11,11 @@ var secrets = gin.H{ } func main() { - r := gin.Default() + router := gin.Default() // Agrupación de rutas usando el middleware gin.BasicAuth() // gin.Accounts es una abreviatura para map[string]string - authorized := r.Group("/admin", gin.BasicAuth(gin.Accounts{ + authorized := router.Group("/admin", gin.BasicAuth(gin.Accounts{ "foo": "bar", "austin": "1234", "lena": "hello2", @@ -35,6 +34,6 @@ func main() { } }) - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/es/docs/examples/using-middleware.md b/src/content/docs/es/docs/examples/using-middleware.md index 4796fc68b4..4e545444e1 100644 --- a/src/content/docs/es/docs/examples/using-middleware.md +++ b/src/content/docs/es/docs/examples/using-middleware.md @@ -1,6 +1,5 @@ --- title: "Usando middleware" - --- ```go @@ -11,18 +10,18 @@ func main() { // Middleware global // El middlware Logger escribirá los logs hacia gin.DefaultWriter incluso si se configura GIN_MODE=release. // Por defecto será gin.DefaultWriter = os.Stdout - r.Use(gin.Logger()) + router.Use(gin.Logger()) // El middleware Recovery recupera al servicio de cualquier panics y registra un error 500 si existiese uno. - r.Use(gin.Recovery()) + router.Use(gin.Recovery()) // Middleware por ruta, se pueden añadir tantos como sea necesario. - r.GET("/benchmark", MyBenchLogger(), benchEndpoint) + router.GET("/benchmark", MyBenchLogger(), benchEndpoint) // Grupo de Authorization - // authorized := r.Group("/", AuthRequired()) + // authorized := router.Group("/", AuthRequired()) // exactamente el mismo que: - authorized := r.Group("/") + authorized := router.Group("/") // Middleware por grupo. En este caso usamos el grupo creado // y se aplicará AuthRequired() middleware únicamente en el grupo "authorized". authorized.Use(AuthRequired()) @@ -36,7 +35,7 @@ func main() { testing.GET("/analytics", analyticsEndpoint) } - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/es/docs/examples/without-middleware.md b/src/content/docs/es/docs/examples/without-middleware.md index 2741625974..c5621bd5d6 100644 --- a/src/content/docs/es/docs/examples/without-middleware.md +++ b/src/content/docs/es/docs/examples/without-middleware.md @@ -1,6 +1,5 @@ --- title: "Usar Gin sin los middleware por defecto" - --- Utilice diff --git a/src/content/docs/es/docs/examples/write-log.md b/src/content/docs/es/docs/examples/write-log.md index be6ab31f0e..347799fa6c 100644 --- a/src/content/docs/es/docs/examples/write-log.md +++ b/src/content/docs/es/docs/examples/write-log.md @@ -1,6 +1,5 @@ --- title: "Como registrar un Log en un archivo" - --- ```go diff --git a/src/content/docs/es/docs/faq/index.md b/src/content/docs/es/docs/faq/index.md index da14005b01..c86777d3d5 100644 --- a/src/content/docs/es/docs/faq/index.md +++ b/src/content/docs/es/docs/faq/index.md @@ -1,6 +1,5 @@ --- title: "FAQ" - sidebar: order: 9 --- diff --git a/src/content/docs/es/docs/features/index.md b/src/content/docs/es/docs/features/index.md index 0c4bc3e1c5..adb6aec009 100644 --- a/src/content/docs/es/docs/features/index.md +++ b/src/content/docs/es/docs/features/index.md @@ -1,6 +1,5 @@ --- title: "Características" - sidebar: order: 4 --- diff --git a/src/content/docs/es/docs/index.md b/src/content/docs/es/docs/index.md index 173d2390f2..1f26c4a275 100644 --- a/src/content/docs/es/docs/index.md +++ b/src/content/docs/es/docs/index.md @@ -1,8 +1,7 @@ --- title: "Documentación" -linkTitle: "Documentación" sidebar: - order: 1 + order: 20 --- ## ¿Qué es Gin? diff --git a/src/content/docs/es/docs/introduction/index.md b/src/content/docs/es/docs/introduction/index.md index fd4393e6d1..ba37d01c44 100644 --- a/src/content/docs/es/docs/introduction/index.md +++ b/src/content/docs/es/docs/introduction/index.md @@ -1,6 +1,5 @@ --- title: "Introducción" - sidebar: order: 1 --- diff --git a/src/content/docs/es/docs/jsoniter/index.md b/src/content/docs/es/docs/jsoniter/index.md index 6d65596b21..a78286c5d2 100644 --- a/src/content/docs/es/docs/jsoniter/index.md +++ b/src/content/docs/es/docs/jsoniter/index.md @@ -1,6 +1,5 @@ --- title: "Jsoniter" - sidebar: order: 5 --- diff --git a/src/content/docs/es/docs/quickstart/index.md b/src/content/docs/es/docs/quickstart/index.md index 565ada4104..4c2381a113 100644 --- a/src/content/docs/es/docs/quickstart/index.md +++ b/src/content/docs/es/docs/quickstart/index.md @@ -1,6 +1,5 @@ --- title: "Inicio Rápido" - sidebar: order: 2 --- @@ -70,13 +69,13 @@ package main import "github.com/gin-gonic/gin" func main() { - r := gin.Default() - r.GET("/ping", func(c *gin.Context) { + router := gin.Default() + router.GET("/ping", func(c *gin.Context) { c.JSON(200, gin.H{ "message": "pong", }) }) - r.Run() // Sirve y escucha peticiones en 0.0.0.0:8080 + router.Run() // Sirve y escucha peticiones en 0.0.0.0:8080 } ``` diff --git a/src/content/docs/es/docs/testing/index.md b/src/content/docs/es/docs/testing/index.md index b481c6e38c..6694bcd652 100644 --- a/src/content/docs/es/docs/testing/index.md +++ b/src/content/docs/es/docs/testing/index.md @@ -1,6 +1,5 @@ --- title: "Testing en Gin" - sidebar: order: 7 --- @@ -20,26 +19,26 @@ type User struct { } func setupRouter() *gin.Engine { - r := gin.Default() - r.GET("/ping", func(c *gin.Context) { + router := gin.Default() + router.GET("/ping", func(c *gin.Context) { c.String(200, "pong") }) - return r + return router } -func postUser(r *gin.Engine) *gin.Engine { - r.POST("/user/add", func(c *gin.Context) { +func postUser(router *gin.Engine) *gin.Engine { + router.POST("/user/add", func(c *gin.Context) { var user User c.BindJSON(&user) c.JSON(200, user) }) - return r + return router } func main() { r := setupRouter() r = postUser(r) - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/es/docs/users/index.md b/src/content/docs/es/docs/users/index.md index 07d8f9fd7f..24ba03e4e1 100644 --- a/src/content/docs/es/docs/users/index.md +++ b/src/content/docs/es/docs/users/index.md @@ -1,6 +1,5 @@ --- title: "Usuarios" - sidebar: order: 8 --- diff --git a/src/content/docs/fa/blog/index.md b/src/content/docs/fa/blog/index.md index 07fd81571f..63a2f96df4 100644 --- a/src/content/docs/fa/blog/index.md +++ b/src/content/docs/fa/blog/index.md @@ -1,6 +1,5 @@ --- title: "Blog" -linkTitle: "Blog" sidebar: order: 30 --- diff --git a/src/content/docs/fa/blog/news/how-to-build-one-effective-middleware.md b/src/content/docs/fa/blog/news/how-to-build-one-effective-middleware.md index d93e7cbc3e..f33833df25 100644 --- a/src/content/docs/fa/blog/news/how-to-build-one-effective-middleware.md +++ b/src/content/docs/fa/blog/news/how-to-build-one-effective-middleware.md @@ -1,7 +1,7 @@ --- title: "How to build one effective middleware?" linkTitle: "How to build one effective middleware?" -date: 2019-02-26 +lastUpdated: 2019-02-26 --- ## Constituent parts diff --git a/src/content/docs/fa/blog/releases/release13.md b/src/content/docs/fa/blog/releases/release13.md index 43f4656f4e..8d5057ad72 100644 --- a/src/content/docs/fa/blog/releases/release13.md +++ b/src/content/docs/fa/blog/releases/release13.md @@ -1,7 +1,7 @@ --- title: "Gin 1.3.0 is released" linkTitle: "Gin 1.3.0 is released" -date: 2018-08-14 +lastUpdated: 2018-08-14 --- ### CHANGELOG diff --git a/src/content/docs/fa/blog/releases/release14.md b/src/content/docs/fa/blog/releases/release14.md index 23fd648294..c145f3b520 100644 --- a/src/content/docs/fa/blog/releases/release14.md +++ b/src/content/docs/fa/blog/releases/release14.md @@ -1,7 +1,7 @@ --- title: "Gin 1.4.0 is released" linkTitle: "Gin 1.4.0 is released" -date: 2019-05-08 +lastUpdated: 2019-05-08 --- ### CHANGELOG diff --git a/src/content/docs/fa/blog/releases/release15.md b/src/content/docs/fa/blog/releases/release15.md index e4593b3ceb..4f5707a177 100644 --- a/src/content/docs/fa/blog/releases/release15.md +++ b/src/content/docs/fa/blog/releases/release15.md @@ -1,7 +1,7 @@ --- title: "Gin 1.5.0 is released" linkTitle: "Gin 1.5.0 is released" -date: 2019-11-28 +lastUpdated: 2019-11-28 --- ### CHANGELOG diff --git a/src/content/docs/fa/blog/releases/release16.md b/src/content/docs/fa/blog/releases/release16.md index 539997c964..dfc0c6ef58 100644 --- a/src/content/docs/fa/blog/releases/release16.md +++ b/src/content/docs/fa/blog/releases/release16.md @@ -1,7 +1,7 @@ --- title: "Gin 1.6.0 is released" linkTitle: "Gin 1.6.0 is released" -date: 2020-03-22 +lastUpdated: 2020-03-22 --- ### CHANGELOG diff --git a/src/content/docs/fa/docs/benchmarks/index.md b/src/content/docs/fa/docs/benchmarks/index.md index b5a8b975ab..3380aeeefa 100644 --- a/src/content/docs/fa/docs/benchmarks/index.md +++ b/src/content/docs/fa/docs/benchmarks/index.md @@ -1,6 +1,5 @@ --- title: "بنچ مارک ها" - sidebar: order: 3 --- diff --git a/src/content/docs/fa/docs/deployment/index.md b/src/content/docs/fa/docs/deployment/index.md index 885a80a083..a72efdaee8 100644 --- a/src/content/docs/fa/docs/deployment/index.md +++ b/src/content/docs/fa/docs/deployment/index.md @@ -1,6 +1,5 @@ --- title: "دیپلوی" - sidebar: order: 6 --- @@ -24,3 +23,113 @@ Render یک پلت فرم ابری مدرن است که پشتیبانی نیت GAE دو روش برای دیپلوی برنامه های Go دارد. استفاده از محیط استاندارد آسان تر است اما کمتر قابل تنظیم است و به دلایل امنیتی از [syscalls](https://github.com/gin-gonic/gin/issues/1639) جلوگیری می کند. محیط انعطاف پذیر آن می تواند هر چارچوب یا کتابخانه ای را اجرا کند. [محیط خودتو با Google App Engine بساز](https://cloud.google.com/appengine/docs/go/). + +## Self Hosted + +Gin projects can also be deployed in a self-hosted manner. Deployment architecture and security considerations vary depending on the target environment. The following section only presents a high level overview of configuration options to consider when planning the deployment. + +## Configuration Options + +Gin project deployments can be tuned by using environment variables or directly in code. + +The following environment variables are available for configuring Gin: + +| Environment Variable | Description | +| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| PORT | The TCP port to listen on when starting the Gin server with `router.Run()` (i.e. without any arguments). | +| GIN_MODE | Set to one of `debug`, `release`, or `test`. Handles management of Gin modes, such as when to emit debug outputs. Can also be set in code using `gin.SetMode(gin.ReleaseMode)` or `gin.SetMode(gin.TestMode)` | + +The following code can be used to configure Gin. + +```go +// Don't specify the bind address or port for Gin. Defaults to binding on all interfaces on port 8080. +// Can use the `PORT` environment variable to change the listen port when using `Run()` without any arguments. +router := gin.Default() +router.Run() + +// Specify the bind address and port for Gin. +router := gin.Default() +router.Run("192.168.1.100:8080") + +// Specify only the listen port. Will bind on all interfaces. +router := gin.Default() +router.Run(":8080") + +// Set which IP addresses or CIDRs, are considered to be trusted for setting headers to document real client IP addresses. +// See the documentation for additional details. +router := gin.Default() +router.SetTrustedProxies([]string{"192.168.1.2"}) +``` + +## Don't trust all proxies + +Gin lets you specify which headers to hold the real client IP (if any), +as well as specifying which proxies (or direct clients) you trust to +specify one of these headers. + +Use function `SetTrustedProxies()` on your `gin.Engine` to specify network addresses +or network CIDRs from where clients which their request headers related to client +IP can be trusted. They can be IPv4 addresses, IPv4 CIDRs, IPv6 addresses or +IPv6 CIDRs. + +**Attention:** Gin trust all proxies by default if you don't specify a trusted +proxy using the function above, **this is NOT safe**. At the same time, if you don't +use any proxy, you can disable this feature by using `Engine.SetTrustedProxies(nil)`, +then `Context.ClientIP()` will return the remote address directly to avoid some +unnecessary computation. + +```go +import ( + "fmt" + + "github.com/gin-gonic/gin" +) + +func main() { + router := gin.Default() + router.SetTrustedProxies([]string{"192.168.1.2"}) + + router.GET("/", func(c *gin.Context) { + // If the client is 192.168.1.2, use the X-Forwarded-For + // header to deduce the original client IP from the trust- + // worthy parts of that header. + // Otherwise, simply return the direct client IP + fmt.Printf("ClientIP: %s\n", c.ClientIP()) + }) + router.Run() +} +``` + +**Notice:** If you are using a CDN service, you can set the `Engine.TrustedPlatform` +to skip TrustedProxies check, it has a higher priority than TrustedProxies. +Look at the example below: + +```go +import ( + "fmt" + + "github.com/gin-gonic/gin" +) + +func main() { + router := gin.Default() + // Use predefined header gin.PlatformXXX + // Google App Engine + router.TrustedPlatform = gin.PlatformGoogleAppEngine + // Cloudflare + router.TrustedPlatform = gin.PlatformCloudflare + // Fly.io + router.TrustedPlatform = gin.PlatformFlyIO + // Or, you can set your own trusted request header. But be sure your CDN + // prevents users from passing this header! For example, if your CDN puts + // the client IP in X-CDN-Client-IP: + router.TrustedPlatform = "X-CDN-Client-IP" + + router.GET("/", func(c *gin.Context) { + // If you set TrustedPlatform, ClientIP() will resolve the + // corresponding header and return IP directly + fmt.Printf("ClientIP: %s\n", c.ClientIP()) + }) + router.Run() +} +``` diff --git a/src/content/docs/fa/docs/examples/ascii-json.md b/src/content/docs/fa/docs/examples/ascii-json.md index 7e2d2b0d04..bafbe964f3 100644 --- a/src/content/docs/fa/docs/examples/ascii-json.md +++ b/src/content/docs/fa/docs/examples/ascii-json.md @@ -1,15 +1,14 @@ --- title: "AsciiJSON" - --- Using AsciiJSON to Generates ASCII-only JSON with escaped non-ASCII characters. ```go func main() { - r := gin.Default() + router := gin.Default() - r.GET("/someJSON", func(c *gin.Context) { + router.GET("/someJSON", func(c *gin.Context) { data := map[string]interface{}{ "lang": "GO语言", "tag": "
", @@ -20,6 +19,6 @@ func main() { }) // Listen and serve on 0.0.0.0:8080 - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/fa/docs/examples/bind-body-into-dirrerent-structs.md b/src/content/docs/fa/docs/examples/bind-body-into-dirrerent-structs.md index 138179eea1..60701cb187 100644 --- a/src/content/docs/fa/docs/examples/bind-body-into-dirrerent-structs.md +++ b/src/content/docs/fa/docs/examples/bind-body-into-dirrerent-structs.md @@ -1,6 +1,5 @@ --- title: "Try to bind body into different structs" - --- The normal methods for binding request body consumes `c.Request.Body` and they diff --git a/src/content/docs/fa/docs/examples/bind-form-data-request-with-custom-struct.md b/src/content/docs/fa/docs/examples/bind-form-data-request-with-custom-struct.md index 92ab2f4b88..19997854d1 100644 --- a/src/content/docs/fa/docs/examples/bind-form-data-request-with-custom-struct.md +++ b/src/content/docs/fa/docs/examples/bind-form-data-request-with-custom-struct.md @@ -1,6 +1,5 @@ --- title: "Bind form-data request with custom struct" - --- The follow example using custom struct: @@ -55,18 +54,18 @@ func GetDataD(c *gin.Context) { } func main() { - r := gin.Default() - r.GET("/getb", GetDataB) - r.GET("/getc", GetDataC) - r.GET("/getd", GetDataD) + router := gin.Default() + router.GET("/getb", GetDataB) + router.GET("/getc", GetDataC) + router.GET("/getd", GetDataD) - r.Run() + router.Run() } ``` Using the command `curl` command result: -``` +```bash $ curl "http://localhost:8080/getb?field_a=hello&field_b=world" {"a":{"FieldA":"hello"},"b":"world"} $ curl "http://localhost:8080/getc?field_a=hello&field_c=world" diff --git a/src/content/docs/fa/docs/examples/bind-html-checkbox.md b/src/content/docs/fa/docs/examples/bind-html-checkbox.md index 4b1ee65efa..0de0cad363 100644 --- a/src/content/docs/fa/docs/examples/bind-html-checkbox.md +++ b/src/content/docs/fa/docs/examples/bind-html-checkbox.md @@ -1,6 +1,5 @@ --- title: "Bind html checkboxes" - --- See the [detail information](https://github.com/gin-gonic/gin/issues/129#issuecomment-124260092) diff --git a/src/content/docs/fa/docs/examples/bind-query-or-post.md b/src/content/docs/fa/docs/examples/bind-query-or-post.md index 9912d908a2..ce6b7f9892 100644 --- a/src/content/docs/fa/docs/examples/bind-query-or-post.md +++ b/src/content/docs/fa/docs/examples/bind-query-or-post.md @@ -1,6 +1,5 @@ --- title: "Bind query string or post data" - --- See the [detail information](https://github.com/gin-gonic/gin/issues/742#issuecomment-264681292). diff --git a/src/content/docs/fa/docs/examples/bind-single-binary-with-template.md b/src/content/docs/fa/docs/examples/bind-single-binary-with-template.md index 09e8b02fc7..5fa393039e 100644 --- a/src/content/docs/fa/docs/examples/bind-single-binary-with-template.md +++ b/src/content/docs/fa/docs/examples/bind-single-binary-with-template.md @@ -1,6 +1,5 @@ --- title: "Build a single binary with templates" - --- ## Use the third-party package @@ -14,12 +13,12 @@ func main() { if err != nil { panic(err) } - r.SetHTMLTemplate(t) + router.SetHTMLTemplate(t) - r.GET("/", func(c *gin.Context) { + router.GET("/", func(c *gin.Context) { c.HTML(http.StatusOK, "/html/index.tmpl", nil) }) - r.Run(":8080") + router.Run(":8080") } // loadTemplate loads templates embedded by go-assets-builder diff --git a/src/content/docs/fa/docs/examples/bind-uri.md b/src/content/docs/fa/docs/examples/bind-uri.md index b2092e977e..8488037df1 100644 --- a/src/content/docs/fa/docs/examples/bind-uri.md +++ b/src/content/docs/fa/docs/examples/bind-uri.md @@ -1,6 +1,5 @@ --- title: "Bind Uri" - --- See the [detail information](https://github.com/gin-gonic/gin/issues/846). diff --git a/src/content/docs/fa/docs/examples/binding-and-validation.md b/src/content/docs/fa/docs/examples/binding-and-validation.md index 40684022c6..f89a5c24a2 100644 --- a/src/content/docs/fa/docs/examples/binding-and-validation.md +++ b/src/content/docs/fa/docs/examples/binding-and-validation.md @@ -1,6 +1,5 @@ --- title: "Model binding and validation" - --- To bind a request body into a type, use model binding. We currently support binding of JSON, XML, YAML and standard form values (foo=bar&boo=baz). diff --git a/src/content/docs/fa/docs/examples/controlling-log-output-coloring.md b/src/content/docs/fa/docs/examples/controlling-log-output-coloring.md index c0973a85af..08f4c84557 100644 --- a/src/content/docs/fa/docs/examples/controlling-log-output-coloring.md +++ b/src/content/docs/fa/docs/examples/controlling-log-output-coloring.md @@ -1,6 +1,5 @@ --- title: "Controlling Log output coloring" - --- By default, logs output on console should be colorized depending on the detected TTY. diff --git a/src/content/docs/fa/docs/examples/cookie.md b/src/content/docs/fa/docs/examples/cookie.md index 090e66354a..3efb30edf5 100644 --- a/src/content/docs/fa/docs/examples/cookie.md +++ b/src/content/docs/fa/docs/examples/cookie.md @@ -1,8 +1,9 @@ --- -title: "Set and get a cookie" - +title: "Cookie" --- +Set and get cookie. + ```go import ( "fmt" @@ -29,3 +30,9 @@ func main() { router.Run() } ``` + +Delete cookie by set max age to -1. + +```go +c.SetCookie("gin_cookie", "test", -1, "/", "localhost", false, true) +``` diff --git a/src/content/docs/fa/docs/examples/custom-http-config.md b/src/content/docs/fa/docs/examples/custom-http-config.md index e8b921b732..f9052c0202 100644 --- a/src/content/docs/fa/docs/examples/custom-http-config.md +++ b/src/content/docs/fa/docs/examples/custom-http-config.md @@ -1,6 +1,5 @@ --- title: "Custom HTTP configuration" - --- Use `http.ListenAndServe()` directly, like this: diff --git a/src/content/docs/fa/docs/examples/custom-log-format.md b/src/content/docs/fa/docs/examples/custom-log-format.md index 6d64503414..fbe543ca4f 100644 --- a/src/content/docs/fa/docs/examples/custom-log-format.md +++ b/src/content/docs/fa/docs/examples/custom-log-format.md @@ -1,6 +1,5 @@ --- title: "Custom log file" - --- For example: diff --git a/src/content/docs/fa/docs/examples/custom-middleware.md b/src/content/docs/fa/docs/examples/custom-middleware.md index 8de8438b07..86b6cfadbc 100644 --- a/src/content/docs/fa/docs/examples/custom-middleware.md +++ b/src/content/docs/fa/docs/examples/custom-middleware.md @@ -1,6 +1,5 @@ --- title: "Custom Middleware" - --- ```go @@ -27,9 +26,9 @@ func Logger() gin.HandlerFunc { func main() { r := gin.New() - r.Use(Logger()) + router.Use(Logger()) - r.GET("/test", func(c *gin.Context) { + router.GET("/test", func(c *gin.Context) { example := c.MustGet("example").(string) // it would print: "12345" @@ -37,7 +36,7 @@ func main() { }) // Listen and serve on 0.0.0.0:8080 - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/fa/docs/examples/custom-validators.md b/src/content/docs/fa/docs/examples/custom-validators.md index 114de29af1..ac322e6ee7 100644 --- a/src/content/docs/fa/docs/examples/custom-validators.md +++ b/src/content/docs/fa/docs/examples/custom-validators.md @@ -1,6 +1,5 @@ --- title: "Custom validators" - --- It is also possible to register custom validators. See the [example code](https://github.com/gin-gonic/examples/tree/master/struct-lvl-validations). diff --git a/src/content/docs/fa/docs/examples/define-format-for-the-log-of-routes.md b/src/content/docs/fa/docs/examples/define-format-for-the-log-of-routes.md index 44bd991a9d..3df58b9ea8 100644 --- a/src/content/docs/fa/docs/examples/define-format-for-the-log-of-routes.md +++ b/src/content/docs/fa/docs/examples/define-format-for-the-log-of-routes.md @@ -1,6 +1,5 @@ --- title: "Define format for the log of routes" - --- The default log of routes is: @@ -21,24 +20,24 @@ import ( ) func main() { - r := gin.Default() + router := gin.Default() gin.DebugPrintRouteFunc = func(httpMethod, absolutePath, handlerName string, nuHandlers int) { log.Printf("endpoint %v %v %v %v\n", httpMethod, absolutePath, handlerName, nuHandlers) } - r.POST("/foo", func(c *gin.Context) { + router.POST("/foo", func(c *gin.Context) { c.JSON(http.StatusOK, "foo") }) - r.GET("/bar", func(c *gin.Context) { + router.GET("/bar", func(c *gin.Context) { c.JSON(http.StatusOK, "bar") }) - r.GET("/status", func(c *gin.Context) { + router.GET("/status", func(c *gin.Context) { c.JSON(http.StatusOK, "ok") }) // Listen and Server in http://0.0.0.0:8080 - r.Run() + router.Run() } ``` diff --git a/src/content/docs/fa/docs/examples/goroutines-inside-a-middleware.md b/src/content/docs/fa/docs/examples/goroutines-inside-a-middleware.md index f3a6b10d6e..d06d064a78 100644 --- a/src/content/docs/fa/docs/examples/goroutines-inside-a-middleware.md +++ b/src/content/docs/fa/docs/examples/goroutines-inside-a-middleware.md @@ -1,15 +1,14 @@ --- title: "Goroutines inside a middleware" - --- When starting new Goroutines inside a middleware or handler, you **SHOULD NOT** use the original context inside it, you have to use a read-only copy. ```go func main() { - r := gin.Default() + router := gin.Default() - r.GET("/long_async", func(c *gin.Context) { + router.GET("/long_async", func(c *gin.Context) { // create copy to be used inside the goroutine cCp := c.Copy() go func() { @@ -21,7 +20,7 @@ func main() { }() }) - r.GET("/long_sync", func(c *gin.Context) { + router.GET("/long_sync", func(c *gin.Context) { // simulate a long task with time.Sleep(). 5 seconds time.Sleep(5 * time.Second) @@ -30,6 +29,6 @@ func main() { }) // Listen and serve on 0.0.0.0:8080 - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/fa/docs/examples/graceful-restart-or-stop.md b/src/content/docs/fa/docs/examples/graceful-restart-or-stop.md index 633ad53240..91e60053c5 100644 --- a/src/content/docs/fa/docs/examples/graceful-restart-or-stop.md +++ b/src/content/docs/fa/docs/examples/graceful-restart-or-stop.md @@ -1,6 +1,5 @@ --- title: "Graceful restart or stop" - --- Do you want to graceful restart or stop your web server? @@ -62,9 +61,9 @@ func main() { // Wait for interrupt signal to gracefully shutdown the server with // a timeout of 5 seconds. quit := make(chan os.Signal, 1) - // kill (no param) default send syscanll.SIGTERM + // kill (no param) default sends syscall.SIGTERM // kill -2 is syscall.SIGINT - // kill -9 is syscall. SIGKILL but can"t be catch, so don't need add it + // kill -9 is syscall.SIGKILL but can't be caught, so don't need add it signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM) <-quit log.Println("Shutdown Server ...") diff --git a/src/content/docs/fa/docs/examples/grouping-routes.md b/src/content/docs/fa/docs/examples/grouping-routes.md index c7f7a72459..416e5597d2 100644 --- a/src/content/docs/fa/docs/examples/grouping-routes.md +++ b/src/content/docs/fa/docs/examples/grouping-routes.md @@ -1,6 +1,5 @@ --- title: "Grouping routes" - --- ```go @@ -8,16 +7,16 @@ func main() { router := gin.Default() // Simple group: v1 - v1 := router.Group("/v1") { + v1 := router.Group("/v1") v1.POST("/login", loginEndpoint) v1.POST("/submit", submitEndpoint) v1.POST("/read", readEndpoint) } // Simple group: v2 - v2 := router.Group("/v2") { + v2 := router.Group("/v2") v2.POST("/login", loginEndpoint) v2.POST("/submit", submitEndpoint) v2.POST("/read", readEndpoint) diff --git a/src/content/docs/fa/docs/examples/html-rendering.md b/src/content/docs/fa/docs/examples/html-rendering.md index 7872487959..12fde101d3 100644 --- a/src/content/docs/fa/docs/examples/html-rendering.md +++ b/src/content/docs/fa/docs/examples/html-rendering.md @@ -1,6 +1,5 @@ --- title: "HTML rendering" - --- Using LoadHTMLGlob() or LoadHTMLFiles() @@ -93,9 +92,9 @@ func main() { You may use custom delims ```go - r := gin.Default() - r.Delims("{[{", "}]}") - r.LoadHTMLGlob("/path/to/templates") + router := gin.Default() + router.Delims("{[{", "}]}") + router.LoadHTMLGlob("/path/to/templates") ``` ### Custom Template Funcs diff --git a/src/content/docs/fa/docs/examples/http-method.md b/src/content/docs/fa/docs/examples/http-method.md index b8d41d6968..a0c8d09c62 100644 --- a/src/content/docs/fa/docs/examples/http-method.md +++ b/src/content/docs/fa/docs/examples/http-method.md @@ -1,6 +1,5 @@ --- title: "Using HTTP method" - --- ```go diff --git a/src/content/docs/fa/docs/examples/http2-server-push.md b/src/content/docs/fa/docs/examples/http2-server-push.md index 192d22a457..f7c81b55bb 100644 --- a/src/content/docs/fa/docs/examples/http2-server-push.md +++ b/src/content/docs/fa/docs/examples/http2-server-push.md @@ -1,6 +1,5 @@ --- title: "HTTP2 server push" - --- http.Pusher is supported only **go1.8+**. See the [golang blog](https://blog.golang.org/h2push) for detail information. @@ -28,11 +27,11 @@ var html = template.Must(template.New("https").Parse(` `)) func main() { - r := gin.Default() - r.Static("/assets", "./assets") - r.SetHTMLTemplate(html) + router := gin.Default() + router.Static("/assets", "./assets") + router.SetHTMLTemplate(html) - r.GET("/", func(c *gin.Context) { + router.GET("/", func(c *gin.Context) { if pusher := c.Writer.Pusher(); pusher != nil { // use pusher.Push() to do server push if err := pusher.Push("/assets/app.js", nil); err != nil { @@ -45,7 +44,7 @@ func main() { }) // Listen and Server in https://127.0.0.1:8080 - r.RunTLS(":8080", "./testdata/server.pem", "./testdata/server.key") + router.RunTLS(":8080", "./testdata/server.pem", "./testdata/server.key") } ``` diff --git a/src/content/docs/fa/docs/examples/index.md b/src/content/docs/fa/docs/examples/index.md index c371f9c5f8..90550670c7 100644 --- a/src/content/docs/fa/docs/examples/index.md +++ b/src/content/docs/fa/docs/examples/index.md @@ -1,6 +1,5 @@ --- title: "مثال ها" - sidebar: order: 6 --- diff --git a/src/content/docs/fa/docs/examples/jsonp.md b/src/content/docs/fa/docs/examples/jsonp.md index bc4439a44f..b59608103b 100644 --- a/src/content/docs/fa/docs/examples/jsonp.md +++ b/src/content/docs/fa/docs/examples/jsonp.md @@ -1,15 +1,14 @@ --- title: "JSONP" - --- Using JSONP to request data from a server in a different domain. Add callback to response body if the query parameter callback exists. ```go func main() { - r := gin.Default() + router := gin.Default() - r.GET("/JSONP?callback=x", func(c *gin.Context) { + router.GET("/JSONP?callback=x", func(c *gin.Context) { data := map[string]interface{}{ "foo": "bar", } @@ -20,6 +19,6 @@ func main() { }) // Listen and serve on 0.0.0.0:8080 - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/fa/docs/examples/map-as-querystring-or-postform.md b/src/content/docs/fa/docs/examples/map-as-querystring-or-postform.md index 5ed88b0b5c..f56774ae3f 100644 --- a/src/content/docs/fa/docs/examples/map-as-querystring-or-postform.md +++ b/src/content/docs/fa/docs/examples/map-as-querystring-or-postform.md @@ -1,6 +1,5 @@ --- title: "Map as querystring or postform parameters" - --- ```sh diff --git a/src/content/docs/fa/docs/examples/multipart-urlencoded-binding.md b/src/content/docs/fa/docs/examples/multipart-urlencoded-binding.md index 73fee286a1..e2e8073f1c 100644 --- a/src/content/docs/fa/docs/examples/multipart-urlencoded-binding.md +++ b/src/content/docs/fa/docs/examples/multipart-urlencoded-binding.md @@ -1,6 +1,5 @@ --- title: "Multipart/Urlencoded binding" - --- ```go diff --git a/src/content/docs/fa/docs/examples/multipart-urlencoded-form.md b/src/content/docs/fa/docs/examples/multipart-urlencoded-form.md index 04eab23737..21502a7b30 100644 --- a/src/content/docs/fa/docs/examples/multipart-urlencoded-form.md +++ b/src/content/docs/fa/docs/examples/multipart-urlencoded-form.md @@ -1,6 +1,5 @@ --- title: "Multipart/Urlencoded form" - --- ```go diff --git a/src/content/docs/fa/docs/examples/multiple-template.md b/src/content/docs/fa/docs/examples/multiple-template.md index 28b58c213b..9584899ac5 100644 --- a/src/content/docs/fa/docs/examples/multiple-template.md +++ b/src/content/docs/fa/docs/examples/multiple-template.md @@ -1,6 +1,5 @@ --- title: "Multitemplate" - --- Gin allow by default use only one html.Template. Check [a multitemplate render](https://github.com/gin-contrib/multitemplate) for using features like go 1.6 `block template`. diff --git a/src/content/docs/fa/docs/examples/only-bind-query-string.md b/src/content/docs/fa/docs/examples/only-bind-query-string.md index bdd6c174e7..18fd177106 100644 --- a/src/content/docs/fa/docs/examples/only-bind-query-string.md +++ b/src/content/docs/fa/docs/examples/only-bind-query-string.md @@ -1,6 +1,5 @@ --- title: "Only bind query string" - --- `ShouldBindQuery` function only binds the query params and not the post data. See the [detail information](https://github.com/gin-gonic/gin/issues/742#issuecomment-315953017). diff --git a/src/content/docs/fa/docs/examples/param-in-path.md b/src/content/docs/fa/docs/examples/param-in-path.md index b0a4a3b680..8ca7067ab7 100644 --- a/src/content/docs/fa/docs/examples/param-in-path.md +++ b/src/content/docs/fa/docs/examples/param-in-path.md @@ -1,6 +1,5 @@ --- title: "Parameters in path" - --- ```go diff --git a/src/content/docs/fa/docs/examples/pure-json.md b/src/content/docs/fa/docs/examples/pure-json.md index 5fbf8bfc1f..c5ac565e6a 100644 --- a/src/content/docs/fa/docs/examples/pure-json.md +++ b/src/content/docs/fa/docs/examples/pure-json.md @@ -1,6 +1,5 @@ --- title: "PureJSON" - --- Normally, JSON replaces special HTML characters with their unicode entities, e.g. `<` becomes `\u003c`. If you want to encode such characters literally, you can use PureJSON instead. @@ -8,23 +7,23 @@ This feature is unavailable in Go 1.6 and lower. ```go func main() { - r := gin.Default() + router := gin.Default() // Serves unicode entities - r.GET("/json", func(c *gin.Context) { + router.GET("/json", func(c *gin.Context) { c.JSON(200, gin.H{ "html": "Hello, world!", }) }) // Serves literal characters - r.GET("/purejson", func(c *gin.Context) { + router.GET("/purejson", func(c *gin.Context) { c.PureJSON(200, gin.H{ "html": "Hello, world!", }) }) // listen and serve on 0.0.0.0:8080 - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/fa/docs/examples/query-and-post-form.md b/src/content/docs/fa/docs/examples/query-and-post-form.md index 5c8e6d21e7..f02af5daa9 100644 --- a/src/content/docs/fa/docs/examples/query-and-post-form.md +++ b/src/content/docs/fa/docs/examples/query-and-post-form.md @@ -1,6 +1,5 @@ --- title: "Query and post form" - --- ```sh diff --git a/src/content/docs/fa/docs/examples/querystring-param.md b/src/content/docs/fa/docs/examples/querystring-param.md index cba891746e..afef1b61e8 100644 --- a/src/content/docs/fa/docs/examples/querystring-param.md +++ b/src/content/docs/fa/docs/examples/querystring-param.md @@ -1,6 +1,5 @@ --- title: "Query string parameters" - --- ```go diff --git a/src/content/docs/fa/docs/examples/redirects.md b/src/content/docs/fa/docs/examples/redirects.md index e62a9952ea..a682207aed 100644 --- a/src/content/docs/fa/docs/examples/redirects.md +++ b/src/content/docs/fa/docs/examples/redirects.md @@ -1,12 +1,11 @@ --- title: "Redirects" - --- Issuing a HTTP redirect is easy. Both internal and external locations are supported. ```go -r.GET("/test", func(c *gin.Context) { +router.GET("/test", func(c *gin.Context) { c.Redirect(http.StatusMovedPermanently, "http://www.google.com/") }) ``` @@ -14,7 +13,7 @@ r.GET("/test", func(c *gin.Context) { Issuing a HTTP redirect from POST. Refer to issue: [#444](https://github.com/gin-gonic/gin/issues/444) ```go -r.POST("/test", func(c *gin.Context) { +router.POST("/test", func(c *gin.Context) { c.Redirect(http.StatusFound, "/foo") }) ``` @@ -22,11 +21,11 @@ r.POST("/test", func(c *gin.Context) { Issuing a Router redirect, use `HandleContext` like below. ``` go -r.GET("/test", func(c *gin.Context) { +router.GET("/test", func(c *gin.Context) { c.Request.URL.Path = "/test2" - r.HandleContext(c) + router.HandleContext(c) }) -r.GET("/test2", func(c *gin.Context) { +router.GET("/test2", func(c *gin.Context) { c.JSON(200, gin.H{"hello": "world"}) }) ``` diff --git a/src/content/docs/fa/docs/examples/rendering.md b/src/content/docs/fa/docs/examples/rendering.md index c9c705c656..c8ec88e99d 100644 --- a/src/content/docs/fa/docs/examples/rendering.md +++ b/src/content/docs/fa/docs/examples/rendering.md @@ -1,18 +1,17 @@ --- title: "XML/JSON/YAML/ProtoBuf rendering" - --- ```go func main() { - r := gin.Default() + router := gin.Default() // gin.H is a shortcut for map[string]interface{} - r.GET("/someJSON", func(c *gin.Context) { + router.GET("/someJSON", func(c *gin.Context) { c.JSON(http.StatusOK, gin.H{"message": "hey", "status": http.StatusOK}) }) - r.GET("/moreJSON", func(c *gin.Context) { + router.GET("/moreJSON", func(c *gin.Context) { // You also can use a struct var msg struct { Name string `json:"user"` @@ -27,15 +26,15 @@ func main() { c.JSON(http.StatusOK, msg) }) - r.GET("/someXML", func(c *gin.Context) { + router.GET("/someXML", func(c *gin.Context) { c.XML(http.StatusOK, gin.H{"message": "hey", "status": http.StatusOK}) }) - r.GET("/someYAML", func(c *gin.Context) { + router.GET("/someYAML", func(c *gin.Context) { c.YAML(http.StatusOK, gin.H{"message": "hey", "status": http.StatusOK}) }) - r.GET("/someProtoBuf", func(c *gin.Context) { + router.GET("/someProtoBuf", func(c *gin.Context) { reps := []int64{int64(1), int64(2)} label := "test" // The specific definition of protobuf is written in the testdata/protoexample file. @@ -49,6 +48,6 @@ func main() { }) // Listen and serve on 0.0.0.0:8080 - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/fa/docs/examples/run-multiple-service.md b/src/content/docs/fa/docs/examples/run-multiple-service.md index 0dba2ab954..9ad1e6baf3 100644 --- a/src/content/docs/fa/docs/examples/run-multiple-service.md +++ b/src/content/docs/fa/docs/examples/run-multiple-service.md @@ -1,6 +1,5 @@ --- title: "Run multiple service" - --- See the [question](https://github.com/gin-gonic/gin/issues/346) and try the following example: diff --git a/src/content/docs/fa/docs/examples/secure-json.md b/src/content/docs/fa/docs/examples/secure-json.md index 82e63a4c44..4a2653eeed 100644 --- a/src/content/docs/fa/docs/examples/secure-json.md +++ b/src/content/docs/fa/docs/examples/secure-json.md @@ -1,18 +1,17 @@ --- title: "SecureJSON" - --- Using SecureJSON to prevent json hijacking. Default prepends `"while(1),"` to response body if the given struct is array values. ```go func main() { - r := gin.Default() + router := gin.Default() // You can also use your own secure json prefix - // r.SecureJsonPrefix(")]}',\n") + // router.SecureJsonPrefix(")]}',\n") - r.GET("/someJSON", func(c *gin.Context) { + router.GET("/someJSON", func(c *gin.Context) { names := []string{"lena", "austin", "foo"} // Will output : while(1);["lena","austin","foo"] @@ -20,6 +19,6 @@ func main() { }) // Listen and serve on 0.0.0.0:8080 - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/fa/docs/examples/security-headers.md b/src/content/docs/fa/docs/examples/security-headers.md index 9fa5378945..462712d7ff 100644 --- a/src/content/docs/fa/docs/examples/security-headers.md +++ b/src/content/docs/fa/docs/examples/security-headers.md @@ -1,6 +1,5 @@ --- title: "Security Headers" - --- It's important to use security headers to protect your web application from common security vulnerabilities. This example shows you how to add security headers to your Gin application and also how to avoid Host Header Injection related attacks (SSRF, Open Redirection). diff --git a/src/content/docs/fa/docs/examples/serving-data-from-reader.md b/src/content/docs/fa/docs/examples/serving-data-from-reader.md index 614db12ce2..1b871d5251 100644 --- a/src/content/docs/fa/docs/examples/serving-data-from-reader.md +++ b/src/content/docs/fa/docs/examples/serving-data-from-reader.md @@ -1,6 +1,5 @@ --- title: "Serving data from reader" - --- ```go diff --git a/src/content/docs/fa/docs/examples/serving-static-files.md b/src/content/docs/fa/docs/examples/serving-static-files.md index bda67da070..3f96749752 100644 --- a/src/content/docs/fa/docs/examples/serving-static-files.md +++ b/src/content/docs/fa/docs/examples/serving-static-files.md @@ -1,6 +1,5 @@ --- title: "Serving static files" - --- ```go diff --git a/src/content/docs/fa/docs/examples/support-lets-encrypt.md b/src/content/docs/fa/docs/examples/support-lets-encrypt.md index 841c1a7f99..50e6b21c3d 100644 --- a/src/content/docs/fa/docs/examples/support-lets-encrypt.md +++ b/src/content/docs/fa/docs/examples/support-lets-encrypt.md @@ -1,6 +1,5 @@ --- title: "Support Let's Encrypt" - --- example for 1-line LetsEncrypt HTTPS servers. @@ -16,10 +15,10 @@ import ( ) func main() { - r := gin.Default() + router := gin.Default() // Ping handler - r.GET("/ping", func(c *gin.Context) { + router.GET("/ping", func(c *gin.Context) { c.String(200, "pong") }) @@ -41,10 +40,10 @@ import ( ) func main() { - r := gin.Default() + router := gin.Default() // Ping handler - r.GET("/ping", func(c *gin.Context) { + router.GET("/ping", func(c *gin.Context) { c.String(200, "pong") }) diff --git a/src/content/docs/fa/docs/examples/upload-file/index.md b/src/content/docs/fa/docs/examples/upload-file/index.md index d0ff99e858..8399cc637b 100644 --- a/src/content/docs/fa/docs/examples/upload-file/index.md +++ b/src/content/docs/fa/docs/examples/upload-file/index.md @@ -1,6 +1,5 @@ --- title: "Upload files" - --- The section lists upload file api usage. diff --git a/src/content/docs/fa/docs/examples/upload-file/multiple-file.md b/src/content/docs/fa/docs/examples/upload-file/multiple-file.md index 185b7b5f66..07ee7e0626 100644 --- a/src/content/docs/fa/docs/examples/upload-file/multiple-file.md +++ b/src/content/docs/fa/docs/examples/upload-file/multiple-file.md @@ -1,6 +1,5 @@ --- title: "Multiple files" - --- See the detail [example code](https://github.com/gin-gonic/examples/tree/master/upload-file/multiple). @@ -19,7 +18,7 @@ func main() { log.Println(file.Filename) // Upload the file to specific dst. - c.SaveUploadedFile(file, dst) + c.SaveUploadedFile(file, "./files/" + file.Filename) } c.String(http.StatusOK, fmt.Sprintf("%d files uploaded!", len(files))) }) diff --git a/src/content/docs/fa/docs/examples/upload-file/single-file.md b/src/content/docs/fa/docs/examples/upload-file/single-file.md index 5fe274dc7c..f9db82e0d8 100644 --- a/src/content/docs/fa/docs/examples/upload-file/single-file.md +++ b/src/content/docs/fa/docs/examples/upload-file/single-file.md @@ -1,6 +1,5 @@ --- title: "Single file" - --- References issue [#774](https://github.com/gin-gonic/gin/issues/774) and detail [example code](https://github.com/gin-gonic/examples/tree/master/upload-file/single). @@ -20,7 +19,7 @@ func main() { log.Println(file.Filename) // Upload the file to specific dst. - c.SaveUploadedFile(file, dst) + c.SaveUploadedFile(file, "./files/" + file.Filename) c.String(http.StatusOK, fmt.Sprintf("'%s' uploaded!", file.Filename)) }) diff --git a/src/content/docs/fa/docs/examples/using-basicauth-middleware.md b/src/content/docs/fa/docs/examples/using-basicauth-middleware.md index cc68db4a0d..a1f1a03ebc 100644 --- a/src/content/docs/fa/docs/examples/using-basicauth-middleware.md +++ b/src/content/docs/fa/docs/examples/using-basicauth-middleware.md @@ -1,6 +1,5 @@ --- title: "Using BasicAuth middleware" - --- ```go @@ -12,11 +11,11 @@ var secrets = gin.H{ } func main() { - r := gin.Default() + router := gin.Default() // Group using gin.BasicAuth() middleware // gin.Accounts is a shortcut for map[string]string - authorized := r.Group("/admin", gin.BasicAuth(gin.Accounts{ + authorized := router.Group("/admin", gin.BasicAuth(gin.Accounts{ "foo": "bar", "austin": "1234", "lena": "hello2", @@ -36,6 +35,6 @@ func main() { }) // Listen and serve on 0.0.0.0:8080 - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/fa/docs/examples/using-middleware.md b/src/content/docs/fa/docs/examples/using-middleware.md index 5fc4154dbf..7c44cd3eba 100644 --- a/src/content/docs/fa/docs/examples/using-middleware.md +++ b/src/content/docs/fa/docs/examples/using-middleware.md @@ -1,6 +1,5 @@ --- title: "Using middleware" - --- ```go @@ -11,18 +10,18 @@ func main() { // Global middleware // Logger middleware will write the logs to gin.DefaultWriter even if you set with GIN_MODE=release. // By default gin.DefaultWriter = os.Stdout - r.Use(gin.Logger()) + router.Use(gin.Logger()) // Recovery middleware recovers from any panics and writes a 500 if there was one. - r.Use(gin.Recovery()) + router.Use(gin.Recovery()) // Per route middleware, you can add as many as you desire. - r.GET("/benchmark", MyBenchLogger(), benchEndpoint) + router.GET("/benchmark", MyBenchLogger(), benchEndpoint) // Authorization group - // authorized := r.Group("/", AuthRequired()) + // authorized := router.Group("/", AuthRequired()) // exactly the same as: - authorized := r.Group("/") + authorized := router.Group("/") // per group middleware! in this case we use the custom created // AuthRequired() middleware just in the "authorized" group. authorized.Use(AuthRequired()) @@ -37,7 +36,7 @@ func main() { } // Listen and serve on 0.0.0.0:8080 - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/fa/docs/examples/without-middleware.md b/src/content/docs/fa/docs/examples/without-middleware.md index 6ef54bda06..5ae5558125 100644 --- a/src/content/docs/fa/docs/examples/without-middleware.md +++ b/src/content/docs/fa/docs/examples/without-middleware.md @@ -1,6 +1,5 @@ --- title: "Without middleware by default" - --- Use diff --git a/src/content/docs/fa/docs/examples/write-log.md b/src/content/docs/fa/docs/examples/write-log.md index 759423de4b..a26be48277 100644 --- a/src/content/docs/fa/docs/examples/write-log.md +++ b/src/content/docs/fa/docs/examples/write-log.md @@ -1,6 +1,5 @@ --- title: "How to write log file" - --- ```go diff --git a/src/content/docs/fa/docs/faq/index.md b/src/content/docs/fa/docs/faq/index.md index ad348f11fe..02a2c66253 100644 --- a/src/content/docs/fa/docs/faq/index.md +++ b/src/content/docs/fa/docs/faq/index.md @@ -1,6 +1,5 @@ --- title: "FAQ" - sidebar: order: 9 --- diff --git a/src/content/docs/fa/docs/features/index.md b/src/content/docs/fa/docs/features/index.md index 8014b6e541..618798d3b8 100644 --- a/src/content/docs/fa/docs/features/index.md +++ b/src/content/docs/fa/docs/features/index.md @@ -1,6 +1,5 @@ --- title: "امکانات" - sidebar: order: 4 --- diff --git a/src/content/docs/fa/docs/index.md b/src/content/docs/fa/docs/index.md index 426d022688..ef1ee0eee4 100644 --- a/src/content/docs/fa/docs/index.md +++ b/src/content/docs/fa/docs/index.md @@ -1,8 +1,7 @@ --- title: "اسناد" -linkTitle: "اسناد/" sidebar: - order: 1 + order: 20 --- ## Gin چیست ؟ diff --git a/src/content/docs/fa/docs/introduction/index.md b/src/content/docs/fa/docs/introduction/index.md old mode 100755 new mode 100644 index dd2e3e1215..2d7c1356ac --- a/src/content/docs/fa/docs/introduction/index.md +++ b/src/content/docs/fa/docs/introduction/index.md @@ -1,6 +1,5 @@ --- title: "مقدمه" - sidebar: order: 1 --- diff --git a/src/content/docs/fa/docs/jsoniter/index.md b/src/content/docs/fa/docs/jsoniter/index.md index 242b2987a6..88751dbdb2 100644 --- a/src/content/docs/fa/docs/jsoniter/index.md +++ b/src/content/docs/fa/docs/jsoniter/index.md @@ -1,6 +1,5 @@ --- title: "Jsoniter" - sidebar: order: 5 --- diff --git a/src/content/docs/fa/docs/quickstart/index.md b/src/content/docs/fa/docs/quickstart/index.md index 36d2fd4fdf..edede0a121 100644 --- a/src/content/docs/fa/docs/quickstart/index.md +++ b/src/content/docs/fa/docs/quickstart/index.md @@ -1,6 +1,5 @@ --- title: "شروع سریع" - sidebar: order: 2 --- @@ -70,13 +69,13 @@ package main import "github.com/gin-gonic/gin" func main() { - r := gin.Default() - r.GET("/ping", func(c *gin.Context) { + router := gin.Default() + router.GET("/ping", func(c *gin.Context) { c.JSON(200, gin.H{ "message": "pong", }) }) - r.Run() // listen and serve on 0.0.0.0:8080 + router.Run() // listen and serve on 0.0.0.0:8080 } ``` diff --git a/src/content/docs/fa/docs/testing/index.md b/src/content/docs/fa/docs/testing/index.md index 40ec4d3a6e..b3d01e7408 100644 --- a/src/content/docs/fa/docs/testing/index.md +++ b/src/content/docs/fa/docs/testing/index.md @@ -1,6 +1,5 @@ --- title: "تست" - sidebar: order: 7 --- @@ -20,15 +19,15 @@ type User struct { } func setupRouter() *gin.Engine { - r := gin.Default() - r.GET("/ping", func(c *gin.Context) { + router := gin.Default() + router.GET("/ping", func(c *gin.Context) { c.String(200, "pong") }) return r } func postUser(r *gin.Engine) *gin.Engine { - r.POST("/user/add", func(c *gin.Context) { + router.POST("/user/add", func(c *gin.Context) { var user User c.BindJSON(&user) c.JSON(200, user) @@ -39,7 +38,7 @@ func postUser(r *gin.Engine) *gin.Engine { func main() { r := setupRouter() r = postUser(r) - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/fa/docs/users/index.md b/src/content/docs/fa/docs/users/index.md index bd3f67a877..d055659ef1 100644 --- a/src/content/docs/fa/docs/users/index.md +++ b/src/content/docs/fa/docs/users/index.md @@ -1,6 +1,5 @@ --- title: "کاربران" - sidebar: order: 8 --- diff --git a/src/content/docs/ja/blog/index.md b/src/content/docs/ja/blog/index.md index e01b20dcea..dbc10e1f20 100644 --- a/src/content/docs/ja/blog/index.md +++ b/src/content/docs/ja/blog/index.md @@ -1,6 +1,5 @@ --- title: "ブログ" -linkTitle: "ブログ" sidebar: order: 30 --- diff --git a/src/content/docs/ja/blog/news/how-to-build-one-effective-middleware.md b/src/content/docs/ja/blog/news/how-to-build-one-effective-middleware.md index d93e7cbc3e..f33833df25 100644 --- a/src/content/docs/ja/blog/news/how-to-build-one-effective-middleware.md +++ b/src/content/docs/ja/blog/news/how-to-build-one-effective-middleware.md @@ -1,7 +1,7 @@ --- title: "How to build one effective middleware?" linkTitle: "How to build one effective middleware?" -date: 2019-02-26 +lastUpdated: 2019-02-26 --- ## Constituent parts diff --git a/src/content/docs/ja/blog/releases/release13.md b/src/content/docs/ja/blog/releases/release13.md index 43f4656f4e..8d5057ad72 100644 --- a/src/content/docs/ja/blog/releases/release13.md +++ b/src/content/docs/ja/blog/releases/release13.md @@ -1,7 +1,7 @@ --- title: "Gin 1.3.0 is released" linkTitle: "Gin 1.3.0 is released" -date: 2018-08-14 +lastUpdated: 2018-08-14 --- ### CHANGELOG diff --git a/src/content/docs/ja/blog/releases/release14.md b/src/content/docs/ja/blog/releases/release14.md index 23fd648294..c145f3b520 100644 --- a/src/content/docs/ja/blog/releases/release14.md +++ b/src/content/docs/ja/blog/releases/release14.md @@ -1,7 +1,7 @@ --- title: "Gin 1.4.0 is released" linkTitle: "Gin 1.4.0 is released" -date: 2019-05-08 +lastUpdated: 2019-05-08 --- ### CHANGELOG diff --git a/src/content/docs/ja/blog/releases/release15.md b/src/content/docs/ja/blog/releases/release15.md index e4593b3ceb..4f5707a177 100644 --- a/src/content/docs/ja/blog/releases/release15.md +++ b/src/content/docs/ja/blog/releases/release15.md @@ -1,7 +1,7 @@ --- title: "Gin 1.5.0 is released" linkTitle: "Gin 1.5.0 is released" -date: 2019-11-28 +lastUpdated: 2019-11-28 --- ### CHANGELOG diff --git a/src/content/docs/ja/docs/benchmarks/index.md b/src/content/docs/ja/docs/benchmarks/index.md index 029d5f56d8..fc65b89707 100644 --- a/src/content/docs/ja/docs/benchmarks/index.md +++ b/src/content/docs/ja/docs/benchmarks/index.md @@ -1,6 +1,5 @@ --- title: "ベンチマーク" - sidebar: order: 3 --- diff --git a/src/content/docs/ja/docs/deployment/index.md b/src/content/docs/ja/docs/deployment/index.md index 53e55fc7e0..6bd2e9caa0 100644 --- a/src/content/docs/ja/docs/deployment/index.md +++ b/src/content/docs/ja/docs/deployment/index.md @@ -1,20 +1,129 @@ --- title: "Deployment" - sidebar: order: 6 --- -Ginのプロジェクトはあらゆるクラウドサービス上に簡単にデプロイできます。 +Gin のプロジェクトはあらゆるクラウドサービス上に簡単にデプロイできます。 ## [Render](https://render.com) -RenderはGoをネイティブサポートするモダンなクラウドプラットフォームで、フルマネージドSSL、データベース、ダウンタイムのないデプロイ、HTTP/2、そしてwebsocketもサポートしています。 +Render は Go をネイティブサポートするモダンなクラウドプラットフォームで、フルマネージド SSL、データベース、ダウンタイムのないデプロイ、HTTP/2、そして websocket もサポートしています。 -Renderの[Ginプロジェクトのデプロイガイド](https://render.com/docs/deploy-go-gin)に詳細な記述があります。 +Render の[Gin プロジェクトのデプロイガイド](https://render.com/docs/deploy-go-gin)に詳細な記述があります。 ## [Google App Engine](https://cloud.google.com/appengine/) -GAEでGoのアプリケーションをデプロイするには2つの方法があります。スタンダード環境は簡単に使用できますが、カスタマイズ性は低く、セキュリティ上の問題で[システムコール](https://github.com/gin-gonic/gin/issues/1639)の使用は避けるべきです。フレキシブル環境はあらゆるフレームワークやライブラリが使用できます。 +GAE で Go のアプリケーションをデプロイするには 2 つの方法があります。スタンダード環境は簡単に使用できますが、カスタマイズ性は低く、セキュリティ上の問題で[システムコール](https://github.com/gin-gonic/gin/issues/1639)の使用は避けるべきです。フレキシブル環境はあらゆるフレームワークやライブラリが使用できます。 さらに学んだり、より適した環境を探すには[Google App Engine 上での Go の使用](https://cloud.google.com/appengine/docs/go/)を参考にしてください。 + +## Self Hosted + +Gin projects can also be deployed in a self-hosted manner. Deployment architecture and security considerations vary depending on the target environment. The following section only presents a high level overview of configuration options to consider when planning the deployment. + +## Configuration Options + +Gin project deployments can be tuned by using environment variables or directly in code. + +The following environment variables are available for configuring Gin: + +| Environment Variable | Description | +| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| PORT | The TCP port to listen on when starting the Gin server with `router.Run()` (i.e. without any arguments). | +| GIN_MODE | Set to one of `debug`, `release`, or `test`. Handles management of Gin modes, such as when to emit debug outputs. Can also be set in code using `gin.SetMode(gin.ReleaseMode)` or `gin.SetMode(gin.TestMode)` | + +The following code can be used to configure Gin. + +```go +// Don't specify the bind address or port for Gin. Defaults to binding on all interfaces on port 8080. +// Can use the `PORT` environment variable to change the listen port when using `Run()` without any arguments. +router := gin.Default() +router.Run() + +// Specify the bind address and port for Gin. +router := gin.Default() +router.Run("192.168.1.100:8080") + +// Specify only the listen port. Will bind on all interfaces. +router := gin.Default() +router.Run(":8080") + +// Set which IP addresses or CIDRs, are considered to be trusted for setting headers to document real client IP addresses. +// See the documentation for additional details. +router := gin.Default() +router.SetTrustedProxies([]string{"192.168.1.2"}) +``` + +## Don't trust all proxies + +Gin lets you specify which headers to hold the real client IP (if any), +as well as specifying which proxies (or direct clients) you trust to +specify one of these headers. + +Use function `SetTrustedProxies()` on your `gin.Engine` to specify network addresses +or network CIDRs from where clients which their request headers related to client +IP can be trusted. They can be IPv4 addresses, IPv4 CIDRs, IPv6 addresses or +IPv6 CIDRs. + +**Attention:** Gin trust all proxies by default if you don't specify a trusted +proxy using the function above, **this is NOT safe**. At the same time, if you don't +use any proxy, you can disable this feature by using `Engine.SetTrustedProxies(nil)`, +then `Context.ClientIP()` will return the remote address directly to avoid some +unnecessary computation. + +```go +import ( + "fmt" + + "github.com/gin-gonic/gin" +) + +func main() { + router := gin.Default() + router.SetTrustedProxies([]string{"192.168.1.2"}) + + router.GET("/", func(c *gin.Context) { + // If the client is 192.168.1.2, use the X-Forwarded-For + // header to deduce the original client IP from the trust- + // worthy parts of that header. + // Otherwise, simply return the direct client IP + fmt.Printf("ClientIP: %s\n", c.ClientIP()) + }) + router.Run() +} +``` + +**Notice:** If you are using a CDN service, you can set the `Engine.TrustedPlatform` +to skip TrustedProxies check, it has a higher priority than TrustedProxies. +Look at the example below: + +```go +import ( + "fmt" + + "github.com/gin-gonic/gin" +) + +func main() { + router := gin.Default() + // Use predefined header gin.PlatformXXX + // Google App Engine + router.TrustedPlatform = gin.PlatformGoogleAppEngine + // Cloudflare + router.TrustedPlatform = gin.PlatformCloudflare + // Fly.io + router.TrustedPlatform = gin.PlatformFlyIO + // Or, you can set your own trusted request header. But be sure your CDN + // prevents users from passing this header! For example, if your CDN puts + // the client IP in X-CDN-Client-IP: + router.TrustedPlatform = "X-CDN-Client-IP" + + router.GET("/", func(c *gin.Context) { + // If you set TrustedPlatform, ClientIP() will resolve the + // corresponding header and return IP directly + fmt.Printf("ClientIP: %s\n", c.ClientIP()) + }) + router.Run() +} +``` diff --git a/src/content/docs/ja/docs/examples/ascii-json.md b/src/content/docs/ja/docs/examples/ascii-json.md index cfb04242f4..78a032ced7 100644 --- a/src/content/docs/ja/docs/examples/ascii-json.md +++ b/src/content/docs/ja/docs/examples/ascii-json.md @@ -1,6 +1,5 @@ --- title: "AsciiJSON" - --- AsciiJSON メソッドを使うことで、ASCII 文字列以外をエスケープした @@ -8,9 +7,9 @@ ASCII 文字列のみの JSON を出力できます。 ```go func main() { - r := gin.Default() + router := gin.Default() - r.GET("/someJSON", func(c *gin.Context) { + router.GET("/someJSON", func(c *gin.Context) { data := map[string]interface{}{ "lang": "GO语言", "tag": "
", @@ -21,6 +20,6 @@ func main() { }) // 0.0.0.0:8080 でサーバーを立てます。 - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/ja/docs/examples/bind-body-into-dirrerent-structs.md b/src/content/docs/ja/docs/examples/bind-body-into-dirrerent-structs.md index 593e4cd05a..ab89a6afca 100644 --- a/src/content/docs/ja/docs/examples/bind-body-into-dirrerent-structs.md +++ b/src/content/docs/ja/docs/examples/bind-body-into-dirrerent-structs.md @@ -1,6 +1,5 @@ --- title: "body を異なる構造体にバインドするには" - --- 通常のリクエスト本文をバインドするメソッドたちは、`c.Request.Body` を消費します。よってそれらのメソッドは複数回呼び出すことができません。 diff --git a/src/content/docs/ja/docs/examples/bind-form-data-request-with-custom-struct.md b/src/content/docs/ja/docs/examples/bind-form-data-request-with-custom-struct.md index f7900823c4..5e7b3e3471 100644 --- a/src/content/docs/ja/docs/examples/bind-form-data-request-with-custom-struct.md +++ b/src/content/docs/ja/docs/examples/bind-form-data-request-with-custom-struct.md @@ -1,6 +1,5 @@ --- title: "フォーム投稿されたリクエストを構造体にバインドする" - --- 下記のサンプルコードは、カスタム構造体を使っています。 @@ -55,18 +54,18 @@ func GetDataD(c *gin.Context) { } func main() { - r := gin.Default() - r.GET("/getb", GetDataB) - r.GET("/getc", GetDataC) - r.GET("/getd", GetDataD) + router := gin.Default() + router.GET("/getb", GetDataB) + router.GET("/getc", GetDataC) + router.GET("/getd", GetDataD) - r.Run() + router.Run() } ``` `curl` を使った結果です。 -``` +```bash $ curl "http://localhost:8080/getb?field_a=hello&field_b=world" {"a":{"FieldA":"hello"},"b":"world"} $ curl "http://localhost:8080/getc?field_a=hello&field_c=world" diff --git a/src/content/docs/ja/docs/examples/bind-html-checkbox.md b/src/content/docs/ja/docs/examples/bind-html-checkbox.md index 6b9ee36c9c..ab0ca6cb4e 100644 --- a/src/content/docs/ja/docs/examples/bind-html-checkbox.md +++ b/src/content/docs/ja/docs/examples/bind-html-checkbox.md @@ -1,6 +1,5 @@ --- title: "HTMLチェックボックスをバインドする" - --- [詳細な情報](https://github.com/gin-gonic/gin/issues/129#issuecomment-124260092) はこちら。 diff --git a/src/content/docs/ja/docs/examples/bind-query-or-post.md b/src/content/docs/ja/docs/examples/bind-query-or-post.md index 4400bcc575..5dbe34fefb 100644 --- a/src/content/docs/ja/docs/examples/bind-query-or-post.md +++ b/src/content/docs/ja/docs/examples/bind-query-or-post.md @@ -1,6 +1,5 @@ --- title: "クエリ文字列あるいはポストされたデータをバインドする" - --- [詳細](https://github.com/gin-gonic/gin/issues/742#issuecomment-264681292) はこちら。 diff --git a/src/content/docs/ja/docs/examples/bind-single-binary-with-template.md b/src/content/docs/ja/docs/examples/bind-single-binary-with-template.md index c3afa7d7f9..2974bfcb8a 100644 --- a/src/content/docs/ja/docs/examples/bind-single-binary-with-template.md +++ b/src/content/docs/ja/docs/examples/bind-single-binary-with-template.md @@ -1,6 +1,5 @@ --- title: "テンプレートを含めた1つのバイナリをビルドする" - --- [go-assets](https://github.com/jessevdk/go-assets) を利用することで、サーバーアプリケーションを、テンプレートを含む1つのバイナリにまとめることができます。 @@ -15,12 +14,12 @@ func main() { if err != nil { panic(err) } - r.SetHTMLTemplate(t) + router.SetHTMLTemplate(t) - r.GET("/", func(c *gin.Context) { + router.GET("/", func(c *gin.Context) { c.HTML(http.StatusOK, "/html/index.tmpl", nil) }) - r.Run(":8080") + router.Run(":8080") } // loadTemplate は go-assets-builder によって埋め込まれたテンプレートたちをロードします。 diff --git a/src/content/docs/ja/docs/examples/bind-uri.md b/src/content/docs/ja/docs/examples/bind-uri.md index b51626248b..97bb567fd7 100644 --- a/src/content/docs/ja/docs/examples/bind-uri.md +++ b/src/content/docs/ja/docs/examples/bind-uri.md @@ -1,6 +1,5 @@ --- title: "URLをバインドする" - --- [詳細](https://github.com/gin-gonic/gin/issues/846) はこちら。 diff --git a/src/content/docs/ja/docs/examples/binding-and-validation.md b/src/content/docs/ja/docs/examples/binding-and-validation.md index 7baa1d0507..d4625e2825 100644 --- a/src/content/docs/ja/docs/examples/binding-and-validation.md +++ b/src/content/docs/ja/docs/examples/binding-and-validation.md @@ -1,6 +1,5 @@ --- title: "モデルへのバインディングとバリデーションする" - --- リクエストボディをある型にバインドするには、モデルへのバインディングを利用してください。Gin は今のところ JSON, XML, YAML と標準的なフォームの値(foo=bar&boo=baz)をサポートしています。 diff --git a/src/content/docs/ja/docs/examples/controlling-log-output-coloring.md b/src/content/docs/ja/docs/examples/controlling-log-output-coloring.md index 556f9bb1cd..4c0fc0261f 100644 --- a/src/content/docs/ja/docs/examples/controlling-log-output-coloring.md +++ b/src/content/docs/ja/docs/examples/controlling-log-output-coloring.md @@ -1,6 +1,5 @@ --- title: "ログ出力の色付けを制御する" - --- デフォルトでは、ログ出力は検出された TTY に応じて色付けされます。 diff --git a/src/content/docs/ja/docs/examples/cookie.md b/src/content/docs/ja/docs/examples/cookie.md index 638d28558b..edaa36a993 100644 --- a/src/content/docs/ja/docs/examples/cookie.md +++ b/src/content/docs/ja/docs/examples/cookie.md @@ -1,8 +1,9 @@ --- -title: "cookieの設定と取得" - +title: "Cookie" --- +cookieの設定と取得 + ```go import ( "fmt" @@ -29,3 +30,9 @@ func main() { router.Run() } ``` + +Delete cookie by set max age to -1. + +```go +c.SetCookie("gin_cookie", "test", -1, "/", "localhost", false, true) +``` diff --git a/src/content/docs/ja/docs/examples/custom-http-config.md b/src/content/docs/ja/docs/examples/custom-http-config.md index 870d7f670c..13347b7f28 100644 --- a/src/content/docs/ja/docs/examples/custom-http-config.md +++ b/src/content/docs/ja/docs/examples/custom-http-config.md @@ -1,6 +1,5 @@ --- title: "カスタム HTTP 設定" - --- 以下のように `http.ListenAndServe()` を直接使ってください。 diff --git a/src/content/docs/ja/docs/examples/custom-log-format.md b/src/content/docs/ja/docs/examples/custom-log-format.md index 7e17f736bf..abc123eb5e 100644 --- a/src/content/docs/ja/docs/examples/custom-log-format.md +++ b/src/content/docs/ja/docs/examples/custom-log-format.md @@ -1,6 +1,5 @@ --- title: "カスタムログファイル" - --- 例: diff --git a/src/content/docs/ja/docs/examples/custom-middleware.md b/src/content/docs/ja/docs/examples/custom-middleware.md index a553491ff4..1607a6137d 100644 --- a/src/content/docs/ja/docs/examples/custom-middleware.md +++ b/src/content/docs/ja/docs/examples/custom-middleware.md @@ -1,6 +1,5 @@ --- title: "カスタムミドルウェア" - --- ```go @@ -27,9 +26,9 @@ func Logger() gin.HandlerFunc { func main() { r := gin.New() - r.Use(Logger()) + router.Use(Logger()) - r.GET("/test", func(c *gin.Context) { + router.GET("/test", func(c *gin.Context) { example := c.MustGet("example").(string) // "12345" が表示される @@ -37,7 +36,7 @@ func main() { }) // 0.0.0.0:8080 でサーバーを立てます。 - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/ja/docs/examples/custom-validators.md b/src/content/docs/ja/docs/examples/custom-validators.md index d7a7466b4c..8f9e53f639 100644 --- a/src/content/docs/ja/docs/examples/custom-validators.md +++ b/src/content/docs/ja/docs/examples/custom-validators.md @@ -1,6 +1,5 @@ --- title: "カスタムバリデーション" - --- カスタムしたバリデーションを使用することもできます。[サンプルコード](https://github.com/gin-gonic/examples/tree/master/struct-lvl-validations) も見てみてください。 diff --git a/src/content/docs/ja/docs/examples/define-format-for-the-log-of-routes.md b/src/content/docs/ja/docs/examples/define-format-for-the-log-of-routes.md index 183cedd4c8..3364352772 100644 --- a/src/content/docs/ja/docs/examples/define-format-for-the-log-of-routes.md +++ b/src/content/docs/ja/docs/examples/define-format-for-the-log-of-routes.md @@ -1,6 +1,5 @@ --- title: "ルーティングログのフォーマットを定義する" - --- デフォルトのルーティングログは以下のようになります。 @@ -22,24 +21,24 @@ import ( ) func main() { - r := gin.Default() + router := gin.Default() gin.DebugPrintRouteFunc = func(httpMethod, absolutePath, handlerName string, nuHandlers int) { log.Printf("endpoint %v %v %v %v\n", httpMethod, absolutePath, handlerName, nuHandlers) } - r.POST("/foo", func(c *gin.Context) { + router.POST("/foo", func(c *gin.Context) { c.JSON(http.StatusOK, "foo") }) - r.GET("/bar", func(c *gin.Context) { + router.GET("/bar", func(c *gin.Context) { c.JSON(http.StatusOK, "bar") }) - r.GET("/status", func(c *gin.Context) { + router.GET("/status", func(c *gin.Context) { c.JSON(http.StatusOK, "ok") }) // http://0.0.0.0:8080 でサーバーを立てる - r.Run() + router.Run() } ``` diff --git a/src/content/docs/ja/docs/examples/goroutines-inside-a-middleware.md b/src/content/docs/ja/docs/examples/goroutines-inside-a-middleware.md index 013c07163e..9152218cfe 100644 --- a/src/content/docs/ja/docs/examples/goroutines-inside-a-middleware.md +++ b/src/content/docs/ja/docs/examples/goroutines-inside-a-middleware.md @@ -1,15 +1,14 @@ --- title: "ミドルウェア内の Goroutine" - --- 新しい goroutine をミドルウェアやハンドラー内で生成する場合、goroutine の内部でオリジナルの context を **使用しないでください**。読み込み用のコピーを使ってください。 ```go func main() { - r := gin.Default() + router := gin.Default() - r.GET("/long_async", func(c *gin.Context) { + router.GET("/long_async", func(c *gin.Context) { // goroutine 内で使用するコピーを生成します cCp := c.Copy() go func() { @@ -21,7 +20,7 @@ func main() { }() }) - r.GET("/long_sync", func(c *gin.Context) { + router.GET("/long_sync", func(c *gin.Context) { // time.Sleep() を使って、長時間かかる処理をシミュレートします。5秒です。 time.Sleep(5 * time.Second) @@ -30,7 +29,7 @@ func main() { }) // 0.0.0.0:8080 でサーバーを立てます。 - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/ja/docs/examples/graceful-restart-or-stop.md b/src/content/docs/ja/docs/examples/graceful-restart-or-stop.md index 86b998af8d..36cc689f4c 100644 --- a/src/content/docs/ja/docs/examples/graceful-restart-or-stop.md +++ b/src/content/docs/ja/docs/examples/graceful-restart-or-stop.md @@ -1,6 +1,5 @@ --- title: "graceful restart と stop" - --- graceful restart と stop をしたいですか? @@ -61,9 +60,9 @@ func main() { // シグナル割り込みを待ち、タイムアウト時間が5秒の graceful shutdown をする quit := make(chan os.Signal, 1) - // kill (no param) default send syscanll.SIGTERM + // kill (no param) default sends syscall.SIGTERM // kill -2 is syscall.SIGINT - // kill -9 is syscall. SIGKILL but can"t be catch, so don't need add it + // kill -9 is syscall. SIGKILL but can't be caught, so don't need add it signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM) <-quit log.Println("Shutdown Server ...") diff --git a/src/content/docs/ja/docs/examples/grouping-routes.md b/src/content/docs/ja/docs/examples/grouping-routes.md index ac9c06c02d..bedd3c819d 100644 --- a/src/content/docs/ja/docs/examples/grouping-routes.md +++ b/src/content/docs/ja/docs/examples/grouping-routes.md @@ -1,6 +1,5 @@ --- title: "ルーティングをグループ化する" - --- ```go @@ -8,16 +7,16 @@ func main() { router := gin.Default() // v1 のグループ - v1 := router.Group("/v1") { + v1 := router.Group("/v1") v1.POST("/login", loginEndpoint) v1.POST("/submit", submitEndpoint) v1.POST("/read", readEndpoint) } // v2 のグループ - v2 := router.Group("/v2") { + v2 := router.Group("/v2") v2.POST("/login", loginEndpoint) v2.POST("/submit", submitEndpoint) v2.POST("/read", readEndpoint) diff --git a/src/content/docs/ja/docs/examples/html-rendering.md b/src/content/docs/ja/docs/examples/html-rendering.md index 10768fae07..07feb8a4a9 100644 --- a/src/content/docs/ja/docs/examples/html-rendering.md +++ b/src/content/docs/ja/docs/examples/html-rendering.md @@ -1,6 +1,5 @@ --- title: "HTML をレンダリングする" - --- LoadHTMLGlob() あるいは LoadHTMLFiles() メソッドを使用してください。 @@ -93,9 +92,9 @@ func main() { 独自のデリミタを使用することもできます。 ```go - r := gin.Default() - r.Delims("{[{", "}]}") - r.LoadHTMLGlob("/path/to/templates") + router := gin.Default() + router.Delims("{[{", "}]}") + router.LoadHTMLGlob("/path/to/templates") ``` ### カスタムテンプレート関数 diff --git a/src/content/docs/ja/docs/examples/http-method.md b/src/content/docs/ja/docs/examples/http-method.md index 4fac179626..f4d2eeccea 100644 --- a/src/content/docs/ja/docs/examples/http-method.md +++ b/src/content/docs/ja/docs/examples/http-method.md @@ -1,6 +1,5 @@ --- title: "GET,POST,PUT,PATCH,DELETE,OPTIONS メソッドを使う" - --- ```go diff --git a/src/content/docs/ja/docs/examples/http2-server-push.md b/src/content/docs/ja/docs/examples/http2-server-push.md index b6fad27e93..225b08770e 100644 --- a/src/content/docs/ja/docs/examples/http2-server-push.md +++ b/src/content/docs/ja/docs/examples/http2-server-push.md @@ -1,6 +1,5 @@ --- title: "HTTP/2 サーバープッシュ" - --- http.Pusher は **go1.8+** 以降でのみサポートしています。 詳細な情報は [golang blog](https://blog.golang.org/h2push) を見てください。 @@ -28,11 +27,11 @@ var html = template.Must(template.New("https").Parse(` `)) func main() { - r := gin.Default() - r.Static("/assets", "./assets") - r.SetHTMLTemplate(html) + router := gin.Default() + router.Static("/assets", "./assets") + router.SetHTMLTemplate(html) - r.GET("/", func(c *gin.Context) { + router.GET("/", func(c *gin.Context) { if pusher := c.Writer.Pusher(); pusher != nil { // サーバープッシュするために pusher.Push() を使う if err := pusher.Push("/assets/app.js", nil); err != nil { @@ -45,7 +44,7 @@ func main() { }) // https://127.0.0.1:8080 でサーバーを立てる - r.RunTLS(":8080", "./testdata/server.pem", "./testdata/server.key") + router.RunTLS(":8080", "./testdata/server.pem", "./testdata/server.key") } ``` diff --git a/src/content/docs/ja/docs/examples/index.md b/src/content/docs/ja/docs/examples/index.md index ae97f0d4f4..b613db80da 100644 --- a/src/content/docs/ja/docs/examples/index.md +++ b/src/content/docs/ja/docs/examples/index.md @@ -1,6 +1,5 @@ --- title: "APIの使い方のサンプル" - sidebar: order: 6 --- diff --git a/src/content/docs/ja/docs/examples/jsonp.md b/src/content/docs/ja/docs/examples/jsonp.md index df51ec131c..75e9d80316 100644 --- a/src/content/docs/ja/docs/examples/jsonp.md +++ b/src/content/docs/ja/docs/examples/jsonp.md @@ -1,15 +1,14 @@ --- title: "JSONP をレンダリングする" - --- JSONP を使うことで、別のドメインのサーバーからレスポンスを受け取ることができます。callback をクエリ文字列に指定することで、レスポンスに callback を追加します。 ```go func main() { - r := gin.Default() + router := gin.Default() - r.GET("/JSONP?callback=x", func(c *gin.Context) { + router.GET("/JSONP?callback=x", func(c *gin.Context) { data := map[string]interface{}{ "foo": "bar", } @@ -20,7 +19,7 @@ func main() { }) // 0.0.0.0:8080 でサーバーを立てます。 - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/ja/docs/examples/map-as-querystring-or-postform.md b/src/content/docs/ja/docs/examples/map-as-querystring-or-postform.md index 7bdda1b861..efafb96a55 100644 --- a/src/content/docs/ja/docs/examples/map-as-querystring-or-postform.md +++ b/src/content/docs/ja/docs/examples/map-as-querystring-or-postform.md @@ -1,6 +1,5 @@ --- title: "クエリ文字列やフォーム投稿によるパラメータをマッピングする" - --- ```sh diff --git a/src/content/docs/ja/docs/examples/multipart-urlencoded-binding.md b/src/content/docs/ja/docs/examples/multipart-urlencoded-binding.md index e50521516b..9c792159c9 100644 --- a/src/content/docs/ja/docs/examples/multipart-urlencoded-binding.md +++ b/src/content/docs/ja/docs/examples/multipart-urlencoded-binding.md @@ -1,6 +1,5 @@ --- title: "Multipart/Urlencoded されたデータをバインドする" - --- ```go diff --git a/src/content/docs/ja/docs/examples/multipart-urlencoded-form.md b/src/content/docs/ja/docs/examples/multipart-urlencoded-form.md index ea82458b89..56e98fd741 100644 --- a/src/content/docs/ja/docs/examples/multipart-urlencoded-form.md +++ b/src/content/docs/ja/docs/examples/multipart-urlencoded-form.md @@ -1,6 +1,5 @@ --- title: "Multipart/Urlencoded フォーム" - --- ```go diff --git a/src/content/docs/ja/docs/examples/multiple-template.md b/src/content/docs/ja/docs/examples/multiple-template.md index bad43f9eb2..f3e498968b 100644 --- a/src/content/docs/ja/docs/examples/multiple-template.md +++ b/src/content/docs/ja/docs/examples/multiple-template.md @@ -1,6 +1,5 @@ --- title: "複数のテンプレート" - --- Gin はデフォルトでは、1つの html.Template しか使用できません。 diff --git a/src/content/docs/ja/docs/examples/only-bind-query-string.md b/src/content/docs/ja/docs/examples/only-bind-query-string.md index db458ef699..3c09ed33dd 100644 --- a/src/content/docs/ja/docs/examples/only-bind-query-string.md +++ b/src/content/docs/ja/docs/examples/only-bind-query-string.md @@ -1,6 +1,5 @@ --- title: "クエリ文字列のみバインドする" - --- `ShouldBindQuery` 関数はクエリ文字列のみをバインドし、POSTデータをバインドしません。[詳細](https://github.com/gin-gonic/gin/issues/742#issuecomment-315953017) はこちら。 diff --git a/src/content/docs/ja/docs/examples/param-in-path.md b/src/content/docs/ja/docs/examples/param-in-path.md index fe9e178b03..da6e59e2b1 100644 --- a/src/content/docs/ja/docs/examples/param-in-path.md +++ b/src/content/docs/ja/docs/examples/param-in-path.md @@ -1,6 +1,5 @@ --- title: "パスに含まれるパラメータ" - --- ```go diff --git a/src/content/docs/ja/docs/examples/pure-json.md b/src/content/docs/ja/docs/examples/pure-json.md index d5bf9cc609..45c8c8a878 100644 --- a/src/content/docs/ja/docs/examples/pure-json.md +++ b/src/content/docs/ja/docs/examples/pure-json.md @@ -1,6 +1,5 @@ --- title: "PureJSON" - --- 通常、JSON メソッドは `<` のようなHTML 文字を `\u003c` のような Unicode に置き換えます。 @@ -9,24 +8,24 @@ title: "PureJSON" ```go func main() { - r := gin.Default() + router := gin.Default() // Unicode を返します - r.GET("/json", func(c *gin.Context) { + router.GET("/json", func(c *gin.Context) { c.JSON(200, gin.H{ "html": "Hello, world!", }) }) // そのままの文字を返します - r.GET("/purejson", func(c *gin.Context) { + router.GET("/purejson", func(c *gin.Context) { c.PureJSON(200, gin.H{ "html": "Hello, world!", }) }) // 0.0.0.0:8080 でサーバーを立てます。 - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/ja/docs/examples/query-and-post-form.md b/src/content/docs/ja/docs/examples/query-and-post-form.md index 82db6daf5f..5530d374f2 100644 --- a/src/content/docs/ja/docs/examples/query-and-post-form.md +++ b/src/content/docs/ja/docs/examples/query-and-post-form.md @@ -1,6 +1,5 @@ --- title: "フォーム投稿によるクエリ文字列" - --- ```sh diff --git a/src/content/docs/ja/docs/examples/querystring-param.md b/src/content/docs/ja/docs/examples/querystring-param.md index 2713003366..598e3f1554 100644 --- a/src/content/docs/ja/docs/examples/querystring-param.md +++ b/src/content/docs/ja/docs/examples/querystring-param.md @@ -1,6 +1,5 @@ --- title: "クエリ文字列のパラメータ" - --- ```go diff --git a/src/content/docs/ja/docs/examples/redirects.md b/src/content/docs/ja/docs/examples/redirects.md index 056b74820b..4750548965 100644 --- a/src/content/docs/ja/docs/examples/redirects.md +++ b/src/content/docs/ja/docs/examples/redirects.md @@ -1,12 +1,11 @@ --- title: "リダイレクト" - --- HTTP リダイレクトするのは簡単です。内部パス、外部URL両方のリダイレクトに対応しています。 ```go -r.GET("/test", func(c *gin.Context) { +router.GET("/test", func(c *gin.Context) { c.Redirect(http.StatusMovedPermanently, "http://www.google.com/") }) ``` @@ -14,7 +13,7 @@ r.GET("/test", func(c *gin.Context) { POSTからのHTTPリダイレクトのissueは [#444](https://github.com/gin-gonic/gin/issues/444) を参照してください。 ```go -r.POST("/test", func(c *gin.Context) { +router.POST("/test", func(c *gin.Context) { c.Redirect(http.StatusFound, "/foo") }) ``` @@ -22,11 +21,11 @@ r.POST("/test", func(c *gin.Context) { Router でリダイレクトするには、下記のように `HandleContext` メソッドを使ってください。 ``` go -r.GET("/test", func(c *gin.Context) { +router.GET("/test", func(c *gin.Context) { c.Request.URL.Path = "/test2" - r.HandleContext(c) + router.HandleContext(c) }) -r.GET("/test2", func(c *gin.Context) { +router.GET("/test2", func(c *gin.Context) { c.JSON(200, gin.H{"hello": "world"}) }) ``` diff --git a/src/content/docs/ja/docs/examples/rendering.md b/src/content/docs/ja/docs/examples/rendering.md index ccd0394d8c..4f0d4ad8ff 100644 --- a/src/content/docs/ja/docs/examples/rendering.md +++ b/src/content/docs/ja/docs/examples/rendering.md @@ -1,18 +1,17 @@ --- title: "XML, JSON, YAML, ProtoBuf をレンダリングする" - --- ```go func main() { - r := gin.Default() + router := gin.Default() // gin.H は map[string]interface{} へのショートカットです。 - r.GET("/someJSON", func(c *gin.Context) { + router.GET("/someJSON", func(c *gin.Context) { c.JSON(http.StatusOK, gin.H{"message": "hey", "status": http.StatusOK}) }) - r.GET("/moreJSON", func(c *gin.Context) { + router.GET("/moreJSON", func(c *gin.Context) { // 構造体を使うこともできます。 var msg struct { Name string `json:"user"` @@ -27,15 +26,15 @@ func main() { c.JSON(http.StatusOK, msg) }) - r.GET("/someXML", func(c *gin.Context) { + router.GET("/someXML", func(c *gin.Context) { c.XML(http.StatusOK, gin.H{"message": "hey", "status": http.StatusOK}) }) - r.GET("/someYAML", func(c *gin.Context) { + router.GET("/someYAML", func(c *gin.Context) { c.YAML(http.StatusOK, gin.H{"message": "hey", "status": http.StatusOK}) }) - r.GET("/someProtoBuf", func(c *gin.Context) { + router.GET("/someProtoBuf", func(c *gin.Context) { reps := []int64{int64(1), int64(2)} label := "test" // protobuf の定義は testdata/protoexample にかかれています。 @@ -49,7 +48,7 @@ func main() { }) // 0.0.0.0:8080 でサーバーを立てます。 - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/ja/docs/examples/run-multiple-service.md b/src/content/docs/ja/docs/examples/run-multiple-service.md index 7cb113c08f..a20e65ca49 100644 --- a/src/content/docs/ja/docs/examples/run-multiple-service.md +++ b/src/content/docs/ja/docs/examples/run-multiple-service.md @@ -1,6 +1,5 @@ --- title: "Gin を使って複数のサービスを稼働させる" - --- [issue](https://github.com/gin-gonic/gin/issues/346) を見て、以下のサンプルコードを試してみてください。 diff --git a/src/content/docs/ja/docs/examples/secure-json.md b/src/content/docs/ja/docs/examples/secure-json.md index 0b65dca8e0..4396a4e3b5 100644 --- a/src/content/docs/ja/docs/examples/secure-json.md +++ b/src/content/docs/ja/docs/examples/secure-json.md @@ -1,6 +1,5 @@ --- title: "SecureJSON" - --- SecureJSON メソッドを使うことで、JSON ハイジャックを防げます。与えられた構造体が Array であれば、 @@ -8,12 +7,12 @@ SecureJSON メソッドを使うことで、JSON ハイジャックを防げま ```go func main() { - r := gin.Default() + router := gin.Default() // 別の prefix を使うこともできます - // r.SecureJsonPrefix(")]}',\n") + // router.SecureJsonPrefix(")]}',\n") - r.GET("/someJSON", func(c *gin.Context) { + router.GET("/someJSON", func(c *gin.Context) { names := []string{"lena", "austin", "foo"} // while(1);["lena","austin","foo"] が出力されます。 @@ -21,7 +20,7 @@ func main() { }) // 0.0.0.0:8080 でサーバーを立てます。 - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/ja/docs/examples/security-headers.md b/src/content/docs/ja/docs/examples/security-headers.md index fa5d348ea7..ec6be9f62f 100644 --- a/src/content/docs/ja/docs/examples/security-headers.md +++ b/src/content/docs/ja/docs/examples/security-headers.md @@ -1,6 +1,5 @@ --- title: "セキュリティ・ヘッダ" - --- セキュリティヘッダの使用は、一般的なセキュリティの脆弱性からウェブアプリケーションを守るために重要です。この例では、Gin アプリケーションにセキュリティヘッダーを追加する方法と、ホストヘッダーインジェクションに関連する攻撃(SSRF、Open Redirection)を回避する方法を示します。 diff --git a/src/content/docs/ja/docs/examples/serving-data-from-reader.md b/src/content/docs/ja/docs/examples/serving-data-from-reader.md index 0abac2721b..96f917d90c 100644 --- a/src/content/docs/ja/docs/examples/serving-data-from-reader.md +++ b/src/content/docs/ja/docs/examples/serving-data-from-reader.md @@ -1,6 +1,5 @@ --- title: "io.Reader からのデータを返す" - --- ```go diff --git a/src/content/docs/ja/docs/examples/serving-static-files.md b/src/content/docs/ja/docs/examples/serving-static-files.md index 57d80fa762..d92e413d5a 100644 --- a/src/content/docs/ja/docs/examples/serving-static-files.md +++ b/src/content/docs/ja/docs/examples/serving-static-files.md @@ -1,6 +1,5 @@ --- title: "静的ファイルを返す" - --- ```go diff --git a/src/content/docs/ja/docs/examples/support-lets-encrypt.md b/src/content/docs/ja/docs/examples/support-lets-encrypt.md index 2451acae30..3f8463d8ab 100644 --- a/src/content/docs/ja/docs/examples/support-lets-encrypt.md +++ b/src/content/docs/ja/docs/examples/support-lets-encrypt.md @@ -1,6 +1,5 @@ --- title: "Let's Encrypt のサポート" - --- 1行の Let's Encrypt HTTPS サーバーのサンプルコードです。 @@ -16,10 +15,10 @@ import ( ) func main() { - r := gin.Default() + router := gin.Default() // Ping handler - r.GET("/ping", func(c *gin.Context) { + router.GET("/ping", func(c *gin.Context) { c.String(200, "pong") }) @@ -41,10 +40,10 @@ import ( ) func main() { - r := gin.Default() + router := gin.Default() // Ping handler - r.GET("/ping", func(c *gin.Context) { + router.GET("/ping", func(c *gin.Context) { c.String(200, "pong") }) diff --git a/src/content/docs/ja/docs/examples/upload-file/index.md b/src/content/docs/ja/docs/examples/upload-file/index.md index ed7b6105b4..d61d47779d 100644 --- a/src/content/docs/ja/docs/examples/upload-file/index.md +++ b/src/content/docs/ja/docs/examples/upload-file/index.md @@ -1,6 +1,5 @@ --- title: "ファイルアップロード" - --- このセクションではファイルのアップロードAPIの使い方を列挙します。 diff --git a/src/content/docs/ja/docs/examples/upload-file/multiple-file.md b/src/content/docs/ja/docs/examples/upload-file/multiple-file.md index 4033edb60c..932ce97323 100644 --- a/src/content/docs/ja/docs/examples/upload-file/multiple-file.md +++ b/src/content/docs/ja/docs/examples/upload-file/multiple-file.md @@ -1,6 +1,5 @@ --- title: "複数のファイル" - --- 詳細は [サンプルコード](https://github.com/gin-gonic/examples/tree/master/upload-file/multiple) 参照のこと. @@ -19,7 +18,7 @@ func main() { log.Println(file.Filename) // 特定のディレクトリにファイルをアップロードする - c.SaveUploadedFile(file, dst) + c.SaveUploadedFile(file, "./files/" + file.Filename) } c.String(http.StatusOK, fmt.Sprintf("%d files uploaded!", len(files))) }) diff --git a/src/content/docs/ja/docs/examples/upload-file/single-file.md b/src/content/docs/ja/docs/examples/upload-file/single-file.md index 11d5baae6e..1a4b9ba06a 100644 --- a/src/content/docs/ja/docs/examples/upload-file/single-file.md +++ b/src/content/docs/ja/docs/examples/upload-file/single-file.md @@ -1,6 +1,5 @@ --- title: "単一のファイル" - --- issue [#774](https://github.com/gin-gonic/gin/issues/774) と、詳細は [サンプルコード](https://github.com/gin-gonic/examples/tree/master/upload-file/single) 参照。 @@ -20,7 +19,7 @@ func main() { log.Println(file.Filename) // 特定のディレクトリにファイルをアップロードする - c.SaveUploadedFile(file, dst) + c.SaveUploadedFile(file, "./files/" + file.Filename) c.String(http.StatusOK, fmt.Sprintf("'%s' uploaded!", file.Filename)) }) diff --git a/src/content/docs/ja/docs/examples/using-basicauth-middleware.md b/src/content/docs/ja/docs/examples/using-basicauth-middleware.md index e0ec502f56..8d864bbbd0 100644 --- a/src/content/docs/ja/docs/examples/using-basicauth-middleware.md +++ b/src/content/docs/ja/docs/examples/using-basicauth-middleware.md @@ -1,6 +1,5 @@ --- title: "BasicAuth ミドルウェアを使う" - --- ```go @@ -12,11 +11,11 @@ var secrets = gin.H{ } func main() { - r := gin.Default() + router := gin.Default() // gin.BasicAuth() ミドルウェアを使用したグループ // gin.Accounts は map[string]string へのショートカットです。 - authorized := r.Group("/admin", gin.BasicAuth(gin.Accounts{ + authorized := router.Group("/admin", gin.BasicAuth(gin.Accounts{ "foo": "bar", "austin": "1234", "lena": "hello2", @@ -35,7 +34,7 @@ func main() { }) // 0.0.0.0:8080 でサーバーを立てます。 - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/ja/docs/examples/using-middleware.md b/src/content/docs/ja/docs/examples/using-middleware.md index 9995e87630..de5cb63fff 100644 --- a/src/content/docs/ja/docs/examples/using-middleware.md +++ b/src/content/docs/ja/docs/examples/using-middleware.md @@ -1,6 +1,5 @@ --- title: "ミドルウェアを利用する" - --- ```go @@ -11,18 +10,18 @@ func main() { // グローバルなミドルウェア // Logger ミドルウェアは GIN_MODE=release を設定してても、 gin.DefaultWriter にログを出力する // gin.DefaultWriter はデフォルトでは os.Stdout。 - r.Use(gin.Logger()) + router.Use(gin.Logger()) // Recovery ミドルウェアは panic が発生しても 500 エラーを返してくれる - r.Use(gin.Recovery()) + router.Use(gin.Recovery()) // 個別のルーティングに、ミドルウェアを好きに追加することもできる - r.GET("/benchmark", MyBenchLogger(), benchEndpoint) + router.GET("/benchmark", MyBenchLogger(), benchEndpoint) // 認証が必要なグループ - // authorized := r.Group("/", AuthRequired()) + // authorized := router.Group("/", AuthRequired()) // 下記と同一 - authorized := r.Group("/") + authorized := router.Group("/") // 個別のグループのミドルウェア。この例では、AuthRequired() ミドルウェアを認証が必要なグループに設定している。 authorized.Use(AuthRequired()) { @@ -36,7 +35,7 @@ func main() { } // 0.0.0.0:8080 でサーバーを立てる - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/ja/docs/examples/without-middleware.md b/src/content/docs/ja/docs/examples/without-middleware.md index 517eeef297..aa01c9c41f 100644 --- a/src/content/docs/ja/docs/examples/without-middleware.md +++ b/src/content/docs/ja/docs/examples/without-middleware.md @@ -1,6 +1,5 @@ --- title: "デフォルトで設定されるミドルウェアがない空の Gin を作成する" - --- ```go diff --git a/src/content/docs/ja/docs/examples/write-log.md b/src/content/docs/ja/docs/examples/write-log.md index 5f3e569091..504b41c6f7 100644 --- a/src/content/docs/ja/docs/examples/write-log.md +++ b/src/content/docs/ja/docs/examples/write-log.md @@ -1,6 +1,5 @@ --- title: "ログファイルへ書き込むには" - --- ```go diff --git a/src/content/docs/ja/docs/faq/index.md b/src/content/docs/ja/docs/faq/index.md index 20f2e9fe8f..80382fb859 100644 --- a/src/content/docs/ja/docs/faq/index.md +++ b/src/content/docs/ja/docs/faq/index.md @@ -1,6 +1,5 @@ --- title: "FAQ" - sidebar: order: 9 --- diff --git a/src/content/docs/ja/docs/features/index.md b/src/content/docs/ja/docs/features/index.md index 9318e97b47..4c5829c21e 100644 --- a/src/content/docs/ja/docs/features/index.md +++ b/src/content/docs/ja/docs/features/index.md @@ -1,6 +1,5 @@ --- title: "機能" - sidebar: order: 4 --- diff --git a/src/content/docs/ja/docs/index.md b/src/content/docs/ja/docs/index.md index aeca095d2e..9163525558 100644 --- a/src/content/docs/ja/docs/index.md +++ b/src/content/docs/ja/docs/index.md @@ -1,8 +1,7 @@ --- title: "ドキュメント" -linkTitle: "ドキュメント" sidebar: - order: 1 + order: 20 --- ## Gin ってなに? diff --git a/src/content/docs/ja/docs/introduction/index.md b/src/content/docs/ja/docs/introduction/index.md index fb777aa457..2f0b087067 100644 --- a/src/content/docs/ja/docs/introduction/index.md +++ b/src/content/docs/ja/docs/introduction/index.md @@ -1,6 +1,5 @@ --- title: "まず始めに" - sidebar: order: 1 --- diff --git a/src/content/docs/ja/docs/jsoniter/index.md b/src/content/docs/ja/docs/jsoniter/index.md index da2e4be2c0..6807b4da5b 100644 --- a/src/content/docs/ja/docs/jsoniter/index.md +++ b/src/content/docs/ja/docs/jsoniter/index.md @@ -1,6 +1,5 @@ --- title: "Jsoniter" - sidebar: order: 5 --- diff --git a/src/content/docs/ja/docs/quickstart/index.md b/src/content/docs/ja/docs/quickstart/index.md index 28fbcf2718..4f90f93a7f 100644 --- a/src/content/docs/ja/docs/quickstart/index.md +++ b/src/content/docs/ja/docs/quickstart/index.md @@ -1,6 +1,5 @@ --- title: "クイックスタート" - sidebar: order: 2 --- @@ -69,13 +68,13 @@ package main import "github.com/gin-gonic/gin" func main() { - r := gin.Default() - r.GET("/ping", func(c *gin.Context) { + router := gin.Default() + router.GET("/ping", func(c *gin.Context) { c.JSON(200, gin.H{ "message": "pong", }) }) - r.Run() // 0.0.0.0:8080 でサーバーを立てます。 + router.Run() // 0.0.0.0:8080 でサーバーを立てます。 } ``` diff --git a/src/content/docs/ja/docs/testing/index.md b/src/content/docs/ja/docs/testing/index.md index a79a42a9dc..cf6df90b83 100644 --- a/src/content/docs/ja/docs/testing/index.md +++ b/src/content/docs/ja/docs/testing/index.md @@ -1,6 +1,5 @@ --- title: "テスト" - sidebar: order: 7 --- @@ -20,15 +19,15 @@ type User struct { } func setupRouter() *gin.Engine { - r := gin.Default() - r.GET("/ping", func(c *gin.Context) { + router := gin.Default() + router.GET("/ping", func(c *gin.Context) { c.String(200, "pong") }) return r } func postUser(r *gin.Engine) *gin.Engine { - r.POST("/user/add", func(c *gin.Context) { + router.POST("/user/add", func(c *gin.Context) { var user User c.BindJSON(&user) c.JSON(200, user) @@ -39,7 +38,7 @@ func postUser(r *gin.Engine) *gin.Engine { func main() { r := setupRouter() r = postUser(r) - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/ja/docs/users/index.md b/src/content/docs/ja/docs/users/index.md index 6fb8465e2a..e02ce7539c 100644 --- a/src/content/docs/ja/docs/users/index.md +++ b/src/content/docs/ja/docs/users/index.md @@ -1,6 +1,5 @@ --- title: "Gin のユーザー" - sidebar: order: 8 --- diff --git a/src/content/docs/ko-kr/blog/index.md b/src/content/docs/ko-kr/blog/index.md index 07fd81571f..63a2f96df4 100644 --- a/src/content/docs/ko-kr/blog/index.md +++ b/src/content/docs/ko-kr/blog/index.md @@ -1,6 +1,5 @@ --- title: "Blog" -linkTitle: "Blog" sidebar: order: 30 --- diff --git a/src/content/docs/ko-kr/blog/news/how-to-build-one-effective-middleware.md b/src/content/docs/ko-kr/blog/news/how-to-build-one-effective-middleware.md index d93e7cbc3e..f33833df25 100644 --- a/src/content/docs/ko-kr/blog/news/how-to-build-one-effective-middleware.md +++ b/src/content/docs/ko-kr/blog/news/how-to-build-one-effective-middleware.md @@ -1,7 +1,7 @@ --- title: "How to build one effective middleware?" linkTitle: "How to build one effective middleware?" -date: 2019-02-26 +lastUpdated: 2019-02-26 --- ## Constituent parts diff --git a/src/content/docs/ko-kr/blog/releases/release13.md b/src/content/docs/ko-kr/blog/releases/release13.md index 43f4656f4e..8d5057ad72 100644 --- a/src/content/docs/ko-kr/blog/releases/release13.md +++ b/src/content/docs/ko-kr/blog/releases/release13.md @@ -1,7 +1,7 @@ --- title: "Gin 1.3.0 is released" linkTitle: "Gin 1.3.0 is released" -date: 2018-08-14 +lastUpdated: 2018-08-14 --- ### CHANGELOG diff --git a/src/content/docs/ko-kr/blog/releases/release14.md b/src/content/docs/ko-kr/blog/releases/release14.md index 23fd648294..c145f3b520 100644 --- a/src/content/docs/ko-kr/blog/releases/release14.md +++ b/src/content/docs/ko-kr/blog/releases/release14.md @@ -1,7 +1,7 @@ --- title: "Gin 1.4.0 is released" linkTitle: "Gin 1.4.0 is released" -date: 2019-05-08 +lastUpdated: 2019-05-08 --- ### CHANGELOG diff --git a/src/content/docs/ko-kr/blog/releases/release15.md b/src/content/docs/ko-kr/blog/releases/release15.md index e4593b3ceb..4f5707a177 100644 --- a/src/content/docs/ko-kr/blog/releases/release15.md +++ b/src/content/docs/ko-kr/blog/releases/release15.md @@ -1,7 +1,7 @@ --- title: "Gin 1.5.0 is released" linkTitle: "Gin 1.5.0 is released" -date: 2019-11-28 +lastUpdated: 2019-11-28 --- ### CHANGELOG diff --git a/src/content/docs/ko-kr/docs/benchmarks/index.md b/src/content/docs/ko-kr/docs/benchmarks/index.md index ad3f250d13..b77ffd80fb 100644 --- a/src/content/docs/ko-kr/docs/benchmarks/index.md +++ b/src/content/docs/ko-kr/docs/benchmarks/index.md @@ -1,6 +1,5 @@ --- title: "벤치마크" - sidebar: order: 3 --- diff --git a/src/content/docs/ko-kr/docs/deployment/index.md b/src/content/docs/ko-kr/docs/deployment/index.md index bc76791da2..7eb34d9848 100644 --- a/src/content/docs/ko-kr/docs/deployment/index.md +++ b/src/content/docs/ko-kr/docs/deployment/index.md @@ -1,6 +1,5 @@ --- title: "배포" - sidebar: order: 6 --- @@ -18,3 +17,98 @@ Render의 [Gin프로젝트 배포 가이드](https://render.com/docs/deploy-go-g GAE에는 Go어플리케이션을 배포하는 두 가지 방법이 있습니다. 표준환경은 간단히 사용할 수 있으나, 사용자 정의가 어려우며 보안상의 이유로 [syscalls](https://github.com/gin-gonic/gin/issues/1639)를 사용할 수 없습니다. 가변형 환경은 모든 프레임워크와 라이브러리를 사용할 수 있습니다. [Google App Engine의 Go](https://cloud.google.com/appengine/docs/go/)에서 자세히 알아보고 자신에게 알맞은 환경을 선택하세요. + +## Self Hosted + +Gin 프로젝트는 자체 호스팅 방식으로 배포할 수도 있습니다. 배포 아키텍처 및 보안 고려 사항은 대상 환경에 따라 다릅니다. 다음 섹션에서는 배포를 계획할 때 고려해야 할 구성 옵션에 대한 개략적인 개요만 제시합니다. + +## Configuration Options + +Gin 프로젝트 배포 설정은 환경 변수를 사용하거나 코드에서 직접 조정할 수 있습니다. + +Gin을 구성하는 데 사용할 수 있는 환경 변수는 다음과 같습니다: + +| Environment Variable | Description | +| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| PORT | `router.Run()`으로 Gin 서버를 시작할 때 사용할 TCP 포트입니다. | +| GIN_MODE | `debug`, `release`, or `test` 중 하나로 설정합니다. 디버그 출력을 언제 내보낼지와 같은 Gin 모드를 관리합니다. 코드에서도 `gin.SetMode(gin.ReleaseMode)` 또는 `gin.SetMode(gin.TestMode)` 함수를 사용하여 설정할 수 있습니다. | + +다음 코드를 사용하여 Gin을 구성할 수 있습니다. + +```go +// Gin의 바인드 주소나 포트를 지정하지 않음. 기본값은 포트 8080 인터페이스에 바인딩하는 것입니다. +// 인자 없이 Run()을 사용할 때, PORT 환경 변수를 사용하여 리슨 포트를 변경할 수 있습니다. +router := gin.Default() +router.Run() + +// Gin의 바인드 주소와 포트를 지정합니다. +router := gin.Default() +router.Run("192.168.1.100:8080") + +// 리스닝 포트만 지정합니다. 모든 인터페이스에 바인딩됩니다. +router := gin.Default() +router.Run(":8080") + +// 실제 클라이언트 IP 주소를 문서화하기 위한 헤더를 설정할 때 신뢰할 수 있는 IP 주소 또는 CIDR을 지정합니다. +// 자세한 내용은 문서를 참조하세요. +router := gin.Default() +router.SetTrustedProxies([]string{"192.168.1.2"}) +``` + +## Don't trust all proxies + +Gin은 실제 클라이언트 IP(있는 경우)를 포함하는 헤더와, 해당 헤더 중 하나를 지정할 때 신뢰할 수 있는 프록시(또는 직접 클라이언트)를 지정할 수 있습니다. + +gin.Engine의 함수 SetTrustedProxies()를 사용하여 클라이언트 IP와 관련된 요청 헤더가 신뢰될 수 있는 네트워크 주소 또는 네트워크 CIDR을 지정하세요. 이 값은 IPv4 주소, IPv4 CIDR, IPv6 주소 또는 IPv6 CIDR일 수 있습니다. + +**주의**: 위 함수를 사용하여 신뢰할 수 있는 프록시를 지정하지 않으면, Gin은 기본적으로 모든 프록시를 신뢰합니다. 이는 안전하지 않습니다. 또한, 프록시를 사용하지 않는 경우 Engine.SetTrustedProxies(nil)을 사용하여 이 기능을 비활성화할 수 있으며, 그러면 Context.ClientIP()가 불필요한 연산을 피하기 위해 직접 원격 주소를 반환합니다. + +```go +import ( + "fmt" + + "github.com/gin-gonic/gin" +) + +func main() { + router := gin.Default() + router.SetTrustedProxies([]string{"192.168.1.2"}) + + router.GET("/", func(c *gin.Context) { + // 클라이언트가 192.168.1.2인 경우, X-Forwarded-For 헤더의 신뢰할 수 있는 부분을 사용하여 원래 클라이언트 IP를 추론합니다. + // 그렇지 않으면, 단순히 직접 클라이언트 IP를 반환합니다. + fmt.Printf("ClientIP: %s\n", c.ClientIP()) + }) + router.Run() +} +``` + +**주의**: CDN 서비스를 사용하는 경우, TrustedProxies 검사를 건너뛰기 위해 Engine.TrustedPlatform을 설정할 수 있습니다. 이 설정은 TrustedProxies보다 우선 순위가 높습니다. 아래 예제를 참고하세요: + +```go +import ( + "fmt" + + "github.com/gin-gonic/gin" +) + +func main() { + router := gin.Default() + // 미리 정의된 헤더 gin.PlatformXXX을 사용합니다. + // Google App Engine + router.TrustedPlatform = gin.PlatformGoogleAppEngine + // Cloudflare + router.TrustedPlatform = gin.PlatformCloudflare + // Fly.io + router.TrustedPlatform = gin.PlatformFlyIO + // 또는, 직접 신뢰할 수 있는 요청 헤더를 설정할 수 있습니다. 하지만 CDN이 사용자가 이 헤더를 전달하지 못하도록 해야 합니다! + // 예를 들어, CDN이 클라이언트 IP를 X-CDN-Client-IP에 넣는 경우: + router.TrustedPlatform = "X-CDN-Client-IP" + + router.GET("/", func(c *gin.Context) { + // TrustedPlatform을 설정한 경우, ClientIP()는 해당 헤더를 해석하여 IP를 직접 반환합니다. + fmt.Printf("ClientIP: %s\n", c.ClientIP()) + }) + router.Run() +} +``` diff --git a/src/content/docs/ko-kr/docs/examples/ascii-json.md b/src/content/docs/ko-kr/docs/examples/ascii-json.md index dcdd5bb2cb..3c6b751ea3 100644 --- a/src/content/docs/ko-kr/docs/examples/ascii-json.md +++ b/src/content/docs/ko-kr/docs/examples/ascii-json.md @@ -1,15 +1,14 @@ --- title: "AsciiJSON" - --- 이스케이프 된 비 ASCII character를 AsciiJSON을 사용하여 ASCII 전용 JSON을 생성합니다 ```go func main() { - r := gin.Default() + router := gin.Default() - r.GET("/someJSON", func(c *gin.Context) { + router.GET("/someJSON", func(c *gin.Context) { data := map[string]interface{}{ "lang": "GO语言", "tag": "
", @@ -20,6 +19,6 @@ func main() { }) // 서버가 실행 되고 0.0.0.0:8080 에서 요청을 기다립니다. - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/ko-kr/docs/examples/bind-body-into-dirrerent-structs.md b/src/content/docs/ko-kr/docs/examples/bind-body-into-dirrerent-structs.md index 37e5ad19e6..515c4584ba 100644 --- a/src/content/docs/ko-kr/docs/examples/bind-body-into-dirrerent-structs.md +++ b/src/content/docs/ko-kr/docs/examples/bind-body-into-dirrerent-structs.md @@ -1,6 +1,5 @@ --- title: "body를 다른 구조체에 바인드 하기" - --- 일반적인 body 바인딩 메소드는 `c.Request.Body`를 소모합니다. diff --git a/src/content/docs/ko-kr/docs/examples/bind-form-data-request-with-custom-struct.md b/src/content/docs/ko-kr/docs/examples/bind-form-data-request-with-custom-struct.md index b2d0c6ec1a..5546446b21 100644 --- a/src/content/docs/ko-kr/docs/examples/bind-form-data-request-with-custom-struct.md +++ b/src/content/docs/ko-kr/docs/examples/bind-form-data-request-with-custom-struct.md @@ -1,6 +1,5 @@ --- title: "양식 데이터 리퀘스트를 구조체에 바인드 하기" - --- 아래의 예제는 사용자 정의 구조체를 사용합니다: @@ -55,18 +54,18 @@ func GetDataD(c *gin.Context) { } func main() { - r := gin.Default() - r.GET("/getb", GetDataB) - r.GET("/getc", GetDataC) - r.GET("/getd", GetDataD) + router := gin.Default() + router.GET("/getb", GetDataB) + router.GET("/getc", GetDataC) + router.GET("/getd", GetDataD) - r.Run() + router.Run() } ``` `curl` 명령어를 이용한 결과 입니다: -``` +```bash $ curl "http://localhost:8080/getb?field_a=hello&field_b=world" {"a":{"FieldA":"hello"},"b":"world"} $ curl "http://localhost:8080/getc?field_a=hello&field_c=world" diff --git a/src/content/docs/ko-kr/docs/examples/bind-html-checkbox.md b/src/content/docs/ko-kr/docs/examples/bind-html-checkbox.md index 06f615a8b8..617bc7d288 100644 --- a/src/content/docs/ko-kr/docs/examples/bind-html-checkbox.md +++ b/src/content/docs/ko-kr/docs/examples/bind-html-checkbox.md @@ -1,6 +1,5 @@ --- title: "html 체크박스를 바인드 하기" - --- [자세한 정보](https://github.com/gin-gonic/gin/issues/129#issuecomment-124260092)를 확인 하세요. diff --git a/src/content/docs/ko-kr/docs/examples/bind-query-or-post.md b/src/content/docs/ko-kr/docs/examples/bind-query-or-post.md index 048f65f6a6..c9efd79bef 100644 --- a/src/content/docs/ko-kr/docs/examples/bind-query-or-post.md +++ b/src/content/docs/ko-kr/docs/examples/bind-query-or-post.md @@ -1,6 +1,5 @@ --- title: "쿼리 문자열 혹은 post 데이터를 바인드하기" - --- [자세한 정보](https://github.com/gin-gonic/gin/issues/742#issuecomment-264681292)를 확인하세요. diff --git a/src/content/docs/ko-kr/docs/examples/bind-single-binary-with-template.md b/src/content/docs/ko-kr/docs/examples/bind-single-binary-with-template.md index fa93cacd5c..f600b4ed7e 100644 --- a/src/content/docs/ko-kr/docs/examples/bind-single-binary-with-template.md +++ b/src/content/docs/ko-kr/docs/examples/bind-single-binary-with-template.md @@ -1,6 +1,5 @@ --- title: "템플릿을 포함한 단일 바이너리 빌드" - --- [go-assets](https://github.com/jessevdk/go-assets)를 사용하여 템플릿을 포함한 단일 바이너리로 서버를 만들 수 있습니다. @@ -13,12 +12,12 @@ func main() { if err != nil { panic(err) } - r.SetHTMLTemplate(t) + router.SetHTMLTemplate(t) - r.GET("/", func(c *gin.Context) { + router.GET("/", func(c *gin.Context) { c.HTML(http.StatusOK, "/html/index.tmpl", nil) }) - r.Run(":8080") + router.Run(":8080") } // loadTemplate은 go-assets-builder에 의해 임베디드 된 템플릿을 로드합니다 diff --git a/src/content/docs/ko-kr/docs/examples/bind-uri.md b/src/content/docs/ko-kr/docs/examples/bind-uri.md index 27cb7be8a6..d3428f029a 100644 --- a/src/content/docs/ko-kr/docs/examples/bind-uri.md +++ b/src/content/docs/ko-kr/docs/examples/bind-uri.md @@ -1,6 +1,5 @@ --- title: "URI를 바인드하기" - --- [자세한 정보](https://github.com/gin-gonic/gin/issues/846)를 확인하세요. diff --git a/src/content/docs/ko-kr/docs/examples/binding-and-validation.md b/src/content/docs/ko-kr/docs/examples/binding-and-validation.md index f23de115c5..b92f426e25 100644 --- a/src/content/docs/ko-kr/docs/examples/binding-and-validation.md +++ b/src/content/docs/ko-kr/docs/examples/binding-and-validation.md @@ -1,6 +1,5 @@ --- title: "모델 바인딩과 유효성 검사" - --- 리퀘스트 바디를 바인딩하려면 모델 바인딩을 사용하세요. 현재 JSON, XML, YAML 및 표준 form values (foo=bar&boo=baz) 바인딩을 지원합니다. diff --git a/src/content/docs/ko-kr/docs/examples/controlling-log-output-coloring.md b/src/content/docs/ko-kr/docs/examples/controlling-log-output-coloring.md index 42a3c0f617..92bea8ca54 100644 --- a/src/content/docs/ko-kr/docs/examples/controlling-log-output-coloring.md +++ b/src/content/docs/ko-kr/docs/examples/controlling-log-output-coloring.md @@ -1,6 +1,5 @@ --- title: "로그 출력 색상 설정" - --- 기본적으로, 출력되는 로그의 색상은 감지된 TTY에 따라 지정 됩니다. diff --git a/src/content/docs/ko-kr/docs/examples/cookie.md b/src/content/docs/ko-kr/docs/examples/cookie.md index 45426b8738..f5a68ce1fe 100644 --- a/src/content/docs/ko-kr/docs/examples/cookie.md +++ b/src/content/docs/ko-kr/docs/examples/cookie.md @@ -1,8 +1,9 @@ --- -title: "쿠키의 설정 및 가져오기" - +title: "Cookie" --- +쿠키의 설정 및 가져오기 + ```go import ( "fmt" @@ -29,3 +30,9 @@ func main() { router.Run() } ``` + +Delete cookie by set max age to -1. + +```go +c.SetCookie("gin_cookie", "test", -1, "/", "localhost", false, true) +``` diff --git a/src/content/docs/ko-kr/docs/examples/custom-http-config.md b/src/content/docs/ko-kr/docs/examples/custom-http-config.md index 1aef51c794..68bd729eb3 100644 --- a/src/content/docs/ko-kr/docs/examples/custom-http-config.md +++ b/src/content/docs/ko-kr/docs/examples/custom-http-config.md @@ -1,6 +1,5 @@ --- title: "HTTP 구성 사용자 정의" - --- 아래와 같이 직접 `http.ListenAndServe()` 를 사용하세요: diff --git a/src/content/docs/ko-kr/docs/examples/custom-log-format.md b/src/content/docs/ko-kr/docs/examples/custom-log-format.md index f6654cf3d2..645f8f959a 100644 --- a/src/content/docs/ko-kr/docs/examples/custom-log-format.md +++ b/src/content/docs/ko-kr/docs/examples/custom-log-format.md @@ -1,6 +1,5 @@ --- title: "로그 파일 사용자 정의" - --- 예제: diff --git a/src/content/docs/ko-kr/docs/examples/custom-middleware.md b/src/content/docs/ko-kr/docs/examples/custom-middleware.md index a965e8ea0b..5e19810e6e 100644 --- a/src/content/docs/ko-kr/docs/examples/custom-middleware.md +++ b/src/content/docs/ko-kr/docs/examples/custom-middleware.md @@ -1,6 +1,5 @@ --- title: "커스텀 미들웨어" - --- ```go @@ -27,9 +26,9 @@ func Logger() gin.HandlerFunc { func main() { r := gin.New() - r.Use(Logger()) + router.Use(Logger()) - r.GET("/test", func(c *gin.Context) { + router.GET("/test", func(c *gin.Context) { example := c.MustGet("example").(string) // 출력내용: "12345" @@ -37,7 +36,7 @@ func main() { }) // 서버가 실행 되고 0.0.0.0:8080 에서 요청을 기다립니다. - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/ko-kr/docs/examples/custom-validators.md b/src/content/docs/ko-kr/docs/examples/custom-validators.md index a6f0e53eb2..23dc7ac7f3 100644 --- a/src/content/docs/ko-kr/docs/examples/custom-validators.md +++ b/src/content/docs/ko-kr/docs/examples/custom-validators.md @@ -1,6 +1,5 @@ --- title: "커스텀 유효성 검사" - --- 커스텀 유효성 검사를 사용 할 수도있습니다. [예제 코드](https://github.com/gin-gonic/examples/tree/master/struct-lvl-validations)를 확인하세요. diff --git a/src/content/docs/ko-kr/docs/examples/define-format-for-the-log-of-routes.md b/src/content/docs/ko-kr/docs/examples/define-format-for-the-log-of-routes.md index 7308b4e525..e227603ba2 100644 --- a/src/content/docs/ko-kr/docs/examples/define-format-for-the-log-of-routes.md +++ b/src/content/docs/ko-kr/docs/examples/define-format-for-the-log-of-routes.md @@ -1,6 +1,5 @@ --- title: "라우트의 로그 형식을 정의" - --- 라우트의 기본 로그는 다음과 같습니다: @@ -21,24 +20,24 @@ import ( ) func main() { - r := gin.Default() + router := gin.Default() gin.DebugPrintRouteFunc = func(httpMethod, absolutePath, handlerName string, nuHandlers int) { log.Printf("endpoint %v %v %v %v\n", httpMethod, absolutePath, handlerName, nuHandlers) } - r.POST("/foo", func(c *gin.Context) { + router.POST("/foo", func(c *gin.Context) { c.JSON(http.StatusOK, "foo") }) - r.GET("/bar", func(c *gin.Context) { + router.GET("/bar", func(c *gin.Context) { c.JSON(http.StatusOK, "bar") }) - r.GET("/status", func(c *gin.Context) { + router.GET("/status", func(c *gin.Context) { c.JSON(http.StatusOK, "ok") }) // 서버가 실행 되고 http://0.0.0.0:8080 에서 요청을 기다립니다. - r.Run() + router.Run() } ``` diff --git a/src/content/docs/ko-kr/docs/examples/goroutines-inside-a-middleware.md b/src/content/docs/ko-kr/docs/examples/goroutines-inside-a-middleware.md index cca82848fc..54f39a3ac0 100644 --- a/src/content/docs/ko-kr/docs/examples/goroutines-inside-a-middleware.md +++ b/src/content/docs/ko-kr/docs/examples/goroutines-inside-a-middleware.md @@ -1,15 +1,14 @@ --- title: "미들웨어 내부의 Go루틴" - --- 미들웨어 혹은 핸들러 내부에서 새로운 Go루틴을 시작하려면, 기존의 context를 **사용해서는 안됩니다.** 읽기 전용으로 복사해서 사용해야 합니다. ```go func main() { - r := gin.Default() + router := gin.Default() - r.GET("/long_async", func(c *gin.Context) { + router.GET("/long_async", func(c *gin.Context) { // Go루틴 내부에서 사용하기 위한 복사본을 작성합니다. cCp := c.Copy() go func() { @@ -21,7 +20,7 @@ func main() { }() }) - r.GET("/long_sync", func(c *gin.Context) { + router.GET("/long_sync", func(c *gin.Context) { // time.Sleep()를 사용하여 장시간(5초) 작업을 시뮬레이션 합니다. time.Sleep(5 * time.Second) @@ -30,6 +29,6 @@ func main() { }) // 서버가 실행 되고 0.0.0.0:8080 에서 요청을 기다립니다. - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/ko-kr/docs/examples/graceful-restart-or-stop.md b/src/content/docs/ko-kr/docs/examples/graceful-restart-or-stop.md index 76db99cada..eca6abfeb7 100644 --- a/src/content/docs/ko-kr/docs/examples/graceful-restart-or-stop.md +++ b/src/content/docs/ko-kr/docs/examples/graceful-restart-or-stop.md @@ -1,6 +1,5 @@ --- title: "Graceful 재시작과 정지" - --- 웹 서버를 graceful 재시작 혹은 정지를 하고 싶습니까? @@ -61,7 +60,7 @@ func main() { // 5초의 타임아웃으로 인해 인터럽트 신호가 서버를 정상종료 할 때까지 기다립니다. quit := make(chan os.Signal, 1) - // kill (파라미터 없음) 기본값으로 syscanll.SIGTERM를 보냅니다 + // kill (파라미터 없음) 기본값으로 syscall.SIGTERM를 보냅니다 // kill -2 는 syscall.SIGINT를 보냅니다 // kill -9 는 syscall.SIGKILL를 보내지만 캐치할수 없으므로, 추가할 필요가 없습니다. signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM) diff --git a/src/content/docs/ko-kr/docs/examples/grouping-routes.md b/src/content/docs/ko-kr/docs/examples/grouping-routes.md index 41792adfcd..e214da5e49 100644 --- a/src/content/docs/ko-kr/docs/examples/grouping-routes.md +++ b/src/content/docs/ko-kr/docs/examples/grouping-routes.md @@ -1,6 +1,5 @@ --- title: "라우트 그룹화" - --- ```go @@ -8,16 +7,16 @@ func main() { router := gin.Default() // v1 그룹 - v1 := router.Group("/v1") { + v1 := router.Group("/v1") v1.POST("/login", loginEndpoint) v1.POST("/submit", submitEndpoint) v1.POST("/read", readEndpoint) } // v2 그룹 - v2 := router.Group("/v2") { + v2 := router.Group("/v2") v2.POST("/login", loginEndpoint) v2.POST("/submit", submitEndpoint) v2.POST("/read", readEndpoint) diff --git a/src/content/docs/ko-kr/docs/examples/html-rendering.md b/src/content/docs/ko-kr/docs/examples/html-rendering.md index 6e92153409..6c5fa94fbb 100644 --- a/src/content/docs/ko-kr/docs/examples/html-rendering.md +++ b/src/content/docs/ko-kr/docs/examples/html-rendering.md @@ -1,6 +1,5 @@ --- title: "HTML 랜더링" - --- LoadHTMLGlob() 혹은 LoadHTMLFiles()를 사용합니다. @@ -93,9 +92,9 @@ func main() { 구분자를 사용자 정의하여 사용할 수도 있습니다. ```go - r := gin.Default() - r.Delims("{[{", "}]}") - r.LoadHTMLGlob("/path/to/templates") + router := gin.Default() + router.Delims("{[{", "}]}") + router.LoadHTMLGlob("/path/to/templates") ``` ### 커스텀 템플릿 기능 diff --git a/src/content/docs/ko-kr/docs/examples/http-method.md b/src/content/docs/ko-kr/docs/examples/http-method.md index 9f7f54f91c..d494584369 100644 --- a/src/content/docs/ko-kr/docs/examples/http-method.md +++ b/src/content/docs/ko-kr/docs/examples/http-method.md @@ -1,6 +1,5 @@ --- title: "HTTP 메소드 사용" - --- ```go diff --git a/src/content/docs/ko-kr/docs/examples/http2-server-push.md b/src/content/docs/ko-kr/docs/examples/http2-server-push.md index 47a5736a4f..89fc861817 100644 --- a/src/content/docs/ko-kr/docs/examples/http2-server-push.md +++ b/src/content/docs/ko-kr/docs/examples/http2-server-push.md @@ -1,6 +1,5 @@ --- title: "HTTP2 서버 푸시" - --- http.Pusher는 **go1.8 이상**에서만 지원됩니다. 자세한 정보는 [Go언어 블로그](https://blog.golang.org/h2push)에서 확인하세요. @@ -28,11 +27,11 @@ var html = template.Must(template.New("https").Parse(` `)) func main() { - r := gin.Default() - r.Static("/assets", "./assets") - r.SetHTMLTemplate(html) + router := gin.Default() + router.Static("/assets", "./assets") + router.SetHTMLTemplate(html) - r.GET("/", func(c *gin.Context) { + router.GET("/", func(c *gin.Context) { if pusher := c.Writer.Pusher(); pusher != nil { // 서버 푸시를 위해 pusher.Push()를 사용합니다 if err := pusher.Push("/assets/app.js", nil); err != nil { @@ -45,7 +44,7 @@ func main() { }) // 서버가 실행 되고 https://127.0.0.1:8080 에서 요청을 기다립니다. - r.RunTLS(":8080", "./testdata/server.pem", "./testdata/server.key") + router.RunTLS(":8080", "./testdata/server.pem", "./testdata/server.key") } ``` diff --git a/src/content/docs/ko-kr/docs/examples/index.md b/src/content/docs/ko-kr/docs/examples/index.md index e115857d3d..e8f6e135c7 100644 --- a/src/content/docs/ko-kr/docs/examples/index.md +++ b/src/content/docs/ko-kr/docs/examples/index.md @@ -1,6 +1,5 @@ --- title: "예제" - sidebar: order: 6 --- diff --git a/src/content/docs/ko-kr/docs/examples/jsonp.md b/src/content/docs/ko-kr/docs/examples/jsonp.md index cdf973c9aa..943f8a810e 100644 --- a/src/content/docs/ko-kr/docs/examples/jsonp.md +++ b/src/content/docs/ko-kr/docs/examples/jsonp.md @@ -1,15 +1,14 @@ --- title: "JSONP" - --- JSONP를 사용하여 다른 도메인의 서버에 요청하고 데이터를 받아올 수 있습니다. 조회 매개변수 콜백이 존재하는 경우 응답 본문에 콜백을 추가하세요. ```go func main() { - r := gin.Default() + router := gin.Default() - r.GET("/JSONP?callback=x", func(c *gin.Context) { + router.GET("/JSONP?callback=x", func(c *gin.Context) { data := map[string]interface{}{ "foo": "bar", } @@ -20,6 +19,6 @@ func main() { }) // 서버가 실행 되고 0.0.0.0:8080 에서 요청을 기다립니다. - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/ko-kr/docs/examples/map-as-querystring-or-postform.md b/src/content/docs/ko-kr/docs/examples/map-as-querystring-or-postform.md index bd42376e70..181e60aa7a 100644 --- a/src/content/docs/ko-kr/docs/examples/map-as-querystring-or-postform.md +++ b/src/content/docs/ko-kr/docs/examples/map-as-querystring-or-postform.md @@ -1,6 +1,5 @@ --- title: "쿼리 문자열 혹은 POST 폼의 파라미터에 매핑" - --- ```sh diff --git a/src/content/docs/ko-kr/docs/examples/multipart-urlencoded-binding.md b/src/content/docs/ko-kr/docs/examples/multipart-urlencoded-binding.md index 1e3c8bbee1..f9eaa49e07 100644 --- a/src/content/docs/ko-kr/docs/examples/multipart-urlencoded-binding.md +++ b/src/content/docs/ko-kr/docs/examples/multipart-urlencoded-binding.md @@ -1,6 +1,5 @@ --- title: "Multipart/Urlencoded 바인딩" - --- ```go diff --git a/src/content/docs/ko-kr/docs/examples/multipart-urlencoded-form.md b/src/content/docs/ko-kr/docs/examples/multipart-urlencoded-form.md index 9d82a28eee..e0b1f96d22 100644 --- a/src/content/docs/ko-kr/docs/examples/multipart-urlencoded-form.md +++ b/src/content/docs/ko-kr/docs/examples/multipart-urlencoded-form.md @@ -1,6 +1,5 @@ --- title: "Multipart/Urlencoded 양식" - --- ```go diff --git a/src/content/docs/ko-kr/docs/examples/multiple-template.md b/src/content/docs/ko-kr/docs/examples/multiple-template.md index d496c0b053..fda3b4f377 100644 --- a/src/content/docs/ko-kr/docs/examples/multiple-template.md +++ b/src/content/docs/ko-kr/docs/examples/multiple-template.md @@ -1,6 +1,5 @@ --- title: "다중 템플릿" - --- Gin은 기본적으로 하나의 html.Template만 사용하도록 허용합니다. Go 1.6의 `block template`와 같은 기능을 사용 하려면 [다중 템플릿 렌더(multitemplate)](https://github.com/gin-contrib/multitemplate)를 확인하세요. diff --git a/src/content/docs/ko-kr/docs/examples/only-bind-query-string.md b/src/content/docs/ko-kr/docs/examples/only-bind-query-string.md index 9734b394bf..a168396b5d 100644 --- a/src/content/docs/ko-kr/docs/examples/only-bind-query-string.md +++ b/src/content/docs/ko-kr/docs/examples/only-bind-query-string.md @@ -1,6 +1,5 @@ --- title: "쿼리 문자열만 바인딩하기" - --- `ShouldBindQuery` 함수는 POST 데이터가 아닌 쿼리 파라미터만 바인딩 합니다. [자세한 정보](https://github.com/gin-gonic/gin/issues/742#issuecomment-315953017)를 확인 하세요. diff --git a/src/content/docs/ko-kr/docs/examples/param-in-path.md b/src/content/docs/ko-kr/docs/examples/param-in-path.md index 17837685ad..80bed0b0ac 100644 --- a/src/content/docs/ko-kr/docs/examples/param-in-path.md +++ b/src/content/docs/ko-kr/docs/examples/param-in-path.md @@ -1,6 +1,5 @@ --- title: "경로를 포함한 파라미터" - --- ```go diff --git a/src/content/docs/ko-kr/docs/examples/pure-json.md b/src/content/docs/ko-kr/docs/examples/pure-json.md index 3c91ab8308..1e9465eff5 100644 --- a/src/content/docs/ko-kr/docs/examples/pure-json.md +++ b/src/content/docs/ko-kr/docs/examples/pure-json.md @@ -1,6 +1,5 @@ --- title: "PureJSON" - --- 일반적으로 JSON은 `<`와 같은 HTML문자를 `\u003c`처럼 유니코드로 변환 합니다. @@ -9,23 +8,23 @@ title: "PureJSON" ```go func main() { - r := gin.Default() + router := gin.Default() // 유니코드 엔티티 반환 - r.GET("/json", func(c *gin.Context) { + router.GET("/json", func(c *gin.Context) { c.JSON(200, gin.H{ "html": "Hello, world!", }) }) // 리터럴 문자 반환 - r.GET("/purejson", func(c *gin.Context) { + router.GET("/purejson", func(c *gin.Context) { c.PureJSON(200, gin.H{ "html": "Hello, world!", }) }) // 서버가 실행 되고 0.0.0.0:8080 에서 요청을 기다립니다. - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/ko-kr/docs/examples/query-and-post-form.md b/src/content/docs/ko-kr/docs/examples/query-and-post-form.md index ffe2ec004d..0c0a7e43f7 100644 --- a/src/content/docs/ko-kr/docs/examples/query-and-post-form.md +++ b/src/content/docs/ko-kr/docs/examples/query-and-post-form.md @@ -1,6 +1,5 @@ --- title: "POST 양식 쿼리" - --- ```sh diff --git a/src/content/docs/ko-kr/docs/examples/querystring-param.md b/src/content/docs/ko-kr/docs/examples/querystring-param.md index 05f15f0fc3..789295d5dc 100644 --- a/src/content/docs/ko-kr/docs/examples/querystring-param.md +++ b/src/content/docs/ko-kr/docs/examples/querystring-param.md @@ -1,6 +1,5 @@ --- title: "쿼리 문자열 파라미터" - --- ```go diff --git a/src/content/docs/ko-kr/docs/examples/redirects.md b/src/content/docs/ko-kr/docs/examples/redirects.md index a87b5334bb..4a7b2dfa23 100644 --- a/src/content/docs/ko-kr/docs/examples/redirects.md +++ b/src/content/docs/ko-kr/docs/examples/redirects.md @@ -1,12 +1,11 @@ --- title: "리디렉션" - --- HTTP 리다이렉트 하는 것은 간단합니다. 내부와 외부위치를 모두 지원합니다. ```go -r.GET("/test", func(c *gin.Context) { +router.GET("/test", func(c *gin.Context) { c.Redirect(http.StatusMovedPermanently, "http://www.google.com/") }) ``` @@ -14,7 +13,7 @@ r.GET("/test", func(c *gin.Context) { Issuing a HTTP redirect from POST. Refer to issue: [#444](https://github.com/gin-gonic/gin/issues/444) ```go -r.POST("/test", func(c *gin.Context) { +router.POST("/test", func(c *gin.Context) { c.Redirect(http.StatusFound, "/foo") }) ``` @@ -22,11 +21,11 @@ r.POST("/test", func(c *gin.Context) { 라우터 리다이렉트를 실행하려면, 아래와 같이 `HandleContext`를 사용하세요. ``` go -r.GET("/test", func(c *gin.Context) { +router.GET("/test", func(c *gin.Context) { c.Request.URL.Path = "/test2" - r.HandleContext(c) + router.HandleContext(c) }) -r.GET("/test2", func(c *gin.Context) { +router.GET("/test2", func(c *gin.Context) { c.JSON(200, gin.H{"hello": "world"}) }) ``` diff --git a/src/content/docs/ko-kr/docs/examples/rendering.md b/src/content/docs/ko-kr/docs/examples/rendering.md index f2e71ff953..4a9d33e2e9 100644 --- a/src/content/docs/ko-kr/docs/examples/rendering.md +++ b/src/content/docs/ko-kr/docs/examples/rendering.md @@ -1,18 +1,17 @@ --- title: "XML/JSON/YAML/ProtoBuf 랜더링" - --- ```go func main() { - r := gin.Default() + router := gin.Default() // gin.H은 map[string]interface{} 타입입니다. - r.GET("/someJSON", func(c *gin.Context) { + router.GET("/someJSON", func(c *gin.Context) { c.JSON(http.StatusOK, gin.H{"message": "hey", "status": http.StatusOK}) }) - r.GET("/moreJSON", func(c *gin.Context) { + router.GET("/moreJSON", func(c *gin.Context) { // 구조체도 사용할 수 있습니다. var msg struct { Name string `json:"user"` @@ -27,15 +26,15 @@ func main() { c.JSON(http.StatusOK, msg) }) - r.GET("/someXML", func(c *gin.Context) { + router.GET("/someXML", func(c *gin.Context) { c.XML(http.StatusOK, gin.H{"message": "hey", "status": http.StatusOK}) }) - r.GET("/someYAML", func(c *gin.Context) { + router.GET("/someYAML", func(c *gin.Context) { c.YAML(http.StatusOK, gin.H{"message": "hey", "status": http.StatusOK}) }) - r.GET("/someProtoBuf", func(c *gin.Context) { + router.GET("/someProtoBuf", func(c *gin.Context) { reps := []int64{int64(1), int64(2)} label := "test" // protobuf의 정의는 testdata/protoexample 파일에 작성되어 있습니다. @@ -49,6 +48,6 @@ func main() { }) // 서버가 실행 되고 0.0.0.0:8080 에서 요청을 기다립니다. - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/ko-kr/docs/examples/run-multiple-service.md b/src/content/docs/ko-kr/docs/examples/run-multiple-service.md index 96fb46db99..096dc0d56f 100644 --- a/src/content/docs/ko-kr/docs/examples/run-multiple-service.md +++ b/src/content/docs/ko-kr/docs/examples/run-multiple-service.md @@ -1,6 +1,5 @@ --- title: "여러 개의 서비스를 실행하기" - --- 이 [질문](https://github.com/gin-gonic/gin/issues/346)을 보고, 다음 예제를 실행해 보세요: diff --git a/src/content/docs/ko-kr/docs/examples/secure-json.md b/src/content/docs/ko-kr/docs/examples/secure-json.md index 50adc830c2..872bcf73ca 100644 --- a/src/content/docs/ko-kr/docs/examples/secure-json.md +++ b/src/content/docs/ko-kr/docs/examples/secure-json.md @@ -1,6 +1,5 @@ --- title: "SecureJSON" - --- json 하이재킹을 방지하기 위해 SecureJSON를 사용합니다. @@ -8,12 +7,12 @@ json 하이재킹을 방지하기 위해 SecureJSON를 사용합니다. ```go func main() { - r := gin.Default() + router := gin.Default() // 자체적인 보안 json 접두사를 사용할 수도 있습니다. - // r.SecureJsonPrefix(")]}',\n") + // router.SecureJsonPrefix(")]}',\n") - r.GET("/someJSON", func(c *gin.Context) { + router.GET("/someJSON", func(c *gin.Context) { names := []string{"lena", "austin", "foo"} // 출력내용 : while(1);["lena","austin","foo"] @@ -21,6 +20,6 @@ func main() { }) // 서버가 실행 되고 0.0.0.0:8080 에서 요청을 기다립니다. - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/ko-kr/docs/examples/security-headers.md b/src/content/docs/ko-kr/docs/examples/security-headers.md index fd0b0fc3c0..9f9bc46f8f 100644 --- a/src/content/docs/ko-kr/docs/examples/security-headers.md +++ b/src/content/docs/ko-kr/docs/examples/security-headers.md @@ -1,6 +1,5 @@ --- title: "보안 헤더" - --- 일반적인 보안 취약점으로부터 웹 애플리케이션을 보호하려면 보안 헤더를 사용하는 것이 중요합니다. 이 예에서는 Gin 애플리케이션에 보안 헤더를 추가하는 방법과 호스트 헤더 인젝션 관련 공격(SSRF, 오픈 리디렉션)을 방지하는 방법을 설명합니다. diff --git a/src/content/docs/ko-kr/docs/examples/serving-data-from-reader.md b/src/content/docs/ko-kr/docs/examples/serving-data-from-reader.md index b038ed0885..20cee53826 100644 --- a/src/content/docs/ko-kr/docs/examples/serving-data-from-reader.md +++ b/src/content/docs/ko-kr/docs/examples/serving-data-from-reader.md @@ -1,6 +1,5 @@ --- title: "Reader로 데이터 반환" - --- ```go diff --git a/src/content/docs/ko-kr/docs/examples/serving-static-files.md b/src/content/docs/ko-kr/docs/examples/serving-static-files.md index a5717ce071..7f4795397e 100644 --- a/src/content/docs/ko-kr/docs/examples/serving-static-files.md +++ b/src/content/docs/ko-kr/docs/examples/serving-static-files.md @@ -1,6 +1,5 @@ --- title: "정적 파일 반환" - --- ```go diff --git a/src/content/docs/ko-kr/docs/examples/support-lets-encrypt.md b/src/content/docs/ko-kr/docs/examples/support-lets-encrypt.md index cdb1812033..728c7091fb 100644 --- a/src/content/docs/ko-kr/docs/examples/support-lets-encrypt.md +++ b/src/content/docs/ko-kr/docs/examples/support-lets-encrypt.md @@ -1,6 +1,5 @@ --- title: "Let's Encrypt 지원" - --- 한 줄의 LetsEncrypt HTTPS 서버의 샘플입니다. @@ -16,10 +15,10 @@ import ( ) func main() { - r := gin.Default() + router := gin.Default() // Ping handler - r.GET("/ping", func(c *gin.Context) { + router.GET("/ping", func(c *gin.Context) { c.String(200, "pong") }) @@ -41,10 +40,10 @@ import ( ) func main() { - r := gin.Default() + router := gin.Default() // Ping handler - r.GET("/ping", func(c *gin.Context) { + router.GET("/ping", func(c *gin.Context) { c.String(200, "pong") }) diff --git a/src/content/docs/ko-kr/docs/examples/upload-file/index.md b/src/content/docs/ko-kr/docs/examples/upload-file/index.md index 1136def882..4573638335 100644 --- a/src/content/docs/ko-kr/docs/examples/upload-file/index.md +++ b/src/content/docs/ko-kr/docs/examples/upload-file/index.md @@ -1,6 +1,5 @@ --- title: "파일 업로드" - --- 이 장에는 파일 업로드 API 사용법이 있습니다. diff --git a/src/content/docs/ko-kr/docs/examples/upload-file/multiple-file.md b/src/content/docs/ko-kr/docs/examples/upload-file/multiple-file.md index 19b4708a70..673a5d175c 100644 --- a/src/content/docs/ko-kr/docs/examples/upload-file/multiple-file.md +++ b/src/content/docs/ko-kr/docs/examples/upload-file/multiple-file.md @@ -1,6 +1,5 @@ --- title: "여러 파일" - --- 자세한 내용은 [예제 코드](https://github.com/gin-gonic/examples/tree/master/upload-file/multiple)를 확인하세요. @@ -19,7 +18,7 @@ func main() { log.Println(file.Filename) // 특정 경로(dst)에 파일을 업로드 합니다. - c.SaveUploadedFile(file, dst) + c.SaveUploadedFile(file, "./files/" + file.Filename) } c.String(http.StatusOK, fmt.Sprintf("%d files uploaded!", len(files))) }) diff --git a/src/content/docs/ko-kr/docs/examples/upload-file/single-file.md b/src/content/docs/ko-kr/docs/examples/upload-file/single-file.md index 887dd1a88c..7252dbbc24 100644 --- a/src/content/docs/ko-kr/docs/examples/upload-file/single-file.md +++ b/src/content/docs/ko-kr/docs/examples/upload-file/single-file.md @@ -1,6 +1,5 @@ --- title: "단일 파일" - --- 이슈 [#774](https://github.com/gin-gonic/gin/issues/774) 혹은 자세한 [예제 코드](https://github.com/gin-gonic/examples/tree/master/upload-file/single)를 확인하세요. @@ -20,7 +19,7 @@ func main() { log.Println(file.Filename) // 특정 경로(dst)에 파일을 업로드 합니다. - c.SaveUploadedFile(file, dst) + c.SaveUploadedFile(file, "./files/" + file.Filename) c.String(http.StatusOK, fmt.Sprintf("'%s' uploaded!", file.Filename)) }) diff --git a/src/content/docs/ko-kr/docs/examples/using-basicauth-middleware.md b/src/content/docs/ko-kr/docs/examples/using-basicauth-middleware.md index 5ebcd12415..b46b41e91d 100644 --- a/src/content/docs/ko-kr/docs/examples/using-basicauth-middleware.md +++ b/src/content/docs/ko-kr/docs/examples/using-basicauth-middleware.md @@ -1,6 +1,5 @@ --- title: "기본인증(BasicAuth) 미들웨어 사용하기" - --- ```go @@ -12,11 +11,11 @@ var secrets = gin.H{ } func main() { - r := gin.Default() + router := gin.Default() // gin.BasicAuth() 미들웨어를 사용하여 그룹화 하기 // gin.Accounts는 map[string]string 타입입니다. - authorized := r.Group("/admin", gin.BasicAuth(gin.Accounts{ + authorized := router.Group("/admin", gin.BasicAuth(gin.Accounts{ "foo": "bar", "austin": "1234", "lena": "hello2", @@ -36,6 +35,6 @@ func main() { }) // 서버가 실행 되고 0.0.0.0:8080 에서 요청을 기다립니다. - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/ko-kr/docs/examples/using-middleware.md b/src/content/docs/ko-kr/docs/examples/using-middleware.md index e6f25e5e1b..be654d81ff 100644 --- a/src/content/docs/ko-kr/docs/examples/using-middleware.md +++ b/src/content/docs/ko-kr/docs/examples/using-middleware.md @@ -1,6 +1,5 @@ --- title: "미들웨어를 사용하기" - --- ```go @@ -11,18 +10,18 @@ func main() { // Global middleware // GIN_MODE=release로 하더라도 Logger 미들웨어는 gin.DefaultWriter에 로그를 기록합니다. // 기본값 gin.DefaultWriter = os.Stdout - r.Use(gin.Logger()) + router.Use(gin.Logger()) // Recovery 미들웨어는 panic이 발생하면 500 에러를 씁니다. - r.Use(gin.Recovery()) + router.Use(gin.Recovery()) // 각 라우트 당 원하는만큼 미들웨어를 추가 할 수 있습니다. - r.GET("/benchmark", MyBenchLogger(), benchEndpoint) + router.GET("/benchmark", MyBenchLogger(), benchEndpoint) // 권한 그룹 - // authorized := r.Group("/", AuthRequired()) + // authorized := router.Group("/", AuthRequired()) // 다음과 동일합니다: - authorized := r.Group("/") + authorized := router.Group("/") // 그룹별로 미들웨어를 사용할 수 있습니다! // 이 경우 "authorized"그룹에서만 사용자 정의 생성된 AuthRequired() 미들웨어를 사용합니다. authorized.Use(AuthRequired()) @@ -37,7 +36,7 @@ func main() { } // 서버가 실행 되고 0.0.0.0:8080 에서 요청을 기다립니다. - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/ko-kr/docs/examples/without-middleware.md b/src/content/docs/ko-kr/docs/examples/without-middleware.md index a18fc1c45c..9847c29cd0 100644 --- a/src/content/docs/ko-kr/docs/examples/without-middleware.md +++ b/src/content/docs/ko-kr/docs/examples/without-middleware.md @@ -1,6 +1,5 @@ --- title: "기본 미들웨어를 포함하지 않는 방법" - --- 이렇게 사용하세요. diff --git a/src/content/docs/ko-kr/docs/examples/write-log.md b/src/content/docs/ko-kr/docs/examples/write-log.md index c281e154e6..c4abe18640 100644 --- a/src/content/docs/ko-kr/docs/examples/write-log.md +++ b/src/content/docs/ko-kr/docs/examples/write-log.md @@ -1,6 +1,5 @@ --- title: "로그 파일을 작성하는 방법" - --- ```go diff --git a/src/content/docs/ko-kr/docs/faq/index.md b/src/content/docs/ko-kr/docs/faq/index.md index 25dd07af0a..98491149a6 100644 --- a/src/content/docs/ko-kr/docs/faq/index.md +++ b/src/content/docs/ko-kr/docs/faq/index.md @@ -1,6 +1,5 @@ --- title: "FAQ" - sidebar: order: 9 --- diff --git a/src/content/docs/ko-kr/docs/features/index.md b/src/content/docs/ko-kr/docs/features/index.md index 6974af41ba..37f6bb8395 100644 --- a/src/content/docs/ko-kr/docs/features/index.md +++ b/src/content/docs/ko-kr/docs/features/index.md @@ -1,6 +1,5 @@ --- title: "기능" - sidebar: order: 4 --- diff --git a/src/content/docs/ko-kr/docs/index.md b/src/content/docs/ko-kr/docs/index.md index 461f7eccf5..90cc4c3992 100644 --- a/src/content/docs/ko-kr/docs/index.md +++ b/src/content/docs/ko-kr/docs/index.md @@ -1,8 +1,7 @@ --- title: "문서" -linkTitle: "문서" sidebar: - order: 1 + order: 20 --- ## Gin 이란? diff --git a/src/content/docs/ko-kr/docs/introduction/index.md b/src/content/docs/ko-kr/docs/introduction/index.md index 5834a7272e..3210a81c51 100644 --- a/src/content/docs/ko-kr/docs/introduction/index.md +++ b/src/content/docs/ko-kr/docs/introduction/index.md @@ -1,6 +1,5 @@ --- title: "소개" - sidebar: order: 1 --- diff --git a/src/content/docs/ko-kr/docs/jsoniter/index.md b/src/content/docs/ko-kr/docs/jsoniter/index.md index aac91af913..6861520730 100644 --- a/src/content/docs/ko-kr/docs/jsoniter/index.md +++ b/src/content/docs/ko-kr/docs/jsoniter/index.md @@ -1,6 +1,5 @@ --- title: "Jsoniter" - sidebar: order: 5 --- diff --git a/src/content/docs/ko-kr/docs/quickstart/index.md b/src/content/docs/ko-kr/docs/quickstart/index.md index 708d50bb27..40f08017d0 100644 --- a/src/content/docs/ko-kr/docs/quickstart/index.md +++ b/src/content/docs/ko-kr/docs/quickstart/index.md @@ -1,6 +1,5 @@ --- title: "퀵 스타트" - sidebar: order: 2 --- @@ -84,13 +83,13 @@ package main import "github.com/gin-gonic/gin" func main() { - r := gin.Default() - r.GET("/ping", func(c *gin.Context) { + router := gin.Default() + router.GET("/ping", func(c *gin.Context) { c.JSON(200, gin.H{ "message": "pong", }) }) - r.Run() // 서버가 실행 되고 0.0.0.0:8080 에서 요청을 기다립니다. + router.Run() // 서버가 실행 되고 0.0.0.0:8080 에서 요청을 기다립니다. } ``` diff --git a/src/content/docs/ko-kr/docs/testing/index.md b/src/content/docs/ko-kr/docs/testing/index.md index dfc2641d3c..91553c7672 100644 --- a/src/content/docs/ko-kr/docs/testing/index.md +++ b/src/content/docs/ko-kr/docs/testing/index.md @@ -1,6 +1,5 @@ --- title: "테스트" - sidebar: order: 7 --- @@ -20,15 +19,15 @@ type User struct { } func setupRouter() *gin.Engine { - r := gin.Default() - r.GET("/ping", func(c *gin.Context) { + router := gin.Default() + router.GET("/ping", func(c *gin.Context) { c.String(200, "pong") }) return r } func postUser(r *gin.Engine) *gin.Engine { - r.POST("/user/add", func(c *gin.Context) { + router.POST("/user/add", func(c *gin.Context) { var user User c.BindJSON(&user) c.JSON(200, user) @@ -39,7 +38,7 @@ func postUser(r *gin.Engine) *gin.Engine { func main() { r := setupRouter() r = postUser(r) - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/ko-kr/docs/users/index.md b/src/content/docs/ko-kr/docs/users/index.md index fbb3031f18..6b32c476ca 100644 --- a/src/content/docs/ko-kr/docs/users/index.md +++ b/src/content/docs/ko-kr/docs/users/index.md @@ -1,6 +1,5 @@ --- title: "Gin을 사용하는 곳" - sidebar: order: 8 --- diff --git a/src/content/docs/pt/blog/index.md b/src/content/docs/pt/blog/index.md index abfaf1a4d8..b735b7afd6 100644 --- a/src/content/docs/pt/blog/index.md +++ b/src/content/docs/pt/blog/index.md @@ -1,6 +1,5 @@ --- title: "Blogue" -linkTitle: "Blogue" sidebar: order: 30 --- diff --git a/src/content/docs/pt/blog/news/how-to-build-one-effective-middleware.md b/src/content/docs/pt/blog/news/how-to-build-one-effective-middleware.md index c5ff642a81..289d9608e9 100644 --- a/src/content/docs/pt/blog/news/how-to-build-one-effective-middleware.md +++ b/src/content/docs/pt/blog/news/how-to-build-one-effective-middleware.md @@ -1,7 +1,7 @@ --- title: "Como construir um intermediário efetivo?" linkTitle: "Como construir um intermediário efetivo?" -date: 2019-02-26 +lastUpdated: 2019-02-26 --- ## Partes constituintes diff --git a/src/content/docs/pt/blog/releases/release13.md b/src/content/docs/pt/blog/releases/release13.md index 43f4656f4e..8d5057ad72 100644 --- a/src/content/docs/pt/blog/releases/release13.md +++ b/src/content/docs/pt/blog/releases/release13.md @@ -1,7 +1,7 @@ --- title: "Gin 1.3.0 is released" linkTitle: "Gin 1.3.0 is released" -date: 2018-08-14 +lastUpdated: 2018-08-14 --- ### CHANGELOG diff --git a/src/content/docs/pt/blog/releases/release14.md b/src/content/docs/pt/blog/releases/release14.md index 23fd648294..c145f3b520 100644 --- a/src/content/docs/pt/blog/releases/release14.md +++ b/src/content/docs/pt/blog/releases/release14.md @@ -1,7 +1,7 @@ --- title: "Gin 1.4.0 is released" linkTitle: "Gin 1.4.0 is released" -date: 2019-05-08 +lastUpdated: 2019-05-08 --- ### CHANGELOG diff --git a/src/content/docs/pt/blog/releases/release15.md b/src/content/docs/pt/blog/releases/release15.md index e4593b3ceb..4f5707a177 100644 --- a/src/content/docs/pt/blog/releases/release15.md +++ b/src/content/docs/pt/blog/releases/release15.md @@ -1,7 +1,7 @@ --- title: "Gin 1.5.0 is released" linkTitle: "Gin 1.5.0 is released" -date: 2019-11-28 +lastUpdated: 2019-11-28 --- ### CHANGELOG diff --git a/src/content/docs/pt/blog/releases/release16.md b/src/content/docs/pt/blog/releases/release16.md index 539997c964..dfc0c6ef58 100644 --- a/src/content/docs/pt/blog/releases/release16.md +++ b/src/content/docs/pt/blog/releases/release16.md @@ -1,7 +1,7 @@ --- title: "Gin 1.6.0 is released" linkTitle: "Gin 1.6.0 is released" -date: 2020-03-22 +lastUpdated: 2020-03-22 --- ### CHANGELOG diff --git a/src/content/docs/pt/docs/benchmarks/index.md b/src/content/docs/pt/docs/benchmarks/index.md index d79c367603..5f1945900a 100644 --- a/src/content/docs/pt/docs/benchmarks/index.md +++ b/src/content/docs/pt/docs/benchmarks/index.md @@ -1,6 +1,5 @@ --- title: "Analises Comparativas" - sidebar: order: 3 --- diff --git a/src/content/docs/pt/docs/deployment/index.md b/src/content/docs/pt/docs/deployment/index.md index d88f7f9682..b9bd09bdd1 100644 --- a/src/content/docs/pt/docs/deployment/index.md +++ b/src/content/docs/pt/docs/deployment/index.md @@ -1,6 +1,5 @@ --- title: "Implementação em Produção" - sidebar: order: 6 --- @@ -30,3 +29,113 @@ Siga o [guia da Render para implementação de projetos de Gin em produção](ht A GAE tem duas maneiras de implementar aplicações de Go em produção. O ambiente padrão é mais fácil de usar mas menos personalizável e impedi [syscalls](https://github.com/gin-gonic/gin/issues/1639) por razões de segurança. O ambiente flexível pode executar qualquer abstração ou biblioteca. Saiba mais e escolha o teu ambiente preferido na [Go sobre a Google App Engine](https://cloud.google.com/appengine/docs/go/). + +## Self Hosted + +Gin projects can also be deployed in a self-hosted manner. Deployment architecture and security considerations vary depending on the target environment. The following section only presents a high level overview of configuration options to consider when planning the deployment. + +## Configuration Options + +Gin project deployments can be tuned by using environment variables or directly in code. + +The following environment variables are available for configuring Gin: + +| Environment Variable | Description | +| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| PORT | The TCP port to listen on when starting the Gin server with `router.Run()` (i.e. without any arguments). | +| GIN_MODE | Set to one of `debug`, `release`, or `test`. Handles management of Gin modes, such as when to emit debug outputs. Can also be set in code using `gin.SetMode(gin.ReleaseMode)` or `gin.SetMode(gin.TestMode)` | + +The following code can be used to configure Gin. + +```go +// Don't specify the bind address or port for Gin. Defaults to binding on all interfaces on port 8080. +// Can use the `PORT` environment variable to change the listen port when using `Run()` without any arguments. +router := gin.Default() +router.Run() + +// Specify the bind address and port for Gin. +router := gin.Default() +router.Run("192.168.1.100:8080") + +// Specify only the listen port. Will bind on all interfaces. +router := gin.Default() +router.Run(":8080") + +// Set which IP addresses or CIDRs, are considered to be trusted for setting headers to document real client IP addresses. +// See the documentation for additional details. +router := gin.Default() +router.SetTrustedProxies([]string{"192.168.1.2"}) +``` + +## Don't trust all proxies + +Gin lets you specify which headers to hold the real client IP (if any), +as well as specifying which proxies (or direct clients) you trust to +specify one of these headers. + +Use function `SetTrustedProxies()` on your `gin.Engine` to specify network addresses +or network CIDRs from where clients which their request headers related to client +IP can be trusted. They can be IPv4 addresses, IPv4 CIDRs, IPv6 addresses or +IPv6 CIDRs. + +**Attention:** Gin trust all proxies by default if you don't specify a trusted +proxy using the function above, **this is NOT safe**. At the same time, if you don't +use any proxy, you can disable this feature by using `Engine.SetTrustedProxies(nil)`, +then `Context.ClientIP()` will return the remote address directly to avoid some +unnecessary computation. + +```go +import ( + "fmt" + + "github.com/gin-gonic/gin" +) + +func main() { + router := gin.Default() + router.SetTrustedProxies([]string{"192.168.1.2"}) + + router.GET("/", func(c *gin.Context) { + // If the client is 192.168.1.2, use the X-Forwarded-For + // header to deduce the original client IP from the trust- + // worthy parts of that header. + // Otherwise, simply return the direct client IP + fmt.Printf("ClientIP: %s\n", c.ClientIP()) + }) + router.Run() +} +``` + +**Notice:** If you are using a CDN service, you can set the `Engine.TrustedPlatform` +to skip TrustedProxies check, it has a higher priority than TrustedProxies. +Look at the example below: + +```go +import ( + "fmt" + + "github.com/gin-gonic/gin" +) + +func main() { + router := gin.Default() + // Use predefined header gin.PlatformXXX + // Google App Engine + router.TrustedPlatform = gin.PlatformGoogleAppEngine + // Cloudflare + router.TrustedPlatform = gin.PlatformCloudflare + // Fly.io + router.TrustedPlatform = gin.PlatformFlyIO + // Or, you can set your own trusted request header. But be sure your CDN + // prevents users from passing this header! For example, if your CDN puts + // the client IP in X-CDN-Client-IP: + router.TrustedPlatform = "X-CDN-Client-IP" + + router.GET("/", func(c *gin.Context) { + // If you set TrustedPlatform, ClientIP() will resolve the + // corresponding header and return IP directly + fmt.Printf("ClientIP: %s\n", c.ClientIP()) + }) + router.Run() +} +``` diff --git a/src/content/docs/pt/docs/examples/ascii-json.md b/src/content/docs/pt/docs/examples/ascii-json.md index 43342827d9..42aef7c6fe 100644 --- a/src/content/docs/pt/docs/examples/ascii-json.md +++ b/src/content/docs/pt/docs/examples/ascii-json.md @@ -1,15 +1,14 @@ --- title: "AsciiJSON" - --- Usando a `AsciiJSON` para gerar JSON de apenas ASCII com caracteres que não são ASCII escapados: ```go func main() { - r := gin.Default() + router := gin.Default() - r.GET("/someJSON", func(c *gin.Context) { + router.GET("/someJSON", func(c *gin.Context) { data := map[string]interface{}{ "lang": "GO语言", "tag": "
", @@ -20,6 +19,6 @@ func main() { }) // Ouvir e servir na 0.0.0.0:8080 - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/pt/docs/examples/bind-body-into-dirrerent-structs.md b/src/content/docs/pt/docs/examples/bind-body-into-dirrerent-structs.md index e8b0f38d0e..99e2432ce0 100644 --- a/src/content/docs/pt/docs/examples/bind-body-into-dirrerent-structs.md +++ b/src/content/docs/pt/docs/examples/bind-body-into-dirrerent-structs.md @@ -1,6 +1,5 @@ --- title: "Tentar vincular o corpo à diferentes estruturas" - --- Os métodos normais para vincular o corpo da requisição consumem a `c.Request.Body` e não podem ser chamados várias vezes: diff --git a/src/content/docs/pt/docs/examples/bind-form-data-request-with-custom-struct.md b/src/content/docs/pt/docs/examples/bind-form-data-request-with-custom-struct.md index 47391edebf..2d24cef026 100644 --- a/src/content/docs/pt/docs/examples/bind-form-data-request-with-custom-struct.md +++ b/src/content/docs/pt/docs/examples/bind-form-data-request-with-custom-struct.md @@ -1,6 +1,5 @@ --- title: "Vincular a requisição de dados de formulário com a estrutura personalizada" - --- O seguinte exemplo usando estrutura personalizada: @@ -55,18 +54,18 @@ func GetDataD(c *gin.Context) { } func main() { - r := gin.Default() - r.GET("/getb", GetDataB) - r.GET("/getc", GetDataC) - r.GET("/getd", GetDataD) + router := gin.Default() + router.GET("/getb", GetDataB) + router.GET("/getc", GetDataC) + router.GET("/getd", GetDataD) - r.Run() + router.Run() } ``` Usando o comando `url` e resultado do comando: -``` +```bash $ curl "http://localhost:8080/getb?field_a=hello&field_b=world" {"a":{"FieldA":"hello"},"b":"world"} $ curl "http://localhost:8080/getc?field_a=hello&field_c=world" diff --git a/src/content/docs/pt/docs/examples/bind-html-checkbox.md b/src/content/docs/pt/docs/examples/bind-html-checkbox.md index 0d63e36246..51af146b04 100644 --- a/src/content/docs/pt/docs/examples/bind-html-checkbox.md +++ b/src/content/docs/pt/docs/examples/bind-html-checkbox.md @@ -1,6 +1,5 @@ --- title: "Vincular caixas de confirmações de HTML" - --- Consulte a [informação detalhada](https://github.com/gin-gonic/gin/issues/129#issuecomment-124260092): diff --git a/src/content/docs/pt/docs/examples/bind-query-or-post.md b/src/content/docs/pt/docs/examples/bind-query-or-post.md index 6286c73428..de16f0d838 100644 --- a/src/content/docs/pt/docs/examples/bind-query-or-post.md +++ b/src/content/docs/pt/docs/examples/bind-query-or-post.md @@ -1,6 +1,5 @@ --- title: "Vincular a sequência de caracteres de consulta ou publicar dados" - --- Consulte a [informação detalhada](https://github.com/gin-gonic/gin/issues/742#issuecomment-264681292): diff --git a/src/content/docs/pt/docs/examples/bind-single-binary-with-template.md b/src/content/docs/pt/docs/examples/bind-single-binary-with-template.md index 65d708b98e..4efda3801e 100644 --- a/src/content/docs/pt/docs/examples/bind-single-binary-with-template.md +++ b/src/content/docs/pt/docs/examples/bind-single-binary-with-template.md @@ -1,6 +1,5 @@ --- title: "Construir um único binário com modelos de marcação" - --- ## Usar o pacote de terceiro @@ -14,12 +13,12 @@ func main() { if err != nil { panic(err) } - r.SetHTMLTemplate(t) + router.SetHTMLTemplate(t) - r.GET("/", func(c *gin.Context) { + router.GET("/", func(c *gin.Context) { c.HTML(http.StatusOK, "/html/index.tmpl", nil) }) - r.Run(":8080") + router.Run(":8080") } // loadTemplate carrega os modelos de marcação fixado pelo go-assets-builder diff --git a/src/content/docs/pt/docs/examples/bind-uri.md b/src/content/docs/pt/docs/examples/bind-uri.md index 8808232384..1da6011e7a 100644 --- a/src/content/docs/pt/docs/examples/bind-uri.md +++ b/src/content/docs/pt/docs/examples/bind-uri.md @@ -1,6 +1,5 @@ --- title: "Vincular a URI" - --- Consulte a [informação detalhada](https://github.com/gin-gonic/gin/issues/846): diff --git a/src/content/docs/pt/docs/examples/binding-and-validation.md b/src/content/docs/pt/docs/examples/binding-and-validation.md index a983e9cb56..64dab91ab3 100644 --- a/src/content/docs/pt/docs/examples/binding-and-validation.md +++ b/src/content/docs/pt/docs/examples/binding-and-validation.md @@ -1,6 +1,5 @@ --- title: "Vinculação de Modelo e Validação" - --- Para vincular uma corpo de requisição à um tipo, use a vinculação de modelo. Nós atualmente suportamos a vinculação de JSON, XML, YAML e valores de formulário padrão (foo=bar&boo=baz). diff --git a/src/content/docs/pt/docs/examples/controlling-log-output-coloring.md b/src/content/docs/pt/docs/examples/controlling-log-output-coloring.md index 7ede1eaabd..59f588c724 100644 --- a/src/content/docs/pt/docs/examples/controlling-log-output-coloring.md +++ b/src/content/docs/pt/docs/examples/controlling-log-output-coloring.md @@ -1,6 +1,5 @@ --- title: "Controlando a Colorização da Saída de Registo" - --- Por padrão, a saída de registos na consola deveria ser colorida dependendo do TTY detetado. diff --git a/src/content/docs/pt/docs/examples/cookie.md b/src/content/docs/pt/docs/examples/cookie.md index 507c53febd..3efb30edf5 100644 --- a/src/content/docs/pt/docs/examples/cookie.md +++ b/src/content/docs/pt/docs/examples/cookie.md @@ -1,8 +1,9 @@ --- -title: "Definir e Recuperar um Cookie" - +title: "Cookie" --- +Set and get cookie. + ```go import ( "fmt" @@ -29,3 +30,9 @@ func main() { router.Run() } ``` + +Delete cookie by set max age to -1. + +```go +c.SetCookie("gin_cookie", "test", -1, "/", "localhost", false, true) +``` diff --git a/src/content/docs/pt/docs/examples/custom-http-config.md b/src/content/docs/pt/docs/examples/custom-http-config.md index 224f73e290..e0fda19d6b 100644 --- a/src/content/docs/pt/docs/examples/custom-http-config.md +++ b/src/content/docs/pt/docs/examples/custom-http-config.md @@ -1,6 +1,5 @@ --- title: "Configuração de HTTP Personalizada" - --- Usar o `http.ListenAndServe()` diretamente, desta maneira: diff --git a/src/content/docs/pt/docs/examples/custom-log-format.md b/src/content/docs/pt/docs/examples/custom-log-format.md index 175c5e2632..d4ef85f532 100644 --- a/src/content/docs/pt/docs/examples/custom-log-format.md +++ b/src/content/docs/pt/docs/examples/custom-log-format.md @@ -1,6 +1,5 @@ --- title: "Ficheiro de Registo Personalizado" - --- Por exemplo: diff --git a/src/content/docs/pt/docs/examples/custom-middleware.md b/src/content/docs/pt/docs/examples/custom-middleware.md index cfc637d3d2..c3e1b8088d 100644 --- a/src/content/docs/pt/docs/examples/custom-middleware.md +++ b/src/content/docs/pt/docs/examples/custom-middleware.md @@ -1,6 +1,5 @@ --- title: "Intermediário Personalizado" - --- ```go @@ -27,9 +26,9 @@ func Logger() gin.HandlerFunc { func main() { r := gin.New() - r.Use(Logger()) + router.Use(Logger()) - r.GET("/test", func(c *gin.Context) { + router.GET("/test", func(c *gin.Context) { example := c.MustGet("example").(string) // imprimiria: "12345" @@ -37,7 +36,7 @@ func main() { }) // Ouvir e servir na 0.0.0.0:8080 - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/pt/docs/examples/custom-validators.md b/src/content/docs/pt/docs/examples/custom-validators.md index eaec97ffbe..5a4287e383 100644 --- a/src/content/docs/pt/docs/examples/custom-validators.md +++ b/src/content/docs/pt/docs/examples/custom-validators.md @@ -1,6 +1,5 @@ --- title: "Validadores Personalizados" - --- Também é possível registar validadores personalizados. Consulte o [código de exemplo](https://github.com/gin-gonic/examples/tree/master/struct-lvl-validations): diff --git a/src/content/docs/pt/docs/examples/define-format-for-the-log-of-routes.md b/src/content/docs/pt/docs/examples/define-format-for-the-log-of-routes.md index 5fed784f5d..1d3301e7b1 100644 --- a/src/content/docs/pt/docs/examples/define-format-for-the-log-of-routes.md +++ b/src/content/docs/pt/docs/examples/define-format-for-the-log-of-routes.md @@ -1,6 +1,5 @@ --- title: "Definir o Formato para o Registo de Rotas" - --- O registo padrão de rotas é: @@ -23,24 +22,24 @@ import ( ) func main() { - r := gin.Default() + router := gin.Default() gin.DebugPrintRouteFunc = func(httpMethod, absolutePath, handlerName string, nuHandlers int) { log.Printf("endpoint %v %v %v %v\n", httpMethod, absolutePath, handlerName, nuHandlers) } - r.POST("/foo", func(c *gin.Context) { + router.POST("/foo", func(c *gin.Context) { c.JSON(http.StatusOK, "foo") }) - r.GET("/bar", func(c *gin.Context) { + router.GET("/bar", func(c *gin.Context) { c.JSON(http.StatusOK, "bar") }) - r.GET("/status", func(c *gin.Context) { + router.GET("/status", func(c *gin.Context) { c.JSON(http.StatusOK, "ok") }) // Ouvir e servir na http://0.0.0.0:8080 - r.Run() + router.Run() } ``` diff --git a/src/content/docs/pt/docs/examples/goroutines-inside-a-middleware.md b/src/content/docs/pt/docs/examples/goroutines-inside-a-middleware.md index aa303d4a81..0a744f7a4f 100644 --- a/src/content/docs/pt/docs/examples/goroutines-inside-a-middleware.md +++ b/src/content/docs/pt/docs/examples/goroutines-inside-a-middleware.md @@ -1,15 +1,14 @@ --- title: "Rotinas de Go dentro dum Intermediário" - --- Quando começares novas rotinas de Go dentro dum intermediário ou manipulador, **NÃO DEVERIAS** usar o contexto original dentro dele, tens que usar uma cópia de apenas leitura. ```go func main() { - r := gin.Default() + router := gin.Default() - r.GET("/long_async", func(c *gin.Context) { + router.GET("/long_async", func(c *gin.Context) { // criar cópia a ser usada dentro da rotina de go cCp := c.Copy() go func() { @@ -21,7 +20,7 @@ func main() { }() }) - r.GET("/long_sync", func(c *gin.Context) { + router.GET("/long_sync", func(c *gin.Context) { // simular uma tarefa longa com time.Sleep(). 5 segundos time.Sleep(5 * time.Second) @@ -30,6 +29,6 @@ func main() { }) // ouvir e servir na porta 0.0.0.0:8080 - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/pt/docs/examples/graceful-restart-or-stop.md b/src/content/docs/pt/docs/examples/graceful-restart-or-stop.md index 6e1e7690dc..c2dcb32cec 100644 --- a/src/content/docs/pt/docs/examples/graceful-restart-or-stop.md +++ b/src/content/docs/pt/docs/examples/graceful-restart-or-stop.md @@ -1,6 +1,5 @@ --- title: "Reinicialização ou Interrupção Graciosa" - --- Queres reiniciar ou parar graciosamente o teu servidor de web? @@ -62,7 +61,7 @@ func main() { // espere pelo sinal de interrupção para parar graciosamente o // servidor com uma pausa de 5 segundos. quit := make(chan os.Signal, 1) - // "kill" padrão (sem parâmetro) envia "syscanll.SIGTERM" + // "kill" padrão (sem parâmetro) envia "syscall.SIGTERM" // "kill -2" é "syscall.SIGINT" // "kill -9" é "syscall.SIGKILL" mas não pode ser capturado, // então não precisas adicioná-lo diff --git a/src/content/docs/pt/docs/examples/grouping-routes.md b/src/content/docs/pt/docs/examples/grouping-routes.md index 5d1c0d092f..64e30ae228 100644 --- a/src/content/docs/pt/docs/examples/grouping-routes.md +++ b/src/content/docs/pt/docs/examples/grouping-routes.md @@ -1,6 +1,5 @@ --- title: "Agrupamento de Rotas" - --- ```go @@ -8,16 +7,16 @@ func main() { router := gin.Default() // grupo simples: v1 - v1 := router.Group("/v1") { + v1 := router.Group("/v1") v1.POST("/login", loginEndpoint) v1.POST("/submit", submitEndpoint) v1.POST("/read", readEndpoint) } // grupo simples: v2 - v2 := router.Group("/v2") { + v2 := router.Group("/v2") v2.POST("/login", loginEndpoint) v2.POST("/submit", submitEndpoint) v2.POST("/read", readEndpoint) diff --git a/src/content/docs/pt/docs/examples/html-rendering.md b/src/content/docs/pt/docs/examples/html-rendering.md index b36c22c3ee..ae3533ec34 100644 --- a/src/content/docs/pt/docs/examples/html-rendering.md +++ b/src/content/docs/pt/docs/examples/html-rendering.md @@ -1,6 +1,5 @@ --- title: "Interpretação do HTML" - --- Usando `LoadHTMLGlob()` ou `LoadHTMLFiles()`: @@ -93,9 +92,9 @@ func main() { Tu podes usar delimitadores personalizados: ```go - r := gin.Default() - r.Delims("{[{", "}]}") - r.LoadHTMLGlob("/path/to/templates") + router := gin.Default() + router.Delims("{[{", "}]}") + router.LoadHTMLGlob("/path/to/templates") ``` ### Funções de Modelo de Marcação Personalizado diff --git a/src/content/docs/pt/docs/examples/http-method.md b/src/content/docs/pt/docs/examples/http-method.md index 7a648f10fd..37b9676021 100644 --- a/src/content/docs/pt/docs/examples/http-method.md +++ b/src/content/docs/pt/docs/examples/http-method.md @@ -1,6 +1,5 @@ --- title: "Usando o Método de HTTP" - --- ```go diff --git a/src/content/docs/pt/docs/examples/http2-server-push.md b/src/content/docs/pt/docs/examples/http2-server-push.md index f2268ad0fd..03a8461c48 100644 --- a/src/content/docs/pt/docs/examples/http2-server-push.md +++ b/src/content/docs/pt/docs/examples/http2-server-push.md @@ -1,6 +1,5 @@ --- title: "Impulso do Servidor de HTTP2" - --- `http.Pusher` é suportado apenas versão **1.8+** de Go. Consulte o [blogue da Golang](https://blog.golang.org/h2push) por informação detalhada: @@ -28,11 +27,11 @@ var html = template.Must(template.New("https").Parse(` `)) func main() { - r := gin.Default() - r.Static("/assets", "./assets") - r.SetHTMLTemplate(html) + router := gin.Default() + router.Static("/assets", "./assets") + router.SetHTMLTemplate(html) - r.GET("/", func(c *gin.Context) { + router.GET("/", func(c *gin.Context) { if pusher := c.Writer.Pusher(); pusher != nil { // usar pusher.Push() para impulsionar o servidor. if err := pusher.Push("/assets/app.js", nil); err != nil { @@ -45,7 +44,7 @@ func main() { }) // ouvir e servir no https://127.0.0.1:8080 - r.RunTLS(":8080", "./testdata/server.pem", "./testdata/server.key") + router.RunTLS(":8080", "./testdata/server.pem", "./testdata/server.key") } ``` diff --git a/src/content/docs/pt/docs/examples/index.md b/src/content/docs/pt/docs/examples/index.md index 1fe74c9e2c..0014a4bc95 100644 --- a/src/content/docs/pt/docs/examples/index.md +++ b/src/content/docs/pt/docs/examples/index.md @@ -1,6 +1,5 @@ --- title: "Exemplos" - sidebar: order: 6 --- diff --git a/src/content/docs/pt/docs/examples/jsonp.md b/src/content/docs/pt/docs/examples/jsonp.md index adc58d0209..3b1ed4f1c4 100644 --- a/src/content/docs/pt/docs/examples/jsonp.md +++ b/src/content/docs/pt/docs/examples/jsonp.md @@ -1,15 +1,14 @@ --- title: "JSONP" - --- Usando JSONP para pedir dados dum servidor num domínio diferente. Adicione a função de resposta ao corpo da resposta se a função de resposta do parâmetro da consulta existir: ```go func main() { - r := gin.Default() + router := gin.Default() - r.GET("/JSONP?callback=x", func(c *gin.Context) { + router.GET("/JSONP?callback=x", func(c *gin.Context) { data := map[string]interface{}{ "foo": "bar", } @@ -20,6 +19,6 @@ func main() { }) // ouvir e servir no 0.0.0.0:8080 - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/pt/docs/examples/map-as-querystring-or-postform.md b/src/content/docs/pt/docs/examples/map-as-querystring-or-postform.md index d679aa0db2..778e5a284c 100644 --- a/src/content/docs/pt/docs/examples/map-as-querystring-or-postform.md +++ b/src/content/docs/pt/docs/examples/map-as-querystring-or-postform.md @@ -1,6 +1,5 @@ --- title: "Mapa como Sequência de Caracteres de Consulta ou Parâmetros de Formulário de Publicação" - --- ```sh diff --git a/src/content/docs/pt/docs/examples/multipart-urlencoded-binding.md b/src/content/docs/pt/docs/examples/multipart-urlencoded-binding.md index f0d86ce154..ae6e859270 100644 --- a/src/content/docs/pt/docs/examples/multipart-urlencoded-binding.md +++ b/src/content/docs/pt/docs/examples/multipart-urlencoded-binding.md @@ -1,6 +1,5 @@ --- title: "Vínculo de Várias Partes / URL Codificada" - --- ```go diff --git a/src/content/docs/pt/docs/examples/multipart-urlencoded-form.md b/src/content/docs/pt/docs/examples/multipart-urlencoded-form.md index 2914f0a4d0..dbff6fde50 100644 --- a/src/content/docs/pt/docs/examples/multipart-urlencoded-form.md +++ b/src/content/docs/pt/docs/examples/multipart-urlencoded-form.md @@ -1,6 +1,5 @@ --- title: "Formulário de Várias Partes / URL Codificada" - --- ```go diff --git a/src/content/docs/pt/docs/examples/multiple-template.md b/src/content/docs/pt/docs/examples/multiple-template.md index 2a8ad5edd8..ffd20f721a 100644 --- a/src/content/docs/pt/docs/examples/multiple-template.md +++ b/src/content/docs/pt/docs/examples/multiple-template.md @@ -1,6 +1,5 @@ --- title: "Vários Modelos de Marcação" - --- A Gin permite por padrão usar apenas um `html.Template`. Consulte [um interpretador de vários modelos de marcação] para usares funcionalidades como `block template` de Go 1.6. diff --git a/src/content/docs/pt/docs/examples/only-bind-query-string.md b/src/content/docs/pt/docs/examples/only-bind-query-string.md index daffb70c7a..ceb1fd163c 100644 --- a/src/content/docs/pt/docs/examples/only-bind-query-string.md +++ b/src/content/docs/pt/docs/examples/only-bind-query-string.md @@ -1,6 +1,5 @@ --- title: "Vincular Apenas a Sequência de Caracteres de Consulta" - --- A função `ShouldBindQuery` apenas vincula os parâmetros de consulta e não os dados da publicação. Consulte a [informação detalhada](https://github.com/gin-gonic/gin/issues/742#issuecomment-315953017): diff --git a/src/content/docs/pt/docs/examples/param-in-path.md b/src/content/docs/pt/docs/examples/param-in-path.md index 316bbadce2..200f6e8d9d 100644 --- a/src/content/docs/pt/docs/examples/param-in-path.md +++ b/src/content/docs/pt/docs/examples/param-in-path.md @@ -1,6 +1,5 @@ --- title: "Parâmetros no Caminho" - --- ```go diff --git a/src/content/docs/pt/docs/examples/pure-json.md b/src/content/docs/pt/docs/examples/pure-json.md index ea16e85eeb..67ddbe6457 100644 --- a/src/content/docs/pt/docs/examples/pure-json.md +++ b/src/content/docs/pt/docs/examples/pure-json.md @@ -1,29 +1,28 @@ --- title: "PureJSON" - --- Normalmente, a JSON substitui os caracteres de HTML especiais com suas entidades de unicode, por exemplo, `<` torna-se `\u003c`. Se quiseres codificar tais caracteres literalmente, podes usar PureJSON. Esta funcionalidade está indisponível na Go 1.6 para baixo: ```go func main() { - r := gin.Default() + router := gin.Default() // servir as entidades de unicode - r.GET("/json", func(c *gin.Context) { + router.GET("/json", func(c *gin.Context) { c.JSON(200, gin.H{ "html": "Hello, world!", }) }) // servir os caracteres literais - r.GET("/purejson", func(c *gin.Context) { + router.GET("/purejson", func(c *gin.Context) { c.PureJSON(200, gin.H{ "html": "Hello, world!", }) }) // ouvir e servir no 0.0.0.0:8080 - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/pt/docs/examples/query-and-post-form.md b/src/content/docs/pt/docs/examples/query-and-post-form.md index e82f521848..dd26fd6316 100644 --- a/src/content/docs/pt/docs/examples/query-and-post-form.md +++ b/src/content/docs/pt/docs/examples/query-and-post-form.md @@ -1,6 +1,5 @@ --- title: "Consulta e Formulário de Publicação" - --- ```sh diff --git a/src/content/docs/pt/docs/examples/querystring-param.md b/src/content/docs/pt/docs/examples/querystring-param.md index b2bd8a5630..11c4f04a4e 100644 --- a/src/content/docs/pt/docs/examples/querystring-param.md +++ b/src/content/docs/pt/docs/examples/querystring-param.md @@ -1,6 +1,5 @@ --- title: "Parâmetros da Sequência de Consulta" - --- ```go diff --git a/src/content/docs/pt/docs/examples/redirects.md b/src/content/docs/pt/docs/examples/redirects.md index eb86cba110..ee32d634cd 100644 --- a/src/content/docs/pt/docs/examples/redirects.md +++ b/src/content/docs/pt/docs/examples/redirects.md @@ -1,12 +1,11 @@ --- title: "Redirecionamentos" - --- Emitir um redirecionamento de HTTP é fácil. Ambas localizações internas e externas são suportadas: ```go -r.GET("/test", func(c *gin.Context) { +router.GET("/test", func(c *gin.Context) { c.Redirect(http.StatusMovedPermanently, "http://www.google.com/") }) ``` @@ -14,7 +13,7 @@ r.GET("/test", func(c *gin.Context) { Emitir um redirecionamento de HTTP a partir do `POST`. Consulte o problema: [#444](https://github.com/gin-gonic/gin/issues/444): ```go -r.POST("/test", func(c *gin.Context) { +router.POST("/test", func(c *gin.Context) { c.Redirect(http.StatusFound, "/foo") }) ``` @@ -22,11 +21,11 @@ r.POST("/test", func(c *gin.Context) { Emitir um redirecionamento de roteador, use `HandleContext` como abaixo: ``` go -r.GET("/test", func(c *gin.Context) { +router.GET("/test", func(c *gin.Context) { c.Request.URL.Path = "/test2" - r.HandleContext(c) + router.HandleContext(c) }) -r.GET("/test2", func(c *gin.Context) { +router.GET("/test2", func(c *gin.Context) { c.JSON(200, gin.H{"hello": "world"}) }) ``` diff --git a/src/content/docs/pt/docs/examples/rendering.md b/src/content/docs/pt/docs/examples/rendering.md index 8dcc31c856..7784f0914a 100644 --- a/src/content/docs/pt/docs/examples/rendering.md +++ b/src/content/docs/pt/docs/examples/rendering.md @@ -1,18 +1,17 @@ --- title: "Interpretação de XML/JSON/YAML/ProtoBuf" - --- ```go func main() { - r := gin.Default() + router := gin.Default() // "gin.H" é um atalho para "map[string]interface{}" - r.GET("/someJSON", func(c *gin.Context) { + router.GET("/someJSON", func(c *gin.Context) { c.JSON(http.StatusOK, gin.H{"message": "hey", "status": http.StatusOK}) }) - r.GET("/moreJSON", func(c *gin.Context) { + router.GET("/moreJSON", func(c *gin.Context) { // também podes usar uma estrutura var msg struct { Name string `json:"user"` @@ -27,15 +26,15 @@ func main() { c.JSON(http.StatusOK, msg) }) - r.GET("/someXML", func(c *gin.Context) { + router.GET("/someXML", func(c *gin.Context) { c.XML(http.StatusOK, gin.H{"message": "hey", "status": http.StatusOK}) }) - r.GET("/someYAML", func(c *gin.Context) { + router.GET("/someYAML", func(c *gin.Context) { c.YAML(http.StatusOK, gin.H{"message": "hey", "status": http.StatusOK}) }) - r.GET("/someProtoBuf", func(c *gin.Context) { + router.GET("/someProtoBuf", func(c *gin.Context) { reps := []int64{int64(1), int64(2)} label := "test" // a definição específica do protobuf @@ -50,6 +49,6 @@ func main() { }) // ouvir e servir na 0.0.0.0:8080 - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/pt/docs/examples/run-multiple-service.md b/src/content/docs/pt/docs/examples/run-multiple-service.md index 5eba59d628..49078c1446 100644 --- a/src/content/docs/pt/docs/examples/run-multiple-service.md +++ b/src/content/docs/pt/docs/examples/run-multiple-service.md @@ -1,6 +1,5 @@ --- title: "Executar Vários Serviços" - --- Consulte a [questão](https://github.com/gin-gonic/gin/issues/346) e tente seguinte exemplo: diff --git a/src/content/docs/pt/docs/examples/secure-json.md b/src/content/docs/pt/docs/examples/secure-json.md index 518d2df4b6..e33fcdc7f8 100644 --- a/src/content/docs/pt/docs/examples/secure-json.md +++ b/src/content/docs/pt/docs/examples/secure-json.md @@ -1,18 +1,17 @@ --- title: "SecureJSON" - --- Usando SecureJSON para impedir o sequestro do JSON. Por padrão adiciona `"while(1)"` no início do corpo da resposta se a dada estrutura for valores de arranjo: ```go func main() { - r := gin.Default() + router := gin.Default() // podes também usar o teu próprio prefixo de JSON seguro - // r.SecureJsonPrefix(")]}',\n") + // router.SecureJsonPrefix(")]}',\n") - r.GET("/someJSON", func(c *gin.Context) { + router.GET("/someJSON", func(c *gin.Context) { names := []string{"lena", "austin", "foo"} // resultará em: while(1);["lena","austin","foo"] @@ -20,6 +19,6 @@ func main() { }) // ouvir e servir no 0.0.0.0:8080 - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/pt/docs/examples/security-headers.md b/src/content/docs/pt/docs/examples/security-headers.md index 37f1033606..564bbda947 100644 --- a/src/content/docs/pt/docs/examples/security-headers.md +++ b/src/content/docs/pt/docs/examples/security-headers.md @@ -1,6 +1,5 @@ --- title: "Cabeçalhos de segurança" - --- É importante utilizar cabeçalhos de segurança para proteger a sua aplicação Web de vulnerabilidades de segurança comuns. Este exemplo mostra-lhe como adicionar cabeçalhos de segurança à sua aplicação Gin e também como evitar ataques relacionados com a injeção de cabeçalhos de anfitrião (SSRF, Open Redirection). diff --git a/src/content/docs/pt/docs/examples/serving-data-from-reader.md b/src/content/docs/pt/docs/examples/serving-data-from-reader.md index 5af74e4613..c1fe77aa27 100644 --- a/src/content/docs/pt/docs/examples/serving-data-from-reader.md +++ b/src/content/docs/pt/docs/examples/serving-data-from-reader.md @@ -1,6 +1,5 @@ --- title: "Servir os Dados a partir do Leitor" - --- ```go diff --git a/src/content/docs/pt/docs/examples/serving-static-files.md b/src/content/docs/pt/docs/examples/serving-static-files.md index 4c9ba2348c..bd80092c88 100644 --- a/src/content/docs/pt/docs/examples/serving-static-files.md +++ b/src/content/docs/pt/docs/examples/serving-static-files.md @@ -1,6 +1,5 @@ --- title: "Servir os Ficheiros Estáticos" - --- ```go diff --git a/src/content/docs/pt/docs/examples/support-lets-encrypt.md b/src/content/docs/pt/docs/examples/support-lets-encrypt.md index 6fe1fee9ab..126426e39c 100644 --- a/src/content/docs/pt/docs/examples/support-lets-encrypt.md +++ b/src/content/docs/pt/docs/examples/support-lets-encrypt.md @@ -1,6 +1,5 @@ --- title: "Suportar Let's Encrypt" - --- Exemplo para servidores de HTTP LetsEncrypt de uma linha: @@ -16,10 +15,10 @@ import ( ) func main() { - r := gin.Default() + router := gin.Default() // manipulador de ping - r.GET("/ping", func(c *gin.Context) { + router.GET("/ping", func(c *gin.Context) { c.String(200, "pong") }) @@ -41,10 +40,10 @@ import ( ) func main() { - r := gin.Default() + router := gin.Default() // manipulador de ping - r.GET("/ping", func(c *gin.Context) { + router.GET("/ping", func(c *gin.Context) { c.String(200, "pong") }) diff --git a/src/content/docs/pt/docs/examples/upload-file/index.md b/src/content/docs/pt/docs/examples/upload-file/index.md index d6d11e9f5f..920b5500f4 100644 --- a/src/content/docs/pt/docs/examples/upload-file/index.md +++ b/src/content/docs/pt/docs/examples/upload-file/index.md @@ -1,6 +1,5 @@ --- title: "Carregar Ficheiros" - --- A seção lista o uso da API de carregamento de ficheiro. diff --git a/src/content/docs/pt/docs/examples/upload-file/multiple-file.md b/src/content/docs/pt/docs/examples/upload-file/multiple-file.md index 6e37537d63..2240f4e8bd 100644 --- a/src/content/docs/pt/docs/examples/upload-file/multiple-file.md +++ b/src/content/docs/pt/docs/examples/upload-file/multiple-file.md @@ -1,6 +1,5 @@ --- title: "Vários Ficheiros" - --- Consulte o [código de exemplo](https://github.com/gin-gonic/examples/tree/master/upload-file/multiple) detalhado. @@ -19,8 +18,8 @@ func main() { for _, file := range files { log.Println(file.Filename) - // carregar o ficheiro para um destino específico. - c.SaveUploadedFile(file, dst) + // Upload the file to specific dst. + c.SaveUploadedFile(file, "./files/" + file.Filename) } c.String(http.StatusOK, fmt.Sprintf("%d files uploaded!", len(files))) }) diff --git a/src/content/docs/pt/docs/examples/upload-file/single-file.md b/src/content/docs/pt/docs/examples/upload-file/single-file.md index 0f32d14478..b7c4f6779c 100644 --- a/src/content/docs/pt/docs/examples/upload-file/single-file.md +++ b/src/content/docs/pt/docs/examples/upload-file/single-file.md @@ -1,6 +1,5 @@ --- title: "Único Ficheiro" - --- Consulte a questão [#774](https://github.com/gin-gonic/gin/issues/774) e [exemplo de código](https://github.com/gin-gonic/examples/tree/master/upload-file/single) detalhado. @@ -20,8 +19,8 @@ func main() { file, _ := c.FormFile("file") log.Println(file.Filename) - // carregar o ficheiro para um destino específico. - c.SaveUploadedFile(file, dst) + // Upload the file to specific dst. + c.SaveUploadedFile(file, "./files/" + file.Filename) c.String(http.StatusOK, fmt.Sprintf("'%s' uploaded!", file.Filename)) }) diff --git a/src/content/docs/pt/docs/examples/using-basicauth-middleware.md b/src/content/docs/pt/docs/examples/using-basicauth-middleware.md index e58e16e50a..8a2b977b7e 100644 --- a/src/content/docs/pt/docs/examples/using-basicauth-middleware.md +++ b/src/content/docs/pt/docs/examples/using-basicauth-middleware.md @@ -1,6 +1,5 @@ --- title: "Usar o Intermediário de BasicAuth" - --- ```go @@ -12,11 +11,11 @@ var secrets = gin.H{ } func main() { - r := gin.Default() + router := gin.Default() // grupo usando intermediário de "gin.BasicAuth()" // "gin.Accounts" é um atalho para "map[string]string" - authorized := r.Group("/admin", gin.BasicAuth(gin.Accounts{ + authorized := router.Group("/admin", gin.BasicAuth(gin.Accounts{ "foo": "bar", "austin": "1234", "lena": "hello2", @@ -36,6 +35,6 @@ func main() { }) // ouvir e servir no 0.0.0.0:8080 - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/pt/docs/examples/using-middleware.md b/src/content/docs/pt/docs/examples/using-middleware.md index ff0db3bd25..6cb1326ef8 100644 --- a/src/content/docs/pt/docs/examples/using-middleware.md +++ b/src/content/docs/pt/docs/examples/using-middleware.md @@ -1,6 +1,5 @@ --- title: "Usar Intermediário" - --- ```go @@ -12,19 +11,19 @@ func main() { // intermediário registador escreverá os registos ao "gin.DefaultWriter", // mesmo se definires com "GIN_MODE=release". // por padrão "gin.DefaultWriter = os.Stdout" - r.Use(gin.Logger()) + router.Use(gin.Logger()) // intermediário de recuperação recupera de quaisquer pânicos e // escreve um 500 se ouve um. - r.Use(gin.Recovery()) + router.Use(gin.Recovery()) // intermediário por rota, podes adicionar tanto quanto desejares. - r.GET("/benchmark", MyBenchLogger(), benchEndpoint) + router.GET("/benchmark", MyBenchLogger(), benchEndpoint) // grupo de autorização - // authorized := r.Group("/", AuthRequired()) + // authorized := router.Group("/", AuthRequired()) // exatamente o mesmo que: - authorized := r.Group("/") + authorized := router.Group("/") // intermediário por grupo! neste caso usamos o intermediário // "AuthRequired()" criado de maneira personalizada só no // grupo "authorized". @@ -40,7 +39,7 @@ func main() { } // ouvir e servir no 0.0.0.0:8080 - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/pt/docs/examples/without-middleware.md b/src/content/docs/pt/docs/examples/without-middleware.md index f7a04231c6..cb24b1d71b 100644 --- a/src/content/docs/pt/docs/examples/without-middleware.md +++ b/src/content/docs/pt/docs/examples/without-middleware.md @@ -1,6 +1,5 @@ --- title: "Sem Intermediário por Padrão" - --- Use: diff --git a/src/content/docs/pt/docs/examples/write-log.md b/src/content/docs/pt/docs/examples/write-log.md index 1a3b4620b2..edcc7cb147 100644 --- a/src/content/docs/pt/docs/examples/write-log.md +++ b/src/content/docs/pt/docs/examples/write-log.md @@ -1,6 +1,5 @@ --- title: "Como Escrever Ficheiro de Registo" - --- ```go diff --git a/src/content/docs/pt/docs/faq/index.md b/src/content/docs/pt/docs/faq/index.md index ad348f11fe..02a2c66253 100644 --- a/src/content/docs/pt/docs/faq/index.md +++ b/src/content/docs/pt/docs/faq/index.md @@ -1,6 +1,5 @@ --- title: "FAQ" - sidebar: order: 9 --- diff --git a/src/content/docs/pt/docs/features/index.md b/src/content/docs/pt/docs/features/index.md index 0b33c56e5c..7e5fb729da 100644 --- a/src/content/docs/pt/docs/features/index.md +++ b/src/content/docs/pt/docs/features/index.md @@ -1,6 +1,5 @@ --- title: "Características" - sidebar: order: 4 --- diff --git a/src/content/docs/pt/docs/index.md b/src/content/docs/pt/docs/index.md index 18d8af67d8..e80e47693c 100644 --- a/src/content/docs/pt/docs/index.md +++ b/src/content/docs/pt/docs/index.md @@ -1,8 +1,7 @@ --- title: "Documentação" -linkTitle: "Documentação" sidebar: - order: 1 + order: 20 --- ## O que é a Gin? diff --git a/src/content/docs/pt/docs/introduction/index.md b/src/content/docs/pt/docs/introduction/index.md index 1e17268ea7..7d945f03fd 100644 --- a/src/content/docs/pt/docs/introduction/index.md +++ b/src/content/docs/pt/docs/introduction/index.md @@ -1,6 +1,5 @@ --- title: "Introdução" - sidebar: order: 1 --- diff --git a/src/content/docs/pt/docs/jsoniter/index.md b/src/content/docs/pt/docs/jsoniter/index.md index a4a5338b6b..4726e8b4ff 100644 --- a/src/content/docs/pt/docs/jsoniter/index.md +++ b/src/content/docs/pt/docs/jsoniter/index.md @@ -1,6 +1,5 @@ --- title: "Jsoniter" - sidebar: order: 5 --- diff --git a/src/content/docs/pt/docs/quickstart/index.md b/src/content/docs/pt/docs/quickstart/index.md index 971235c886..68f6f78407 100644 --- a/src/content/docs/pt/docs/quickstart/index.md +++ b/src/content/docs/pt/docs/quickstart/index.md @@ -1,6 +1,5 @@ --- title: "Introdução Rápida" - sidebar: order: 2 --- @@ -70,13 +69,13 @@ package main import "github.com/gin-gonic/gin" func main() { - r := gin.Default() - r.GET("/ping", func(c *gin.Context) { + router := gin.Default() + router.GET("/ping", func(c *gin.Context) { c.JSON(200, gin.H{ "message": "pong", }) }) - r.Run() // oiça e sirva na `0.0.0.0:8080` + router.Run() // oiça e sirva na `0.0.0.0:8080` } ``` diff --git a/src/content/docs/pt/docs/testing/index.md b/src/content/docs/pt/docs/testing/index.md index 23408d673d..021b81eceb 100644 --- a/src/content/docs/pt/docs/testing/index.md +++ b/src/content/docs/pt/docs/testing/index.md @@ -1,6 +1,5 @@ --- title: "Testagem" - sidebar: order: 7 --- @@ -20,15 +19,15 @@ type User struct { } func setupRouter() *gin.Engine { - r := gin.Default() - r.GET("/ping", func(c *gin.Context) { + router := gin.Default() + router.GET("/ping", func(c *gin.Context) { c.String(200, "pong") }) return r } func postUser(r *gin.Engine) *gin.Engine { - r.POST("/user/add", func(c *gin.Context) { + router.POST("/user/add", func(c *gin.Context) { var user User c.BindJSON(&user) c.JSON(200, user) @@ -39,7 +38,7 @@ func postUser(r *gin.Engine) *gin.Engine { func main() { r := setupRouter() r = postUser(r) - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/pt/docs/users/index.md b/src/content/docs/pt/docs/users/index.md index ca260bca7f..70955131a2 100644 --- a/src/content/docs/pt/docs/users/index.md +++ b/src/content/docs/pt/docs/users/index.md @@ -1,6 +1,5 @@ --- title: "Utilizadores" - sidebar: order: 8 --- diff --git a/src/content/docs/ru/blog/index.md b/src/content/docs/ru/blog/index.md index 07fd81571f..63a2f96df4 100644 --- a/src/content/docs/ru/blog/index.md +++ b/src/content/docs/ru/blog/index.md @@ -1,6 +1,5 @@ --- title: "Blog" -linkTitle: "Blog" sidebar: order: 30 --- diff --git a/src/content/docs/ru/blog/news/how-to-build-one-effective-middleware.md b/src/content/docs/ru/blog/news/how-to-build-one-effective-middleware.md index 03b4fb4cc9..0ee8e31364 100644 --- a/src/content/docs/ru/blog/news/how-to-build-one-effective-middleware.md +++ b/src/content/docs/ru/blog/news/how-to-build-one-effective-middleware.md @@ -1,7 +1,7 @@ --- title: "Как создать эффективное промежуточное программное обеспечение? (Middleware)" linkTitle: "How to build one effective middleware?" -date: 2019-02-26 +lastUpdated: 2019-02-26 --- ## Constituent parts diff --git a/src/content/docs/ru/blog/releases/release13.md b/src/content/docs/ru/blog/releases/release13.md index 43f4656f4e..8d5057ad72 100644 --- a/src/content/docs/ru/blog/releases/release13.md +++ b/src/content/docs/ru/blog/releases/release13.md @@ -1,7 +1,7 @@ --- title: "Gin 1.3.0 is released" linkTitle: "Gin 1.3.0 is released" -date: 2018-08-14 +lastUpdated: 2018-08-14 --- ### CHANGELOG diff --git a/src/content/docs/ru/blog/releases/release14.md b/src/content/docs/ru/blog/releases/release14.md index 23fd648294..c145f3b520 100644 --- a/src/content/docs/ru/blog/releases/release14.md +++ b/src/content/docs/ru/blog/releases/release14.md @@ -1,7 +1,7 @@ --- title: "Gin 1.4.0 is released" linkTitle: "Gin 1.4.0 is released" -date: 2019-05-08 +lastUpdated: 2019-05-08 --- ### CHANGELOG diff --git a/src/content/docs/ru/blog/releases/release15.md b/src/content/docs/ru/blog/releases/release15.md index e4593b3ceb..4f5707a177 100644 --- a/src/content/docs/ru/blog/releases/release15.md +++ b/src/content/docs/ru/blog/releases/release15.md @@ -1,7 +1,7 @@ --- title: "Gin 1.5.0 is released" linkTitle: "Gin 1.5.0 is released" -date: 2019-11-28 +lastUpdated: 2019-11-28 --- ### CHANGELOG diff --git a/src/content/docs/ru/blog/releases/release16.md b/src/content/docs/ru/blog/releases/release16.md index 539997c964..dfc0c6ef58 100644 --- a/src/content/docs/ru/blog/releases/release16.md +++ b/src/content/docs/ru/blog/releases/release16.md @@ -1,7 +1,7 @@ --- title: "Gin 1.6.0 is released" linkTitle: "Gin 1.6.0 is released" -date: 2020-03-22 +lastUpdated: 2020-03-22 --- ### CHANGELOG diff --git a/src/content/docs/ru/docs/benchmarks/index.md b/src/content/docs/ru/docs/benchmarks/index.md index 64e565706b..dc9fd511dd 100644 --- a/src/content/docs/ru/docs/benchmarks/index.md +++ b/src/content/docs/ru/docs/benchmarks/index.md @@ -1,6 +1,5 @@ --- title: "Контрольные показатели" - sidebar: order: 3 --- diff --git a/src/content/docs/ru/docs/deployment/index.md b/src/content/docs/ru/docs/deployment/index.md index 6d3537fb06..014cf53167 100644 --- a/src/content/docs/ru/docs/deployment/index.md +++ b/src/content/docs/ru/docs/deployment/index.md @@ -1,6 +1,5 @@ --- title: "Deployment" - sidebar: order: 6 --- @@ -30,3 +29,113 @@ Render - это современная облачная платформа, ко В GAE есть два способа развертывания Go-приложений. Стандартная среда проще в использовании, но менее настраиваема и не допускает [syscalls](https://github.com/gin-gonic/gin/issues/1639) по соображениям безопасности. В гибком окружении можно запускать любые фреймворки и библиотеки. Узнать больше и выбрать предпочтительную среду можно на сайте [Go on Google App Engine](https://cloud.google.com/appengine/docs/go/). + +## Self Hosted + +Gin projects can also be deployed in a self-hosted manner. Deployment architecture and security considerations vary depending on the target environment. The following section only presents a high level overview of configuration options to consider when planning the deployment. + +## Configuration Options + +Gin project deployments can be tuned by using environment variables or directly in code. + +The following environment variables are available for configuring Gin: + +| Environment Variable | Description | +| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| PORT | The TCP port to listen on when starting the Gin server with `router.Run()` (i.e. without any arguments). | +| GIN_MODE | Set to one of `debug`, `release`, or `test`. Handles management of Gin modes, such as when to emit debug outputs. Can also be set in code using `gin.SetMode(gin.ReleaseMode)` or `gin.SetMode(gin.TestMode)` | + +The following code can be used to configure Gin. + +```go +// Don't specify the bind address or port for Gin. Defaults to binding on all interfaces on port 8080. +// Can use the `PORT` environment variable to change the listen port when using `Run()` without any arguments. +router := gin.Default() +router.Run() + +// Specify the bind address and port for Gin. +router := gin.Default() +router.Run("192.168.1.100:8080") + +// Specify only the listen port. Will bind on all interfaces. +router := gin.Default() +router.Run(":8080") + +// Set which IP addresses or CIDRs, are considered to be trusted for setting headers to document real client IP addresses. +// See the documentation for additional details. +router := gin.Default() +router.SetTrustedProxies([]string{"192.168.1.2"}) +``` + +## Don't trust all proxies + +Gin lets you specify which headers to hold the real client IP (if any), +as well as specifying which proxies (or direct clients) you trust to +specify one of these headers. + +Use function `SetTrustedProxies()` on your `gin.Engine` to specify network addresses +or network CIDRs from where clients which their request headers related to client +IP can be trusted. They can be IPv4 addresses, IPv4 CIDRs, IPv6 addresses or +IPv6 CIDRs. + +**Attention:** Gin trust all proxies by default if you don't specify a trusted +proxy using the function above, **this is NOT safe**. At the same time, if you don't +use any proxy, you can disable this feature by using `Engine.SetTrustedProxies(nil)`, +then `Context.ClientIP()` will return the remote address directly to avoid some +unnecessary computation. + +```go +import ( + "fmt" + + "github.com/gin-gonic/gin" +) + +func main() { + router := gin.Default() + router.SetTrustedProxies([]string{"192.168.1.2"}) + + router.GET("/", func(c *gin.Context) { + // If the client is 192.168.1.2, use the X-Forwarded-For + // header to deduce the original client IP from the trust- + // worthy parts of that header. + // Otherwise, simply return the direct client IP + fmt.Printf("ClientIP: %s\n", c.ClientIP()) + }) + router.Run() +} +``` + +**Notice:** If you are using a CDN service, you can set the `Engine.TrustedPlatform` +to skip TrustedProxies check, it has a higher priority than TrustedProxies. +Look at the example below: + +```go +import ( + "fmt" + + "github.com/gin-gonic/gin" +) + +func main() { + router := gin.Default() + // Use predefined header gin.PlatformXXX + // Google App Engine + router.TrustedPlatform = gin.PlatformGoogleAppEngine + // Cloudflare + router.TrustedPlatform = gin.PlatformCloudflare + // Fly.io + router.TrustedPlatform = gin.PlatformFlyIO + // Or, you can set your own trusted request header. But be sure your CDN + // prevents users from passing this header! For example, if your CDN puts + // the client IP in X-CDN-Client-IP: + router.TrustedPlatform = "X-CDN-Client-IP" + + router.GET("/", func(c *gin.Context) { + // If you set TrustedPlatform, ClientIP() will resolve the + // corresponding header and return IP directly + fmt.Printf("ClientIP: %s\n", c.ClientIP()) + }) + router.Run() +} +``` diff --git a/src/content/docs/ru/docs/examples/bind-body-into-dirrerent-structs.md b/src/content/docs/ru/docs/examples/bind-body-into-dirrerent-structs.md index 0a1cfbf41a..136a8c76b9 100644 --- a/src/content/docs/ru/docs/examples/bind-body-into-dirrerent-structs.md +++ b/src/content/docs/ru/docs/examples/bind-body-into-dirrerent-structs.md @@ -1,6 +1,5 @@ --- title: "Попытайтесь связать тело в разных структурах" - --- Обычные методы для связывания тела запроса (request body) потребляют `c.Request.Body` и их diff --git a/src/content/docs/ru/docs/examples/bind-form-data-request-with-custom-struct.md b/src/content/docs/ru/docs/examples/bind-form-data-request-with-custom-struct.md index 357a7d0be2..caf063cf52 100644 --- a/src/content/docs/ru/docs/examples/bind-form-data-request-with-custom-struct.md +++ b/src/content/docs/ru/docs/examples/bind-form-data-request-with-custom-struct.md @@ -66,7 +66,7 @@ func main() { Результаты при использовании `curl`: -``` +```bash $ curl "http://localhost:8080/getb?field_a=hello&field_b=world" {"a":{"FieldA":"hello"},"b":"world"} $ curl "http://localhost:8080/getc?field_a=hello&field_c=world" diff --git a/src/content/docs/ru/docs/examples/bind-html-checkbox.md b/src/content/docs/ru/docs/examples/bind-html-checkbox.md index 458be46fb6..79b4ebf76b 100644 --- a/src/content/docs/ru/docs/examples/bind-html-checkbox.md +++ b/src/content/docs/ru/docs/examples/bind-html-checkbox.md @@ -1,6 +1,5 @@ --- title: "Привязка html-флажков" - --- Смотрите [подробную информацию](https://github.com/gin-gonic/gin/issues/129#issuecomment-124260092) diff --git a/src/content/docs/ru/docs/examples/bind-single-binary-with-template.md b/src/content/docs/ru/docs/examples/bind-single-binary-with-template.md index 23c2c8319e..21b3350f2e 100644 --- a/src/content/docs/ru/docs/examples/bind-single-binary-with-template.md +++ b/src/content/docs/ru/docs/examples/bind-single-binary-with-template.md @@ -1,6 +1,5 @@ --- title: "Создание единого бинарного файла с помощью шаблонов" - --- ## Использование стороннего пакета diff --git a/src/content/docs/ru/docs/examples/bind-uri.md b/src/content/docs/ru/docs/examples/bind-uri.md index 9054fe811f..68124e269f 100644 --- a/src/content/docs/ru/docs/examples/bind-uri.md +++ b/src/content/docs/ru/docs/examples/bind-uri.md @@ -1,6 +1,5 @@ --- title: "Связывание Uri" - --- Смотрите [подробную информацию](https://github.com/gin-gonic/gin/issues/846). diff --git a/src/content/docs/ru/docs/examples/binding-and-validation.md b/src/content/docs/ru/docs/examples/binding-and-validation.md index 75b60cecad..69008682dc 100644 --- a/src/content/docs/ru/docs/examples/binding-and-validation.md +++ b/src/content/docs/ru/docs/examples/binding-and-validation.md @@ -12,7 +12,7 @@ title: "Связывание и проверка моделей" Кроме того, Gin предоставляет два набора методов для привязки: - **Type** - Must bind - **Методы** - `Bind`, `BindJSON`, `BindXML`, `BindQuery`, `BindYAML` - - **Поведение** - Эти методы используют `MustBindWith` под капотом. Если произошла ошибка связывания, запрос прерывается с помощью `c.AbortWithError(400, err).SetType(ErrorTypeBind)`. При этом код состояния ответа принимает значение 400, а заголовок `Content-Type` устанавливается на `text/plain; charset=utf-8`. Обратите внимание, что если вы попытаетесь установить код ответа после этого, то это приведет к предупреждению `[GIN-debug] [WARNING] Заголовки уже были записаны. Хотелось отменить код статуса 400 на 422`. Если вы хотите получить больший контроль над поведением, используйте эквивалентный метод `ShouldBind`. + - **Поведение** - Эти методы используют `MustBindWith` под капотом. Если произошла ошибка связывания, запрос прерывается с помощью `c.AbortWithError(400, err).SetType(ErrorTypeBind)`. При этом код состояния ответа принимает значение 400, а title `Content-Type` устанавливается на `text/plain; charset=utf-8`. Обратите внимание, что если вы попытаетесь установить код ответа после этого, то это приведет к предупреждению `[GIN-debug] [WARNING] Заголовки уже были записаны. Хотелось отменить код статуса 400 на 422`. Если вы хотите получить больший контроль над поведением, используйте эквивалентный метод `ShouldBind`. - **Тип** - Should bind - **Методы** - `ShouldBind`, `ShouldBindJSON`, `ShouldBindXML`, `ShouldBindQuery`, `ShouldBindYAML` - **Поведение** - Эти методы используют `ShouldBindWith` под капотом. Если произошла ошибка связывания, возвращается ошибка, и разработчик обязан обработать запрос и ошибку соответствующим образом. diff --git a/src/content/docs/ru/docs/examples/controlling-log-output-coloring.md b/src/content/docs/ru/docs/examples/controlling-log-output-coloring.md index 7bbe1fe0c7..98f8e90ea4 100644 --- a/src/content/docs/ru/docs/examples/controlling-log-output-coloring.md +++ b/src/content/docs/ru/docs/examples/controlling-log-output-coloring.md @@ -1,6 +1,5 @@ --- title: "Управление раскраской вывода журнала" - --- По умолчанию логи, выводимые на консоль, должны быть окрашены в зависимости от обнаруженного TTY. diff --git a/src/content/docs/ru/docs/examples/custom-validators.md b/src/content/docs/ru/docs/examples/custom-validators.md index 9d1abb9314..20f99f9cfe 100644 --- a/src/content/docs/ru/docs/examples/custom-validators.md +++ b/src/content/docs/ru/docs/examples/custom-validators.md @@ -1,6 +1,5 @@ --- title: "Пользовательские валидаторы" - --- Также можно зарегистрировать пользовательские валидаторы. Смотрите [пример кода](https://github.com/gin-gonic/examples/tree/master/struct-lvl-validations). diff --git a/src/content/docs/ru/docs/examples/define-format-for-the-log-of-routes.md b/src/content/docs/ru/docs/examples/define-format-for-the-log-of-routes.md index 51ee703bb8..f04a42a70a 100644 --- a/src/content/docs/ru/docs/examples/define-format-for-the-log-of-routes.md +++ b/src/content/docs/ru/docs/examples/define-format-for-the-log-of-routes.md @@ -1,6 +1,5 @@ --- title: "Определить формат для журнала маршрутов" - --- diff --git a/src/content/docs/ru/docs/examples/grouping-routes.md b/src/content/docs/ru/docs/examples/grouping-routes.md index 582959c234..5d9ed9fab2 100644 --- a/src/content/docs/ru/docs/examples/grouping-routes.md +++ b/src/content/docs/ru/docs/examples/grouping-routes.md @@ -8,16 +8,16 @@ func main() { router := gin.Default() // Simple group: v1 - v1 := router.Group("/v1") { + v1 := router.Group("/v1") v1.POST("/login", loginEndpoint) v1.POST("/submit", submitEndpoint) v1.POST("/read", readEndpoint) } // Simple group: v2 - v2 := router.Group("/v2") { + v2 := router.Group("/v2") v2.POST("/login", loginEndpoint) v2.POST("/submit", submitEndpoint) v2.POST("/read", readEndpoint) diff --git a/src/content/docs/ru/docs/examples/html-rendering.md b/src/content/docs/ru/docs/examples/html-rendering.md index 8e07402bcb..41ff580f57 100644 --- a/src/content/docs/ru/docs/examples/html-rendering.md +++ b/src/content/docs/ru/docs/examples/html-rendering.md @@ -1,6 +1,5 @@ --- title: "HTML-рендеринг" - --- Использование LoadHTMLGlob() или LoadHTMLFiles() diff --git a/src/content/docs/ru/docs/examples/http-method.md b/src/content/docs/ru/docs/examples/http-method.md index e0e72c2d2a..31d0d47fd3 100644 --- a/src/content/docs/ru/docs/examples/http-method.md +++ b/src/content/docs/ru/docs/examples/http-method.md @@ -1,6 +1,5 @@ --- title: "Использование метода HTTP" - --- ```go diff --git a/src/content/docs/ru/docs/examples/map-as-querystring-or-postform.md b/src/content/docs/ru/docs/examples/map-as-querystring-or-postform.md index c964477bfb..684cb521a3 100644 --- a/src/content/docs/ru/docs/examples/map-as-querystring-or-postform.md +++ b/src/content/docs/ru/docs/examples/map-as-querystring-or-postform.md @@ -1,6 +1,5 @@ --- title: "Структура данных Map виде строки запроса или параметров постформы" - --- ```sh diff --git a/src/content/docs/ru/docs/examples/multipart-urlencoded-binding.md b/src/content/docs/ru/docs/examples/multipart-urlencoded-binding.md index c62b6195e2..50b5df1a51 100644 --- a/src/content/docs/ru/docs/examples/multipart-urlencoded-binding.md +++ b/src/content/docs/ru/docs/examples/multipart-urlencoded-binding.md @@ -1,6 +1,5 @@ --- title: "Связка Multipart/Urlencoded" - --- ```go diff --git a/src/content/docs/ru/docs/examples/multipart-urlencoded-form.md b/src/content/docs/ru/docs/examples/multipart-urlencoded-form.md index 61940f99fc..64f4e161a5 100644 --- a/src/content/docs/ru/docs/examples/multipart-urlencoded-form.md +++ b/src/content/docs/ru/docs/examples/multipart-urlencoded-form.md @@ -1,6 +1,5 @@ --- title: "Форма Multipart/Urlencoded" - --- ```go diff --git a/src/content/docs/ru/docs/examples/only-bind-query-string.md b/src/content/docs/ru/docs/examples/only-bind-query-string.md index e156a6a9a2..a9e596b0c6 100644 --- a/src/content/docs/ru/docs/examples/only-bind-query-string.md +++ b/src/content/docs/ru/docs/examples/only-bind-query-string.md @@ -1,6 +1,5 @@ --- title: "Только связывание строки запроса" - --- Функция `ShouldBindQuery` связывает только параметры запроса, но не данные поста. См. [подробную информацию](https://github.com/gin-gonic/gin/issues/742#issuecomment-315953017). diff --git a/src/content/docs/ru/docs/examples/query-and-post-form.md b/src/content/docs/ru/docs/examples/query-and-post-form.md index 07eb8fead6..7600e0f2c2 100644 --- a/src/content/docs/ru/docs/examples/query-and-post-form.md +++ b/src/content/docs/ru/docs/examples/query-and-post-form.md @@ -1,6 +1,5 @@ --- title: "Форма для запросов и сообщений" - --- ```sh diff --git a/src/content/docs/ru/docs/examples/querystring-param.md b/src/content/docs/ru/docs/examples/querystring-param.md index 4aa91718cd..9b84d01116 100644 --- a/src/content/docs/ru/docs/examples/querystring-param.md +++ b/src/content/docs/ru/docs/examples/querystring-param.md @@ -1,6 +1,5 @@ --- title: "Параметры строки запроса" - --- ```go diff --git a/src/content/docs/ru/docs/examples/security-headers.md b/src/content/docs/ru/docs/examples/security-headers.md index 6bf4aa6d9e..ff8323fda1 100644 --- a/src/content/docs/ru/docs/examples/security-headers.md +++ b/src/content/docs/ru/docs/examples/security-headers.md @@ -48,7 +48,7 @@ func main() { Вы можете проверить его с помощью `curl`: ```bash -// Проверка заголовок +// Проверка title curl localhost:8080/ping -I @@ -64,7 +64,7 @@ X-Xss-Protection: 1; mode=block Date: Sat, 30 Mar 2024 08:20:44 GMT Content-Length: 18 -// Проверка инъекции в заголовок хоста +// Проверка инъекции в title хоста curl localhost:8080/ping -I -H "Host:neti.ee" diff --git a/src/content/docs/ru/docs/examples/serving-data-from-reader.md b/src/content/docs/ru/docs/examples/serving-data-from-reader.md index 2bb891b530..f4dc5338e2 100644 --- a/src/content/docs/ru/docs/examples/serving-data-from-reader.md +++ b/src/content/docs/ru/docs/examples/serving-data-from-reader.md @@ -1,6 +1,5 @@ --- title: "Манипуляция данных от читателя" - --- ```go diff --git a/src/content/docs/ru/docs/examples/serving-static-files.md b/src/content/docs/ru/docs/examples/serving-static-files.md index c6985e6134..eabe5aa785 100644 --- a/src/content/docs/ru/docs/examples/serving-static-files.md +++ b/src/content/docs/ru/docs/examples/serving-static-files.md @@ -1,6 +1,5 @@ --- title: "Использование статических файлов" - --- ```go diff --git a/src/content/docs/ru/docs/examples/upload-file/index.md b/src/content/docs/ru/docs/examples/upload-file/index.md index dc2930ade8..298ee67b62 100644 --- a/src/content/docs/ru/docs/examples/upload-file/index.md +++ b/src/content/docs/ru/docs/examples/upload-file/index.md @@ -1,6 +1,5 @@ --- title: "Загрузить файлы" - --- Раздел содержит список использования api загрузки файлов. diff --git a/src/content/docs/ru/docs/examples/upload-file/multiple-file.md b/src/content/docs/ru/docs/examples/upload-file/multiple-file.md index e89e10f465..07e04756f1 100644 --- a/src/content/docs/ru/docs/examples/upload-file/multiple-file.md +++ b/src/content/docs/ru/docs/examples/upload-file/multiple-file.md @@ -1,6 +1,5 @@ --- title: "Multiple files" - --- Смотрите подробности [пример кода](https://github.com/gin-gonic/examples/tree/master/upload-file/multiple). diff --git a/src/content/docs/ru/docs/examples/upload-file/single-file.md b/src/content/docs/ru/docs/examples/upload-file/single-file.md index 158d841602..4edaf19c6c 100644 --- a/src/content/docs/ru/docs/examples/upload-file/single-file.md +++ b/src/content/docs/ru/docs/examples/upload-file/single-file.md @@ -1,6 +1,5 @@ --- title: "Single file" - --- Ссылки на проблему [#774](https://github.com/gin-gonic/gin/issues/774) и деталь [пример кода](https://github.com/gin-gonic/examples/tree/master/upload-file/single). diff --git a/src/content/docs/ru/docs/examples/without-middleware.md b/src/content/docs/ru/docs/examples/without-middleware.md index 0cd958f422..6d22ddb477 100644 --- a/src/content/docs/ru/docs/examples/without-middleware.md +++ b/src/content/docs/ru/docs/examples/without-middleware.md @@ -1,6 +1,5 @@ --- title: "Без промежуточного ПО по умолчанию" - --- Используйте diff --git a/src/content/docs/ru/docs/examples/write-log.md b/src/content/docs/ru/docs/examples/write-log.md index 2e04a57bee..301434e251 100644 --- a/src/content/docs/ru/docs/examples/write-log.md +++ b/src/content/docs/ru/docs/examples/write-log.md @@ -1,6 +1,5 @@ --- title: "Как записать файл журнала" - --- ```go diff --git a/src/content/docs/ru/docs/index.md b/src/content/docs/ru/docs/index.md index 8adac4d209..cb317236fc 100644 --- a/src/content/docs/ru/docs/index.md +++ b/src/content/docs/ru/docs/index.md @@ -1,6 +1,5 @@ --- title: "Документация" -linkTitle: "Документация" вес: 20 menu: main: diff --git a/src/content/docs/ru/docs/users/index.md b/src/content/docs/ru/docs/users/index.md index 4b3e43ce0b..421d3f4d6d 100644 --- a/src/content/docs/ru/docs/users/index.md +++ b/src/content/docs/ru/docs/users/index.md @@ -1,6 +1,5 @@ --- title: "Users" - sidebar: order: 8 --- diff --git a/src/content/docs/tr/blog/index.md b/src/content/docs/tr/blog/index.md index 07fd81571f..63a2f96df4 100644 --- a/src/content/docs/tr/blog/index.md +++ b/src/content/docs/tr/blog/index.md @@ -1,6 +1,5 @@ --- title: "Blog" -linkTitle: "Blog" sidebar: order: 30 --- diff --git a/src/content/docs/tr/blog/news/how-to-build-one-effective-middleware.md b/src/content/docs/tr/blog/news/how-to-build-one-effective-middleware.md index d93e7cbc3e..f33833df25 100644 --- a/src/content/docs/tr/blog/news/how-to-build-one-effective-middleware.md +++ b/src/content/docs/tr/blog/news/how-to-build-one-effective-middleware.md @@ -1,7 +1,7 @@ --- title: "How to build one effective middleware?" linkTitle: "How to build one effective middleware?" -date: 2019-02-26 +lastUpdated: 2019-02-26 --- ## Constituent parts diff --git a/src/content/docs/tr/blog/releases/release13.md b/src/content/docs/tr/blog/releases/release13.md index 43f4656f4e..8d5057ad72 100644 --- a/src/content/docs/tr/blog/releases/release13.md +++ b/src/content/docs/tr/blog/releases/release13.md @@ -1,7 +1,7 @@ --- title: "Gin 1.3.0 is released" linkTitle: "Gin 1.3.0 is released" -date: 2018-08-14 +lastUpdated: 2018-08-14 --- ### CHANGELOG diff --git a/src/content/docs/tr/blog/releases/release14.md b/src/content/docs/tr/blog/releases/release14.md index 23fd648294..c145f3b520 100644 --- a/src/content/docs/tr/blog/releases/release14.md +++ b/src/content/docs/tr/blog/releases/release14.md @@ -1,7 +1,7 @@ --- title: "Gin 1.4.0 is released" linkTitle: "Gin 1.4.0 is released" -date: 2019-05-08 +lastUpdated: 2019-05-08 --- ### CHANGELOG diff --git a/src/content/docs/tr/blog/releases/release15.md b/src/content/docs/tr/blog/releases/release15.md index e4593b3ceb..4f5707a177 100644 --- a/src/content/docs/tr/blog/releases/release15.md +++ b/src/content/docs/tr/blog/releases/release15.md @@ -1,7 +1,7 @@ --- title: "Gin 1.5.0 is released" linkTitle: "Gin 1.5.0 is released" -date: 2019-11-28 +lastUpdated: 2019-11-28 --- ### CHANGELOG diff --git a/src/content/docs/tr/blog/releases/release16.md b/src/content/docs/tr/blog/releases/release16.md index 539997c964..dfc0c6ef58 100644 --- a/src/content/docs/tr/blog/releases/release16.md +++ b/src/content/docs/tr/blog/releases/release16.md @@ -1,7 +1,7 @@ --- title: "Gin 1.6.0 is released" linkTitle: "Gin 1.6.0 is released" -date: 2020-03-22 +lastUpdated: 2020-03-22 --- ### CHANGELOG diff --git a/src/content/docs/tr/docs/benchmarks/index.md b/src/content/docs/tr/docs/benchmarks/index.md index 58af0d1485..8200d9e1d4 100644 --- a/src/content/docs/tr/docs/benchmarks/index.md +++ b/src/content/docs/tr/docs/benchmarks/index.md @@ -1,6 +1,5 @@ --- title: "Kalite Testleri" - sidebar: order: 3 --- diff --git a/src/content/docs/tr/docs/deployment/index.md b/src/content/docs/tr/docs/deployment/index.md index feeb7277b9..ec2b1d35f1 100644 --- a/src/content/docs/tr/docs/deployment/index.md +++ b/src/content/docs/tr/docs/deployment/index.md @@ -1,6 +1,5 @@ --- title: "Deploy etme" - sidebar: order: 6 --- @@ -30,3 +29,113 @@ Render'ı takip edin [Gin projelerini dağıtma kılavuzu.](https://render.com/d GAE, Go uygulamalarını dağıtmanın iki yönteme sahiptir. Standart ortamın kullanımı daha kolaydır ancak daha az özelleştirilebilir ve güvenlik nedenleriyle [syscalls](https://github.com/gin-gonic/gin/issues/1639) gibi sistem çağrılarını önler. Daha fazla bilgi edinin ve tercih ettiğiniz ortamı şuradan seçin: [Go on Google App Engine](https://cloud.google.com/appengine/docs/go/). + +## Self Hosted + +Gin projects can also be deployed in a self-hosted manner. Deployment architecture and security considerations vary depending on the target environment. The following section only presents a high level overview of configuration options to consider when planning the deployment. + +## Configuration Options + +Gin project deployments can be tuned by using environment variables or directly in code. + +The following environment variables are available for configuring Gin: + +| Environment Variable | Description | +| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| PORT | The TCP port to listen on when starting the Gin server with `router.Run()` (i.e. without any arguments). | +| GIN_MODE | Set to one of `debug`, `release`, or `test`. Handles management of Gin modes, such as when to emit debug outputs. Can also be set in code using `gin.SetMode(gin.ReleaseMode)` or `gin.SetMode(gin.TestMode)` | + +The following code can be used to configure Gin. + +```go +// Don't specify the bind address or port for Gin. Defaults to binding on all interfaces on port 8080. +// Can use the `PORT` environment variable to change the listen port when using `Run()` without any arguments. +router := gin.Default() +router.Run() + +// Specify the bind address and port for Gin. +router := gin.Default() +router.Run("192.168.1.100:8080") + +// Specify only the listen port. Will bind on all interfaces. +router := gin.Default() +router.Run(":8080") + +// Set which IP addresses or CIDRs, are considered to be trusted for setting headers to document real client IP addresses. +// See the documentation for additional details. +router := gin.Default() +router.SetTrustedProxies([]string{"192.168.1.2"}) +``` + +## Don't trust all proxies + +Gin lets you specify which headers to hold the real client IP (if any), +as well as specifying which proxies (or direct clients) you trust to +specify one of these headers. + +Use function `SetTrustedProxies()` on your `gin.Engine` to specify network addresses +or network CIDRs from where clients which their request headers related to client +IP can be trusted. They can be IPv4 addresses, IPv4 CIDRs, IPv6 addresses or +IPv6 CIDRs. + +**Attention:** Gin trust all proxies by default if you don't specify a trusted +proxy using the function above, **this is NOT safe**. At the same time, if you don't +use any proxy, you can disable this feature by using `Engine.SetTrustedProxies(nil)`, +then `Context.ClientIP()` will return the remote address directly to avoid some +unnecessary computation. + +```go +import ( + "fmt" + + "github.com/gin-gonic/gin" +) + +func main() { + router := gin.Default() + router.SetTrustedProxies([]string{"192.168.1.2"}) + + router.GET("/", func(c *gin.Context) { + // If the client is 192.168.1.2, use the X-Forwarded-For + // header to deduce the original client IP from the trust- + // worthy parts of that header. + // Otherwise, simply return the direct client IP + fmt.Printf("ClientIP: %s\n", c.ClientIP()) + }) + router.Run() +} +``` + +**Notice:** If you are using a CDN service, you can set the `Engine.TrustedPlatform` +to skip TrustedProxies check, it has a higher priority than TrustedProxies. +Look at the example below: + +```go +import ( + "fmt" + + "github.com/gin-gonic/gin" +) + +func main() { + router := gin.Default() + // Use predefined header gin.PlatformXXX + // Google App Engine + router.TrustedPlatform = gin.PlatformGoogleAppEngine + // Cloudflare + router.TrustedPlatform = gin.PlatformCloudflare + // Fly.io + router.TrustedPlatform = gin.PlatformFlyIO + // Or, you can set your own trusted request header. But be sure your CDN + // prevents users from passing this header! For example, if your CDN puts + // the client IP in X-CDN-Client-IP: + router.TrustedPlatform = "X-CDN-Client-IP" + + router.GET("/", func(c *gin.Context) { + // If you set TrustedPlatform, ClientIP() will resolve the + // corresponding header and return IP directly + fmt.Printf("ClientIP: %s\n", c.ClientIP()) + }) + router.Run() +} +``` diff --git a/src/content/docs/tr/docs/examples/ascii-json.md b/src/content/docs/tr/docs/examples/ascii-json.md index 7e2d2b0d04..bafbe964f3 100644 --- a/src/content/docs/tr/docs/examples/ascii-json.md +++ b/src/content/docs/tr/docs/examples/ascii-json.md @@ -1,15 +1,14 @@ --- title: "AsciiJSON" - --- Using AsciiJSON to Generates ASCII-only JSON with escaped non-ASCII characters. ```go func main() { - r := gin.Default() + router := gin.Default() - r.GET("/someJSON", func(c *gin.Context) { + router.GET("/someJSON", func(c *gin.Context) { data := map[string]interface{}{ "lang": "GO语言", "tag": "
", @@ -20,6 +19,6 @@ func main() { }) // Listen and serve on 0.0.0.0:8080 - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/tr/docs/examples/bind-body-into-dirrerent-structs.md b/src/content/docs/tr/docs/examples/bind-body-into-dirrerent-structs.md index 138179eea1..60701cb187 100644 --- a/src/content/docs/tr/docs/examples/bind-body-into-dirrerent-structs.md +++ b/src/content/docs/tr/docs/examples/bind-body-into-dirrerent-structs.md @@ -1,6 +1,5 @@ --- title: "Try to bind body into different structs" - --- The normal methods for binding request body consumes `c.Request.Body` and they diff --git a/src/content/docs/tr/docs/examples/bind-form-data-request-with-custom-struct.md b/src/content/docs/tr/docs/examples/bind-form-data-request-with-custom-struct.md index 92ab2f4b88..19997854d1 100644 --- a/src/content/docs/tr/docs/examples/bind-form-data-request-with-custom-struct.md +++ b/src/content/docs/tr/docs/examples/bind-form-data-request-with-custom-struct.md @@ -1,6 +1,5 @@ --- title: "Bind form-data request with custom struct" - --- The follow example using custom struct: @@ -55,18 +54,18 @@ func GetDataD(c *gin.Context) { } func main() { - r := gin.Default() - r.GET("/getb", GetDataB) - r.GET("/getc", GetDataC) - r.GET("/getd", GetDataD) + router := gin.Default() + router.GET("/getb", GetDataB) + router.GET("/getc", GetDataC) + router.GET("/getd", GetDataD) - r.Run() + router.Run() } ``` Using the command `curl` command result: -``` +```bash $ curl "http://localhost:8080/getb?field_a=hello&field_b=world" {"a":{"FieldA":"hello"},"b":"world"} $ curl "http://localhost:8080/getc?field_a=hello&field_c=world" diff --git a/src/content/docs/tr/docs/examples/bind-html-checkbox.md b/src/content/docs/tr/docs/examples/bind-html-checkbox.md index 4b1ee65efa..0de0cad363 100644 --- a/src/content/docs/tr/docs/examples/bind-html-checkbox.md +++ b/src/content/docs/tr/docs/examples/bind-html-checkbox.md @@ -1,6 +1,5 @@ --- title: "Bind html checkboxes" - --- See the [detail information](https://github.com/gin-gonic/gin/issues/129#issuecomment-124260092) diff --git a/src/content/docs/tr/docs/examples/bind-query-or-post.md b/src/content/docs/tr/docs/examples/bind-query-or-post.md index 9912d908a2..ce6b7f9892 100644 --- a/src/content/docs/tr/docs/examples/bind-query-or-post.md +++ b/src/content/docs/tr/docs/examples/bind-query-or-post.md @@ -1,6 +1,5 @@ --- title: "Bind query string or post data" - --- See the [detail information](https://github.com/gin-gonic/gin/issues/742#issuecomment-264681292). diff --git a/src/content/docs/tr/docs/examples/bind-single-binary-with-template.md b/src/content/docs/tr/docs/examples/bind-single-binary-with-template.md index 09e8b02fc7..5fa393039e 100644 --- a/src/content/docs/tr/docs/examples/bind-single-binary-with-template.md +++ b/src/content/docs/tr/docs/examples/bind-single-binary-with-template.md @@ -1,6 +1,5 @@ --- title: "Build a single binary with templates" - --- ## Use the third-party package @@ -14,12 +13,12 @@ func main() { if err != nil { panic(err) } - r.SetHTMLTemplate(t) + router.SetHTMLTemplate(t) - r.GET("/", func(c *gin.Context) { + router.GET("/", func(c *gin.Context) { c.HTML(http.StatusOK, "/html/index.tmpl", nil) }) - r.Run(":8080") + router.Run(":8080") } // loadTemplate loads templates embedded by go-assets-builder diff --git a/src/content/docs/tr/docs/examples/bind-uri.md b/src/content/docs/tr/docs/examples/bind-uri.md index b2092e977e..8488037df1 100644 --- a/src/content/docs/tr/docs/examples/bind-uri.md +++ b/src/content/docs/tr/docs/examples/bind-uri.md @@ -1,6 +1,5 @@ --- title: "Bind Uri" - --- See the [detail information](https://github.com/gin-gonic/gin/issues/846). diff --git a/src/content/docs/tr/docs/examples/binding-and-validation.md b/src/content/docs/tr/docs/examples/binding-and-validation.md index 40684022c6..f89a5c24a2 100644 --- a/src/content/docs/tr/docs/examples/binding-and-validation.md +++ b/src/content/docs/tr/docs/examples/binding-and-validation.md @@ -1,6 +1,5 @@ --- title: "Model binding and validation" - --- To bind a request body into a type, use model binding. We currently support binding of JSON, XML, YAML and standard form values (foo=bar&boo=baz). diff --git a/src/content/docs/tr/docs/examples/controlling-log-output-coloring.md b/src/content/docs/tr/docs/examples/controlling-log-output-coloring.md index c0973a85af..08f4c84557 100644 --- a/src/content/docs/tr/docs/examples/controlling-log-output-coloring.md +++ b/src/content/docs/tr/docs/examples/controlling-log-output-coloring.md @@ -1,6 +1,5 @@ --- title: "Controlling Log output coloring" - --- By default, logs output on console should be colorized depending on the detected TTY. diff --git a/src/content/docs/tr/docs/examples/cookie.md b/src/content/docs/tr/docs/examples/cookie.md index 090e66354a..3efb30edf5 100644 --- a/src/content/docs/tr/docs/examples/cookie.md +++ b/src/content/docs/tr/docs/examples/cookie.md @@ -1,8 +1,9 @@ --- -title: "Set and get a cookie" - +title: "Cookie" --- +Set and get cookie. + ```go import ( "fmt" @@ -29,3 +30,9 @@ func main() { router.Run() } ``` + +Delete cookie by set max age to -1. + +```go +c.SetCookie("gin_cookie", "test", -1, "/", "localhost", false, true) +``` diff --git a/src/content/docs/tr/docs/examples/custom-http-config.md b/src/content/docs/tr/docs/examples/custom-http-config.md index 42de783145..748cf840f2 100644 --- a/src/content/docs/tr/docs/examples/custom-http-config.md +++ b/src/content/docs/tr/docs/examples/custom-http-config.md @@ -1,6 +1,5 @@ --- title: "Custom HTTP configuration" - --- Use `http.ListenAndServe()` directly, like this: diff --git a/src/content/docs/tr/docs/examples/custom-log-format.md b/src/content/docs/tr/docs/examples/custom-log-format.md index 6d64503414..fbe543ca4f 100644 --- a/src/content/docs/tr/docs/examples/custom-log-format.md +++ b/src/content/docs/tr/docs/examples/custom-log-format.md @@ -1,6 +1,5 @@ --- title: "Custom log file" - --- For example: diff --git a/src/content/docs/tr/docs/examples/custom-middleware.md b/src/content/docs/tr/docs/examples/custom-middleware.md index 8de8438b07..86b6cfadbc 100644 --- a/src/content/docs/tr/docs/examples/custom-middleware.md +++ b/src/content/docs/tr/docs/examples/custom-middleware.md @@ -1,6 +1,5 @@ --- title: "Custom Middleware" - --- ```go @@ -27,9 +26,9 @@ func Logger() gin.HandlerFunc { func main() { r := gin.New() - r.Use(Logger()) + router.Use(Logger()) - r.GET("/test", func(c *gin.Context) { + router.GET("/test", func(c *gin.Context) { example := c.MustGet("example").(string) // it would print: "12345" @@ -37,7 +36,7 @@ func main() { }) // Listen and serve on 0.0.0.0:8080 - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/tr/docs/examples/custom-validators.md b/src/content/docs/tr/docs/examples/custom-validators.md index 114de29af1..ac322e6ee7 100644 --- a/src/content/docs/tr/docs/examples/custom-validators.md +++ b/src/content/docs/tr/docs/examples/custom-validators.md @@ -1,6 +1,5 @@ --- title: "Custom validators" - --- It is also possible to register custom validators. See the [example code](https://github.com/gin-gonic/examples/tree/master/struct-lvl-validations). diff --git a/src/content/docs/tr/docs/examples/define-format-for-the-log-of-routes.md b/src/content/docs/tr/docs/examples/define-format-for-the-log-of-routes.md index 44bd991a9d..3df58b9ea8 100644 --- a/src/content/docs/tr/docs/examples/define-format-for-the-log-of-routes.md +++ b/src/content/docs/tr/docs/examples/define-format-for-the-log-of-routes.md @@ -1,6 +1,5 @@ --- title: "Define format for the log of routes" - --- The default log of routes is: @@ -21,24 +20,24 @@ import ( ) func main() { - r := gin.Default() + router := gin.Default() gin.DebugPrintRouteFunc = func(httpMethod, absolutePath, handlerName string, nuHandlers int) { log.Printf("endpoint %v %v %v %v\n", httpMethod, absolutePath, handlerName, nuHandlers) } - r.POST("/foo", func(c *gin.Context) { + router.POST("/foo", func(c *gin.Context) { c.JSON(http.StatusOK, "foo") }) - r.GET("/bar", func(c *gin.Context) { + router.GET("/bar", func(c *gin.Context) { c.JSON(http.StatusOK, "bar") }) - r.GET("/status", func(c *gin.Context) { + router.GET("/status", func(c *gin.Context) { c.JSON(http.StatusOK, "ok") }) // Listen and Server in http://0.0.0.0:8080 - r.Run() + router.Run() } ``` diff --git a/src/content/docs/tr/docs/examples/goroutines-inside-a-middleware.md b/src/content/docs/tr/docs/examples/goroutines-inside-a-middleware.md index f3a6b10d6e..d06d064a78 100644 --- a/src/content/docs/tr/docs/examples/goroutines-inside-a-middleware.md +++ b/src/content/docs/tr/docs/examples/goroutines-inside-a-middleware.md @@ -1,15 +1,14 @@ --- title: "Goroutines inside a middleware" - --- When starting new Goroutines inside a middleware or handler, you **SHOULD NOT** use the original context inside it, you have to use a read-only copy. ```go func main() { - r := gin.Default() + router := gin.Default() - r.GET("/long_async", func(c *gin.Context) { + router.GET("/long_async", func(c *gin.Context) { // create copy to be used inside the goroutine cCp := c.Copy() go func() { @@ -21,7 +20,7 @@ func main() { }() }) - r.GET("/long_sync", func(c *gin.Context) { + router.GET("/long_sync", func(c *gin.Context) { // simulate a long task with time.Sleep(). 5 seconds time.Sleep(5 * time.Second) @@ -30,6 +29,6 @@ func main() { }) // Listen and serve on 0.0.0.0:8080 - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/tr/docs/examples/graceful-restart-or-stop.md b/src/content/docs/tr/docs/examples/graceful-restart-or-stop.md index 633ad53240..91e60053c5 100644 --- a/src/content/docs/tr/docs/examples/graceful-restart-or-stop.md +++ b/src/content/docs/tr/docs/examples/graceful-restart-or-stop.md @@ -1,6 +1,5 @@ --- title: "Graceful restart or stop" - --- Do you want to graceful restart or stop your web server? @@ -62,9 +61,9 @@ func main() { // Wait for interrupt signal to gracefully shutdown the server with // a timeout of 5 seconds. quit := make(chan os.Signal, 1) - // kill (no param) default send syscanll.SIGTERM + // kill (no param) default sends syscall.SIGTERM // kill -2 is syscall.SIGINT - // kill -9 is syscall. SIGKILL but can"t be catch, so don't need add it + // kill -9 is syscall.SIGKILL but can't be caught, so don't need add it signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM) <-quit log.Println("Shutdown Server ...") diff --git a/src/content/docs/tr/docs/examples/grouping-routes.md b/src/content/docs/tr/docs/examples/grouping-routes.md index c7f7a72459..416e5597d2 100644 --- a/src/content/docs/tr/docs/examples/grouping-routes.md +++ b/src/content/docs/tr/docs/examples/grouping-routes.md @@ -1,6 +1,5 @@ --- title: "Grouping routes" - --- ```go @@ -8,16 +7,16 @@ func main() { router := gin.Default() // Simple group: v1 - v1 := router.Group("/v1") { + v1 := router.Group("/v1") v1.POST("/login", loginEndpoint) v1.POST("/submit", submitEndpoint) v1.POST("/read", readEndpoint) } // Simple group: v2 - v2 := router.Group("/v2") { + v2 := router.Group("/v2") v2.POST("/login", loginEndpoint) v2.POST("/submit", submitEndpoint) v2.POST("/read", readEndpoint) diff --git a/src/content/docs/tr/docs/examples/html-rendering.md b/src/content/docs/tr/docs/examples/html-rendering.md index 7872487959..12fde101d3 100644 --- a/src/content/docs/tr/docs/examples/html-rendering.md +++ b/src/content/docs/tr/docs/examples/html-rendering.md @@ -1,6 +1,5 @@ --- title: "HTML rendering" - --- Using LoadHTMLGlob() or LoadHTMLFiles() @@ -93,9 +92,9 @@ func main() { You may use custom delims ```go - r := gin.Default() - r.Delims("{[{", "}]}") - r.LoadHTMLGlob("/path/to/templates") + router := gin.Default() + router.Delims("{[{", "}]}") + router.LoadHTMLGlob("/path/to/templates") ``` ### Custom Template Funcs diff --git a/src/content/docs/tr/docs/examples/http-method.md b/src/content/docs/tr/docs/examples/http-method.md index b8d41d6968..a0c8d09c62 100644 --- a/src/content/docs/tr/docs/examples/http-method.md +++ b/src/content/docs/tr/docs/examples/http-method.md @@ -1,6 +1,5 @@ --- title: "Using HTTP method" - --- ```go diff --git a/src/content/docs/tr/docs/examples/http2-server-push.md b/src/content/docs/tr/docs/examples/http2-server-push.md index 192d22a457..f7c81b55bb 100644 --- a/src/content/docs/tr/docs/examples/http2-server-push.md +++ b/src/content/docs/tr/docs/examples/http2-server-push.md @@ -1,6 +1,5 @@ --- title: "HTTP2 server push" - --- http.Pusher is supported only **go1.8+**. See the [golang blog](https://blog.golang.org/h2push) for detail information. @@ -28,11 +27,11 @@ var html = template.Must(template.New("https").Parse(` `)) func main() { - r := gin.Default() - r.Static("/assets", "./assets") - r.SetHTMLTemplate(html) + router := gin.Default() + router.Static("/assets", "./assets") + router.SetHTMLTemplate(html) - r.GET("/", func(c *gin.Context) { + router.GET("/", func(c *gin.Context) { if pusher := c.Writer.Pusher(); pusher != nil { // use pusher.Push() to do server push if err := pusher.Push("/assets/app.js", nil); err != nil { @@ -45,7 +44,7 @@ func main() { }) // Listen and Server in https://127.0.0.1:8080 - r.RunTLS(":8080", "./testdata/server.pem", "./testdata/server.key") + router.RunTLS(":8080", "./testdata/server.pem", "./testdata/server.key") } ``` diff --git a/src/content/docs/tr/docs/examples/index.md b/src/content/docs/tr/docs/examples/index.md index f6a04601e0..d593a1ed76 100644 --- a/src/content/docs/tr/docs/examples/index.md +++ b/src/content/docs/tr/docs/examples/index.md @@ -1,6 +1,5 @@ --- title: "Örnekler" - sidebar: order: 6 --- diff --git a/src/content/docs/tr/docs/examples/jsonp.md b/src/content/docs/tr/docs/examples/jsonp.md index bc4439a44f..b59608103b 100644 --- a/src/content/docs/tr/docs/examples/jsonp.md +++ b/src/content/docs/tr/docs/examples/jsonp.md @@ -1,15 +1,14 @@ --- title: "JSONP" - --- Using JSONP to request data from a server in a different domain. Add callback to response body if the query parameter callback exists. ```go func main() { - r := gin.Default() + router := gin.Default() - r.GET("/JSONP?callback=x", func(c *gin.Context) { + router.GET("/JSONP?callback=x", func(c *gin.Context) { data := map[string]interface{}{ "foo": "bar", } @@ -20,6 +19,6 @@ func main() { }) // Listen and serve on 0.0.0.0:8080 - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/tr/docs/examples/map-as-querystring-or-postform.md b/src/content/docs/tr/docs/examples/map-as-querystring-or-postform.md index 5ed88b0b5c..f56774ae3f 100644 --- a/src/content/docs/tr/docs/examples/map-as-querystring-or-postform.md +++ b/src/content/docs/tr/docs/examples/map-as-querystring-or-postform.md @@ -1,6 +1,5 @@ --- title: "Map as querystring or postform parameters" - --- ```sh diff --git a/src/content/docs/tr/docs/examples/multipart-urlencoded-binding.md b/src/content/docs/tr/docs/examples/multipart-urlencoded-binding.md index 73fee286a1..e2e8073f1c 100644 --- a/src/content/docs/tr/docs/examples/multipart-urlencoded-binding.md +++ b/src/content/docs/tr/docs/examples/multipart-urlencoded-binding.md @@ -1,6 +1,5 @@ --- title: "Multipart/Urlencoded binding" - --- ```go diff --git a/src/content/docs/tr/docs/examples/multipart-urlencoded-form.md b/src/content/docs/tr/docs/examples/multipart-urlencoded-form.md index 04eab23737..21502a7b30 100644 --- a/src/content/docs/tr/docs/examples/multipart-urlencoded-form.md +++ b/src/content/docs/tr/docs/examples/multipart-urlencoded-form.md @@ -1,6 +1,5 @@ --- title: "Multipart/Urlencoded form" - --- ```go diff --git a/src/content/docs/tr/docs/examples/multiple-template.md b/src/content/docs/tr/docs/examples/multiple-template.md index 28b58c213b..9584899ac5 100644 --- a/src/content/docs/tr/docs/examples/multiple-template.md +++ b/src/content/docs/tr/docs/examples/multiple-template.md @@ -1,6 +1,5 @@ --- title: "Multitemplate" - --- Gin allow by default use only one html.Template. Check [a multitemplate render](https://github.com/gin-contrib/multitemplate) for using features like go 1.6 `block template`. diff --git a/src/content/docs/tr/docs/examples/only-bind-query-string.md b/src/content/docs/tr/docs/examples/only-bind-query-string.md index bdd6c174e7..18fd177106 100644 --- a/src/content/docs/tr/docs/examples/only-bind-query-string.md +++ b/src/content/docs/tr/docs/examples/only-bind-query-string.md @@ -1,6 +1,5 @@ --- title: "Only bind query string" - --- `ShouldBindQuery` function only binds the query params and not the post data. See the [detail information](https://github.com/gin-gonic/gin/issues/742#issuecomment-315953017). diff --git a/src/content/docs/tr/docs/examples/param-in-path.md b/src/content/docs/tr/docs/examples/param-in-path.md index b0a4a3b680..8ca7067ab7 100644 --- a/src/content/docs/tr/docs/examples/param-in-path.md +++ b/src/content/docs/tr/docs/examples/param-in-path.md @@ -1,6 +1,5 @@ --- title: "Parameters in path" - --- ```go diff --git a/src/content/docs/tr/docs/examples/pure-json.md b/src/content/docs/tr/docs/examples/pure-json.md index 5fbf8bfc1f..c5ac565e6a 100644 --- a/src/content/docs/tr/docs/examples/pure-json.md +++ b/src/content/docs/tr/docs/examples/pure-json.md @@ -1,6 +1,5 @@ --- title: "PureJSON" - --- Normally, JSON replaces special HTML characters with their unicode entities, e.g. `<` becomes `\u003c`. If you want to encode such characters literally, you can use PureJSON instead. @@ -8,23 +7,23 @@ This feature is unavailable in Go 1.6 and lower. ```go func main() { - r := gin.Default() + router := gin.Default() // Serves unicode entities - r.GET("/json", func(c *gin.Context) { + router.GET("/json", func(c *gin.Context) { c.JSON(200, gin.H{ "html": "Hello, world!", }) }) // Serves literal characters - r.GET("/purejson", func(c *gin.Context) { + router.GET("/purejson", func(c *gin.Context) { c.PureJSON(200, gin.H{ "html": "Hello, world!", }) }) // listen and serve on 0.0.0.0:8080 - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/tr/docs/examples/query-and-post-form.md b/src/content/docs/tr/docs/examples/query-and-post-form.md index 5c8e6d21e7..f02af5daa9 100644 --- a/src/content/docs/tr/docs/examples/query-and-post-form.md +++ b/src/content/docs/tr/docs/examples/query-and-post-form.md @@ -1,6 +1,5 @@ --- title: "Query and post form" - --- ```sh diff --git a/src/content/docs/tr/docs/examples/querystring-param.md b/src/content/docs/tr/docs/examples/querystring-param.md index cba891746e..afef1b61e8 100644 --- a/src/content/docs/tr/docs/examples/querystring-param.md +++ b/src/content/docs/tr/docs/examples/querystring-param.md @@ -1,6 +1,5 @@ --- title: "Query string parameters" - --- ```go diff --git a/src/content/docs/tr/docs/examples/redirects.md b/src/content/docs/tr/docs/examples/redirects.md index e62a9952ea..a682207aed 100644 --- a/src/content/docs/tr/docs/examples/redirects.md +++ b/src/content/docs/tr/docs/examples/redirects.md @@ -1,12 +1,11 @@ --- title: "Redirects" - --- Issuing a HTTP redirect is easy. Both internal and external locations are supported. ```go -r.GET("/test", func(c *gin.Context) { +router.GET("/test", func(c *gin.Context) { c.Redirect(http.StatusMovedPermanently, "http://www.google.com/") }) ``` @@ -14,7 +13,7 @@ r.GET("/test", func(c *gin.Context) { Issuing a HTTP redirect from POST. Refer to issue: [#444](https://github.com/gin-gonic/gin/issues/444) ```go -r.POST("/test", func(c *gin.Context) { +router.POST("/test", func(c *gin.Context) { c.Redirect(http.StatusFound, "/foo") }) ``` @@ -22,11 +21,11 @@ r.POST("/test", func(c *gin.Context) { Issuing a Router redirect, use `HandleContext` like below. ``` go -r.GET("/test", func(c *gin.Context) { +router.GET("/test", func(c *gin.Context) { c.Request.URL.Path = "/test2" - r.HandleContext(c) + router.HandleContext(c) }) -r.GET("/test2", func(c *gin.Context) { +router.GET("/test2", func(c *gin.Context) { c.JSON(200, gin.H{"hello": "world"}) }) ``` diff --git a/src/content/docs/tr/docs/examples/rendering.md b/src/content/docs/tr/docs/examples/rendering.md index c9c705c656..c8ec88e99d 100644 --- a/src/content/docs/tr/docs/examples/rendering.md +++ b/src/content/docs/tr/docs/examples/rendering.md @@ -1,18 +1,17 @@ --- title: "XML/JSON/YAML/ProtoBuf rendering" - --- ```go func main() { - r := gin.Default() + router := gin.Default() // gin.H is a shortcut for map[string]interface{} - r.GET("/someJSON", func(c *gin.Context) { + router.GET("/someJSON", func(c *gin.Context) { c.JSON(http.StatusOK, gin.H{"message": "hey", "status": http.StatusOK}) }) - r.GET("/moreJSON", func(c *gin.Context) { + router.GET("/moreJSON", func(c *gin.Context) { // You also can use a struct var msg struct { Name string `json:"user"` @@ -27,15 +26,15 @@ func main() { c.JSON(http.StatusOK, msg) }) - r.GET("/someXML", func(c *gin.Context) { + router.GET("/someXML", func(c *gin.Context) { c.XML(http.StatusOK, gin.H{"message": "hey", "status": http.StatusOK}) }) - r.GET("/someYAML", func(c *gin.Context) { + router.GET("/someYAML", func(c *gin.Context) { c.YAML(http.StatusOK, gin.H{"message": "hey", "status": http.StatusOK}) }) - r.GET("/someProtoBuf", func(c *gin.Context) { + router.GET("/someProtoBuf", func(c *gin.Context) { reps := []int64{int64(1), int64(2)} label := "test" // The specific definition of protobuf is written in the testdata/protoexample file. @@ -49,6 +48,6 @@ func main() { }) // Listen and serve on 0.0.0.0:8080 - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/tr/docs/examples/run-multiple-service.md b/src/content/docs/tr/docs/examples/run-multiple-service.md index 0dba2ab954..9ad1e6baf3 100644 --- a/src/content/docs/tr/docs/examples/run-multiple-service.md +++ b/src/content/docs/tr/docs/examples/run-multiple-service.md @@ -1,6 +1,5 @@ --- title: "Run multiple service" - --- See the [question](https://github.com/gin-gonic/gin/issues/346) and try the following example: diff --git a/src/content/docs/tr/docs/examples/secure-json.md b/src/content/docs/tr/docs/examples/secure-json.md index 82e63a4c44..4a2653eeed 100644 --- a/src/content/docs/tr/docs/examples/secure-json.md +++ b/src/content/docs/tr/docs/examples/secure-json.md @@ -1,18 +1,17 @@ --- title: "SecureJSON" - --- Using SecureJSON to prevent json hijacking. Default prepends `"while(1),"` to response body if the given struct is array values. ```go func main() { - r := gin.Default() + router := gin.Default() // You can also use your own secure json prefix - // r.SecureJsonPrefix(")]}',\n") + // router.SecureJsonPrefix(")]}',\n") - r.GET("/someJSON", func(c *gin.Context) { + router.GET("/someJSON", func(c *gin.Context) { names := []string{"lena", "austin", "foo"} // Will output : while(1);["lena","austin","foo"] @@ -20,6 +19,6 @@ func main() { }) // Listen and serve on 0.0.0.0:8080 - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/tr/docs/examples/security-headers.md b/src/content/docs/tr/docs/examples/security-headers.md index aa767aa022..1545dd136e 100644 --- a/src/content/docs/tr/docs/examples/security-headers.md +++ b/src/content/docs/tr/docs/examples/security-headers.md @@ -1,6 +1,5 @@ --- title: "Güvenlik Üst Bilgileri" - --- Web uygulamanızı yaygın güvenlik açıklarından korumak için güvenlik başlıklarını kullanmak önemlidir. Bu örnek, Gin uygulamanıza güvenlik başlıklarını nasıl ekleyeceğinizi ve ayrıca Host Header Injection ile ilgili saldırılardan (SSRF, Open Redirection) nasıl kaçınacağınızı gösterir. diff --git a/src/content/docs/tr/docs/examples/serving-data-from-reader.md b/src/content/docs/tr/docs/examples/serving-data-from-reader.md index 614db12ce2..1b871d5251 100644 --- a/src/content/docs/tr/docs/examples/serving-data-from-reader.md +++ b/src/content/docs/tr/docs/examples/serving-data-from-reader.md @@ -1,6 +1,5 @@ --- title: "Serving data from reader" - --- ```go diff --git a/src/content/docs/tr/docs/examples/serving-static-files.md b/src/content/docs/tr/docs/examples/serving-static-files.md index bda67da070..3f96749752 100644 --- a/src/content/docs/tr/docs/examples/serving-static-files.md +++ b/src/content/docs/tr/docs/examples/serving-static-files.md @@ -1,6 +1,5 @@ --- title: "Serving static files" - --- ```go diff --git a/src/content/docs/tr/docs/examples/support-lets-encrypt.md b/src/content/docs/tr/docs/examples/support-lets-encrypt.md index 841c1a7f99..50e6b21c3d 100644 --- a/src/content/docs/tr/docs/examples/support-lets-encrypt.md +++ b/src/content/docs/tr/docs/examples/support-lets-encrypt.md @@ -1,6 +1,5 @@ --- title: "Support Let's Encrypt" - --- example for 1-line LetsEncrypt HTTPS servers. @@ -16,10 +15,10 @@ import ( ) func main() { - r := gin.Default() + router := gin.Default() // Ping handler - r.GET("/ping", func(c *gin.Context) { + router.GET("/ping", func(c *gin.Context) { c.String(200, "pong") }) @@ -41,10 +40,10 @@ import ( ) func main() { - r := gin.Default() + router := gin.Default() // Ping handler - r.GET("/ping", func(c *gin.Context) { + router.GET("/ping", func(c *gin.Context) { c.String(200, "pong") }) diff --git a/src/content/docs/tr/docs/examples/upload-file/index.md b/src/content/docs/tr/docs/examples/upload-file/index.md index d0ff99e858..8399cc637b 100644 --- a/src/content/docs/tr/docs/examples/upload-file/index.md +++ b/src/content/docs/tr/docs/examples/upload-file/index.md @@ -1,6 +1,5 @@ --- title: "Upload files" - --- The section lists upload file api usage. diff --git a/src/content/docs/tr/docs/examples/upload-file/multiple-file.md b/src/content/docs/tr/docs/examples/upload-file/multiple-file.md index 185b7b5f66..07ee7e0626 100644 --- a/src/content/docs/tr/docs/examples/upload-file/multiple-file.md +++ b/src/content/docs/tr/docs/examples/upload-file/multiple-file.md @@ -1,6 +1,5 @@ --- title: "Multiple files" - --- See the detail [example code](https://github.com/gin-gonic/examples/tree/master/upload-file/multiple). @@ -19,7 +18,7 @@ func main() { log.Println(file.Filename) // Upload the file to specific dst. - c.SaveUploadedFile(file, dst) + c.SaveUploadedFile(file, "./files/" + file.Filename) } c.String(http.StatusOK, fmt.Sprintf("%d files uploaded!", len(files))) }) diff --git a/src/content/docs/tr/docs/examples/upload-file/single-file.md b/src/content/docs/tr/docs/examples/upload-file/single-file.md index 5fe274dc7c..f9db82e0d8 100644 --- a/src/content/docs/tr/docs/examples/upload-file/single-file.md +++ b/src/content/docs/tr/docs/examples/upload-file/single-file.md @@ -1,6 +1,5 @@ --- title: "Single file" - --- References issue [#774](https://github.com/gin-gonic/gin/issues/774) and detail [example code](https://github.com/gin-gonic/examples/tree/master/upload-file/single). @@ -20,7 +19,7 @@ func main() { log.Println(file.Filename) // Upload the file to specific dst. - c.SaveUploadedFile(file, dst) + c.SaveUploadedFile(file, "./files/" + file.Filename) c.String(http.StatusOK, fmt.Sprintf("'%s' uploaded!", file.Filename)) }) diff --git a/src/content/docs/tr/docs/examples/using-basicauth-middleware.md b/src/content/docs/tr/docs/examples/using-basicauth-middleware.md index cc68db4a0d..a1f1a03ebc 100644 --- a/src/content/docs/tr/docs/examples/using-basicauth-middleware.md +++ b/src/content/docs/tr/docs/examples/using-basicauth-middleware.md @@ -1,6 +1,5 @@ --- title: "Using BasicAuth middleware" - --- ```go @@ -12,11 +11,11 @@ var secrets = gin.H{ } func main() { - r := gin.Default() + router := gin.Default() // Group using gin.BasicAuth() middleware // gin.Accounts is a shortcut for map[string]string - authorized := r.Group("/admin", gin.BasicAuth(gin.Accounts{ + authorized := router.Group("/admin", gin.BasicAuth(gin.Accounts{ "foo": "bar", "austin": "1234", "lena": "hello2", @@ -36,6 +35,6 @@ func main() { }) // Listen and serve on 0.0.0.0:8080 - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/tr/docs/examples/using-middleware.md b/src/content/docs/tr/docs/examples/using-middleware.md index 5fc4154dbf..7c44cd3eba 100644 --- a/src/content/docs/tr/docs/examples/using-middleware.md +++ b/src/content/docs/tr/docs/examples/using-middleware.md @@ -1,6 +1,5 @@ --- title: "Using middleware" - --- ```go @@ -11,18 +10,18 @@ func main() { // Global middleware // Logger middleware will write the logs to gin.DefaultWriter even if you set with GIN_MODE=release. // By default gin.DefaultWriter = os.Stdout - r.Use(gin.Logger()) + router.Use(gin.Logger()) // Recovery middleware recovers from any panics and writes a 500 if there was one. - r.Use(gin.Recovery()) + router.Use(gin.Recovery()) // Per route middleware, you can add as many as you desire. - r.GET("/benchmark", MyBenchLogger(), benchEndpoint) + router.GET("/benchmark", MyBenchLogger(), benchEndpoint) // Authorization group - // authorized := r.Group("/", AuthRequired()) + // authorized := router.Group("/", AuthRequired()) // exactly the same as: - authorized := r.Group("/") + authorized := router.Group("/") // per group middleware! in this case we use the custom created // AuthRequired() middleware just in the "authorized" group. authorized.Use(AuthRequired()) @@ -37,7 +36,7 @@ func main() { } // Listen and serve on 0.0.0.0:8080 - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/tr/docs/examples/without-middleware.md b/src/content/docs/tr/docs/examples/without-middleware.md index 6ef54bda06..5ae5558125 100644 --- a/src/content/docs/tr/docs/examples/without-middleware.md +++ b/src/content/docs/tr/docs/examples/without-middleware.md @@ -1,6 +1,5 @@ --- title: "Without middleware by default" - --- Use diff --git a/src/content/docs/tr/docs/examples/write-log.md b/src/content/docs/tr/docs/examples/write-log.md index 759423de4b..a26be48277 100644 --- a/src/content/docs/tr/docs/examples/write-log.md +++ b/src/content/docs/tr/docs/examples/write-log.md @@ -1,6 +1,5 @@ --- title: "How to write log file" - --- ```go diff --git a/src/content/docs/tr/docs/faq/index.md b/src/content/docs/tr/docs/faq/index.md index ad348f11fe..02a2c66253 100644 --- a/src/content/docs/tr/docs/faq/index.md +++ b/src/content/docs/tr/docs/faq/index.md @@ -1,6 +1,5 @@ --- title: "FAQ" - sidebar: order: 9 --- diff --git a/src/content/docs/tr/docs/features/index.md b/src/content/docs/tr/docs/features/index.md index 86a795f2bb..975905bf64 100644 --- a/src/content/docs/tr/docs/features/index.md +++ b/src/content/docs/tr/docs/features/index.md @@ -1,6 +1,5 @@ --- title: "Özellikler" - sidebar: order: 4 --- diff --git a/src/content/docs/tr/docs/index.md b/src/content/docs/tr/docs/index.md index b851e012f7..0cc8d960b2 100644 --- a/src/content/docs/tr/docs/index.md +++ b/src/content/docs/tr/docs/index.md @@ -1,8 +1,7 @@ --- title: "Dokümantasyon" -linkTitle: "Dokümantasyon" sidebar: - order: 1 + order: 20 --- ## Gin nedir? diff --git a/src/content/docs/tr/docs/introduction/index.md b/src/content/docs/tr/docs/introduction/index.md index 4d21ea37a9..6c40de7cdc 100644 --- a/src/content/docs/tr/docs/introduction/index.md +++ b/src/content/docs/tr/docs/introduction/index.md @@ -1,6 +1,5 @@ --- title: "Giriş" - sidebar: order: 1 --- diff --git a/src/content/docs/tr/docs/jsoniter/index.md b/src/content/docs/tr/docs/jsoniter/index.md index 75a5685367..0de3f7dd78 100644 --- a/src/content/docs/tr/docs/jsoniter/index.md +++ b/src/content/docs/tr/docs/jsoniter/index.md @@ -1,6 +1,5 @@ --- title: "Jsoniter" - sidebar: order: 5 --- diff --git a/src/content/docs/tr/docs/quickstart/index.md b/src/content/docs/tr/docs/quickstart/index.md index ffa471f193..a6ee058221 100644 --- a/src/content/docs/tr/docs/quickstart/index.md +++ b/src/content/docs/tr/docs/quickstart/index.md @@ -1,6 +1,5 @@ --- title: "Hızlı Başlangıç" - sidebar: order: 2 --- @@ -69,13 +68,13 @@ package main import "github.com/gin-gonic/gin" func main() { - r := gin.Default() - r.GET("/ping", func(c *gin.Context) { + router := gin.Default() + router.GET("/ping", func(c *gin.Context) { c.JSON(200, gin.H{ "message": "pong", }) }) - r.Run() // 0.0.0.0:8080 adresini dinleyin ve servis edin + router.Run() // 0.0.0.0:8080 adresini dinleyin ve servis edin } ``` diff --git a/src/content/docs/tr/docs/testing/index.md b/src/content/docs/tr/docs/testing/index.md index 64893560a5..4b3a9f3386 100644 --- a/src/content/docs/tr/docs/testing/index.md +++ b/src/content/docs/tr/docs/testing/index.md @@ -1,6 +1,5 @@ --- title: "Test" - sidebar: order: 7 --- @@ -20,15 +19,15 @@ type User struct { } func setupRouter() *gin.Engine { - r := gin.Default() - r.GET("/ping", func(c *gin.Context) { + router := gin.Default() + router.GET("/ping", func(c *gin.Context) { c.String(200, "pong") }) return r } func postUser(r *gin.Engine) *gin.Engine { - r.POST("/user/add", func(c *gin.Context) { + router.POST("/user/add", func(c *gin.Context) { var user User c.BindJSON(&user) c.JSON(200, user) @@ -39,7 +38,7 @@ func postUser(r *gin.Engine) *gin.Engine { func main() { r := setupRouter() r = postUser(r) - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/tr/docs/users/index.md b/src/content/docs/tr/docs/users/index.md index e11409c547..938d5eca7c 100644 --- a/src/content/docs/tr/docs/users/index.md +++ b/src/content/docs/tr/docs/users/index.md @@ -1,6 +1,5 @@ --- title: "Kullanıcılar" - sidebar: order: 8 --- diff --git a/src/content/docs/zh-cn/blog/index.md b/src/content/docs/zh-cn/blog/index.md index 07fd81571f..63a2f96df4 100644 --- a/src/content/docs/zh-cn/blog/index.md +++ b/src/content/docs/zh-cn/blog/index.md @@ -1,6 +1,5 @@ --- title: "Blog" -linkTitle: "Blog" sidebar: order: 30 --- diff --git a/src/content/docs/zh-cn/blog/news/how-to-build-one-effective-middleware.md b/src/content/docs/zh-cn/blog/news/how-to-build-one-effective-middleware.md index d93e7cbc3e..f33833df25 100644 --- a/src/content/docs/zh-cn/blog/news/how-to-build-one-effective-middleware.md +++ b/src/content/docs/zh-cn/blog/news/how-to-build-one-effective-middleware.md @@ -1,7 +1,7 @@ --- title: "How to build one effective middleware?" linkTitle: "How to build one effective middleware?" -date: 2019-02-26 +lastUpdated: 2019-02-26 --- ## Constituent parts diff --git a/src/content/docs/zh-cn/blog/releases/release13.md b/src/content/docs/zh-cn/blog/releases/release13.md index 43f4656f4e..8d5057ad72 100644 --- a/src/content/docs/zh-cn/blog/releases/release13.md +++ b/src/content/docs/zh-cn/blog/releases/release13.md @@ -1,7 +1,7 @@ --- title: "Gin 1.3.0 is released" linkTitle: "Gin 1.3.0 is released" -date: 2018-08-14 +lastUpdated: 2018-08-14 --- ### CHANGELOG diff --git a/src/content/docs/zh-cn/blog/releases/release14.md b/src/content/docs/zh-cn/blog/releases/release14.md index a9e4a7e5bc..2f0cc80c79 100644 --- a/src/content/docs/zh-cn/blog/releases/release14.md +++ b/src/content/docs/zh-cn/blog/releases/release14.md @@ -1,7 +1,7 @@ --- title: "Gin 1.4.0 is released" linkTitle: "Gin 1.4.0 is released" -date: 2019-05-08 +lastUpdated: 2019-05-08 --- ### CHANGELOG diff --git a/src/content/docs/zh-cn/blog/releases/release15.md b/src/content/docs/zh-cn/blog/releases/release15.md index e4593b3ceb..4f5707a177 100644 --- a/src/content/docs/zh-cn/blog/releases/release15.md +++ b/src/content/docs/zh-cn/blog/releases/release15.md @@ -1,7 +1,7 @@ --- title: "Gin 1.5.0 is released" linkTitle: "Gin 1.5.0 is released" -date: 2019-11-28 +lastUpdated: 2019-11-28 --- ### CHANGELOG diff --git a/src/content/docs/zh-cn/docs/benchmarks/index.md b/src/content/docs/zh-cn/docs/benchmarks/index.md index 70e53bc8cd..bd8619876f 100644 --- a/src/content/docs/zh-cn/docs/benchmarks/index.md +++ b/src/content/docs/zh-cn/docs/benchmarks/index.md @@ -1,6 +1,5 @@ --- title: "基准测试" - sidebar: order: 3 --- diff --git a/src/content/docs/zh-cn/docs/deployment/index.md b/src/content/docs/zh-cn/docs/deployment/index.md index 896eed4917..c19c123ae8 100644 --- a/src/content/docs/zh-cn/docs/deployment/index.md +++ b/src/content/docs/zh-cn/docs/deployment/index.md @@ -1,6 +1,5 @@ --- title: "部署" - sidebar: order: 6 --- @@ -18,3 +17,102 @@ Render 是一个原生支持 Go 的现代化云平台,并支持全托管 SSL GAE 提供了两种方式部署 Go 应用。标准环境,简单易用但可定制性较低,且出于安全考虑禁止 [syscalls](https://github.com/gin-gonic/gin/issues/1639)。灵活环境,可以运行任何框架和库。 前往 [Go on Google App Engine](https://cloud.google.com/appengine/docs/go/) 了解更多并选择你喜欢的环境。 + +## 自托管部署 + +Gin 项目也可以采用自托管方式部署。具体的部署架构和安全性考虑会根据目标环境而有所不同。以下部分仅提供在规划部署时需要考虑的配置选项的概述。 + +## 配置选项 + +Gin 项目的部署可以通过环境变量或直接在代码中进行配置。 + +以下环境变量可用于配置 Gin: + +| 环境变量 | 说明 | +| -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| PORT | 使用 `router.Run()` 启动 Gin 服务器时(即不带任何参数)监听的 TCP 端口。 | +| GIN_MODE | 可设置为 `debug`、`release` 或 `test`。用于管理 Gin 的运行模式,如是否输出调试信息。也可以在代码中使用 `gin.SetMode(gin.ReleaseMode)` 或 `gin.SetMode(gin.TestMode)` 来设置。 | + +以下代码可用于配置 Gin: + +```go +// 不指定 Gin 的绑定地址和端口。默认绑定所有接口,端口为 8080。 +// 使用不带参数的 `Run()` 时,可通过 `PORT` 环境变量更改监听端口。 +router := gin.Default() +router.Run() + +// 指定 Gin 的绑定地址和端口。 +router := gin.Default() +router.Run("192.168.1.100:8080") + +// 仅指定监听端口。将绑定所有接口。 +router := gin.Default() +router.Run(":8080") + +// 设置哪些 IP 地址或 CIDR 被视为可信任的代理,用于设置记录真实客户端 IP 的请求头。 +// 更多详情请参阅文档。 +router := gin.Default() +router.SetTrustedProxies([]string{"192.168.1.2"}) +``` + +## 不要信任所有代理 + +Gin 允许你指定哪些请求头可以保存真实的客户端 IP(如果有的话),以及你信任哪些代理(或直接客户端)可以设置这些请求头。 + +在你的 `gin.Engine` 上使用 `SetTrustedProxies()` 函数来指定可信任的网络地址或网络 CIDR,这些地址的请求头中与客户端 IP 相关的信息将被信任。它们可以是 IPv4 地址、IPv4 CIDR、IPv6 地址或 IPv6 CIDR。 + +**注意:** 如果你没有使用上述函数指定可信代理,Gin 默认会信任所有代理,这**并不安全**。同时,如果你不使用任何代理,可以通过 `Engine.SetTrustedProxies(nil)` 来禁用此功能,这样 `Context.ClientIP()` 将直接返回远程地址,避免不必要的计算。 + +```go +import ( + "fmt" + + "github.com/gin-gonic/gin" +) + +func main() { + router := gin.Default() + router.SetTrustedProxies([]string{"192.168.1.2"}) + + router.GET("/", func(c *gin.Context) { + // 如果客户端是 192.168.1.2,则使用 X-Forwarded-For + // 请求头中可信部分推断出原始客户端 IP。 + // 否则,直接返回客户端 IP + fmt.Printf("ClientIP: %s\n", c.ClientIP()) + }) + router.Run() +} +``` + +**提示:** 如果你使用 CDN 服务,可以设置 `Engine.TrustedPlatform` 来跳过 TrustedProxies 检查,它的优先级高于 TrustedProxies。 +请看下面的示例: + +```go +import ( + "fmt" + + "github.com/gin-gonic/gin" +) + +func main() { + router := gin.Default() + // 使用预定义的 gin.PlatformXXX 头 + // Google App Engine + router.TrustedPlatform = gin.PlatformGoogleAppEngine + // Cloudflare + router.TrustedPlatform = gin.PlatformCloudflare + // Fly.io + router.TrustedPlatform = gin.PlatformFlyIO + // 或者,你可以设置自己的可信请求头。但要确保你的 CDN + // 能防止用户传递此请求头!例如,如果你的 CDN 将客户端 + // IP 放在 X-CDN-Client-IP 中: + router.TrustedPlatform = "X-CDN-Client-IP" + + router.GET("/", func(c *gin.Context) { + // 如果设置了 TrustedPlatform,ClientIP() 将解析 + // 对应的请求头并直接返回 IP + fmt.Printf("ClientIP: %s\n", c.ClientIP()) + }) + router.Run() +} +``` diff --git a/src/content/docs/zh-cn/docs/examples/ascii-json.md b/src/content/docs/zh-cn/docs/examples/ascii-json.md index 5694fb12d1..5891e76307 100644 --- a/src/content/docs/zh-cn/docs/examples/ascii-json.md +++ b/src/content/docs/zh-cn/docs/examples/ascii-json.md @@ -1,15 +1,14 @@ --- title: "AsciiJSON" - --- 使用 AsciiJSON 生成具有转义的非 ASCII 字符的 ASCII-only JSON。 ```go func main() { - r := gin.Default() + router := gin.Default() - r.GET("/someJSON", func(c *gin.Context) { + router.GET("/someJSON", func(c *gin.Context) { data := map[string]interface{}{ "lang": "GO语言", "tag": "
", @@ -20,6 +19,6 @@ func main() { }) // 监听并在 0.0.0.0:8080 上启动服务 - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/zh-cn/docs/examples/bind-body-into-dirrerent-structs.md b/src/content/docs/zh-cn/docs/examples/bind-body-into-dirrerent-structs.md index 1375acca23..10d941b732 100644 --- a/src/content/docs/zh-cn/docs/examples/bind-body-into-dirrerent-structs.md +++ b/src/content/docs/zh-cn/docs/examples/bind-body-into-dirrerent-structs.md @@ -1,6 +1,5 @@ --- title: "将 request body 绑定到不同的结构体中" - --- 一般通过调用 `c.Request.Body` 方法绑定数据,但不能多次调用这个方法。 @@ -53,4 +52,4 @@ func SomeHandler(c *gin.Context) { * `c.ShouldBindBodyWith` 会在绑定之前将 body 存储到上下文中。 这会对性能造成轻微影响,如果调用一次就能完成绑定的话,那就不要用这个方法。 * 只有某些格式需要此功能,如 `JSON`, `XML`, `MsgPack`, `ProtoBuf`。 对于其他格式, 如 `Query`, `Form`, `FormPost`, `FormMultipart` -可以多次调用 `c.ShouldBind()` 而不会造成任任何性能损失 (详见 [#1341](https://github.com/gin-gonic/gin/pull/1341))。 +可以多次调用 `c.ShouldBind()` 而不会造成任何性能损失 (详见 [#1341](https://github.com/gin-gonic/gin/pull/1341))。 diff --git a/src/content/docs/zh-cn/docs/examples/bind-form-data-request-with-custom-struct.md b/src/content/docs/zh-cn/docs/examples/bind-form-data-request-with-custom-struct.md index 872f6e3ca0..22b9f88b82 100644 --- a/src/content/docs/zh-cn/docs/examples/bind-form-data-request-with-custom-struct.md +++ b/src/content/docs/zh-cn/docs/examples/bind-form-data-request-with-custom-struct.md @@ -1,6 +1,5 @@ --- title: "绑定表单数据至自定义结构体" - --- 以下示例使用自定义结构体: @@ -55,18 +54,18 @@ func GetDataD(c *gin.Context) { } func main() { - r := gin.Default() - r.GET("/getb", GetDataB) - r.GET("/getc", GetDataC) - r.GET("/getd", GetDataD) + router := gin.Default() + router.GET("/getb", GetDataB) + router.GET("/getc", GetDataC) + router.GET("/getd", GetDataD) - r.Run() + router.Run() } ``` 使用 `curl` 命令结果: -``` +```bash $ curl "http://localhost:8080/getb?field_a=hello&field_b=world" {"a":{"FieldA":"hello"},"b":"world"} $ curl "http://localhost:8080/getc?field_a=hello&field_c=world" diff --git a/src/content/docs/zh-cn/docs/examples/bind-html-checkbox.md b/src/content/docs/zh-cn/docs/examples/bind-html-checkbox.md index 7507c43669..1742ee683f 100644 --- a/src/content/docs/zh-cn/docs/examples/bind-html-checkbox.md +++ b/src/content/docs/zh-cn/docs/examples/bind-html-checkbox.md @@ -1,6 +1,5 @@ --- title: "绑定 HTML 复选框" - --- 参见[详细信息](https://github.com/gin-gonic/gin/issues/129#issuecomment-124260092) diff --git a/src/content/docs/zh-cn/docs/examples/bind-query-or-post.md b/src/content/docs/zh-cn/docs/examples/bind-query-or-post.md index 3692e9834d..364cdc9a29 100644 --- a/src/content/docs/zh-cn/docs/examples/bind-query-or-post.md +++ b/src/content/docs/zh-cn/docs/examples/bind-query-or-post.md @@ -1,6 +1,5 @@ --- title: "绑定查询字符串或表单数据" - --- 查看[详细信息](https://github.com/gin-gonic/gin/issues/742#issuecomment-264681292)。 diff --git a/src/content/docs/zh-cn/docs/examples/bind-single-binary-with-template.md b/src/content/docs/zh-cn/docs/examples/bind-single-binary-with-template.md index acbc1e514d..82d7ebeb73 100644 --- a/src/content/docs/zh-cn/docs/examples/bind-single-binary-with-template.md +++ b/src/content/docs/zh-cn/docs/examples/bind-single-binary-with-template.md @@ -1,6 +1,5 @@ --- title: "静态资源嵌入" - --- 你可以使用 [go-assets](https://github.com/jessevdk/go-assets) 将静态资源打包到可执行文件中。 @@ -13,12 +12,12 @@ func main() { if err != nil { panic(err) } - r.SetHTMLTemplate(t) + router.SetHTMLTemplate(t) - r.GET("/", func(c *gin.Context) { + router.GET("/", func(c *gin.Context) { c.HTML(http.StatusOK, "/html/index.tmpl", nil) }) - r.Run(":8080") + router.Run(":8080") } // loadTemplate 加载由 go-assets-builder 嵌入的模板 diff --git a/src/content/docs/zh-cn/docs/examples/bind-uri.md b/src/content/docs/zh-cn/docs/examples/bind-uri.md index c229106737..e87d4b9d62 100644 --- a/src/content/docs/zh-cn/docs/examples/bind-uri.md +++ b/src/content/docs/zh-cn/docs/examples/bind-uri.md @@ -1,6 +1,5 @@ --- title: "绑定 Uri" - --- 查看[详细信息](https://github.com/gin-gonic/gin/issues/846). diff --git a/src/content/docs/zh-cn/docs/examples/binding-and-validation.md b/src/content/docs/zh-cn/docs/examples/binding-and-validation.md index a4a0c1a8b7..8fc7e97708 100644 --- a/src/content/docs/zh-cn/docs/examples/binding-and-validation.md +++ b/src/content/docs/zh-cn/docs/examples/binding-and-validation.md @@ -1,6 +1,5 @@ --- title: "模型绑定和验证" - --- 要将请求体绑定到结构体中,使用模型绑定。 Gin目前支持JSON、XML、YAML和标准表单值的绑定(foo=bar&boo=baz)。 diff --git a/src/content/docs/zh-cn/docs/examples/controlling-log-output-coloring.md b/src/content/docs/zh-cn/docs/examples/controlling-log-output-coloring.md index ce1edc1266..7757fb3b27 100644 --- a/src/content/docs/zh-cn/docs/examples/controlling-log-output-coloring.md +++ b/src/content/docs/zh-cn/docs/examples/controlling-log-output-coloring.md @@ -1,6 +1,5 @@ --- title: "控制日志输出颜色" - --- 根据检测到的 TTY,控制台的日志输出默认是有颜色的。 diff --git a/src/content/docs/zh-cn/docs/examples/cookie.md b/src/content/docs/zh-cn/docs/examples/cookie.md index 4a2b2b8747..e2fdccd7a7 100644 --- a/src/content/docs/zh-cn/docs/examples/cookie.md +++ b/src/content/docs/zh-cn/docs/examples/cookie.md @@ -1,8 +1,9 @@ --- -title: "设置和获取 Cookie" - +title: "Cookie" --- +设置和获取 Cookie + ```go import ( "fmt" @@ -29,3 +30,9 @@ func main() { router.Run() } ``` + +删除cookie: 通过设置max age的值为-1. + +```go +c.SetCookie("gin_cookie", "test", -1, "/", "localhost", false, true) +``` diff --git a/src/content/docs/zh-cn/docs/examples/custom-http-config.md b/src/content/docs/zh-cn/docs/examples/custom-http-config.md index 1d43616d22..5b51b2f75a 100644 --- a/src/content/docs/zh-cn/docs/examples/custom-http-config.md +++ b/src/content/docs/zh-cn/docs/examples/custom-http-config.md @@ -1,6 +1,5 @@ --- title: "自定义 HTTP 配置" - --- 直接使用 `http.ListenAndServe()`,如下所示: diff --git a/src/content/docs/zh-cn/docs/examples/custom-log-format.md b/src/content/docs/zh-cn/docs/examples/custom-log-format.md index 53b2a22699..ce9acbc2a6 100644 --- a/src/content/docs/zh-cn/docs/examples/custom-log-format.md +++ b/src/content/docs/zh-cn/docs/examples/custom-log-format.md @@ -1,6 +1,5 @@ --- title: "自定义日志文件" - --- 示例: diff --git a/src/content/docs/zh-cn/docs/examples/custom-middleware.md b/src/content/docs/zh-cn/docs/examples/custom-middleware.md index c16a2c7fb2..cc1af67424 100644 --- a/src/content/docs/zh-cn/docs/examples/custom-middleware.md +++ b/src/content/docs/zh-cn/docs/examples/custom-middleware.md @@ -1,6 +1,5 @@ --- title: "自定义中间件" - --- ```go @@ -27,9 +26,9 @@ func Logger() gin.HandlerFunc { func main() { r := gin.New() - r.Use(Logger()) + router.Use(Logger()) - r.GET("/test", func(c *gin.Context) { + router.GET("/test", func(c *gin.Context) { example := c.MustGet("example").(string) // 打印:"12345" @@ -37,7 +36,7 @@ func main() { }) // 监听并在 0.0.0.0:8080 上启动服务 - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/zh-cn/docs/examples/custom-validators.md b/src/content/docs/zh-cn/docs/examples/custom-validators.md index b16f8fa9db..7c13c7bbfe 100644 --- a/src/content/docs/zh-cn/docs/examples/custom-validators.md +++ b/src/content/docs/zh-cn/docs/examples/custom-validators.md @@ -1,6 +1,5 @@ --- title: "自定义验证器" - --- 注册自定义验证器,查看[示例代码](https://github.com/gin-gonic/examples/tree/master/struct-lvl-validations). diff --git a/src/content/docs/zh-cn/docs/examples/define-format-for-the-log-of-routes.md b/src/content/docs/zh-cn/docs/examples/define-format-for-the-log-of-routes.md index 5a0ba67ea3..0be1fe8d0d 100644 --- a/src/content/docs/zh-cn/docs/examples/define-format-for-the-log-of-routes.md +++ b/src/content/docs/zh-cn/docs/examples/define-format-for-the-log-of-routes.md @@ -1,6 +1,5 @@ --- title: "定义路由日志的格式" - --- 默认的路由日志格式: @@ -21,24 +20,24 @@ import ( ) func main() { - r := gin.Default() + router := gin.Default() gin.DebugPrintRouteFunc = func(httpMethod, absolutePath, handlerName string, nuHandlers int) { log.Printf("endpoint %v %v %v %v\n", httpMethod, absolutePath, handlerName, nuHandlers) } - r.POST("/foo", func(c *gin.Context) { + router.POST("/foo", func(c *gin.Context) { c.JSON(http.StatusOK, "foo") }) - r.GET("/bar", func(c *gin.Context) { + router.GET("/bar", func(c *gin.Context) { c.JSON(http.StatusOK, "bar") }) - r.GET("/status", func(c *gin.Context) { + router.GET("/status", func(c *gin.Context) { c.JSON(http.StatusOK, "ok") }) // 监听并在 0.0.0.0:8080 上启动服务 - r.Run() + router.Run() } ``` diff --git a/src/content/docs/zh-cn/docs/examples/goroutines-inside-a-middleware.md b/src/content/docs/zh-cn/docs/examples/goroutines-inside-a-middleware.md index 0a6eba2a5d..314fec9623 100644 --- a/src/content/docs/zh-cn/docs/examples/goroutines-inside-a-middleware.md +++ b/src/content/docs/zh-cn/docs/examples/goroutines-inside-a-middleware.md @@ -1,15 +1,14 @@ --- title: "在中间件中使用 Goroutine" - --- 当在中间件或 handler 中启动新的 Goroutine 时,**不能**使用原始的上下文,必须使用只读副本。 ```go func main() { - r := gin.Default() + router := gin.Default() - r.GET("/long_async", func(c *gin.Context) { + router.GET("/long_async", func(c *gin.Context) { // 创建在 goroutine 中使用的副本 cCp := c.Copy() go func() { @@ -21,7 +20,7 @@ func main() { }() }) - r.GET("/long_sync", func(c *gin.Context) { + router.GET("/long_sync", func(c *gin.Context) { // 用 time.Sleep() 模拟一个长任务。 time.Sleep(5 * time.Second) @@ -30,6 +29,6 @@ func main() { }) // 监听并在 0.0.0.0:8080 上启动服务 - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/zh-cn/docs/examples/graceful-restart-or-stop.md b/src/content/docs/zh-cn/docs/examples/graceful-restart-or-stop.md index fb5ddb8eda..333281f5be 100644 --- a/src/content/docs/zh-cn/docs/examples/graceful-restart-or-stop.md +++ b/src/content/docs/zh-cn/docs/examples/graceful-restart-or-stop.md @@ -1,6 +1,5 @@ --- title: "优雅地重启或停止" - --- 你想优雅地重启或停止 web 服务器吗?有一些方法可以做到这一点。 diff --git a/src/content/docs/zh-cn/docs/examples/grouping-routes.md b/src/content/docs/zh-cn/docs/examples/grouping-routes.md index d0b1d86009..0d3dc08f9b 100644 --- a/src/content/docs/zh-cn/docs/examples/grouping-routes.md +++ b/src/content/docs/zh-cn/docs/examples/grouping-routes.md @@ -1,6 +1,5 @@ --- title: "路由组" - --- ```go @@ -8,16 +7,16 @@ func main() { router := gin.Default() // 简单的路由组: v1 - v1 := router.Group("/v1") { + v1 := router.Group("/v1") v1.POST("/login", loginEndpoint) v1.POST("/submit", submitEndpoint) v1.POST("/read", readEndpoint) } // 简单的路由组: v2 - v2 := router.Group("/v2") { + v2 := router.Group("/v2") v2.POST("/login", loginEndpoint) v2.POST("/submit", submitEndpoint) v2.POST("/read", readEndpoint) diff --git a/src/content/docs/zh-cn/docs/examples/html-rendering.md b/src/content/docs/zh-cn/docs/examples/html-rendering.md index 875fa1efe5..87daae2b63 100644 --- a/src/content/docs/zh-cn/docs/examples/html-rendering.md +++ b/src/content/docs/zh-cn/docs/examples/html-rendering.md @@ -1,6 +1,5 @@ --- title: "HTML 渲染" - --- 使用 LoadHTMLGlob() 或者 LoadHTMLFiles() @@ -93,9 +92,9 @@ func main() { 你可以使用自定义分隔 ```go - r := gin.Default() - r.Delims("{[{", "}]}") - r.LoadHTMLGlob("/path/to/templates") + router := gin.Default() + router.Delims("{[{", "}]}") + router.LoadHTMLGlob("/path/to/templates") ``` #### 自定义模板功能 diff --git a/src/content/docs/zh-cn/docs/examples/http-method.md b/src/content/docs/zh-cn/docs/examples/http-method.md index 1960d38b42..ac39d120a7 100644 --- a/src/content/docs/zh-cn/docs/examples/http-method.md +++ b/src/content/docs/zh-cn/docs/examples/http-method.md @@ -1,6 +1,5 @@ --- title: "使用 HTTP 方法" - --- ```go diff --git a/src/content/docs/zh-cn/docs/examples/http2-server-push.md b/src/content/docs/zh-cn/docs/examples/http2-server-push.md index 272211993a..34cf068ff7 100644 --- a/src/content/docs/zh-cn/docs/examples/http2-server-push.md +++ b/src/content/docs/zh-cn/docs/examples/http2-server-push.md @@ -1,6 +1,5 @@ --- title: "HTTP2 server 推送" - --- http.Pusher 仅支持 **go1.8+**。 更多信息,请查阅 [golang blog](https://blog.golang.org/h2push)。 @@ -28,11 +27,11 @@ var html = template.Must(template.New("https").Parse(` `)) func main() { - r := gin.Default() - r.Static("/assets", "./assets") - r.SetHTMLTemplate(html) + router := gin.Default() + router.Static("/assets", "./assets") + router.SetHTMLTemplate(html) - r.GET("/", func(c *gin.Context) { + router.GET("/", func(c *gin.Context) { if pusher := c.Writer.Pusher(); pusher != nil { // 使用 pusher.Push() 做服务器推送 if err := pusher.Push("/assets/app.js", nil); err != nil { @@ -45,7 +44,7 @@ func main() { }) // 监听并在 https://127.0.0.1:8080 上启动服务 - r.RunTLS(":8080", "./testdata/server.pem", "./testdata/server.key") + router.RunTLS(":8080", "./testdata/server.pem", "./testdata/server.key") } ``` diff --git a/src/content/docs/zh-cn/docs/examples/index.md b/src/content/docs/zh-cn/docs/examples/index.md index 74b3c66152..6cba2afa29 100644 --- a/src/content/docs/zh-cn/docs/examples/index.md +++ b/src/content/docs/zh-cn/docs/examples/index.md @@ -1,6 +1,5 @@ --- title: "示例" - sidebar: order: 6 --- diff --git a/src/content/docs/zh-cn/docs/examples/jsonp.md b/src/content/docs/zh-cn/docs/examples/jsonp.md index 2bd6ca0985..133ce7e1be 100644 --- a/src/content/docs/zh-cn/docs/examples/jsonp.md +++ b/src/content/docs/zh-cn/docs/examples/jsonp.md @@ -1,15 +1,14 @@ --- title: "JSONP" - --- 使用 JSONP 向不同域的服务器请求数据。如果查询参数存在回调,则将回调添加到响应体中。 ```go func main() { - r := gin.Default() + router := gin.Default() - r.GET("/JSONP", func(c *gin.Context) { + router.GET("/JSONP", func(c *gin.Context) { data := map[string]interface{}{ "foo": "bar", } @@ -20,6 +19,6 @@ func main() { }) // 监听并在 0.0.0.0:8080 上启动服务 - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/zh-cn/docs/examples/map-as-querystring-or-postform.md b/src/content/docs/zh-cn/docs/examples/map-as-querystring-or-postform.md index 39846852ca..f6341d9ffe 100644 --- a/src/content/docs/zh-cn/docs/examples/map-as-querystring-or-postform.md +++ b/src/content/docs/zh-cn/docs/examples/map-as-querystring-or-postform.md @@ -1,6 +1,5 @@ --- title: "映射查询字符串或表单参数" - --- ```sh diff --git a/src/content/docs/zh-cn/docs/examples/multipart-urlencoded-binding.md b/src/content/docs/zh-cn/docs/examples/multipart-urlencoded-binding.md index d90bfb9c76..1f7105aae1 100644 --- a/src/content/docs/zh-cn/docs/examples/multipart-urlencoded-binding.md +++ b/src/content/docs/zh-cn/docs/examples/multipart-urlencoded-binding.md @@ -1,6 +1,5 @@ --- title: "Multipart/Urlencoded 绑定" - --- ```go diff --git a/src/content/docs/zh-cn/docs/examples/multipart-urlencoded-form.md b/src/content/docs/zh-cn/docs/examples/multipart-urlencoded-form.md index fab25a289d..a9b9020c28 100644 --- a/src/content/docs/zh-cn/docs/examples/multipart-urlencoded-form.md +++ b/src/content/docs/zh-cn/docs/examples/multipart-urlencoded-form.md @@ -1,6 +1,5 @@ --- title: "Multipart/Urlencoded 表单" - --- ```go diff --git a/src/content/docs/zh-cn/docs/examples/multiple-template.md b/src/content/docs/zh-cn/docs/examples/multiple-template.md index 0a5ca87211..b33618bf4a 100644 --- a/src/content/docs/zh-cn/docs/examples/multiple-template.md +++ b/src/content/docs/zh-cn/docs/examples/multiple-template.md @@ -1,6 +1,5 @@ --- title: "多模板" - --- Gin 默认允许只使用一个 html 模板。 查看[多模板渲染](https://github.com/gin-contrib/multitemplate) 以使用 go 1.6 `block template` 等功能。 diff --git a/src/content/docs/zh-cn/docs/examples/only-bind-query-string.md b/src/content/docs/zh-cn/docs/examples/only-bind-query-string.md index 0918115105..a7263fc88e 100644 --- a/src/content/docs/zh-cn/docs/examples/only-bind-query-string.md +++ b/src/content/docs/zh-cn/docs/examples/only-bind-query-string.md @@ -1,6 +1,5 @@ --- title: "只绑定 url 查询字符串" - --- `ShouldBindQuery` 函数只绑定 url 查询参数而忽略 post 数据。参阅[详细信息](https://github.com/gin-gonic/gin/issues/742#issuecomment-315953017). diff --git a/src/content/docs/zh-cn/docs/examples/param-in-path.md b/src/content/docs/zh-cn/docs/examples/param-in-path.md index f1e1ebfd42..1d9ef5637f 100644 --- a/src/content/docs/zh-cn/docs/examples/param-in-path.md +++ b/src/content/docs/zh-cn/docs/examples/param-in-path.md @@ -1,6 +1,5 @@ --- title: "路由参数" - --- ```go diff --git a/src/content/docs/zh-cn/docs/examples/pure-json.md b/src/content/docs/zh-cn/docs/examples/pure-json.md index edd1042d8e..d513492a96 100644 --- a/src/content/docs/zh-cn/docs/examples/pure-json.md +++ b/src/content/docs/zh-cn/docs/examples/pure-json.md @@ -1,29 +1,28 @@ --- title: "PureJSON" - --- 通常,JSON 使用 unicode 替换特殊 HTML 字符,例如 < 变为 \ u003c。如果要按字面对这些字符进行编码,则可以使用 PureJSON。Go 1.6 及更低版本无法使用此功能。 ```go func main() { - r := gin.Default() + router := gin.Default() // 提供 unicode 实体 - r.GET("/json", func(c *gin.Context) { + router.GET("/json", func(c *gin.Context) { c.JSON(200, gin.H{ "html": "Hello, world!", }) }) // 提供字面字符 - r.GET("/purejson", func(c *gin.Context) { + router.GET("/purejson", func(c *gin.Context) { c.PureJSON(200, gin.H{ "html": "Hello, world!", }) }) // 监听并在 0.0.0.0:8080 上启动服务 - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/zh-cn/docs/examples/query-and-post-form.md b/src/content/docs/zh-cn/docs/examples/query-and-post-form.md index 3262d599be..6e6cfac52a 100644 --- a/src/content/docs/zh-cn/docs/examples/query-and-post-form.md +++ b/src/content/docs/zh-cn/docs/examples/query-and-post-form.md @@ -1,6 +1,5 @@ --- title: "Query 和 post form" - --- ```sh diff --git a/src/content/docs/zh-cn/docs/examples/querystring-param.md b/src/content/docs/zh-cn/docs/examples/querystring-param.md index d56d57ff61..0ee0783704 100644 --- a/src/content/docs/zh-cn/docs/examples/querystring-param.md +++ b/src/content/docs/zh-cn/docs/examples/querystring-param.md @@ -1,6 +1,5 @@ --- title: "查询字符串参数" - --- ```go diff --git a/src/content/docs/zh-cn/docs/examples/redirects.md b/src/content/docs/zh-cn/docs/examples/redirects.md index a675dfb504..feec0158a7 100644 --- a/src/content/docs/zh-cn/docs/examples/redirects.md +++ b/src/content/docs/zh-cn/docs/examples/redirects.md @@ -1,12 +1,11 @@ --- title: "重定向" - --- HTTP 重定向很容易。 内部、外部重定向均支持。 ```go -r.GET("/test", func(c *gin.Context) { +router.GET("/test", func(c *gin.Context) { c.Redirect(http.StatusMovedPermanently, "http://www.google.com/") }) ``` @@ -14,7 +13,7 @@ r.GET("/test", func(c *gin.Context) { 通过 POST 方法进行 HTTP 重定向。请参考 issue:[#444](https://github.com/gin-gonic/gin/issues/444) ```go -r.POST("/test", func(c *gin.Context) { +router.POST("/test", func(c *gin.Context) { c.Redirect(http.StatusFound, "/foo") }) ``` @@ -22,11 +21,11 @@ r.POST("/test", func(c *gin.Context) { 路由重定向,使用 `HandleContext`: ``` go -r.GET("/test", func(c *gin.Context) { +router.GET("/test", func(c *gin.Context) { c.Request.URL.Path = "/test2" - r.HandleContext(c) + router.HandleContext(c) }) -r.GET("/test2", func(c *gin.Context) { +router.GET("/test2", func(c *gin.Context) { c.JSON(200, gin.H{"hello": "world"}) }) ``` diff --git a/src/content/docs/zh-cn/docs/examples/rendering.md b/src/content/docs/zh-cn/docs/examples/rendering.md index f7d432cb61..dccef208eb 100644 --- a/src/content/docs/zh-cn/docs/examples/rendering.md +++ b/src/content/docs/zh-cn/docs/examples/rendering.md @@ -1,18 +1,17 @@ --- title: "XML/JSON/YAML/ProtoBuf 渲染" - --- ```go func main() { - r := gin.Default() + router := gin.Default() // gin.H 是 map[string]interface{} 的一种快捷方式 - r.GET("/someJSON", func(c *gin.Context) { + router.GET("/someJSON", func(c *gin.Context) { c.JSON(http.StatusOK, gin.H{"message": "hey", "status": http.StatusOK}) }) - r.GET("/moreJSON", func(c *gin.Context) { + router.GET("/moreJSON", func(c *gin.Context) { // 你也可以使用一个结构体 var msg struct { Name string `json:"user"` @@ -27,15 +26,15 @@ func main() { c.JSON(http.StatusOK, msg) }) - r.GET("/someXML", func(c *gin.Context) { + router.GET("/someXML", func(c *gin.Context) { c.XML(http.StatusOK, gin.H{"message": "hey", "status": http.StatusOK}) }) - r.GET("/someYAML", func(c *gin.Context) { + router.GET("/someYAML", func(c *gin.Context) { c.YAML(http.StatusOK, gin.H{"message": "hey", "status": http.StatusOK}) }) - r.GET("/someProtoBuf", func(c *gin.Context) { + router.GET("/someProtoBuf", func(c *gin.Context) { reps := []int64{int64(1), int64(2)} label := "test" // protobuf 的具体定义写在 testdata/protoexample 文件中。 @@ -49,6 +48,6 @@ func main() { }) // 监听并在 0.0.0.0:8080 上启动服务 - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/zh-cn/docs/examples/run-multiple-service.md b/src/content/docs/zh-cn/docs/examples/run-multiple-service.md index f36cd7bbce..74fa0ddaad 100644 --- a/src/content/docs/zh-cn/docs/examples/run-multiple-service.md +++ b/src/content/docs/zh-cn/docs/examples/run-multiple-service.md @@ -1,6 +1,5 @@ --- title: "运行多个服务" - --- 请参阅 [issues](https://github.com/gin-gonic/gin/issues/346) 并尝试以下示例: diff --git a/src/content/docs/zh-cn/docs/examples/secure-json.md b/src/content/docs/zh-cn/docs/examples/secure-json.md index bb3fb627d0..4a60896a36 100644 --- a/src/content/docs/zh-cn/docs/examples/secure-json.md +++ b/src/content/docs/zh-cn/docs/examples/secure-json.md @@ -1,18 +1,17 @@ --- title: "SecureJSON" - --- 使用 SecureJSON 防止 json 劫持。如果给定的结构是数组值,则默认预置 `"while(1),"` 到响应体。 ```go func main() { - r := gin.Default() + router := gin.Default() // 你也可以使用自己的 SecureJSON 前缀 - // r.SecureJsonPrefix(")]}',\n") + // router.SecureJsonPrefix(")]}',\n") - r.GET("/someJSON", func(c *gin.Context) { + router.GET("/someJSON", func(c *gin.Context) { names := []string{"lena", "austin", "foo"} // 将输出:while(1);["lena","austin","foo"] @@ -20,6 +19,6 @@ func main() { }) // 监听并在 0.0.0.0:8080 上启动服务 - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/zh-cn/docs/examples/security-headers.md b/src/content/docs/zh-cn/docs/examples/security-headers.md index 7d5bebf398..df7a649097 100644 --- a/src/content/docs/zh-cn/docs/examples/security-headers.md +++ b/src/content/docs/zh-cn/docs/examples/security-headers.md @@ -1,6 +1,5 @@ --- title: "安全页眉" - --- 使用安全标头保护网络应用程序免受常见安全漏洞的攻击非常重要。本示例将向您展示如何在 Gin 应用程序中添加安全标头,以及如何避免与主机标头注入相关的攻击(SSRF、开放重定向)。 diff --git a/src/content/docs/zh-cn/docs/examples/serving-data-from-reader.md b/src/content/docs/zh-cn/docs/examples/serving-data-from-reader.md index 0687affbf9..0ee9214143 100644 --- a/src/content/docs/zh-cn/docs/examples/serving-data-from-reader.md +++ b/src/content/docs/zh-cn/docs/examples/serving-data-from-reader.md @@ -1,6 +1,5 @@ --- title: "从 reader 读取数据" - --- ```go diff --git a/src/content/docs/zh-cn/docs/examples/serving-static-files.md b/src/content/docs/zh-cn/docs/examples/serving-static-files.md index d4144fe8d5..8ccf78738d 100644 --- a/src/content/docs/zh-cn/docs/examples/serving-static-files.md +++ b/src/content/docs/zh-cn/docs/examples/serving-static-files.md @@ -1,6 +1,5 @@ --- title: "静态文件服务" - --- ```go diff --git a/src/content/docs/zh-cn/docs/examples/support-lets-encrypt.md b/src/content/docs/zh-cn/docs/examples/support-lets-encrypt.md index a236597541..04805d62cb 100644 --- a/src/content/docs/zh-cn/docs/examples/support-lets-encrypt.md +++ b/src/content/docs/zh-cn/docs/examples/support-lets-encrypt.md @@ -1,6 +1,5 @@ --- title: "支持 Let's Encrypt" - --- 一行代码支持 LetsEncrypt HTTPS servers 示例。 @@ -16,10 +15,10 @@ import ( ) func main() { - r := gin.Default() + router := gin.Default() // Ping handler - r.GET("/ping", func(c *gin.Context) { + router.GET("/ping", func(c *gin.Context) { c.String(200, "pong") }) @@ -41,10 +40,10 @@ import ( ) func main() { - r := gin.Default() + router := gin.Default() // Ping handler - r.GET("/ping", func(c *gin.Context) { + router.GET("/ping", func(c *gin.Context) { c.String(200, "pong") }) diff --git a/src/content/docs/zh-cn/docs/examples/upload-file/index.md b/src/content/docs/zh-cn/docs/examples/upload-file/index.md index 2891e15f33..c79a1b1aa2 100644 --- a/src/content/docs/zh-cn/docs/examples/upload-file/index.md +++ b/src/content/docs/zh-cn/docs/examples/upload-file/index.md @@ -1,6 +1,5 @@ --- title: "上传文件" - --- 本节列出了上传图片的 api 用法。 diff --git a/src/content/docs/zh-cn/docs/examples/upload-file/multiple-file.md b/src/content/docs/zh-cn/docs/examples/upload-file/multiple-file.md index 0c1662d2cc..90eb204c3c 100644 --- a/src/content/docs/zh-cn/docs/examples/upload-file/multiple-file.md +++ b/src/content/docs/zh-cn/docs/examples/upload-file/multiple-file.md @@ -1,6 +1,5 @@ --- title: "多文件" - --- 查看详细[示例代码](https://github.com/gin-gonic/examples/tree/master/upload-file/multiple). @@ -19,8 +18,7 @@ func main() { log.Println(file.Filename) // 上传文件至指定目录 - dst := "./" + file.Filename - c.SaveUploadedFile(file, dst) + c.SaveUploadedFile(file, "./files/" + file.Filename) } c.String(http.StatusOK, fmt.Sprintf("%d files uploaded!", len(files))) }) diff --git a/src/content/docs/zh-cn/docs/examples/upload-file/single-file.md b/src/content/docs/zh-cn/docs/examples/upload-file/single-file.md index c76477921f..496ff775dd 100644 --- a/src/content/docs/zh-cn/docs/examples/upload-file/single-file.md +++ b/src/content/docs/zh-cn/docs/examples/upload-file/single-file.md @@ -1,6 +1,5 @@ --- title: "单文件" - --- 参考 issue [#774](https://github.com/gin-gonic/gin/issues/774) 和详细[示例代码](https://github.com/gin-gonic/examples/tree/master/upload-file/single). @@ -17,7 +16,7 @@ func main() { dst := "./" + file.Filename // 上传文件至指定的完整文件路径 - c.SaveUploadedFile(file, dst) + c.SaveUploadedFile(file, "./files/" + file.Filename) c.String(http.StatusOK, fmt.Sprintf("'%s' uploaded!", file.Filename)) }) diff --git a/src/content/docs/zh-cn/docs/examples/using-basicauth-middleware.md b/src/content/docs/zh-cn/docs/examples/using-basicauth-middleware.md index 97d25144df..2a5f7c9f1f 100644 --- a/src/content/docs/zh-cn/docs/examples/using-basicauth-middleware.md +++ b/src/content/docs/zh-cn/docs/examples/using-basicauth-middleware.md @@ -1,6 +1,5 @@ --- title: "使用 BasicAuth 中间件" - --- ```go @@ -12,11 +11,11 @@ var secrets = gin.H{ } func main() { - r := gin.Default() + router := gin.Default() // 路由组使用 gin.BasicAuth() 中间件 // gin.Accounts 是 map[string]string 的一种快捷方式 - authorized := r.Group("/admin", gin.BasicAuth(gin.Accounts{ + authorized := router.Group("/admin", gin.BasicAuth(gin.Accounts{ "foo": "bar", "austin": "1234", "lena": "hello2", @@ -36,6 +35,6 @@ func main() { }) // 监听并在 0.0.0.0:8080 上启动服务 - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/zh-cn/docs/examples/using-middleware.md b/src/content/docs/zh-cn/docs/examples/using-middleware.md index ae4043d4e4..32cecb5ba7 100644 --- a/src/content/docs/zh-cn/docs/examples/using-middleware.md +++ b/src/content/docs/zh-cn/docs/examples/using-middleware.md @@ -1,6 +1,5 @@ --- title: "使用中间件" - --- ```go @@ -11,18 +10,18 @@ func main() { // 全局中间件 // Logger 中间件将日志写入 gin.DefaultWriter,即使你将 GIN_MODE 设置为 release。 // By default gin.DefaultWriter = os.Stdout - r.Use(gin.Logger()) + router.Use(gin.Logger()) // Recovery 中间件会 recover 任何 panic。如果有 panic 的话,会写入 500。 - r.Use(gin.Recovery()) + router.Use(gin.Recovery()) // 你可以为每个路由添加任意数量的中间件。 - r.GET("/benchmark", MyBenchLogger(), benchEndpoint) + router.GET("/benchmark", MyBenchLogger(), benchEndpoint) // 认证路由组 - // authorized := r.Group("/", AuthRequired()) + // authorized := router.Group("/", AuthRequired()) // 和使用以下两行代码的效果完全一样: - authorized := r.Group("/") + authorized := router.Group("/") // 路由组中间件! 在此例中,我们在 "authorized" 路由组中使用自定义创建的 // AuthRequired() 中间件 authorized.Use(AuthRequired()) @@ -37,7 +36,7 @@ func main() { } // 监听并在 0.0.0.0:8080 上启动服务 - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/zh-cn/docs/examples/without-middleware.md b/src/content/docs/zh-cn/docs/examples/without-middleware.md index 792b7c1353..96dcb3743c 100644 --- a/src/content/docs/zh-cn/docs/examples/without-middleware.md +++ b/src/content/docs/zh-cn/docs/examples/without-middleware.md @@ -1,6 +1,5 @@ --- title: "不使用默认的中间件" - --- 使用 diff --git a/src/content/docs/zh-cn/docs/examples/write-log.md b/src/content/docs/zh-cn/docs/examples/write-log.md index 59a260269e..0f717d5634 100644 --- a/src/content/docs/zh-cn/docs/examples/write-log.md +++ b/src/content/docs/zh-cn/docs/examples/write-log.md @@ -1,6 +1,5 @@ --- title: "如何记录日志" - --- ```go diff --git a/src/content/docs/zh-cn/docs/faq/index.md b/src/content/docs/zh-cn/docs/faq/index.md index feac4626cf..c00c6cc69c 100644 --- a/src/content/docs/zh-cn/docs/faq/index.md +++ b/src/content/docs/zh-cn/docs/faq/index.md @@ -1,6 +1,5 @@ --- title: "FAQ" - sidebar: order: 9 --- diff --git a/src/content/docs/zh-cn/docs/features/index.md b/src/content/docs/zh-cn/docs/features/index.md index ddf4d78268..637ae8ea32 100644 --- a/src/content/docs/zh-cn/docs/features/index.md +++ b/src/content/docs/zh-cn/docs/features/index.md @@ -1,6 +1,5 @@ --- title: "特性" - sidebar: order: 4 --- diff --git a/src/content/docs/zh-cn/docs/index.md b/src/content/docs/zh-cn/docs/index.md index f80e90657d..c533a12733 100644 --- a/src/content/docs/zh-cn/docs/index.md +++ b/src/content/docs/zh-cn/docs/index.md @@ -1,8 +1,7 @@ --- title: "文档" -linkTitle: "文档" sidebar: - order: 1 + order: 20 --- ## Gin 是什么? diff --git a/src/content/docs/zh-cn/docs/introduction/index.md b/src/content/docs/zh-cn/docs/introduction/index.md index e8938ffcb4..408f2b4098 100644 --- a/src/content/docs/zh-cn/docs/introduction/index.md +++ b/src/content/docs/zh-cn/docs/introduction/index.md @@ -1,6 +1,5 @@ --- title: "介绍" - sidebar: order: 1 --- diff --git a/src/content/docs/zh-cn/docs/jsoniter/index.md b/src/content/docs/zh-cn/docs/jsoniter/index.md index 3d4e88d84a..be78d7c351 100644 --- a/src/content/docs/zh-cn/docs/jsoniter/index.md +++ b/src/content/docs/zh-cn/docs/jsoniter/index.md @@ -1,6 +1,5 @@ --- title: "Jsoniter" - sidebar: order: 5 --- diff --git a/src/content/docs/zh-cn/docs/quickstart/index.md b/src/content/docs/zh-cn/docs/quickstart/index.md index ae770aff33..45b09be714 100644 --- a/src/content/docs/zh-cn/docs/quickstart/index.md +++ b/src/content/docs/zh-cn/docs/quickstart/index.md @@ -1,6 +1,5 @@ --- title: "快速入门" - sidebar: order: 2 --- @@ -18,6 +17,11 @@ sidebar: ```sh $ go get -u github.com/gin-gonic/gin ``` +或 install +```sh +$ go install github.com/gin-gonic/gin@latest +``` + 2.将 gin 引入到代码中: @@ -67,13 +71,13 @@ package main import "github.com/gin-gonic/gin" func main() { - r := gin.Default() - r.GET("/ping", func(c *gin.Context) { + router := gin.Default() + router.GET("/ping", func(c *gin.Context) { c.JSON(200, gin.H{ "message": "pong", }) }) - r.Run() // 监听并在 0.0.0.0:8080 上启动服务 + router.Run() // 监听并在 0.0.0.0:8080 上启动服务 } ``` diff --git a/src/content/docs/zh-cn/docs/testing/index.md b/src/content/docs/zh-cn/docs/testing/index.md index feff75e911..06e06df12a 100644 --- a/src/content/docs/zh-cn/docs/testing/index.md +++ b/src/content/docs/zh-cn/docs/testing/index.md @@ -1,6 +1,5 @@ --- title: "测试" - sidebar: order: 7 --- @@ -20,15 +19,15 @@ type User struct { } func setupRouter() *gin.Engine { - r := gin.Default() - r.GET("/ping", func(c *gin.Context) { + router := gin.Default() + router.GET("/ping", func(c *gin.Context) { c.String(200, "pong") }) return r } func postUser(r *gin.Engine) *gin.Engine { - r.POST("/user/add", func(c *gin.Context) { + router.POST("/user/add", func(c *gin.Context) { var user User c.BindJSON(&user) c.JSON(200, user) @@ -39,7 +38,7 @@ func postUser(r *gin.Engine) *gin.Engine { func main() { r := setupRouter() r = postUser(r) - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/zh-cn/docs/users/index.md b/src/content/docs/zh-cn/docs/users/index.md index 4269424ec9..9951cc82ae 100644 --- a/src/content/docs/zh-cn/docs/users/index.md +++ b/src/content/docs/zh-cn/docs/users/index.md @@ -1,6 +1,5 @@ --- title: "用户" - sidebar: order: 8 --- diff --git a/src/content/docs/zh-tw/blog/index.md b/src/content/docs/zh-tw/blog/index.md index 07fd81571f..63a2f96df4 100644 --- a/src/content/docs/zh-tw/blog/index.md +++ b/src/content/docs/zh-tw/blog/index.md @@ -1,6 +1,5 @@ --- title: "Blog" -linkTitle: "Blog" sidebar: order: 30 --- diff --git a/src/content/docs/zh-tw/blog/news/how-to-build-one-effective-middleware.md b/src/content/docs/zh-tw/blog/news/how-to-build-one-effective-middleware.md index d93e7cbc3e..f33833df25 100644 --- a/src/content/docs/zh-tw/blog/news/how-to-build-one-effective-middleware.md +++ b/src/content/docs/zh-tw/blog/news/how-to-build-one-effective-middleware.md @@ -1,7 +1,7 @@ --- title: "How to build one effective middleware?" linkTitle: "How to build one effective middleware?" -date: 2019-02-26 +lastUpdated: 2019-02-26 --- ## Constituent parts diff --git a/src/content/docs/zh-tw/blog/releases/release13.md b/src/content/docs/zh-tw/blog/releases/release13.md index 43f4656f4e..8d5057ad72 100644 --- a/src/content/docs/zh-tw/blog/releases/release13.md +++ b/src/content/docs/zh-tw/blog/releases/release13.md @@ -1,7 +1,7 @@ --- title: "Gin 1.3.0 is released" linkTitle: "Gin 1.3.0 is released" -date: 2018-08-14 +lastUpdated: 2018-08-14 --- ### CHANGELOG diff --git a/src/content/docs/zh-tw/blog/releases/release14.md b/src/content/docs/zh-tw/blog/releases/release14.md index 23fd648294..c145f3b520 100644 --- a/src/content/docs/zh-tw/blog/releases/release14.md +++ b/src/content/docs/zh-tw/blog/releases/release14.md @@ -1,7 +1,7 @@ --- title: "Gin 1.4.0 is released" linkTitle: "Gin 1.4.0 is released" -date: 2019-05-08 +lastUpdated: 2019-05-08 --- ### CHANGELOG diff --git a/src/content/docs/zh-tw/blog/releases/release15.md b/src/content/docs/zh-tw/blog/releases/release15.md index e4593b3ceb..4f5707a177 100644 --- a/src/content/docs/zh-tw/blog/releases/release15.md +++ b/src/content/docs/zh-tw/blog/releases/release15.md @@ -1,7 +1,7 @@ --- title: "Gin 1.5.0 is released" linkTitle: "Gin 1.5.0 is released" -date: 2019-11-28 +lastUpdated: 2019-11-28 --- ### CHANGELOG diff --git a/src/content/docs/zh-tw/docs/benchmarks/index.md b/src/content/docs/zh-tw/docs/benchmarks/index.md index 1cbdba6205..72f3988b1b 100644 --- a/src/content/docs/zh-tw/docs/benchmarks/index.md +++ b/src/content/docs/zh-tw/docs/benchmarks/index.md @@ -1,6 +1,5 @@ --- title: "效能評估" - sidebar: order: 3 --- diff --git a/src/content/docs/zh-tw/docs/deployment/index.md b/src/content/docs/zh-tw/docs/deployment/index.md index e9dc870046..959d30a390 100644 --- a/src/content/docs/zh-tw/docs/deployment/index.md +++ b/src/content/docs/zh-tw/docs/deployment/index.md @@ -1,12 +1,23 @@ --- title: "部署" - sidebar: order: 6 --- Gin 專案可以輕鬆部署到任意雲主機商。 +## [Koyeb](https://www.koyeb.com) + +Koyeb 是一個開發者友善的無伺服器平台,可透過基於 Git 的部署在全球部署應用程式,支援 TLS 加密、本地自動擴展、全球邊緣網絡,以及內建的服務網格與發現功能。 + +請參照 Koyeb [指南部署您的 Gin 專案](https://www.koyeb.com/tutorials/deploy-go-gin-on-koyeb)。 + +## [Qovery](https://www.qovery.com) + +Qovery 提供免費的雲端主機托管,包括資料庫、SSL、全球 CDN,以及使用 Git 進行自動部署。 + +請參照 Qovery 指南來[部署您的 Gin 項目](https://docs.qovery.com/guides/tutorial/deploy-gin-with-postgresql/)。 + ## [Render](https://render.com) Render 是一個原生支援 Go 語言的現代化雲平台,並支持管理 SSL、資料庫、不停機部署、HTTP/2 和 websocket。 @@ -18,3 +29,102 @@ Render 是一個原生支援 Go 語言的現代化雲平台,並支持管理 SS GAE 提供兩種方式部署 Go 應用。標準環境簡單使用但是比較客製化,且出於安全考量禁止使用 [syscalls](https://github.com/gin-gonic/gin/issues/1639)。在靈活的還輕可以運行任何框架跟套件。 前往 [Google App Engine](https://cloud.google.com/appengine/docs/go/) 了解更多並選擇您喜歡的環境。 + +## 自主部署 + +Gin 專案也可以採用自主部署的方式。部署架構和安全性考量會依據目標環境而有所不同。以下章節僅提供規劃部署時需要考慮的設定選項概觀。 + +## 設定選項 + +Gin 專案部署可以透過環境變數或直接在程式碼中進行調整。 + +以下是可用於設定 Gin 的環境變數: + +| 環境變數 | 說明 | +| -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| PORT | 使用 `router.Run()` 啟動 Gin 伺服器時要監聽的 TCP 連接埠(即不帶任何參數時)。 | +| GIN_MODE | 可設定為 `debug`、`release` 或 `test`。用於管理 Gin 模式,例如是否輸出除錯資訊。也可以在程式碼中使用 `gin.SetMode(gin.ReleaseMode)` 或 `gin.SetMode(gin.TestMode)` 來設定。 | + +以下程式碼可用於設定 Gin: + +```go +// 不指定 Gin 的綁定位址或連接埠。預設會綁定在所有介面的 8080 連接埠。 +// 使用不帶參數的 `Run()` 時可透過 `PORT` 環境變數更改監聽連接埠。 +router := gin.Default() +router.Run() + +// 指定 Gin 的綁定位址和連接埠。 +router := gin.Default() +router.Run("192.168.1.100:8080") + +// 只指定監聽連接埠。將綁定在所有介面。 +router := gin.Default() +router.Run(":8080") + +// 設定哪些 IP 位址或 CIDR 被視為可信任的代理,用於設定紀錄真實客戶端 IP 的標頭。 +// 詳細資訊請參閱文件。 +router := gin.Default() +router.SetTrustedProxies([]string{"192.168.1.2"}) +``` + +## 不要信任所有代理 + +Gin 允許您指定哪些標頭可以保存真實的客戶端 IP(如果有的話),以及指定您信任哪些代理(或直接客戶端)可以設定這些標頭。 + +在 `gin.Engine` 上使用 `SetTrustedProxies()` 函式來指定可信任的網路位址或網路 CIDR,這些來源的請求標頭中與客戶端 IP 相關的資訊將被視為可信任。可以是 IPv4 位址、IPv4 CIDR、IPv6 位址或 IPv6 CIDR。 + +**注意:** 如果您沒有使用上述函式指定可信任的代理,Gin 預設會信任所有代理,這是**不安全的**。同時,如果您不使用任何代理,可以使用 `Engine.SetTrustedProxies(nil)` 來停用此功能,這樣 `Context.ClientIP()` 將直接回傳遠端位址,避免不必要的運算。 + +```go +import ( + "fmt" + + "github.com/gin-gonic/gin" +) + +func main() { + router := gin.Default() + router.SetTrustedProxies([]string{"192.168.1.2"}) + + router.GET("/", func(c *gin.Context) { + // 如果客戶端是 192.168.1.2,則使用 X-Forwarded-For + // 標頭中可信任的部分來推斷原始客戶端 IP。 + // 否則,直接回傳客戶端 IP + fmt.Printf("ClientIP: %s\n", c.ClientIP()) + }) + router.Run() +} +``` + +**提醒:** 如果您使用 CDN 服務,可以設定 `Engine.TrustedPlatform` 來跳過 TrustedProxies 檢查,它的優先順序高於 TrustedProxies。 +請看以下範例: + +```go +import ( + "fmt" + + "github.com/gin-gonic/gin" +) + +func main() { + router := gin.Default() + // 使用預定義的標頭 gin.PlatformXXX + // Google App Engine + router.TrustedPlatform = gin.PlatformGoogleAppEngine + // Cloudflare + router.TrustedPlatform = gin.PlatformCloudflare + // Fly.io + router.TrustedPlatform = gin.PlatformFlyIO + // 或者,您可以設定自己的可信任請求標頭。但請確保您的 CDN + // 會防止使用者傳遞此標頭!例如,如果您的 CDN 將客戶端 IP + // 放在 X-CDN-Client-IP 中: + router.TrustedPlatform = "X-CDN-Client-IP" + + router.GET("/", func(c *gin.Context) { + // 如果您設定了 TrustedPlatform,ClientIP() 將會解析 + // 對應的標頭並直接回傳 IP + fmt.Printf("ClientIP: %s\n", c.ClientIP()) + }) + router.Run() +} +``` diff --git a/src/content/docs/zh-tw/docs/examples/ascii-json.md b/src/content/docs/zh-tw/docs/examples/ascii-json.md index 7e2d2b0d04..bafbe964f3 100644 --- a/src/content/docs/zh-tw/docs/examples/ascii-json.md +++ b/src/content/docs/zh-tw/docs/examples/ascii-json.md @@ -1,15 +1,14 @@ --- title: "AsciiJSON" - --- Using AsciiJSON to Generates ASCII-only JSON with escaped non-ASCII characters. ```go func main() { - r := gin.Default() + router := gin.Default() - r.GET("/someJSON", func(c *gin.Context) { + router.GET("/someJSON", func(c *gin.Context) { data := map[string]interface{}{ "lang": "GO语言", "tag": "
", @@ -20,6 +19,6 @@ func main() { }) // Listen and serve on 0.0.0.0:8080 - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/zh-tw/docs/examples/bind-body-into-dirrerent-structs.md b/src/content/docs/zh-tw/docs/examples/bind-body-into-dirrerent-structs.md index 138179eea1..60701cb187 100644 --- a/src/content/docs/zh-tw/docs/examples/bind-body-into-dirrerent-structs.md +++ b/src/content/docs/zh-tw/docs/examples/bind-body-into-dirrerent-structs.md @@ -1,6 +1,5 @@ --- title: "Try to bind body into different structs" - --- The normal methods for binding request body consumes `c.Request.Body` and they diff --git a/src/content/docs/zh-tw/docs/examples/bind-form-data-request-with-custom-struct.md b/src/content/docs/zh-tw/docs/examples/bind-form-data-request-with-custom-struct.md index 73f522675c..a4b9f7eb62 100644 --- a/src/content/docs/zh-tw/docs/examples/bind-form-data-request-with-custom-struct.md +++ b/src/content/docs/zh-tw/docs/examples/bind-form-data-request-with-custom-struct.md @@ -1,6 +1,5 @@ --- title: "Bind form-data request with custom struct" - --- The follow example using custom struct: @@ -55,18 +54,18 @@ func GetDataD(c *gin.Context) { } func main() { - r := gin.Default() - r.GET("/getb", GetDataB) - r.GET("/getc", GetDataC) - r.GET("/getd", GetDataD) + router := gin.Default() + router.GET("/getb", GetDataB) + router.GET("/getc", GetDataC) + router.GET("/getd", GetDataD) - r.Run() + router.Run() } ``` Using the command `curl` command result: -``` +```bash $ curl "http://localhost:8080/getb?field_a=hello&field_b=world" {"a":{"FieldA":"hello"},"b":"world"} $ curl "http://localhost:8080/getc?field_a=hello&field_c=world" diff --git a/src/content/docs/zh-tw/docs/examples/bind-html-checkbox.md b/src/content/docs/zh-tw/docs/examples/bind-html-checkbox.md index 4b1ee65efa..0de0cad363 100644 --- a/src/content/docs/zh-tw/docs/examples/bind-html-checkbox.md +++ b/src/content/docs/zh-tw/docs/examples/bind-html-checkbox.md @@ -1,6 +1,5 @@ --- title: "Bind html checkboxes" - --- See the [detail information](https://github.com/gin-gonic/gin/issues/129#issuecomment-124260092) diff --git a/src/content/docs/zh-tw/docs/examples/bind-query-or-post.md b/src/content/docs/zh-tw/docs/examples/bind-query-or-post.md index 9912d908a2..ce6b7f9892 100644 --- a/src/content/docs/zh-tw/docs/examples/bind-query-or-post.md +++ b/src/content/docs/zh-tw/docs/examples/bind-query-or-post.md @@ -1,6 +1,5 @@ --- title: "Bind query string or post data" - --- See the [detail information](https://github.com/gin-gonic/gin/issues/742#issuecomment-264681292). diff --git a/src/content/docs/zh-tw/docs/examples/bind-single-binary-with-template.md b/src/content/docs/zh-tw/docs/examples/bind-single-binary-with-template.md index 3f79dc8ac3..cbb2fe84bf 100644 --- a/src/content/docs/zh-tw/docs/examples/bind-single-binary-with-template.md +++ b/src/content/docs/zh-tw/docs/examples/bind-single-binary-with-template.md @@ -1,6 +1,5 @@ --- title: "Build a single binary with templates" - --- You can build a server into a single binary containing templates by using [go-assets][]. @@ -15,12 +14,12 @@ func main() { if err != nil { panic(err) } - r.SetHTMLTemplate(t) + router.SetHTMLTemplate(t) - r.GET("/", func(c *gin.Context) { + router.GET("/", func(c *gin.Context) { c.HTML(http.StatusOK, "/html/index.tmpl", nil) }) - r.Run(":8080") + router.Run(":8080") } // loadTemplate loads templates embedded by go-assets-builder diff --git a/src/content/docs/zh-tw/docs/examples/bind-uri.md b/src/content/docs/zh-tw/docs/examples/bind-uri.md index e4f1257ce8..d267df93e0 100644 --- a/src/content/docs/zh-tw/docs/examples/bind-uri.md +++ b/src/content/docs/zh-tw/docs/examples/bind-uri.md @@ -1,6 +1,5 @@ --- title: "Bind Uri" - --- 查看[詳細訊息](https://github.com/gin-gonic/gin/issues/846). diff --git a/src/content/docs/zh-tw/docs/examples/binding-and-validation.md b/src/content/docs/zh-tw/docs/examples/binding-and-validation.md index 2de4465dac..091a8534fe 100644 --- a/src/content/docs/zh-tw/docs/examples/binding-and-validation.md +++ b/src/content/docs/zh-tw/docs/examples/binding-and-validation.md @@ -1,6 +1,5 @@ --- title: "Model binding and validation" - --- To bind a request body into a type, use model binding. We currently support binding of JSON, XML, YAML and standard form values (foo=bar&boo=baz). diff --git a/src/content/docs/zh-tw/docs/examples/controlling-log-output-coloring.md b/src/content/docs/zh-tw/docs/examples/controlling-log-output-coloring.md index 8d0e834c8c..ffa6063da4 100644 --- a/src/content/docs/zh-tw/docs/examples/controlling-log-output-coloring.md +++ b/src/content/docs/zh-tw/docs/examples/controlling-log-output-coloring.md @@ -1,6 +1,5 @@ --- title: "Controlling Log output coloring" - --- By default, logs output on console should be colorized depending on the detected TTY. diff --git a/src/content/docs/zh-tw/docs/examples/cookie.md b/src/content/docs/zh-tw/docs/examples/cookie.md index 090e66354a..3efb30edf5 100644 --- a/src/content/docs/zh-tw/docs/examples/cookie.md +++ b/src/content/docs/zh-tw/docs/examples/cookie.md @@ -1,8 +1,9 @@ --- -title: "Set and get a cookie" - +title: "Cookie" --- +Set and get cookie. + ```go import ( "fmt" @@ -29,3 +30,9 @@ func main() { router.Run() } ``` + +Delete cookie by set max age to -1. + +```go +c.SetCookie("gin_cookie", "test", -1, "/", "localhost", false, true) +``` diff --git a/src/content/docs/zh-tw/docs/examples/custom-http-config.md b/src/content/docs/zh-tw/docs/examples/custom-http-config.md index 42de783145..748cf840f2 100644 --- a/src/content/docs/zh-tw/docs/examples/custom-http-config.md +++ b/src/content/docs/zh-tw/docs/examples/custom-http-config.md @@ -1,6 +1,5 @@ --- title: "Custom HTTP configuration" - --- Use `http.ListenAndServe()` directly, like this: diff --git a/src/content/docs/zh-tw/docs/examples/custom-middleware.md b/src/content/docs/zh-tw/docs/examples/custom-middleware.md index 8de8438b07..86b6cfadbc 100644 --- a/src/content/docs/zh-tw/docs/examples/custom-middleware.md +++ b/src/content/docs/zh-tw/docs/examples/custom-middleware.md @@ -1,6 +1,5 @@ --- title: "Custom Middleware" - --- ```go @@ -27,9 +26,9 @@ func Logger() gin.HandlerFunc { func main() { r := gin.New() - r.Use(Logger()) + router.Use(Logger()) - r.GET("/test", func(c *gin.Context) { + router.GET("/test", func(c *gin.Context) { example := c.MustGet("example").(string) // it would print: "12345" @@ -37,7 +36,7 @@ func main() { }) // Listen and serve on 0.0.0.0:8080 - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/zh-tw/docs/examples/custom-validators.md b/src/content/docs/zh-tw/docs/examples/custom-validators.md index c95126f7e8..cab0c1d9e6 100644 --- a/src/content/docs/zh-tw/docs/examples/custom-validators.md +++ b/src/content/docs/zh-tw/docs/examples/custom-validators.md @@ -1,6 +1,5 @@ --- title: "Custom validators" - --- It is also possible to register custom validators. See the [example code](examples/custom-validation/server.go). diff --git a/src/content/docs/zh-tw/docs/examples/define-format-for-the-log-of-routes.md b/src/content/docs/zh-tw/docs/examples/define-format-for-the-log-of-routes.md index 44bd991a9d..3df58b9ea8 100644 --- a/src/content/docs/zh-tw/docs/examples/define-format-for-the-log-of-routes.md +++ b/src/content/docs/zh-tw/docs/examples/define-format-for-the-log-of-routes.md @@ -1,6 +1,5 @@ --- title: "Define format for the log of routes" - --- The default log of routes is: @@ -21,24 +20,24 @@ import ( ) func main() { - r := gin.Default() + router := gin.Default() gin.DebugPrintRouteFunc = func(httpMethod, absolutePath, handlerName string, nuHandlers int) { log.Printf("endpoint %v %v %v %v\n", httpMethod, absolutePath, handlerName, nuHandlers) } - r.POST("/foo", func(c *gin.Context) { + router.POST("/foo", func(c *gin.Context) { c.JSON(http.StatusOK, "foo") }) - r.GET("/bar", func(c *gin.Context) { + router.GET("/bar", func(c *gin.Context) { c.JSON(http.StatusOK, "bar") }) - r.GET("/status", func(c *gin.Context) { + router.GET("/status", func(c *gin.Context) { c.JSON(http.StatusOK, "ok") }) // Listen and Server in http://0.0.0.0:8080 - r.Run() + router.Run() } ``` diff --git a/src/content/docs/zh-tw/docs/examples/goroutines-inside-a-middleware.md b/src/content/docs/zh-tw/docs/examples/goroutines-inside-a-middleware.md index f3a6b10d6e..d06d064a78 100644 --- a/src/content/docs/zh-tw/docs/examples/goroutines-inside-a-middleware.md +++ b/src/content/docs/zh-tw/docs/examples/goroutines-inside-a-middleware.md @@ -1,15 +1,14 @@ --- title: "Goroutines inside a middleware" - --- When starting new Goroutines inside a middleware or handler, you **SHOULD NOT** use the original context inside it, you have to use a read-only copy. ```go func main() { - r := gin.Default() + router := gin.Default() - r.GET("/long_async", func(c *gin.Context) { + router.GET("/long_async", func(c *gin.Context) { // create copy to be used inside the goroutine cCp := c.Copy() go func() { @@ -21,7 +20,7 @@ func main() { }() }) - r.GET("/long_sync", func(c *gin.Context) { + router.GET("/long_sync", func(c *gin.Context) { // simulate a long task with time.Sleep(). 5 seconds time.Sleep(5 * time.Second) @@ -30,6 +29,6 @@ func main() { }) // Listen and serve on 0.0.0.0:8080 - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/zh-tw/docs/examples/graceful-restart-or-stop.md b/src/content/docs/zh-tw/docs/examples/graceful-restart-or-stop.md index 2d4b7f6500..aaec303bc2 100644 --- a/src/content/docs/zh-tw/docs/examples/graceful-restart-or-stop.md +++ b/src/content/docs/zh-tw/docs/examples/graceful-restart-or-stop.md @@ -1,6 +1,5 @@ --- title: "Graceful restart or stop" - --- Do you want to graceful restart or stop your web server? diff --git a/src/content/docs/zh-tw/docs/examples/grouping-routes.md b/src/content/docs/zh-tw/docs/examples/grouping-routes.md index c7f7a72459..416e5597d2 100644 --- a/src/content/docs/zh-tw/docs/examples/grouping-routes.md +++ b/src/content/docs/zh-tw/docs/examples/grouping-routes.md @@ -1,6 +1,5 @@ --- title: "Grouping routes" - --- ```go @@ -8,16 +7,16 @@ func main() { router := gin.Default() // Simple group: v1 - v1 := router.Group("/v1") { + v1 := router.Group("/v1") v1.POST("/login", loginEndpoint) v1.POST("/submit", submitEndpoint) v1.POST("/read", readEndpoint) } // Simple group: v2 - v2 := router.Group("/v2") { + v2 := router.Group("/v2") v2.POST("/login", loginEndpoint) v2.POST("/submit", submitEndpoint) v2.POST("/read", readEndpoint) diff --git a/src/content/docs/zh-tw/docs/examples/html-rendering.md b/src/content/docs/zh-tw/docs/examples/html-rendering.md index a73658af30..08b18960a8 100644 --- a/src/content/docs/zh-tw/docs/examples/html-rendering.md +++ b/src/content/docs/zh-tw/docs/examples/html-rendering.md @@ -1,6 +1,5 @@ --- title: "HTML rendering" - --- Using LoadHTMLGlob() or LoadHTMLFiles() @@ -93,9 +92,9 @@ func main() { You may use custom delims ```go - r := gin.Default() - r.Delims("{[{", "}]}") - r.LoadHTMLGlob("/path/to/templates") + router := gin.Default() + router.Delims("{[{", "}]}") + router.LoadHTMLGlob("/path/to/templates") ``` #### Custom Template Funcs diff --git a/src/content/docs/zh-tw/docs/examples/http-method.md b/src/content/docs/zh-tw/docs/examples/http-method.md index f55d155ee5..11bab2040a 100644 --- a/src/content/docs/zh-tw/docs/examples/http-method.md +++ b/src/content/docs/zh-tw/docs/examples/http-method.md @@ -1,6 +1,5 @@ --- title: "Using HTTP method" - --- ```go diff --git a/src/content/docs/zh-tw/docs/examples/http2-server-push.md b/src/content/docs/zh-tw/docs/examples/http2-server-push.md index 192d22a457..f7c81b55bb 100644 --- a/src/content/docs/zh-tw/docs/examples/http2-server-push.md +++ b/src/content/docs/zh-tw/docs/examples/http2-server-push.md @@ -1,6 +1,5 @@ --- title: "HTTP2 server push" - --- http.Pusher is supported only **go1.8+**. See the [golang blog](https://blog.golang.org/h2push) for detail information. @@ -28,11 +27,11 @@ var html = template.Must(template.New("https").Parse(` `)) func main() { - r := gin.Default() - r.Static("/assets", "./assets") - r.SetHTMLTemplate(html) + router := gin.Default() + router.Static("/assets", "./assets") + router.SetHTMLTemplate(html) - r.GET("/", func(c *gin.Context) { + router.GET("/", func(c *gin.Context) { if pusher := c.Writer.Pusher(); pusher != nil { // use pusher.Push() to do server push if err := pusher.Push("/assets/app.js", nil); err != nil { @@ -45,7 +44,7 @@ func main() { }) // Listen and Server in https://127.0.0.1:8080 - r.RunTLS(":8080", "./testdata/server.pem", "./testdata/server.key") + router.RunTLS(":8080", "./testdata/server.pem", "./testdata/server.key") } ``` diff --git a/src/content/docs/zh-tw/docs/examples/index.md b/src/content/docs/zh-tw/docs/examples/index.md index 02ff947949..cfaddb45d8 100644 --- a/src/content/docs/zh-tw/docs/examples/index.md +++ b/src/content/docs/zh-tw/docs/examples/index.md @@ -1,6 +1,5 @@ --- title: "範例" - sidebar: order: 6 --- diff --git a/src/content/docs/zh-tw/docs/examples/jsonp.md b/src/content/docs/zh-tw/docs/examples/jsonp.md index bc4439a44f..b59608103b 100644 --- a/src/content/docs/zh-tw/docs/examples/jsonp.md +++ b/src/content/docs/zh-tw/docs/examples/jsonp.md @@ -1,15 +1,14 @@ --- title: "JSONP" - --- Using JSONP to request data from a server in a different domain. Add callback to response body if the query parameter callback exists. ```go func main() { - r := gin.Default() + router := gin.Default() - r.GET("/JSONP?callback=x", func(c *gin.Context) { + router.GET("/JSONP?callback=x", func(c *gin.Context) { data := map[string]interface{}{ "foo": "bar", } @@ -20,6 +19,6 @@ func main() { }) // Listen and serve on 0.0.0.0:8080 - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/zh-tw/docs/examples/map-as-querystring-or-postform.md b/src/content/docs/zh-tw/docs/examples/map-as-querystring-or-postform.md index 5ed88b0b5c..f56774ae3f 100644 --- a/src/content/docs/zh-tw/docs/examples/map-as-querystring-or-postform.md +++ b/src/content/docs/zh-tw/docs/examples/map-as-querystring-or-postform.md @@ -1,6 +1,5 @@ --- title: "Map as querystring or postform parameters" - --- ```sh diff --git a/src/content/docs/zh-tw/docs/examples/multipart-urlencoded-binding.md b/src/content/docs/zh-tw/docs/examples/multipart-urlencoded-binding.md index 73fee286a1..e2e8073f1c 100644 --- a/src/content/docs/zh-tw/docs/examples/multipart-urlencoded-binding.md +++ b/src/content/docs/zh-tw/docs/examples/multipart-urlencoded-binding.md @@ -1,6 +1,5 @@ --- title: "Multipart/Urlencoded binding" - --- ```go diff --git a/src/content/docs/zh-tw/docs/examples/multipart-urlencoded-form.md b/src/content/docs/zh-tw/docs/examples/multipart-urlencoded-form.md index 04eab23737..21502a7b30 100644 --- a/src/content/docs/zh-tw/docs/examples/multipart-urlencoded-form.md +++ b/src/content/docs/zh-tw/docs/examples/multipart-urlencoded-form.md @@ -1,6 +1,5 @@ --- title: "Multipart/Urlencoded form" - --- ```go diff --git a/src/content/docs/zh-tw/docs/examples/multiple-template.md b/src/content/docs/zh-tw/docs/examples/multiple-template.md index 28b58c213b..9584899ac5 100644 --- a/src/content/docs/zh-tw/docs/examples/multiple-template.md +++ b/src/content/docs/zh-tw/docs/examples/multiple-template.md @@ -1,6 +1,5 @@ --- title: "Multitemplate" - --- Gin allow by default use only one html.Template. Check [a multitemplate render](https://github.com/gin-contrib/multitemplate) for using features like go 1.6 `block template`. diff --git a/src/content/docs/zh-tw/docs/examples/only-bind-query-string.md b/src/content/docs/zh-tw/docs/examples/only-bind-query-string.md index bdd6c174e7..18fd177106 100644 --- a/src/content/docs/zh-tw/docs/examples/only-bind-query-string.md +++ b/src/content/docs/zh-tw/docs/examples/only-bind-query-string.md @@ -1,6 +1,5 @@ --- title: "Only bind query string" - --- `ShouldBindQuery` function only binds the query params and not the post data. See the [detail information](https://github.com/gin-gonic/gin/issues/742#issuecomment-315953017). diff --git a/src/content/docs/zh-tw/docs/examples/param-in-path.md b/src/content/docs/zh-tw/docs/examples/param-in-path.md index b0a4a3b680..8ca7067ab7 100644 --- a/src/content/docs/zh-tw/docs/examples/param-in-path.md +++ b/src/content/docs/zh-tw/docs/examples/param-in-path.md @@ -1,6 +1,5 @@ --- title: "Parameters in path" - --- ```go diff --git a/src/content/docs/zh-tw/docs/examples/pure-json.md b/src/content/docs/zh-tw/docs/examples/pure-json.md index 5fbf8bfc1f..c5ac565e6a 100644 --- a/src/content/docs/zh-tw/docs/examples/pure-json.md +++ b/src/content/docs/zh-tw/docs/examples/pure-json.md @@ -1,6 +1,5 @@ --- title: "PureJSON" - --- Normally, JSON replaces special HTML characters with their unicode entities, e.g. `<` becomes `\u003c`. If you want to encode such characters literally, you can use PureJSON instead. @@ -8,23 +7,23 @@ This feature is unavailable in Go 1.6 and lower. ```go func main() { - r := gin.Default() + router := gin.Default() // Serves unicode entities - r.GET("/json", func(c *gin.Context) { + router.GET("/json", func(c *gin.Context) { c.JSON(200, gin.H{ "html": "Hello, world!", }) }) // Serves literal characters - r.GET("/purejson", func(c *gin.Context) { + router.GET("/purejson", func(c *gin.Context) { c.PureJSON(200, gin.H{ "html": "Hello, world!", }) }) // listen and serve on 0.0.0.0:8080 - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/zh-tw/docs/examples/query-and-post-form.md b/src/content/docs/zh-tw/docs/examples/query-and-post-form.md index 5c8e6d21e7..f02af5daa9 100644 --- a/src/content/docs/zh-tw/docs/examples/query-and-post-form.md +++ b/src/content/docs/zh-tw/docs/examples/query-and-post-form.md @@ -1,6 +1,5 @@ --- title: "Query and post form" - --- ```sh diff --git a/src/content/docs/zh-tw/docs/examples/querystring-param.md b/src/content/docs/zh-tw/docs/examples/querystring-param.md index cba891746e..afef1b61e8 100644 --- a/src/content/docs/zh-tw/docs/examples/querystring-param.md +++ b/src/content/docs/zh-tw/docs/examples/querystring-param.md @@ -1,6 +1,5 @@ --- title: "Query string parameters" - --- ```go diff --git a/src/content/docs/zh-tw/docs/examples/redirects.md b/src/content/docs/zh-tw/docs/examples/redirects.md index e62a9952ea..a682207aed 100644 --- a/src/content/docs/zh-tw/docs/examples/redirects.md +++ b/src/content/docs/zh-tw/docs/examples/redirects.md @@ -1,12 +1,11 @@ --- title: "Redirects" - --- Issuing a HTTP redirect is easy. Both internal and external locations are supported. ```go -r.GET("/test", func(c *gin.Context) { +router.GET("/test", func(c *gin.Context) { c.Redirect(http.StatusMovedPermanently, "http://www.google.com/") }) ``` @@ -14,7 +13,7 @@ r.GET("/test", func(c *gin.Context) { Issuing a HTTP redirect from POST. Refer to issue: [#444](https://github.com/gin-gonic/gin/issues/444) ```go -r.POST("/test", func(c *gin.Context) { +router.POST("/test", func(c *gin.Context) { c.Redirect(http.StatusFound, "/foo") }) ``` @@ -22,11 +21,11 @@ r.POST("/test", func(c *gin.Context) { Issuing a Router redirect, use `HandleContext` like below. ``` go -r.GET("/test", func(c *gin.Context) { +router.GET("/test", func(c *gin.Context) { c.Request.URL.Path = "/test2" - r.HandleContext(c) + router.HandleContext(c) }) -r.GET("/test2", func(c *gin.Context) { +router.GET("/test2", func(c *gin.Context) { c.JSON(200, gin.H{"hello": "world"}) }) ``` diff --git a/src/content/docs/zh-tw/docs/examples/rendering.md b/src/content/docs/zh-tw/docs/examples/rendering.md index c9c705c656..c8ec88e99d 100644 --- a/src/content/docs/zh-tw/docs/examples/rendering.md +++ b/src/content/docs/zh-tw/docs/examples/rendering.md @@ -1,18 +1,17 @@ --- title: "XML/JSON/YAML/ProtoBuf rendering" - --- ```go func main() { - r := gin.Default() + router := gin.Default() // gin.H is a shortcut for map[string]interface{} - r.GET("/someJSON", func(c *gin.Context) { + router.GET("/someJSON", func(c *gin.Context) { c.JSON(http.StatusOK, gin.H{"message": "hey", "status": http.StatusOK}) }) - r.GET("/moreJSON", func(c *gin.Context) { + router.GET("/moreJSON", func(c *gin.Context) { // You also can use a struct var msg struct { Name string `json:"user"` @@ -27,15 +26,15 @@ func main() { c.JSON(http.StatusOK, msg) }) - r.GET("/someXML", func(c *gin.Context) { + router.GET("/someXML", func(c *gin.Context) { c.XML(http.StatusOK, gin.H{"message": "hey", "status": http.StatusOK}) }) - r.GET("/someYAML", func(c *gin.Context) { + router.GET("/someYAML", func(c *gin.Context) { c.YAML(http.StatusOK, gin.H{"message": "hey", "status": http.StatusOK}) }) - r.GET("/someProtoBuf", func(c *gin.Context) { + router.GET("/someProtoBuf", func(c *gin.Context) { reps := []int64{int64(1), int64(2)} label := "test" // The specific definition of protobuf is written in the testdata/protoexample file. @@ -49,6 +48,6 @@ func main() { }) // Listen and serve on 0.0.0.0:8080 - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/zh-tw/docs/examples/run-multiple-service.md b/src/content/docs/zh-tw/docs/examples/run-multiple-service.md index dd7e30efd1..9c3fa11984 100644 --- a/src/content/docs/zh-tw/docs/examples/run-multiple-service.md +++ b/src/content/docs/zh-tw/docs/examples/run-multiple-service.md @@ -1,6 +1,5 @@ --- title: "Run multiple service" - --- See the [question](https://github.com/gin-gonic/gin/issues/346) and try the following example: diff --git a/src/content/docs/zh-tw/docs/examples/secure-json.md b/src/content/docs/zh-tw/docs/examples/secure-json.md index 82e63a4c44..4a2653eeed 100644 --- a/src/content/docs/zh-tw/docs/examples/secure-json.md +++ b/src/content/docs/zh-tw/docs/examples/secure-json.md @@ -1,18 +1,17 @@ --- title: "SecureJSON" - --- Using SecureJSON to prevent json hijacking. Default prepends `"while(1),"` to response body if the given struct is array values. ```go func main() { - r := gin.Default() + router := gin.Default() // You can also use your own secure json prefix - // r.SecureJsonPrefix(")]}',\n") + // router.SecureJsonPrefix(")]}',\n") - r.GET("/someJSON", func(c *gin.Context) { + router.GET("/someJSON", func(c *gin.Context) { names := []string{"lena", "austin", "foo"} // Will output : while(1);["lena","austin","foo"] @@ -20,6 +19,6 @@ func main() { }) // Listen and serve on 0.0.0.0:8080 - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/zh-tw/docs/examples/security-headers.md b/src/content/docs/zh-tw/docs/examples/security-headers.md index 7d5bebf398..df7a649097 100644 --- a/src/content/docs/zh-tw/docs/examples/security-headers.md +++ b/src/content/docs/zh-tw/docs/examples/security-headers.md @@ -1,6 +1,5 @@ --- title: "安全页眉" - --- 使用安全标头保护网络应用程序免受常见安全漏洞的攻击非常重要。本示例将向您展示如何在 Gin 应用程序中添加安全标头,以及如何避免与主机标头注入相关的攻击(SSRF、开放重定向)。 diff --git a/src/content/docs/zh-tw/docs/examples/serving-data-from-reader.md b/src/content/docs/zh-tw/docs/examples/serving-data-from-reader.md index 614db12ce2..1b871d5251 100644 --- a/src/content/docs/zh-tw/docs/examples/serving-data-from-reader.md +++ b/src/content/docs/zh-tw/docs/examples/serving-data-from-reader.md @@ -1,6 +1,5 @@ --- title: "Serving data from reader" - --- ```go diff --git a/src/content/docs/zh-tw/docs/examples/serving-static-files.md b/src/content/docs/zh-tw/docs/examples/serving-static-files.md index bda67da070..3f96749752 100644 --- a/src/content/docs/zh-tw/docs/examples/serving-static-files.md +++ b/src/content/docs/zh-tw/docs/examples/serving-static-files.md @@ -1,6 +1,5 @@ --- title: "Serving static files" - --- ```go diff --git a/src/content/docs/zh-tw/docs/examples/support-lets-encrypt.md b/src/content/docs/zh-tw/docs/examples/support-lets-encrypt.md index 841c1a7f99..50e6b21c3d 100644 --- a/src/content/docs/zh-tw/docs/examples/support-lets-encrypt.md +++ b/src/content/docs/zh-tw/docs/examples/support-lets-encrypt.md @@ -1,6 +1,5 @@ --- title: "Support Let's Encrypt" - --- example for 1-line LetsEncrypt HTTPS servers. @@ -16,10 +15,10 @@ import ( ) func main() { - r := gin.Default() + router := gin.Default() // Ping handler - r.GET("/ping", func(c *gin.Context) { + router.GET("/ping", func(c *gin.Context) { c.String(200, "pong") }) @@ -41,10 +40,10 @@ import ( ) func main() { - r := gin.Default() + router := gin.Default() // Ping handler - r.GET("/ping", func(c *gin.Context) { + router.GET("/ping", func(c *gin.Context) { c.String(200, "pong") }) diff --git a/src/content/docs/zh-tw/docs/examples/upload-file/index.md b/src/content/docs/zh-tw/docs/examples/upload-file/index.md index d0ff99e858..8399cc637b 100644 --- a/src/content/docs/zh-tw/docs/examples/upload-file/index.md +++ b/src/content/docs/zh-tw/docs/examples/upload-file/index.md @@ -1,6 +1,5 @@ --- title: "Upload files" - --- The section lists upload file api usage. diff --git a/src/content/docs/zh-tw/docs/examples/upload-file/multiple-file.md b/src/content/docs/zh-tw/docs/examples/upload-file/multiple-file.md index 45760fa2d5..d14567651f 100644 --- a/src/content/docs/zh-tw/docs/examples/upload-file/multiple-file.md +++ b/src/content/docs/zh-tw/docs/examples/upload-file/multiple-file.md @@ -1,6 +1,5 @@ --- title: "Multiple files" - --- See the detail [example code](examples/upload-file/multiple). @@ -19,7 +18,7 @@ func main() { log.Println(file.Filename) // Upload the file to specific dst. - c.SaveUploadedFile(file, dst) + c.SaveUploadedFile(file, "./files/" + file.Filename) } c.String(http.StatusOK, fmt.Sprintf("%d files uploaded!", len(files))) }) diff --git a/src/content/docs/zh-tw/docs/examples/upload-file/single-file.md b/src/content/docs/zh-tw/docs/examples/upload-file/single-file.md index cd7bd8fa8a..53e16b7425 100644 --- a/src/content/docs/zh-tw/docs/examples/upload-file/single-file.md +++ b/src/content/docs/zh-tw/docs/examples/upload-file/single-file.md @@ -1,6 +1,5 @@ --- title: "Single file" - --- References issue [#774](https://github.com/gin-gonic/gin/issues/774) and detail [example code](examples/upload-file/single). @@ -16,7 +15,7 @@ func main() { log.Println(file.Filename) // Upload the file to specific dst. - c.SaveUploadedFile(file, dst) + c.SaveUploadedFile(file, "./files/" + file.Filename) c.String(http.StatusOK, fmt.Sprintf("'%s' uploaded!", file.Filename)) }) diff --git a/src/content/docs/zh-tw/docs/examples/using-basicauth-middleware.md b/src/content/docs/zh-tw/docs/examples/using-basicauth-middleware.md index cc68db4a0d..a1f1a03ebc 100644 --- a/src/content/docs/zh-tw/docs/examples/using-basicauth-middleware.md +++ b/src/content/docs/zh-tw/docs/examples/using-basicauth-middleware.md @@ -1,6 +1,5 @@ --- title: "Using BasicAuth middleware" - --- ```go @@ -12,11 +11,11 @@ var secrets = gin.H{ } func main() { - r := gin.Default() + router := gin.Default() // Group using gin.BasicAuth() middleware // gin.Accounts is a shortcut for map[string]string - authorized := r.Group("/admin", gin.BasicAuth(gin.Accounts{ + authorized := router.Group("/admin", gin.BasicAuth(gin.Accounts{ "foo": "bar", "austin": "1234", "lena": "hello2", @@ -36,6 +35,6 @@ func main() { }) // Listen and serve on 0.0.0.0:8080 - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/zh-tw/docs/examples/using-middleware.md b/src/content/docs/zh-tw/docs/examples/using-middleware.md index 5fc4154dbf..7c44cd3eba 100644 --- a/src/content/docs/zh-tw/docs/examples/using-middleware.md +++ b/src/content/docs/zh-tw/docs/examples/using-middleware.md @@ -1,6 +1,5 @@ --- title: "Using middleware" - --- ```go @@ -11,18 +10,18 @@ func main() { // Global middleware // Logger middleware will write the logs to gin.DefaultWriter even if you set with GIN_MODE=release. // By default gin.DefaultWriter = os.Stdout - r.Use(gin.Logger()) + router.Use(gin.Logger()) // Recovery middleware recovers from any panics and writes a 500 if there was one. - r.Use(gin.Recovery()) + router.Use(gin.Recovery()) // Per route middleware, you can add as many as you desire. - r.GET("/benchmark", MyBenchLogger(), benchEndpoint) + router.GET("/benchmark", MyBenchLogger(), benchEndpoint) // Authorization group - // authorized := r.Group("/", AuthRequired()) + // authorized := router.Group("/", AuthRequired()) // exactly the same as: - authorized := r.Group("/") + authorized := router.Group("/") // per group middleware! in this case we use the custom created // AuthRequired() middleware just in the "authorized" group. authorized.Use(AuthRequired()) @@ -37,7 +36,7 @@ func main() { } // Listen and serve on 0.0.0.0:8080 - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/zh-tw/docs/examples/without-middleware.md b/src/content/docs/zh-tw/docs/examples/without-middleware.md index 6ef54bda06..5ae5558125 100644 --- a/src/content/docs/zh-tw/docs/examples/without-middleware.md +++ b/src/content/docs/zh-tw/docs/examples/without-middleware.md @@ -1,6 +1,5 @@ --- title: "Without middleware by default" - --- Use diff --git a/src/content/docs/zh-tw/docs/examples/write-log.md b/src/content/docs/zh-tw/docs/examples/write-log.md index 759423de4b..a26be48277 100644 --- a/src/content/docs/zh-tw/docs/examples/write-log.md +++ b/src/content/docs/zh-tw/docs/examples/write-log.md @@ -1,6 +1,5 @@ --- title: "How to write log file" - --- ```go diff --git a/src/content/docs/zh-tw/docs/faq/index.md b/src/content/docs/zh-tw/docs/faq/index.md index ad348f11fe..02a2c66253 100644 --- a/src/content/docs/zh-tw/docs/faq/index.md +++ b/src/content/docs/zh-tw/docs/faq/index.md @@ -1,6 +1,5 @@ --- title: "FAQ" - sidebar: order: 9 --- diff --git a/src/content/docs/zh-tw/docs/features/index.md b/src/content/docs/zh-tw/docs/features/index.md index c471f7f443..111a28d90d 100644 --- a/src/content/docs/zh-tw/docs/features/index.md +++ b/src/content/docs/zh-tw/docs/features/index.md @@ -1,6 +1,5 @@ --- title: "特色" - sidebar: order: 4 --- diff --git a/src/content/docs/zh-tw/docs/index.md b/src/content/docs/zh-tw/docs/index.md index 4fd882caf4..63ab746fa5 100644 --- a/src/content/docs/zh-tw/docs/index.md +++ b/src/content/docs/zh-tw/docs/index.md @@ -1,8 +1,7 @@ --- title: "文件" -linkTitle: "文件" sidebar: - order: 1 + order: 20 --- ## Gin 是什麼? diff --git a/src/content/docs/zh-tw/docs/introduction/index.md b/src/content/docs/zh-tw/docs/introduction/index.md index 2ff71a640a..252c5d899e 100644 --- a/src/content/docs/zh-tw/docs/introduction/index.md +++ b/src/content/docs/zh-tw/docs/introduction/index.md @@ -1,6 +1,5 @@ --- title: "介紹" - sidebar: order: 1 --- diff --git a/src/content/docs/zh-tw/docs/jsoniter/index.md b/src/content/docs/zh-tw/docs/jsoniter/index.md index abc91fd955..8079ad945b 100644 --- a/src/content/docs/zh-tw/docs/jsoniter/index.md +++ b/src/content/docs/zh-tw/docs/jsoniter/index.md @@ -1,14 +1,13 @@ --- title: "Jsoniter" - sidebar: order: 5 --- -#### Build with [jsoniter](https://github.com/json-iterator/go) +## Build with [jsoniter](https://github.com/json-iterator/go) -Gin uses `encoding/json` as default json package but you can change to [jsoniter](https://github.com/json-iterator/go) by build from other tags. +Gin 使用 `encoding/json` 作為預設的 JSON 套件,但您可以通過使用其他標籤進行構建以切換到 [jsoniter](https://github.com/json-iterator/go)。 ```sh $ go build -tags=jsoniter . -``` +``` diff --git a/src/content/docs/zh-tw/docs/quickstart/index.md b/src/content/docs/zh-tw/docs/quickstart/index.md index 166cfc4feb..7d62926d1d 100644 --- a/src/content/docs/zh-tw/docs/quickstart/index.md +++ b/src/content/docs/zh-tw/docs/quickstart/index.md @@ -1,13 +1,10 @@ --- title: "快速入門" - sidebar: order: 2 --- -- [需求](#需求) -- [安裝](#安裝) -- [開始使用](#開始使用) +在這個快速入門中,我們將從程式碼片段中獲得洞察並學習如何: ## 需求 @@ -30,39 +27,24 @@ import "github.com/gin-gonic/gin" ``` 3. (可選的)如果你想要使用像是 `http.StatusOK` 的常數,你會需要匯入 `net/http` 套件 - + ```go import "net/http" ``` -### 使用 vendor 工具像是 [Govendor](https://github.com/kardianos/govendor) - -1. `go get` govendor - -```sh -$ go get github.com/kardianos/govendor -``` - -2. 新增你的專案資料夾並 `cd` 進入 +1. 新增你的專案資料夾並 `cd` 進入 ```sh $ mkdir -p $GOPATH/src/github.com/myusername/project && cd "$_" ``` -3. Vendor init 專案並加入 gin - -```sh -$ govendor init -$ govendor fetch github.com/gin-gonic/gin@v1.3 -``` - -4. 複製範本到你的專案 +2. 複製範本到你的專案 ```sh $ curl https://raw.githubusercontent.com/gin-gonic/examples/master/basic/main.go > main.go ``` -5. 執行你的專案 +3. 執行你的專案 ```sh $ go run main.go @@ -87,13 +69,13 @@ package main import "github.com/gin-gonic/gin" func main() { - r := gin.Default() - r.GET("/ping", func(c *gin.Context) { + router := gin.Default() + router.GET("/ping", func(c *gin.Context) { c.JSON(200, gin.H{ "message": "pong", }) }) - r.Run() // listen and serve on 0.0.0.0:8080 + router.Run() // listen and serve on 0.0.0.0:8080 } ``` diff --git a/src/content/docs/zh-tw/docs/testing/index.md b/src/content/docs/zh-tw/docs/testing/index.md index eab2f8d7e7..74a8869565 100644 --- a/src/content/docs/zh-tw/docs/testing/index.md +++ b/src/content/docs/zh-tw/docs/testing/index.md @@ -1,11 +1,10 @@ --- title: "測試" - sidebar: order: 7 --- -##### 如何為 Gin 寫測試案例? +## 如何為 Gin 寫測試案例? 傾向使用 `net/http/httptest` 套件來做 HTTP 測試。 @@ -20,15 +19,15 @@ type User struct { } func setupRouter() *gin.Engine { - r := gin.Default() - r.GET("/ping", func(c *gin.Context) { + router := gin.Default() + router.GET("/ping", func(c *gin.Context) { c.String(200, "pong") }) return r } func postUser(r *gin.Engine) *gin.Engine { - r.POST("/user/add", func(c *gin.Context) { + router.POST("/user/add", func(c *gin.Context) { var user User c.BindJSON(&user) c.JSON(200, user) @@ -39,7 +38,7 @@ func postUser(r *gin.Engine) *gin.Engine { func main() { r := setupRouter() r = postUser(r) - r.Run(":8080") + router.Run(":8080") } ``` diff --git a/src/content/docs/zh-tw/docs/users/index.md b/src/content/docs/zh-tw/docs/users/index.md index 18c9123be2..9bef0630e6 100644 --- a/src/content/docs/zh-tw/docs/users/index.md +++ b/src/content/docs/zh-tw/docs/users/index.md @@ -1,6 +1,5 @@ --- title: "使用者" - sidebar: order: 8 --- diff --git a/src/env.d.ts b/src/env.d.ts deleted file mode 100644 index acef35f175..0000000000 --- a/src/env.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -/// -/// diff --git a/tsconfig.json b/tsconfig.json index 77da9dd009..8bf91d3bb9 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,3 +1,5 @@ { - "extends": "astro/tsconfigs/strict" -} \ No newline at end of file + "extends": "astro/tsconfigs/strict", + "include": [".astro/types.d.ts", "**/*"], + "exclude": ["dist"] +}