feat: init
This commit is contained in:
21
node_modules/serve-placeholder/LICENSE
generated
vendored
Normal file
21
node_modules/serve-placeholder/LICENSE
generated
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2018 - 2022 UnJS
|
||||
|
||||
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.
|
||||
184
node_modules/serve-placeholder/README.md
generated
vendored
Normal file
184
node_modules/serve-placeholder/README.md
generated
vendored
Normal file
@@ -0,0 +1,184 @@
|
||||
# ♡ serve-placeholder
|
||||
|
||||
<!-- automd:badges color=yellow -->
|
||||
|
||||
[](https://npmjs.com/package/serve-placeholder)
|
||||
[](https://npmjs.com/package/serve-placeholder)
|
||||
|
||||
<!-- /automd -->
|
||||
|
||||
Smart placeholder for missing assets
|
||||
|
||||
## Why?
|
||||
|
||||
**💵 Rendering Errors is costly**
|
||||
|
||||
Serving each 404 page for assets adds extra load to the server and increases crashing chances. This is crucial for setups with server-side-rendering and removes additional SSR loads when assets like `robots.txt` or `favicon.ico` don't exist.
|
||||
|
||||
**👌 Meaningful Responses**
|
||||
|
||||
We can always send a better 404 response than an HTML page by knowing file extensions. For example, we send a fallback transparent 1x1 image for image extensions.
|
||||
|
||||
**🔍 SEO Friendly**
|
||||
|
||||
Instead of indexing invalid URLs with HTML pages, we properly send 404 and the right content type.
|
||||
|
||||
## Usage
|
||||
|
||||
Install package:
|
||||
|
||||
<!-- automd:pm-install -->
|
||||
|
||||
```sh
|
||||
# ✨ Auto-detect
|
||||
npx nypm install serve-placeholder
|
||||
|
||||
# npm
|
||||
npm install serve-placeholder
|
||||
|
||||
# yarn
|
||||
yarn add serve-placeholder
|
||||
|
||||
# pnpm
|
||||
pnpm install serve-placeholder
|
||||
|
||||
# bun
|
||||
bun install serve-placeholder
|
||||
```
|
||||
|
||||
<!-- /automd -->
|
||||
|
||||
Import:
|
||||
|
||||
```js
|
||||
// ESM
|
||||
import { servePlaceholder } from "serve-placeholder";
|
||||
|
||||
// CommonJS
|
||||
const { servePlaceholder } = require("serve-placeholder");
|
||||
```
|
||||
|
||||
Create and add server middleware between serve-static and router middleware:
|
||||
|
||||
```diff
|
||||
app.use('/assets', serveStatic(..))
|
||||
++ app.use('/assets', servePlaceholder())
|
||||
app.use('/', router)
|
||||
```
|
||||
|
||||
Additionally, we can have a default placeholder for arbitrary routes which handles known extensions **assuming other routes have no extension**:
|
||||
|
||||
```diff
|
||||
app.use('/assets', serveStatic(..))
|
||||
app.use('/assets', servePlaceholder())
|
||||
++ app.use('/', placeholder({ skipUnknown: true }))
|
||||
app.use('/', router)
|
||||
```
|
||||
|
||||
## Options
|
||||
|
||||
### `handlers`
|
||||
|
||||
A mapping from file extensions to the handler. Extensions should start with _dot_ like `.js`.
|
||||
|
||||
You can disable any of the handlers by setting the value to `null`
|
||||
|
||||
If the value of a handler is set to `false`, the middleware will be ignored for that extension.
|
||||
|
||||
### `statusCode`
|
||||
|
||||
- Default: `404`
|
||||
|
||||
Sets `statusCode` for all handled responses. Set to `false` to disable overriding statusCode.
|
||||
|
||||
### `skipUnknown`
|
||||
|
||||
- Default: `false`
|
||||
|
||||
Skip middleware when no handler is defined for the current request.
|
||||
|
||||
Please note that if this option is set to `true`, then `default` handler will be disabled!
|
||||
|
||||
### `placeholders`
|
||||
|
||||
- Type: `Object`
|
||||
|
||||
A mapping from handler to placeholder. Values can be `String` or `Buffer`. You can disable any of the placeholders by setting the value to `false`.
|
||||
|
||||
### `mimes`
|
||||
|
||||
- Type: `Object`
|
||||
|
||||
A mapping from handler to the mime type. Mime type will be set as `Content-Type` header. You can disable sending any of the mimes by setting the value to `false`.
|
||||
|
||||
### `cacheHeaders`
|
||||
|
||||
- Default: `true`
|
||||
|
||||
Set headers to prevent accidentally caching 404 resources.
|
||||
|
||||
When enabled, these headers will be sent:
|
||||
|
||||
```js
|
||||
const headers = {
|
||||
"cache-control": "no-cache, no-store, must-revalidate",
|
||||
expires: "0",
|
||||
pragma: "no-cache",
|
||||
};
|
||||
```
|
||||
|
||||
### `placeholderHeader`
|
||||
|
||||
- Default: `true`
|
||||
|
||||
Sets an `X-Placeholder` header with value of handler name.
|
||||
|
||||
## Defaults
|
||||
|
||||
These are [default handlers](./src/defaults.ts). You can override every of them using provided options.
|
||||
|
||||
| Handler | Extensions | Mime type | Placeholder |
|
||||
| --------- | ---------------------------------------------------------------- | ------------------------ | ------------------------- |
|
||||
| `default` | any unknown extension | - | - |
|
||||
| `css` | `.css` | `text/css` | `/* style not found */` |
|
||||
| `html` | `.html`, `.htm` | `text/html` | `<!-- page not found -->` |
|
||||
| `js` | `.js` | `application/javascript` | `/* script not found */` |
|
||||
| `json` | `.json` | `application/json` | `{}` |
|
||||
| `map` | `.map` | `application/json` | [empty sourcemap v3 json] |
|
||||
| `plain` | `.txt`, `.text`, `.md` | `text/plain` | [empty] |
|
||||
| `image` | `.png`, `.jpg`, `.jpeg`, `.gif`, `.svg`, `.webp`, `.bmp`, `.ico` | `image/gif` | [transparent 1x1 image] |
|
||||
|
||||
## Development
|
||||
|
||||
<details>
|
||||
|
||||
<summary>local development</summary>
|
||||
|
||||
- Clone this repository
|
||||
- Install latest LTS version of [Node.js](https://nodejs.org/en/)
|
||||
- Enable [Corepack](https://github.com/nodejs/corepack) using `corepack enable`
|
||||
- Install dependencies using `pnpm install`
|
||||
- Run interactive tests using `pnpm dev`
|
||||
|
||||
</details>
|
||||
|
||||
## License
|
||||
|
||||
<!-- automd:contributors author=pi0 license=MIT -->
|
||||
|
||||
Published under the [MIT](https://github.com/unjs/serve-placeholder/blob/main/LICENSE) license.
|
||||
Made by [@pi0](https://github.com/pi0) and [community](https://github.com/unjs/serve-placeholder/graphs/contributors) 💛
|
||||
<br><br>
|
||||
<a href="https://github.com/unjs/serve-placeholder/graphs/contributors">
|
||||
<img src="https://contrib.rocks/image?repo=unjs/serve-placeholder" />
|
||||
</a>
|
||||
|
||||
<!-- /automd -->
|
||||
|
||||
<!-- automd:with-automd -->
|
||||
|
||||
---
|
||||
|
||||
_🤖 auto updated with [automd](https://automd.unjs.io)_
|
||||
|
||||
<!-- /automd -->
|
||||
101
node_modules/serve-placeholder/dist/index.cjs
generated
vendored
Normal file
101
node_modules/serve-placeholder/dist/index.cjs
generated
vendored
Normal file
@@ -0,0 +1,101 @@
|
||||
'use strict';
|
||||
|
||||
const defu = require('defu');
|
||||
|
||||
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e.default : e; }
|
||||
|
||||
const defu__default = /*#__PURE__*/_interopDefaultCompat(defu);
|
||||
|
||||
const DefaultOptions = {
|
||||
statusCode: 404,
|
||||
skipUnknown: false,
|
||||
cacheHeaders: true,
|
||||
placeholderHeader: true,
|
||||
handlers: {
|
||||
// css
|
||||
".css": "css",
|
||||
// html
|
||||
".html": "html",
|
||||
".htm": "html",
|
||||
// image
|
||||
".png": "image",
|
||||
".jpg": "image",
|
||||
".jpeg": "image",
|
||||
".gif": "image",
|
||||
".svg": "image",
|
||||
".webp": "image",
|
||||
".bmp": "image",
|
||||
".ico": "image",
|
||||
// js
|
||||
".js": "js",
|
||||
// json
|
||||
".json": "json",
|
||||
// map
|
||||
".map": "map",
|
||||
// plain
|
||||
".txt": "plain",
|
||||
".text": "plain",
|
||||
".md": "plain"
|
||||
},
|
||||
placeholders: {
|
||||
css: "/* style not found */",
|
||||
default: void 0,
|
||||
html: "<!-- page not found -->",
|
||||
image: "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",
|
||||
js: "/* script not found */",
|
||||
json: "{}",
|
||||
map: '{"version": "3", "sources": [], "mappings": "" }',
|
||||
plain: ""
|
||||
},
|
||||
mimes: {
|
||||
css: "text/css",
|
||||
default: void 0,
|
||||
html: "text/html",
|
||||
js: "application/javascript",
|
||||
json: "application/json",
|
||||
image: "image/gif",
|
||||
map: "application/json",
|
||||
plain: "text/plain"
|
||||
}
|
||||
};
|
||||
|
||||
const EXT_REGEX = /\.[\dA-Za-z]+$/;
|
||||
function servePlaceholder(_options = {}) {
|
||||
const options = defu__default(_options, DefaultOptions);
|
||||
return function servePlaceholderMiddleware(req, res, next) {
|
||||
if (res.writableEnded) {
|
||||
return;
|
||||
}
|
||||
const url = req.url.split("?")[0];
|
||||
const ext = (url.match(EXT_REGEX) || [])[0] || "";
|
||||
let handler = options.handlers[ext];
|
||||
if (handler === false) {
|
||||
return next();
|
||||
}
|
||||
if (handler === void 0) {
|
||||
if (options.skipUnknown) {
|
||||
return next();
|
||||
}
|
||||
handler = "default";
|
||||
}
|
||||
if (options.statusCode) {
|
||||
res.statusCode = options.statusCode;
|
||||
}
|
||||
const mime = options.mimes[handler];
|
||||
if (mime) {
|
||||
res.setHeader("Content-Type", mime);
|
||||
}
|
||||
if (options.cacheHeaders) {
|
||||
res.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
|
||||
res.setHeader("Pragma", "no-cache");
|
||||
res.setHeader("Expires", "0");
|
||||
}
|
||||
if (options.placeholderHeader) {
|
||||
res.setHeader("X-Placeholder", handler);
|
||||
}
|
||||
const placeholder = options.placeholders[handler];
|
||||
res.end(placeholder);
|
||||
};
|
||||
}
|
||||
|
||||
exports.servePlaceholder = servePlaceholder;
|
||||
47
node_modules/serve-placeholder/dist/index.d.cts
generated
vendored
Normal file
47
node_modules/serve-placeholder/dist/index.d.cts
generated
vendored
Normal file
@@ -0,0 +1,47 @@
|
||||
import { IncomingMessage, ServerResponse } from 'node:http';
|
||||
|
||||
interface ServePlaceholderOptions {
|
||||
/**
|
||||
* Sets `statusCode` for all handled responses. Set to `false` to disable overriding statusCode.
|
||||
*
|
||||
* @default 404
|
||||
*/
|
||||
statusCode?: number;
|
||||
/**
|
||||
* Skip middleware when no handler is defined for the current request.
|
||||
* Please note that if this option is set to `true`, then `default` handler will be disabled
|
||||
* @default false
|
||||
*/
|
||||
skipUnknown?: boolean;
|
||||
/**
|
||||
* Set headers to prevent accidentally caching 404 resources.
|
||||
*
|
||||
* @default true
|
||||
*/
|
||||
cacheHeaders?: boolean;
|
||||
/**
|
||||
* Sets an `X-Placeholder` header with value of handler name.
|
||||
*
|
||||
* @default true
|
||||
*/
|
||||
placeholderHeader?: boolean;
|
||||
/**
|
||||
* A mapping from file extensions to the handler. Extensions should start with *dot* like `.js`.
|
||||
* You can disable any of the handlers by setting the value to `null`
|
||||
* If the value of a handler is set to `false`, the middleware will be ignored for that extension.
|
||||
*/
|
||||
handlers?: Record<string, string | false>;
|
||||
/**
|
||||
* A mapping from handler to placeholder. Values can be `String` or `Buffer`. You can disable any of the placeholders by setting the value to `false`.
|
||||
*/
|
||||
placeholders?: Record<string, string | undefined>;
|
||||
/**
|
||||
* A mapping from handler to the mime type. Mime type will be set as `Content-Type` header. You can disable sending any of the mimes by setting the value to `false`.
|
||||
*/
|
||||
mimes?: Record<string, string | undefined>;
|
||||
}
|
||||
|
||||
type ServerMiddleware = (req: IncomingMessage, res: ServerResponse, next: () => void) => void;
|
||||
declare function servePlaceholder(_options?: ServePlaceholderOptions): ServerMiddleware;
|
||||
|
||||
export { type ServerMiddleware, servePlaceholder };
|
||||
47
node_modules/serve-placeholder/dist/index.d.mts
generated
vendored
Normal file
47
node_modules/serve-placeholder/dist/index.d.mts
generated
vendored
Normal file
@@ -0,0 +1,47 @@
|
||||
import { IncomingMessage, ServerResponse } from 'node:http';
|
||||
|
||||
interface ServePlaceholderOptions {
|
||||
/**
|
||||
* Sets `statusCode` for all handled responses. Set to `false` to disable overriding statusCode.
|
||||
*
|
||||
* @default 404
|
||||
*/
|
||||
statusCode?: number;
|
||||
/**
|
||||
* Skip middleware when no handler is defined for the current request.
|
||||
* Please note that if this option is set to `true`, then `default` handler will be disabled
|
||||
* @default false
|
||||
*/
|
||||
skipUnknown?: boolean;
|
||||
/**
|
||||
* Set headers to prevent accidentally caching 404 resources.
|
||||
*
|
||||
* @default true
|
||||
*/
|
||||
cacheHeaders?: boolean;
|
||||
/**
|
||||
* Sets an `X-Placeholder` header with value of handler name.
|
||||
*
|
||||
* @default true
|
||||
*/
|
||||
placeholderHeader?: boolean;
|
||||
/**
|
||||
* A mapping from file extensions to the handler. Extensions should start with *dot* like `.js`.
|
||||
* You can disable any of the handlers by setting the value to `null`
|
||||
* If the value of a handler is set to `false`, the middleware will be ignored for that extension.
|
||||
*/
|
||||
handlers?: Record<string, string | false>;
|
||||
/**
|
||||
* A mapping from handler to placeholder. Values can be `String` or `Buffer`. You can disable any of the placeholders by setting the value to `false`.
|
||||
*/
|
||||
placeholders?: Record<string, string | undefined>;
|
||||
/**
|
||||
* A mapping from handler to the mime type. Mime type will be set as `Content-Type` header. You can disable sending any of the mimes by setting the value to `false`.
|
||||
*/
|
||||
mimes?: Record<string, string | undefined>;
|
||||
}
|
||||
|
||||
type ServerMiddleware = (req: IncomingMessage, res: ServerResponse, next: () => void) => void;
|
||||
declare function servePlaceholder(_options?: ServePlaceholderOptions): ServerMiddleware;
|
||||
|
||||
export { type ServerMiddleware, servePlaceholder };
|
||||
47
node_modules/serve-placeholder/dist/index.d.ts
generated
vendored
Normal file
47
node_modules/serve-placeholder/dist/index.d.ts
generated
vendored
Normal file
@@ -0,0 +1,47 @@
|
||||
import { IncomingMessage, ServerResponse } from 'node:http';
|
||||
|
||||
interface ServePlaceholderOptions {
|
||||
/**
|
||||
* Sets `statusCode` for all handled responses. Set to `false` to disable overriding statusCode.
|
||||
*
|
||||
* @default 404
|
||||
*/
|
||||
statusCode?: number;
|
||||
/**
|
||||
* Skip middleware when no handler is defined for the current request.
|
||||
* Please note that if this option is set to `true`, then `default` handler will be disabled
|
||||
* @default false
|
||||
*/
|
||||
skipUnknown?: boolean;
|
||||
/**
|
||||
* Set headers to prevent accidentally caching 404 resources.
|
||||
*
|
||||
* @default true
|
||||
*/
|
||||
cacheHeaders?: boolean;
|
||||
/**
|
||||
* Sets an `X-Placeholder` header with value of handler name.
|
||||
*
|
||||
* @default true
|
||||
*/
|
||||
placeholderHeader?: boolean;
|
||||
/**
|
||||
* A mapping from file extensions to the handler. Extensions should start with *dot* like `.js`.
|
||||
* You can disable any of the handlers by setting the value to `null`
|
||||
* If the value of a handler is set to `false`, the middleware will be ignored for that extension.
|
||||
*/
|
||||
handlers?: Record<string, string | false>;
|
||||
/**
|
||||
* A mapping from handler to placeholder. Values can be `String` or `Buffer`. You can disable any of the placeholders by setting the value to `false`.
|
||||
*/
|
||||
placeholders?: Record<string, string | undefined>;
|
||||
/**
|
||||
* A mapping from handler to the mime type. Mime type will be set as `Content-Type` header. You can disable sending any of the mimes by setting the value to `false`.
|
||||
*/
|
||||
mimes?: Record<string, string | undefined>;
|
||||
}
|
||||
|
||||
type ServerMiddleware = (req: IncomingMessage, res: ServerResponse, next: () => void) => void;
|
||||
declare function servePlaceholder(_options?: ServePlaceholderOptions): ServerMiddleware;
|
||||
|
||||
export { type ServerMiddleware, servePlaceholder };
|
||||
95
node_modules/serve-placeholder/dist/index.mjs
generated
vendored
Normal file
95
node_modules/serve-placeholder/dist/index.mjs
generated
vendored
Normal file
@@ -0,0 +1,95 @@
|
||||
import defu from 'defu';
|
||||
|
||||
const DefaultOptions = {
|
||||
statusCode: 404,
|
||||
skipUnknown: false,
|
||||
cacheHeaders: true,
|
||||
placeholderHeader: true,
|
||||
handlers: {
|
||||
// css
|
||||
".css": "css",
|
||||
// html
|
||||
".html": "html",
|
||||
".htm": "html",
|
||||
// image
|
||||
".png": "image",
|
||||
".jpg": "image",
|
||||
".jpeg": "image",
|
||||
".gif": "image",
|
||||
".svg": "image",
|
||||
".webp": "image",
|
||||
".bmp": "image",
|
||||
".ico": "image",
|
||||
// js
|
||||
".js": "js",
|
||||
// json
|
||||
".json": "json",
|
||||
// map
|
||||
".map": "map",
|
||||
// plain
|
||||
".txt": "plain",
|
||||
".text": "plain",
|
||||
".md": "plain"
|
||||
},
|
||||
placeholders: {
|
||||
css: "/* style not found */",
|
||||
default: void 0,
|
||||
html: "<!-- page not found -->",
|
||||
image: "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",
|
||||
js: "/* script not found */",
|
||||
json: "{}",
|
||||
map: '{"version": "3", "sources": [], "mappings": "" }',
|
||||
plain: ""
|
||||
},
|
||||
mimes: {
|
||||
css: "text/css",
|
||||
default: void 0,
|
||||
html: "text/html",
|
||||
js: "application/javascript",
|
||||
json: "application/json",
|
||||
image: "image/gif",
|
||||
map: "application/json",
|
||||
plain: "text/plain"
|
||||
}
|
||||
};
|
||||
|
||||
const EXT_REGEX = /\.[\dA-Za-z]+$/;
|
||||
function servePlaceholder(_options = {}) {
|
||||
const options = defu(_options, DefaultOptions);
|
||||
return function servePlaceholderMiddleware(req, res, next) {
|
||||
if (res.writableEnded) {
|
||||
return;
|
||||
}
|
||||
const url = req.url.split("?")[0];
|
||||
const ext = (url.match(EXT_REGEX) || [])[0] || "";
|
||||
let handler = options.handlers[ext];
|
||||
if (handler === false) {
|
||||
return next();
|
||||
}
|
||||
if (handler === void 0) {
|
||||
if (options.skipUnknown) {
|
||||
return next();
|
||||
}
|
||||
handler = "default";
|
||||
}
|
||||
if (options.statusCode) {
|
||||
res.statusCode = options.statusCode;
|
||||
}
|
||||
const mime = options.mimes[handler];
|
||||
if (mime) {
|
||||
res.setHeader("Content-Type", mime);
|
||||
}
|
||||
if (options.cacheHeaders) {
|
||||
res.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
|
||||
res.setHeader("Pragma", "no-cache");
|
||||
res.setHeader("Expires", "0");
|
||||
}
|
||||
if (options.placeholderHeader) {
|
||||
res.setHeader("X-Placeholder", handler);
|
||||
}
|
||||
const placeholder = options.placeholders[handler];
|
||||
res.end(placeholder);
|
||||
};
|
||||
}
|
||||
|
||||
export { servePlaceholder };
|
||||
52
node_modules/serve-placeholder/package.json
generated
vendored
Normal file
52
node_modules/serve-placeholder/package.json
generated
vendored
Normal file
@@ -0,0 +1,52 @@
|
||||
{
|
||||
"name": "serve-placeholder",
|
||||
"version": "2.0.2",
|
||||
"description": "Smart placeholder for missing assets",
|
||||
"repository": "unjs/serve-placeholder",
|
||||
"license": "MIT",
|
||||
"sideEffects": false,
|
||||
"type": "module",
|
||||
"exports": {
|
||||
".": {
|
||||
"types": "./dist/index.d.ts",
|
||||
"import": "./dist/index.mjs",
|
||||
"require": "./dist/index.cjs"
|
||||
}
|
||||
},
|
||||
"main": "./dist/index.cjs",
|
||||
"module": "./dist/index.mjs",
|
||||
"types": "./dist/index.d.ts",
|
||||
"files": [
|
||||
"dist"
|
||||
],
|
||||
"scripts": {
|
||||
"build": "unbuild",
|
||||
"dev": "vitest dev",
|
||||
"lint": "eslint . && biome check .",
|
||||
"lint:fix": "automd && eslint . --fix && biome check --apply .",
|
||||
"prepack": "pnpm build",
|
||||
"release": "pnpm test && changelogen --release && npm publish && git push --follow-tags",
|
||||
"test": "pnpm lint && pnpm test:types && vitest run --coverage",
|
||||
"test:types": "tsc --noEmit --skipLibCheck"
|
||||
},
|
||||
"dependencies": {
|
||||
"defu": "^6.1.4"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@biomejs/biome": "^1.7.2",
|
||||
"@types/node": "^20.12.7",
|
||||
"@vitest/coverage-v8": "^1.5.3",
|
||||
"automd": "^0.3.7",
|
||||
"changelogen": "^0.5.5",
|
||||
"eslint": "^9.1.1",
|
||||
"eslint-config-unjs": "^0.3.2",
|
||||
"h3": "^1.11.1",
|
||||
"jiti": "^1.21.0",
|
||||
"listhen": "^1.7.2",
|
||||
"ofetch": "^1.3.4",
|
||||
"typescript": "^5.4.5",
|
||||
"unbuild": "^2.0.0",
|
||||
"vitest": "^1.5.3"
|
||||
},
|
||||
"packageManager": "pnpm@9.0.6"
|
||||
}
|
||||
Reference in New Issue
Block a user