-
Notifications
You must be signed in to change notification settings - Fork 99
/
Copy pathpublish.js
executable file
·78 lines (76 loc) · 2.19 KB
/
publish.js
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
#!/usr/bin/env node
const execa = require('execa');
const pSeries = require('p-series');
const fs = require('fs');
execa('lerna', ['ls', '-pl', '--json', '--toposort'])
.then(({ stdout }) => {
const packages = JSON.parse(stdout);
return Promise.all(
packages.map((pkg) => {
const parseFullPkg = JSON.parse(
fs.readFileSync(`${pkg.location}/package.json`, {
encoding: 'utf-8',
}),
);
return execa('npm', ['info', `${pkg.name}@${pkg.version}`])
.then((output) =>
Object.assign(pkg, {
publish: output.stdout.length > 0,
ignoreDependencies: parseFullPkg.ignoreDependencies,
}),
)
.catch((err) => {
if (!err.stderr.includes('404')) {
console.error(err);
process.exit(1);
}
return Object.assign(pkg, {
publish: false,
ignoreDependencies: parseFullPkg.ignoreDependencies,
});
});
}),
);
})
.then((packages) =>
pSeries(
packages
.map((pkg) => {
if (!pkg.publish) {
return () => {
console.log(`Publishing package ${pkg.name}`);
return pSeries([
() =>
execa('lerna', [
'exec',
'--scope',
pkg.name,
pkg.ignoreDependencies ? '' : '--include-dependencies',
'--',
'npm',
'run',
'prepare',
'--if-present',
]),
() =>
execa('lerna', [
'exec',
'--scope',
pkg.name,
'--',
'yarn',
'publish',
'--access=public',
'--non-interactive',
]),
]);
};
}
console.log(
`Package ${pkg.name} has been skipped (already published)`,
);
return null;
})
.filter((p) => p !== null),
),
);