full site update

This commit is contained in:
2025-07-24 18:46:24 +02:00
parent bfe2b90d8d
commit 37a6e0ab31
6912 changed files with 540482 additions and 361712 deletions

21
node_modules/package-manager-detector/LICENSE generated vendored Normal file
View File

@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2020-PRESENT Anthony Fu <https://github.com/antfu>
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.

108
node_modules/package-manager-detector/README.md generated vendored Normal file
View File

@@ -0,0 +1,108 @@
# package-manager-detector
[![npm version][npm-version-src]][npm-version-href]
[![npm downloads][npm-downloads-src]][npm-downloads-href]
[![JSDocs][jsdocs-src]][jsdocs-href]
[![License][license-src]][license-href]
Package manager detector is based on lock files, the `package.json` `packageManager` field, and installation metadata to detect the package manager used in a project.
It supports `npm`, `yarn`, `pnpm`, `deno`, and `bun`.
## Install
```sh
# pnpm
pnpm add package-manager-detector
# npm
npm i package-manager-detector
# yarn
yarn add package-manager-detector
```
## Usage
To check the file system for which package manager is used:
```js
import { detect } from 'package-manager-detector/detect'
```
or to get the currently running package manager:
```js
import { getUserAgent } from 'package-manager-detector/detect'
```
## Customize Detection Strategy
By default, the `detect` API searches through the current directory for lock files, and if none exists, it looks for the `packageManager` field in `package.json`. If that also doesn't exist, it will check the `devEngines.packageManager` field in `package.json`. If all strategies couldn't detect the package manager, it'll crawl upwards to the parent directory and repeat the detection process until it reaches the root directory.
The strategies can be configured through `detect`'s `strategies` option with the following accepted strategies:
- `'lockfile'`: Look up for lock files.
- `'packageManager-field'`: Look up for the `packageManager` field in package.json.
- `'devEngines-field'`: Look up for the `devEngines.packageManager` field in package.json.
- `'install-metadata'`: Look up for installation metadata added by package managers.
The order of the strategies can also be changed to prioritize one strategy over another. For example, if you prefer to detect the package manager used for installation:
```js
import { detect } from 'package-manager-detector/detect'
const pm = await detect({
strategies: ['install-metadata', 'lockfile', 'packageManager-field', 'devEngines-field']
})
```
## Agents and Commands
This package includes package manager agents and their corresponding commands for:
- `'agent'` - run the package manager with no arguments
- `'install'` - install dependencies
- `'frozen'` - install dependencies using frozen lockfile
- `'add'` - add dependencies
- `'uninstall'` - remove dependencies
- `'global'` - install global packages
- `'global_uninstall'` - remove global packages
- `'upgrade'` - upgrade dependencies
- `'upgrade-interactive'` - upgrade dependencies interactively: not available for `npm` and `bun`
- `'execute'` - download & execute binary scripts
- `'execute-local'` - execute binary scripts (from package locally installed)
- `'run'` - run `package.json` scripts
### Using Agents and Commands
A `resolveCommand` function is provided to resolve the command for a specific agent.
```ts
import { resolveCommand } from 'package-manager-detector/commands'
import { detect } from 'package-manager-detector/detect'
const pm = await detect()
if (!pm)
throw new Error('Could not detect package manager')
const { command, args } = resolveCommand(pm.agent, 'add', ['@antfu/ni']) // { command: 'pnpm', args: ['add', '@antfu/ni'] }
console.log(`Detected the ${pm.agent} package manager. You can run a install with ${command} ${args.join(' ')}`)
```
You can check the source code or the [JSDocs](https://www.jsdocs.io/package/package-manager-detector) for more information.
## License
[MIT](./LICENSE) License © 2020-PRESENT [Anthony Fu](https://github.com/antfu)
<!-- Badges -->
[npm-version-src]: https://img.shields.io/npm/v/package-manager-detector?style=flat&colorA=18181B&colorB=F0DB4F
[npm-version-href]: https://npmjs.com/package/package-manager-detector
[npm-downloads-src]: https://img.shields.io/npm/dm/package-manager-detector?style=flat&colorA=18181B&colorB=F0DB4F
[npm-downloads-href]: https://npmjs.com/package/package-manager-detector
[jsdocs-src]: https://img.shields.io/badge/jsdocs-reference-080f12?style=flat&colorA=18181B&colorB=F0DB4F
[jsdocs-href]: https://www.jsdocs.io/package/package-manager-detector
[license-src]: https://img.shields.io/github/license/antfu-collective/package-manager-detector.svg?style=flat&colorA=18181B&colorB=F0DB4F
[license-href]: https://github.com/antfu-collective/package-manager-detector/blob/main/LICENSE

View File

@@ -0,0 +1,36 @@
import { c as AgentCommands, b as AgentCommandValue, R as ResolvedCommand, A as Agent, C as Command } from './shared/package-manager-detector.pUYRhiOu.mjs';
declare const COMMANDS: {
npm: AgentCommands;
yarn: AgentCommands;
'yarn@berry': AgentCommands;
pnpm: AgentCommands;
'pnpm@6': AgentCommands;
bun: AgentCommands;
deno: AgentCommands;
};
/**
* Resolve the command for the agent merging the command arguments with the provided arguments.
*
* For example, to show how to install `@antfu/ni` globally using `pnpm`:
* ```js
* import { resolveCommand } from 'package-manager-detector/commands'
* const { command, args } = resolveCommand('pnpm', 'global', ['@antfu/ni'])
* console.log(`${command} ${args.join(' ')}`) // 'pnpm add -g @antfu/ni'
* ```
*
* @param agent The agent to use.
* @param command the command to resolve.
* @param args The arguments to pass to the command.
* @returns {ResolvedCommand} The resolved command or `null` if the agent command is not found.
*/
declare function resolveCommand(agent: Agent, command: Command, args: string[]): ResolvedCommand | null;
/**
* Construct the command from the agent command merging the command arguments with the provided arguments.
* @param value {AgentCommandValue} The agent command to use.
* @param args The arguments to pass to the command.
* @returns {ResolvedCommand} The resolved command or `null` if the command is `null`.
*/
declare function constructCommand(value: AgentCommandValue, args: string[]): ResolvedCommand | null;
export { COMMANDS, constructCommand, resolveCommand };

127
node_modules/package-manager-detector/dist/commands.mjs generated vendored Normal file
View File

@@ -0,0 +1,127 @@
function dashDashArg(agent, agentCommand) {
return (args) => {
if (args.length > 1) {
return [agent, agentCommand, args[0], "--", ...args.slice(1)];
} else {
return [agent, agentCommand, args[0]];
}
};
}
function denoExecute() {
return (args) => {
return ["deno", "run", `npm:${args[0]}`, ...args.slice(1)];
};
}
const npm = {
"agent": ["npm", 0],
"run": dashDashArg("npm", "run"),
"install": ["npm", "i", 0],
"frozen": ["npm", "ci", 0],
"global": ["npm", "i", "-g", 0],
"add": ["npm", "i", 0],
"upgrade": ["npm", "update", 0],
"upgrade-interactive": null,
"execute": ["npx", 0],
"execute-local": ["npx", 0],
"uninstall": ["npm", "uninstall", 0],
"global_uninstall": ["npm", "uninstall", "-g", 0]
};
const yarn = {
"agent": ["yarn", 0],
"run": ["yarn", "run", 0],
"install": ["yarn", "install", 0],
"frozen": ["yarn", "install", "--frozen-lockfile", 0],
"global": ["yarn", "global", "add", 0],
"add": ["yarn", "add", 0],
"upgrade": ["yarn", "upgrade", 0],
"upgrade-interactive": ["yarn", "upgrade-interactive", 0],
"execute": ["npx", 0],
"execute-local": dashDashArg("yarn", "exec"),
"uninstall": ["yarn", "remove", 0],
"global_uninstall": ["yarn", "global", "remove", 0]
};
const yarnBerry = {
...yarn,
"frozen": ["yarn", "install", "--immutable", 0],
"upgrade": ["yarn", "up", 0],
"upgrade-interactive": ["yarn", "up", "-i", 0],
"execute": ["yarn", "dlx", 0],
"execute-local": ["yarn", "exec", 0],
// Yarn 2+ removed 'global', see https://github.com/yarnpkg/berry/issues/821
"global": ["npm", "i", "-g", 0],
"global_uninstall": ["npm", "uninstall", "-g", 0]
};
const pnpm = {
"agent": ["pnpm", 0],
"run": ["pnpm", "run", 0],
"install": ["pnpm", "i", 0],
"frozen": ["pnpm", "i", "--frozen-lockfile", 0],
"global": ["pnpm", "add", "-g", 0],
"add": ["pnpm", "add", 0],
"upgrade": ["pnpm", "update", 0],
"upgrade-interactive": ["pnpm", "update", "-i", 0],
"execute": ["pnpm", "dlx", 0],
"execute-local": ["pnpm", "exec", 0],
"uninstall": ["pnpm", "remove", 0],
"global_uninstall": ["pnpm", "remove", "--global", 0]
};
const bun = {
"agent": ["bun", 0],
"run": ["bun", "run", 0],
"install": ["bun", "install", 0],
"frozen": ["bun", "install", "--frozen-lockfile", 0],
"global": ["bun", "add", "-g", 0],
"add": ["bun", "add", 0],
"upgrade": ["bun", "update", 0],
"upgrade-interactive": ["bun", "update", 0],
"execute": ["bun", "x", 0],
"execute-local": ["bun", "x", 0],
"uninstall": ["bun", "remove", 0],
"global_uninstall": ["bun", "remove", "-g", 0]
};
const deno = {
"agent": ["deno", 0],
"run": ["deno", "task", 0],
"install": ["deno", "install", 0],
"frozen": ["deno", "install", "--frozen", 0],
"global": ["deno", "install", "-g", 0],
"add": ["deno", "add", 0],
"upgrade": ["deno", "outdated", "--update", 0],
"upgrade-interactive": ["deno", "outdated", "--update", 0],
"execute": denoExecute(),
"execute-local": ["deno", "task", "--eval", 0],
"uninstall": ["deno", "remove", 0],
"global_uninstall": ["deno", "uninstall", "-g", 0]
};
const COMMANDS = {
"npm": npm,
"yarn": yarn,
"yarn@berry": yarnBerry,
"pnpm": pnpm,
// pnpm v6.x or below
"pnpm@6": {
...pnpm,
run: dashDashArg("pnpm", "run")
},
"bun": bun,
"deno": deno
};
function resolveCommand(agent, command, args) {
const value = COMMANDS[agent][command];
return constructCommand(value, args);
}
function constructCommand(value, args) {
if (value == null)
return null;
const list = typeof value === "function" ? value(args) : value.flatMap((v) => {
if (typeof v === "number")
return args;
return [v];
});
return {
command: list[0],
args: list.slice(1)
};
}
export { COMMANDS, constructCommand, resolveCommand };

View File

@@ -0,0 +1,8 @@
import { A as Agent, a as AgentName } from './shared/package-manager-detector.pUYRhiOu.mjs';
declare const AGENTS: Agent[];
declare const LOCKS: Record<string, AgentName>;
declare const INSTALL_METADATA: Record<string, AgentName>;
declare const INSTALL_PAGE: Record<Agent, string>;
export { AGENTS, INSTALL_METADATA, INSTALL_PAGE, LOCKS };

View File

@@ -0,0 +1,45 @@
const AGENTS = [
"npm",
"yarn",
"yarn@berry",
"pnpm",
"pnpm@6",
"bun",
"deno"
];
const LOCKS = {
"bun.lock": "bun",
"bun.lockb": "bun",
"deno.lock": "deno",
"pnpm-lock.yaml": "pnpm",
"pnpm-workspace.yaml": "pnpm",
"yarn.lock": "yarn",
"package-lock.json": "npm",
"npm-shrinkwrap.json": "npm"
};
const INSTALL_METADATA = {
"node_modules/.deno/": "deno",
"node_modules/.pnpm/": "pnpm",
"node_modules/.yarn-state.yml": "yarn",
// yarn v2+ (node-modules)
"node_modules/.yarn_integrity": "yarn",
// yarn v1
"node_modules/.package-lock.json": "npm",
".pnp.cjs": "yarn",
// yarn v3+ (pnp)
".pnp.js": "yarn",
// yarn v2 (pnp)
"bun.lock": "bun",
"bun.lockb": "bun"
};
const INSTALL_PAGE = {
"bun": "https://bun.sh",
"deno": "https://deno.com",
"pnpm": "https://pnpm.io/installation",
"pnpm@6": "https://pnpm.io/6.x/installation",
"yarn": "https://classic.yarnpkg.com/en/docs/install",
"yarn@berry": "https://yarnpkg.com/getting-started/install",
"npm": "https://docs.npmjs.com/cli/configuring-npm/install"
};
export { AGENTS, INSTALL_METADATA, INSTALL_PAGE, LOCKS };

View File

@@ -0,0 +1,16 @@
import { d as DetectOptions, e as DetectResult, a as AgentName } from './shared/package-manager-detector.pUYRhiOu.mjs';
/**
* Detects the package manager used in the running process.
*
* This method will check for `process.env.npm_config_user_agent`.
*/
declare function getUserAgent(): AgentName | null;
/**
* Detects the package manager used in the project.
* @param options {DetectOptions} The options to use when detecting the package manager.
* @returns {Promise<DetectResult | null>} The detected package manager or `null` if not found.
*/
declare function detect(options?: DetectOptions): Promise<DetectResult | null>;
export { detect, getUserAgent };

132
node_modules/package-manager-detector/dist/detect.mjs generated vendored Normal file
View File

@@ -0,0 +1,132 @@
import fs from 'node:fs/promises';
import path from 'node:path';
import process from 'node:process';
import { INSTALL_METADATA, LOCKS, AGENTS } from './constants.mjs';
async function pathExists(path2, type) {
try {
const stat = await fs.stat(path2);
return type === "file" ? stat.isFile() : stat.isDirectory();
} catch {
return false;
}
}
function getUserAgent() {
const userAgent = process.env.npm_config_user_agent;
if (!userAgent) {
return null;
}
const name = userAgent.split("/")[0];
return AGENTS.includes(name) ? name : null;
}
function* lookup(cwd = process.cwd()) {
let directory = path.resolve(cwd);
const { root } = path.parse(directory);
while (directory && directory !== root) {
yield directory;
directory = path.dirname(directory);
}
}
async function parsePackageJson(filepath, onUnknown) {
return !filepath || !pathExists(filepath, "file") ? null : await handlePackageManager(filepath, onUnknown);
}
async function detect(options = {}) {
const {
cwd,
strategies = ["lockfile", "packageManager-field", "devEngines-field"],
onUnknown
} = options;
let stopDir;
if (typeof options.stopDir === "string") {
const resolved = path.resolve(options.stopDir);
stopDir = (dir) => dir === resolved;
} else {
stopDir = options.stopDir;
}
for (const directory of lookup(cwd)) {
for (const strategy of strategies) {
switch (strategy) {
case "lockfile": {
for (const lock of Object.keys(LOCKS)) {
if (await pathExists(path.join(directory, lock), "file")) {
const name = LOCKS[lock];
const result = await parsePackageJson(path.join(directory, "package.json"), onUnknown);
if (result)
return result;
else
return { name, agent: name };
}
}
break;
}
case "packageManager-field":
case "devEngines-field": {
const result = await parsePackageJson(path.join(directory, "package.json"), onUnknown);
if (result)
return result;
break;
}
case "install-metadata": {
for (const metadata of Object.keys(INSTALL_METADATA)) {
const fileOrDir = metadata.endsWith("/") ? "dir" : "file";
if (await pathExists(path.join(directory, metadata), fileOrDir)) {
const name = INSTALL_METADATA[metadata];
const agent = name === "yarn" ? isMetadataYarnClassic(metadata) ? "yarn" : "yarn@berry" : name;
return { name, agent };
}
}
break;
}
}
}
if (stopDir?.(directory))
break;
}
return null;
}
function getNameAndVer(pkg) {
const handelVer = (version) => version?.match(/\d+(\.\d+){0,2}/)?.[0] ?? version;
if (typeof pkg.packageManager === "string") {
const [name, ver] = pkg.packageManager.replace(/^\^/, "").split("@");
return { name, ver: handelVer(ver) };
}
if (typeof pkg.devEngines?.packageManager?.name === "string") {
return {
name: pkg.devEngines.packageManager.name,
ver: handelVer(pkg.devEngines.packageManager.version)
};
}
return void 0;
}
async function handlePackageManager(filepath, onUnknown) {
try {
const pkg = JSON.parse(await fs.readFile(filepath, "utf8"));
let agent;
const nameAndVer = getNameAndVer(pkg);
if (nameAndVer) {
const name = nameAndVer.name;
const ver = nameAndVer.ver;
let version = ver;
if (name === "yarn" && ver && Number.parseInt(ver) > 1) {
agent = "yarn@berry";
version = "berry";
return { name, agent, version };
} else if (name === "pnpm" && ver && Number.parseInt(ver) < 7) {
agent = "pnpm@6";
return { name, agent, version };
} else if (AGENTS.includes(name)) {
agent = name;
return { name, agent, version };
} else {
return onUnknown?.(pkg.packageManager) ?? null;
}
}
} catch {
}
return null;
}
function isMetadataYarnClassic(metadataPath) {
return metadataPath.endsWith(".yarn_integrity");
}
export { detect, getUserAgent };

View File

@@ -0,0 +1,4 @@
export { COMMANDS, constructCommand, resolveCommand } from './commands.mjs';
export { AGENTS, INSTALL_METADATA, INSTALL_PAGE, LOCKS } from './constants.mjs';
export { detect, getUserAgent } from './detect.mjs';
export { A as Agent, b as AgentCommandValue, c as AgentCommands, a as AgentName, C as Command, d as DetectOptions, e as DetectResult, D as DetectStrategy, R as ResolvedCommand } from './shared/package-manager-detector.pUYRhiOu.mjs';

6
node_modules/package-manager-detector/dist/index.mjs generated vendored Normal file
View File

@@ -0,0 +1,6 @@
export { COMMANDS, constructCommand, resolveCommand } from './commands.mjs';
export { AGENTS, INSTALL_METADATA, INSTALL_PAGE, LOCKS } from './constants.mjs';
export { detect, getUserAgent } from './detect.mjs';
import 'node:fs/promises';
import 'node:path';
import 'node:process';

View File

@@ -0,0 +1,79 @@
type Agent = 'npm' | 'yarn' | 'yarn@berry' | 'pnpm' | 'pnpm@6' | 'bun' | 'deno';
type AgentName = 'npm' | 'yarn' | 'pnpm' | 'bun' | 'deno';
type AgentCommandValue = (string | number)[] | ((args: string[]) => string[]) | null;
interface AgentCommands {
'agent': AgentCommandValue;
'run': AgentCommandValue;
'install': AgentCommandValue;
'frozen': AgentCommandValue;
'global': AgentCommandValue;
'add': AgentCommandValue;
'upgrade': AgentCommandValue;
'upgrade-interactive': AgentCommandValue;
'execute': AgentCommandValue;
'execute-local': AgentCommandValue;
'uninstall': AgentCommandValue;
'global_uninstall': AgentCommandValue;
}
type Command = keyof AgentCommands;
interface ResolvedCommand {
/**
* CLI command.
*/
command: string;
/**
* Arguments for the CLI command, merged with user arguments.
*/
args: string[];
}
type DetectStrategy = 'lockfile' | 'packageManager-field' | 'devEngines-field' | 'install-metadata';
interface DetectOptions {
/**
* Current working directory to start looking up for package manager.
* @default `process.cwd()`
*/
cwd?: string;
/**
* The strategies to use for detecting the package manager. The strategies
* are executed in the order it's specified for every directory that it iterates
* upwards from the `cwd`.
*
* - `'lockfile'`: Look up for lock files.
* - `'packageManager-field'`: Look up for the `packageManager` field in package.json.
* - `'devEngines-field'`: Look up for the `devEngines.packageManager` field in package.json.
* - `'install-metadata'`: Look up for installation metadata added by package managers.
*
* @default ['lockfile', 'packageManager-field', 'devEngines-field']
*/
strategies?: DetectStrategy[];
/**
* Callback when unknown package manager from package.json.
* @param packageManager - The `packageManager` value from package.json file.
*/
onUnknown?: (packageManager: string) => DetectResult | null | undefined;
/**
* The path to stop traversing up the directory.
*/
stopDir?: string | ((currentDir: string) => boolean);
}
interface DetectResult {
/**
* Agent name without the specifier.
*
* Can be `npm`, `yarn`, `pnpm`, `bun`, or `deno`.
*/
name: AgentName;
/**
* Agent specifier to resolve the command.
*
* May contain '@' to differentiate the version (e.g. 'yarn@berry').
* Use `name` for the agent name without the specifier.
*/
agent: Agent;
/**
* Specific version of the agent, read from `packageManager` field in package.json.
*/
version?: string;
}
export type { Agent as A, Command as C, DetectStrategy as D, ResolvedCommand as R, AgentName as a, AgentCommandValue as b, AgentCommands as c, DetectOptions as d, DetectResult as e };

62
node_modules/package-manager-detector/package.json generated vendored Normal file
View File

@@ -0,0 +1,62 @@
{
"name": "package-manager-detector",
"type": "module",
"version": "1.3.0",
"description": "Package manager detector",
"author": "Anthony Fu <anthonyfu117@hotmail.com>",
"license": "MIT",
"homepage": "https://github.com/antfu-collective/package-manager-detector#readme",
"repository": {
"type": "git",
"url": "git+https://github.com/antfu-collective/package-manager-detector.git"
},
"bugs": {
"url": "https://github.com/antfu-collective/package-manager-detector/issues"
},
"sideEffects": false,
"exports": {
".": "./dist/index.mjs",
"./commands": "./dist/commands.mjs",
"./detect": "./dist/detect.mjs",
"./constants": "./dist/constants.mjs"
},
"main": "./dist/index.mjs",
"module": "./dist/index.mjs",
"types": "./dist/index.d.mts",
"typesVersions": {
"*": {
"commands": [
"./dist/commands.d.mts"
],
"detect": [
"./dist/detect.d.mts"
],
"constants": [
"./dist/constants.d.mts"
]
}
},
"files": [
"dist"
],
"devDependencies": {
"@antfu/eslint-config": "^4.12.0",
"@types/fs-extra": "^11.0.4",
"@types/node": "^22.15.3",
"bumpp": "^10.1.0",
"eslint": "^9.26.0",
"fs-extra": "^11.3.0",
"typescript": "^5.8.3",
"unbuild": "^3.5.0",
"vitest": "^3.1.2",
"vitest-package-exports": "^0.1.1"
},
"scripts": {
"build": "unbuild",
"stub": "unbuild --stub",
"release": "bumpp",
"lint": "eslint",
"lint:fix": "eslint --fix",
"test": "vitest"
}
}