diff --git a/.github/workflows/sourcey-docs.yml b/.github/workflows/sourcey-docs.yml new file mode 100644 index 00000000..31d1ad2f --- /dev/null +++ b/.github/workflows/sourcey-docs.yml @@ -0,0 +1,78 @@ +name: Sourcey docs + +on: + pull_request: + paths: + - ".github/workflows/sourcey-docs.yml" + - "docs-sourcey/**" + push: + branches: + - main + paths: + - ".github/workflows/sourcey-docs.yml" + - "docs-sourcey/**" + workflow_dispatch: + +permissions: + contents: read + pages: write + id-token: write + +concurrency: + group: sourcey-pages + cancel-in-progress: false + +jobs: + build: + runs-on: ubuntu-24.04 + steps: + - uses: actions/checkout@v7.0.0 + + - name: Setup Node.js + uses: actions/setup-node@v7.0.0 + with: + node-version: "24" + cache: npm + cache-dependency-path: docs-sourcey/package-lock.json + + - name: Install dependencies + working-directory: docs-sourcey + run: npm ci + + - name: Build Sourcey site + working-directory: docs-sourcey + run: npm run build + + - name: Validate generated documentation + working-directory: docs-sourcey + run: npm run validate + + - name: Check generated internal links + working-directory: docs-sourcey + run: npm run linkcheck + + - name: Verify governed receipt + working-directory: docs-sourcey + run: npm run verify-receipt + + - name: Configure GitHub Pages + if: github.event_name != 'pull_request' + uses: actions/configure-pages@v6.0.0 + + - name: Upload GitHub Pages artifact + if: github.event_name != 'pull_request' + uses: actions/upload-pages-artifact@v5.0.0 + with: + path: docs-sourcey/dist + + deploy: + if: github.event_name != 'pull_request' + needs: build + runs-on: ubuntu-24.04 + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + steps: + - name: Deploy GitHub Pages + id: deployment + uses: actions/deploy-pages@v5.0.0 diff --git a/docs-sourcey/.gitignore b/docs-sourcey/.gitignore new file mode 100644 index 00000000..da8b58b8 --- /dev/null +++ b/docs-sourcey/.gitignore @@ -0,0 +1,5 @@ +node_modules/ +dist/ +validation-receipts/ +validation-run.json +/sha256-*.json diff --git a/docs-sourcey/README.md b/docs-sourcey/README.md new file mode 100644 index 00000000..4846966a --- /dev/null +++ b/docs-sourcey/README.md @@ -0,0 +1,29 @@ +# Sourcey documentation + +This directory builds a Sourcey documentation site for ftpserverlib. It combines +five maintained guides with a generated Go API reference sourced from a committed +`godoc.json` snapshot. + +The snapshot is pinned to commit +`b4c3694ee73399d8a55293d568e5100c25e4d2d4`, so documentation builds do not need +the Go toolchain and every generated source link resolves to the exact code that +was documented. + +## Build and validate + +```sh +npm ci +npm run build +npm run validate +npm run verify-receipt +``` + +`npm run verify-receipt` verifies the committed RunX receipt with its public +Ed25519 key. The private signing seed is not stored in this repository. + +## Deployment + +The `Sourcey docs` workflow builds pull requests and deploys the generated `dist` +directory to this repository's GitHub Pages site after a merge to `main`. +Repository owners need to select **GitHub Actions** as the Pages source once if it +is not already enabled. diff --git a/docs-sourcey/REPORT.md b/docs-sourcey/REPORT.md new file mode 100644 index 00000000..2e1a3224 --- /dev/null +++ b/docs-sourcey/REPORT.md @@ -0,0 +1,29 @@ +# Sourcey Go documentation report + +This contribution adds a reproducible Sourcey documentation site for +`fclairamb/ftpserverlib`, a maintained MIT-licensed Go library. + +The generated reference is pinned to commit +`b4c3694ee73399d8a55293d568e5100c25e4d2d4`. The committed GoDoc snapshot +contains 92 public API concepts, and the generated API page contains 65 links +back to exact lines at that commit. Five authored guides cover setup, the driver +contract, server settings, and extension points. The build also emits `llms.txt` +and `llms-full.txt` for machine-readable discovery. + +Validation is intentionally independent of a local Go installation: + +```sh +npm ci +npm run build +npm run validate +npm run verify-receipt +``` + +The governed RunX receipt uses `runx-cli 0.7.0` and a production Ed25519 +signature. Its public verification key is committed in the verifier; the private +signing seed is not published. + +The workflow validates every relevant pull request. After merge, it deploys the +same generated output to the repository-owned GitHub Pages site. If Pages has not +been enabled for this repository before, an owner needs to select **GitHub +Actions** as the Pages source once. diff --git a/docs-sourcey/driver-contract.md b/docs-sourcey/driver-contract.md new file mode 100644 index 00000000..02fdf6b7 --- /dev/null +++ b/docs-sourcey/driver-contract.md @@ -0,0 +1,19 @@ +# Driver contract + +`MainDriver` is the integration boundary between the FTP engine and your +application. Implement it to: + +- return a `Settings` value from `GetSettings`; +- produce the welcome message in `ClientConnected`; +- release per-client state in `ClientDisconnected`; +- authenticate credentials and return a `ClientDriver` from `AuthUser`; +- return the current `tls.Config` from `GetTLSConfig` when TLS is enabled. + +`ClientDriver` embeds `afero.Fs`. This keeps ordinary filesystem operations in +a familiar interface and lets a server choose memory, disk, object-backed, or +application-specific storage. + +Callbacks receive a `ClientContext`. It exposes the connection ID, addresses, +current path, TLS state, debug flag, last command, last data-channel mode, and +a method to close the connection. Treat it as connection-scoped state; do not +store it globally. diff --git a/docs-sourcey/extensions.md b/docs-sourcey/extensions.md new file mode 100644 index 00000000..c89cc7df --- /dev/null +++ b/docs-sourcey/extensions.md @@ -0,0 +1,19 @@ +# Optional extensions + +Implement extension interfaces only for behavior your storage layer supports. +The core library detects these interfaces at runtime. + +- `ClientDriverExtensionAllocate` reserves upload space for `ALLO`. +- `ClientDriverExtensionAvailableSpace` reports space for `AVBL`. +- `ClientDriverExtensionSymlink` adds symbolic-link support. +- `ClientDriverExtensionHasher` computes digests when `EnableHASH` is set. +- `FileTransferError` receives detected abort, disconnect, and copy failures + before the underlying file is closed. + +FTP uploads do not carry a universal length header, so a server cannot detect +every truncated upload. The transfer-error hook reports failures the protocol +engine can observe; applications that need end-to-end completeness should add +their own size, digest, or transaction checks. + +See the generated API reference for the remaining extension interfaces and +their exact method signatures. diff --git a/docs-sourcey/godoc.json b/docs-sourcey/godoc.json new file mode 100644 index 00000000..7b61c7a7 --- /dev/null +++ b/docs-sourcey/godoc.json @@ -0,0 +1,1621 @@ +{ + "schema_version": 1, + "source": "sourcey-godoc", + "module_path": "github.com/fclairamb/ftpserverlib", + "generated_at": "2026-07-13T07:35:52Z", + "packages": [ + { + "importPath": "github.com/fclairamb/ftpserverlib", + "name": "ftpserver", + "synopsis": "Package ftpserver provides all the tools to build your own FTP server: The core library and the driver.", + "doc": "Package ftpserver provides all the tools to build your own FTP server: The core library and the driver.", + "dir": ".", + "files": [ + "asciiconverter.go", + "client_handler.go", + "consts.go", + "control_windows.go", + "driver.go", + "errors.go", + "handle_auth.go", + "handle_dirs.go", + "handle_files.go", + "handle_misc.go", + "passive_multiplexer.go", + "server.go", + "transfer_active.go", + "transfer_pasv.go" + ], + "consts": [ + { + "name": "StatusFileStatusOK", + "doc": "Status codes as documented by:\nhttps://tools.ietf.org/html/rfc959\nhttps://tools.ietf.org/html/rfc2428\nhttps://tools.ietf.org/html/rfc2228", + "declaration": "const (\n\t// 100 Series - The requested action is being initiated, expect another reply before\n\t// proceeding with a new command.\n\tStatusFileStatusOK = 150 // RFC 959, 4.2.1\n\n\t// 200 Series - The requested action has been successfully completed.\n\tStatusOK = 200 // RFC 959, 4.2.1\n\tStatusNotImplemented = 202 // RFC 959, 4.2.1\n\tStatusSystemStatus = 211 // RFC 959, 4.2.1\n\tStatusDirectoryStatus = 212 // RFC 959, 4.2.1\n\tStatusFileStatus = 213 // RFC 959, 4.2.1\n\tStatusHelpMessage = 214 // RFC 959, 4.2.1\n\tStatusSystemType = 215 // RFC 959, 4.2.1\n\tStatusServiceReady = 220 // RFC 959, 4.2.1\n\tStatusClosingControlConn = 221 // RFC 959, 4.2.1\n\tStatusClosingDataConn = 226 // RFC 959, 4.2.1\n\tStatusEnteringPASV = 227 // RFC 959, 4.2.1\n\tStatusEnteringEPSV = 229 // RFC 2428, 3\n\tStatusUserLoggedIn = 230 // RFC 959, 4.2.1\n\tStatusAuthAccepted = 234 // RFC 2228, 3\n\tStatusFileOK = 250 // RFC 959, 4.2.1\n\tStatusPathCreated = 257 // RFC 959, 4.2.1\n\n\t// 300 Series - The command has been accepted, but the requested action is on hold,\n\t// pending receipt of further information.\n\tStatusUserOK = 331 // RFC 959, 4.2.1\n\tStatusFileActionPending = 350 // RFC 959, 4.2.1\n\n\t// 400 Series - The command was not accepted and the requested action did not take place,\n\t// but the error condition is temporary and the action may be requested again.\n\tStatusServiceNotAvailable = 421 // RFC 959, 4.2.1\n\tStatusCannotOpenDataConnection = 425 // RFC 959, 4.2.1\n\tStatusTransferAborted = 426 // RFC 959, 4.2.1\n\tStatusFileActionNotTaken = 450 // RFC 959, 4.2.1\n\n\t// 500 Series - Syntax error, command unrecognized and the requested action did not take\n\t// place. This may include errors such as command line too long.\n\tStatusSyntaxErrorNotRecognised = 500 // RFC 959, 4.2.1\n\tStatusSyntaxErrorParameters = 501 // RFC 959, 4.2.1\n\tStatusCommandNotImplemented = 502 // RFC 959, 4.2.1\n\tStatusBadCommandSequence = 503 // RFC 959, 4.2.1\n\tStatusNotImplementedParam = 504 // RFC 959, 4.2.1\n\tStatusNotLoggedIn = 530 // RFC 959, 4.2.1\n\tStatusActionNotTaken = 550 // RFC 959, 4.2.1\n\tStatusActionAborted = 552 // RFC 959, 4.2.1\n\tStatusActionNotTakenNoFile = 553 // RFC 959, 4.2.1\n)", + "position": { + "file": "consts.go", + "line": 13 + } + }, + { + "name": "StatusOK", + "doc": "Status codes as documented by:\nhttps://tools.ietf.org/html/rfc959\nhttps://tools.ietf.org/html/rfc2428\nhttps://tools.ietf.org/html/rfc2228", + "declaration": "const (\n\t// 100 Series - The requested action is being initiated, expect another reply before\n\t// proceeding with a new command.\n\tStatusFileStatusOK = 150 // RFC 959, 4.2.1\n\n\t// 200 Series - The requested action has been successfully completed.\n\tStatusOK = 200 // RFC 959, 4.2.1\n\tStatusNotImplemented = 202 // RFC 959, 4.2.1\n\tStatusSystemStatus = 211 // RFC 959, 4.2.1\n\tStatusDirectoryStatus = 212 // RFC 959, 4.2.1\n\tStatusFileStatus = 213 // RFC 959, 4.2.1\n\tStatusHelpMessage = 214 // RFC 959, 4.2.1\n\tStatusSystemType = 215 // RFC 959, 4.2.1\n\tStatusServiceReady = 220 // RFC 959, 4.2.1\n\tStatusClosingControlConn = 221 // RFC 959, 4.2.1\n\tStatusClosingDataConn = 226 // RFC 959, 4.2.1\n\tStatusEnteringPASV = 227 // RFC 959, 4.2.1\n\tStatusEnteringEPSV = 229 // RFC 2428, 3\n\tStatusUserLoggedIn = 230 // RFC 959, 4.2.1\n\tStatusAuthAccepted = 234 // RFC 2228, 3\n\tStatusFileOK = 250 // RFC 959, 4.2.1\n\tStatusPathCreated = 257 // RFC 959, 4.2.1\n\n\t// 300 Series - The command has been accepted, but the requested action is on hold,\n\t// pending receipt of further information.\n\tStatusUserOK = 331 // RFC 959, 4.2.1\n\tStatusFileActionPending = 350 // RFC 959, 4.2.1\n\n\t// 400 Series - The command was not accepted and the requested action did not take place,\n\t// but the error condition is temporary and the action may be requested again.\n\tStatusServiceNotAvailable = 421 // RFC 959, 4.2.1\n\tStatusCannotOpenDataConnection = 425 // RFC 959, 4.2.1\n\tStatusTransferAborted = 426 // RFC 959, 4.2.1\n\tStatusFileActionNotTaken = 450 // RFC 959, 4.2.1\n\n\t// 500 Series - Syntax error, command unrecognized and the requested action did not take\n\t// place. This may include errors such as command line too long.\n\tStatusSyntaxErrorNotRecognised = 500 // RFC 959, 4.2.1\n\tStatusSyntaxErrorParameters = 501 // RFC 959, 4.2.1\n\tStatusCommandNotImplemented = 502 // RFC 959, 4.2.1\n\tStatusBadCommandSequence = 503 // RFC 959, 4.2.1\n\tStatusNotImplementedParam = 504 // RFC 959, 4.2.1\n\tStatusNotLoggedIn = 530 // RFC 959, 4.2.1\n\tStatusActionNotTaken = 550 // RFC 959, 4.2.1\n\tStatusActionAborted = 552 // RFC 959, 4.2.1\n\tStatusActionNotTakenNoFile = 553 // RFC 959, 4.2.1\n)", + "position": { + "file": "consts.go", + "line": 16 + } + }, + { + "name": "StatusNotImplemented", + "doc": "Status codes as documented by:\nhttps://tools.ietf.org/html/rfc959\nhttps://tools.ietf.org/html/rfc2428\nhttps://tools.ietf.org/html/rfc2228", + "declaration": "const (\n\t// 100 Series - The requested action is being initiated, expect another reply before\n\t// proceeding with a new command.\n\tStatusFileStatusOK = 150 // RFC 959, 4.2.1\n\n\t// 200 Series - The requested action has been successfully completed.\n\tStatusOK = 200 // RFC 959, 4.2.1\n\tStatusNotImplemented = 202 // RFC 959, 4.2.1\n\tStatusSystemStatus = 211 // RFC 959, 4.2.1\n\tStatusDirectoryStatus = 212 // RFC 959, 4.2.1\n\tStatusFileStatus = 213 // RFC 959, 4.2.1\n\tStatusHelpMessage = 214 // RFC 959, 4.2.1\n\tStatusSystemType = 215 // RFC 959, 4.2.1\n\tStatusServiceReady = 220 // RFC 959, 4.2.1\n\tStatusClosingControlConn = 221 // RFC 959, 4.2.1\n\tStatusClosingDataConn = 226 // RFC 959, 4.2.1\n\tStatusEnteringPASV = 227 // RFC 959, 4.2.1\n\tStatusEnteringEPSV = 229 // RFC 2428, 3\n\tStatusUserLoggedIn = 230 // RFC 959, 4.2.1\n\tStatusAuthAccepted = 234 // RFC 2228, 3\n\tStatusFileOK = 250 // RFC 959, 4.2.1\n\tStatusPathCreated = 257 // RFC 959, 4.2.1\n\n\t// 300 Series - The command has been accepted, but the requested action is on hold,\n\t// pending receipt of further information.\n\tStatusUserOK = 331 // RFC 959, 4.2.1\n\tStatusFileActionPending = 350 // RFC 959, 4.2.1\n\n\t// 400 Series - The command was not accepted and the requested action did not take place,\n\t// but the error condition is temporary and the action may be requested again.\n\tStatusServiceNotAvailable = 421 // RFC 959, 4.2.1\n\tStatusCannotOpenDataConnection = 425 // RFC 959, 4.2.1\n\tStatusTransferAborted = 426 // RFC 959, 4.2.1\n\tStatusFileActionNotTaken = 450 // RFC 959, 4.2.1\n\n\t// 500 Series - Syntax error, command unrecognized and the requested action did not take\n\t// place. This may include errors such as command line too long.\n\tStatusSyntaxErrorNotRecognised = 500 // RFC 959, 4.2.1\n\tStatusSyntaxErrorParameters = 501 // RFC 959, 4.2.1\n\tStatusCommandNotImplemented = 502 // RFC 959, 4.2.1\n\tStatusBadCommandSequence = 503 // RFC 959, 4.2.1\n\tStatusNotImplementedParam = 504 // RFC 959, 4.2.1\n\tStatusNotLoggedIn = 530 // RFC 959, 4.2.1\n\tStatusActionNotTaken = 550 // RFC 959, 4.2.1\n\tStatusActionAborted = 552 // RFC 959, 4.2.1\n\tStatusActionNotTakenNoFile = 553 // RFC 959, 4.2.1\n)", + "position": { + "file": "consts.go", + "line": 17 + } + }, + { + "name": "StatusSystemStatus", + "doc": "Status codes as documented by:\nhttps://tools.ietf.org/html/rfc959\nhttps://tools.ietf.org/html/rfc2428\nhttps://tools.ietf.org/html/rfc2228", + "declaration": "const (\n\t// 100 Series - The requested action is being initiated, expect another reply before\n\t// proceeding with a new command.\n\tStatusFileStatusOK = 150 // RFC 959, 4.2.1\n\n\t// 200 Series - The requested action has been successfully completed.\n\tStatusOK = 200 // RFC 959, 4.2.1\n\tStatusNotImplemented = 202 // RFC 959, 4.2.1\n\tStatusSystemStatus = 211 // RFC 959, 4.2.1\n\tStatusDirectoryStatus = 212 // RFC 959, 4.2.1\n\tStatusFileStatus = 213 // RFC 959, 4.2.1\n\tStatusHelpMessage = 214 // RFC 959, 4.2.1\n\tStatusSystemType = 215 // RFC 959, 4.2.1\n\tStatusServiceReady = 220 // RFC 959, 4.2.1\n\tStatusClosingControlConn = 221 // RFC 959, 4.2.1\n\tStatusClosingDataConn = 226 // RFC 959, 4.2.1\n\tStatusEnteringPASV = 227 // RFC 959, 4.2.1\n\tStatusEnteringEPSV = 229 // RFC 2428, 3\n\tStatusUserLoggedIn = 230 // RFC 959, 4.2.1\n\tStatusAuthAccepted = 234 // RFC 2228, 3\n\tStatusFileOK = 250 // RFC 959, 4.2.1\n\tStatusPathCreated = 257 // RFC 959, 4.2.1\n\n\t// 300 Series - The command has been accepted, but the requested action is on hold,\n\t// pending receipt of further information.\n\tStatusUserOK = 331 // RFC 959, 4.2.1\n\tStatusFileActionPending = 350 // RFC 959, 4.2.1\n\n\t// 400 Series - The command was not accepted and the requested action did not take place,\n\t// but the error condition is temporary and the action may be requested again.\n\tStatusServiceNotAvailable = 421 // RFC 959, 4.2.1\n\tStatusCannotOpenDataConnection = 425 // RFC 959, 4.2.1\n\tStatusTransferAborted = 426 // RFC 959, 4.2.1\n\tStatusFileActionNotTaken = 450 // RFC 959, 4.2.1\n\n\t// 500 Series - Syntax error, command unrecognized and the requested action did not take\n\t// place. This may include errors such as command line too long.\n\tStatusSyntaxErrorNotRecognised = 500 // RFC 959, 4.2.1\n\tStatusSyntaxErrorParameters = 501 // RFC 959, 4.2.1\n\tStatusCommandNotImplemented = 502 // RFC 959, 4.2.1\n\tStatusBadCommandSequence = 503 // RFC 959, 4.2.1\n\tStatusNotImplementedParam = 504 // RFC 959, 4.2.1\n\tStatusNotLoggedIn = 530 // RFC 959, 4.2.1\n\tStatusActionNotTaken = 550 // RFC 959, 4.2.1\n\tStatusActionAborted = 552 // RFC 959, 4.2.1\n\tStatusActionNotTakenNoFile = 553 // RFC 959, 4.2.1\n)", + "position": { + "file": "consts.go", + "line": 18 + } + }, + { + "name": "StatusDirectoryStatus", + "doc": "Status codes as documented by:\nhttps://tools.ietf.org/html/rfc959\nhttps://tools.ietf.org/html/rfc2428\nhttps://tools.ietf.org/html/rfc2228", + "declaration": "const (\n\t// 100 Series - The requested action is being initiated, expect another reply before\n\t// proceeding with a new command.\n\tStatusFileStatusOK = 150 // RFC 959, 4.2.1\n\n\t// 200 Series - The requested action has been successfully completed.\n\tStatusOK = 200 // RFC 959, 4.2.1\n\tStatusNotImplemented = 202 // RFC 959, 4.2.1\n\tStatusSystemStatus = 211 // RFC 959, 4.2.1\n\tStatusDirectoryStatus = 212 // RFC 959, 4.2.1\n\tStatusFileStatus = 213 // RFC 959, 4.2.1\n\tStatusHelpMessage = 214 // RFC 959, 4.2.1\n\tStatusSystemType = 215 // RFC 959, 4.2.1\n\tStatusServiceReady = 220 // RFC 959, 4.2.1\n\tStatusClosingControlConn = 221 // RFC 959, 4.2.1\n\tStatusClosingDataConn = 226 // RFC 959, 4.2.1\n\tStatusEnteringPASV = 227 // RFC 959, 4.2.1\n\tStatusEnteringEPSV = 229 // RFC 2428, 3\n\tStatusUserLoggedIn = 230 // RFC 959, 4.2.1\n\tStatusAuthAccepted = 234 // RFC 2228, 3\n\tStatusFileOK = 250 // RFC 959, 4.2.1\n\tStatusPathCreated = 257 // RFC 959, 4.2.1\n\n\t// 300 Series - The command has been accepted, but the requested action is on hold,\n\t// pending receipt of further information.\n\tStatusUserOK = 331 // RFC 959, 4.2.1\n\tStatusFileActionPending = 350 // RFC 959, 4.2.1\n\n\t// 400 Series - The command was not accepted and the requested action did not take place,\n\t// but the error condition is temporary and the action may be requested again.\n\tStatusServiceNotAvailable = 421 // RFC 959, 4.2.1\n\tStatusCannotOpenDataConnection = 425 // RFC 959, 4.2.1\n\tStatusTransferAborted = 426 // RFC 959, 4.2.1\n\tStatusFileActionNotTaken = 450 // RFC 959, 4.2.1\n\n\t// 500 Series - Syntax error, command unrecognized and the requested action did not take\n\t// place. This may include errors such as command line too long.\n\tStatusSyntaxErrorNotRecognised = 500 // RFC 959, 4.2.1\n\tStatusSyntaxErrorParameters = 501 // RFC 959, 4.2.1\n\tStatusCommandNotImplemented = 502 // RFC 959, 4.2.1\n\tStatusBadCommandSequence = 503 // RFC 959, 4.2.1\n\tStatusNotImplementedParam = 504 // RFC 959, 4.2.1\n\tStatusNotLoggedIn = 530 // RFC 959, 4.2.1\n\tStatusActionNotTaken = 550 // RFC 959, 4.2.1\n\tStatusActionAborted = 552 // RFC 959, 4.2.1\n\tStatusActionNotTakenNoFile = 553 // RFC 959, 4.2.1\n)", + "position": { + "file": "consts.go", + "line": 19 + } + }, + { + "name": "StatusFileStatus", + "doc": "Status codes as documented by:\nhttps://tools.ietf.org/html/rfc959\nhttps://tools.ietf.org/html/rfc2428\nhttps://tools.ietf.org/html/rfc2228", + "declaration": "const (\n\t// 100 Series - The requested action is being initiated, expect another reply before\n\t// proceeding with a new command.\n\tStatusFileStatusOK = 150 // RFC 959, 4.2.1\n\n\t// 200 Series - The requested action has been successfully completed.\n\tStatusOK = 200 // RFC 959, 4.2.1\n\tStatusNotImplemented = 202 // RFC 959, 4.2.1\n\tStatusSystemStatus = 211 // RFC 959, 4.2.1\n\tStatusDirectoryStatus = 212 // RFC 959, 4.2.1\n\tStatusFileStatus = 213 // RFC 959, 4.2.1\n\tStatusHelpMessage = 214 // RFC 959, 4.2.1\n\tStatusSystemType = 215 // RFC 959, 4.2.1\n\tStatusServiceReady = 220 // RFC 959, 4.2.1\n\tStatusClosingControlConn = 221 // RFC 959, 4.2.1\n\tStatusClosingDataConn = 226 // RFC 959, 4.2.1\n\tStatusEnteringPASV = 227 // RFC 959, 4.2.1\n\tStatusEnteringEPSV = 229 // RFC 2428, 3\n\tStatusUserLoggedIn = 230 // RFC 959, 4.2.1\n\tStatusAuthAccepted = 234 // RFC 2228, 3\n\tStatusFileOK = 250 // RFC 959, 4.2.1\n\tStatusPathCreated = 257 // RFC 959, 4.2.1\n\n\t// 300 Series - The command has been accepted, but the requested action is on hold,\n\t// pending receipt of further information.\n\tStatusUserOK = 331 // RFC 959, 4.2.1\n\tStatusFileActionPending = 350 // RFC 959, 4.2.1\n\n\t// 400 Series - The command was not accepted and the requested action did not take place,\n\t// but the error condition is temporary and the action may be requested again.\n\tStatusServiceNotAvailable = 421 // RFC 959, 4.2.1\n\tStatusCannotOpenDataConnection = 425 // RFC 959, 4.2.1\n\tStatusTransferAborted = 426 // RFC 959, 4.2.1\n\tStatusFileActionNotTaken = 450 // RFC 959, 4.2.1\n\n\t// 500 Series - Syntax error, command unrecognized and the requested action did not take\n\t// place. This may include errors such as command line too long.\n\tStatusSyntaxErrorNotRecognised = 500 // RFC 959, 4.2.1\n\tStatusSyntaxErrorParameters = 501 // RFC 959, 4.2.1\n\tStatusCommandNotImplemented = 502 // RFC 959, 4.2.1\n\tStatusBadCommandSequence = 503 // RFC 959, 4.2.1\n\tStatusNotImplementedParam = 504 // RFC 959, 4.2.1\n\tStatusNotLoggedIn = 530 // RFC 959, 4.2.1\n\tStatusActionNotTaken = 550 // RFC 959, 4.2.1\n\tStatusActionAborted = 552 // RFC 959, 4.2.1\n\tStatusActionNotTakenNoFile = 553 // RFC 959, 4.2.1\n)", + "position": { + "file": "consts.go", + "line": 20 + } + }, + { + "name": "StatusHelpMessage", + "doc": "Status codes as documented by:\nhttps://tools.ietf.org/html/rfc959\nhttps://tools.ietf.org/html/rfc2428\nhttps://tools.ietf.org/html/rfc2228", + "declaration": "const (\n\t// 100 Series - The requested action is being initiated, expect another reply before\n\t// proceeding with a new command.\n\tStatusFileStatusOK = 150 // RFC 959, 4.2.1\n\n\t// 200 Series - The requested action has been successfully completed.\n\tStatusOK = 200 // RFC 959, 4.2.1\n\tStatusNotImplemented = 202 // RFC 959, 4.2.1\n\tStatusSystemStatus = 211 // RFC 959, 4.2.1\n\tStatusDirectoryStatus = 212 // RFC 959, 4.2.1\n\tStatusFileStatus = 213 // RFC 959, 4.2.1\n\tStatusHelpMessage = 214 // RFC 959, 4.2.1\n\tStatusSystemType = 215 // RFC 959, 4.2.1\n\tStatusServiceReady = 220 // RFC 959, 4.2.1\n\tStatusClosingControlConn = 221 // RFC 959, 4.2.1\n\tStatusClosingDataConn = 226 // RFC 959, 4.2.1\n\tStatusEnteringPASV = 227 // RFC 959, 4.2.1\n\tStatusEnteringEPSV = 229 // RFC 2428, 3\n\tStatusUserLoggedIn = 230 // RFC 959, 4.2.1\n\tStatusAuthAccepted = 234 // RFC 2228, 3\n\tStatusFileOK = 250 // RFC 959, 4.2.1\n\tStatusPathCreated = 257 // RFC 959, 4.2.1\n\n\t// 300 Series - The command has been accepted, but the requested action is on hold,\n\t// pending receipt of further information.\n\tStatusUserOK = 331 // RFC 959, 4.2.1\n\tStatusFileActionPending = 350 // RFC 959, 4.2.1\n\n\t// 400 Series - The command was not accepted and the requested action did not take place,\n\t// but the error condition is temporary and the action may be requested again.\n\tStatusServiceNotAvailable = 421 // RFC 959, 4.2.1\n\tStatusCannotOpenDataConnection = 425 // RFC 959, 4.2.1\n\tStatusTransferAborted = 426 // RFC 959, 4.2.1\n\tStatusFileActionNotTaken = 450 // RFC 959, 4.2.1\n\n\t// 500 Series - Syntax error, command unrecognized and the requested action did not take\n\t// place. This may include errors such as command line too long.\n\tStatusSyntaxErrorNotRecognised = 500 // RFC 959, 4.2.1\n\tStatusSyntaxErrorParameters = 501 // RFC 959, 4.2.1\n\tStatusCommandNotImplemented = 502 // RFC 959, 4.2.1\n\tStatusBadCommandSequence = 503 // RFC 959, 4.2.1\n\tStatusNotImplementedParam = 504 // RFC 959, 4.2.1\n\tStatusNotLoggedIn = 530 // RFC 959, 4.2.1\n\tStatusActionNotTaken = 550 // RFC 959, 4.2.1\n\tStatusActionAborted = 552 // RFC 959, 4.2.1\n\tStatusActionNotTakenNoFile = 553 // RFC 959, 4.2.1\n)", + "position": { + "file": "consts.go", + "line": 21 + } + }, + { + "name": "StatusSystemType", + "doc": "Status codes as documented by:\nhttps://tools.ietf.org/html/rfc959\nhttps://tools.ietf.org/html/rfc2428\nhttps://tools.ietf.org/html/rfc2228", + "declaration": "const (\n\t// 100 Series - The requested action is being initiated, expect another reply before\n\t// proceeding with a new command.\n\tStatusFileStatusOK = 150 // RFC 959, 4.2.1\n\n\t// 200 Series - The requested action has been successfully completed.\n\tStatusOK = 200 // RFC 959, 4.2.1\n\tStatusNotImplemented = 202 // RFC 959, 4.2.1\n\tStatusSystemStatus = 211 // RFC 959, 4.2.1\n\tStatusDirectoryStatus = 212 // RFC 959, 4.2.1\n\tStatusFileStatus = 213 // RFC 959, 4.2.1\n\tStatusHelpMessage = 214 // RFC 959, 4.2.1\n\tStatusSystemType = 215 // RFC 959, 4.2.1\n\tStatusServiceReady = 220 // RFC 959, 4.2.1\n\tStatusClosingControlConn = 221 // RFC 959, 4.2.1\n\tStatusClosingDataConn = 226 // RFC 959, 4.2.1\n\tStatusEnteringPASV = 227 // RFC 959, 4.2.1\n\tStatusEnteringEPSV = 229 // RFC 2428, 3\n\tStatusUserLoggedIn = 230 // RFC 959, 4.2.1\n\tStatusAuthAccepted = 234 // RFC 2228, 3\n\tStatusFileOK = 250 // RFC 959, 4.2.1\n\tStatusPathCreated = 257 // RFC 959, 4.2.1\n\n\t// 300 Series - The command has been accepted, but the requested action is on hold,\n\t// pending receipt of further information.\n\tStatusUserOK = 331 // RFC 959, 4.2.1\n\tStatusFileActionPending = 350 // RFC 959, 4.2.1\n\n\t// 400 Series - The command was not accepted and the requested action did not take place,\n\t// but the error condition is temporary and the action may be requested again.\n\tStatusServiceNotAvailable = 421 // RFC 959, 4.2.1\n\tStatusCannotOpenDataConnection = 425 // RFC 959, 4.2.1\n\tStatusTransferAborted = 426 // RFC 959, 4.2.1\n\tStatusFileActionNotTaken = 450 // RFC 959, 4.2.1\n\n\t// 500 Series - Syntax error, command unrecognized and the requested action did not take\n\t// place. This may include errors such as command line too long.\n\tStatusSyntaxErrorNotRecognised = 500 // RFC 959, 4.2.1\n\tStatusSyntaxErrorParameters = 501 // RFC 959, 4.2.1\n\tStatusCommandNotImplemented = 502 // RFC 959, 4.2.1\n\tStatusBadCommandSequence = 503 // RFC 959, 4.2.1\n\tStatusNotImplementedParam = 504 // RFC 959, 4.2.1\n\tStatusNotLoggedIn = 530 // RFC 959, 4.2.1\n\tStatusActionNotTaken = 550 // RFC 959, 4.2.1\n\tStatusActionAborted = 552 // RFC 959, 4.2.1\n\tStatusActionNotTakenNoFile = 553 // RFC 959, 4.2.1\n)", + "position": { + "file": "consts.go", + "line": 22 + } + }, + { + "name": "StatusServiceReady", + "doc": "Status codes as documented by:\nhttps://tools.ietf.org/html/rfc959\nhttps://tools.ietf.org/html/rfc2428\nhttps://tools.ietf.org/html/rfc2228", + "declaration": "const (\n\t// 100 Series - The requested action is being initiated, expect another reply before\n\t// proceeding with a new command.\n\tStatusFileStatusOK = 150 // RFC 959, 4.2.1\n\n\t// 200 Series - The requested action has been successfully completed.\n\tStatusOK = 200 // RFC 959, 4.2.1\n\tStatusNotImplemented = 202 // RFC 959, 4.2.1\n\tStatusSystemStatus = 211 // RFC 959, 4.2.1\n\tStatusDirectoryStatus = 212 // RFC 959, 4.2.1\n\tStatusFileStatus = 213 // RFC 959, 4.2.1\n\tStatusHelpMessage = 214 // RFC 959, 4.2.1\n\tStatusSystemType = 215 // RFC 959, 4.2.1\n\tStatusServiceReady = 220 // RFC 959, 4.2.1\n\tStatusClosingControlConn = 221 // RFC 959, 4.2.1\n\tStatusClosingDataConn = 226 // RFC 959, 4.2.1\n\tStatusEnteringPASV = 227 // RFC 959, 4.2.1\n\tStatusEnteringEPSV = 229 // RFC 2428, 3\n\tStatusUserLoggedIn = 230 // RFC 959, 4.2.1\n\tStatusAuthAccepted = 234 // RFC 2228, 3\n\tStatusFileOK = 250 // RFC 959, 4.2.1\n\tStatusPathCreated = 257 // RFC 959, 4.2.1\n\n\t// 300 Series - The command has been accepted, but the requested action is on hold,\n\t// pending receipt of further information.\n\tStatusUserOK = 331 // RFC 959, 4.2.1\n\tStatusFileActionPending = 350 // RFC 959, 4.2.1\n\n\t// 400 Series - The command was not accepted and the requested action did not take place,\n\t// but the error condition is temporary and the action may be requested again.\n\tStatusServiceNotAvailable = 421 // RFC 959, 4.2.1\n\tStatusCannotOpenDataConnection = 425 // RFC 959, 4.2.1\n\tStatusTransferAborted = 426 // RFC 959, 4.2.1\n\tStatusFileActionNotTaken = 450 // RFC 959, 4.2.1\n\n\t// 500 Series - Syntax error, command unrecognized and the requested action did not take\n\t// place. This may include errors such as command line too long.\n\tStatusSyntaxErrorNotRecognised = 500 // RFC 959, 4.2.1\n\tStatusSyntaxErrorParameters = 501 // RFC 959, 4.2.1\n\tStatusCommandNotImplemented = 502 // RFC 959, 4.2.1\n\tStatusBadCommandSequence = 503 // RFC 959, 4.2.1\n\tStatusNotImplementedParam = 504 // RFC 959, 4.2.1\n\tStatusNotLoggedIn = 530 // RFC 959, 4.2.1\n\tStatusActionNotTaken = 550 // RFC 959, 4.2.1\n\tStatusActionAborted = 552 // RFC 959, 4.2.1\n\tStatusActionNotTakenNoFile = 553 // RFC 959, 4.2.1\n)", + "position": { + "file": "consts.go", + "line": 23 + } + }, + { + "name": "StatusClosingControlConn", + "doc": "Status codes as documented by:\nhttps://tools.ietf.org/html/rfc959\nhttps://tools.ietf.org/html/rfc2428\nhttps://tools.ietf.org/html/rfc2228", + "declaration": "const (\n\t// 100 Series - The requested action is being initiated, expect another reply before\n\t// proceeding with a new command.\n\tStatusFileStatusOK = 150 // RFC 959, 4.2.1\n\n\t// 200 Series - The requested action has been successfully completed.\n\tStatusOK = 200 // RFC 959, 4.2.1\n\tStatusNotImplemented = 202 // RFC 959, 4.2.1\n\tStatusSystemStatus = 211 // RFC 959, 4.2.1\n\tStatusDirectoryStatus = 212 // RFC 959, 4.2.1\n\tStatusFileStatus = 213 // RFC 959, 4.2.1\n\tStatusHelpMessage = 214 // RFC 959, 4.2.1\n\tStatusSystemType = 215 // RFC 959, 4.2.1\n\tStatusServiceReady = 220 // RFC 959, 4.2.1\n\tStatusClosingControlConn = 221 // RFC 959, 4.2.1\n\tStatusClosingDataConn = 226 // RFC 959, 4.2.1\n\tStatusEnteringPASV = 227 // RFC 959, 4.2.1\n\tStatusEnteringEPSV = 229 // RFC 2428, 3\n\tStatusUserLoggedIn = 230 // RFC 959, 4.2.1\n\tStatusAuthAccepted = 234 // RFC 2228, 3\n\tStatusFileOK = 250 // RFC 959, 4.2.1\n\tStatusPathCreated = 257 // RFC 959, 4.2.1\n\n\t// 300 Series - The command has been accepted, but the requested action is on hold,\n\t// pending receipt of further information.\n\tStatusUserOK = 331 // RFC 959, 4.2.1\n\tStatusFileActionPending = 350 // RFC 959, 4.2.1\n\n\t// 400 Series - The command was not accepted and the requested action did not take place,\n\t// but the error condition is temporary and the action may be requested again.\n\tStatusServiceNotAvailable = 421 // RFC 959, 4.2.1\n\tStatusCannotOpenDataConnection = 425 // RFC 959, 4.2.1\n\tStatusTransferAborted = 426 // RFC 959, 4.2.1\n\tStatusFileActionNotTaken = 450 // RFC 959, 4.2.1\n\n\t// 500 Series - Syntax error, command unrecognized and the requested action did not take\n\t// place. This may include errors such as command line too long.\n\tStatusSyntaxErrorNotRecognised = 500 // RFC 959, 4.2.1\n\tStatusSyntaxErrorParameters = 501 // RFC 959, 4.2.1\n\tStatusCommandNotImplemented = 502 // RFC 959, 4.2.1\n\tStatusBadCommandSequence = 503 // RFC 959, 4.2.1\n\tStatusNotImplementedParam = 504 // RFC 959, 4.2.1\n\tStatusNotLoggedIn = 530 // RFC 959, 4.2.1\n\tStatusActionNotTaken = 550 // RFC 959, 4.2.1\n\tStatusActionAborted = 552 // RFC 959, 4.2.1\n\tStatusActionNotTakenNoFile = 553 // RFC 959, 4.2.1\n)", + "position": { + "file": "consts.go", + "line": 24 + } + }, + { + "name": "StatusClosingDataConn", + "doc": "Status codes as documented by:\nhttps://tools.ietf.org/html/rfc959\nhttps://tools.ietf.org/html/rfc2428\nhttps://tools.ietf.org/html/rfc2228", + "declaration": "const (\n\t// 100 Series - The requested action is being initiated, expect another reply before\n\t// proceeding with a new command.\n\tStatusFileStatusOK = 150 // RFC 959, 4.2.1\n\n\t// 200 Series - The requested action has been successfully completed.\n\tStatusOK = 200 // RFC 959, 4.2.1\n\tStatusNotImplemented = 202 // RFC 959, 4.2.1\n\tStatusSystemStatus = 211 // RFC 959, 4.2.1\n\tStatusDirectoryStatus = 212 // RFC 959, 4.2.1\n\tStatusFileStatus = 213 // RFC 959, 4.2.1\n\tStatusHelpMessage = 214 // RFC 959, 4.2.1\n\tStatusSystemType = 215 // RFC 959, 4.2.1\n\tStatusServiceReady = 220 // RFC 959, 4.2.1\n\tStatusClosingControlConn = 221 // RFC 959, 4.2.1\n\tStatusClosingDataConn = 226 // RFC 959, 4.2.1\n\tStatusEnteringPASV = 227 // RFC 959, 4.2.1\n\tStatusEnteringEPSV = 229 // RFC 2428, 3\n\tStatusUserLoggedIn = 230 // RFC 959, 4.2.1\n\tStatusAuthAccepted = 234 // RFC 2228, 3\n\tStatusFileOK = 250 // RFC 959, 4.2.1\n\tStatusPathCreated = 257 // RFC 959, 4.2.1\n\n\t// 300 Series - The command has been accepted, but the requested action is on hold,\n\t// pending receipt of further information.\n\tStatusUserOK = 331 // RFC 959, 4.2.1\n\tStatusFileActionPending = 350 // RFC 959, 4.2.1\n\n\t// 400 Series - The command was not accepted and the requested action did not take place,\n\t// but the error condition is temporary and the action may be requested again.\n\tStatusServiceNotAvailable = 421 // RFC 959, 4.2.1\n\tStatusCannotOpenDataConnection = 425 // RFC 959, 4.2.1\n\tStatusTransferAborted = 426 // RFC 959, 4.2.1\n\tStatusFileActionNotTaken = 450 // RFC 959, 4.2.1\n\n\t// 500 Series - Syntax error, command unrecognized and the requested action did not take\n\t// place. This may include errors such as command line too long.\n\tStatusSyntaxErrorNotRecognised = 500 // RFC 959, 4.2.1\n\tStatusSyntaxErrorParameters = 501 // RFC 959, 4.2.1\n\tStatusCommandNotImplemented = 502 // RFC 959, 4.2.1\n\tStatusBadCommandSequence = 503 // RFC 959, 4.2.1\n\tStatusNotImplementedParam = 504 // RFC 959, 4.2.1\n\tStatusNotLoggedIn = 530 // RFC 959, 4.2.1\n\tStatusActionNotTaken = 550 // RFC 959, 4.2.1\n\tStatusActionAborted = 552 // RFC 959, 4.2.1\n\tStatusActionNotTakenNoFile = 553 // RFC 959, 4.2.1\n)", + "position": { + "file": "consts.go", + "line": 25 + } + }, + { + "name": "StatusEnteringPASV", + "doc": "Status codes as documented by:\nhttps://tools.ietf.org/html/rfc959\nhttps://tools.ietf.org/html/rfc2428\nhttps://tools.ietf.org/html/rfc2228", + "declaration": "const (\n\t// 100 Series - The requested action is being initiated, expect another reply before\n\t// proceeding with a new command.\n\tStatusFileStatusOK = 150 // RFC 959, 4.2.1\n\n\t// 200 Series - The requested action has been successfully completed.\n\tStatusOK = 200 // RFC 959, 4.2.1\n\tStatusNotImplemented = 202 // RFC 959, 4.2.1\n\tStatusSystemStatus = 211 // RFC 959, 4.2.1\n\tStatusDirectoryStatus = 212 // RFC 959, 4.2.1\n\tStatusFileStatus = 213 // RFC 959, 4.2.1\n\tStatusHelpMessage = 214 // RFC 959, 4.2.1\n\tStatusSystemType = 215 // RFC 959, 4.2.1\n\tStatusServiceReady = 220 // RFC 959, 4.2.1\n\tStatusClosingControlConn = 221 // RFC 959, 4.2.1\n\tStatusClosingDataConn = 226 // RFC 959, 4.2.1\n\tStatusEnteringPASV = 227 // RFC 959, 4.2.1\n\tStatusEnteringEPSV = 229 // RFC 2428, 3\n\tStatusUserLoggedIn = 230 // RFC 959, 4.2.1\n\tStatusAuthAccepted = 234 // RFC 2228, 3\n\tStatusFileOK = 250 // RFC 959, 4.2.1\n\tStatusPathCreated = 257 // RFC 959, 4.2.1\n\n\t// 300 Series - The command has been accepted, but the requested action is on hold,\n\t// pending receipt of further information.\n\tStatusUserOK = 331 // RFC 959, 4.2.1\n\tStatusFileActionPending = 350 // RFC 959, 4.2.1\n\n\t// 400 Series - The command was not accepted and the requested action did not take place,\n\t// but the error condition is temporary and the action may be requested again.\n\tStatusServiceNotAvailable = 421 // RFC 959, 4.2.1\n\tStatusCannotOpenDataConnection = 425 // RFC 959, 4.2.1\n\tStatusTransferAborted = 426 // RFC 959, 4.2.1\n\tStatusFileActionNotTaken = 450 // RFC 959, 4.2.1\n\n\t// 500 Series - Syntax error, command unrecognized and the requested action did not take\n\t// place. This may include errors such as command line too long.\n\tStatusSyntaxErrorNotRecognised = 500 // RFC 959, 4.2.1\n\tStatusSyntaxErrorParameters = 501 // RFC 959, 4.2.1\n\tStatusCommandNotImplemented = 502 // RFC 959, 4.2.1\n\tStatusBadCommandSequence = 503 // RFC 959, 4.2.1\n\tStatusNotImplementedParam = 504 // RFC 959, 4.2.1\n\tStatusNotLoggedIn = 530 // RFC 959, 4.2.1\n\tStatusActionNotTaken = 550 // RFC 959, 4.2.1\n\tStatusActionAborted = 552 // RFC 959, 4.2.1\n\tStatusActionNotTakenNoFile = 553 // RFC 959, 4.2.1\n)", + "position": { + "file": "consts.go", + "line": 26 + } + }, + { + "name": "StatusEnteringEPSV", + "doc": "Status codes as documented by:\nhttps://tools.ietf.org/html/rfc959\nhttps://tools.ietf.org/html/rfc2428\nhttps://tools.ietf.org/html/rfc2228", + "declaration": "const (\n\t// 100 Series - The requested action is being initiated, expect another reply before\n\t// proceeding with a new command.\n\tStatusFileStatusOK = 150 // RFC 959, 4.2.1\n\n\t// 200 Series - The requested action has been successfully completed.\n\tStatusOK = 200 // RFC 959, 4.2.1\n\tStatusNotImplemented = 202 // RFC 959, 4.2.1\n\tStatusSystemStatus = 211 // RFC 959, 4.2.1\n\tStatusDirectoryStatus = 212 // RFC 959, 4.2.1\n\tStatusFileStatus = 213 // RFC 959, 4.2.1\n\tStatusHelpMessage = 214 // RFC 959, 4.2.1\n\tStatusSystemType = 215 // RFC 959, 4.2.1\n\tStatusServiceReady = 220 // RFC 959, 4.2.1\n\tStatusClosingControlConn = 221 // RFC 959, 4.2.1\n\tStatusClosingDataConn = 226 // RFC 959, 4.2.1\n\tStatusEnteringPASV = 227 // RFC 959, 4.2.1\n\tStatusEnteringEPSV = 229 // RFC 2428, 3\n\tStatusUserLoggedIn = 230 // RFC 959, 4.2.1\n\tStatusAuthAccepted = 234 // RFC 2228, 3\n\tStatusFileOK = 250 // RFC 959, 4.2.1\n\tStatusPathCreated = 257 // RFC 959, 4.2.1\n\n\t// 300 Series - The command has been accepted, but the requested action is on hold,\n\t// pending receipt of further information.\n\tStatusUserOK = 331 // RFC 959, 4.2.1\n\tStatusFileActionPending = 350 // RFC 959, 4.2.1\n\n\t// 400 Series - The command was not accepted and the requested action did not take place,\n\t// but the error condition is temporary and the action may be requested again.\n\tStatusServiceNotAvailable = 421 // RFC 959, 4.2.1\n\tStatusCannotOpenDataConnection = 425 // RFC 959, 4.2.1\n\tStatusTransferAborted = 426 // RFC 959, 4.2.1\n\tStatusFileActionNotTaken = 450 // RFC 959, 4.2.1\n\n\t// 500 Series - Syntax error, command unrecognized and the requested action did not take\n\t// place. This may include errors such as command line too long.\n\tStatusSyntaxErrorNotRecognised = 500 // RFC 959, 4.2.1\n\tStatusSyntaxErrorParameters = 501 // RFC 959, 4.2.1\n\tStatusCommandNotImplemented = 502 // RFC 959, 4.2.1\n\tStatusBadCommandSequence = 503 // RFC 959, 4.2.1\n\tStatusNotImplementedParam = 504 // RFC 959, 4.2.1\n\tStatusNotLoggedIn = 530 // RFC 959, 4.2.1\n\tStatusActionNotTaken = 550 // RFC 959, 4.2.1\n\tStatusActionAborted = 552 // RFC 959, 4.2.1\n\tStatusActionNotTakenNoFile = 553 // RFC 959, 4.2.1\n)", + "position": { + "file": "consts.go", + "line": 27 + } + }, + { + "name": "StatusUserLoggedIn", + "doc": "Status codes as documented by:\nhttps://tools.ietf.org/html/rfc959\nhttps://tools.ietf.org/html/rfc2428\nhttps://tools.ietf.org/html/rfc2228", + "declaration": "const (\n\t// 100 Series - The requested action is being initiated, expect another reply before\n\t// proceeding with a new command.\n\tStatusFileStatusOK = 150 // RFC 959, 4.2.1\n\n\t// 200 Series - The requested action has been successfully completed.\n\tStatusOK = 200 // RFC 959, 4.2.1\n\tStatusNotImplemented = 202 // RFC 959, 4.2.1\n\tStatusSystemStatus = 211 // RFC 959, 4.2.1\n\tStatusDirectoryStatus = 212 // RFC 959, 4.2.1\n\tStatusFileStatus = 213 // RFC 959, 4.2.1\n\tStatusHelpMessage = 214 // RFC 959, 4.2.1\n\tStatusSystemType = 215 // RFC 959, 4.2.1\n\tStatusServiceReady = 220 // RFC 959, 4.2.1\n\tStatusClosingControlConn = 221 // RFC 959, 4.2.1\n\tStatusClosingDataConn = 226 // RFC 959, 4.2.1\n\tStatusEnteringPASV = 227 // RFC 959, 4.2.1\n\tStatusEnteringEPSV = 229 // RFC 2428, 3\n\tStatusUserLoggedIn = 230 // RFC 959, 4.2.1\n\tStatusAuthAccepted = 234 // RFC 2228, 3\n\tStatusFileOK = 250 // RFC 959, 4.2.1\n\tStatusPathCreated = 257 // RFC 959, 4.2.1\n\n\t// 300 Series - The command has been accepted, but the requested action is on hold,\n\t// pending receipt of further information.\n\tStatusUserOK = 331 // RFC 959, 4.2.1\n\tStatusFileActionPending = 350 // RFC 959, 4.2.1\n\n\t// 400 Series - The command was not accepted and the requested action did not take place,\n\t// but the error condition is temporary and the action may be requested again.\n\tStatusServiceNotAvailable = 421 // RFC 959, 4.2.1\n\tStatusCannotOpenDataConnection = 425 // RFC 959, 4.2.1\n\tStatusTransferAborted = 426 // RFC 959, 4.2.1\n\tStatusFileActionNotTaken = 450 // RFC 959, 4.2.1\n\n\t// 500 Series - Syntax error, command unrecognized and the requested action did not take\n\t// place. This may include errors such as command line too long.\n\tStatusSyntaxErrorNotRecognised = 500 // RFC 959, 4.2.1\n\tStatusSyntaxErrorParameters = 501 // RFC 959, 4.2.1\n\tStatusCommandNotImplemented = 502 // RFC 959, 4.2.1\n\tStatusBadCommandSequence = 503 // RFC 959, 4.2.1\n\tStatusNotImplementedParam = 504 // RFC 959, 4.2.1\n\tStatusNotLoggedIn = 530 // RFC 959, 4.2.1\n\tStatusActionNotTaken = 550 // RFC 959, 4.2.1\n\tStatusActionAborted = 552 // RFC 959, 4.2.1\n\tStatusActionNotTakenNoFile = 553 // RFC 959, 4.2.1\n)", + "position": { + "file": "consts.go", + "line": 28 + } + }, + { + "name": "StatusAuthAccepted", + "doc": "Status codes as documented by:\nhttps://tools.ietf.org/html/rfc959\nhttps://tools.ietf.org/html/rfc2428\nhttps://tools.ietf.org/html/rfc2228", + "declaration": "const (\n\t// 100 Series - The requested action is being initiated, expect another reply before\n\t// proceeding with a new command.\n\tStatusFileStatusOK = 150 // RFC 959, 4.2.1\n\n\t// 200 Series - The requested action has been successfully completed.\n\tStatusOK = 200 // RFC 959, 4.2.1\n\tStatusNotImplemented = 202 // RFC 959, 4.2.1\n\tStatusSystemStatus = 211 // RFC 959, 4.2.1\n\tStatusDirectoryStatus = 212 // RFC 959, 4.2.1\n\tStatusFileStatus = 213 // RFC 959, 4.2.1\n\tStatusHelpMessage = 214 // RFC 959, 4.2.1\n\tStatusSystemType = 215 // RFC 959, 4.2.1\n\tStatusServiceReady = 220 // RFC 959, 4.2.1\n\tStatusClosingControlConn = 221 // RFC 959, 4.2.1\n\tStatusClosingDataConn = 226 // RFC 959, 4.2.1\n\tStatusEnteringPASV = 227 // RFC 959, 4.2.1\n\tStatusEnteringEPSV = 229 // RFC 2428, 3\n\tStatusUserLoggedIn = 230 // RFC 959, 4.2.1\n\tStatusAuthAccepted = 234 // RFC 2228, 3\n\tStatusFileOK = 250 // RFC 959, 4.2.1\n\tStatusPathCreated = 257 // RFC 959, 4.2.1\n\n\t// 300 Series - The command has been accepted, but the requested action is on hold,\n\t// pending receipt of further information.\n\tStatusUserOK = 331 // RFC 959, 4.2.1\n\tStatusFileActionPending = 350 // RFC 959, 4.2.1\n\n\t// 400 Series - The command was not accepted and the requested action did not take place,\n\t// but the error condition is temporary and the action may be requested again.\n\tStatusServiceNotAvailable = 421 // RFC 959, 4.2.1\n\tStatusCannotOpenDataConnection = 425 // RFC 959, 4.2.1\n\tStatusTransferAborted = 426 // RFC 959, 4.2.1\n\tStatusFileActionNotTaken = 450 // RFC 959, 4.2.1\n\n\t// 500 Series - Syntax error, command unrecognized and the requested action did not take\n\t// place. This may include errors such as command line too long.\n\tStatusSyntaxErrorNotRecognised = 500 // RFC 959, 4.2.1\n\tStatusSyntaxErrorParameters = 501 // RFC 959, 4.2.1\n\tStatusCommandNotImplemented = 502 // RFC 959, 4.2.1\n\tStatusBadCommandSequence = 503 // RFC 959, 4.2.1\n\tStatusNotImplementedParam = 504 // RFC 959, 4.2.1\n\tStatusNotLoggedIn = 530 // RFC 959, 4.2.1\n\tStatusActionNotTaken = 550 // RFC 959, 4.2.1\n\tStatusActionAborted = 552 // RFC 959, 4.2.1\n\tStatusActionNotTakenNoFile = 553 // RFC 959, 4.2.1\n)", + "position": { + "file": "consts.go", + "line": 29 + } + }, + { + "name": "StatusFileOK", + "doc": "Status codes as documented by:\nhttps://tools.ietf.org/html/rfc959\nhttps://tools.ietf.org/html/rfc2428\nhttps://tools.ietf.org/html/rfc2228", + "declaration": "const (\n\t// 100 Series - The requested action is being initiated, expect another reply before\n\t// proceeding with a new command.\n\tStatusFileStatusOK = 150 // RFC 959, 4.2.1\n\n\t// 200 Series - The requested action has been successfully completed.\n\tStatusOK = 200 // RFC 959, 4.2.1\n\tStatusNotImplemented = 202 // RFC 959, 4.2.1\n\tStatusSystemStatus = 211 // RFC 959, 4.2.1\n\tStatusDirectoryStatus = 212 // RFC 959, 4.2.1\n\tStatusFileStatus = 213 // RFC 959, 4.2.1\n\tStatusHelpMessage = 214 // RFC 959, 4.2.1\n\tStatusSystemType = 215 // RFC 959, 4.2.1\n\tStatusServiceReady = 220 // RFC 959, 4.2.1\n\tStatusClosingControlConn = 221 // RFC 959, 4.2.1\n\tStatusClosingDataConn = 226 // RFC 959, 4.2.1\n\tStatusEnteringPASV = 227 // RFC 959, 4.2.1\n\tStatusEnteringEPSV = 229 // RFC 2428, 3\n\tStatusUserLoggedIn = 230 // RFC 959, 4.2.1\n\tStatusAuthAccepted = 234 // RFC 2228, 3\n\tStatusFileOK = 250 // RFC 959, 4.2.1\n\tStatusPathCreated = 257 // RFC 959, 4.2.1\n\n\t// 300 Series - The command has been accepted, but the requested action is on hold,\n\t// pending receipt of further information.\n\tStatusUserOK = 331 // RFC 959, 4.2.1\n\tStatusFileActionPending = 350 // RFC 959, 4.2.1\n\n\t// 400 Series - The command was not accepted and the requested action did not take place,\n\t// but the error condition is temporary and the action may be requested again.\n\tStatusServiceNotAvailable = 421 // RFC 959, 4.2.1\n\tStatusCannotOpenDataConnection = 425 // RFC 959, 4.2.1\n\tStatusTransferAborted = 426 // RFC 959, 4.2.1\n\tStatusFileActionNotTaken = 450 // RFC 959, 4.2.1\n\n\t// 500 Series - Syntax error, command unrecognized and the requested action did not take\n\t// place. This may include errors such as command line too long.\n\tStatusSyntaxErrorNotRecognised = 500 // RFC 959, 4.2.1\n\tStatusSyntaxErrorParameters = 501 // RFC 959, 4.2.1\n\tStatusCommandNotImplemented = 502 // RFC 959, 4.2.1\n\tStatusBadCommandSequence = 503 // RFC 959, 4.2.1\n\tStatusNotImplementedParam = 504 // RFC 959, 4.2.1\n\tStatusNotLoggedIn = 530 // RFC 959, 4.2.1\n\tStatusActionNotTaken = 550 // RFC 959, 4.2.1\n\tStatusActionAborted = 552 // RFC 959, 4.2.1\n\tStatusActionNotTakenNoFile = 553 // RFC 959, 4.2.1\n)", + "position": { + "file": "consts.go", + "line": 30 + } + }, + { + "name": "StatusPathCreated", + "doc": "Status codes as documented by:\nhttps://tools.ietf.org/html/rfc959\nhttps://tools.ietf.org/html/rfc2428\nhttps://tools.ietf.org/html/rfc2228", + "declaration": "const (\n\t// 100 Series - The requested action is being initiated, expect another reply before\n\t// proceeding with a new command.\n\tStatusFileStatusOK = 150 // RFC 959, 4.2.1\n\n\t// 200 Series - The requested action has been successfully completed.\n\tStatusOK = 200 // RFC 959, 4.2.1\n\tStatusNotImplemented = 202 // RFC 959, 4.2.1\n\tStatusSystemStatus = 211 // RFC 959, 4.2.1\n\tStatusDirectoryStatus = 212 // RFC 959, 4.2.1\n\tStatusFileStatus = 213 // RFC 959, 4.2.1\n\tStatusHelpMessage = 214 // RFC 959, 4.2.1\n\tStatusSystemType = 215 // RFC 959, 4.2.1\n\tStatusServiceReady = 220 // RFC 959, 4.2.1\n\tStatusClosingControlConn = 221 // RFC 959, 4.2.1\n\tStatusClosingDataConn = 226 // RFC 959, 4.2.1\n\tStatusEnteringPASV = 227 // RFC 959, 4.2.1\n\tStatusEnteringEPSV = 229 // RFC 2428, 3\n\tStatusUserLoggedIn = 230 // RFC 959, 4.2.1\n\tStatusAuthAccepted = 234 // RFC 2228, 3\n\tStatusFileOK = 250 // RFC 959, 4.2.1\n\tStatusPathCreated = 257 // RFC 959, 4.2.1\n\n\t// 300 Series - The command has been accepted, but the requested action is on hold,\n\t// pending receipt of further information.\n\tStatusUserOK = 331 // RFC 959, 4.2.1\n\tStatusFileActionPending = 350 // RFC 959, 4.2.1\n\n\t// 400 Series - The command was not accepted and the requested action did not take place,\n\t// but the error condition is temporary and the action may be requested again.\n\tStatusServiceNotAvailable = 421 // RFC 959, 4.2.1\n\tStatusCannotOpenDataConnection = 425 // RFC 959, 4.2.1\n\tStatusTransferAborted = 426 // RFC 959, 4.2.1\n\tStatusFileActionNotTaken = 450 // RFC 959, 4.2.1\n\n\t// 500 Series - Syntax error, command unrecognized and the requested action did not take\n\t// place. This may include errors such as command line too long.\n\tStatusSyntaxErrorNotRecognised = 500 // RFC 959, 4.2.1\n\tStatusSyntaxErrorParameters = 501 // RFC 959, 4.2.1\n\tStatusCommandNotImplemented = 502 // RFC 959, 4.2.1\n\tStatusBadCommandSequence = 503 // RFC 959, 4.2.1\n\tStatusNotImplementedParam = 504 // RFC 959, 4.2.1\n\tStatusNotLoggedIn = 530 // RFC 959, 4.2.1\n\tStatusActionNotTaken = 550 // RFC 959, 4.2.1\n\tStatusActionAborted = 552 // RFC 959, 4.2.1\n\tStatusActionNotTakenNoFile = 553 // RFC 959, 4.2.1\n)", + "position": { + "file": "consts.go", + "line": 31 + } + }, + { + "name": "StatusUserOK", + "doc": "Status codes as documented by:\nhttps://tools.ietf.org/html/rfc959\nhttps://tools.ietf.org/html/rfc2428\nhttps://tools.ietf.org/html/rfc2228", + "declaration": "const (\n\t// 100 Series - The requested action is being initiated, expect another reply before\n\t// proceeding with a new command.\n\tStatusFileStatusOK = 150 // RFC 959, 4.2.1\n\n\t// 200 Series - The requested action has been successfully completed.\n\tStatusOK = 200 // RFC 959, 4.2.1\n\tStatusNotImplemented = 202 // RFC 959, 4.2.1\n\tStatusSystemStatus = 211 // RFC 959, 4.2.1\n\tStatusDirectoryStatus = 212 // RFC 959, 4.2.1\n\tStatusFileStatus = 213 // RFC 959, 4.2.1\n\tStatusHelpMessage = 214 // RFC 959, 4.2.1\n\tStatusSystemType = 215 // RFC 959, 4.2.1\n\tStatusServiceReady = 220 // RFC 959, 4.2.1\n\tStatusClosingControlConn = 221 // RFC 959, 4.2.1\n\tStatusClosingDataConn = 226 // RFC 959, 4.2.1\n\tStatusEnteringPASV = 227 // RFC 959, 4.2.1\n\tStatusEnteringEPSV = 229 // RFC 2428, 3\n\tStatusUserLoggedIn = 230 // RFC 959, 4.2.1\n\tStatusAuthAccepted = 234 // RFC 2228, 3\n\tStatusFileOK = 250 // RFC 959, 4.2.1\n\tStatusPathCreated = 257 // RFC 959, 4.2.1\n\n\t// 300 Series - The command has been accepted, but the requested action is on hold,\n\t// pending receipt of further information.\n\tStatusUserOK = 331 // RFC 959, 4.2.1\n\tStatusFileActionPending = 350 // RFC 959, 4.2.1\n\n\t// 400 Series - The command was not accepted and the requested action did not take place,\n\t// but the error condition is temporary and the action may be requested again.\n\tStatusServiceNotAvailable = 421 // RFC 959, 4.2.1\n\tStatusCannotOpenDataConnection = 425 // RFC 959, 4.2.1\n\tStatusTransferAborted = 426 // RFC 959, 4.2.1\n\tStatusFileActionNotTaken = 450 // RFC 959, 4.2.1\n\n\t// 500 Series - Syntax error, command unrecognized and the requested action did not take\n\t// place. This may include errors such as command line too long.\n\tStatusSyntaxErrorNotRecognised = 500 // RFC 959, 4.2.1\n\tStatusSyntaxErrorParameters = 501 // RFC 959, 4.2.1\n\tStatusCommandNotImplemented = 502 // RFC 959, 4.2.1\n\tStatusBadCommandSequence = 503 // RFC 959, 4.2.1\n\tStatusNotImplementedParam = 504 // RFC 959, 4.2.1\n\tStatusNotLoggedIn = 530 // RFC 959, 4.2.1\n\tStatusActionNotTaken = 550 // RFC 959, 4.2.1\n\tStatusActionAborted = 552 // RFC 959, 4.2.1\n\tStatusActionNotTakenNoFile = 553 // RFC 959, 4.2.1\n)", + "position": { + "file": "consts.go", + "line": 35 + } + }, + { + "name": "StatusFileActionPending", + "doc": "Status codes as documented by:\nhttps://tools.ietf.org/html/rfc959\nhttps://tools.ietf.org/html/rfc2428\nhttps://tools.ietf.org/html/rfc2228", + "declaration": "const (\n\t// 100 Series - The requested action is being initiated, expect another reply before\n\t// proceeding with a new command.\n\tStatusFileStatusOK = 150 // RFC 959, 4.2.1\n\n\t// 200 Series - The requested action has been successfully completed.\n\tStatusOK = 200 // RFC 959, 4.2.1\n\tStatusNotImplemented = 202 // RFC 959, 4.2.1\n\tStatusSystemStatus = 211 // RFC 959, 4.2.1\n\tStatusDirectoryStatus = 212 // RFC 959, 4.2.1\n\tStatusFileStatus = 213 // RFC 959, 4.2.1\n\tStatusHelpMessage = 214 // RFC 959, 4.2.1\n\tStatusSystemType = 215 // RFC 959, 4.2.1\n\tStatusServiceReady = 220 // RFC 959, 4.2.1\n\tStatusClosingControlConn = 221 // RFC 959, 4.2.1\n\tStatusClosingDataConn = 226 // RFC 959, 4.2.1\n\tStatusEnteringPASV = 227 // RFC 959, 4.2.1\n\tStatusEnteringEPSV = 229 // RFC 2428, 3\n\tStatusUserLoggedIn = 230 // RFC 959, 4.2.1\n\tStatusAuthAccepted = 234 // RFC 2228, 3\n\tStatusFileOK = 250 // RFC 959, 4.2.1\n\tStatusPathCreated = 257 // RFC 959, 4.2.1\n\n\t// 300 Series - The command has been accepted, but the requested action is on hold,\n\t// pending receipt of further information.\n\tStatusUserOK = 331 // RFC 959, 4.2.1\n\tStatusFileActionPending = 350 // RFC 959, 4.2.1\n\n\t// 400 Series - The command was not accepted and the requested action did not take place,\n\t// but the error condition is temporary and the action may be requested again.\n\tStatusServiceNotAvailable = 421 // RFC 959, 4.2.1\n\tStatusCannotOpenDataConnection = 425 // RFC 959, 4.2.1\n\tStatusTransferAborted = 426 // RFC 959, 4.2.1\n\tStatusFileActionNotTaken = 450 // RFC 959, 4.2.1\n\n\t// 500 Series - Syntax error, command unrecognized and the requested action did not take\n\t// place. This may include errors such as command line too long.\n\tStatusSyntaxErrorNotRecognised = 500 // RFC 959, 4.2.1\n\tStatusSyntaxErrorParameters = 501 // RFC 959, 4.2.1\n\tStatusCommandNotImplemented = 502 // RFC 959, 4.2.1\n\tStatusBadCommandSequence = 503 // RFC 959, 4.2.1\n\tStatusNotImplementedParam = 504 // RFC 959, 4.2.1\n\tStatusNotLoggedIn = 530 // RFC 959, 4.2.1\n\tStatusActionNotTaken = 550 // RFC 959, 4.2.1\n\tStatusActionAborted = 552 // RFC 959, 4.2.1\n\tStatusActionNotTakenNoFile = 553 // RFC 959, 4.2.1\n)", + "position": { + "file": "consts.go", + "line": 36 + } + }, + { + "name": "StatusServiceNotAvailable", + "doc": "Status codes as documented by:\nhttps://tools.ietf.org/html/rfc959\nhttps://tools.ietf.org/html/rfc2428\nhttps://tools.ietf.org/html/rfc2228", + "declaration": "const (\n\t// 100 Series - The requested action is being initiated, expect another reply before\n\t// proceeding with a new command.\n\tStatusFileStatusOK = 150 // RFC 959, 4.2.1\n\n\t// 200 Series - The requested action has been successfully completed.\n\tStatusOK = 200 // RFC 959, 4.2.1\n\tStatusNotImplemented = 202 // RFC 959, 4.2.1\n\tStatusSystemStatus = 211 // RFC 959, 4.2.1\n\tStatusDirectoryStatus = 212 // RFC 959, 4.2.1\n\tStatusFileStatus = 213 // RFC 959, 4.2.1\n\tStatusHelpMessage = 214 // RFC 959, 4.2.1\n\tStatusSystemType = 215 // RFC 959, 4.2.1\n\tStatusServiceReady = 220 // RFC 959, 4.2.1\n\tStatusClosingControlConn = 221 // RFC 959, 4.2.1\n\tStatusClosingDataConn = 226 // RFC 959, 4.2.1\n\tStatusEnteringPASV = 227 // RFC 959, 4.2.1\n\tStatusEnteringEPSV = 229 // RFC 2428, 3\n\tStatusUserLoggedIn = 230 // RFC 959, 4.2.1\n\tStatusAuthAccepted = 234 // RFC 2228, 3\n\tStatusFileOK = 250 // RFC 959, 4.2.1\n\tStatusPathCreated = 257 // RFC 959, 4.2.1\n\n\t// 300 Series - The command has been accepted, but the requested action is on hold,\n\t// pending receipt of further information.\n\tStatusUserOK = 331 // RFC 959, 4.2.1\n\tStatusFileActionPending = 350 // RFC 959, 4.2.1\n\n\t// 400 Series - The command was not accepted and the requested action did not take place,\n\t// but the error condition is temporary and the action may be requested again.\n\tStatusServiceNotAvailable = 421 // RFC 959, 4.2.1\n\tStatusCannotOpenDataConnection = 425 // RFC 959, 4.2.1\n\tStatusTransferAborted = 426 // RFC 959, 4.2.1\n\tStatusFileActionNotTaken = 450 // RFC 959, 4.2.1\n\n\t// 500 Series - Syntax error, command unrecognized and the requested action did not take\n\t// place. This may include errors such as command line too long.\n\tStatusSyntaxErrorNotRecognised = 500 // RFC 959, 4.2.1\n\tStatusSyntaxErrorParameters = 501 // RFC 959, 4.2.1\n\tStatusCommandNotImplemented = 502 // RFC 959, 4.2.1\n\tStatusBadCommandSequence = 503 // RFC 959, 4.2.1\n\tStatusNotImplementedParam = 504 // RFC 959, 4.2.1\n\tStatusNotLoggedIn = 530 // RFC 959, 4.2.1\n\tStatusActionNotTaken = 550 // RFC 959, 4.2.1\n\tStatusActionAborted = 552 // RFC 959, 4.2.1\n\tStatusActionNotTakenNoFile = 553 // RFC 959, 4.2.1\n)", + "position": { + "file": "consts.go", + "line": 40 + } + }, + { + "name": "StatusCannotOpenDataConnection", + "doc": "Status codes as documented by:\nhttps://tools.ietf.org/html/rfc959\nhttps://tools.ietf.org/html/rfc2428\nhttps://tools.ietf.org/html/rfc2228", + "declaration": "const (\n\t// 100 Series - The requested action is being initiated, expect another reply before\n\t// proceeding with a new command.\n\tStatusFileStatusOK = 150 // RFC 959, 4.2.1\n\n\t// 200 Series - The requested action has been successfully completed.\n\tStatusOK = 200 // RFC 959, 4.2.1\n\tStatusNotImplemented = 202 // RFC 959, 4.2.1\n\tStatusSystemStatus = 211 // RFC 959, 4.2.1\n\tStatusDirectoryStatus = 212 // RFC 959, 4.2.1\n\tStatusFileStatus = 213 // RFC 959, 4.2.1\n\tStatusHelpMessage = 214 // RFC 959, 4.2.1\n\tStatusSystemType = 215 // RFC 959, 4.2.1\n\tStatusServiceReady = 220 // RFC 959, 4.2.1\n\tStatusClosingControlConn = 221 // RFC 959, 4.2.1\n\tStatusClosingDataConn = 226 // RFC 959, 4.2.1\n\tStatusEnteringPASV = 227 // RFC 959, 4.2.1\n\tStatusEnteringEPSV = 229 // RFC 2428, 3\n\tStatusUserLoggedIn = 230 // RFC 959, 4.2.1\n\tStatusAuthAccepted = 234 // RFC 2228, 3\n\tStatusFileOK = 250 // RFC 959, 4.2.1\n\tStatusPathCreated = 257 // RFC 959, 4.2.1\n\n\t// 300 Series - The command has been accepted, but the requested action is on hold,\n\t// pending receipt of further information.\n\tStatusUserOK = 331 // RFC 959, 4.2.1\n\tStatusFileActionPending = 350 // RFC 959, 4.2.1\n\n\t// 400 Series - The command was not accepted and the requested action did not take place,\n\t// but the error condition is temporary and the action may be requested again.\n\tStatusServiceNotAvailable = 421 // RFC 959, 4.2.1\n\tStatusCannotOpenDataConnection = 425 // RFC 959, 4.2.1\n\tStatusTransferAborted = 426 // RFC 959, 4.2.1\n\tStatusFileActionNotTaken = 450 // RFC 959, 4.2.1\n\n\t// 500 Series - Syntax error, command unrecognized and the requested action did not take\n\t// place. This may include errors such as command line too long.\n\tStatusSyntaxErrorNotRecognised = 500 // RFC 959, 4.2.1\n\tStatusSyntaxErrorParameters = 501 // RFC 959, 4.2.1\n\tStatusCommandNotImplemented = 502 // RFC 959, 4.2.1\n\tStatusBadCommandSequence = 503 // RFC 959, 4.2.1\n\tStatusNotImplementedParam = 504 // RFC 959, 4.2.1\n\tStatusNotLoggedIn = 530 // RFC 959, 4.2.1\n\tStatusActionNotTaken = 550 // RFC 959, 4.2.1\n\tStatusActionAborted = 552 // RFC 959, 4.2.1\n\tStatusActionNotTakenNoFile = 553 // RFC 959, 4.2.1\n)", + "position": { + "file": "consts.go", + "line": 41 + } + }, + { + "name": "StatusTransferAborted", + "doc": "Status codes as documented by:\nhttps://tools.ietf.org/html/rfc959\nhttps://tools.ietf.org/html/rfc2428\nhttps://tools.ietf.org/html/rfc2228", + "declaration": "const (\n\t// 100 Series - The requested action is being initiated, expect another reply before\n\t// proceeding with a new command.\n\tStatusFileStatusOK = 150 // RFC 959, 4.2.1\n\n\t// 200 Series - The requested action has been successfully completed.\n\tStatusOK = 200 // RFC 959, 4.2.1\n\tStatusNotImplemented = 202 // RFC 959, 4.2.1\n\tStatusSystemStatus = 211 // RFC 959, 4.2.1\n\tStatusDirectoryStatus = 212 // RFC 959, 4.2.1\n\tStatusFileStatus = 213 // RFC 959, 4.2.1\n\tStatusHelpMessage = 214 // RFC 959, 4.2.1\n\tStatusSystemType = 215 // RFC 959, 4.2.1\n\tStatusServiceReady = 220 // RFC 959, 4.2.1\n\tStatusClosingControlConn = 221 // RFC 959, 4.2.1\n\tStatusClosingDataConn = 226 // RFC 959, 4.2.1\n\tStatusEnteringPASV = 227 // RFC 959, 4.2.1\n\tStatusEnteringEPSV = 229 // RFC 2428, 3\n\tStatusUserLoggedIn = 230 // RFC 959, 4.2.1\n\tStatusAuthAccepted = 234 // RFC 2228, 3\n\tStatusFileOK = 250 // RFC 959, 4.2.1\n\tStatusPathCreated = 257 // RFC 959, 4.2.1\n\n\t// 300 Series - The command has been accepted, but the requested action is on hold,\n\t// pending receipt of further information.\n\tStatusUserOK = 331 // RFC 959, 4.2.1\n\tStatusFileActionPending = 350 // RFC 959, 4.2.1\n\n\t// 400 Series - The command was not accepted and the requested action did not take place,\n\t// but the error condition is temporary and the action may be requested again.\n\tStatusServiceNotAvailable = 421 // RFC 959, 4.2.1\n\tStatusCannotOpenDataConnection = 425 // RFC 959, 4.2.1\n\tStatusTransferAborted = 426 // RFC 959, 4.2.1\n\tStatusFileActionNotTaken = 450 // RFC 959, 4.2.1\n\n\t// 500 Series - Syntax error, command unrecognized and the requested action did not take\n\t// place. This may include errors such as command line too long.\n\tStatusSyntaxErrorNotRecognised = 500 // RFC 959, 4.2.1\n\tStatusSyntaxErrorParameters = 501 // RFC 959, 4.2.1\n\tStatusCommandNotImplemented = 502 // RFC 959, 4.2.1\n\tStatusBadCommandSequence = 503 // RFC 959, 4.2.1\n\tStatusNotImplementedParam = 504 // RFC 959, 4.2.1\n\tStatusNotLoggedIn = 530 // RFC 959, 4.2.1\n\tStatusActionNotTaken = 550 // RFC 959, 4.2.1\n\tStatusActionAborted = 552 // RFC 959, 4.2.1\n\tStatusActionNotTakenNoFile = 553 // RFC 959, 4.2.1\n)", + "position": { + "file": "consts.go", + "line": 42 + } + }, + { + "name": "StatusFileActionNotTaken", + "doc": "Status codes as documented by:\nhttps://tools.ietf.org/html/rfc959\nhttps://tools.ietf.org/html/rfc2428\nhttps://tools.ietf.org/html/rfc2228", + "declaration": "const (\n\t// 100 Series - The requested action is being initiated, expect another reply before\n\t// proceeding with a new command.\n\tStatusFileStatusOK = 150 // RFC 959, 4.2.1\n\n\t// 200 Series - The requested action has been successfully completed.\n\tStatusOK = 200 // RFC 959, 4.2.1\n\tStatusNotImplemented = 202 // RFC 959, 4.2.1\n\tStatusSystemStatus = 211 // RFC 959, 4.2.1\n\tStatusDirectoryStatus = 212 // RFC 959, 4.2.1\n\tStatusFileStatus = 213 // RFC 959, 4.2.1\n\tStatusHelpMessage = 214 // RFC 959, 4.2.1\n\tStatusSystemType = 215 // RFC 959, 4.2.1\n\tStatusServiceReady = 220 // RFC 959, 4.2.1\n\tStatusClosingControlConn = 221 // RFC 959, 4.2.1\n\tStatusClosingDataConn = 226 // RFC 959, 4.2.1\n\tStatusEnteringPASV = 227 // RFC 959, 4.2.1\n\tStatusEnteringEPSV = 229 // RFC 2428, 3\n\tStatusUserLoggedIn = 230 // RFC 959, 4.2.1\n\tStatusAuthAccepted = 234 // RFC 2228, 3\n\tStatusFileOK = 250 // RFC 959, 4.2.1\n\tStatusPathCreated = 257 // RFC 959, 4.2.1\n\n\t// 300 Series - The command has been accepted, but the requested action is on hold,\n\t// pending receipt of further information.\n\tStatusUserOK = 331 // RFC 959, 4.2.1\n\tStatusFileActionPending = 350 // RFC 959, 4.2.1\n\n\t// 400 Series - The command was not accepted and the requested action did not take place,\n\t// but the error condition is temporary and the action may be requested again.\n\tStatusServiceNotAvailable = 421 // RFC 959, 4.2.1\n\tStatusCannotOpenDataConnection = 425 // RFC 959, 4.2.1\n\tStatusTransferAborted = 426 // RFC 959, 4.2.1\n\tStatusFileActionNotTaken = 450 // RFC 959, 4.2.1\n\n\t// 500 Series - Syntax error, command unrecognized and the requested action did not take\n\t// place. This may include errors such as command line too long.\n\tStatusSyntaxErrorNotRecognised = 500 // RFC 959, 4.2.1\n\tStatusSyntaxErrorParameters = 501 // RFC 959, 4.2.1\n\tStatusCommandNotImplemented = 502 // RFC 959, 4.2.1\n\tStatusBadCommandSequence = 503 // RFC 959, 4.2.1\n\tStatusNotImplementedParam = 504 // RFC 959, 4.2.1\n\tStatusNotLoggedIn = 530 // RFC 959, 4.2.1\n\tStatusActionNotTaken = 550 // RFC 959, 4.2.1\n\tStatusActionAborted = 552 // RFC 959, 4.2.1\n\tStatusActionNotTakenNoFile = 553 // RFC 959, 4.2.1\n)", + "position": { + "file": "consts.go", + "line": 43 + } + }, + { + "name": "StatusSyntaxErrorNotRecognised", + "doc": "Status codes as documented by:\nhttps://tools.ietf.org/html/rfc959\nhttps://tools.ietf.org/html/rfc2428\nhttps://tools.ietf.org/html/rfc2228", + "declaration": "const (\n\t// 100 Series - The requested action is being initiated, expect another reply before\n\t// proceeding with a new command.\n\tStatusFileStatusOK = 150 // RFC 959, 4.2.1\n\n\t// 200 Series - The requested action has been successfully completed.\n\tStatusOK = 200 // RFC 959, 4.2.1\n\tStatusNotImplemented = 202 // RFC 959, 4.2.1\n\tStatusSystemStatus = 211 // RFC 959, 4.2.1\n\tStatusDirectoryStatus = 212 // RFC 959, 4.2.1\n\tStatusFileStatus = 213 // RFC 959, 4.2.1\n\tStatusHelpMessage = 214 // RFC 959, 4.2.1\n\tStatusSystemType = 215 // RFC 959, 4.2.1\n\tStatusServiceReady = 220 // RFC 959, 4.2.1\n\tStatusClosingControlConn = 221 // RFC 959, 4.2.1\n\tStatusClosingDataConn = 226 // RFC 959, 4.2.1\n\tStatusEnteringPASV = 227 // RFC 959, 4.2.1\n\tStatusEnteringEPSV = 229 // RFC 2428, 3\n\tStatusUserLoggedIn = 230 // RFC 959, 4.2.1\n\tStatusAuthAccepted = 234 // RFC 2228, 3\n\tStatusFileOK = 250 // RFC 959, 4.2.1\n\tStatusPathCreated = 257 // RFC 959, 4.2.1\n\n\t// 300 Series - The command has been accepted, but the requested action is on hold,\n\t// pending receipt of further information.\n\tStatusUserOK = 331 // RFC 959, 4.2.1\n\tStatusFileActionPending = 350 // RFC 959, 4.2.1\n\n\t// 400 Series - The command was not accepted and the requested action did not take place,\n\t// but the error condition is temporary and the action may be requested again.\n\tStatusServiceNotAvailable = 421 // RFC 959, 4.2.1\n\tStatusCannotOpenDataConnection = 425 // RFC 959, 4.2.1\n\tStatusTransferAborted = 426 // RFC 959, 4.2.1\n\tStatusFileActionNotTaken = 450 // RFC 959, 4.2.1\n\n\t// 500 Series - Syntax error, command unrecognized and the requested action did not take\n\t// place. This may include errors such as command line too long.\n\tStatusSyntaxErrorNotRecognised = 500 // RFC 959, 4.2.1\n\tStatusSyntaxErrorParameters = 501 // RFC 959, 4.2.1\n\tStatusCommandNotImplemented = 502 // RFC 959, 4.2.1\n\tStatusBadCommandSequence = 503 // RFC 959, 4.2.1\n\tStatusNotImplementedParam = 504 // RFC 959, 4.2.1\n\tStatusNotLoggedIn = 530 // RFC 959, 4.2.1\n\tStatusActionNotTaken = 550 // RFC 959, 4.2.1\n\tStatusActionAborted = 552 // RFC 959, 4.2.1\n\tStatusActionNotTakenNoFile = 553 // RFC 959, 4.2.1\n)", + "position": { + "file": "consts.go", + "line": 47 + } + }, + { + "name": "StatusSyntaxErrorParameters", + "doc": "Status codes as documented by:\nhttps://tools.ietf.org/html/rfc959\nhttps://tools.ietf.org/html/rfc2428\nhttps://tools.ietf.org/html/rfc2228", + "declaration": "const (\n\t// 100 Series - The requested action is being initiated, expect another reply before\n\t// proceeding with a new command.\n\tStatusFileStatusOK = 150 // RFC 959, 4.2.1\n\n\t// 200 Series - The requested action has been successfully completed.\n\tStatusOK = 200 // RFC 959, 4.2.1\n\tStatusNotImplemented = 202 // RFC 959, 4.2.1\n\tStatusSystemStatus = 211 // RFC 959, 4.2.1\n\tStatusDirectoryStatus = 212 // RFC 959, 4.2.1\n\tStatusFileStatus = 213 // RFC 959, 4.2.1\n\tStatusHelpMessage = 214 // RFC 959, 4.2.1\n\tStatusSystemType = 215 // RFC 959, 4.2.1\n\tStatusServiceReady = 220 // RFC 959, 4.2.1\n\tStatusClosingControlConn = 221 // RFC 959, 4.2.1\n\tStatusClosingDataConn = 226 // RFC 959, 4.2.1\n\tStatusEnteringPASV = 227 // RFC 959, 4.2.1\n\tStatusEnteringEPSV = 229 // RFC 2428, 3\n\tStatusUserLoggedIn = 230 // RFC 959, 4.2.1\n\tStatusAuthAccepted = 234 // RFC 2228, 3\n\tStatusFileOK = 250 // RFC 959, 4.2.1\n\tStatusPathCreated = 257 // RFC 959, 4.2.1\n\n\t// 300 Series - The command has been accepted, but the requested action is on hold,\n\t// pending receipt of further information.\n\tStatusUserOK = 331 // RFC 959, 4.2.1\n\tStatusFileActionPending = 350 // RFC 959, 4.2.1\n\n\t// 400 Series - The command was not accepted and the requested action did not take place,\n\t// but the error condition is temporary and the action may be requested again.\n\tStatusServiceNotAvailable = 421 // RFC 959, 4.2.1\n\tStatusCannotOpenDataConnection = 425 // RFC 959, 4.2.1\n\tStatusTransferAborted = 426 // RFC 959, 4.2.1\n\tStatusFileActionNotTaken = 450 // RFC 959, 4.2.1\n\n\t// 500 Series - Syntax error, command unrecognized and the requested action did not take\n\t// place. This may include errors such as command line too long.\n\tStatusSyntaxErrorNotRecognised = 500 // RFC 959, 4.2.1\n\tStatusSyntaxErrorParameters = 501 // RFC 959, 4.2.1\n\tStatusCommandNotImplemented = 502 // RFC 959, 4.2.1\n\tStatusBadCommandSequence = 503 // RFC 959, 4.2.1\n\tStatusNotImplementedParam = 504 // RFC 959, 4.2.1\n\tStatusNotLoggedIn = 530 // RFC 959, 4.2.1\n\tStatusActionNotTaken = 550 // RFC 959, 4.2.1\n\tStatusActionAborted = 552 // RFC 959, 4.2.1\n\tStatusActionNotTakenNoFile = 553 // RFC 959, 4.2.1\n)", + "position": { + "file": "consts.go", + "line": 48 + } + }, + { + "name": "StatusCommandNotImplemented", + "doc": "Status codes as documented by:\nhttps://tools.ietf.org/html/rfc959\nhttps://tools.ietf.org/html/rfc2428\nhttps://tools.ietf.org/html/rfc2228", + "declaration": "const (\n\t// 100 Series - The requested action is being initiated, expect another reply before\n\t// proceeding with a new command.\n\tStatusFileStatusOK = 150 // RFC 959, 4.2.1\n\n\t// 200 Series - The requested action has been successfully completed.\n\tStatusOK = 200 // RFC 959, 4.2.1\n\tStatusNotImplemented = 202 // RFC 959, 4.2.1\n\tStatusSystemStatus = 211 // RFC 959, 4.2.1\n\tStatusDirectoryStatus = 212 // RFC 959, 4.2.1\n\tStatusFileStatus = 213 // RFC 959, 4.2.1\n\tStatusHelpMessage = 214 // RFC 959, 4.2.1\n\tStatusSystemType = 215 // RFC 959, 4.2.1\n\tStatusServiceReady = 220 // RFC 959, 4.2.1\n\tStatusClosingControlConn = 221 // RFC 959, 4.2.1\n\tStatusClosingDataConn = 226 // RFC 959, 4.2.1\n\tStatusEnteringPASV = 227 // RFC 959, 4.2.1\n\tStatusEnteringEPSV = 229 // RFC 2428, 3\n\tStatusUserLoggedIn = 230 // RFC 959, 4.2.1\n\tStatusAuthAccepted = 234 // RFC 2228, 3\n\tStatusFileOK = 250 // RFC 959, 4.2.1\n\tStatusPathCreated = 257 // RFC 959, 4.2.1\n\n\t// 300 Series - The command has been accepted, but the requested action is on hold,\n\t// pending receipt of further information.\n\tStatusUserOK = 331 // RFC 959, 4.2.1\n\tStatusFileActionPending = 350 // RFC 959, 4.2.1\n\n\t// 400 Series - The command was not accepted and the requested action did not take place,\n\t// but the error condition is temporary and the action may be requested again.\n\tStatusServiceNotAvailable = 421 // RFC 959, 4.2.1\n\tStatusCannotOpenDataConnection = 425 // RFC 959, 4.2.1\n\tStatusTransferAborted = 426 // RFC 959, 4.2.1\n\tStatusFileActionNotTaken = 450 // RFC 959, 4.2.1\n\n\t// 500 Series - Syntax error, command unrecognized and the requested action did not take\n\t// place. This may include errors such as command line too long.\n\tStatusSyntaxErrorNotRecognised = 500 // RFC 959, 4.2.1\n\tStatusSyntaxErrorParameters = 501 // RFC 959, 4.2.1\n\tStatusCommandNotImplemented = 502 // RFC 959, 4.2.1\n\tStatusBadCommandSequence = 503 // RFC 959, 4.2.1\n\tStatusNotImplementedParam = 504 // RFC 959, 4.2.1\n\tStatusNotLoggedIn = 530 // RFC 959, 4.2.1\n\tStatusActionNotTaken = 550 // RFC 959, 4.2.1\n\tStatusActionAborted = 552 // RFC 959, 4.2.1\n\tStatusActionNotTakenNoFile = 553 // RFC 959, 4.2.1\n)", + "position": { + "file": "consts.go", + "line": 49 + } + }, + { + "name": "StatusBadCommandSequence", + "doc": "Status codes as documented by:\nhttps://tools.ietf.org/html/rfc959\nhttps://tools.ietf.org/html/rfc2428\nhttps://tools.ietf.org/html/rfc2228", + "declaration": "const (\n\t// 100 Series - The requested action is being initiated, expect another reply before\n\t// proceeding with a new command.\n\tStatusFileStatusOK = 150 // RFC 959, 4.2.1\n\n\t// 200 Series - The requested action has been successfully completed.\n\tStatusOK = 200 // RFC 959, 4.2.1\n\tStatusNotImplemented = 202 // RFC 959, 4.2.1\n\tStatusSystemStatus = 211 // RFC 959, 4.2.1\n\tStatusDirectoryStatus = 212 // RFC 959, 4.2.1\n\tStatusFileStatus = 213 // RFC 959, 4.2.1\n\tStatusHelpMessage = 214 // RFC 959, 4.2.1\n\tStatusSystemType = 215 // RFC 959, 4.2.1\n\tStatusServiceReady = 220 // RFC 959, 4.2.1\n\tStatusClosingControlConn = 221 // RFC 959, 4.2.1\n\tStatusClosingDataConn = 226 // RFC 959, 4.2.1\n\tStatusEnteringPASV = 227 // RFC 959, 4.2.1\n\tStatusEnteringEPSV = 229 // RFC 2428, 3\n\tStatusUserLoggedIn = 230 // RFC 959, 4.2.1\n\tStatusAuthAccepted = 234 // RFC 2228, 3\n\tStatusFileOK = 250 // RFC 959, 4.2.1\n\tStatusPathCreated = 257 // RFC 959, 4.2.1\n\n\t// 300 Series - The command has been accepted, but the requested action is on hold,\n\t// pending receipt of further information.\n\tStatusUserOK = 331 // RFC 959, 4.2.1\n\tStatusFileActionPending = 350 // RFC 959, 4.2.1\n\n\t// 400 Series - The command was not accepted and the requested action did not take place,\n\t// but the error condition is temporary and the action may be requested again.\n\tStatusServiceNotAvailable = 421 // RFC 959, 4.2.1\n\tStatusCannotOpenDataConnection = 425 // RFC 959, 4.2.1\n\tStatusTransferAborted = 426 // RFC 959, 4.2.1\n\tStatusFileActionNotTaken = 450 // RFC 959, 4.2.1\n\n\t// 500 Series - Syntax error, command unrecognized and the requested action did not take\n\t// place. This may include errors such as command line too long.\n\tStatusSyntaxErrorNotRecognised = 500 // RFC 959, 4.2.1\n\tStatusSyntaxErrorParameters = 501 // RFC 959, 4.2.1\n\tStatusCommandNotImplemented = 502 // RFC 959, 4.2.1\n\tStatusBadCommandSequence = 503 // RFC 959, 4.2.1\n\tStatusNotImplementedParam = 504 // RFC 959, 4.2.1\n\tStatusNotLoggedIn = 530 // RFC 959, 4.2.1\n\tStatusActionNotTaken = 550 // RFC 959, 4.2.1\n\tStatusActionAborted = 552 // RFC 959, 4.2.1\n\tStatusActionNotTakenNoFile = 553 // RFC 959, 4.2.1\n)", + "position": { + "file": "consts.go", + "line": 50 + } + }, + { + "name": "StatusNotImplementedParam", + "doc": "Status codes as documented by:\nhttps://tools.ietf.org/html/rfc959\nhttps://tools.ietf.org/html/rfc2428\nhttps://tools.ietf.org/html/rfc2228", + "declaration": "const (\n\t// 100 Series - The requested action is being initiated, expect another reply before\n\t// proceeding with a new command.\n\tStatusFileStatusOK = 150 // RFC 959, 4.2.1\n\n\t// 200 Series - The requested action has been successfully completed.\n\tStatusOK = 200 // RFC 959, 4.2.1\n\tStatusNotImplemented = 202 // RFC 959, 4.2.1\n\tStatusSystemStatus = 211 // RFC 959, 4.2.1\n\tStatusDirectoryStatus = 212 // RFC 959, 4.2.1\n\tStatusFileStatus = 213 // RFC 959, 4.2.1\n\tStatusHelpMessage = 214 // RFC 959, 4.2.1\n\tStatusSystemType = 215 // RFC 959, 4.2.1\n\tStatusServiceReady = 220 // RFC 959, 4.2.1\n\tStatusClosingControlConn = 221 // RFC 959, 4.2.1\n\tStatusClosingDataConn = 226 // RFC 959, 4.2.1\n\tStatusEnteringPASV = 227 // RFC 959, 4.2.1\n\tStatusEnteringEPSV = 229 // RFC 2428, 3\n\tStatusUserLoggedIn = 230 // RFC 959, 4.2.1\n\tStatusAuthAccepted = 234 // RFC 2228, 3\n\tStatusFileOK = 250 // RFC 959, 4.2.1\n\tStatusPathCreated = 257 // RFC 959, 4.2.1\n\n\t// 300 Series - The command has been accepted, but the requested action is on hold,\n\t// pending receipt of further information.\n\tStatusUserOK = 331 // RFC 959, 4.2.1\n\tStatusFileActionPending = 350 // RFC 959, 4.2.1\n\n\t// 400 Series - The command was not accepted and the requested action did not take place,\n\t// but the error condition is temporary and the action may be requested again.\n\tStatusServiceNotAvailable = 421 // RFC 959, 4.2.1\n\tStatusCannotOpenDataConnection = 425 // RFC 959, 4.2.1\n\tStatusTransferAborted = 426 // RFC 959, 4.2.1\n\tStatusFileActionNotTaken = 450 // RFC 959, 4.2.1\n\n\t// 500 Series - Syntax error, command unrecognized and the requested action did not take\n\t// place. This may include errors such as command line too long.\n\tStatusSyntaxErrorNotRecognised = 500 // RFC 959, 4.2.1\n\tStatusSyntaxErrorParameters = 501 // RFC 959, 4.2.1\n\tStatusCommandNotImplemented = 502 // RFC 959, 4.2.1\n\tStatusBadCommandSequence = 503 // RFC 959, 4.2.1\n\tStatusNotImplementedParam = 504 // RFC 959, 4.2.1\n\tStatusNotLoggedIn = 530 // RFC 959, 4.2.1\n\tStatusActionNotTaken = 550 // RFC 959, 4.2.1\n\tStatusActionAborted = 552 // RFC 959, 4.2.1\n\tStatusActionNotTakenNoFile = 553 // RFC 959, 4.2.1\n)", + "position": { + "file": "consts.go", + "line": 51 + } + }, + { + "name": "StatusNotLoggedIn", + "doc": "Status codes as documented by:\nhttps://tools.ietf.org/html/rfc959\nhttps://tools.ietf.org/html/rfc2428\nhttps://tools.ietf.org/html/rfc2228", + "declaration": "const (\n\t// 100 Series - The requested action is being initiated, expect another reply before\n\t// proceeding with a new command.\n\tStatusFileStatusOK = 150 // RFC 959, 4.2.1\n\n\t// 200 Series - The requested action has been successfully completed.\n\tStatusOK = 200 // RFC 959, 4.2.1\n\tStatusNotImplemented = 202 // RFC 959, 4.2.1\n\tStatusSystemStatus = 211 // RFC 959, 4.2.1\n\tStatusDirectoryStatus = 212 // RFC 959, 4.2.1\n\tStatusFileStatus = 213 // RFC 959, 4.2.1\n\tStatusHelpMessage = 214 // RFC 959, 4.2.1\n\tStatusSystemType = 215 // RFC 959, 4.2.1\n\tStatusServiceReady = 220 // RFC 959, 4.2.1\n\tStatusClosingControlConn = 221 // RFC 959, 4.2.1\n\tStatusClosingDataConn = 226 // RFC 959, 4.2.1\n\tStatusEnteringPASV = 227 // RFC 959, 4.2.1\n\tStatusEnteringEPSV = 229 // RFC 2428, 3\n\tStatusUserLoggedIn = 230 // RFC 959, 4.2.1\n\tStatusAuthAccepted = 234 // RFC 2228, 3\n\tStatusFileOK = 250 // RFC 959, 4.2.1\n\tStatusPathCreated = 257 // RFC 959, 4.2.1\n\n\t// 300 Series - The command has been accepted, but the requested action is on hold,\n\t// pending receipt of further information.\n\tStatusUserOK = 331 // RFC 959, 4.2.1\n\tStatusFileActionPending = 350 // RFC 959, 4.2.1\n\n\t// 400 Series - The command was not accepted and the requested action did not take place,\n\t// but the error condition is temporary and the action may be requested again.\n\tStatusServiceNotAvailable = 421 // RFC 959, 4.2.1\n\tStatusCannotOpenDataConnection = 425 // RFC 959, 4.2.1\n\tStatusTransferAborted = 426 // RFC 959, 4.2.1\n\tStatusFileActionNotTaken = 450 // RFC 959, 4.2.1\n\n\t// 500 Series - Syntax error, command unrecognized and the requested action did not take\n\t// place. This may include errors such as command line too long.\n\tStatusSyntaxErrorNotRecognised = 500 // RFC 959, 4.2.1\n\tStatusSyntaxErrorParameters = 501 // RFC 959, 4.2.1\n\tStatusCommandNotImplemented = 502 // RFC 959, 4.2.1\n\tStatusBadCommandSequence = 503 // RFC 959, 4.2.1\n\tStatusNotImplementedParam = 504 // RFC 959, 4.2.1\n\tStatusNotLoggedIn = 530 // RFC 959, 4.2.1\n\tStatusActionNotTaken = 550 // RFC 959, 4.2.1\n\tStatusActionAborted = 552 // RFC 959, 4.2.1\n\tStatusActionNotTakenNoFile = 553 // RFC 959, 4.2.1\n)", + "position": { + "file": "consts.go", + "line": 52 + } + }, + { + "name": "StatusActionNotTaken", + "doc": "Status codes as documented by:\nhttps://tools.ietf.org/html/rfc959\nhttps://tools.ietf.org/html/rfc2428\nhttps://tools.ietf.org/html/rfc2228", + "declaration": "const (\n\t// 100 Series - The requested action is being initiated, expect another reply before\n\t// proceeding with a new command.\n\tStatusFileStatusOK = 150 // RFC 959, 4.2.1\n\n\t// 200 Series - The requested action has been successfully completed.\n\tStatusOK = 200 // RFC 959, 4.2.1\n\tStatusNotImplemented = 202 // RFC 959, 4.2.1\n\tStatusSystemStatus = 211 // RFC 959, 4.2.1\n\tStatusDirectoryStatus = 212 // RFC 959, 4.2.1\n\tStatusFileStatus = 213 // RFC 959, 4.2.1\n\tStatusHelpMessage = 214 // RFC 959, 4.2.1\n\tStatusSystemType = 215 // RFC 959, 4.2.1\n\tStatusServiceReady = 220 // RFC 959, 4.2.1\n\tStatusClosingControlConn = 221 // RFC 959, 4.2.1\n\tStatusClosingDataConn = 226 // RFC 959, 4.2.1\n\tStatusEnteringPASV = 227 // RFC 959, 4.2.1\n\tStatusEnteringEPSV = 229 // RFC 2428, 3\n\tStatusUserLoggedIn = 230 // RFC 959, 4.2.1\n\tStatusAuthAccepted = 234 // RFC 2228, 3\n\tStatusFileOK = 250 // RFC 959, 4.2.1\n\tStatusPathCreated = 257 // RFC 959, 4.2.1\n\n\t// 300 Series - The command has been accepted, but the requested action is on hold,\n\t// pending receipt of further information.\n\tStatusUserOK = 331 // RFC 959, 4.2.1\n\tStatusFileActionPending = 350 // RFC 959, 4.2.1\n\n\t// 400 Series - The command was not accepted and the requested action did not take place,\n\t// but the error condition is temporary and the action may be requested again.\n\tStatusServiceNotAvailable = 421 // RFC 959, 4.2.1\n\tStatusCannotOpenDataConnection = 425 // RFC 959, 4.2.1\n\tStatusTransferAborted = 426 // RFC 959, 4.2.1\n\tStatusFileActionNotTaken = 450 // RFC 959, 4.2.1\n\n\t// 500 Series - Syntax error, command unrecognized and the requested action did not take\n\t// place. This may include errors such as command line too long.\n\tStatusSyntaxErrorNotRecognised = 500 // RFC 959, 4.2.1\n\tStatusSyntaxErrorParameters = 501 // RFC 959, 4.2.1\n\tStatusCommandNotImplemented = 502 // RFC 959, 4.2.1\n\tStatusBadCommandSequence = 503 // RFC 959, 4.2.1\n\tStatusNotImplementedParam = 504 // RFC 959, 4.2.1\n\tStatusNotLoggedIn = 530 // RFC 959, 4.2.1\n\tStatusActionNotTaken = 550 // RFC 959, 4.2.1\n\tStatusActionAborted = 552 // RFC 959, 4.2.1\n\tStatusActionNotTakenNoFile = 553 // RFC 959, 4.2.1\n)", + "position": { + "file": "consts.go", + "line": 53 + } + }, + { + "name": "StatusActionAborted", + "doc": "Status codes as documented by:\nhttps://tools.ietf.org/html/rfc959\nhttps://tools.ietf.org/html/rfc2428\nhttps://tools.ietf.org/html/rfc2228", + "declaration": "const (\n\t// 100 Series - The requested action is being initiated, expect another reply before\n\t// proceeding with a new command.\n\tStatusFileStatusOK = 150 // RFC 959, 4.2.1\n\n\t// 200 Series - The requested action has been successfully completed.\n\tStatusOK = 200 // RFC 959, 4.2.1\n\tStatusNotImplemented = 202 // RFC 959, 4.2.1\n\tStatusSystemStatus = 211 // RFC 959, 4.2.1\n\tStatusDirectoryStatus = 212 // RFC 959, 4.2.1\n\tStatusFileStatus = 213 // RFC 959, 4.2.1\n\tStatusHelpMessage = 214 // RFC 959, 4.2.1\n\tStatusSystemType = 215 // RFC 959, 4.2.1\n\tStatusServiceReady = 220 // RFC 959, 4.2.1\n\tStatusClosingControlConn = 221 // RFC 959, 4.2.1\n\tStatusClosingDataConn = 226 // RFC 959, 4.2.1\n\tStatusEnteringPASV = 227 // RFC 959, 4.2.1\n\tStatusEnteringEPSV = 229 // RFC 2428, 3\n\tStatusUserLoggedIn = 230 // RFC 959, 4.2.1\n\tStatusAuthAccepted = 234 // RFC 2228, 3\n\tStatusFileOK = 250 // RFC 959, 4.2.1\n\tStatusPathCreated = 257 // RFC 959, 4.2.1\n\n\t// 300 Series - The command has been accepted, but the requested action is on hold,\n\t// pending receipt of further information.\n\tStatusUserOK = 331 // RFC 959, 4.2.1\n\tStatusFileActionPending = 350 // RFC 959, 4.2.1\n\n\t// 400 Series - The command was not accepted and the requested action did not take place,\n\t// but the error condition is temporary and the action may be requested again.\n\tStatusServiceNotAvailable = 421 // RFC 959, 4.2.1\n\tStatusCannotOpenDataConnection = 425 // RFC 959, 4.2.1\n\tStatusTransferAborted = 426 // RFC 959, 4.2.1\n\tStatusFileActionNotTaken = 450 // RFC 959, 4.2.1\n\n\t// 500 Series - Syntax error, command unrecognized and the requested action did not take\n\t// place. This may include errors such as command line too long.\n\tStatusSyntaxErrorNotRecognised = 500 // RFC 959, 4.2.1\n\tStatusSyntaxErrorParameters = 501 // RFC 959, 4.2.1\n\tStatusCommandNotImplemented = 502 // RFC 959, 4.2.1\n\tStatusBadCommandSequence = 503 // RFC 959, 4.2.1\n\tStatusNotImplementedParam = 504 // RFC 959, 4.2.1\n\tStatusNotLoggedIn = 530 // RFC 959, 4.2.1\n\tStatusActionNotTaken = 550 // RFC 959, 4.2.1\n\tStatusActionAborted = 552 // RFC 959, 4.2.1\n\tStatusActionNotTakenNoFile = 553 // RFC 959, 4.2.1\n)", + "position": { + "file": "consts.go", + "line": 54 + } + }, + { + "name": "StatusActionNotTakenNoFile", + "doc": "Status codes as documented by:\nhttps://tools.ietf.org/html/rfc959\nhttps://tools.ietf.org/html/rfc2428\nhttps://tools.ietf.org/html/rfc2228", + "declaration": "const (\n\t// 100 Series - The requested action is being initiated, expect another reply before\n\t// proceeding with a new command.\n\tStatusFileStatusOK = 150 // RFC 959, 4.2.1\n\n\t// 200 Series - The requested action has been successfully completed.\n\tStatusOK = 200 // RFC 959, 4.2.1\n\tStatusNotImplemented = 202 // RFC 959, 4.2.1\n\tStatusSystemStatus = 211 // RFC 959, 4.2.1\n\tStatusDirectoryStatus = 212 // RFC 959, 4.2.1\n\tStatusFileStatus = 213 // RFC 959, 4.2.1\n\tStatusHelpMessage = 214 // RFC 959, 4.2.1\n\tStatusSystemType = 215 // RFC 959, 4.2.1\n\tStatusServiceReady = 220 // RFC 959, 4.2.1\n\tStatusClosingControlConn = 221 // RFC 959, 4.2.1\n\tStatusClosingDataConn = 226 // RFC 959, 4.2.1\n\tStatusEnteringPASV = 227 // RFC 959, 4.2.1\n\tStatusEnteringEPSV = 229 // RFC 2428, 3\n\tStatusUserLoggedIn = 230 // RFC 959, 4.2.1\n\tStatusAuthAccepted = 234 // RFC 2228, 3\n\tStatusFileOK = 250 // RFC 959, 4.2.1\n\tStatusPathCreated = 257 // RFC 959, 4.2.1\n\n\t// 300 Series - The command has been accepted, but the requested action is on hold,\n\t// pending receipt of further information.\n\tStatusUserOK = 331 // RFC 959, 4.2.1\n\tStatusFileActionPending = 350 // RFC 959, 4.2.1\n\n\t// 400 Series - The command was not accepted and the requested action did not take place,\n\t// but the error condition is temporary and the action may be requested again.\n\tStatusServiceNotAvailable = 421 // RFC 959, 4.2.1\n\tStatusCannotOpenDataConnection = 425 // RFC 959, 4.2.1\n\tStatusTransferAborted = 426 // RFC 959, 4.2.1\n\tStatusFileActionNotTaken = 450 // RFC 959, 4.2.1\n\n\t// 500 Series - Syntax error, command unrecognized and the requested action did not take\n\t// place. This may include errors such as command line too long.\n\tStatusSyntaxErrorNotRecognised = 500 // RFC 959, 4.2.1\n\tStatusSyntaxErrorParameters = 501 // RFC 959, 4.2.1\n\tStatusCommandNotImplemented = 502 // RFC 959, 4.2.1\n\tStatusBadCommandSequence = 503 // RFC 959, 4.2.1\n\tStatusNotImplementedParam = 504 // RFC 959, 4.2.1\n\tStatusNotLoggedIn = 530 // RFC 959, 4.2.1\n\tStatusActionNotTaken = 550 // RFC 959, 4.2.1\n\tStatusActionAborted = 552 // RFC 959, 4.2.1\n\tStatusActionNotTakenNoFile = 553 // RFC 959, 4.2.1\n)", + "position": { + "file": "consts.go", + "line": 55 + } + }, + { + "name": "DataChannelPassive", + "doc": "Supported data channel types", + "declaration": "const (\n\tDataChannelPassive DataChannel = iota + 1\n\tDataChannelActive\n)", + "position": { + "file": "client_handler.go", + "line": 53 + } + }, + { + "name": "DataChannelActive", + "doc": "Supported data channel types", + "declaration": "const (\n\tDataChannelPassive DataChannel = iota + 1\n\tDataChannelActive\n)", + "position": { + "file": "client_handler.go", + "line": 54 + } + }, + { + "name": "IPMatchRequired", + "doc": "Supported data connection requirements", + "declaration": "const (\n\t// IPMatchRequired requires matching peer IP addresses of control and data connection\n\tIPMatchRequired DataConnectionRequirement = iota\n\t// IPMatchDisabled disables checking peer IP addresses of control and data connection\n\tIPMatchDisabled\n)", + "position": { + "file": "driver.go", + "line": 335 + } + }, + { + "name": "IPMatchDisabled", + "doc": "Supported data connection requirements", + "declaration": "const (\n\t// IPMatchRequired requires matching peer IP addresses of control and data connection\n\tIPMatchRequired DataConnectionRequirement = iota\n\t// IPMatchDisabled disables checking peer IP addresses of control and data connection\n\tIPMatchDisabled\n)", + "position": { + "file": "driver.go", + "line": 337 + } + }, + { + "name": "HASHAlgoCRC32", + "doc": "Supported hash algorithms", + "declaration": "const (\n\tHASHAlgoCRC32 HASHAlgo = iota\n\tHASHAlgoMD5\n\tHASHAlgoSHA1\n\tHASHAlgoSHA256\n\tHASHAlgoSHA512\n)", + "position": { + "file": "client_handler.go", + "line": 21 + } + }, + { + "name": "HASHAlgoMD5", + "doc": "Supported hash algorithms", + "declaration": "const (\n\tHASHAlgoCRC32 HASHAlgo = iota\n\tHASHAlgoMD5\n\tHASHAlgoSHA1\n\tHASHAlgoSHA256\n\tHASHAlgoSHA512\n)", + "position": { + "file": "client_handler.go", + "line": 22 + } + }, + { + "name": "HASHAlgoSHA1", + "doc": "Supported hash algorithms", + "declaration": "const (\n\tHASHAlgoCRC32 HASHAlgo = iota\n\tHASHAlgoMD5\n\tHASHAlgoSHA1\n\tHASHAlgoSHA256\n\tHASHAlgoSHA512\n)", + "position": { + "file": "client_handler.go", + "line": 23 + } + }, + { + "name": "HASHAlgoSHA256", + "doc": "Supported hash algorithms", + "declaration": "const (\n\tHASHAlgoCRC32 HASHAlgo = iota\n\tHASHAlgoMD5\n\tHASHAlgoSHA1\n\tHASHAlgoSHA256\n\tHASHAlgoSHA512\n)", + "position": { + "file": "client_handler.go", + "line": 24 + } + }, + { + "name": "HASHAlgoSHA512", + "doc": "Supported hash algorithms", + "declaration": "const (\n\tHASHAlgoCRC32 HASHAlgo = iota\n\tHASHAlgoMD5\n\tHASHAlgoSHA1\n\tHASHAlgoSHA256\n\tHASHAlgoSHA512\n)", + "position": { + "file": "client_handler.go", + "line": 25 + } + }, + { + "name": "ClearOrEncrypted", + "doc": "TLS modes", + "declaration": "const (\n\tClearOrEncrypted TLSRequirement = iota\n\tMandatoryEncryption\n\tImplicitEncryption\n)", + "position": { + "file": "driver.go", + "line": 323 + } + }, + { + "name": "MandatoryEncryption", + "doc": "TLS modes", + "declaration": "const (\n\tClearOrEncrypted TLSRequirement = iota\n\tMandatoryEncryption\n\tImplicitEncryption\n)", + "position": { + "file": "driver.go", + "line": 324 + } + }, + { + "name": "ImplicitEncryption", + "doc": "TLS modes", + "declaration": "const (\n\tClearOrEncrypted TLSRequirement = iota\n\tMandatoryEncryption\n\tImplicitEncryption\n)", + "position": { + "file": "driver.go", + "line": 325 + } + }, + { + "name": "TransferModeStream", + "doc": "Transfer modes", + "declaration": "const (\n\t// TransferModeStream is the standard uncompressed transfer mode\n\tTransferModeStream TransferMode = iota\n\t// TransferModeDeflate is the compressed transfer mode using deflate algorithm\n\tTransferModeDeflate\n)", + "position": { + "file": "client_handler.go", + "line": 43 + } + }, + { + "name": "TransferModeDeflate", + "doc": "Transfer modes", + "declaration": "const (\n\t// TransferModeStream is the standard uncompressed transfer mode\n\tTransferModeStream TransferMode = iota\n\t// TransferModeDeflate is the compressed transfer mode using deflate algorithm\n\tTransferModeDeflate\n)", + "position": { + "file": "client_handler.go", + "line": 45 + } + }, + { + "name": "TransferTypeASCII", + "doc": "Supported transfer type", + "declaration": "const (\n\tTransferTypeASCII TransferType = iota\n\tTransferTypeBinary\n)", + "position": { + "file": "client_handler.go", + "line": 33 + } + }, + { + "name": "TransferTypeBinary", + "doc": "Supported transfer type", + "declaration": "const (\n\tTransferTypeASCII TransferType = iota\n\tTransferTypeBinary\n)", + "position": { + "file": "client_handler.go", + "line": 34 + } + } + ], + "vars": [ + { + "name": "ErrStorageExceeded", + "doc": "", + "declaration": "var (\n\t// ErrStorageExceeded defines the error mapped to the FTP 552 reply code.\n\t// As for RFC 959 this error is checked for STOR, APPE\n\tErrStorageExceeded = errors.New(\"storage limit exceeded\")\n\t// ErrFileNameNotAllowed defines the error mapped to the FTP 553 reply code.\n\t// As for RFC 959 this error is checked for STOR, APPE, RNTO\n\tErrFileNameNotAllowed = errors.New(\"filename not allowed\")\n)", + "position": { + "file": "errors.go", + "line": 11 + } + }, + { + "name": "ErrFileNameNotAllowed", + "doc": "", + "declaration": "var (\n\t// ErrStorageExceeded defines the error mapped to the FTP 552 reply code.\n\t// As for RFC 959 this error is checked for STOR, APPE\n\tErrStorageExceeded = errors.New(\"storage limit exceeded\")\n\t// ErrFileNameNotAllowed defines the error mapped to the FTP 553 reply code.\n\t// As for RFC 959 this error is checked for STOR, APPE, RNTO\n\tErrFileNameNotAllowed = errors.New(\"filename not allowed\")\n)", + "position": { + "file": "errors.go", + "line": 14 + } + }, + { + "name": "ErrNoAvailableListeningPort", + "doc": "ErrNoAvailableListeningPort is returned when no port could be found to accept incoming connection", + "declaration": "var ErrNoAvailableListeningPort = errors.New(\"could not find any port to listen to\")", + "position": { + "file": "transfer_pasv.go", + "line": 81 + } + }, + { + "name": "ErrNotListening", + "doc": "ErrNotListening is returned when we are performing an action that is only valid while listening", + "declaration": "var ErrNotListening = errors.New(\"we aren't listening\")", + "position": { + "file": "server.go", + "line": 18 + } + }, + { + "name": "ErrRemoteAddrFormat", + "doc": "ErrRemoteAddrFormat is returned when the remote address has a bad format", + "declaration": "var ErrRemoteAddrFormat = errors.New(\"remote address has a bad format\")", + "position": { + "file": "transfer_active.go", + "line": 133 + } + } + ], + "funcs": [ + { + "name": "Control", + "doc": "Control defines the function to use as dialer Control to reuse the same port/address", + "signature": "func Control(network, address string, c syscall.RawConn) error", + "position": { + "file": "control_windows.go", + "line": 10 + }, + "examples": [] + }, + { + "name": "NewFtpServer", + "doc": "NewFtpServer creates a new FtpServer instance", + "signature": "func NewFtpServer(driver MainDriver) *FtpServer", + "position": { + "file": "server.go", + "line": 346 + }, + "examples": [] + } + ], + "types": [ + { + "name": "AnswerCommand", + "doc": "AnswerCommand is a struct to answer a command to the client", + "declaration": "type AnswerCommand struct {\n\tCode int\n\tMessage string\n}", + "kind": "struct", + "position": { + "file": "driver.go", + "line": 136 + }, + "fields": [ + { + "name": "Code", + "doc": "", + "type": "int" + }, + { + "name": "Message", + "doc": "", + "type": "string" + } + ], + "methods": [], + "examples": [] + }, + { + "name": "ClientContext", + "doc": "ClientContext is implemented on the server side to provide some access to few data around the client", + "declaration": "type ClientContext interface {\n\t// Path provides the path of the current connection\n\tPath() string\n\n\t// SetPath sets the path of the current connection.\n\t// This method is useful to set a start directory, you should use it before returning a successful\n\t// authentication response from your driver implementation.\n\t// Calling this method after the authentication step could lead to undefined behavior\n\tSetPath(value string)\n\n\t// SetListPath allows to change the path for the last LIST/NLST request.\n\t// This method is useful if the driver expands wildcards and so the returned results\n\t// refer to a path different from the requested one.\n\t// The value must be cleaned using path.Clean\n\tSetListPath(value string)\n\n\t// SetDebug activates the debugging of this connection commands\n\tSetDebug(debug bool)\n\n\t// Debug returns the current debugging status of this connection commands\n\tDebug() bool\n\n\t// Client's ID on the server\n\tID() uint32\n\n\t// Client's address\n\tRemoteAddr() net.Addr\n\n\t// Servers's address\n\tLocalAddr() net.Addr\n\n\t// Client's version can be empty\n\tGetClientVersion() string\n\n\t// Close closes the connection and disconnects the client.\n\tClose() error\n\n\t// HasTLSForControl returns true if the control connection is over TLS\n\tHasTLSForControl() bool\n\n\t// HasTLSForTransfers returns true if the transfer connection is over TLS\n\tHasTLSForTransfers() bool\n\n\t// GetLastCommand returns the last received command\n\tGetLastCommand() string\n\n\t// GetLastDataChannel returns the last data channel mode\n\tGetLastDataChannel() DataChannel\n\n\t// SetTLSRequirement sets the TLS requirement to respect on a per-client basis.\n\t// The requirement is checked when the client issues the \"USER\" command,\n\t// after executing the MainDriverExtensionUserVerifier extension, and\n\t// before opening transfer connections.\n\t// Supported values: ClearOrEncrypted, MandatoryEncryption.\n\t// If you want to enforce the same requirement for all\n\t// clients, use the TLSRequired parameter defined in server settings instead\n\tSetTLSRequirement(requirement TLSRequirement) error\n\n\t// SetExtra allows to set application specific data\n\tSetExtra(extra any)\n\n\t// Extra returns application specific data set using SetExtra\n\tExtra() any\n}", + "kind": "interface", + "position": { + "file": "driver.go", + "line": 148 + }, + "fields": [ + { + "name": "Path", + "doc": "Path provides the path of the current connection", + "type": "func() string" + }, + { + "name": "SetPath", + "doc": "SetPath sets the path of the current connection.\nThis method is useful to set a start directory, you should use it before returning a successful\nauthentication response from your driver implementation.\nCalling this method after the authentication step could lead to undefined behavior", + "type": "func(value string)" + }, + { + "name": "SetListPath", + "doc": "SetListPath allows to change the path for the last LIST/NLST request.\nThis method is useful if the driver expands wildcards and so the returned results\nrefer to a path different from the requested one.\nThe value must be cleaned using path.Clean", + "type": "func(value string)" + }, + { + "name": "SetDebug", + "doc": "SetDebug activates the debugging of this connection commands", + "type": "func(debug bool)" + }, + { + "name": "Debug", + "doc": "Debug returns the current debugging status of this connection commands", + "type": "func() bool" + }, + { + "name": "ID", + "doc": "Client's ID on the server", + "type": "func() uint32" + }, + { + "name": "RemoteAddr", + "doc": "Client's address", + "type": "func() net.Addr" + }, + { + "name": "LocalAddr", + "doc": "Servers's address", + "type": "func() net.Addr" + }, + { + "name": "GetClientVersion", + "doc": "Client's version can be empty", + "type": "func() string" + }, + { + "name": "Close", + "doc": "Close closes the connection and disconnects the client.", + "type": "func() error" + }, + { + "name": "HasTLSForControl", + "doc": "HasTLSForControl returns true if the control connection is over TLS", + "type": "func() bool" + }, + { + "name": "HasTLSForTransfers", + "doc": "HasTLSForTransfers returns true if the transfer connection is over TLS", + "type": "func() bool" + }, + { + "name": "GetLastCommand", + "doc": "GetLastCommand returns the last received command", + "type": "func() string" + }, + { + "name": "GetLastDataChannel", + "doc": "GetLastDataChannel returns the last data channel mode", + "type": "func() DataChannel" + }, + { + "name": "SetTLSRequirement", + "doc": "SetTLSRequirement sets the TLS requirement to respect on a per-client basis.\nThe requirement is checked when the client issues the \"USER\" command,\nafter executing the MainDriverExtensionUserVerifier extension, and\nbefore opening transfer connections.\nSupported values: ClearOrEncrypted, MandatoryEncryption.\nIf you want to enforce the same requirement for all\nclients, use the TLSRequired parameter defined in server settings instead", + "type": "func(requirement TLSRequirement) error" + }, + { + "name": "SetExtra", + "doc": "SetExtra allows to set application specific data", + "type": "func(extra any)" + }, + { + "name": "Extra", + "doc": "Extra returns application specific data set using SetExtra", + "type": "func() any" + } + ], + "methods": [], + "examples": [] + }, + { + "name": "ClientDriver", + "doc": "ClientDriver is the base FS implementation that allows to manipulate files", + "declaration": "type ClientDriver interface {\n\tafero.Fs\n}", + "kind": "interface", + "position": { + "file": "driver.go", + "line": 77 + }, + "fields": [ + { + "name": "afero.Fs", + "doc": "", + "type": "afero.Fs", + "embedded": true + } + ], + "methods": [], + "examples": [] + }, + { + "name": "ClientDriverExtensionAllocate", + "doc": "ClientDriverExtensionAllocate is an extension to support the \"ALLO\" - file allocation - command", + "declaration": "type ClientDriverExtensionAllocate interface {\n\t// AllocateSpace reserves the space necessary to upload files\n\tAllocateSpace(size int) error\n}", + "kind": "interface", + "position": { + "file": "driver.go", + "line": 82 + }, + "fields": [ + { + "name": "AllocateSpace", + "doc": "AllocateSpace reserves the space necessary to upload files", + "type": "func(size int) error" + } + ], + "methods": [], + "examples": [] + }, + { + "name": "ClientDriverExtensionAvailableSpace", + "doc": "ClientDriverExtensionAvailableSpace is an extension to implement to support\nthe AVBL ftp command", + "declaration": "type ClientDriverExtensionAvailableSpace interface {\n\tGetAvailableSpace(dirName string) (int64, error)\n}", + "kind": "interface", + "position": { + "file": "driver.go", + "line": 131 + }, + "fields": [ + { + "name": "GetAvailableSpace", + "doc": "", + "type": "func(dirName string) (int64, error)" + } + ], + "methods": [], + "examples": [] + }, + { + "name": "ClientDriverExtensionFileList", + "doc": "ClientDriverExtensionFileList is a convenience extension to allow to return file listing\nwithout requiring to implement the methods Open/Readdir for your custom afero.File", + "declaration": "type ClientDriverExtensionFileList interface {\n\t// ReadDir reads the directory named by name and return a list of directory entries.\n\tReadDir(name string) ([]os.FileInfo, error)\n}", + "kind": "interface", + "position": { + "file": "driver.go", + "line": 98 + }, + "fields": [ + { + "name": "ReadDir", + "doc": "ReadDir reads the directory named by name and return a list of directory entries.", + "type": "func(name string) ([]os.FileInfo, error)" + } + ], + "methods": [], + "examples": [] + }, + { + "name": "ClientDriverExtensionHasher", + "doc": "ClientDriverExtensionHasher is an extension to implement if you want to handle file digests\nyourself. You have to set EnableHASH to true for this extension to be called", + "declaration": "type ClientDriverExtensionHasher interface {\n\tComputeHash(name string, algo HASHAlgo, startOffset, endOffset int64) (string, error)\n}", + "kind": "interface", + "position": { + "file": "driver.go", + "line": 125 + }, + "fields": [ + { + "name": "ComputeHash", + "doc": "", + "type": "func(name string, algo HASHAlgo, startOffset, endOffset int64) (string, error)" + } + ], + "methods": [], + "examples": [] + }, + { + "name": "ClientDriverExtensionRemoveDir", + "doc": "ClientDriverExtensionRemoveDir is an extension to implement if you need to distinguish\nbetween the FTP command DELE (remove a file) and RMD (remove a dir). If you don't\nimplement this extension they will be both mapped to the Remove method defined in your\nafero.Fs implementation", + "declaration": "type ClientDriverExtensionRemoveDir interface {\n\tRemoveDir(name string) error\n}", + "kind": "interface", + "position": { + "file": "driver.go", + "line": 119 + }, + "fields": [ + { + "name": "RemoveDir", + "doc": "", + "type": "func(name string) error" + } + ], + "methods": [], + "examples": [] + }, + { + "name": "ClientDriverExtensionSite", + "doc": "ClientDriverExtensionSite is an extension to implement if you want to handle SITE command\nyourself. You have to set DisableSite to false for this extension to be called", + "declaration": "type ClientDriverExtensionSite interface {\n\tSite(param string) *AnswerCommand\n}", + "kind": "interface", + "position": { + "file": "driver.go", + "line": 143 + }, + "fields": [ + { + "name": "Site", + "doc": "", + "type": "func(param string) *AnswerCommand" + } + ], + "methods": [], + "examples": [] + }, + { + "name": "ClientDriverExtensionSymlink", + "doc": "ClientDriverExtensionSymlink is an extension to support the \"SITE SYMLINK\" - symbolic link creation - command", + "declaration": "type ClientDriverExtensionSymlink interface {\n\t// Symlink creates a symlink\n\tSymlink(oldname, newname string) error\n}", + "kind": "interface", + "position": { + "file": "driver.go", + "line": 88 + }, + "fields": [ + { + "name": "Symlink", + "doc": "Symlink creates a symlink", + "type": "func(oldname, newname string) error" + } + ], + "methods": [], + "examples": [] + }, + { + "name": "ClientDriverExtentionFileTransfer", + "doc": "ClientDriverExtentionFileTransfer is a convenience extension to allow to transfer files\nwithout requiring to implement the methods Create/Open/OpenFile for your custom afero.File.", + "declaration": "type ClientDriverExtentionFileTransfer interface {\n\t// GetHandle return an handle to upload or download a file based on flags:\n\t// os.O_RDONLY indicates a download\n\t// os.O_WRONLY indicates an upload and can be combined with os.O_APPEND (resume) or\n\t// os.O_CREATE (upload to new file/truncate)\n\t//\n\t// offset is the argument of a previous REST command, if any, or 0\n\tGetHandle(name string, flags int, offset int64) (FileTransfer, error)\n}", + "kind": "interface", + "position": { + "file": "driver.go", + "line": 105 + }, + "fields": [ + { + "name": "GetHandle", + "doc": "GetHandle return an handle to upload or download a file based on flags:\nos.O_RDONLY indicates a download\nos.O_WRONLY indicates an upload and can be combined with os.O_APPEND (resume) or\nos.O_CREATE (upload to new file/truncate)\n\noffset is the argument of a previous REST command, if any, or 0", + "type": "func(name string, flags int, offset int64) (FileTransfer, error)" + } + ], + "methods": [], + "examples": [] + }, + { + "name": "CommandDescription", + "doc": "CommandDescription defines which function should be used and if it should be open to anyone or only logged in users", + "declaration": "type CommandDescription struct {\n\tOpen bool // Open to clients without auth\n\tTransferRelated bool // This is a command that can open a transfer connection\n\tSpecialAction bool // Command to handle even if there is a transfer in progress\n\tFn func(*clientHandler, string) error // Function to handle it\n}", + "kind": "struct", + "position": { + "file": "server.go", + "line": 21 + }, + "fields": [ + { + "name": "Open", + "doc": "Open to clients without auth", + "type": "bool" + }, + { + "name": "TransferRelated", + "doc": "This is a command that can open a transfer connection", + "type": "bool" + }, + { + "name": "SpecialAction", + "doc": "Command to handle even if there is a transfer in progress", + "type": "bool" + }, + { + "name": "Fn", + "doc": "Function to handle it", + "type": "func(*clientHandler, string) error" + } + ], + "methods": [], + "examples": [] + }, + { + "name": "DataChannel", + "doc": "DataChannel is the enumerable that represents the data channel (active or passive)", + "declaration": "type DataChannel int8", + "kind": "defined", + "position": { + "file": "client_handler.go", + "line": 49 + }, + "fields": [], + "methods": [], + "examples": [] + }, + { + "name": "DataConnectionRequirement", + "doc": "DataConnectionRequirement is the enumerable that represents the supported\nprotection mode for data channels", + "declaration": "type DataConnectionRequirement int8", + "kind": "defined", + "position": { + "file": "driver.go", + "line": 330 + }, + "fields": [], + "methods": [], + "examples": [] + }, + { + "name": "DriverError", + "doc": "DriverError is a wrapper is for any error that occur while contacting the drivers", + "declaration": "type DriverError struct {\n\t// contains filtered or unexported fields\n}", + "kind": "struct", + "position": { + "file": "errors.go", + "line": 29 + }, + "fields": [], + "methods": [ + { + "name": "Error", + "doc": "", + "signature": "func Error) Error() string", + "position": { + "file": "errors.go", + "line": 38 + }, + "examples": [] + }, + { + "name": "Unwrap", + "doc": "", + "signature": "func Unwrap() error", + "position": { + "file": "errors.go", + "line": 42 + }, + "examples": [] + } + ], + "examples": [] + }, + { + "name": "FileAccessError", + "doc": "FileAccessError is a wrapper for any error that occur while accessing the file system", + "declaration": "type FileAccessError struct {\n\t// contains filtered or unexported fields\n}", + "kind": "struct", + "position": { + "file": "errors.go", + "line": 65 + }, + "fields": [], + "methods": [ + { + "name": "Error", + "doc": "", + "signature": "func Error) Error() string", + "position": { + "file": "errors.go", + "line": 74 + }, + "examples": [] + }, + { + "name": "Unwrap", + "doc": "", + "signature": "func Unwrap() error", + "position": { + "file": "errors.go", + "line": 78 + }, + "examples": [] + } + ], + "examples": [] + }, + { + "name": "FileTransfer", + "doc": "FileTransfer defines the inferface for file transfers.", + "declaration": "type FileTransfer interface {\n\tio.Reader\n\tio.Writer\n\tio.Seeker\n\tio.Closer\n}", + "kind": "interface", + "position": { + "file": "driver.go", + "line": 214 + }, + "fields": [ + { + "name": "io.Reader", + "doc": "", + "type": "io.Reader", + "embedded": true + }, + { + "name": "io.Writer", + "doc": "", + "type": "io.Writer", + "embedded": true + }, + { + "name": "io.Seeker", + "doc": "", + "type": "io.Seeker", + "embedded": true + }, + { + "name": "io.Closer", + "doc": "", + "type": "io.Closer", + "embedded": true + } + ], + "methods": [], + "examples": [] + }, + { + "name": "FileTransferError", + "doc": "FileTransferError is a FileTransfer extension used to notify the driver\nthat a transfer did not complete normally.\n\nTransferError is called before the file's Close method whenever the data\ntransfer is interrupted by:\n - an ABOR command from the client,\n - the client dropping the data connection (TCP RST or otherwise),\n - an I/O error while copying bytes between the data connection and the file.\n\nIt is NOT called when the transfer ends cleanly (the data connection is\nclosed gracefully by the client after sending all of its bytes). In that\ncase only Close is invoked.\n\nA common pattern is to set a flag in TransferError and inspect it in Close\nto distinguish a completed upload from an interrupted one:\n\n\ttype monitoredFile struct {\n\t afero.File\n\t transferErr error\n\t}\n\n\tfunc (f *monitoredFile) TransferError(err error) { f.transferErr = err }\n\n\tfunc (f *monitoredFile) Close() error {\n\t err := f.File.Close()\n\t if f.transferErr != nil {\n\t // upload was interrupted: f.transferErr describes why\n\t } else {\n\t // upload completed (as far as the server can tell)\n\t }\n\t return err\n\t}\n\nKeep in mind that FTP provides no length header for STOR transfers, so a\nclient that closes the data connection mid-upload without sending ABOR is\nindistinguishable from a normal completion. Implementing this interface\ncatches every case the server can detect.", + "declaration": "type FileTransferError interface {\n\tTransferError(err error)\n}", + "kind": "interface", + "position": { + "file": "driver.go", + "line": 258 + }, + "fields": [ + { + "name": "TransferError", + "doc": "", + "type": "func(err error)" + } + ], + "methods": [], + "examples": [] + }, + { + "name": "Flusher", + "doc": "Flusher is the interface that wraps the basic Flush method.", + "declaration": "type Flusher interface {\n\tFlush() error\n}", + "kind": "interface", + "position": { + "file": "client_handler.go", + "line": 766 + }, + "fields": [ + { + "name": "Flush", + "doc": "", + "type": "func() error" + } + ], + "methods": [], + "examples": [] + }, + { + "name": "FtpServer", + "doc": "FtpServer is where everything is stored\nWe want to keep it as simple as possible", + "declaration": "type FtpServer struct {\n\tLogger *slog.Logger // Structured logger (log/slog)\n\t// contains filtered or unexported fields\n}", + "kind": "struct", + "position": { + "file": "server.go", + "line": 129 + }, + "fields": [ + { + "name": "Logger", + "doc": "Structured logger (log/slog)", + "type": "*slog.Logger" + } + ], + "methods": [ + { + "name": "Addr", + "doc": "Addr shows the listening address", + "signature": "func Addr() string", + "position": { + "file": "server.go", + "line": 354 + }, + "examples": [] + }, + { + "name": "Listen", + "doc": "Listen starts the listening\nIt's not a blocking call", + "signature": "func Listen() error", + "position": { + "file": "server.go", + "line": 206 + }, + "examples": [] + }, + { + "name": "ListenAndServe", + "doc": "ListenAndServe simply chains the Listen and Serve method calls", + "signature": "func ListenAndServe() error", + "position": { + "file": "server.go", + "line": 335 + }, + "examples": [] + }, + { + "name": "Serve", + "doc": "Serve accepts and processes any new incoming client", + "signature": "func Server) Serve() error", + "position": { + "file": "server.go", + "line": 268 + }, + "examples": [] + }, + { + "name": "Stop", + "doc": "Stop closes the listener", + "signature": "func Stop() error", + "position": { + "file": "server.go", + "line": 363 + }, + "examples": [] + } + ], + "examples": [] + }, + { + "name": "HASHAlgo", + "doc": "HASHAlgo is the enumerable that represents the supported HASH algorithms.", + "declaration": "type HASHAlgo int8", + "kind": "defined", + "position": { + "file": "client_handler.go", + "line": 17 + }, + "fields": [], + "methods": [], + "examples": [] + }, + { + "name": "MainDriver", + "doc": "MainDriver handles the authentication and ClientHandlingDriver selection", + "declaration": "type MainDriver interface {\n\t// GetSettings returns some general settings around the server setup\n\tGetSettings() (*Settings, error)\n\n\t// ClientConnected is called to send the very first welcome message\n\tClientConnected(cc ClientContext) (string, error)\n\n\t// ClientDisconnected is called when the user disconnects, even if he never authenticated\n\tClientDisconnected(cc ClientContext)\n\n\t// AuthUser authenticates the user and selects an handling driver\n\tAuthUser(cc ClientContext, user, pass string) (ClientDriver, error)\n\n\t// GetTLSConfig returns a TLS Certificate to use\n\t// The certificate could frequently change if we use something like \"let's encrypt\"\n\tGetTLSConfig() (*tls.Config, error)\n}", + "kind": "interface", + "position": { + "file": "driver.go", + "line": 17 + }, + "fields": [ + { + "name": "GetSettings", + "doc": "GetSettings returns some general settings around the server setup", + "type": "func() (*Settings, error)" + }, + { + "name": "ClientConnected", + "doc": "ClientConnected is called to send the very first welcome message", + "type": "func(cc ClientContext) (string, error)" + }, + { + "name": "ClientDisconnected", + "doc": "ClientDisconnected is called when the user disconnects, even if he never authenticated", + "type": "func(cc ClientContext)" + }, + { + "name": "AuthUser", + "doc": "AuthUser authenticates the user and selects an handling driver", + "type": "func(cc ClientContext, user, pass string) (ClientDriver, error)" + }, + { + "name": "GetTLSConfig", + "doc": "GetTLSConfig returns a TLS Certificate to use\nThe certificate could frequently change if we use something like \"let's encrypt\"", + "type": "func() (*tls.Config, error)" + } + ], + "methods": [], + "examples": [] + }, + { + "name": "MainDriverExtensionPassiveWrapper", + "doc": "MainDriverExtensionPassiveWrapper is an extension that allows to wrap the listener\nused for passive connection", + "declaration": "type MainDriverExtensionPassiveWrapper interface {\n\t// WrapPassiveListener is called after creating the listener for passive\n\t// data connections.\n\t// You can wrap the passed listener or just return it unmodified.\n\t// Returning an error will cause the passive connection to fail\n\tWrapPassiveListener(listener net.Listener) (net.Listener, error)\n}", + "kind": "interface", + "position": { + "file": "driver.go", + "line": 47 + }, + "fields": [ + { + "name": "WrapPassiveListener", + "doc": "WrapPassiveListener is called after creating the listener for passive\ndata connections.\nYou can wrap the passed listener or just return it unmodified.\nReturning an error will cause the passive connection to fail", + "type": "func(listener net.Listener) (net.Listener, error)" + } + ], + "methods": [], + "examples": [] + }, + { + "name": "MainDriverExtensionPostAuthMessage", + "doc": "MainDriverExtensionPostAuthMessage is an extension that allows to send a message\nafter the authentication", + "declaration": "type MainDriverExtensionPostAuthMessage interface {\n\t// PostAuthMessage is called after the authentication\n\tPostAuthMessage(cc ClientContext, user string, authErr error) string\n}", + "kind": "interface", + "position": { + "file": "driver.go", + "line": 65 + }, + "fields": [ + { + "name": "PostAuthMessage", + "doc": "PostAuthMessage is called after the authentication", + "type": "func(cc ClientContext, user string, authErr error) string" + } + ], + "methods": [], + "examples": [] + }, + { + "name": "MainDriverExtensionQuitMessage", + "doc": "MainDriverExtensionQuitMessage is an extension that allows to control the quit message", + "declaration": "type MainDriverExtensionQuitMessage interface {\n\t// QuitMessage returns the message to display when the user quits the server\n\tQuitMessage() string\n}", + "kind": "interface", + "position": { + "file": "driver.go", + "line": 71 + }, + "fields": [ + { + "name": "QuitMessage", + "doc": "QuitMessage returns the message to display when the user quits the server", + "type": "func() string" + } + ], + "methods": [], + "examples": [] + }, + { + "name": "MainDriverExtensionTLSVerifier", + "doc": "MainDriverExtensionTLSVerifier is an extension that allows to verify the TLS connection\nestabilished on the control channel", + "declaration": "type MainDriverExtensionTLSVerifier interface {\n\t// VerifyConnection is called when receiving the \"USER\" command.\n\t// If it returns a non-nil error, the client will receive a 530 error and it will be disconnected.\n\t// If it returns a non-nil ClientDriver and a nil error the client will be authenticated.\n\t// If it returns a nil ClientDriver and a nil error the user password is required\n\tVerifyConnection(cc ClientContext, user string, tlsConn *tls.Conn) (ClientDriver, error)\n}", + "kind": "interface", + "position": { + "file": "driver.go", + "line": 37 + }, + "fields": [ + { + "name": "VerifyConnection", + "doc": "VerifyConnection is called when receiving the \"USER\" command.\nIf it returns a non-nil error, the client will receive a 530 error and it will be disconnected.\nIf it returns a non-nil ClientDriver and a nil error the client will be authenticated.\nIf it returns a nil ClientDriver and a nil error the user password is required", + "type": "func(cc ClientContext, user string, tlsConn *tls.Conn) (ClientDriver, error)" + } + ], + "methods": [], + "examples": [] + }, + { + "name": "MainDriverExtensionUserVerifier", + "doc": "MainDriverExtensionUserVerifier is an extension that allows to control user access\nonce username is known, before the authentication", + "declaration": "type MainDriverExtensionUserVerifier interface {\n\t// PreAuthUser is called when receiving the \"USER\" command before proceeding with any other checks\n\t// If it returns a non-nil error, the client will receive a 530 error and be disconnected.\n\tPreAuthUser(cc ClientContext, user string) error\n}", + "kind": "interface", + "position": { + "file": "driver.go", + "line": 57 + }, + "fields": [ + { + "name": "PreAuthUser", + "doc": "PreAuthUser is called when receiving the \"USER\" command before proceeding with any other checks\nIf it returns a non-nil error, the client will receive a 530 error and be disconnected.", + "type": "func(cc ClientContext, user string) error" + } + ], + "methods": [], + "examples": [] + }, + { + "name": "NetworkError", + "doc": "NetworkError is a wrapper for any error that occur while contacting the network", + "declaration": "type NetworkError struct {\n\t// contains filtered or unexported fields\n}", + "kind": "struct", + "position": { + "file": "errors.go", + "line": 47 + }, + "fields": [], + "methods": [ + { + "name": "Error", + "doc": "", + "signature": "func Error) Error() string", + "position": { + "file": "errors.go", + "line": 56 + }, + "examples": [] + }, + { + "name": "Unwrap", + "doc": "", + "signature": "func Unwrap() error", + "position": { + "file": "errors.go", + "line": 60 + }, + "examples": [] + } + ], + "examples": [] + }, + { + "name": "PasvPortGetter", + "doc": "PasvPortGetter defined how the driver fetch a pair of ports used in passive transfer", + "declaration": "type PasvPortGetter interface {\n\t// FetchNext returns the exposed one, the listened one and whether succeeded\n\tFetchNext() (int, int, bool)\n\t// NumberAttempts returns maximum number of attempts on finding an available passive transfer port\n\tNumberAttempts() int\n}", + "kind": "interface", + "position": { + "file": "driver.go", + "line": 263 + }, + "fields": [ + { + "name": "FetchNext", + "doc": "FetchNext returns the exposed one, the listened one and whether succeeded", + "type": "func() (int, int, bool)" + }, + { + "name": "NumberAttempts", + "doc": "NumberAttempts returns maximum number of attempts on finding an available passive transfer port", + "type": "func() int" + } + ], + "methods": [], + "examples": [] + }, + { + "name": "PortMappingRange", + "doc": "PortMappingRange is a range of mapped ports", + "declaration": "type PortMappingRange struct {\n\tExposedStart int\n\tListenedStart int\n\tCount int\n}", + "kind": "struct", + "position": { + "file": "driver.go", + "line": 293 + }, + "fields": [ + { + "name": "ExposedStart", + "doc": "", + "type": "int" + }, + { + "name": "ListenedStart", + "doc": "", + "type": "int" + }, + { + "name": "Count", + "doc": "", + "type": "int" + } + ], + "methods": [ + { + "name": "FetchNext", + "doc": "FetchNext returns the next port mapping to try for the range", + "signature": "func FetchNext() (int, int, bool)", + "position": { + "file": "driver.go", + "line": 300 + }, + "examples": [] + }, + { + "name": "NumberAttempts", + "doc": "NumberAttempts returns the number of attempts for the range", + "signature": "func NumberAttempts() int", + "position": { + "file": "driver.go", + "line": 310 + }, + "examples": [] + } + ], + "examples": [] + }, + { + "name": "PortRange", + "doc": "PortRange is a range of ports", + "declaration": "type PortRange struct {\n\tStart int // Range start\n\tEnd int // Range end\n}", + "kind": "struct", + "position": { + "file": "driver.go", + "line": 271 + }, + "fields": [ + { + "name": "Start", + "doc": "Range start", + "type": "int" + }, + { + "name": "End", + "doc": "Range end", + "type": "int" + } + ], + "methods": [ + { + "name": "FetchNext", + "doc": "FetchNext returns the next port to try for the range", + "signature": "func FetchNext() (int, int, bool)", + "position": { + "file": "driver.go", + "line": 277 + }, + "examples": [] + }, + { + "name": "NumberAttempts", + "doc": "NumberAttempts returns the number of attempts for the range", + "signature": "func NumberAttempts() int", + "position": { + "file": "driver.go", + "line": 288 + }, + "examples": [] + } + ], + "examples": [] + }, + { + "name": "PublicIPResolver", + "doc": "PublicIPResolver takes a ClientContext for a connection and returns the public IP\nto use in the response to the PASV command, or an error if a public IP cannot be determined.", + "declaration": "type PublicIPResolver func(ClientContext) (string, error)", + "kind": "defined", + "position": { + "file": "driver.go", + "line": 316 + }, + "fields": [], + "methods": [], + "examples": [] + }, + { + "name": "Settings", + "doc": "Settings defines all the server settings", + "declaration": "type Settings struct {\n\tListener net.Listener // (Optional) To provide an already initialized listener\n\tListenAddr string // Listening address\n\tPublicHost string // Public IP to expose (only an IP address is accepted at this stage)\n\tBanner string // Banner to use in server status response\n\t// PassiveTransferPortRange is the optional port mapping for passive data connections.\n\tPassiveTransferPortRange PasvPortGetter\n\tPassiveTransferPortMultiplexing bool // Allow different client IPs to share passive listener ports\n\tPublicIPResolver PublicIPResolver // (Optional) To fetch a public IP lookup\n\tIdleTimeout int // Maximum inactivity time before disconnecting (#58)\n\tConnectionTimeout int // Maximum time to establish passive or active transfer connections\n\tActiveTransferPortNon20 bool // Do not impose the port 20 for active data transfer (#88, RFC 1579)\n\tDisableMLSD bool // Disable MLSD support\n\tDisableMLST bool // Disable MLST support\n\tDisableMFMT bool // Disable MFMT support (modify file mtime)\n\tTLSRequired TLSRequirement // defines the TLS mode\n\tDisableLISTArgs bool // Disable ls like options (-a,-la etc.) for directory listing\n\tDisableSite bool // Disable SITE command\n\tDisableActiveMode bool // Disable Active FTP\n\tEnableHASH bool // Enable support for calculating hash value of files\n\t// DisableSTAT disables Server STATUS. STAT on files and directories still works.\n\tDisableSTAT bool\n\tDisableSYST bool // Disable SYST\n\tEnableCOMB bool // Enable COMB support\n\tDeflateCompressionLevel int // Deflate compression level (0-9). 0 means disabled\n\tDefaultTransferType TransferType // Transfer type to use if the client don't send the TYPE command\n\t// DisableASCIIConversion disables CRLF/LF line-ending conversion for TYPE A (ASCII) transfers.\n\t// When true, files are transferred byte-for-byte even in ASCII mode, and SIZE is allowed in\n\t// ASCII mode. This is not RFC 959-compliant but matches the behavior of vsftpd's\n\t// ascii_download_enable/ascii_upload_enable=NO and is useful when clients do not want the\n\t// server to modify their files.\n\tDisableASCIIConversion bool\n\t// ActiveConnectionsCheck defines the security requirements for active connections\n\tActiveConnectionsCheck DataConnectionRequirement\n\t// PasvConnectionsCheck defines the security requirements for passive connections\n\tPasvConnectionsCheck DataConnectionRequirement\n}", + "kind": "struct", + "position": { + "file": "driver.go", + "line": 341 + }, + "fields": [ + { + "name": "Listener", + "doc": "(Optional) To provide an already initialized listener", + "type": "net.Listener" + }, + { + "name": "ListenAddr", + "doc": "Listening address", + "type": "string" + }, + { + "name": "PublicHost", + "doc": "Public IP to expose (only an IP address is accepted at this stage)", + "type": "string" + }, + { + "name": "Banner", + "doc": "Banner to use in server status response", + "type": "string" + }, + { + "name": "PassiveTransferPortRange", + "doc": "PassiveTransferPortRange is the optional port mapping for passive data connections.", + "type": "PasvPortGetter" + }, + { + "name": "PassiveTransferPortMultiplexing", + "doc": "Allow different client IPs to share passive listener ports", + "type": "bool" + }, + { + "name": "PublicIPResolver", + "doc": "(Optional) To fetch a public IP lookup", + "type": "PublicIPResolver" + }, + { + "name": "IdleTimeout", + "doc": "Maximum inactivity time before disconnecting (#58)", + "type": "int" + }, + { + "name": "ConnectionTimeout", + "doc": "Maximum time to establish passive or active transfer connections", + "type": "int" + }, + { + "name": "ActiveTransferPortNon20", + "doc": "Do not impose the port 20 for active data transfer (#88, RFC 1579)", + "type": "bool" + }, + { + "name": "DisableMLSD", + "doc": "Disable MLSD support", + "type": "bool" + }, + { + "name": "DisableMLST", + "doc": "Disable MLST support", + "type": "bool" + }, + { + "name": "DisableMFMT", + "doc": "Disable MFMT support (modify file mtime)", + "type": "bool" + }, + { + "name": "TLSRequired", + "doc": "defines the TLS mode", + "type": "TLSRequirement" + }, + { + "name": "DisableLISTArgs", + "doc": "Disable ls like options (-a,-la etc.) for directory listing", + "type": "bool" + }, + { + "name": "DisableSite", + "doc": "Disable SITE command", + "type": "bool" + }, + { + "name": "DisableActiveMode", + "doc": "Disable Active FTP", + "type": "bool" + }, + { + "name": "EnableHASH", + "doc": "Enable support for calculating hash value of files", + "type": "bool" + }, + { + "name": "DisableSTAT", + "doc": "DisableSTAT disables Server STATUS. STAT on files and directories still works.", + "type": "bool" + }, + { + "name": "DisableSYST", + "doc": "Disable SYST", + "type": "bool" + }, + { + "name": "EnableCOMB", + "doc": "Enable COMB support", + "type": "bool" + }, + { + "name": "DeflateCompressionLevel", + "doc": "Deflate compression level (0-9). 0 means disabled", + "type": "int" + }, + { + "name": "DefaultTransferType", + "doc": "Transfer type to use if the client don't send the TYPE command", + "type": "TransferType" + }, + { + "name": "DisableASCIIConversion", + "doc": "DisableASCIIConversion disables CRLF/LF line-ending conversion for TYPE A (ASCII) transfers.\nWhen true, files are transferred byte-for-byte even in ASCII mode, and SIZE is allowed in\nASCII mode. This is not RFC 959-compliant but matches the behavior of vsftpd's\nascii_download_enable/ascii_upload_enable=NO and is useful when clients do not want the\nserver to modify their files.", + "type": "bool" + }, + { + "name": "ActiveConnectionsCheck", + "doc": "ActiveConnectionsCheck defines the security requirements for active connections", + "type": "DataConnectionRequirement" + }, + { + "name": "PasvConnectionsCheck", + "doc": "PasvConnectionsCheck defines the security requirements for passive connections", + "type": "DataConnectionRequirement" + } + ], + "methods": [], + "examples": [] + }, + { + "name": "TLSRequirement", + "doc": "TLSRequirement is the enumerable that represents the supported TLS mode", + "declaration": "type TLSRequirement int8", + "kind": "defined", + "position": { + "file": "driver.go", + "line": 319 + }, + "fields": [], + "methods": [], + "examples": [] + }, + { + "name": "TransferFinalizer", + "doc": "TransferFinalizer is the interface for transfer streams that need explicit\nfinalization (e.g., deflate streams need to write end-of-stream markers).\nThis is distinct from closing the underlying connection.\nWe use FinalizeTransfer() instead of Close() to distinguish from io.Closer,\nsince net.Conn already implements io.Closer and we don't want to accidentally\nclose the underlying connection.", + "declaration": "type TransferFinalizer interface {\n\tFinalizeTransfer() error\n}", + "kind": "interface", + "position": { + "file": "client_handler.go", + "line": 776 + }, + "fields": [ + { + "name": "FinalizeTransfer", + "doc": "", + "type": "func() error" + } + ], + "methods": [], + "examples": [] + }, + { + "name": "TransferMode", + "doc": "TransferMode is the enumerable that represents the transfer mode (stream, block, compressed, deflate)", + "declaration": "type TransferMode int8", + "kind": "defined", + "position": { + "file": "client_handler.go", + "line": 38 + }, + "fields": [], + "methods": [], + "examples": [] + }, + { + "name": "TransferType", + "doc": "TransferType is the enumerable that represents the supported transfer types.", + "declaration": "type TransferType int8", + "kind": "defined", + "position": { + "file": "client_handler.go", + "line": 29 + }, + "fields": [], + "methods": [], + "examples": [] + } + ], + "examples": [] + } + ] +} diff --git a/docs-sourcey/overview.md b/docs-sourcey/overview.md new file mode 100644 index 00000000..6d0d210a --- /dev/null +++ b/docs-sourcey/overview.md @@ -0,0 +1,18 @@ +# ftpserverlib + +`ftpserverlib` is a Go library for building custom FTP servers on top of an +[`afero`](https://github.com/spf13/afero) filesystem. It provides the FTP +protocol engine while the embedding application supplies authentication, +storage, TLS, and server policy through driver interfaces. + +The library supports uploads and downloads, directory operations, active and +passive transfers, IPv6, TLS, resume, structured logging, and machine-readable +directory listings. Optional extensions cover hashing, allocation, available +space, symbolic links, transfer errors, and other server-specific behavior. + +For a ready-to-run server, use the companion +[`fclairamb/ftpserver`](https://github.com/fclairamb/ftpserver) project. Use +this library when you need to embed FTP behavior into your own service. + +The API reference in this site is generated by Sourcey from the Go module at +commit `b4c3694ee73399d8a55293d568e5100c25e4d2d4`. diff --git a/docs-sourcey/package-lock.json b/docs-sourcey/package-lock.json new file mode 100644 index 00000000..7f07d4ff --- /dev/null +++ b/docs-sourcey/package-lock.json @@ -0,0 +1,4302 @@ +{ + "name": "ftpserverlib-sourcey-docs", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "ftpserverlib-sourcey-docs", + "devDependencies": { + "sourcey": "3.6.5" + } + }, + "node_modules/@apidevtools/json-schema-ref-parser": { + "version": "13.0.5", + "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-13.0.5.tgz", + "integrity": "sha512-xfh4xVJD62gG6spIc7lwxoWT+l16nZu1ELyU8FkjaP/oD2yP09EvLAU6KhtudN9aML2Khhs9pY6Slr7KGTES3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.15", + "js-yaml": "^4.1.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/philsturgeon" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", + "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.29.7.tgz", + "integrity": "sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", + "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.29.7.tgz", + "integrity": "sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.29.7.tgz", + "integrity": "sha512-WsZulLVBUHXVj2cUcPVx6UE21TpalB6bHbSFErKT0Ib++ax24jjXe73FqlWvdylFOjiuPHYi6VCcgRad1ItN+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/plugin-syntax-jsx": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.29.7.tgz", + "integrity": "sha512-Xfy3UVMF04+ypnFbkhvfqtmvwfe92qwQdbGZVonhE+6v35GzlofmOnA1szaZqzb9xYWr0nl1e5EMmzi0DNON1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", + "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@emnapi/core": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.1.tgz", + "integrity": "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.2", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.1.tgz", + "integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz", + "integrity": "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@exodus/schemasafe": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@exodus/schemasafe/-/schemasafe-1.3.0.tgz", + "integrity": "sha512-5Aap/GaRupgNx/feGBwLLTVv8OQFfv3pq2lPRzPg9R+IOBnDgghTGW7l7EuVXOvg5cc/xSAlRW8rBrjIC3Nvqw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.6.tgz", + "integrity": "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@tybys/wasm-util": "^0.10.3" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.139.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.139.0.tgz", + "integrity": "sha512-r9gHphtCs+1M7J0pw6Sn/hh/Wpa/iQrOOkrNAlVLF/gHq+/CJmHIWKKUUhdWjcD6CIa8idarspCsASiXCXvFUw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@preact/preset-vite": { + "version": "2.10.5", + "resolved": "https://registry.npmjs.org/@preact/preset-vite/-/preset-vite-2.10.5.tgz", + "integrity": "sha512-p0vJpxiVO7KWWazWny3LUZ+saXyZKWv6Ju0bYMWNJRp2YveufRPgSUB1C4MTqGJfz07EehMgfN+AJNwQy+w6Iw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.27.1", + "@babel/plugin-transform-react-jsx-development": "^7.27.1", + "@prefresh/vite": "^2.4.11", + "@rollup/pluginutils": "^5.0.0", + "babel-plugin-transform-hook-names": "^1.0.2", + "debug": "^4.4.3", + "magic-string": "^0.30.21", + "picocolors": "^1.1.1", + "vite-prerender-plugin": "^0.5.8", + "zimmerframe": "^1.1.4" + }, + "peerDependencies": { + "@babel/core": "7.x", + "vite": "2.x || 3.x || 4.x || 5.x || 6.x || 7.x || 8.x" + } + }, + "node_modules/@prefresh/babel-plugin": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/@prefresh/babel-plugin/-/babel-plugin-0.5.3.tgz", + "integrity": "sha512-57LX2SHs4BX2s1IwCjNzTE2OJeEepRCNf1VTEpbNcUyHfMO68eeOWGDIt4ob9aYlW6PEWZ1SuwNikuoIXANDtQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@prefresh/core": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/@prefresh/core/-/core-1.5.10.tgz", + "integrity": "sha512-7yPTFbG56sutaFu8krp3B4a200KOFUvrtlllKWRuLjsYXo9UUucHOZRcer+gtgMkFTpv6ob8TGcTwA32bSwa1w==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "preact": "^10.0.0 || ^11.0.0-0" + } + }, + "node_modules/@prefresh/utils": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@prefresh/utils/-/utils-1.2.1.tgz", + "integrity": "sha512-vq/sIuN5nYfYzvyayXI4C2QkprfNaHUQ9ZX+3xLD8nL3rWyzpxOm1+K7RtMbhd+66QcaISViK7amjnheQ/4WZw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@prefresh/vite": { + "version": "2.4.12", + "resolved": "https://registry.npmjs.org/@prefresh/vite/-/vite-2.4.12.tgz", + "integrity": "sha512-FY1fzXpUjiuosznMV0YM7XAOPZjB5FIdWS0W24+XnlxYkt9hNAwwsiKYn+cuTEoMtD/ZVazS5QVssBr9YhpCQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.22.1", + "@prefresh/babel-plugin": "^0.5.2", + "@prefresh/core": "^1.5.0", + "@prefresh/utils": "^1.2.0", + "@rollup/pluginutils": "^4.2.1" + }, + "peerDependencies": { + "preact": "^10.4.0 || ^11.0.0-0", + "vite": ">=2.0.0" + } + }, + "node_modules/@prefresh/vite/node_modules/@rollup/pluginutils": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", + "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "estree-walker": "^2.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/@prefresh/vite/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@resvg/resvg-js": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js/-/resvg-js-2.6.2.tgz", + "integrity": "sha512-xBaJish5OeGmniDj9cW5PRa/PtmuVU3ziqrbr5xJj901ZDN4TosrVaNZpEiLZAxdfnhAe7uQ7QFWfjPe9d9K2Q==", + "dev": true, + "license": "MPL-2.0", + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@resvg/resvg-js-android-arm-eabi": "2.6.2", + "@resvg/resvg-js-android-arm64": "2.6.2", + "@resvg/resvg-js-darwin-arm64": "2.6.2", + "@resvg/resvg-js-darwin-x64": "2.6.2", + "@resvg/resvg-js-linux-arm-gnueabihf": "2.6.2", + "@resvg/resvg-js-linux-arm64-gnu": "2.6.2", + "@resvg/resvg-js-linux-arm64-musl": "2.6.2", + "@resvg/resvg-js-linux-x64-gnu": "2.6.2", + "@resvg/resvg-js-linux-x64-musl": "2.6.2", + "@resvg/resvg-js-win32-arm64-msvc": "2.6.2", + "@resvg/resvg-js-win32-ia32-msvc": "2.6.2", + "@resvg/resvg-js-win32-x64-msvc": "2.6.2" + } + }, + "node_modules/@resvg/resvg-js-android-arm-eabi": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-android-arm-eabi/-/resvg-js-android-arm-eabi-2.6.2.tgz", + "integrity": "sha512-FrJibrAk6v29eabIPgcTUMPXiEz8ssrAk7TXxsiZzww9UTQ1Z5KAbFJs+Z0Ez+VZTYgnE5IQJqBcoSiMebtPHA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@resvg/resvg-js-android-arm64": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-android-arm64/-/resvg-js-android-arm64-2.6.2.tgz", + "integrity": "sha512-VcOKezEhm2VqzXpcIJoITuvUS/fcjIw5NA/w3tjzWyzmvoCdd+QXIqy3FBGulWdClvp4g+IfUemigrkLThSjAQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@resvg/resvg-js-darwin-arm64": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-darwin-arm64/-/resvg-js-darwin-arm64-2.6.2.tgz", + "integrity": "sha512-nmok2LnAd6nLUKI16aEB9ydMC6Lidiiq2m1nEBDR1LaaP7FGs4AJ90qDraxX+CWlVuRlvNjyYJTNv8qFjtL9+A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@resvg/resvg-js-darwin-x64": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-darwin-x64/-/resvg-js-darwin-x64-2.6.2.tgz", + "integrity": "sha512-GInyZLjgWDfsVT6+SHxQVRwNzV0AuA1uqGsOAW+0th56J7Nh6bHHKXHBWzUrihxMetcFDmQMAX1tZ1fZDYSRsw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@resvg/resvg-js-linux-arm-gnueabihf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-linux-arm-gnueabihf/-/resvg-js-linux-arm-gnueabihf-2.6.2.tgz", + "integrity": "sha512-YIV3u/R9zJbpqTTNwTZM5/ocWetDKGsro0SWp70eGEM9eV2MerWyBRZnQIgzU3YBnSBQ1RcxRZvY/UxwESfZIw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@resvg/resvg-js-linux-arm64-gnu": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-linux-arm64-gnu/-/resvg-js-linux-arm64-gnu-2.6.2.tgz", + "integrity": "sha512-zc2BlJSim7YR4FZDQ8OUoJg5holYzdiYMeobb9pJuGDidGL9KZUv7SbiD4E8oZogtYY42UZEap7dqkkYuA91pg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@resvg/resvg-js-linux-arm64-musl": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-linux-arm64-musl/-/resvg-js-linux-arm64-musl-2.6.2.tgz", + "integrity": "sha512-3h3dLPWNgSsD4lQBJPb4f+kvdOSJHa5PjTYVsWHxLUzH4IFTJUAnmuWpw4KqyQ3NA5QCyhw4TWgxk3jRkQxEKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@resvg/resvg-js-linux-x64-gnu": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-linux-x64-gnu/-/resvg-js-linux-x64-gnu-2.6.2.tgz", + "integrity": "sha512-IVUe+ckIerA7xMZ50duAZzwf1U7khQe2E0QpUxu5MBJNao5RqC0zwV/Zm965vw6D3gGFUl7j4m+oJjubBVoftw==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@resvg/resvg-js-linux-x64-musl": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-linux-x64-musl/-/resvg-js-linux-x64-musl-2.6.2.tgz", + "integrity": "sha512-UOf83vqTzoYQO9SZ0fPl2ZIFtNIz/Rr/y+7X8XRX1ZnBYsQ/tTb+cj9TE+KHOdmlTFBxhYzVkP2lRByCzqi4jQ==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@resvg/resvg-js-win32-arm64-msvc": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-win32-arm64-msvc/-/resvg-js-win32-arm64-msvc-2.6.2.tgz", + "integrity": "sha512-7C/RSgCa+7vqZ7qAbItfiaAWhyRSoD4l4BQAbVDqRRsRgY+S+hgS3in0Rxr7IorKUpGE69X48q6/nOAuTJQxeQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@resvg/resvg-js-win32-ia32-msvc": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-win32-ia32-msvc/-/resvg-js-win32-ia32-msvc-2.6.2.tgz", + "integrity": "sha512-har4aPAlvjnLcil40AC77YDIk6loMawuJwFINEM7n0pZviwMkMvjb2W5ZirsNOZY4aDbo5tLx0wNMREp5Brk+w==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@resvg/resvg-js-win32-x64-msvc": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-win32-x64-msvc/-/resvg-js-win32-x64-msvc-2.6.2.tgz", + "integrity": "sha512-ZXtYhtUr5SSaBrUDq7DiyjOFJqBVL/dOBN7N/qmi/pO0IgiWW/f/ue3nbvu9joWE5aAKDoIzy/CxsY0suwGosQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.1.5.tgz", + "integrity": "sha512-lZg8fqIv2v7FF237bwMgzGZEJvGL79/s5knJ/i6FmsGF4XXlzccZ4jb+TrFIxtSSxFtIpdsgrPZeMk1I9AFcyQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.1.5.tgz", + "integrity": "sha512-51Bnx9pNiMRKSUNtBfySkNJ9vMU9Hh3I1ozDd6gyPPYzaXCfnptUcEZxXGYFn+ul2dtcMUiqGR1Yai2K10uoTw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.1.5.tgz", + "integrity": "sha512-Tm+gbfC0aHu1tBA/JvKQh32S0K6YgCHkiAF4/W6xX0K0RmNuc94VeK419dJoE65R5aRxmo+noZQSWrAMF6yb6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.1.5.tgz", + "integrity": "sha512-JMzDKCCXq93YccG5gz3hvOs1oXRKAf0XYpfOS88e+wZrC8Iugj6j68867vrYZkvpDDpKn/KoKORThmchMpF6TA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.1.5.tgz", + "integrity": "sha512-uML21j2K5TfPGutKxub+M+nLjZIrWjXQ5Grx4lCe/nimTj9B4L63zHpjXLl4y0L3mcm2htEQIb06oCG/szerNw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.1.5.tgz", + "integrity": "sha512-navSiuTMogvnQoZoM/v+l3ZWo50/NTwSHSzheABx/RCnmUPaKwq9qSo4Br2OYRs21+Fz8uFqITZM3H4opOB0/Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.1.5.tgz", + "integrity": "sha512-lAryqH7IteztmCXQXk0etKj4wBQ7Gx5S6LjKhsgp9zb8I5bsuvU/2llH1hDQcjsFeqIsovMVN339/8pUDDBXxA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.1.5.tgz", + "integrity": "sha512-fsK/sNBnxzBlL4O1JNrZakVQxPspqpED5dLtNsZS9oOKmtSpdNIzxH2kkol5HYTWJN47sE20ztMJPxfZ89qGOg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.1.5.tgz", + "integrity": "sha512-gLYb4BIadlfTOYT5gO503n8zQjXflgzpD0FcyKh0Mzx3rqCZKnHoJWV9xe1KXUJ5lx2JfcSHr/mhzS0PC/McAA==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.1.5.tgz", + "integrity": "sha512-FjcpEKUyJygHgs1o50VYNvkt5+7Le/VEdYt0AkRpkL33MnyQfwr8l5mXwMmfmTbyMPr5vJLC+8/Gd9gXnwU1QQ==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.1.5.tgz", + "integrity": "sha512-Me+PfPI2TMeOQk0gYWfLQZtTktrmzbr8cDboqX83XKc7UrgAi55gF+2dUkWdxd19n55Essp2yeca+O9N5rBxHg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.1.5.tgz", + "integrity": "sha512-yc5WrLzXks6zCQfn9Oxr8pORKyl/pF+QjHmW/Qx3qu0oyrrNC+y2JLTU1E2rcWYAmzlnqngWXHQjy51VzW70Vw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.1.5.tgz", + "integrity": "sha512-VbQGPX2b4r48TAMIM2cjgluIM1HYutm4pcTEJsle7iEP7sB1dFqtPLBVbdLAZCxy1txCcPxf4QFf4v8uvltPqA==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "1.11.1", + "@emnapi/runtime": "1.11.1", + "@napi-rs/wasm-runtime": "^1.1.6" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.1.5.tgz", + "integrity": "sha512-gHv82k63z4qpV5+Q1y/12KrK0ltWBukVDI8nZcbT7Tt/ZlOIVwppazneq0F93oDxTo3IgAMEDIoQh3E2n6mVsw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.1.5.tgz", + "integrity": "sha512-tTZuDBPw85tEN5PQi1pnEBzDy0Z49HtScLAbD5t6hyeU92A95pRWaSMw1GZZi/RwgSgUIl0xrSlXIT/9QzvYSA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/pluginutils": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.4.0.tgz", + "integrity": "sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg==", + "dev": true, + "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/@shikijs/core": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-4.3.1.tgz", + "integrity": "sha512-ANMDxuaPsNMdDC1m4vfvhlDmJweMwkE5XitTwrq2rWHx5jM+dlm4MmHt2PP6t0uejfR77SuhrhJ0zEijIF/uhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/primitive": "4.3.1", + "@shikijs/types": "4.3.1", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4", + "hast-util-to-html": "^9.0.5" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/engine-javascript": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-4.3.1.tgz", + "integrity": "sha512-JBItcnPuYq7jVJdZo/vMj94r+szT7XEjHFX+mvFDGSEIbVAXAGyHAHzhbWzpGOwYidCZrErJLLgn2PVeiokHnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.3.1", + "@shikijs/vscode-textmate": "^10.0.2", + "oniguruma-to-es": "^4.3.6" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/engine-oniguruma": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-4.3.1.tgz", + "integrity": "sha512-OXyNMzg0pews+msMj4cHeqT4xiYKKvbnn6VbdAXxfoFl3SSx4fJTc8FadECuc5/H9p3BzhNAoAUXKwAu9rWYhg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.3.1", + "@shikijs/vscode-textmate": "^10.0.2" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/langs": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-4.3.1.tgz", + "integrity": "sha512-m0l9nsDqgBHvbZbk7A0/kXz/impK3uB/c6rAn6Gpg/uPtdZRQ+alsN/17MU5thb68XTj/4DxkZAotrM0GGSpDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.3.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/primitive": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@shikijs/primitive/-/primitive-4.3.1.tgz", + "integrity": "sha512-CXQRQOYy1leqQ8ceTeJdmXv/bsUY++6QyLpXJ94LZAAYj5X2SKRdc5ipguv4NPyGVKItB2PPwUpRNe0Sjh5S1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.3.1", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/themes": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-4.3.1.tgz", + "integrity": "sha512-dgpoJ4WqNi2yTmizQHBJ5zcX6j2lE6icN/0yt4l1kkf16jrY/pwPLoTb1ETsWMz0OBLf9ZNvwmxft+cH+N9qSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "4.3.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@shikijs/types": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-4.3.1.tgz", + "integrity": "sha512-CHFxE0jztBIZRHH6gxXE7DXUCFXjReEGxZ/j0rfSLGKZuwp2xBYycEP14875DSa9KLL/6700oxIq6oO6ef9K2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + }, + "engines": { + "node": ">=20" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/@shuding/opentype.js": { + "version": "1.4.0-beta.0", + "resolved": "https://registry.npmjs.org/@shuding/opentype.js/-/opentype.js-1.4.0-beta.0.tgz", + "integrity": "sha512-3NgmNyH3l/Hv6EvsWJbsvpcpUba6R8IREQ83nH83cyakCw7uM1arZKNfHwv1Wz6jgqrF/j4x5ELvR6PnK9nTcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fflate": "^0.7.3", + "string.prototype.codepointat": "^0.2.1" + }, + "bin": { + "ot": "bin/ot" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/@tailwindcss/node": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.2.tgz", + "integrity": "sha512-yWP/sqEcBLaD8JuA6zNwxoYKr75qxTioYwlRwekj5Jr/I5GXnoJfjetH/psLUIv74cYTH2lBUEzBkinthoYcBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "enhanced-resolve": "5.21.6", + "jiti": "^2.7.0", + "lightningcss": "1.32.0", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.3.2" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.2.tgz", + "integrity": "sha512-z8ZgnzX8gdNoWLBLqBPoh/sjnxkwvf9ZuWjnO0l0yIzbLa5/9S+eC5QxGZKRobVHIC3/1BoMWjHblqWjcgFgag==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.3.2", + "@tailwindcss/oxide-darwin-arm64": "4.3.2", + "@tailwindcss/oxide-darwin-x64": "4.3.2", + "@tailwindcss/oxide-freebsd-x64": "4.3.2", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.2", + "@tailwindcss/oxide-linux-arm64-gnu": "4.3.2", + "@tailwindcss/oxide-linux-arm64-musl": "4.3.2", + "@tailwindcss/oxide-linux-x64-gnu": "4.3.2", + "@tailwindcss/oxide-linux-x64-musl": "4.3.2", + "@tailwindcss/oxide-wasm32-wasi": "4.3.2", + "@tailwindcss/oxide-win32-arm64-msvc": "4.3.2", + "@tailwindcss/oxide-win32-x64-msvc": "4.3.2" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.2.tgz", + "integrity": "sha512-WHxqIuHpvZ5VtdX6GTl1Ik/Vp2YuN42Et+0CdeaVd/frQ9jAvGmvR8vLT+jk3e8/Q3x8kECB9+R17pgpp2BulA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.2.tgz", + "integrity": "sha512-GZypeUY/IDJW3877KeM+O67vbXr3MBnbtEL4aYhNErv/JWZhye2vGSWWG9tB6iiqR2MqRNkY8IOUy4NdSZV26w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.2.tgz", + "integrity": "sha512-UIIzmefR6KO1sDU7MzRqAxC8iBpft/VhkGjTjnhoS6k7Z3rQ9wEgA1ODSiyH/tcSYssulNm4Ci3hOeK1jH7ccQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.2.tgz", + "integrity": "sha512-GN+uAmcI6DNspnCDwtOAZrTz6oukJnp337qZvxqCGLd3BHBzJpO0ZbTLRvJNdztOeAmTzewewGIMPb0tk2R4WA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.2.tgz", + "integrity": "sha512-4ABn7qSbdHRwTiDiuWNegCyb5+2FJ4vKIKc3DmKrvAFw7MU1Lm11dIkTPwUaFdTzc7IsOpDbqBrlh0x6y36U/w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.2.tgz", + "integrity": "sha512-wDgEIGwoM8w8pufh9LVt1PahDgNdKXrLC2qfAnV3vAmococ9RWbxeAw4pxPttd/TsJfwjyLf90Dg1y9y8I6Emw==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.2.tgz", + "integrity": "sha512-J5Nuk0uZQIiMTJj3LEx4sAA9tMFUoXQZFv1J6An+QGYe53HKRJuFDi0rpq/tuouCZeAbOBY3kQ6g8qeD4TUjtA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.2.tgz", + "integrity": "sha512-kqCZpSKOBEJO4mz7OqWoofBZeXTAwaVGPj0ErAj7CojmhKpWVWVOnrt9dE8odoIraZq4oj3ausM37kXi+Tow8w==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.2.tgz", + "integrity": "sha512-cixpqbh2toJDmkuCRI68nXA8ZxNmdK9Y+9v5h3MC3ZQKy/0BO8AWzlkWyRM7JAFSGBlfig4YVTPsK6MVgqz1uw==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.2.tgz", + "integrity": "sha512-4ec2Z/LOmRsAgU23CS4xeJfcJlmRg94A/XrbGRCF1gyU/zdDfRLYDVsS+ynSZCmGNxQ1jQriQOKMQeQxBA3Isw==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.11.1", + "@emnapi/runtime": "^1.11.1", + "@emnapi/wasi-threads": "^1.2.2", + "@napi-rs/wasm-runtime": "^1.1.4", + "@tybys/wasm-util": "^0.10.2", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.2.tgz", + "integrity": "sha512-Zyr/M0+XcYZu3bZrUytc7TXvrk0ftWfl8gN2MwekNDzhqhKRUucMPSeOzM0o0wH5AWOU49BsKRrfKxI2atCPMQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.2.tgz", + "integrity": "sha512-QI9BO7KlNZsp2GuO0jwAAj5jCDABOKXRkCk2XuKTSaNEFSdfzqswYVTtCHBNKHLsqyjFyFkqlDiwkNbTYSssMQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/typography": { + "version": "0.5.20", + "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.20.tgz", + "integrity": "sha512-hwbzQuNUfcPvbegQFatVPl/MY/tcM9KLl963hQ5laJKPh81TEZ1+dNG9PirGvcaDBkp+BCshExAyKVPW91dozw==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "6.0.10" + }, + "peerDependencies": { + "tailwindcss": ">=3.0.0 || >=4.0.0 || insiders" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.3.2.tgz", + "integrity": "sha512-eHpMeX4JXfVNJDEcsouTeCBubJBTcTLigeaw/NTUW6PB5ATKKXdyonnXgTBX2VuRbjz1hjfz6C5XAhr52ImQXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tailwindcss/node": "4.3.2", + "@tailwindcss/oxide": "4.3.2", + "tailwindcss": "4.3.2" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6 || ^7 || ^8" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz", + "integrity": "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/hast": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.5.tgz", + "integrity": "sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.3.tgz", + "integrity": "sha512-60YRaenCQcVjYEKOcG824+DRGGIQ3VKErcBoAEDJZz5bKIs2ZG+X/H9Nk+Q6EVkwJk5QNApxbrc5QtBSwtrXAg==", + "dev": true, + "license": "ISC" + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "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==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/babel-plugin-transform-hook-names": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-hook-names/-/babel-plugin-transform-hook-names-1.0.2.tgz", + "integrity": "sha512-5gafyjyyBTTdX/tQQ0hRgu4AhNHG/hqWi0ZZmg2xvs2FgRkJXzDNKBZCyoYqgFkovfDrgM8OoKg8karoUvWeCw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@babel/core": "^7.12.10" + } + }, + "node_modules/base64-js": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz", + "integrity": "sha512-3XSA2cR/h/73EzlXXdU6YNycmYI7+kicTxks4eJg2g39biHR84slg2+des+p7iHYhbRg/udIS4TD53WabcOUkw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.43", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.43.tgz", + "integrity": "sha512-AjYpR78kDWAY3Efj+cDTFH9t9SCoL7OoTp1BOb0mQV7S+6CiLwnWM3FyxhJtdPufDFKzmCSFoUncKjWgJEZTCQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.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==", + "dev": true, + "license": "ISC" + }, + "node_modules/browserslist": { + "version": "4.28.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.6.tgz", + "integrity": "sha512-FQBYNK15VMslhLHpA7+n+n1GOlF1kId2xcCg7/j95f24AOF6VDYMNH4mFxF7KuaTdv627faazpOAjFzMrfJOUw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.10.42", + "caniuse-lite": "^1.0.30001803", + "electron-to-chromium": "^1.5.389", + "node-releases": "^2.0.51", + "update-browserslist-db": "^1.2.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/call-me-maybe": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", + "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/camelize": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", + "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001805", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001805.tgz", + "integrity": "sha512-52noaS3DubycKSXaU30TwPGIp+POyQSUVa5jBEq3vkRkY0kjyb3LQgvhU6WGyCcyXqVLWO0Cw0Q6BSdD0kUfVA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/citty": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/citty/-/citty-0.1.6.tgz", + "integrity": "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "consola": "^3.2.3" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz", + "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/consola": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", + "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/css-background-parser": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/css-background-parser/-/css-background-parser-0.1.0.tgz", + "integrity": "sha512-2EZLisiZQ+7m4wwur/qiYJRniHX4K5Tc9w93MT3AS0WS1u5kaZ4FKXlOTBhOjc+CgEgPiGY+fX1yWD8UwpEqUA==", + "dev": true, + "license": "MIT" + }, + "node_modules/css-box-shadow": { + "version": "1.0.0-3", + "resolved": "https://registry.npmjs.org/css-box-shadow/-/css-box-shadow-1.0.0-3.tgz", + "integrity": "sha512-9jaqR6e7Ohds+aWwmhe6wILJ99xYQbfmK9QQB9CcMjDbTxPZjwEmUQpU91OG05Xgm8BahT5fW+svbsQGjS/zPg==", + "dev": true, + "license": "MIT" + }, + "node_modules/css-color-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", + "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=4" + } + }, + "node_modules/css-gradient-parser": { + "version": "0.0.17", + "resolved": "https://registry.npmjs.org/css-gradient-parser/-/css-gradient-parser-0.0.17.tgz", + "integrity": "sha512-w2Xy9UMMwlKtou0vlRnXvWglPAceXCTtcmVSo8ZBUvqCV5aXEFP/PC6d+I464810I9FT++UACwTD5511bmGPUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "node_modules/css-select": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-select/node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/css-select/node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/css-select/node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/css-select/node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/css-select/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/css-to-react-native": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", + "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "camelize": "^1.0.0", + "css-color-keywords": "^1.0.0", + "postcss-value-parser": "^4.0.2" + } + }, + "node_modules/css-what": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "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==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/dayjs": { + "version": "1.11.21", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.21.tgz", + "integrity": "sha512-98IT+HOahAisibz/yjKbzuOBwYcjJ7BCLPzARyHiyEBmRz4fatF+KPJszEHXsGYjUG234aH/cOjW1wwTbKUZlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/dom-serializer": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-3.1.1.tgz", + "integrity": "sha512-4MEa38/QexBob6gFNwu+EGdWvhJ1OKuNwdYY3Y3NyeWDQfnGeDYQUDfIRzWu5B5gsv03so2Uxd28YC6zrsx3Lw==", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^3.0.0", + "domhandler": "^6.0.0", + "entities": "^8.0.0" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-3.0.0.tgz", + "integrity": "sha512-umCQid3jKbDmVjx8jGaW7uUykm4DEUeyV21hPxNMo2nV955DhUThwqyOIDtreepP31hl84X7G5U9ZfsWvIB3Pg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause", + "engines": { + "node": ">=20.19.0" + } + }, + "node_modules/domhandler": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-6.0.1.tgz", + "integrity": "sha512-gYzvtM72ZtxQO0T048kd6HWSbbGCNOUwcnfQ01cqIJ4X2IYKFFHZ5mKvrQETcFXxsRObZulDaKmy//R7TPtsBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^3.0.0" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-4.0.2.tgz", + "integrity": "sha512-qI4JLRKnSzqFqr7hAlS5xQDusBCjKSEG4t4+7aNrIQMHBcsC2TGEhuyABJdYkgSewL57PNLYEiibY2iPKhKpaA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^3.0.0", + "domelementtype": "^3.0.0", + "domhandler": "^6.0.0" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.389", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.389.tgz", + "integrity": "sha512-cEto7aeOqBfU1D+c5py5pE+ooscKE75JifxLBdFUZsqAxRS6y7kebtxAZvICszSl05gPjYHDTjY+lXpyGvpJbg==", + "dev": true, + "license": "ISC" + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/emoji-regex-xs": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/emoji-regex-xs/-/emoji-regex-xs-2.0.1.tgz", + "integrity": "sha512-1QFuh8l7LqUcKe24LsPUNzjrzJQ7pgRwp1QMcZ5MX6mFplk2zQ08NVCM84++1cveaUUYtcCYHmeFEuNg16sU4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.21.6", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.21.6.tgz", + "integrity": "sha512-aNnGCvbJ/RIyWo1IuhNdVjnNF+EjH9wpzpNHt+ci/m9He9LJvUN8wrCcXjp9cWsGNAuvSpVFTx/vraAFQ8qGjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-8.0.0.tgz", + "integrity": "sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/es6-promise": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", + "integrity": "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==", + "dev": true, + "license": "MIT" + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true, + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "dev": true, + "license": "MIT" + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fflate": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.7.4.tgz", + "integrity": "sha512-5u2V/CDW15QM1XbbgS+0DfPxVB+jUKhWEKuuFuHncbk3tEEqzmoXL+2KyOFuKGqOnmdIy0/davWF1CkuwtibCw==", + "dev": true, + "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==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/handlebars": { + "version": "4.7.9", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.9.tgz", + "integrity": "sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "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==", + "dev": true, + "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-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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/heroicons": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/heroicons/-/heroicons-2.2.0.tgz", + "integrity": "sha512-yOwvztmNiBWqR946t+JdgZmyzEmnRMC2nxvHFC90bF1SUttwB6yJKYeme1JeEcBfobdOs827nCyiWBS2z/brog==", + "dev": true, + "license": "MIT" + }, + "node_modules/hex-rgb": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/hex-rgb/-/hex-rgb-4.3.0.tgz", + "integrity": "sha512-Ox1pJVrDCyGHMG9CFg1tmrRUMRPRsAWYc/PinY0XzJU4K7y7vjNoLKIQ7BR5UJMCxNN8EM1MNDmHWA/B3aZUuw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/htmlparser2": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-12.0.0.tgz", + "integrity": "sha512-Tz7u1i95/g2x2jz81+x0FBVhBhY5aRTvD3tXXdFaljuNdzDLJ8UGNRrTcj2cgQvAg3iW/h77Fz15nLW0L0CrZw==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^3.0.0", + "domhandler": "^6.0.0", + "domutils": "^4.0.2", + "entities": "^8.0.0" + }, + "engines": { + "node": ">=20.19.0" + } + }, + "node_modules/http2-client": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/http2-client/-/http2-client-1.3.5.tgz", + "integrity": "sha512-EC2utToWl4RKfs5zd36Mxq7nzHHBuomZboI0yYL6Y0RmBgT7Sgkq4rQ0ezFTYoIsSs7Tm9SJe+o2FcAg6GBhGA==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jiti": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", + "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.0.tgz", + "integrity": "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/kolorist": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", + "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/launder": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/launder/-/launder-1.7.1.tgz", + "integrity": "sha512-mU6WRz5EusL9ZZuiZ5SO4Y6C0P9PAUR9iwdb6bzj4KDihm28DiHFw+/yk9DBH4f+Pv1wuzQ4e2jV3oQ7mkIqvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dayjs": "^1.11.7" + } + }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/linebreak": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/linebreak/-/linebreak-1.1.0.tgz", + "integrity": "sha512-MHp03UImeVhB7XZtjd0E4n6+3xr5Dq/9xI/5FptGk5FrbDR3zagPa2DS6U8ks/3HjbKWG9Q1M2ufOzxV2qLYSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "base64-js": "0.0.8", + "unicode-trie": "^2.0.0" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/marked": { + "version": "15.0.12", + "resolved": "https://registry.npmjs.org/marked/-/marked-15.0.12.tgz", + "integrity": "sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA==", + "dev": true, + "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/mcp-parser": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/mcp-parser/-/mcp-parser-0.4.0.tgz", + "integrity": "sha512-KBGcH7tB0nCPTVg+g8NkBTxsALH5qPAiIwSg1bnGvpfsPYdLC2Ubmlv/J+JrhRhd2nnusfqP//O0AXB0ltMUwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mcp-schema": "^0.3.1" + }, + "bin": { + "mcp-parser": "dist/cli.js" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/mcp-schema": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/mcp-schema/-/mcp-schema-0.3.1.tgz", + "integrity": "sha512-2W0uXdIBy4xRLkcZYQtxm1H8e3sGo/sM9+6ciOkPTQCKZnCm2qU+4/CpRSkt32MfoQzDamz6FqzknsFnafi2WA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", + "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", + "dev": true, + "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/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==", + "dev": true, + "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-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==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "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==", + "dev": true, + "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-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "dev": true, + "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==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/moxygen": { + "version": "2.1.12", + "resolved": "https://registry.npmjs.org/moxygen/-/moxygen-2.1.12.tgz", + "integrity": "sha512-jPDT933A9JJNDPXyy4HayCUYhMr9+42oB4n5OwIwcI8b8EX1n184lTRzvyLiNQuv386fj5Qp0F54u1RMTKvkzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "commander": "^13.1.0", + "handlebars": "^4.7.9", + "xml2js": "^0.6.2" + }, + "bin": { + "moxygen": "dist/cli.js" + }, + "engines": { + "node": ">=20" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.16", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.16.tgz", + "integrity": "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==", + "dev": true, + "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/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch-h2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/node-fetch-h2/-/node-fetch-h2-2.3.0.tgz", + "integrity": "sha512-ofRW94Ab0T4AOh5Fk8t0h8OBWrmjb0SSB20xh1H8YnPV9EJ+f5AMoYSUQ2zgJ4Iq2HAK0I2l5/Nequ8YzFS3Hg==", + "dev": true, + "license": "MIT", + "dependencies": { + "http2-client": "^1.2.5" + }, + "engines": { + "node": "4.x || >=6.0.0" + } + }, + "node_modules/node-html-parser": { + "version": "6.1.13", + "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-6.1.13.tgz", + "integrity": "sha512-qIsTMOY4C/dAa5Q5vsobRpOOvPfC4pB61UVW2uSwZNUp0QU/jCekTal1vMmbO0DgdHeLUJpv/ARmDqErVxA3Sg==", + "dev": true, + "license": "MIT", + "dependencies": { + "css-select": "^5.1.0", + "he": "1.2.0" + } + }, + "node_modules/node-readfiles": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/node-readfiles/-/node-readfiles-0.2.0.tgz", + "integrity": "sha512-SU00ZarexNlE4Rjdm83vglt5Y9yiQ+XI1XpflWlb7q7UTN1JUItm69xMeiQCTxtTfnzt+83T8Cx+vI2ED++VDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es6-promise": "^3.2.1" + } + }, + "node_modules/node-releases": { + "version": "2.0.51", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.51.tgz", + "integrity": "sha512-wRNIrw4DmVLKQlbgOMdkMx27Wrpzes2hh5Jtbi2bjPd+4wJstWIqP5A+lscnqbm0xxmT5Bpg8Lec5ItEBwx6BQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "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==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/oas-kit-common": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/oas-kit-common/-/oas-kit-common-1.0.8.tgz", + "integrity": "sha512-pJTS2+T0oGIwgjGpw7sIRU8RQMcUoKCDWFLdBqKB2BNmGpbBMH2sdqAaOXUg8OzonZHU0L7vfJu1mJFEiYDWOQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "fast-safe-stringify": "^2.0.7" + } + }, + "node_modules/oas-linter": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/oas-linter/-/oas-linter-3.2.2.tgz", + "integrity": "sha512-KEGjPDVoU5K6swgo9hJVA/qYGlwfbFx+Kg2QB/kd7rzV5N8N5Mg6PlsoCMohVnQmo+pzJap/F610qTodKzecGQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@exodus/schemasafe": "^1.0.0-rc.2", + "should": "^13.2.1", + "yaml": "^1.10.0" + }, + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/oas-linter/node_modules/yaml": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.3.tgz", + "integrity": "sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/oas-resolver": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/oas-resolver/-/oas-resolver-2.5.6.tgz", + "integrity": "sha512-Yx5PWQNZomfEhPPOphFbZKi9W93CocQj18NlD2Pa4GWZzdZpSJvYwoiuurRI7m3SpcChrnO08hkuQDL3FGsVFQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "node-fetch-h2": "^2.3.0", + "oas-kit-common": "^1.0.8", + "reftools": "^1.1.9", + "yaml": "^1.10.0", + "yargs": "^17.0.1" + }, + "bin": { + "resolve": "resolve.js" + }, + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/oas-resolver/node_modules/yaml": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.3.tgz", + "integrity": "sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/oas-schema-walker": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/oas-schema-walker/-/oas-schema-walker-1.1.5.tgz", + "integrity": "sha512-2yucenq1a9YPmeNExoUa9Qwrt9RFkjqaMAA1X+U7sbb0AqBeTIdMHky9SQQ6iN94bO5NW0W4TRYXerG+BdAvAQ==", + "dev": true, + "license": "BSD-3-Clause", + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/oas-validator": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/oas-validator/-/oas-validator-5.0.8.tgz", + "integrity": "sha512-cu20/HE5N5HKqVygs3dt94eYJfBi0TsZvPVXDhbXQHiEityDN+RROTleefoKRKKJ9dFAF2JBkDHgvWj0sjKGmw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "call-me-maybe": "^1.0.1", + "oas-kit-common": "^1.0.8", + "oas-linter": "^3.2.2", + "oas-resolver": "^2.5.6", + "oas-schema-walker": "^1.1.5", + "reftools": "^1.1.9", + "should": "^13.2.1", + "yaml": "^1.10.0" + }, + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/oas-validator/node_modules/yaml": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.3.tgz", + "integrity": "sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/oniguruma-parser": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.2.tgz", + "integrity": "sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==", + "dev": true, + "license": "MIT" + }, + "node_modules/oniguruma-to-es": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.3.6.tgz", + "integrity": "sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "oniguruma-parser": "^0.12.2", + "regex": "^6.1.0", + "regex-recursion": "^6.0.2" + } + }, + "node_modules/pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==", + "dev": true, + "license": "MIT" + }, + "node_modules/parse-css-color": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/parse-css-color/-/parse-css-color-0.2.1.tgz", + "integrity": "sha512-bwS/GGIFV3b6KS4uwpzCFj4w297Yl3uqnSgIPsoQkx7GMLROXfMnWvxfNkL0oh8HVhZA4hvJoEoEIqonfJ3BWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "^1.1.4", + "hex-rgb": "^4.1.0" + } + }, + "node_modules/parse-srcset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-srcset/-/parse-srcset-1.0.2.tgz", + "integrity": "sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q==", + "dev": true, + "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==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.18.tgz", + "integrity": "sha512-xdB1oSLHbz1vRWgCDalrCqEFTWzFlhqFC5tIHLMOSUIjhm3XXQ1qrFy8S/ESr1JYRRXqM3c1QFiMZUJdUTqyMQ==", + "dev": true, + "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.12", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/preact": { + "version": "10.29.7", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.29.7.tgz", + "integrity": "sha512-DCHYrK/B10yUD3ZjLfhZ3WIE/9Vf9VFUODcRE2dRomTYDpJk6z6L9wecSfhfE6M9ZTHUdyQkoC46arIDhEV84Q==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + }, + "peerDependencies": { + "preact-render-to-string": ">=5" + }, + "peerDependenciesMeta": { + "preact-render-to-string": { + "optional": true + } + } + }, + "node_modules/preact-render-to-string": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/preact-render-to-string/-/preact-render-to-string-6.7.0.tgz", + "integrity": "sha512-Z4WR8fmLMRpdYqJ9i7vrlXSsSrxVJydwrkEXHapexfARbWfGb7vGcnvNQnIzN0cXciMVOlz/XLoiMCi9gUsy9Q==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "preact": ">=10 || >= 11.0.0-0" + } + }, + "node_modules/property-information": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.2.0.tgz", + "integrity": "sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/reftools": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/reftools/-/reftools-1.1.9.tgz", + "integrity": "sha512-OVede/NQE13xBQ+ob5CKd5KyeJYU2YInb1bmV4nRoOfquZPkAkxuOXicSe1PvqIuZZ4kD13sPKBbR7UFDmli6w==", + "dev": true, + "license": "BSD-3-Clause", + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/regex/-/regex-6.1.0.tgz", + "integrity": "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/rolldown": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.1.5.tgz", + "integrity": "sha512-t9z29cJjXf/vxQ8dyhCSpt6H6aSwHTk8cT5I3iy6SMXuFpk5mB6PL6XfC8PCwrPTx93udwKUm9HRteAlTGBLiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.139.0", + "@rolldown/pluginutils": "^1.0.0" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.1.5", + "@rolldown/binding-darwin-arm64": "1.1.5", + "@rolldown/binding-darwin-x64": "1.1.5", + "@rolldown/binding-freebsd-x64": "1.1.5", + "@rolldown/binding-linux-arm-gnueabihf": "1.1.5", + "@rolldown/binding-linux-arm64-gnu": "1.1.5", + "@rolldown/binding-linux-arm64-musl": "1.1.5", + "@rolldown/binding-linux-ppc64-gnu": "1.1.5", + "@rolldown/binding-linux-s390x-gnu": "1.1.5", + "@rolldown/binding-linux-x64-gnu": "1.1.5", + "@rolldown/binding-linux-x64-musl": "1.1.5", + "@rolldown/binding-openharmony-arm64": "1.1.5", + "@rolldown/binding-wasm32-wasi": "1.1.5", + "@rolldown/binding-win32-arm64-msvc": "1.1.5", + "@rolldown/binding-win32-x64-msvc": "1.1.5" + } + }, + "node_modules/sanitize-html": { + "version": "2.17.6", + "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.17.6.tgz", + "integrity": "sha512-M4bo9tfv1yfhQZZKkc6dL07ALrGJtfvNOuhX3hU9AVPR/uPQ+nKOJBqTYc7LfMQblTW04mtSWDJWEyLvygJsLA==", + "dev": true, + "license": "MIT", + "dependencies": { + "deepmerge": "^4.2.2", + "escape-string-regexp": "^4.0.0", + "htmlparser2": "^12.0.0", + "is-plain-object": "^5.0.0", + "launder": "^1.7.1", + "parse-srcset": "^1.0.2", + "postcss": "^8.3.11" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/satori": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/satori/-/satori-0.26.0.tgz", + "integrity": "sha512-tkMFrfIs3l2mQ2JEcyW0ADTy3zGggFRFzi6Ef8YozQSFsFKEqaSO1Y8F9wJg4//PJGQauMalHGTUEkPrFwhVPA==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "@shuding/opentype.js": "1.4.0-beta.0", + "css-background-parser": "^0.1.0", + "css-box-shadow": "1.0.0-3", + "css-gradient-parser": "^0.0.17", + "css-to-react-native": "^3.0.0", + "emoji-regex-xs": "^2.0.1", + "escape-html": "^1.0.3", + "linebreak": "^1.1.0", + "parse-css-color": "^0.2.1", + "postcss-value-parser": "^4.2.0", + "yoga-layout": "^3.2.1" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/sax": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", + "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=11.0.0" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/shiki": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-4.3.1.tgz", + "integrity": "sha512-oR+qDVi2OjX1tmDpyv+3KviX01KzO6Af+0NNnKnsp9491UEGz2YpxTuJboS/6VhYpTdqzmuJBuiTlrAWWJAssw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/core": "4.3.1", + "@shikijs/engine-javascript": "4.3.1", + "@shikijs/engine-oniguruma": "4.3.1", + "@shikijs/langs": "4.3.1", + "@shikijs/themes": "4.3.1", + "@shikijs/types": "4.3.1", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/should": { + "version": "13.2.3", + "resolved": "https://registry.npmjs.org/should/-/should-13.2.3.tgz", + "integrity": "sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "should-equal": "^2.0.0", + "should-format": "^3.0.3", + "should-type": "^1.4.0", + "should-type-adaptors": "^1.0.1", + "should-util": "^1.0.0" + } + }, + "node_modules/should-equal": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/should-equal/-/should-equal-2.0.0.tgz", + "integrity": "sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "should-type": "^1.4.0" + } + }, + "node_modules/should-format": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/should-format/-/should-format-3.0.3.tgz", + "integrity": "sha512-hZ58adtulAk0gKtua7QxevgUaXTTXxIi8t41L3zo9AHvjXO1/7sdLECuHeIN2SRtYXpNkmhoUP2pdeWgricQ+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "should-type": "^1.3.0", + "should-type-adaptors": "^1.0.1" + } + }, + "node_modules/should-type": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/should-type/-/should-type-1.4.0.tgz", + "integrity": "sha512-MdAsTu3n25yDbIe1NeN69G4n6mUnJGtSJHygX3+oN0ZbO3DTiATnf7XnYJdGT42JCXurTb1JI0qOBR65shvhPQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/should-type-adaptors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz", + "integrity": "sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "should-type": "^1.3.0", + "should-util": "^1.0.0" + } + }, + "node_modules/should-util": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/should-util/-/should-util-1.0.1.tgz", + "integrity": "sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g==", + "dev": true, + "license": "MIT" + }, + "node_modules/simple-code-frame": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/simple-code-frame/-/simple-code-frame-1.3.0.tgz", + "integrity": "sha512-MB4pQmETUBlNs62BBeRjIFGeuy/x6gGKh7+eRUemn1rCFhqo7K+4slPqsyizCbcbYLnaYqaoZ2FWsZ/jN06D8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "kolorist": "^1.6.0" + } + }, + "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==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sourcey": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/sourcey/-/sourcey-3.6.5.tgz", + "integrity": "sha512-Pq0UMFsMha5lYrA57iPiUxXe3usvpzbuOs8kawQydxFGUlGvasP9bPFF2gQpN9yWBTWpnIVlaxZamHEzdtj+1A==", + "dev": true, + "license": "AGPL-3.0-only", + "dependencies": { + "@apidevtools/json-schema-ref-parser": "^13.0.5", + "@preact/preset-vite": "^2.10.4", + "@resvg/resvg-js": "^2.6.2", + "@tailwindcss/typography": "^0.5.19", + "@tailwindcss/vite": "^4.2.2", + "citty": "^0.1.6", + "heroicons": "^2.2.0", + "jiti": "^2.6.1", + "js-yaml": "^4.1.0", + "marked": "^15.0.0", + "mcp-parser": "^0.4.0", + "moxygen": "^2.1.12", + "preact": "^10.28.4", + "preact-render-to-string": "^6.6.6", + "sanitize-html": "^2.17.4", + "satori": "^0.26.0", + "shiki": "^4.0.2", + "swagger2openapi": "^7.0.8", + "tailwindcss": "^4.2.2", + "vite": "^8.0.9" + }, + "bin": { + "sourcey": "dist/cli.js" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://sourcey.com" + } + }, + "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==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/stack-trace": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-1.0.0.tgz", + "integrity": "sha512-H6D7134xi6qONvh7ZHKgviXf+rd3vhGBSvebPZCaUkd8zvQ+7PtDw6CljPTe4cXWNf2IKZGNqw6VJXSb9IgBpA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.0.0" + } + }, + "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==", + "dev": true, + "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/string.prototype.codepointat": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string.prototype.codepointat/-/string.prototype.codepointat-0.2.1.tgz", + "integrity": "sha512-2cBVCj6I4IOvEnjgO/hWqXjqBGsY+zwPmHl12Srk9IXSZ56Jwwmy+66XO5Iut/oQVR7t5ihYdLB0GMa4alEUcg==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "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": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/swagger2openapi": { + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/swagger2openapi/-/swagger2openapi-7.0.8.tgz", + "integrity": "sha512-upi/0ZGkYgEcLeGieoz8gT74oWHA0E7JivX7aN9mAf+Tc7BQoRBvnIGHoPDw+f9TXTW4s6kGYCZJtauP6OYp7g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "call-me-maybe": "^1.0.1", + "node-fetch": "^2.6.1", + "node-fetch-h2": "^2.3.0", + "node-readfiles": "^0.2.0", + "oas-kit-common": "^1.0.8", + "oas-resolver": "^2.5.6", + "oas-schema-walker": "^1.1.5", + "oas-validator": "^5.0.8", + "reftools": "^1.1.9", + "yaml": "^1.10.0", + "yargs": "^17.0.1" + }, + "bin": { + "boast": "boast.js", + "oas-validate": "oas-validate.js", + "swagger2openapi": "swagger2openapi.js" + }, + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/swagger2openapi/node_modules/yaml": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.3.tgz", + "integrity": "sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/tailwindcss": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.2.tgz", + "integrity": "sha512-WtctNNSH8A9jlMIqxzuYumOHU5uGZyRv0Q5svQl+oEPy5w84YpBxdb7MdqyiSPQge5jTJ6zFQLq0PFygdccSBA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tiny-inflate": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", + "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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==", + "dev": true, + "license": "0BSD", + "optional": true + }, + "node_modules/uglify-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/unicode-trie": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-trie/-/unicode-trie-2.0.0.tgz", + "integrity": "sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "pako": "^0.2.5", + "tiny-inflate": "^1.0.0" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", + "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", + "dev": true, + "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-parents": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "dev": true, + "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": "8.1.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.1.4.tgz", + "integrity": "sha512-bTT9PsdWO+MQMNG9ZXIP/qM9wGh37DFxTV/sPq9cFpHr3w4jkgef032PkAL9jAqhk3Nz8NQw3O8n6/xFkqO4QQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "lightningcss": "^1.32.0", + "picomatch": "^4.0.5", + "postcss": "^8.5.16", + "rolldown": "~1.1.4", + "tinyglobby": "^0.2.17" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.3.0", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "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/vite-prerender-plugin": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/vite-prerender-plugin/-/vite-prerender-plugin-0.5.13.tgz", + "integrity": "sha512-IKSpYkzDBsKAxa05naRbj7GvNVMSdww/Z/E89oO3xndz+gWnOBOKOAbEXv7qDhktY/j3vHgJmoV1pPzqU2tx9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "kolorist": "^1.8.0", + "magic-string": "0.x >= 0.26.0", + "node-html-parser": "^6.1.12", + "simple-code-frame": "^1.3.0", + "source-map": "^0.7.4", + "stack-trace": "^1.0.0-pre2" + }, + "peerDependencies": { + "vite": "5.x || 6.x || 7.x || 8.x" + } + }, + "node_modules/vite-prerender-plugin/node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/xml2js": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz", + "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", + "dev": true, + "license": "MIT", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yaml": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", + "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", + "extraneous": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "node_modules/yargs": { + "version": "17.7.3", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.3.tgz", + "integrity": "sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "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==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yoga-layout": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/yoga-layout/-/yoga-layout-3.2.1.tgz", + "integrity": "sha512-0LPOt3AxKqMdFBZA3HBAt/t/8vIKq7VaQYbuA8WxCgung+p9TVyKRYdpvCb80HcdTN2NkbIKbhNwKUfm3tQywQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/zimmerframe": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/zimmerframe/-/zimmerframe-1.1.4.tgz", + "integrity": "sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/docs-sourcey/package.json b/docs-sourcey/package.json new file mode 100644 index 00000000..489feedd --- /dev/null +++ b/docs-sourcey/package.json @@ -0,0 +1,15 @@ +{ + "name": "ftpserverlib-sourcey-docs", + "private": true, + "scripts": { + "build": "sourcey build && node validation/write-compat-aliases.mjs", + "linkcheck": "node validation/linkcheck.mjs", + "snapshot": "sourcey godoc --module .. --packages ./... --out godoc.json", + "test-linkcheck": "node --test validation/linkcheck.test.mjs", + "validate": "node validation/run.mjs", + "verify-receipt": "node validation/verify-receipt.mjs" + }, + "devDependencies": { + "sourcey": "3.6.5" + } +} diff --git a/docs-sourcey/quickstart.md b/docs-sourcey/quickstart.md new file mode 100644 index 00000000..714b011d --- /dev/null +++ b/docs-sourcey/quickstart.md @@ -0,0 +1,20 @@ +# Quickstart + +Install the module in a Go project: + +```bash +go get github.com/fclairamb/ftpserverlib +``` + +An embedding application implements `MainDriver`. The driver returns server +settings, authenticates users, chooses a `ClientDriver`, and optionally +provides a TLS configuration. A `ClientDriver` is an `afero.Fs`, so in-memory, +OS-backed, or custom storage can sit behind the FTP protocol. + +For the smallest complete working implementation, start with the test driver +in [`driver_test.go`](https://github.com/fclairamb/ftpserverlib/blob/main/driver_test.go). +The companion [`ftpserver`](https://github.com/fclairamb/ftpserver) repository +is the easiest way to exercise the library before embedding it. + +Next, read [Driver contract](driver-contract) and [Server settings](server-settings), +then use the generated [Go API](../api) for exact signatures. diff --git a/docs-sourcey/server-settings.md b/docs-sourcey/server-settings.md new file mode 100644 index 00000000..7fe18702 --- /dev/null +++ b/docs-sourcey/server-settings.md @@ -0,0 +1,21 @@ +# Server settings + +`Settings` controls listener and protocol behavior. The most important groups +are: + +- **Network:** `Listener`, `ListenAddr`, `PublicHost`, and `PublicIPResolver`. +- **Data channels:** passive port allocation, passive multiplexing, active-mode + policy, and active/passive connection checks. +- **Timeouts:** idle and connection timeouts. +- **TLS:** `TLSRequired`, paired with `MainDriver.GetTLSConfig`. +- **Capabilities:** flags for MLSD, MLST, MFMT, LIST arguments, SITE, HASH, + COMB, STAT, SYST, and active mode. +- **Presentation:** server banner and default transfer type. + +Choose explicit connection-check policies when the server is reachable from +untrusted networks. Active FTP asks the server to connect outward, while +passive FTP exposes a server-side data listener; both deserve deliberate +address and port controls. + +Consult the generated `Settings` reference before upgrading, because fields +and defaults may evolve with the library. diff --git a/docs-sourcey/sourcey.config.ts b/docs-sourcey/sourcey.config.ts new file mode 100644 index 00000000..c8068ff1 --- /dev/null +++ b/docs-sourcey/sourcey.config.ts @@ -0,0 +1,41 @@ +import { defineConfig, godoc, markdown } from "sourcey"; + +export default defineConfig({ + name: "ftpserverlib", + description: "Go API reference for building custom FTP servers with ftpserverlib.", + repo: "https://github.com/fclairamb/ftpserverlib", + editBranch: "b4c3694ee73399d8a55293d568e5100c25e4d2d4", + editBasePath: "docs-sourcey", + navigation: { + tabs: [ + { + tab: "Guides", + slug: "guides", + source: markdown({ + groups: [ + { + group: "Get started", + pages: ["overview", "quickstart"], + }, + { + group: "Build a server", + pages: ["driver-contract", "server-settings", "extensions"], + }, + ], + }), + }, + { + tab: "Go API", + slug: "api", + source: godoc({ + module: "..", + packages: ["./..."], + snapshot: "./godoc.json", + mode: "snapshot", + includeTests: true, + sourceBasePath: "", + }), + }, + ], + }, +}); diff --git a/docs-sourcey/validation/SKILL.md b/docs-sourcey/validation/SKILL.md new file mode 100644 index 00000000..b5b55169 --- /dev/null +++ b/docs-sourcey/validation/SKILL.md @@ -0,0 +1,21 @@ +--- +name: ftpserverlib-sourcey-validation +description: Validate the pinned Sourcey build, generated pages, llms artifacts, and source mappings for ftpserverlib. +source: + type: cli-tool + command: node + args: + - run.mjs + timeout_seconds: 30 + sandbox: + profile: readonly + cwd_policy: skill-directory +runx: + artifacts: + named_emits: + validation: validation +--- + +Validate the reproducible Sourcey documentation build for the pinned +`fclairamb/ftpserverlib` commit and emit a structured summary suitable for a +governed receipt. diff --git a/docs-sourcey/validation/X.yaml b/docs-sourcey/validation/X.yaml new file mode 100644 index 00000000..95441c7a --- /dev/null +++ b/docs-sourcey/validation/X.yaml @@ -0,0 +1,31 @@ +skill: ftpserverlib-sourcey-validation +version: "0.1.0" + +catalog: + kind: skill + audience: public + visibility: public + role: canonical + +harness: + cases: + - name: validate-sourcey-build + runner: default + expect: + status: sealed + receipt: + schema: runx.receipt.v1 + state: sealed + disposition: closed + reason_code: process_closed + +runners: + default: + default: true + type: cli-tool + command: node + args: + - run.mjs + artifacts: + named_emits: + validation: validation diff --git a/docs-sourcey/validation/evidence.json b/docs-sourcey/validation/evidence.json new file mode 100644 index 00000000..d3e9c9bd --- /dev/null +++ b/docs-sourcey/validation/evidence.json @@ -0,0 +1,44 @@ +{ + "schema": "sourcey.validation.evidence.v1", + "ecosystem": "Go", + "repo": "https://github.com/fclairamb/ftpserverlib", + "commit": "b4c3694ee73399d8a55293d568e5100c25e4d2d4", + "license": "MIT", + "adapter": "sourcey godoc snapshot", + "sourcey_version": "3.6.5", + "runx_version": "runx-cli 0.7.0", + "snapshot_command": "sourcey godoc --module .. --packages ./... --out godoc.json", + "build_command": "npm ci && npm run build", + "validation_command": "npm run validate", + "receipt_verification_command": "npm run verify-receipt", + "observations": { + "module_path": "github.com/fclairamb/ftpserverlib", + "snapshot_generated_at": "2026-07-13T07:35:52Z", + "public_api_count": 92, + "generated_html_pages": 8, + "pinned_source_links": 65, + "receipt_id": "sha256:b3d9a335f55e06c13c5766977ac7f31ae3b8480051c6f01e42001c496aefd269", + "receipt_signature_mode": "production", + "receipt_valid": true, + "pages": [ + "index.html", + "guides/overview.html", + "guides/quickstart.html", + "guides/driver-contract.html", + "guides/server-settings.html", + "guides/extensions.html", + "api.html", + "api/package-root.html" + ], + "text_artifacts": [ + "llms.txt", + "llms-full.txt" + ] + }, + "public_url_expected": "https://fclairamb.github.io/ftpserverlib/", + "public_url_status": "pending repository-owner merge and GitHub Pages deployment", + "gaps": [ + "GitHub Pages must be enabled with GitHub Actions as the repository source if it is not already enabled.", + "The live public URL is only asserted after the deployment succeeds." + ] +} diff --git a/docs-sourcey/validation/linkcheck.mjs b/docs-sourcey/validation/linkcheck.mjs new file mode 100644 index 00000000..9a36fa3a --- /dev/null +++ b/docs-sourcey/validation/linkcheck.mjs @@ -0,0 +1,264 @@ +import { readdir, readFile, realpath, stat } from "node:fs/promises"; +import { dirname, isAbsolute, relative, resolve, sep } from "node:path"; +import { fileURLToPath } from "node:url"; + +const MAX_REPORTED_ERRORS = 20; +const ATTRIBUTE_PATTERN = /\b(?:href|src)\s*=\s*(["'])(.*?)\1/giu; +const ANCHOR_PATTERN = /\b(?:id|name)\s*=\s*(["'])(.*?)\1/giu; +const META_PATTERN = /]*>/giu; +const META_ATTRIBUTE_PATTERN = /\b([a-z][\w:-]*)\s*=\s*(["'])(.*?)\2/giu; +const META_ASSET_KEYS = new Set([ + "og:image", + "og:image:url", + "og:image:secure_url", + "sourcey-search", + "twitter:image", + "twitter:image:src", +]); +const EXTERNAL_PATTERN = /^[a-z][a-z\d+.-]*:/iu; + +function decodeHtml(value) { + return value.replace( + /&(?:amp|quot|apos|lt|gt|#\d+|#x[\da-f]+);/giu, + (entity) => { + const normalized = entity.toLowerCase(); + const named = { + "&": "&", + """: '"', + "'": "'", + "<": "<", + ">": ">", + }; + if (named[normalized]) return named[normalized]; + const radix = normalized.startsWith("&#x") ? 16 : 10; + const digits = normalized.slice(radix === 16 ? 3 : 2, -1); + return String.fromCodePoint(Number.parseInt(digits, radix)); + }, + ); +} + +function decodeUrlComponent(value, kind) { + try { + return decodeURIComponent(value); + } catch { + throw new Error(`invalid percent encoding in ${kind}`); + } +} + +function isOutside(root, candidate) { + const pathFromRoot = relative(root, candidate); + return ( + pathFromRoot === ".." || + pathFromRoot.startsWith(`..${sep}`) || + isAbsolute(pathFromRoot) + ); +} + +async function htmlFiles(root) { + const found = []; + async function visit(directory) { + const entries = await readdir(directory, { withFileTypes: true }); + entries.sort((left, right) => left.name.localeCompare(right.name)); + for (const entry of entries) { + const path = resolve(directory, entry.name); + if (entry.isDirectory()) await visit(path); + else if (entry.isFile() && entry.name.endsWith(".html")) found.push(path); + } + } + await visit(root); + return found; +} + +function references(html) { + const found = [...html.matchAll(ATTRIBUTE_PATTERN)].map((match) => + decodeHtml(match[2].trim()), + ); + for (const meta of html.matchAll(META_PATTERN)) { + const attributes = new Map( + [...meta[0].matchAll(META_ATTRIBUTE_PATTERN)].map((match) => [ + match[1].toLowerCase(), + decodeHtml(match[3].trim()), + ]), + ); + const assetKey = (attributes.get("property") ?? attributes.get("name") ?? "") + .toLowerCase(); + if (META_ASSET_KEYS.has(assetKey) && attributes.has("content")) { + found.push(attributes.get("content")); + } + } + return found; +} + +function anchors(html) { + return new Set( + [...html.matchAll(ANCHOR_PATTERN)].map((match) => decodeHtml(match[2])), + ); +} + +function errorRecord(type, source, reference, detail) { + return { type, source, reference, detail }; +} + +export async function checkSite(siteRoot) { + const root = await realpath(resolve(siteRoot)); + const pages = await htmlFiles(root); + const anchorCache = new Map(); + const errors = []; + let errorCount = 0; + let referencesTotal = 0; + let referencesChecked = 0; + let referencesSkipped = 0; + + function addError(record) { + errorCount += 1; + if (errors.length < MAX_REPORTED_ERRORS) errors.push(record); + } + + for (const sourcePath of pages) { + const source = relative(root, sourcePath).replaceAll(sep, "/"); + const html = await readFile(sourcePath, "utf8"); + for (const reference of references(html)) { + referencesTotal += 1; + if ( + reference === "" || + reference.startsWith("//") || + EXTERNAL_PATTERN.test(reference) + ) { + referencesSkipped += 1; + continue; + } + + referencesChecked += 1; + const hashAt = reference.indexOf("#"); + const beforeHash = hashAt === -1 ? reference : reference.slice(0, hashAt); + const rawFragment = hashAt === -1 ? "" : reference.slice(hashAt + 1); + const queryAt = beforeHash.indexOf("?"); + const rawPath = queryAt === -1 ? beforeHash : beforeHash.slice(0, queryAt); + let decodedPath; + let fragment; + try { + decodedPath = decodeUrlComponent(rawPath, "path"); + fragment = decodeUrlComponent(rawFragment, "fragment"); + } catch (error) { + addError(errorRecord("invalid_url", source, reference, error.message)); + continue; + } + + if (decodedPath.includes("\0") || decodedPath.includes("\\")) { + addError( + errorRecord( + "invalid_path", + source, + reference, + "local paths cannot contain NUL or backslash characters", + ), + ); + continue; + } + + const base = decodedPath.startsWith("/") ? root : dirname(sourcePath); + const localPath = decodedPath.startsWith("/") + ? decodedPath.slice(1) + : decodedPath; + let target = decodedPath === "" ? sourcePath : resolve(base, localPath); + if (isOutside(root, target)) { + addError( + errorRecord( + "path_escape", + source, + reference, + "resolved target is outside the generated site root", + ), + ); + continue; + } + + let targetStat; + try { + targetStat = await stat(target); + if (targetStat.isDirectory()) { + target = resolve(target, "index.html"); + targetStat = await stat(target); + } + const canonicalTarget = await realpath(target); + if (isOutside(root, canonicalTarget)) { + addError( + errorRecord( + "path_escape", + source, + reference, + "target resolves through a link outside the generated site root", + ), + ); + continue; + } + } catch { + addError( + errorRecord("missing_target", source, reference, "target does not exist"), + ); + continue; + } + + if (!targetStat.isFile()) { + addError( + errorRecord("missing_target", source, reference, "target is not a file"), + ); + continue; + } + + if (fragment !== "") { + let targetAnchors = anchorCache.get(target); + if (!targetAnchors) { + if (!target.toLowerCase().endsWith(".html")) { + addError( + errorRecord( + "missing_fragment", + source, + reference, + "fragment target is not an HTML file", + ), + ); + continue; + } + targetAnchors = anchors(await readFile(target, "utf8")); + anchorCache.set(target, targetAnchors); + } + if (!targetAnchors.has(fragment)) { + addError( + errorRecord( + "missing_fragment", + source, + reference, + `fragment #${fragment} does not exist`, + ), + ); + } + } + } + } + + return { + status: errors.length === 0 ? "passed" : "failed", + root, + html_files: pages.length, + references_total: referencesTotal, + references_checked: referencesChecked, + references_skipped: referencesSkipped, + error_count: errorCount, + errors, + errors_truncated: errorCount > errors.length, + }; +} + +const invokedPath = process.argv[1] ? resolve(process.argv[1]) : ""; +if (invokedPath === fileURLToPath(import.meta.url)) { + const siteRoot = process.argv[2] ?? resolve(dirname(invokedPath), "..", "dist"); + try { + const result = await checkSite(siteRoot); + process.stdout.write(`${JSON.stringify({ linkcheck: result })}\n`); + if (result.status !== "passed") process.exitCode = 1; + } catch (error) { + process.stderr.write(`${JSON.stringify({ linkcheck: { status: "error", message: error.message } })}\n`); + process.exitCode = 1; + } +} diff --git a/docs-sourcey/validation/linkcheck.test.mjs b/docs-sourcey/validation/linkcheck.test.mjs new file mode 100644 index 00000000..f89529e1 --- /dev/null +++ b/docs-sourcey/validation/linkcheck.test.mjs @@ -0,0 +1,114 @@ +import assert from "node:assert/strict"; +import { mkdir, mkdtemp, rm, writeFile } from "node:fs/promises"; +import { tmpdir } from "node:os"; +import { join } from "node:path"; +import test from "node:test"; + +import { checkSite } from "./linkcheck.mjs"; + +async function fixture(files) { + const root = await mkdtemp(join(tmpdir(), "sourcey-linkcheck-")); + for (const [path, contents] of Object.entries(files)) { + const target = join(root, path); + await mkdir(join(target, ".."), { recursive: true }); + await writeFile(target, contents); + } + return root; +} + +test("accepts local files, encoded fragments, queries, and skipped URLs", async (t) => { + const root = await fixture({ + "index.html": `Page + + + CDN + Mail + `, + "docs/page one.html": `

