-
Notifications
You must be signed in to change notification settings - Fork 2.2k
Expand file tree
/
Copy pathupdate-examples.mjs
More file actions
95 lines (90 loc) · 2.97 KB
/
Copy pathupdate-examples.mjs
File metadata and controls
95 lines (90 loc) · 2.97 KB
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
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
*/
// @ts-check
import {sync as globSync} from 'glob';
import minimist from 'minimist';
import * as fs from 'node:fs';
import * as path from 'node:path';
import {gt as semverGt} from 'semver';
import {spawn} from './shared/childProcess.mjs';
import {PackageMetadata} from './shared/PackageMetadata.mjs';
async function main() {
const argv = minimist(process.argv.slice(2));
const {version} = new PackageMetadata('package.json').packageJson;
/** @type {string[]} */
const paths =
argv._.length > 0
? argv._
: ['examples/*', 'scripts/__tests__/integration/fixtures/*'];
for (const fn of paths.flatMap(dir =>
globSync(path.join(dir, 'package.json'), {windowsPathsNoEscape: true}),
)) {
const pkg = new PackageMetadata(fn);
console.log(`\nUpdating example ${path.dirname(fn)}\n`);
// assume that pnpm run update-packages has already updated the version and lexical deps
const json = pkg.packageJson;
const {lexicalUnreleasedDependencies = {}} = json;
let hasUnreleasedDependency = false;
for (const [k, v] of Object.entries(lexicalUnreleasedDependencies)) {
if (semverGt(version, v)) {
delete lexicalUnreleasedDependencies[k];
json.dependencies[k] = version;
} else {
hasUnreleasedDependency = true;
}
}
pkg
.sortDependencies('dependencies')
.sortDependencies(
'lexicalUnreleasedDependencies',
lexicalUnreleasedDependencies,
)
.writeSync();
/**
* @param {...string} args arguments to pass to the pnpm command
* @returns {Promise<void>}
*/
const pnpm = async (...args) => {
console.log(['>', 'pnpm', ...args].join(' '));
try {
await spawn('pnpm', args, {
cwd: pkg.resolve(),
env: {...process.env, PNPM_SCRIPT_SRC_DIR: pkg.resolve()},
stdio: 'inherit',
});
} catch (err) {
console.error(`\nFailed to update example ${path.dirname(fn)}`);
// `spawn` rejects with an Error that carries an optional numeric `code`
const error = /** @type {{code?: unknown}} */ (err);
process.exit(
'code' in error && typeof error.code === 'number' ? error.code : 1,
);
}
};
await pnpm('--ignore-workspace', '--no-frozen-lockfile', 'i');
if (hasUnreleasedDependency) {
console.log(
'Unreleased lexical dependencies required, removing local versions',
);
for (const dir of [
pkg.resolve('node_modules', '{lexical,@lexical}'),
].flatMap(v => globSync(v))) {
console.log(`> rm -rf ${dir}`);
fs.rmSync(dir, {force: true, recursive: true});
}
}
await pnpm(
'run',
'build',
...(hasUnreleasedDependency
? ['--', '-c', 'vite.config.monorepo.ts']
: []),
);
}
}
main();