├── .dockerignore ├── .gitignore ├── .nvmrc ├── Dockerfile ├── LICENSE ├── README.md ├── commands ├── exec.js ├── forward.js ├── help.js └── lib │ ├── api.js │ ├── listen.js │ ├── log.js │ └── replace-variables.js ├── index.js ├── package-lock.json └── package.json /.dockerignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | npm-debug.log -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .idea -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | v16 -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:21-slim 2 | 3 | # Setup app directory within container 4 | WORKDIR /usr/src/app 5 | 6 | # Install dependencies 7 | COPY package*.json ./ 8 | RUN npm install 9 | 10 | # Copy application files 11 | COPY . . 12 | 13 | # Install links 14 | RUN npm link 15 | RUN ln -s index.js whcli 16 | 17 | # Default command 18 | CMD whcli help -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Webhook ApS 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Webhook.site CLI 2 | 3 | This repository contains the official command-line interface for Webhook.site. 4 | 5 | ## Usage & Documentation 6 | 7 | For usage information and a full list of commands, please see https://docs.webhook.site/cli.html. 8 | 9 | ## Installation 10 | 11 | ### Docker 12 | 13 | If you have installed [Docker](https://docs.docker.com/get-docker/), you can simply run Webhook.site CLI via `docker run`, like this: 14 | 15 | `docker run -ti webhooksite/cli -- whcli help` 16 | 17 | ### Node.js 18 | 19 | [Node](https://nodejs.org/en/download) version 16 or greater required. 20 | 21 | To install: `npm install -g @webhooksite/cli` 22 | 23 | Then you can run e.g. `whcli help` 24 | -------------------------------------------------------------------------------- /commands/exec.js: -------------------------------------------------------------------------------- 1 | import listen from "./lib/listen.js"; 2 | import replaceVariables from "./lib/replace-variables.js"; 3 | import log from "./lib/log.js"; 4 | import child_process from "child_process"; 5 | 6 | export default async (argv) => { 7 | if (!argv.token && !process.env.WH_TOKEN) { 8 | throw new Error('Please specify a token (--token)') 9 | } 10 | if (!argv.command && !process.env.WH_COMMAND) { 11 | throw new Error('Please specify a command (--command)') 12 | } 13 | 14 | listen( 15 | argv.token ?? process.env.WH_TOKEN, 16 | argv['api-key'] ?? process.env.WH_API_KEY, 17 | (data) => { 18 | const command = replaceVariables(argv.command ?? process.env.WH_COMMAND, data.runtime_variables) 19 | 20 | child_process.exec( 21 | command, 22 | (error, stdout, stderr) => { 23 | log.info({ 24 | 'msg': 'Command was executed', 25 | command, 26 | error, 27 | stderr, 28 | stdout, 29 | }); 30 | } 31 | ) 32 | } 33 | ) 34 | } -------------------------------------------------------------------------------- /commands/forward.js: -------------------------------------------------------------------------------- 1 | import fetch, {FormData} from "node-fetch"; 2 | import listen from "./lib/listen.js"; 3 | import replaceVariables from "./lib/replace-variables.js"; 4 | import log from "./lib/log.js"; 5 | import {scanRequests, setApiKey, setResponse, updateTokenListen} from "./lib/api.js"; 6 | 7 | const getTargetPath = function (url) { 8 | // We only want the `/a/b/c` part: 9 | // https://my-url.webhook.site/a/b/c 10 | const pathMatchDomain = url.match(/https?:\/\/[a-zA-Z0-9-]{3,36}\.webhook\.site(\/[^?#]+)/) 11 | if (pathMatchDomain) { 12 | return pathMatchDomain[1]; 13 | } 14 | 15 | // We only want the `/a/b/c` part: 16 | // https://webhook.site/00000000-0000-0000-00000-000000000000/a/b/c 17 | const pathMatch = url.match(/https?:\/\/[^\/]*\/[a-z0-9-]+(\/[^?#]+)/) 18 | return pathMatch ? pathMatch[1] : ''; 19 | } 20 | 21 | const forward = (tokenId, request, variables, target, keepUrl, listenSeconds) => { 22 | target = replaceVariables(target, variables) 23 | if (!keepUrl) { 24 | const query = request.query !== null 25 | ? '?' + new URLSearchParams(request.query).toString() 26 | : ''; 27 | 28 | target = target + getTargetPath(request.url) + query; 29 | } 30 | 31 | let options = { 32 | method: request.method, 33 | headers: request.headers, 34 | body: null, 35 | }; 36 | 37 | if (listenSeconds > 0) { 38 | // Enough time to clear token listen property when command exits. 39 | options['signal'] = AbortSignal.timeout(listenSeconds * 1000); 40 | } 41 | 42 | const removeHeaders = [ 43 | 'host', 44 | 'content-length', 45 | 'transfer-encoding', 46 | ] 47 | 48 | for (let headerName of removeHeaders) { 49 | if (headerName in options.headers) { 50 | delete options.headers[headerName] 51 | } 52 | } 53 | 54 | if (request.method !== 'GET' && request.method !== 'HEAD') { 55 | options['body'] = request.content 56 | 57 | // Handle serialized multipart requests 58 | if (options['body'] === '' && request.request) { 59 | options['body'] = new FormData(); 60 | // node-fetch generates a new Content-Type header 61 | delete options.headers['content-type']; 62 | 63 | for (const formFieldName in request.request) { 64 | options['body'].append(formFieldName, request.request[formFieldName]) 65 | } 66 | } 67 | } 68 | 69 | fetch(target, options) 70 | .then(async (res) => { 71 | log.info({ 72 | msg: 'Forwarded request', 73 | url: res.url, 74 | status: res.status, 75 | }); 76 | if (listenSeconds > 0) { 77 | await setResponse( 78 | tokenId, 79 | request.uuid, 80 | res.status, 81 | res.arrayBuffer(), 82 | res.headers.raw(), 83 | listenSeconds * 1000 84 | ) 85 | } 86 | }) 87 | .catch((err) => { 88 | log.error({ 89 | msg: 'Error forwarding request', 90 | err, 91 | }) 92 | }) 93 | } 94 | 95 | export default async (argv) => { 96 | if (!argv.token && !process.env.WH_TOKEN) { 97 | throw new Error('Please specify a token (--token)') 98 | } 99 | const tokenId = argv.token ?? process.env.WH_TOKEN; 100 | const apiKey = argv['api-key'] ?? process.env.WH_API_KEY; 101 | const searchQuery = argv['query'] ?? process.env.WH_QUERY; 102 | const listenSeconds = argv['listen-timeout'] ?? process.env.WH_LISTEN_TIMEOUT ?? 5; 103 | const keepUrl = argv['keep-url'] ?? false; 104 | const target = argv.target ?? process.env.WH_TARGET ?? 'https://localhost'; 105 | 106 | setApiKey(apiKey); 107 | 108 | // Listen for the amount of seconds 109 | await updateTokenListen(tokenId, listenSeconds); 110 | 111 | const clearTokenListen = async function () { 112 | await updateTokenListen(tokenId, 0); 113 | process.exit() 114 | } 115 | 116 | // Remove token listening on exit 117 | process.on('exit', clearTokenListen) 118 | process.on('SIGINT', clearTokenListen) 119 | 120 | if (searchQuery) { 121 | // Loop through existing requests if search query specified 122 | await scanRequests(tokenId, searchQuery, (request) => { 123 | forward(tokenId, request, {}, target, keepUrl, 0) 124 | }) 125 | } else { 126 | // Listen for new requests via WebSocket 127 | listen( 128 | tokenId, 129 | apiKey, 130 | (data) => { 131 | forward(tokenId, data.request, data.variables, target, keepUrl, listenSeconds) 132 | } 133 | ) 134 | } 135 | } 136 | -------------------------------------------------------------------------------- /commands/help.js: -------------------------------------------------------------------------------- 1 | import "colors"; 2 | 3 | export default () => { 4 | console.log(`⚓ whcli: Webhook.site CLI 5 | Usage: whcli [command] [--arg...] 6 | Documentation: https://docs.webhook.site/cli.html 7 | 8 | ${'Commands and Arguments'.bold} 9 | ${'help'.underline} Outputs this list of commands. 10 | 11 | ${'forward'.underline} Forward traffic from a Webhook.site URL. 12 | --token= Specifies the Webhook.site token ID where 13 | traffic should be redirected from. (required) 14 | --api-key= A valid Webhook.site API Key 15 | --target=https://example.com?action=$request.query.action$ 16 | Specifies the forwarding target URL. Variables 17 | are replaced; see below. 18 | --keep-url When used, skips merging path and query strings 19 | into the target URL. 20 | --listen-timeout=5 Amount of seconds to wait for a response before 21 | forwarding it back to Webhook.site. 22 | Default 5. Max 10. 23 | Set to 0 to disable bidirectional forwarding. 24 | --query= Forwards previously sent requests, filtered by 25 | a search query. When left blank, only requests 26 | sent after the command runs are forwarded. 27 | See below for examples. 28 | 29 | ${'exec'.underline} Execute shell commands on traffic to a Webhook.site URL. 30 | --token= Specifies which Webhook.site URL (token ID) 31 | to listen for requests from. (required) 32 | --api-key= A valid Webhook.site API Key (required) 33 | --command='ping $request.host$' Specifies the command to run. Variables 34 | are replaced; see below. (required) 35 | 36 | ${'Variable Replacement'.bold} 37 | For some commands and arguments, runtime variables can be replaced with the 38 | standard Webhook.site Custom Actions syntax (e.g. $variable$). 39 | More info here: https://docs.webhook.site/custom-actions/variables.html 40 | 41 | ${'Search Query'.bold} 42 | When specified, only past requests are processed, filtered by the specified query. 43 | Variable Replacement is not available for past requests. 44 | Examples: 45 | * ${'content:"foobar"'.underline} - body contents containing the word foobar 46 | * ${'created_at:[now-14d TO *]'.underline} - date range query (in this example, all requests 47 | 14 days and newer) 48 | More info here: https://docs.webhook.site/api/requests.html#search-query-examples 49 | 50 | ${'Environment Variables'.bold} 51 | Some command arguments can be specified via environment variables: 52 | ${'WH_TOKEN'.underline} Specifies --token 53 | ${'WH_API_KEY'.underline} Specifies --api-key 54 | ${'WH_TARGET'.underline} Specifies --target 55 | ${'WH_COMMAND'.underline} Specifies --command 56 | ${'WH_LISTEN_TIMEOUT'.underline} Specifies --listen-timeout 57 | ${'WH_QUERY'.underline} Specifies --query 58 | ${'WH_LOG_LEVEL'.underline} Sets log level (silent, trace, debug, info, 59 | warn, error, fatal) Defaults to info. 60 | ${'NODE_TLS_REJECT_UNAUTHORIZED'.underline} Set to "0" to disable e.g. self-signed 61 | or expired certificate errors. 62 | `) 63 | } -------------------------------------------------------------------------------- /commands/lib/api.js: -------------------------------------------------------------------------------- 1 | import fetch from "node-fetch"; 2 | import * as self from "./api.js"; 3 | import log from "./log.js"; 4 | 5 | let apiKey = process.env.WH_API_KEY ?? null; 6 | let apiUrl = process.env.WH_API ?? 'https://webhook.site'; 7 | 8 | const getHeaders = function () { 9 | let headers = { 10 | 'Accept': 'application/json', 11 | 'Content-Type': 'application/json', 12 | } 13 | 14 | if (apiKey) { 15 | headers['Api-Key'] = apiKey; 16 | } 17 | 18 | return headers; 19 | } 20 | 21 | export function setApiKey(newApiKey) { 22 | apiKey = newApiKey; 23 | } 24 | 25 | export async function getToken(id) { 26 | return fetch(`${apiUrl}/token/${id}`, { 27 | method: 'GET', 28 | headers: getHeaders(), 29 | }) 30 | .then(async res => { 31 | if (res.status === 200) { 32 | return res.json(); 33 | } 34 | throw Error('Could not get token: ' + await res.text()); 35 | }); 36 | } 37 | 38 | export async function updateToken(id, tokenData) { 39 | return fetch(`${apiUrl}/token/${id}`, { 40 | method: 'PUT', 41 | body: JSON.stringify(tokenData), 42 | headers: getHeaders(), 43 | }) 44 | .then(async res => { 45 | if (res.status === 200) { 46 | return res.json(); 47 | } 48 | throw Error('Could not update token: ' + await res.text()); 49 | }); 50 | } 51 | 52 | export async function setResponse(tokenId, requestId, status, content, headers, timeout) { 53 | await fetch( 54 | `${apiUrl}/token/${tokenId}/request/${requestId}/response`, 55 | { 56 | method: 'PUT', 57 | body: JSON.stringify({ 58 | status, 59 | content: Buffer.from(await content).toString('base64'), 60 | headers: headers, 61 | }), 62 | headers: getHeaders(), 63 | signal: AbortSignal.timeout(timeout) 64 | } 65 | ) 66 | .then(async (res) => { 67 | if (res.status === 200) { 68 | log.info({ 69 | msg: 'Forwarded response to Webhook.site', 70 | status: res.status, 71 | }) 72 | return; 73 | } 74 | 75 | if (res.status === 413) { 76 | log.error({ 77 | msg: 'Error forwarding response to Webhook.site: 10 MB response size exceeded', 78 | }) 79 | return; 80 | } 81 | 82 | log.info({ 83 | msg: 'Error forwarding response to Webhook.site', 84 | status: res.status, 85 | error: (await res.text()), 86 | }) 87 | }) 88 | .catch((err) => { 89 | log.error({ 90 | msg: 'Error forwarding response to Webhook.site', 91 | err, 92 | }) 93 | }); 94 | } 95 | 96 | export async function updateTokenListen(id, listenSeconds) { 97 | const tokenData = await self.getToken(id) 98 | tokenData['listen'] = listenSeconds; 99 | return await self.updateToken(id, tokenData); 100 | } 101 | 102 | export async function scanRequests(id, query, callback) { 103 | let page = 1; 104 | 105 | const fetchPage = async () => { 106 | const url = `${apiUrl}/token/${id}/requests?sorting=newest&page=${page}&query=${query}`; 107 | 108 | await fetch(url, { 109 | method: 'GET', 110 | headers: getHeaders(), 111 | }).then(async (res) => { 112 | const response = await res.json(); 113 | 114 | for (const request of response.data) { 115 | callback(request) 116 | } 117 | 118 | if (!response.is_last_page && response.data.length > 0) { 119 | page++; 120 | setTimeout(fetchPage, 1000); 121 | } 122 | }).catch((err) => { 123 | log.error({ 124 | msg: 'Error fetching requests from Webhook.site', 125 | err, 126 | }) 127 | }); 128 | }; 129 | 130 | fetchPage() 131 | } -------------------------------------------------------------------------------- /commands/lib/listen.js: -------------------------------------------------------------------------------- 1 | import Echo from "laravel-echo"; 2 | import client from "socket.io-client"; 3 | import logger from "./log.js"; 4 | 5 | export default (tokenId, apiKey, onRequest) => { 6 | const headers = apiKey ? {'Api-Key': apiKey} : {}; 7 | const echo = new Echo.default({ 8 | host: process.env.WH_WS_HOST ?? 'wss://ws.webhook.site', 9 | broadcaster: 'socket.io', 10 | client, 11 | auth: {headers} 12 | }) 13 | 14 | let channel = echo.private(`token.${tokenId}`); 15 | 16 | channel.socket.on('connect', (error) => { 17 | logger.info('Connected to Websocket. Listening for requests.', { error }) 18 | if (!apiKey) { 19 | logger.warn('Warning: If token is associated with a Webhook.site account, specify an API key.', { error }) 20 | } 21 | }) 22 | 23 | channel.socket.on('error', (err) => { 24 | logger.trace(err, 'WS: Error') 25 | }) 26 | 27 | channel.error((err) => { 28 | logger.trace(err, 'WS: Error'); 29 | }) 30 | 31 | channel.listen('.request.created', (data) => { 32 | onRequest(data) 33 | }) 34 | } -------------------------------------------------------------------------------- /commands/lib/log.js: -------------------------------------------------------------------------------- 1 | import pino from "pino"; 2 | 3 | const log = pino({ 4 | level: process.env.WH_LOG_LEVEL ?? 'info', 5 | }) 6 | 7 | const whitelistedExceptions = ['write EPIPE']; 8 | process.on('uncaughtException', 9 | (err) => { 10 | log.fatal(err, 'Unhandled Exception'); 11 | 12 | if (whitelistedExceptions.includes(err.message)) { 13 | return 14 | } 15 | 16 | setTimeout(() => { process.abort() }, 1000).unref() 17 | process.exit(1); 18 | }); 19 | 20 | process.on('unhandledRejection', 21 | (err) => { 22 | log.error(err, 'Unhandled Promise Rejection'); 23 | }); 24 | 25 | export default log -------------------------------------------------------------------------------- /commands/lib/replace-variables.js: -------------------------------------------------------------------------------- 1 | export default (subject, variables) => { 2 | for (const varName in variables) { 3 | subject = subject.replace('$' + varName + '$', variables[varName]); 4 | } 5 | return subject 6 | } -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | // Dependencies 4 | import minimist from 'minimist' 5 | 6 | // Commands 7 | import help from './commands/help.js' 8 | import forward from './commands/forward.js' 9 | import exec from "./commands/exec.js"; 10 | 11 | const argv = minimist(process.argv.slice(2)); 12 | const command = argv['_'][0]; 13 | 14 | switch (command) { 15 | case 'forward': 16 | forward(argv) 17 | break; 18 | 19 | case 'exec': 20 | exec(argv) 21 | break; 22 | 23 | default: 24 | help() 25 | } -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@webhooksite/cli", 3 | "version": "0.2.3", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "@webhooksite/cli", 9 | "version": "0.2.3", 10 | "license": "MIT", 11 | "dependencies": { 12 | "colors": "^1.4.0", 13 | "laravel-echo": "^1.16.1", 14 | "minimist": "^1.2.8", 15 | "node-fetch": "^3.3.2", 16 | "pino": "^8.20.0", 17 | "socket.io-client": "^2.5.0", 18 | "ws": "^7.5.9" 19 | }, 20 | "bin": { 21 | "whcli": "index.js" 22 | }, 23 | "engines": { 24 | "node": ">=16.0.0" 25 | } 26 | }, 27 | "node_modules/abort-controller": { 28 | "version": "3.0.0", 29 | "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", 30 | "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", 31 | "dependencies": { 32 | "event-target-shim": "^5.0.0" 33 | }, 34 | "engines": { 35 | "node": ">=6.5" 36 | } 37 | }, 38 | "node_modules/after": { 39 | "version": "0.8.2", 40 | "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", 41 | "integrity": "sha512-QbJ0NTQ/I9DI3uSJA4cbexiwQeRAfjPScqIbSjUDd9TOrcg6pTkdgziesOqxBMBzit8vFCTwrP27t13vFOORRA==" 42 | }, 43 | "node_modules/arraybuffer.slice": { 44 | "version": "0.0.7", 45 | "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", 46 | "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==" 47 | }, 48 | "node_modules/atomic-sleep": { 49 | "version": "1.0.0", 50 | "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", 51 | "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", 52 | "engines": { 53 | "node": ">=8.0.0" 54 | } 55 | }, 56 | "node_modules/backo2": { 57 | "version": "1.0.2", 58 | "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", 59 | "integrity": "sha512-zj6Z6M7Eq+PBZ7PQxl5NT665MvJdAkzp0f60nAJ+sLaSCBPMwVak5ZegFbgVCzFcCJTKFoMizvM5Ld7+JrRJHA==" 60 | }, 61 | "node_modules/base64-arraybuffer": { 62 | "version": "0.1.4", 63 | "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", 64 | "integrity": "sha512-a1eIFi4R9ySrbiMuyTGx5e92uRH5tQY6kArNcFaKBUleIoLjdjBg7Zxm3Mqm3Kmkf27HLR/1fnxX9q8GQ7Iavg==", 65 | "engines": { 66 | "node": ">= 0.6.0" 67 | } 68 | }, 69 | "node_modules/base64-js": { 70 | "version": "1.5.1", 71 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 72 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", 73 | "funding": [ 74 | { 75 | "type": "github", 76 | "url": "https://github.com/sponsors/feross" 77 | }, 78 | { 79 | "type": "patreon", 80 | "url": "https://www.patreon.com/feross" 81 | }, 82 | { 83 | "type": "consulting", 84 | "url": "https://feross.org/support" 85 | } 86 | ] 87 | }, 88 | "node_modules/blob": { 89 | "version": "0.0.5", 90 | "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", 91 | "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==" 92 | }, 93 | "node_modules/buffer": { 94 | "version": "6.0.3", 95 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", 96 | "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", 97 | "funding": [ 98 | { 99 | "type": "github", 100 | "url": "https://github.com/sponsors/feross" 101 | }, 102 | { 103 | "type": "patreon", 104 | "url": "https://www.patreon.com/feross" 105 | }, 106 | { 107 | "type": "consulting", 108 | "url": "https://feross.org/support" 109 | } 110 | ], 111 | "dependencies": { 112 | "base64-js": "^1.3.1", 113 | "ieee754": "^1.2.1" 114 | } 115 | }, 116 | "node_modules/colors": { 117 | "version": "1.4.0", 118 | "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", 119 | "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", 120 | "engines": { 121 | "node": ">=0.1.90" 122 | } 123 | }, 124 | "node_modules/component-bind": { 125 | "version": "1.0.0", 126 | "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", 127 | "integrity": "sha512-WZveuKPeKAG9qY+FkYDeADzdHyTYdIboXS59ixDeRJL5ZhxpqUnxSOwop4FQjMsiYm3/Or8cegVbpAHNA7pHxw==" 128 | }, 129 | "node_modules/component-emitter": { 130 | "version": "1.3.1", 131 | "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", 132 | "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", 133 | "funding": { 134 | "url": "https://github.com/sponsors/sindresorhus" 135 | } 136 | }, 137 | "node_modules/component-inherit": { 138 | "version": "0.0.3", 139 | "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", 140 | "integrity": "sha512-w+LhYREhatpVqTESyGFg3NlP6Iu0kEKUHETY9GoZP/pQyW4mHFZuFWRUCIqVPZ36ueVLtoOEZaAqbCF2RDndaA==" 141 | }, 142 | "node_modules/data-uri-to-buffer": { 143 | "version": "4.0.1", 144 | "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", 145 | "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", 146 | "engines": { 147 | "node": ">= 12" 148 | } 149 | }, 150 | "node_modules/debug": { 151 | "version": "3.1.0", 152 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 153 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 154 | "dependencies": { 155 | "ms": "2.0.0" 156 | } 157 | }, 158 | "node_modules/engine.io-client": { 159 | "version": "3.5.4", 160 | "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.5.4.tgz", 161 | "integrity": "sha512-ydc8uuMMDxC5KCKNJN3zZKYJk2sgyTuTZQ7Aj1DJSsLKAcizA/PzWivw8fZMIjJVBo2CJOYzntv4FSjY/Lr//g==", 162 | "dependencies": { 163 | "component-emitter": "~1.3.0", 164 | "component-inherit": "0.0.3", 165 | "debug": "~3.1.0", 166 | "engine.io-parser": "~2.2.0", 167 | "has-cors": "1.1.0", 168 | "indexof": "0.0.1", 169 | "parseqs": "0.0.6", 170 | "parseuri": "0.0.6", 171 | "ws": "~7.5.10", 172 | "xmlhttprequest-ssl": "~1.6.2", 173 | "yeast": "0.1.2" 174 | } 175 | }, 176 | "node_modules/engine.io-parser": { 177 | "version": "2.2.1", 178 | "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.1.tgz", 179 | "integrity": "sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg==", 180 | "dependencies": { 181 | "after": "0.8.2", 182 | "arraybuffer.slice": "~0.0.7", 183 | "base64-arraybuffer": "0.1.4", 184 | "blob": "0.0.5", 185 | "has-binary2": "~1.0.2" 186 | } 187 | }, 188 | "node_modules/event-target-shim": { 189 | "version": "5.0.1", 190 | "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", 191 | "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", 192 | "engines": { 193 | "node": ">=6" 194 | } 195 | }, 196 | "node_modules/events": { 197 | "version": "3.3.0", 198 | "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", 199 | "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", 200 | "engines": { 201 | "node": ">=0.8.x" 202 | } 203 | }, 204 | "node_modules/fast-redact": { 205 | "version": "3.5.0", 206 | "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.5.0.tgz", 207 | "integrity": "sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==", 208 | "engines": { 209 | "node": ">=6" 210 | } 211 | }, 212 | "node_modules/fetch-blob": { 213 | "version": "3.2.0", 214 | "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", 215 | "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", 216 | "funding": [ 217 | { 218 | "type": "github", 219 | "url": "https://github.com/sponsors/jimmywarting" 220 | }, 221 | { 222 | "type": "paypal", 223 | "url": "https://paypal.me/jimmywarting" 224 | } 225 | ], 226 | "dependencies": { 227 | "node-domexception": "^1.0.0", 228 | "web-streams-polyfill": "^3.0.3" 229 | }, 230 | "engines": { 231 | "node": "^12.20 || >= 14.13" 232 | } 233 | }, 234 | "node_modules/formdata-polyfill": { 235 | "version": "4.0.10", 236 | "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", 237 | "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", 238 | "dependencies": { 239 | "fetch-blob": "^3.1.2" 240 | }, 241 | "engines": { 242 | "node": ">=12.20.0" 243 | } 244 | }, 245 | "node_modules/has-binary2": { 246 | "version": "1.0.3", 247 | "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", 248 | "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", 249 | "dependencies": { 250 | "isarray": "2.0.1" 251 | } 252 | }, 253 | "node_modules/has-cors": { 254 | "version": "1.1.0", 255 | "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", 256 | "integrity": "sha512-g5VNKdkFuUuVCP9gYfDJHjK2nqdQJ7aDLTnycnc2+RvsOQbuLdF5pm7vuE5J76SEBIQjs4kQY/BWq74JUmjbXA==" 257 | }, 258 | "node_modules/ieee754": { 259 | "version": "1.2.1", 260 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 261 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", 262 | "funding": [ 263 | { 264 | "type": "github", 265 | "url": "https://github.com/sponsors/feross" 266 | }, 267 | { 268 | "type": "patreon", 269 | "url": "https://www.patreon.com/feross" 270 | }, 271 | { 272 | "type": "consulting", 273 | "url": "https://feross.org/support" 274 | } 275 | ] 276 | }, 277 | "node_modules/indexof": { 278 | "version": "0.0.1", 279 | "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", 280 | "integrity": "sha512-i0G7hLJ1z0DE8dsqJa2rycj9dBmNKgXBvotXtZYXakU9oivfB9Uj2ZBC27qqef2U58/ZLwalxa1X/RDCdkHtVg==" 281 | }, 282 | "node_modules/isarray": { 283 | "version": "2.0.1", 284 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", 285 | "integrity": "sha512-c2cu3UxbI+b6kR3fy0nRnAhodsvR9dx7U5+znCOzdj6IfP3upFURTr0Xl5BlQZNKZjEtxrmVyfSdeE3O57smoQ==" 286 | }, 287 | "node_modules/laravel-echo": { 288 | "version": "1.16.1", 289 | "resolved": "https://registry.npmjs.org/laravel-echo/-/laravel-echo-1.16.1.tgz", 290 | "integrity": "sha512-++Ylb6M3ariC9Rk5WE5gZjj6wcEV5kvLF8b+geJ5/rRIfdoOA+eG6b9qJPrarMD9rY28Apx+l3eelIrCc2skVg==", 291 | "engines": { 292 | "node": ">=10" 293 | } 294 | }, 295 | "node_modules/minimist": { 296 | "version": "1.2.8", 297 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", 298 | "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", 299 | "funding": { 300 | "url": "https://github.com/sponsors/ljharb" 301 | } 302 | }, 303 | "node_modules/ms": { 304 | "version": "2.0.0", 305 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 306 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 307 | }, 308 | "node_modules/node-domexception": { 309 | "version": "1.0.0", 310 | "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", 311 | "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", 312 | "funding": [ 313 | { 314 | "type": "github", 315 | "url": "https://github.com/sponsors/jimmywarting" 316 | }, 317 | { 318 | "type": "github", 319 | "url": "https://paypal.me/jimmywarting" 320 | } 321 | ], 322 | "engines": { 323 | "node": ">=10.5.0" 324 | } 325 | }, 326 | "node_modules/node-fetch": { 327 | "version": "3.3.2", 328 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", 329 | "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", 330 | "dependencies": { 331 | "data-uri-to-buffer": "^4.0.0", 332 | "fetch-blob": "^3.1.4", 333 | "formdata-polyfill": "^4.0.10" 334 | }, 335 | "engines": { 336 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 337 | }, 338 | "funding": { 339 | "type": "opencollective", 340 | "url": "https://opencollective.com/node-fetch" 341 | } 342 | }, 343 | "node_modules/on-exit-leak-free": { 344 | "version": "2.1.2", 345 | "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", 346 | "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==", 347 | "engines": { 348 | "node": ">=14.0.0" 349 | } 350 | }, 351 | "node_modules/parseqs": { 352 | "version": "0.0.6", 353 | "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz", 354 | "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==" 355 | }, 356 | "node_modules/parseuri": { 357 | "version": "0.0.6", 358 | "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz", 359 | "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==" 360 | }, 361 | "node_modules/pino": { 362 | "version": "8.21.0", 363 | "resolved": "https://registry.npmjs.org/pino/-/pino-8.21.0.tgz", 364 | "integrity": "sha512-ip4qdzjkAyDDZklUaZkcRFb2iA118H9SgRh8yzTkSQK8HilsOJF7rSY8HoW5+I0M46AZgX/pxbprf2vvzQCE0Q==", 365 | "dependencies": { 366 | "atomic-sleep": "^1.0.0", 367 | "fast-redact": "^3.1.1", 368 | "on-exit-leak-free": "^2.1.0", 369 | "pino-abstract-transport": "^1.2.0", 370 | "pino-std-serializers": "^6.0.0", 371 | "process-warning": "^3.0.0", 372 | "quick-format-unescaped": "^4.0.3", 373 | "real-require": "^0.2.0", 374 | "safe-stable-stringify": "^2.3.1", 375 | "sonic-boom": "^3.7.0", 376 | "thread-stream": "^2.6.0" 377 | }, 378 | "bin": { 379 | "pino": "bin.js" 380 | } 381 | }, 382 | "node_modules/pino-abstract-transport": { 383 | "version": "1.2.0", 384 | "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.2.0.tgz", 385 | "integrity": "sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==", 386 | "dependencies": { 387 | "readable-stream": "^4.0.0", 388 | "split2": "^4.0.0" 389 | } 390 | }, 391 | "node_modules/pino-std-serializers": { 392 | "version": "6.2.2", 393 | "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-6.2.2.tgz", 394 | "integrity": "sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==" 395 | }, 396 | "node_modules/process": { 397 | "version": "0.11.10", 398 | "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", 399 | "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", 400 | "engines": { 401 | "node": ">= 0.6.0" 402 | } 403 | }, 404 | "node_modules/process-warning": { 405 | "version": "3.0.0", 406 | "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-3.0.0.tgz", 407 | "integrity": "sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==" 408 | }, 409 | "node_modules/quick-format-unescaped": { 410 | "version": "4.0.4", 411 | "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", 412 | "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==" 413 | }, 414 | "node_modules/readable-stream": { 415 | "version": "4.5.2", 416 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", 417 | "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", 418 | "dependencies": { 419 | "abort-controller": "^3.0.0", 420 | "buffer": "^6.0.3", 421 | "events": "^3.3.0", 422 | "process": "^0.11.10", 423 | "string_decoder": "^1.3.0" 424 | }, 425 | "engines": { 426 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 427 | } 428 | }, 429 | "node_modules/real-require": { 430 | "version": "0.2.0", 431 | "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", 432 | "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==", 433 | "engines": { 434 | "node": ">= 12.13.0" 435 | } 436 | }, 437 | "node_modules/safe-buffer": { 438 | "version": "5.2.1", 439 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 440 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 441 | "funding": [ 442 | { 443 | "type": "github", 444 | "url": "https://github.com/sponsors/feross" 445 | }, 446 | { 447 | "type": "patreon", 448 | "url": "https://www.patreon.com/feross" 449 | }, 450 | { 451 | "type": "consulting", 452 | "url": "https://feross.org/support" 453 | } 454 | ] 455 | }, 456 | "node_modules/safe-stable-stringify": { 457 | "version": "2.4.3", 458 | "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", 459 | "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", 460 | "engines": { 461 | "node": ">=10" 462 | } 463 | }, 464 | "node_modules/socket.io-client": { 465 | "version": "2.5.0", 466 | "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.5.0.tgz", 467 | "integrity": "sha512-lOO9clmdgssDykiOmVQQitwBAF3I6mYcQAo7hQ7AM6Ny5X7fp8hIJ3HcQs3Rjz4SoggoxA1OgrQyY8EgTbcPYw==", 468 | "dependencies": { 469 | "backo2": "1.0.2", 470 | "component-bind": "1.0.0", 471 | "component-emitter": "~1.3.0", 472 | "debug": "~3.1.0", 473 | "engine.io-client": "~3.5.0", 474 | "has-binary2": "~1.0.2", 475 | "indexof": "0.0.1", 476 | "parseqs": "0.0.6", 477 | "parseuri": "0.0.6", 478 | "socket.io-parser": "~3.3.0", 479 | "to-array": "0.1.4" 480 | } 481 | }, 482 | "node_modules/socket.io-parser": { 483 | "version": "3.3.4", 484 | "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.4.tgz", 485 | "integrity": "sha512-z/pFQB3x+EZldRRzORYW1vwVO8m/3ILkswtnpoeU6Ve3cbMWkmHEWDAVJn4QJtchiiFTo5j7UG2QvwxvaA9vow==", 486 | "dependencies": { 487 | "component-emitter": "~1.3.0", 488 | "debug": "~3.1.0", 489 | "isarray": "2.0.1" 490 | } 491 | }, 492 | "node_modules/sonic-boom": { 493 | "version": "3.8.1", 494 | "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-3.8.1.tgz", 495 | "integrity": "sha512-y4Z8LCDBuum+PBP3lSV7RHrXscqksve/bi0as7mhwVnBW+/wUqKT/2Kb7um8yqcFy0duYbbPxzt89Zy2nOCaxg==", 496 | "dependencies": { 497 | "atomic-sleep": "^1.0.0" 498 | } 499 | }, 500 | "node_modules/split2": { 501 | "version": "4.2.0", 502 | "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", 503 | "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", 504 | "engines": { 505 | "node": ">= 10.x" 506 | } 507 | }, 508 | "node_modules/string_decoder": { 509 | "version": "1.3.0", 510 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 511 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 512 | "dependencies": { 513 | "safe-buffer": "~5.2.0" 514 | } 515 | }, 516 | "node_modules/thread-stream": { 517 | "version": "2.7.0", 518 | "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-2.7.0.tgz", 519 | "integrity": "sha512-qQiRWsU/wvNolI6tbbCKd9iKaTnCXsTwVxhhKM6nctPdujTyztjlbUkUTUymidWcMnZ5pWR0ej4a0tjsW021vw==", 520 | "dependencies": { 521 | "real-require": "^0.2.0" 522 | } 523 | }, 524 | "node_modules/to-array": { 525 | "version": "0.1.4", 526 | "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", 527 | "integrity": "sha512-LhVdShQD/4Mk4zXNroIQZJC+Ap3zgLcDuwEdcmLv9CCO73NWockQDwyUnW/m8VX/EElfL6FcYx7EeutN4HJA6A==" 528 | }, 529 | "node_modules/web-streams-polyfill": { 530 | "version": "3.3.3", 531 | "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", 532 | "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", 533 | "engines": { 534 | "node": ">= 8" 535 | } 536 | }, 537 | "node_modules/ws": { 538 | "version": "7.5.10", 539 | "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", 540 | "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", 541 | "engines": { 542 | "node": ">=8.3.0" 543 | }, 544 | "peerDependencies": { 545 | "bufferutil": "^4.0.1", 546 | "utf-8-validate": "^5.0.2" 547 | }, 548 | "peerDependenciesMeta": { 549 | "bufferutil": { 550 | "optional": true 551 | }, 552 | "utf-8-validate": { 553 | "optional": true 554 | } 555 | } 556 | }, 557 | "node_modules/xmlhttprequest-ssl": { 558 | "version": "1.6.3", 559 | "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.6.3.tgz", 560 | "integrity": "sha512-3XfeQE/wNkvrIktn2Kf0869fC0BN6UpydVasGIeSm2B1Llihf7/0UfZM+eCkOw3P7bP4+qPgqhm7ZoxuJtFU0Q==", 561 | "engines": { 562 | "node": ">=0.4.0" 563 | } 564 | }, 565 | "node_modules/yeast": { 566 | "version": "0.1.2", 567 | "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", 568 | "integrity": "sha512-8HFIh676uyGYP6wP13R/j6OJ/1HwJ46snpvzE7aHAN3Ryqh2yX6Xox2B4CUmTwwOIzlG3Bs7ocsP5dZH/R1Qbg==" 569 | } 570 | } 571 | } 572 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@webhooksite/cli", 3 | "description": "Client for Webhook.site", 4 | "repository": "webhooksite/cli", 5 | "version": "0.2.6", 6 | "type": "module", 7 | "publishConfig": { 8 | "registry": "https://registry.npmjs.org/" 9 | }, 10 | "engines": { 11 | "node": ">=16.0.0" 12 | }, 13 | "dependencies": { 14 | "colors": "^1.4.0", 15 | "laravel-echo": "^1.16.1", 16 | "minimist": "^1.2.8", 17 | "node-fetch": "^3.3.2", 18 | "pino": "^8.20.0", 19 | "socket.io-client": "^2.5.0", 20 | "ws": "^7.5.9" 21 | }, 22 | "license": "MIT", 23 | "bin": { 24 | "whcli": "index.js" 25 | }, 26 | "scripts": { 27 | "start": "node index.js", 28 | "build": "export VERSION=$(jq -r '.version' package.json) ; git tag $VERSION ; git push origin refs/tags/$VERSION ; docker buildx build --platform linux/arm/v7,linux/arm64/v8,linux/amd64,linux/arm64 --tag webhooksite/cli:latest --tag webhooksite/cli:$VERSION --push . ; npm publish" 29 | } 30 | } 31 | --------------------------------------------------------------------------------