Hello

Home`, + "assets/app.js": "export {};", + "assets/preview.png": "preview", + }); + t.after(() => rm(root, { recursive: true, force: true })); + + const result = await checkSite(root); + assert.equal(result.status, "passed"); + assert.equal(result.html_files, 2); + assert.equal(result.references_checked, 4); + assert.equal(result.references_skipped, 3); + assert.deepEqual(result.errors, []); +}); + +test("reports a missing local target", async (t) => { + const root = await fixture({ "index.html": `Missing` }); + t.after(() => rm(root, { recursive: true, force: true })); + + const result = await checkSite(root); + assert.equal(result.status, "failed"); + assert.equal(result.errors[0].type, "missing_target"); +}); + +test("reports a missing local social-preview asset", async (t) => { + const root = await fixture({ + "index.html": ``, + }); + t.after(() => rm(root, { recursive: true, force: true })); + + const result = await checkSite(root); + assert.equal(result.status, "failed"); + assert.equal(result.errors[0].type, "missing_target"); + assert.equal(result.errors[0].reference, "preview/missing.png"); +}); + +test("reports a missing Sourcey search index", async (t) => { + const root = await fixture({ + "index.html": ``, + }); + t.after(() => rm(root, { recursive: true, force: true })); + + const result = await checkSite(root); + assert.equal(result.status, "failed"); + assert.equal(result.errors[0].type, "missing_target"); + assert.equal(result.errors[0].reference, "missing-search-index.json"); +}); + +test("reports a missing HTML fragment", async (t) => { + const root = await fixture({ + "index.html": `Missing fragment`, + "page.html": `

