-
-
Notifications
You must be signed in to change notification settings - Fork 80
/
Copy pathblockPackageJson.ts
104 lines (101 loc) · 2.56 KB
/
blockPackageJson.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
import * as htmlToText from "html-to-text";
import removeUndefinedObjects from "remove-undefined-objects";
import sortPackageJson from "sort-package-json";
import { z } from "zod";
import { PackageJson } from "zod-package-json";
import { base } from "../base.js";
import { CommandPhase } from "./phases.js";
export const blockPackageJson = base.createBlock({
about: {
name: "Package JSON",
},
addons: {
cleanupCommands: z.array(z.string()).default([]),
properties: PackageJson.partial().default({}),
},
produce({ addons, offline, options }) {
const dependencies = {
...options.packageData?.dependencies,
...addons.properties.dependencies,
};
const devDependencies = {
...options.packageData?.devDependencies,
...addons.properties.devDependencies,
};
const description = htmlToText.convert(options.description, {
wordwrap: false,
});
return {
files: {
"package.json": sortPackageJson(
JSON.stringify(
removeUndefinedObjects({
...addons.properties,
author: { email: options.email.npm, name: options.author },
bin: options.bin,
dependencies: Object.keys(dependencies).length
? dependencies
: undefined,
description,
devDependencies: Object.keys(devDependencies).length
? devDependencies
: undefined,
...(options.node && {
engines: {
node: `>=${options.node.minimum}`,
},
}),
...(options.pnpm && {
packageManager: `pnpm@${options.pnpm}`,
}),
files: [
options.bin?.replace(/^\.\//, ""),
...(addons.properties.files ?? []),
"package.json",
"README.md",
]
.filter(Boolean)
.sort(),
keywords: options.keywords?.flatMap((keyword) =>
keyword.split(/ /),
),
license: "MIT",
main: "lib/index.js",
name: options.repository,
repository: {
type: "git",
url: `git+https://github.com/${options.owner}/${options.repository}.git`,
},
scripts: {
...options.packageData?.scripts,
...addons.properties.scripts,
},
type: "module",
version: options.version ?? "0.0.0",
}),
),
),
},
scripts: [
{
commands: [
offline ? "pnpm install --offline" : "pnpm install",
...addons.cleanupCommands,
],
phase: CommandPhase.Install,
},
],
};
},
transition() {
return {
scripts: [
{
commands: ["rm package-lock.json yarn.lock"],
phase: CommandPhase.Migrations,
silent: true,
},
],
};
},
});