feat: init

This commit is contained in:
2026-02-13 22:02:30 +01:00
commit 8f9ff830fb
16711 changed files with 3307340 additions and 0 deletions

68
node_modules/listhen/LICENSE generated vendored Normal file
View File

@@ -0,0 +1,68 @@
MIT License
Copyright (c) Pooya Parsa <pooya@pi0.io>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
---
src/lib/open forked from https://github.com/sindresorhus/open
MIT License
Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
---
src/lib/xdg-open
Utility script to open a URL in the registered default application.
Refer to the usage() function below for usage.
Copyright 2009-2010, Fathi Boudra <fabo@freedesktop.org>
Copyright 2009-2010, Rex Dieter <rdieter@fedoraproject.org>
Copyright 2006, Kevin Krammer <kevin.krammer@gmx.at>
Copyright 2006, Jeremy White <jwhite@codeweavers.com>
LICENSE:
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.

231
node_modules/listhen/README.md generated vendored Normal file
View File

@@ -0,0 +1,231 @@
# 👂 listhen
<!-- automd:badges -->
[![npm version](https://img.shields.io/npm/v/listhen)](https://npmjs.com/package/listhen)
[![npm downloads](https://img.shields.io/npm/dm/listhen)](https://npmjs.com/package/listhen)
<!-- /automd -->
Elegant HTTP listener!
[👉 Online Playground](https://stackblitz.com/github/unjs/listhen/tree/main/playground?startScript=dev)
## Features
✅ Dev server with HMR, static, WebSockets and TypeScript support with <a href="https://github.com/unjs/jiti">unjs/jiti</a><br>
✅ Works with Node.js, Express, and <a href="https://github.com/unjs/h3">unjs/h3</a> out of the box <br>
✅ Show the QR code of the public URL with <a href="https://github.com/unjs/uqr">unjs/uqr</a><br>
✅ Tunnel your local server to the world with <a href="https://github.com/unjs/untun">unjs/untun</a><br>
✅ Assign a port or fallback to a nicer alternative with <a href="https://github.com/unjs/get-port-please">unjs/get-port-please</a>
✅ Gracefully shutdown Server with <a href="https://github.com/thedillonb/http-shutdown">http-shutdown</a><br>
✅ Zero Config WebSockets with <a href="https://github.com/unjs/crossws">unjs/crossws</a>
✅ Copy the URL to the clipboard<br>
✅ HTTPS support with self-signed certificates<br>
✅ Open URL in browser<br>
✅ Detect test and production environments to auto-adjust behavior<br>
✅ Close on the exit signal<br>
<div align="center">
<img width="100%" src="./.assets/screenshot.png">
</div>
## Quick Usage (CLI)
You can run your applications in localhost with TypeScript support and watch mode using `listhen` CLI:
Create `index.ts`:
```ts
export default (req, res) => {
res.end("Hello World!");
};
```
or using [unjs/h3](https://github.com/unjs/h3):
```ts
import { createApp, eventHandler } from "h3";
export const app = createApp();
app.use(
"/",
eventHandler(() => "Hello world!"),
);
```
or use npx to invoke `listhen` command:
```sh
npx listhen -w ./index.ts
```
## Usage (API)
Install package:
```bash
# pnpm
pnpm i listhen
# npm
npm i listhen
# yarn
yarn add listhen
```
Import into your Node.js project:
```js
// CommonJS
const { listen, listenAndWatch } = require("listhen");
// ESM
import { listen, listenAndWatch } from "listhen";
```
```ts
const handler = (req, res) => {
res.end("Hi!")
}
// listener: { url, getURL, server, close, ... }
const listener = await listen(handler, options)
```
## Options
### `port`
- Default: `process.env.PORT` or 3000 or memorized random (see [get-port-please](https://github.com/unjs/get-port-please))
Port to listen.
### `hostname`
- Default: `process.env.HOST || '0.0.0.0'`
Default hostname to listen.
### `https`
- Type: Boolean | Object
- Default: `false`
Listen on HTTPS with SSL enabled.
#### Self-Signed Certificate
By setting `https: true`, listhen will use an auto-generated self-signed certificate.
You can set https to an object for custom options. Possible options:
- `domains`: (Array) Default is `['localhost', '127.0.0.1', '::1']`.
- `validityDays`: (Number) Default is `1`.
#### User-Provided Certificate
Set `https: { cert, key }` where the cert and key are paths to the SSL certificates.
With an encrypted private key, you also need to set `passphrase` on the `https` object.
To provide a certificate stored in a keystore set `https: { pfx }` with a path to the keystore.
When the keystore is password protected also set `passphrase`.
You can also provide an inline cert and key instead of reading from the filesystem. In this case, they should start with `--`.
### `showURL`
- Default: `true` (force disabled on a test environment)
Show a CLI message for the listening URL.
### `baseURL`
- Default: `/`
### `open`
- Default: `false` (force disabled on test and production environments)
Open the URL in the browser. Silently ignores errors.
### `clipboard`
- Default: `false` (force disabled on test and production environments)
Copy the URL to the clipboard. Silently ignores errors.
### `isTest`
- Default: `process.env.NODE_ENV === 'test'`
Detect if running in a test environment to disable some features.
### `autoClose`
- Default: `true`
Automatically close when an `exit` event, `SIGTERM`, `SIGINT` or `SIGHUP` signal is received in the process.
### `publicURL`
- Default: (the first public URL listening)
The public URL to show in the CLI output
### `qr`
- Default: `true`
Print QR Code for public address.
### `public`
- Default: `false` for development or when `hostname` is `localhost` and `true` for production
When enabled, listhen tries to listen to all network interfaces. You can also enable this option using `--host` CLI flag.
### `ws`
- Default: `false`
Enable experimental WebSocket support using [unjs/crossws](https://crossws.unjs.io/) or node upgrade handler.
Option can be a function for Node.js `upgrade` handler (`(req, head) => void`) or an Object to use [CrossWS Hooks](https://crossws.unjs.io/guide/api).
When using dev server CLI, you can easily use `--ws` and a named export called `websocket` to define [CrossWS Hooks](https://github.com/unjs/crossws) with HMR support!
## License
<!-- automd:contributors license=MIT author="pi0" -->
Published under the [MIT](https://github.com/unjs/listhen/blob/main/LICENSE) license.
Made by [@pi0](https://github.com/pi0) and [community](https://github.com/unjs/listhen/graphs/contributors) 💛
<br><br>
<a href="https://github.com/unjs/listhen/graphs/contributors">
<img src="https://contrib.rocks/image?repo=unjs/listhen" />
</a>
<!-- /automd -->
<!-- automd:with-automd -->
---
_🤖 auto updated with [automd](https://automd.unjs.io)_
<!-- /automd -->

5
node_modules/listhen/bin/listhen.mjs generated vendored Executable file
View File

@@ -0,0 +1,5 @@
#!/usr/bin/env node
import { runMain } from "../dist/cli.mjs";
runMain();

1
node_modules/listhen/cli.d.ts generated vendored Normal file
View File

@@ -0,0 +1 @@
export * from './dist/cli'

1071
node_modules/listhen/dist/chunks/xdg-open.cjs generated vendored Normal file

File diff suppressed because it is too large Load Diff

1069
node_modules/listhen/dist/chunks/xdg-open.mjs generated vendored Normal file

File diff suppressed because it is too large Load Diff

177
node_modules/listhen/dist/cli.cjs generated vendored Normal file
View File

@@ -0,0 +1,177 @@
'use strict';
const citty = require('citty');
const pathe = require('pathe');
const index = require('./index.cjs');
require('node:http');
require('node:https');
require('node:util');
require('get-port-please');
require('http-shutdown');
require('consola');
require('defu');
require('consola/utils');
require('uqr');
require('node:child_process');
require('node:fs');
require('node:os');
require('node:path');
require('std-env');
require('node-forge');
require('node:fs/promises');
require('mlly');
const name = "listhen";
const version = "1.8.0";
const description = "👂 Elegant HTTP Listener";
const main = citty.defineCommand({
meta: {
name,
description,
version
},
args: {
cwd: {
type: "string",
description: "Current working directory"
},
entry: {
type: "positional",
description: "Listener entry file (./app.ts)",
required: true
},
name: {
type: "string",
description: "Name to use in the banner"
},
baseURL: {
type: "string",
description: "Base URL to use"
},
watch: {
type: "boolean",
description: "Watch for changes",
alias: "w"
},
ws: {
type: "boolean",
description: "Enable Experimental WebSocket support"
},
...getArgs()
},
async run({ args }) {
const opts = {
...args,
...parseArgs(args),
baseURL: args.baseURL,
name: args.name
};
const entry = pathe.isAbsolute(args.entry) || args.entry.startsWith(".") ? args.entry : `./${args.entry}`;
if (args.watch) {
await index.listenAndWatch(entry, opts);
} else {
const devServer = await index.createDevServer(entry, opts);
await index.listen(devServer.nodeListener, {
...opts,
_entry: devServer._entry,
ws: opts.ws ? devServer._ws : void 0
});
await devServer.reload(true);
}
}
});
const runMain = () => citty.runMain(main);
function getArgs() {
return {
port: {
type: "string",
description: "Port to listen on (use `PORT` environment variable to override)"
},
host: {
description: "Host to listen on. If no value or an empty string provided, will listen on all available interfaces (use `HOST` environment variable to override)"
},
clipboard: {
type: "boolean",
description: "Copy the URL to the clipboard"
},
open: {
type: "boolean",
description: "Open the URL in the browser"
},
https: {
type: "boolean",
description: "Enable HTTPS"
},
"https.cert": {
type: "string",
description: "Path to TLS certificate used with HTTPS in PEM format"
},
"https.key": {
type: "string",
description: "Path to TLS key used with HTTPS in PEM format"
},
"https.pfx": {
type: "string",
description: "Path to PKCS#12 (.p12/.pfx) keystore containing a TLS certificate and Key"
},
"https.passphrase": {
type: "string",
description: "Passphrase used for TLS key or keystore"
},
"https.validityDays": {
type: "string",
description: "Validity in days of the autogenerated TLS certificate (https: true)"
},
"https.domains": {
type: "string",
description: "Comma seperated list of domains and IPs, the autogenerated certificate should be valid for (https: true)"
},
publicURL: {
type: "string",
description: "Displayed public URL (used for QR code)",
required: false
},
qr: {
type: "boolean",
description: "Display The QR code of public URL when available",
required: false
},
public: {
type: "boolean",
description: "Listen to all network interfaces",
required: false
},
tunnel: {
type: "boolean",
description: "Open a tunnel using https://github.com/unjs/untun",
required: false
}
};
}
function parseArgs(args) {
return {
port: args.port,
// prettier-ignore
hostname: typeof args.host === "string" ? args.host : args.host === true ? "" : void 0,
clipboard: args.clipboard,
open: args.open,
qr: args.qr,
publicURL: args.publicURL,
public: args.public,
tunnel: args.tunnel,
https: args.https ? {
cert: args["https.cert"],
key: args["https.key"],
pfx: args["https.pfx"],
passphrase: args["https.passphrase"],
validityDays: args["https.validityDays"] ? +args["https.validityDays"] : void 0,
domains: args["https.domains"] ? args["https.domains"].split(",") : void 0
} : false
};
}
exports.getArgs = getArgs;
exports.main = main;
exports.parseArgs = parseArgs;
exports.runMain = runMain;

172
node_modules/listhen/dist/cli.d.cts generated vendored Normal file
View File

@@ -0,0 +1,172 @@
import * as citty from 'citty';
import { ParsedArgs } from 'citty';
import { L as ListenOptions } from './shared/listhen.1c46e31d.cjs';
import 'node:http';
import 'node:https';
import 'node:net';
import 'get-port-please';
import 'crossws/adapters/node';
declare const main: citty.CommandDef<{
port: {
readonly type: "string";
readonly description: "Port to listen on (use `PORT` environment variable to override)";
};
host: {
readonly description: "Host to listen on. If no value or an empty string provided, will listen on all available interfaces (use `HOST` environment variable to override)";
};
clipboard: {
readonly type: "boolean";
readonly description: "Copy the URL to the clipboard";
};
open: {
readonly type: "boolean";
readonly description: "Open the URL in the browser";
};
https: {
readonly type: "boolean";
readonly description: "Enable HTTPS";
};
"https.cert": {
readonly type: "string";
readonly description: "Path to TLS certificate used with HTTPS in PEM format";
};
"https.key": {
readonly type: "string";
readonly description: "Path to TLS key used with HTTPS in PEM format";
};
"https.pfx": {
readonly type: "string";
readonly description: "Path to PKCS#12 (.p12/.pfx) keystore containing a TLS certificate and Key";
};
"https.passphrase": {
readonly type: "string";
readonly description: "Passphrase used for TLS key or keystore";
};
"https.validityDays": {
readonly type: "string";
readonly description: "Validity in days of the autogenerated TLS certificate (https: true)";
};
"https.domains": {
readonly type: "string";
readonly description: "Comma seperated list of domains and IPs, the autogenerated certificate should be valid for (https: true)";
};
publicURL: {
readonly type: "string";
readonly description: "Displayed public URL (used for QR code)";
readonly required: false;
};
qr: {
readonly type: "boolean";
readonly description: "Display The QR code of public URL when available";
readonly required: false;
};
public: {
readonly type: "boolean";
readonly description: "Listen to all network interfaces";
readonly required: false;
};
tunnel: {
readonly type: "boolean";
readonly description: "Open a tunnel using https://github.com/unjs/untun";
readonly required: false;
};
cwd: {
type: "string";
description: string;
};
entry: {
type: "positional";
description: string;
required: true;
};
name: {
type: "string";
description: string;
};
baseURL: {
type: "string";
description: string;
};
watch: {
type: "boolean";
description: string;
alias: string;
};
ws: {
type: "boolean";
description: string;
};
}>;
declare const runMain: () => Promise<void>;
/** Returns unjs/citty compatible args object */
declare function getArgs(): {
readonly port: {
readonly type: "string";
readonly description: "Port to listen on (use `PORT` environment variable to override)";
};
readonly host: {
readonly description: "Host to listen on. If no value or an empty string provided, will listen on all available interfaces (use `HOST` environment variable to override)";
};
readonly clipboard: {
readonly type: "boolean";
readonly description: "Copy the URL to the clipboard";
};
readonly open: {
readonly type: "boolean";
readonly description: "Open the URL in the browser";
};
readonly https: {
readonly type: "boolean";
readonly description: "Enable HTTPS";
};
readonly "https.cert": {
readonly type: "string";
readonly description: "Path to TLS certificate used with HTTPS in PEM format";
};
readonly "https.key": {
readonly type: "string";
readonly description: "Path to TLS key used with HTTPS in PEM format";
};
readonly "https.pfx": {
readonly type: "string";
readonly description: "Path to PKCS#12 (.p12/.pfx) keystore containing a TLS certificate and Key";
};
readonly "https.passphrase": {
readonly type: "string";
readonly description: "Passphrase used for TLS key or keystore";
};
readonly "https.validityDays": {
readonly type: "string";
readonly description: "Validity in days of the autogenerated TLS certificate (https: true)";
};
readonly "https.domains": {
readonly type: "string";
readonly description: "Comma seperated list of domains and IPs, the autogenerated certificate should be valid for (https: true)";
};
readonly publicURL: {
readonly type: "string";
readonly description: "Displayed public URL (used for QR code)";
readonly required: false;
};
readonly qr: {
readonly type: "boolean";
readonly description: "Display The QR code of public URL when available";
readonly required: false;
};
readonly public: {
readonly type: "boolean";
readonly description: "Listen to all network interfaces";
readonly required: false;
};
readonly tunnel: {
readonly type: "boolean";
readonly description: "Open a tunnel using https://github.com/unjs/untun";
readonly required: false;
};
};
type ParsedListhenArgs = ParsedArgs<ReturnType<typeof getArgs>>;
/** Convert unjs/citty compatible args to listhen options */
declare function parseArgs(args: ParsedListhenArgs): Partial<ListenOptions>;
export { getArgs, main, parseArgs, runMain };

172
node_modules/listhen/dist/cli.d.mts generated vendored Normal file
View File

@@ -0,0 +1,172 @@
import * as citty from 'citty';
import { ParsedArgs } from 'citty';
import { L as ListenOptions } from './shared/listhen.1c46e31d.mjs';
import 'node:http';
import 'node:https';
import 'node:net';
import 'get-port-please';
import 'crossws/adapters/node';
declare const main: citty.CommandDef<{
port: {
readonly type: "string";
readonly description: "Port to listen on (use `PORT` environment variable to override)";
};
host: {
readonly description: "Host to listen on. If no value or an empty string provided, will listen on all available interfaces (use `HOST` environment variable to override)";
};
clipboard: {
readonly type: "boolean";
readonly description: "Copy the URL to the clipboard";
};
open: {
readonly type: "boolean";
readonly description: "Open the URL in the browser";
};
https: {
readonly type: "boolean";
readonly description: "Enable HTTPS";
};
"https.cert": {
readonly type: "string";
readonly description: "Path to TLS certificate used with HTTPS in PEM format";
};
"https.key": {
readonly type: "string";
readonly description: "Path to TLS key used with HTTPS in PEM format";
};
"https.pfx": {
readonly type: "string";
readonly description: "Path to PKCS#12 (.p12/.pfx) keystore containing a TLS certificate and Key";
};
"https.passphrase": {
readonly type: "string";
readonly description: "Passphrase used for TLS key or keystore";
};
"https.validityDays": {
readonly type: "string";
readonly description: "Validity in days of the autogenerated TLS certificate (https: true)";
};
"https.domains": {
readonly type: "string";
readonly description: "Comma seperated list of domains and IPs, the autogenerated certificate should be valid for (https: true)";
};
publicURL: {
readonly type: "string";
readonly description: "Displayed public URL (used for QR code)";
readonly required: false;
};
qr: {
readonly type: "boolean";
readonly description: "Display The QR code of public URL when available";
readonly required: false;
};
public: {
readonly type: "boolean";
readonly description: "Listen to all network interfaces";
readonly required: false;
};
tunnel: {
readonly type: "boolean";
readonly description: "Open a tunnel using https://github.com/unjs/untun";
readonly required: false;
};
cwd: {
type: "string";
description: string;
};
entry: {
type: "positional";
description: string;
required: true;
};
name: {
type: "string";
description: string;
};
baseURL: {
type: "string";
description: string;
};
watch: {
type: "boolean";
description: string;
alias: string;
};
ws: {
type: "boolean";
description: string;
};
}>;
declare const runMain: () => Promise<void>;
/** Returns unjs/citty compatible args object */
declare function getArgs(): {
readonly port: {
readonly type: "string";
readonly description: "Port to listen on (use `PORT` environment variable to override)";
};
readonly host: {
readonly description: "Host to listen on. If no value or an empty string provided, will listen on all available interfaces (use `HOST` environment variable to override)";
};
readonly clipboard: {
readonly type: "boolean";
readonly description: "Copy the URL to the clipboard";
};
readonly open: {
readonly type: "boolean";
readonly description: "Open the URL in the browser";
};
readonly https: {
readonly type: "boolean";
readonly description: "Enable HTTPS";
};
readonly "https.cert": {
readonly type: "string";
readonly description: "Path to TLS certificate used with HTTPS in PEM format";
};
readonly "https.key": {
readonly type: "string";
readonly description: "Path to TLS key used with HTTPS in PEM format";
};
readonly "https.pfx": {
readonly type: "string";
readonly description: "Path to PKCS#12 (.p12/.pfx) keystore containing a TLS certificate and Key";
};
readonly "https.passphrase": {
readonly type: "string";
readonly description: "Passphrase used for TLS key or keystore";
};
readonly "https.validityDays": {
readonly type: "string";
readonly description: "Validity in days of the autogenerated TLS certificate (https: true)";
};
readonly "https.domains": {
readonly type: "string";
readonly description: "Comma seperated list of domains and IPs, the autogenerated certificate should be valid for (https: true)";
};
readonly publicURL: {
readonly type: "string";
readonly description: "Displayed public URL (used for QR code)";
readonly required: false;
};
readonly qr: {
readonly type: "boolean";
readonly description: "Display The QR code of public URL when available";
readonly required: false;
};
readonly public: {
readonly type: "boolean";
readonly description: "Listen to all network interfaces";
readonly required: false;
};
readonly tunnel: {
readonly type: "boolean";
readonly description: "Open a tunnel using https://github.com/unjs/untun";
readonly required: false;
};
};
type ParsedListhenArgs = ParsedArgs<ReturnType<typeof getArgs>>;
/** Convert unjs/citty compatible args to listhen options */
declare function parseArgs(args: ParsedListhenArgs): Partial<ListenOptions>;
export { getArgs, main, parseArgs, runMain };

172
node_modules/listhen/dist/cli.d.ts generated vendored Normal file
View File

@@ -0,0 +1,172 @@
import * as citty from 'citty';
import { ParsedArgs } from 'citty';
import { L as ListenOptions } from './shared/listhen.1c46e31d.js';
import 'node:http';
import 'node:https';
import 'node:net';
import 'get-port-please';
import 'crossws/adapters/node';
declare const main: citty.CommandDef<{
port: {
readonly type: "string";
readonly description: "Port to listen on (use `PORT` environment variable to override)";
};
host: {
readonly description: "Host to listen on. If no value or an empty string provided, will listen on all available interfaces (use `HOST` environment variable to override)";
};
clipboard: {
readonly type: "boolean";
readonly description: "Copy the URL to the clipboard";
};
open: {
readonly type: "boolean";
readonly description: "Open the URL in the browser";
};
https: {
readonly type: "boolean";
readonly description: "Enable HTTPS";
};
"https.cert": {
readonly type: "string";
readonly description: "Path to TLS certificate used with HTTPS in PEM format";
};
"https.key": {
readonly type: "string";
readonly description: "Path to TLS key used with HTTPS in PEM format";
};
"https.pfx": {
readonly type: "string";
readonly description: "Path to PKCS#12 (.p12/.pfx) keystore containing a TLS certificate and Key";
};
"https.passphrase": {
readonly type: "string";
readonly description: "Passphrase used for TLS key or keystore";
};
"https.validityDays": {
readonly type: "string";
readonly description: "Validity in days of the autogenerated TLS certificate (https: true)";
};
"https.domains": {
readonly type: "string";
readonly description: "Comma seperated list of domains and IPs, the autogenerated certificate should be valid for (https: true)";
};
publicURL: {
readonly type: "string";
readonly description: "Displayed public URL (used for QR code)";
readonly required: false;
};
qr: {
readonly type: "boolean";
readonly description: "Display The QR code of public URL when available";
readonly required: false;
};
public: {
readonly type: "boolean";
readonly description: "Listen to all network interfaces";
readonly required: false;
};
tunnel: {
readonly type: "boolean";
readonly description: "Open a tunnel using https://github.com/unjs/untun";
readonly required: false;
};
cwd: {
type: "string";
description: string;
};
entry: {
type: "positional";
description: string;
required: true;
};
name: {
type: "string";
description: string;
};
baseURL: {
type: "string";
description: string;
};
watch: {
type: "boolean";
description: string;
alias: string;
};
ws: {
type: "boolean";
description: string;
};
}>;
declare const runMain: () => Promise<void>;
/** Returns unjs/citty compatible args object */
declare function getArgs(): {
readonly port: {
readonly type: "string";
readonly description: "Port to listen on (use `PORT` environment variable to override)";
};
readonly host: {
readonly description: "Host to listen on. If no value or an empty string provided, will listen on all available interfaces (use `HOST` environment variable to override)";
};
readonly clipboard: {
readonly type: "boolean";
readonly description: "Copy the URL to the clipboard";
};
readonly open: {
readonly type: "boolean";
readonly description: "Open the URL in the browser";
};
readonly https: {
readonly type: "boolean";
readonly description: "Enable HTTPS";
};
readonly "https.cert": {
readonly type: "string";
readonly description: "Path to TLS certificate used with HTTPS in PEM format";
};
readonly "https.key": {
readonly type: "string";
readonly description: "Path to TLS key used with HTTPS in PEM format";
};
readonly "https.pfx": {
readonly type: "string";
readonly description: "Path to PKCS#12 (.p12/.pfx) keystore containing a TLS certificate and Key";
};
readonly "https.passphrase": {
readonly type: "string";
readonly description: "Passphrase used for TLS key or keystore";
};
readonly "https.validityDays": {
readonly type: "string";
readonly description: "Validity in days of the autogenerated TLS certificate (https: true)";
};
readonly "https.domains": {
readonly type: "string";
readonly description: "Comma seperated list of domains and IPs, the autogenerated certificate should be valid for (https: true)";
};
readonly publicURL: {
readonly type: "string";
readonly description: "Displayed public URL (used for QR code)";
readonly required: false;
};
readonly qr: {
readonly type: "boolean";
readonly description: "Display The QR code of public URL when available";
readonly required: false;
};
readonly public: {
readonly type: "boolean";
readonly description: "Listen to all network interfaces";
readonly required: false;
};
readonly tunnel: {
readonly type: "boolean";
readonly description: "Open a tunnel using https://github.com/unjs/untun";
readonly required: false;
};
};
type ParsedListhenArgs = ParsedArgs<ReturnType<typeof getArgs>>;
/** Convert unjs/citty compatible args to listhen options */
declare function parseArgs(args: ParsedListhenArgs): Partial<ListenOptions>;
export { getArgs, main, parseArgs, runMain };

172
node_modules/listhen/dist/cli.mjs generated vendored Normal file
View File

@@ -0,0 +1,172 @@
import { defineCommand, runMain as runMain$1 } from 'citty';
import { isAbsolute } from 'pathe';
import { listenAndWatch, createDevServer, listen } from './index.mjs';
import 'node:http';
import 'node:https';
import 'node:util';
import 'get-port-please';
import 'http-shutdown';
import 'consola';
import 'defu';
import 'consola/utils';
import 'uqr';
import 'node:child_process';
import 'node:fs';
import 'node:os';
import 'node:path';
import 'std-env';
import 'node-forge';
import 'node:fs/promises';
import 'mlly';
const name = "listhen";
const version = "1.8.0";
const description = "👂 Elegant HTTP Listener";
const main = defineCommand({
meta: {
name,
description,
version
},
args: {
cwd: {
type: "string",
description: "Current working directory"
},
entry: {
type: "positional",
description: "Listener entry file (./app.ts)",
required: true
},
name: {
type: "string",
description: "Name to use in the banner"
},
baseURL: {
type: "string",
description: "Base URL to use"
},
watch: {
type: "boolean",
description: "Watch for changes",
alias: "w"
},
ws: {
type: "boolean",
description: "Enable Experimental WebSocket support"
},
...getArgs()
},
async run({ args }) {
const opts = {
...args,
...parseArgs(args),
baseURL: args.baseURL,
name: args.name
};
const entry = isAbsolute(args.entry) || args.entry.startsWith(".") ? args.entry : `./${args.entry}`;
if (args.watch) {
await listenAndWatch(entry, opts);
} else {
const devServer = await createDevServer(entry, opts);
await listen(devServer.nodeListener, {
...opts,
_entry: devServer._entry,
ws: opts.ws ? devServer._ws : void 0
});
await devServer.reload(true);
}
}
});
const runMain = () => runMain$1(main);
function getArgs() {
return {
port: {
type: "string",
description: "Port to listen on (use `PORT` environment variable to override)"
},
host: {
description: "Host to listen on. If no value or an empty string provided, will listen on all available interfaces (use `HOST` environment variable to override)"
},
clipboard: {
type: "boolean",
description: "Copy the URL to the clipboard"
},
open: {
type: "boolean",
description: "Open the URL in the browser"
},
https: {
type: "boolean",
description: "Enable HTTPS"
},
"https.cert": {
type: "string",
description: "Path to TLS certificate used with HTTPS in PEM format"
},
"https.key": {
type: "string",
description: "Path to TLS key used with HTTPS in PEM format"
},
"https.pfx": {
type: "string",
description: "Path to PKCS#12 (.p12/.pfx) keystore containing a TLS certificate and Key"
},
"https.passphrase": {
type: "string",
description: "Passphrase used for TLS key or keystore"
},
"https.validityDays": {
type: "string",
description: "Validity in days of the autogenerated TLS certificate (https: true)"
},
"https.domains": {
type: "string",
description: "Comma seperated list of domains and IPs, the autogenerated certificate should be valid for (https: true)"
},
publicURL: {
type: "string",
description: "Displayed public URL (used for QR code)",
required: false
},
qr: {
type: "boolean",
description: "Display The QR code of public URL when available",
required: false
},
public: {
type: "boolean",
description: "Listen to all network interfaces",
required: false
},
tunnel: {
type: "boolean",
description: "Open a tunnel using https://github.com/unjs/untun",
required: false
}
};
}
function parseArgs(args) {
return {
port: args.port,
// prettier-ignore
hostname: typeof args.host === "string" ? args.host : args.host === true ? "" : void 0,
clipboard: args.clipboard,
open: args.open,
qr: args.qr,
publicURL: args.publicURL,
public: args.public,
tunnel: args.tunnel,
https: args.https ? {
cert: args["https.cert"],
key: args["https.key"],
pfx: args["https.pfx"],
passphrase: args["https.passphrase"],
validityDays: args["https.validityDays"] ? +args["https.validityDays"] : void 0,
domains: args["https.domains"] ? args["https.domains"].split(",") : void 0
} : false
};
}
export { getArgs, main, parseArgs, runMain };

1072
node_modules/listhen/dist/index.cjs generated vendored Normal file

File diff suppressed because it is too large Load Diff

44
node_modules/listhen/dist/index.d.cts generated vendored Normal file
View File

@@ -0,0 +1,44 @@
import { RequestListener } from 'node:http';
import { L as ListenOptions, a as Listener } from './shared/listhen.1c46e31d.cjs';
export { b as Certificate, C as CrossWSOptions, G as GetURLOptions, H as HTTPSOptions, c as ListenURL, S as ShowURLOptions } from './shared/listhen.1c46e31d.cjs';
import { ConsolaInstance } from 'consola';
import * as http from 'http';
import * as crossws_adapters_node from 'crossws/adapters/node';
import * as h3 from 'h3';
import * as jiti_lib_types from 'jiti/lib/types';
import 'node:https';
import 'node:net';
import 'get-port-please';
declare function listen(handle: RequestListener, _options?: Partial<ListenOptions>): Promise<Listener>;
interface DevServerOptions {
cwd?: string;
staticDirs?: string[];
logger?: ConsolaInstance;
ws?: ListenOptions["ws"];
}
declare function createDevServer(entry: string, options: DevServerOptions): Promise<{
cwd: string;
resolver: {
relative: (path: string) => string;
formatRelative: (path: string) => string;
import: (id: string, opts?: jiti_lib_types.JitiResolveOptions) => Promise<unknown>;
resolve: (id: string) => string;
tryResolve: (id: string) => string | undefined;
};
nodeListener: h3.NodeListener;
reload: (_initial?: boolean) => Promise<void>;
_ws: false | crossws_adapters_node.NodeOptions | ((req: http.IncomingMessage, head: Buffer) => void) | undefined;
_entry: string | undefined;
}>;
interface WatchOptions extends DevServerOptions {
cwd?: string;
logger?: ConsolaInstance;
ignore?: string[];
publicDirs?: string[];
}
declare function listenAndWatch(entry: string, options: Partial<ListenOptions & WatchOptions>): Promise<Listener>;
export { type DevServerOptions, ListenOptions, Listener, type WatchOptions, createDevServer, listen, listenAndWatch };

44
node_modules/listhen/dist/index.d.mts generated vendored Normal file
View File

@@ -0,0 +1,44 @@
import { RequestListener } from 'node:http';
import { L as ListenOptions, a as Listener } from './shared/listhen.1c46e31d.mjs';
export { b as Certificate, C as CrossWSOptions, G as GetURLOptions, H as HTTPSOptions, c as ListenURL, S as ShowURLOptions } from './shared/listhen.1c46e31d.mjs';
import { ConsolaInstance } from 'consola';
import * as http from 'http';
import * as crossws_adapters_node from 'crossws/adapters/node';
import * as h3 from 'h3';
import * as jiti_lib_types from 'jiti/lib/types';
import 'node:https';
import 'node:net';
import 'get-port-please';
declare function listen(handle: RequestListener, _options?: Partial<ListenOptions>): Promise<Listener>;
interface DevServerOptions {
cwd?: string;
staticDirs?: string[];
logger?: ConsolaInstance;
ws?: ListenOptions["ws"];
}
declare function createDevServer(entry: string, options: DevServerOptions): Promise<{
cwd: string;
resolver: {
relative: (path: string) => string;
formatRelative: (path: string) => string;
import: (id: string, opts?: jiti_lib_types.JitiResolveOptions) => Promise<unknown>;
resolve: (id: string) => string;
tryResolve: (id: string) => string | undefined;
};
nodeListener: h3.NodeListener;
reload: (_initial?: boolean) => Promise<void>;
_ws: false | crossws_adapters_node.NodeOptions | ((req: http.IncomingMessage, head: Buffer) => void) | undefined;
_entry: string | undefined;
}>;
interface WatchOptions extends DevServerOptions {
cwd?: string;
logger?: ConsolaInstance;
ignore?: string[];
publicDirs?: string[];
}
declare function listenAndWatch(entry: string, options: Partial<ListenOptions & WatchOptions>): Promise<Listener>;
export { type DevServerOptions, ListenOptions, Listener, type WatchOptions, createDevServer, listen, listenAndWatch };

44
node_modules/listhen/dist/index.d.ts generated vendored Normal file
View File

@@ -0,0 +1,44 @@
import { RequestListener } from 'node:http';
import { L as ListenOptions, a as Listener } from './shared/listhen.1c46e31d.js';
export { b as Certificate, C as CrossWSOptions, G as GetURLOptions, H as HTTPSOptions, c as ListenURL, S as ShowURLOptions } from './shared/listhen.1c46e31d.js';
import { ConsolaInstance } from 'consola';
import * as http from 'http';
import * as crossws_adapters_node from 'crossws/adapters/node';
import * as h3 from 'h3';
import * as jiti_lib_types from 'jiti/lib/types';
import 'node:https';
import 'node:net';
import 'get-port-please';
declare function listen(handle: RequestListener, _options?: Partial<ListenOptions>): Promise<Listener>;
interface DevServerOptions {
cwd?: string;
staticDirs?: string[];
logger?: ConsolaInstance;
ws?: ListenOptions["ws"];
}
declare function createDevServer(entry: string, options: DevServerOptions): Promise<{
cwd: string;
resolver: {
relative: (path: string) => string;
formatRelative: (path: string) => string;
import: (id: string, opts?: jiti_lib_types.JitiResolveOptions) => Promise<unknown>;
resolve: (id: string) => string;
tryResolve: (id: string) => string | undefined;
};
nodeListener: h3.NodeListener;
reload: (_initial?: boolean) => Promise<void>;
_ws: false | crossws_adapters_node.NodeOptions | ((req: http.IncomingMessage, head: Buffer) => void) | undefined;
_entry: string | undefined;
}>;
interface WatchOptions extends DevServerOptions {
cwd?: string;
logger?: ConsolaInstance;
ignore?: string[];
publicDirs?: string[];
}
declare function listenAndWatch(entry: string, options: Partial<ListenOptions & WatchOptions>): Promise<Listener>;
export { type DevServerOptions, ListenOptions, Listener, type WatchOptions, createDevServer, listen, listenAndWatch };

1058
node_modules/listhen/dist/index.mjs generated vendored Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,82 @@
import { IncomingMessage, Server } from 'node:http';
import { Server as Server$1 } from 'node:https';
import { AddressInfo } from 'node:net';
import { GetPortInput } from 'get-port-please';
import { NodeOptions } from 'crossws/adapters/node';
type CrossWSOptions = NodeOptions;
interface Certificate {
key: string;
cert: string;
passphrase?: string;
}
interface HTTPSOptions {
cert?: string;
key?: string;
pfx?: string;
passphrase?: string;
validityDays?: number;
domains?: string[];
}
interface ListenOptions {
name: string;
port: GetPortInput;
hostname: string;
showURL: boolean;
baseURL: string;
open: boolean;
https: boolean | HTTPSOptions;
clipboard: boolean;
isTest: boolean;
isProd: boolean;
autoClose: boolean;
_entry?: string;
/**
* Used as main public url to display
* @default The first public IPV4 address listening to
*/
publicURL?: string;
/**
* Print QR Code for public IPv4 address
*
* @default true
*/
qr?: boolean;
/**
* When enabled, listhen tries to listen to all network interfaces
*
* @default `false` for development and `true` for production
*/
public: boolean;
/**
* Open a tunnel using https://github.com/unjs/untun
*/
tunnel?: boolean;
/**
* WebSocket Upgrade Handler
*
* Input can be an upgrade handler or CrossWS options
*
* @experimental CrossWS usage is subject to change
* @see https://github.com/unjs/crossws
*/
ws?: boolean | CrossWSOptions | ((req: IncomingMessage, head: Buffer) => void);
}
type GetURLOptions = Pick<Partial<ListenOptions>, "baseURL" | "publicURL">;
type ShowURLOptions = Pick<Partial<ListenOptions>, "baseURL" | "name" | "publicURL" | "qr">;
interface ListenURL {
url: string;
type: "local" | "network" | "tunnel";
}
interface Listener {
url: string;
address: AddressInfo;
server: Server | Server$1;
https: false | Certificate;
close: () => Promise<void>;
open: () => Promise<void>;
showURL: (options?: ShowURLOptions) => Promise<void>;
getURLs: (options?: GetURLOptions) => Promise<ListenURL[]>;
}
export type { CrossWSOptions as C, GetURLOptions as G, HTTPSOptions as H, ListenOptions as L, ShowURLOptions as S, Listener as a, Certificate as b, ListenURL as c };

View File

@@ -0,0 +1,82 @@
import { IncomingMessage, Server } from 'node:http';
import { Server as Server$1 } from 'node:https';
import { AddressInfo } from 'node:net';
import { GetPortInput } from 'get-port-please';
import { NodeOptions } from 'crossws/adapters/node';
type CrossWSOptions = NodeOptions;
interface Certificate {
key: string;
cert: string;
passphrase?: string;
}
interface HTTPSOptions {
cert?: string;
key?: string;
pfx?: string;
passphrase?: string;
validityDays?: number;
domains?: string[];
}
interface ListenOptions {
name: string;
port: GetPortInput;
hostname: string;
showURL: boolean;
baseURL: string;
open: boolean;
https: boolean | HTTPSOptions;
clipboard: boolean;
isTest: boolean;
isProd: boolean;
autoClose: boolean;
_entry?: string;
/**
* Used as main public url to display
* @default The first public IPV4 address listening to
*/
publicURL?: string;
/**
* Print QR Code for public IPv4 address
*
* @default true
*/
qr?: boolean;
/**
* When enabled, listhen tries to listen to all network interfaces
*
* @default `false` for development and `true` for production
*/
public: boolean;
/**
* Open a tunnel using https://github.com/unjs/untun
*/
tunnel?: boolean;
/**
* WebSocket Upgrade Handler
*
* Input can be an upgrade handler or CrossWS options
*
* @experimental CrossWS usage is subject to change
* @see https://github.com/unjs/crossws
*/
ws?: boolean | CrossWSOptions | ((req: IncomingMessage, head: Buffer) => void);
}
type GetURLOptions = Pick<Partial<ListenOptions>, "baseURL" | "publicURL">;
type ShowURLOptions = Pick<Partial<ListenOptions>, "baseURL" | "name" | "publicURL" | "qr">;
interface ListenURL {
url: string;
type: "local" | "network" | "tunnel";
}
interface Listener {
url: string;
address: AddressInfo;
server: Server | Server$1;
https: false | Certificate;
close: () => Promise<void>;
open: () => Promise<void>;
showURL: (options?: ShowURLOptions) => Promise<void>;
getURLs: (options?: GetURLOptions) => Promise<ListenURL[]>;
}
export type { CrossWSOptions as C, GetURLOptions as G, HTTPSOptions as H, ListenOptions as L, ShowURLOptions as S, Listener as a, Certificate as b, ListenURL as c };

82
node_modules/listhen/dist/shared/listhen.1c46e31d.d.ts generated vendored Normal file
View File

@@ -0,0 +1,82 @@
import { IncomingMessage, Server } from 'node:http';
import { Server as Server$1 } from 'node:https';
import { AddressInfo } from 'node:net';
import { GetPortInput } from 'get-port-please';
import { NodeOptions } from 'crossws/adapters/node';
type CrossWSOptions = NodeOptions;
interface Certificate {
key: string;
cert: string;
passphrase?: string;
}
interface HTTPSOptions {
cert?: string;
key?: string;
pfx?: string;
passphrase?: string;
validityDays?: number;
domains?: string[];
}
interface ListenOptions {
name: string;
port: GetPortInput;
hostname: string;
showURL: boolean;
baseURL: string;
open: boolean;
https: boolean | HTTPSOptions;
clipboard: boolean;
isTest: boolean;
isProd: boolean;
autoClose: boolean;
_entry?: string;
/**
* Used as main public url to display
* @default The first public IPV4 address listening to
*/
publicURL?: string;
/**
* Print QR Code for public IPv4 address
*
* @default true
*/
qr?: boolean;
/**
* When enabled, listhen tries to listen to all network interfaces
*
* @default `false` for development and `true` for production
*/
public: boolean;
/**
* Open a tunnel using https://github.com/unjs/untun
*/
tunnel?: boolean;
/**
* WebSocket Upgrade Handler
*
* Input can be an upgrade handler or CrossWS options
*
* @experimental CrossWS usage is subject to change
* @see https://github.com/unjs/crossws
*/
ws?: boolean | CrossWSOptions | ((req: IncomingMessage, head: Buffer) => void);
}
type GetURLOptions = Pick<Partial<ListenOptions>, "baseURL" | "publicURL">;
type ShowURLOptions = Pick<Partial<ListenOptions>, "baseURL" | "name" | "publicURL" | "qr">;
interface ListenURL {
url: string;
type: "local" | "network" | "tunnel";
}
interface Listener {
url: string;
address: AddressInfo;
server: Server | Server$1;
https: false | Certificate;
close: () => Promise<void>;
open: () => Promise<void>;
showURL: (options?: ShowURLOptions) => Promise<void>;
getURLs: (options?: GetURLOptions) => Promise<ListenURL[]>;
}
export type { CrossWSOptions as C, GetURLOptions as G, HTTPSOptions as H, ListenOptions as L, ShowURLOptions as S, Listener as a, Certificate as b, ListenURL as c };

75
node_modules/listhen/package.json generated vendored Normal file
View File

@@ -0,0 +1,75 @@
{
"name": "listhen",
"version": "1.9.0",
"description": "👂 Elegant HTTP Listener",
"repository": "unjs/listhen",
"license": "MIT",
"exports": {
".": {
"types": "./dist/index.d.ts",
"import": "./dist/index.mjs",
"require": "./dist/index.cjs"
},
"./cli": {
"types": "./dist/cli.d.ts",
"import": "./dist/cli.mjs",
"require": "./dist/cli.cjs"
}
},
"main": "./dist/index.mjs",
"types": "./dist/index.d.ts",
"bin": {
"listen": "./bin/listhen.mjs",
"listhen": "./bin/listhen.mjs"
},
"files": [
"dist",
"lib",
"bin",
"cli.d.ts"
],
"dependencies": {
"@parcel/watcher": "^2.4.1",
"@parcel/watcher-wasm": "^2.4.1",
"citty": "^0.1.6",
"clipboardy": "^4.0.0",
"consola": "^3.2.3",
"crossws": ">=0.2.0 <0.4.0",
"defu": "^6.1.4",
"get-port-please": "^3.1.2",
"h3": "^1.12.0",
"http-shutdown": "^1.2.2",
"jiti": "^2.1.2",
"mlly": "^1.7.1",
"node-forge": "^1.3.1",
"pathe": "^1.1.2",
"std-env": "^3.7.0",
"ufo": "^1.5.4",
"untun": "^0.1.3",
"uqr": "^0.1.2"
},
"devDependencies": {
"@types/node": "^22.7.4",
"@types/node-forge": "^1.3.11",
"@vitest/coverage-v8": "^2.1.2",
"automd": "^0.3.9",
"changelogen": "^0.5.7",
"eslint": "^9.11.1",
"eslint-config-unjs": "^0.4.1",
"ip-regex": "^5.0.0",
"prettier": "^3.3.3",
"typescript": "^5.6.2",
"unbuild": "^2.0.0",
"vitest": "^2.1.2"
},
"scripts": {
"build": "unbuild",
"dev": "vitest",
"lint": "eslint . && prettier -c src test",
"lint:fix": "eslint --fix . && prettier -w src test",
"listhen": "node ./scripts/listhen.mjs",
"play": "node ./scripts/listhen.mjs -w ./playground --ws",
"release": "pnpm test && pnpm build && changelogen --release && pnpm publish && git push --follow-tags",
"test": "pnpm lint && vitest run --coverage"
}
}