Present

`, + }); + t.after(() => rm(root, { recursive: true, force: true })); + + const result = await checkSite(root); + assert.equal(result.status, "failed"); + assert.equal(result.errors[0].type, "missing_fragment"); +}); + +test("rejects encoded attempts to escape the site root", async (t) => { + const root = await fixture({ + "nested/index.html": `Escape`, + }); + t.after(() => rm(root, { recursive: true, force: true })); + + const result = await checkSite(root); + assert.equal(result.status, "failed"); + assert.equal(result.errors[0].type, "path_escape"); +}); + +test("marks errors as truncated only when a record is omitted", async (t) => { + const links = (count) => + Array.from({ length: count }, (_, index) => `x`).join(""); + const exactRoot = await fixture({ "index.html": links(20) }); + const overflowRoot = await fixture({ "index.html": links(21) }); + t.after(() => rm(exactRoot, { recursive: true, force: true })); + t.after(() => rm(overflowRoot, { recursive: true, force: true })); + + const exact = await checkSite(exactRoot); + assert.equal(exact.error_count, 20); + assert.equal(exact.errors.length, 20); + assert.equal(exact.errors_truncated, false); + + const overflow = await checkSite(overflowRoot); + assert.equal(overflow.error_count, 21); + assert.equal(overflow.errors.length, 20); + assert.equal(overflow.errors_truncated, true); +}); diff --git a/docs-sourcey/validation/receipts/sha256-b3d9a335f55e06c13c5766977ac7f31ae3b8480051c6f01e42001c496aefd269.json b/docs-sourcey/validation/receipts/sha256-b3d9a335f55e06c13c5766977ac7f31ae3b8480051c6f01e42001c496aefd269.json new file mode 100644 index 00000000..818865bc --- /dev/null +++ b/docs-sourcey/validation/receipts/sha256-b3d9a335f55e06c13c5766977ac7f31ae3b8480051c6f01e42001c496aefd269.json @@ -0,0 +1 @@ +{"schema":"runx.receipt.v1","id":"sha256:b3d9a335f55e06c13c5766977ac7f31ae3b8480051c6f01e42001c496aefd269","created_at":"2026-07-14T04:50:18.451Z","canonicalization":"runx.receipt.c14n.v1","issuer":{"type":"hosted","kid":"sourcey-validation-20260714125016","public_key_sha256":"sha256:0d52e304223441437d3f998ba09c176c93699fe72eaf71016f49fbdbc2e95db9"},"signature":{"alg":"Ed25519","value":"base64:rN6KMgGHMUXHMZHjGtg6vlPepc754snZ1rZgQw0AbbQiPmifXReTGVoCf5OIYzdSb2rwxgBlI1TByRHXMtfPCA"},"digest":"sha256:e149e733c7f3d8eb01594696c6492ecfb690a5db22de0c3722d5d08879a04f5e","idempotency":{"intent_key":"sha256:run_default_44136fa355b3-default-intent","trigger_fingerprint":"sha256:run_default_44136fa355b3-default-trigger","content_hash":"sha256:run_default_44136fa355b3-default-content"},"subject":{"kind":"skill","ref":{"type":"harness","uri":"hrn_run_default_44136fa355b3_default"},"commitments":[]},"authority":{"actor_ref":{"type":"principal","uri":"runx:principal:local_runtime"},"grant_refs":[],"scope_refs":[],"authority_proof_refs":[],"attenuation":{"parent_authority_ref":null,"subset_proof":null},"terms":[],"enforcement":{"profile_hash":"sha256:635fdb0a7eef93911e3c6bd0b25b5e635edba32e0259133042b3a5f1fb19394e","redaction_refs":[],"setup_refs":[],"teardown_refs":[]}},"signals":[],"decisions":[{"decision_id":"dec_default","choice":"open","inputs":{"signal_refs":[],"target_ref":null,"opportunity_refs":[],"selection_ref":null},"proposed_intent":{"purpose":"Open runtime node default","legitimacy":"Local graph execution requested this node","success_criteria":[],"constraints":[],"derived_from":[]},"selected_act_id":"act_default","selected_harness_ref":null,"justification":{"summary":"runtime graph planner selected this node","evidence_refs":[]},"closure":null,"artifact_refs":[{"type":"artifact","uri":"runx:artifact:operator_context:ff65b5d3ecd4ea2aaba2e13368d0a0711ee8537abe3c00301ea6cdd045d501a5","provider":"runx","locator":"sha256:ff65b5d3ecd4ea2aaba2e13368d0a0711ee8537abe3c00301ea6cdd045d501a5","label":"approved operator context"},{"type":"decision","uri":"runx:decision:operator_context_approval:ff65b5d3ecd4ea2aaba2e13368d0a0711ee8537abe3c00301ea6cdd045d501a5","provider":"runx","locator":"actor=local_operator;mode=explicit_digest","label":"operator context approval","observed_at":"2026-07-14T04:50:18.379Z"}] }],"acts":[{"id":"act_default","form":"observation","intent":{"purpose":"Run graph step default","legitimacy":"Runtime graph execution was admitted by the local harness","success_criteria":[{"criterion_id":"process_exit","statement":"cli-tool exits successfully","required":true}],"constraints":[],"derived_from":[]},"summary":"Executed graph step default","criterion_bindings":[{"criterion_id":"process_exit","status":"verified","evidence_refs":[{"type":"artifact","uri":"runx:artifact:operator_context:ff65b5d3ecd4ea2aaba2e13368d0a0711ee8537abe3c00301ea6cdd045d501a5","provider":"runx","locator":"sha256:ff65b5d3ecd4ea2aaba2e13368d0a0711ee8537abe3c00301ea6cdd045d501a5","label":"approved operator context"},{"type":"decision","uri":"runx:decision:operator_context_approval:ff65b5d3ecd4ea2aaba2e13368d0a0711ee8537abe3c00301ea6cdd045d501a5","provider":"runx","locator":"actor=local_operator;mode=explicit_digest","label":"operator context approval","observed_at":"2026-07-14T04:50:18.379Z"}],"verification_refs":[{"type":"decision","uri":"runx:decision:operator_context_approval:ff65b5d3ecd4ea2aaba2e13368d0a0711ee8537abe3c00301ea6cdd045d501a5","provider":"runx","locator":"actor=local_operator;mode=explicit_digest","label":"operator context approval","observed_at":"2026-07-14T04:50:18.379Z"}],"summary":"cli-tool exited successfully"}],"source_refs":[],"target_refs":[],"artifact_refs":[{"type":"artifact","uri":"runx:artifact:operator_context:ff65b5d3ecd4ea2aaba2e13368d0a0711ee8537abe3c00301ea6cdd045d501a5","provider":"runx","locator":"sha256:ff65b5d3ecd4ea2aaba2e13368d0a0711ee8537abe3c00301ea6cdd045d501a5","label":"approved operator context"},{"type":"decision","uri":"runx:decision:operator_context_approval:ff65b5d3ecd4ea2aaba2e13368d0a0711ee8537abe3c00301ea6cdd045d501a5","provider":"runx","locator":"actor=local_operator;mode=explicit_digest","label":"operator context approval","observed_at":"2026-07-14T04:50:18.379Z"}],"closure":{"disposition":"closed","reason_code":"process_exit","summary":"cli-tool exited successfully","closed_at":"2026-07-14T04:50:18.451Z"}}],"seal":{"disposition":"closed","reason_code":"process_closed","summary":"cli-tool default completed","closed_at":"2026-07-14T04:50:18.451Z","last_observed_at":"2026-07-14T04:50:18.451Z","criteria":[{"criterion_id":"process_exit","status":"verified","evidence_refs":[{"type":"artifact","uri":"runx:artifact:operator_context:ff65b5d3ecd4ea2aaba2e13368d0a0711ee8537abe3c00301ea6cdd045d501a5","provider":"runx","locator":"sha256:ff65b5d3ecd4ea2aaba2e13368d0a0711ee8537abe3c00301ea6cdd045d501a5","label":"approved operator context"},{"type":"decision","uri":"runx:decision:operator_context_approval:ff65b5d3ecd4ea2aaba2e13368d0a0711ee8537abe3c00301ea6cdd045d501a5","provider":"runx","locator":"actor=local_operator;mode=explicit_digest","label":"operator context approval","observed_at":"2026-07-14T04:50:18.379Z"}],"verification_refs":[{"type":"decision","uri":"runx:decision:operator_context_approval:ff65b5d3ecd4ea2aaba2e13368d0a0711ee8537abe3c00301ea6cdd045d501a5","provider":"runx","locator":"actor=local_operator;mode=explicit_digest","label":"operator context approval","observed_at":"2026-07-14T04:50:18.379Z"}],"summary":"cli-tool exited successfully"}]},"lineage":{"children":[],"sync":[]}} diff --git a/docs-sourcey/validation/run.mjs b/docs-sourcey/validation/run.mjs new file mode 100644 index 00000000..b2c40071 --- /dev/null +++ b/docs-sourcey/validation/run.mjs @@ -0,0 +1,83 @@ +import { readFile, stat } from "node:fs/promises"; +import { dirname, join } from "node:path"; +import { fileURLToPath } from "node:url"; + +const commit = "b4c3694ee73399d8a55293d568e5100c25e4d2d4"; +const here = dirname(fileURLToPath(import.meta.url)); +const docs = join(here, ".."); + +const artifacts = [ + "dist/index.html", + "dist/guides/overview.html", + "dist/guides/quickstart.html", + "dist/guides/driver-contract.html", + "dist/guides/server-settings.html", + "dist/guides/extensions.html", + "dist/api.html", + "dist/api/index.html", + "dist/api/package-root.html", + "dist/llms.txt", + "dist/llms-full.txt", +]; + +const artifactSizes = {}; +for (const relative of artifacts) { + artifactSizes[relative] = (await stat(join(docs, relative))).size; +} + +const snapshot = JSON.parse(await readFile(join(docs, "godoc.json"), "utf8")); +const packageSpec = snapshot.packages[0]; +const publicApiCount = + (packageSpec.types?.length ?? 0) + + (packageSpec.funcs?.length ?? 0) + + (packageSpec.consts?.length ?? 0) + + (packageSpec.vars?.length ?? 0); + +const apiHtml = await readFile(join(docs, "dist/api/package-root.html"), "utf8"); +const sourcePattern = new RegExp( + `https://github\\.com/fclairamb/ftpserverlib/blob/${commit}/[^"'\\s<]+#L\\d+`, + "g", +); +const sourceLinks = [...new Set(apiHtml.match(sourcePattern) ?? [])]; + +const requiredSymbols = [ + "FtpServer", + "Settings", + "MainDriver", + "ClientContext", + "ClientDriverExtensionHasher", +]; +const missingSymbols = requiredSymbols.filter((symbol) => !apiHtml.includes(symbol)); + +if (snapshot.module_path !== "github.com/fclairamb/ftpserverlib") { + throw new Error(`unexpected module path: ${snapshot.module_path}`); +} +if (publicApiCount < 15) { + throw new Error(`expected at least 15 public API concepts, found ${publicApiCount}`); +} +if (sourceLinks.length < 15) { + throw new Error(`expected at least 15 pinned source links, found ${sourceLinks.length}`); +} +if (missingSymbols.length > 0) { + throw new Error(`missing generated symbols: ${missingSymbols.join(", ")}`); +} + +process.stdout.write( + `${JSON.stringify({ + validation: { + status: "passed", + repo: "https://github.com/fclairamb/ftpserverlib", + commit, + ecosystem: "Go", + adapter: "sourcey godoc snapshot", + sourcey_version: "3.6.5", + module_path: snapshot.module_path, + generated_at: snapshot.generated_at, + public_api_count: publicApiCount, + generated_html_pages: 9, + pinned_source_links: sourceLinks.length, + required_symbols: requiredSymbols, + artifacts: artifactSizes, + }, + })}\n`, +); diff --git a/docs-sourcey/validation/verify-receipt.mjs b/docs-sourcey/validation/verify-receipt.mjs new file mode 100644 index 00000000..5dca8d5f --- /dev/null +++ b/docs-sourcey/validation/verify-receipt.mjs @@ -0,0 +1,55 @@ +import { spawn } from "node:child_process"; +import { dirname, join } from "node:path"; +import { fileURLToPath } from "node:url"; + +const here = dirname(fileURLToPath(import.meta.url)); +const receiptDir = join(here, "receipts"); +const kid = "sourcey-validation-20260714125016"; +const publicKey = "SCa6Q9u9f5o6LJL8pVzXXves5NqF+qiToVf70IUfpnc="; +const npxCli = process.env.npm_execpath + ? join(dirname(process.env.npm_execpath), "npx-cli.js") + : null; +const command = npxCli ? process.execPath : "npx"; +const commandArgs = [ + "-y", + "@runxhq/cli@0.7.0", + "verify", + "--receipt-dir", + receiptDir, + "--json", +]; + +const child = spawn( + command, + npxCli ? [npxCli, ...commandArgs] : commandArgs, + { + env: { + ...process.env, + RUNX_RECEIPT_VERIFY_KID: kid, + RUNX_RECEIPT_VERIFY_ED25519_PUBLIC_KEY_BASE64: publicKey, + }, + stdio: ["ignore", "pipe", "inherit"], + }, +); + +let stdout = ""; +child.stdout.setEncoding("utf8"); +child.stdout.on("data", (chunk) => { + stdout += chunk; +}); + +const exitCode = await new Promise((resolve, reject) => { + child.once("error", reject); + child.once("close", resolve); +}); + +if (exitCode !== 0) { + throw new Error(`runx verify exited with code ${exitCode}`); +} + +const result = JSON.parse(stdout); +if (result.signature_mode !== "production" || result.valid !== true) { + throw new Error("expected a valid production-signature receipt tree"); +} + +process.stdout.write(`${JSON.stringify(result, null, 2)}\n`); diff --git a/docs-sourcey/validation/write-compat-aliases.mjs b/docs-sourcey/validation/write-compat-aliases.mjs new file mode 100644 index 00000000..bf945f55 --- /dev/null +++ b/docs-sourcey/validation/write-compat-aliases.mjs @@ -0,0 +1,23 @@ +import { mkdir, writeFile } from "node:fs/promises"; +import { dirname, join } from "node:path"; +import { fileURLToPath } from "node:url"; + +const docs = join(dirname(fileURLToPath(import.meta.url)), ".."); +const aliasPath = join(docs, "dist", "api", "index.html"); +const aliasHtml = ` + + + + + + Go API + + Continue to the Go API overview + +`; + +await mkdir(dirname(aliasPath), { recursive: true }); +await writeFile(aliasPath, aliasHtml, "utf8"); +process.stdout.write( + `${JSON.stringify({ compatibility_alias: "dist/api/index.html", target: "dist/api.html" })}\n`, +);