Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: pm-x generator #11

Merged
merged 7 commits into from
Feb 7, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 31 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,37 @@ The `pm-install` generator generates commands for several JavaScript package man
- `dev`: Install as a dev dependency. (defaults to `false`).
- `auto`: Auto-detect package manager using [unjs/nypm](https://github.com/unjs/nypm#-nypm). (defaults to `true`).

### `pm-x`

The `pm-x` generator generates commands for running a package through JavaScript package managers.

#### Usage

<!-- AUTOMD_START generator="pm-x" name="package-name" usage="[files] <flags>" -->
<!-- AUTOMD_END -->

**Updated Result:**

<!-- AUTOMD_START generator="pm-x" name="package-name" usage="[files] <flags>" -->

```sh
# npm
npx package-name@latest [files] <flags>

# pnpm
pnpm dlx package-name@latest [files] <flags>

# bun
bunx package-name@latest [files] <flags>
```

<!-- AUTOMD_END -->

#### Arguments

- `name`: The package name (by default tries to read from the `name` field in `package.json`).
- `usage`: An additional string appended at the end of each command suggesting usage. (defaults to `""`).

## Development

- Clone this repository
Expand Down
29 changes: 22 additions & 7 deletions playground/README.md
Original file line number Diff line number Diff line change
@@ -1,29 +1,44 @@
## Usage

<!-- AUTOMD_START generator="pm-install" name="package-name" dev="true" -->
<!-- AUTOMD_START generator="pm-x" args="." -->

```sh
# npm
npx [email protected] .

# pnpm
pnpm dlx [email protected] .

# bun
bunx [email protected] .
```

<!-- AUTOMD_END -->

<!-- AUTOMD_START generator="pm-install" dev="true" -->

```sh
# ✨ Auto-detect
npx nypm i -D package-name
npx nypm i -D automd@^0.1.5

# npm
npm install -D package-name
npm install -D automd@^0.1.5

# yarn
yarn add -D package-name
yarn add -D automd@^0.1.5

# pnpm
pnpm install -D package-name
pnpm install -D automd@^0.1.5

# bun
bun install -D package-name
bun install -D automd@^0.1.5
```

<!-- AUTOMD_END -->

## Utils

<!-- AUTOMD_START generator="jsdocs" src="./src/index" -->
<!-- AUTOMD_START generator="jsdocs" -->

### `add(a, b)`

Expand Down
17 changes: 17 additions & 0 deletions src/_utils.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import { readPackageJSON } from "pkg-types";

export async function getPkg(
dir: string,
input: { name?: string; version?: string } = {},
) {
if (input.name && input.version) {
return input;
}
const pkg = await readPackageJSON(dir).catch(() => undefined);
return {
name: process.env.npm_package_name,
version: process.env.npm_package_name,
...pkg,
...input,
};
}
5 changes: 3 additions & 2 deletions src/generators/index.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import { Generator } from "../generator";
import jsdocs from "./jsdocs";
import pmInstall from "./pm-install";
import { jsdocs } from "./jsdocs";
import { pmX, pmInstall } from "./pm";

export default {
jsdocs,
"pm-install": pmInstall,
"pm-x": pmX,
} as Record<string, Generator>;
2 changes: 1 addition & 1 deletion src/generators/jsdocs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import type { Schema } from "untyped";
import { titleCase } from "scule";
import { defineGenerator } from "../generator";

export default defineGenerator({
export const jsdocs = defineGenerator({
name: "jsdocs",
async generate({ options, args }) {
const entryPath = resolve(options.dir, args.src || "./src/index");
Expand Down
47 changes: 0 additions & 47 deletions src/generators/pm-install.ts

This file was deleted.

67 changes: 67 additions & 0 deletions src/generators/pm.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
import { codeBlock } from "omark";
import { defineGenerator } from "../generator";
import { getPkg } from "../_utils";

const INSTALL_COMMANDS = [
["npm", "install"],
["yarn", "add"],
["pnpm", "install"],
["bun", "install"],
];

const RUN_COMMANDS = [
["npm", "npx"],
["pnpm", "pnpm dlx"],
["bun", "bunx"],
];

export const pmInstall = defineGenerator({
name: "pm-install",
async generate({ options, args }) {
const { name, version } = await getPkg(options.dir, args);

if (!name) {
return {
contents: "<!-- package name is unspecified -->",
};
}

// TODO: support noAuto/no-auto
if (args.auto ?? true) {
INSTALL_COMMANDS.unshift(["npx nypm", "i"]);
}

return {
contents: codeBlock(
INSTALL_COMMANDS.map(
([cmd, install]) =>
`# ${cmd.includes("nypm") ? "✨ Auto-detect" : cmd}\n${cmd} ${install}${args.dev ? " -D" : ""} ${name}${version ? `@^${version}` : ""}`,
).join("\n\n"),
"sh",
),
};
},
});

export const pmX = defineGenerator({
name: "pm-x",
async generate({ options, args }) {
const { name, version } = await getPkg(options.dir, args);

if (!name) {
return {
contents: "<!-- package name is unspecified -->",
};
}

return {
contents: codeBlock(
RUN_COMMANDS.map(
([pm, cmd]) =>
`# ${pm}\n${cmd} ${name}@${version ? `${version}` : ""}${args.args ? ` ${args.args}` : ""}`,
).join("\n\n"),
"sh",
),
};
},
});
Loading