forked from wevm/references
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcjs.ts
125 lines (101 loc) · 3.55 KB
/
cjs.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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
import type { Package } from '@manypkg/get-packages'
import { getPackagesSync } from '@manypkg/get-packages'
import { execa } from 'execa'
import { readJsonSync, writeJsonSync } from 'fs-extra'
import path from 'path'
type PackageJson = Package['packageJson']
type PreparedPackage = Package & {
oldPackageJson: PackageJson
}
const packagesDir = [path.join(__dirname, '..', 'packages')]
/** @deprecated Script to generate & release a CJS escape hatch bundle. */
export async function main() {
const { packages } = getPackagesSync(path.join(__dirname, '..'))
// 1. Prepare package package.jsons into CJS format.
const preparedPackages = prepare({ packages })
// 2. Bundle into CJS.
await build()
// 3. Retrieve the changed packages from the output of
// the changesets GH Action (if used). Otherwise, just
// use prepared packages.
const changedPackageJsons: PackageJson[] = process.argv[2]
? JSON.parse(process.argv[2])
: preparedPackages.map(({ packageJson }) => packageJson)
const changedPackages: Package[] = preparedPackages.filter(
({ packageJson }) =>
changedPackageJsons.some(({ name }) => name === packageJson.name),
)
// 4. Version packages w/ "-cjs" suffix.
version({ changedPackages })
// 5. Publish packages under "cjs" tag.
await publish({ changedPackages })
// 6. Revert package.jsons to original state.
postPublish({ preparedPackages })
}
main()
//////////////////////////////////////////////////////////////////////////
// Prepare
function prepare({ packages }: { packages: Package[] }) {
const packageDirs = packages
.filter(({ dir }) => packagesDir.some((i) => dir.startsWith(i)))
.map(({ dir }) => dir)
const preparedPackages: PreparedPackage[] = []
for (const packageDir of packageDirs) {
const packageJsonPath = path.join(packageDir, 'package.json')
const packageJson = readJsonSync(packageJsonPath)
const oldPackageJson = { ...packageJson }
delete packageJson.type
delete packageJson.module
delete packageJson.exports
writeJsonSync(packageJsonPath, packageJson, { spaces: 2 })
preparedPackages.push({ dir: packageDir, oldPackageJson, packageJson })
}
return preparedPackages
}
//////////////////////////////////////////////////////////////////////////
// Build
async function build() {
await execa('pnpm', ['build'], {
env: {
FORMAT: 'cjs',
NODE_ENV: 'production',
},
cwd: path.join(__dirname, '..'),
stdout: process.stdout,
})
}
//////////////////////////////////////////////////////////////////////////
// Version
function version({ changedPackages }: { changedPackages: Package[] }) {
for (const { dir, packageJson } of changedPackages) {
const newPackageJson = { ...packageJson }
newPackageJson.version = `${packageJson.version}-cjs`
writeJsonSync(path.join(dir, 'package.json'), newPackageJson, {
spaces: 2,
})
}
}
//////////////////////////////////////////////////////////////////////////
// Publish
async function publish({ changedPackages }: { changedPackages: Package[] }) {
for (const { dir } of changedPackages) {
await execa('pnpm', ['publish', '--tag', 'cjs', '--no-git-checks'], {
cwd: dir,
stdout: process.stdout,
})
}
}
//////////////////////////////////////////////////////////////////////////
// Post-publish
function postPublish({
preparedPackages,
}: {
preparedPackages: PreparedPackage[]
}) {
// Restore package.jsons
for (const { oldPackageJson, dir } of preparedPackages) {
writeJsonSync(path.join(dir, 'package.json'), oldPackageJson, {
spaces: 2,
})
}
}