summaryrefslogtreecommitdiff
path: root/scripts/deps/update-example-versions.js
diff options
context:
space:
mode:
authorGravatar Bjorn Lu <bjornlu.dev@gmail.com> 2023-06-12 20:48:04 +0800
committerGravatar GitHub <noreply@github.com> 2023-06-12 20:48:04 +0800
commit718cebd52667d15719763d66b37c9ac4890fcb74 (patch)
tree7c52de3b4e0efdcb8b6b0227f9fed797cf660d01 /scripts/deps/update-example-versions.js
parent0325bf7e0feae3531f38d3659b9175750d0f228e (diff)
downloadastro-718cebd52667d15719763d66b37c9ac4890fcb74.tar.gz
astro-718cebd52667d15719763d66b37c9ac4890fcb74.tar.zst
astro-718cebd52667d15719763d66b37c9ac4890fcb74.zip
Update example dependencies versions with a script (#7367)
Diffstat (limited to 'scripts/deps/update-example-versions.js')
-rw-r--r--scripts/deps/update-example-versions.js74
1 files changed, 74 insertions, 0 deletions
diff --git a/scripts/deps/update-example-versions.js b/scripts/deps/update-example-versions.js
new file mode 100644
index 000000000..13018a791
--- /dev/null
+++ b/scripts/deps/update-example-versions.js
@@ -0,0 +1,74 @@
+import path from 'node:path';
+import fs from 'node:fs/promises';
+import { globby as glob } from 'globby';
+
+/*
+ This file updates the dependencies' versions in `examples/*` to match the workspace packages' versions.
+ This should be run after `changeset version` so the release PR updates all the versions together.
+*/
+
+const rootUrl = new URL('../..', import.meta.url);
+const rootPackageJson = JSON.parse(await fs.readFile(new URL('./package.json', rootUrl), 'utf-8'));
+
+// get all workspace package name to versions
+/** @type {Map<string, string>} */
+const packageToVersions = new Map();
+
+// Changeset detects workspace packages to publish via `workspaces` in package.json.
+// Although this conflicts with the `pnpm-workspace.yaml` config, it's easier to configure what gets
+// published through this field, so this file also respects this field when updating the versions.
+const workspaceDirs = await glob(rootPackageJson.workspaces, {
+ onlyDirectories: true,
+ cwd: rootUrl,
+});
+for (const workspaceDir of workspaceDirs) {
+ const packageJsonPath = path.join(workspaceDir, './package.json');
+ const packageJson = await readAndParsePackageJson(packageJsonPath);
+ if (!packageJson) continue;
+
+ if (!packageJson.name) {
+ throw new Error(`${packageJsonPath} does not contain a "name" field.`);
+ }
+ if (!packageJson.version) {
+ throw new Error(`${packageJsonPath} does not contain a "version" field.`);
+ }
+
+ packageToVersions.set(packageJson.name, packageJson.version);
+}
+
+// Update all examples' package.json
+const exampleDirs = await glob('examples/*', {
+ onlyDirectories: true,
+ cwd: rootUrl,
+});
+for (const exampleDir of exampleDirs) {
+ const packageJsonPath = path.join(exampleDir, './package.json');
+ const packageJson = await readAndParsePackageJson(packageJsonPath);
+ if (!packageJson) continue;
+
+ // Update dependencies
+ for (const depName of Object.keys(packageJson.dependencies ?? [])) {
+ if (packageToVersions.has(depName)) {
+ packageJson.dependencies[depName] = `^${packageToVersions.get(depName)}`;
+ }
+ }
+
+ // Update devDependencies
+ for (const depName of Object.keys(packageJson.devDependencies ?? [])) {
+ if (packageToVersions.has(depName)) {
+ packageJson.devDependencies[depName] = `^${packageToVersions.get(depName)}`;
+ }
+ }
+
+ await fs.writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2) + '\n');
+}
+
+/**
+ * @param {string} packageJsonPath
+ * @returns {Promise<Record<string, any> | undefined>}
+ */
+async function readAndParsePackageJson(packageJsonPath) {
+ try {
+ return JSON.parse(await fs.readFile(packageJsonPath, 'utf-8'));
+ } catch {}
+}