Skip to content

Commit 3a067c6

Browse files
authored
chore: release deprecation script (#3465)
* chore: migrate unpublish script -> deprecation script * chore: add deprecation workflow * chore: changeset * chore: rename workflow * chore: rebuild * chore: use allSettled * chore: add dry run * chore: refactor * chore: filter out latest next tag * chore: remove hardcoded package
1 parent ebe5ecd commit 3a067c6

File tree

6 files changed

+120
-87
lines changed

6 files changed

+120
-87
lines changed

.changeset/lucky-flies-search.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
---
2+
---
3+
4+
chore: release deprecation script
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
name: "Deprecate Old Versions"
2+
3+
on:
4+
workflow_dispatch:
5+
inputs:
6+
deprecate_versions:
7+
type: boolean
8+
description: Deprecate versions? Otherwise dry-run mode will be used.
9+
default: false
10+
11+
concurrency:
12+
group: ${{ github.workflow }}-${{ github.ref }}
13+
cancel-in-progress: true
14+
15+
jobs:
16+
deprecate-npm-versions:
17+
name: Deprecate versions next, pr and rc
18+
runs-on: buildjet-4vcpu-ubuntu-2204
19+
steps:
20+
- name: Checkout
21+
uses: actions/checkout@v4
22+
23+
- name: CI Setup
24+
uses: ./.github/actions/ci-setup
25+
26+
- name: Deprecate
27+
run: pnpm release:deprecate
28+
env:
29+
DEPRECATE_VERSIONS: ${{ github.event.inputs.deprecate_versions }}

.github/workflows/release-unpublish.yaml

Lines changed: 0 additions & 28 deletions
This file was deleted.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
"changeset:update-changelog": "tsx ./scripts/changeset/update-changelog.mts",
5656
"changeset:get-latest-release": "tsx ./scripts/changeset/get-latest-release.mts",
5757
"changeset:dependabot": "./scripts/changeset/dependabot-changeset.sh",
58+
"release:deprecate": "tsx ./scripts/release-deprecate.ts",
5859
"forc:update": "tsx ./scripts/forc-update",
5960
"forc:check": "./scripts/forc-check.sh",
6061
"forc:format": "./scripts/forc-format.sh",

scripts/release-deprecate.ts

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
import { compare } from 'compare-versions';
2+
import { exec } from 'node:child_process';
3+
import { readFileSync, readdirSync } from 'node:fs';
4+
import { join } from 'node:path';
5+
6+
const { log, error } = console;
7+
8+
const deprecateTags = /next|pr|rc/;
9+
const { version: currentVersion } = JSON.parse(
10+
readFileSync(join(process.cwd(), '/packages/fuels/package.json')).toString()
11+
);
12+
const deprecateVersions = process.env.DEPRECATE_VERSIONS === 'true';
13+
14+
const getPublicPackages = () => {
15+
const packagesDir = join(__dirname, '../packages');
16+
const packages = readdirSync(packagesDir, { withFileTypes: true });
17+
const packagesNames = packages.map((p) => {
18+
try {
19+
const packageContent = readFileSync(join(packagesDir, p.name, 'package.json'), 'utf8');
20+
const packageJson = JSON.parse(packageContent.toString());
21+
return packageJson.private ? null : packageJson.name;
22+
} catch (err) {
23+
return null;
24+
}
25+
});
26+
return packagesNames.filter((p) => !!p);
27+
};
28+
29+
const getVersionsToDeprecate = async (packageName: string) => {
30+
const { versions } = await fetch(`https://registry.npmjs.org/${packageName}`).then((resp) =>
31+
resp.json()
32+
);
33+
34+
// Only deprecate certain tags
35+
const validVersions = Object.keys(versions).filter(
36+
(version) => version.search(deprecateTags) > -1 && !compare(version, currentVersion, '>=')
37+
);
38+
39+
// Remove the latest next tag from the deprecation list
40+
const latestNextVersion = validVersions.filter((version) => version.search('next') > -1).pop();
41+
return validVersions.filter((version) => version !== latestNextVersion);
42+
};
43+
44+
const main = async () => {
45+
const packages = getPublicPackages();
46+
await Promise.allSettled(
47+
packages.map(async (packageName) => {
48+
const versionsToDeprecate = await getVersionsToDeprecate(packageName);
49+
50+
log('The following versions will be deprecated:');
51+
log(versionsToDeprecate.map((v) => ` - ${v}`).join('\n'));
52+
53+
if (deprecateVersions) {
54+
await Promise.allSettled(
55+
versionsToDeprecate.map(
56+
async (versionToDelete) =>
57+
new Promise((resolve, reject) => {
58+
exec(
59+
`npm deprecate ${packageName}@${versionToDelete} "Version no longer supported."`,
60+
(err, _stdout, stderr) => {
61+
if (err) {
62+
log(`❌ Error ${packageName}@${versionToDelete} not deprecated!\n`);
63+
reject(err);
64+
return;
65+
}
66+
if (stderr) {
67+
log(`❌ Error ${packageName}@${versionToDelete} not deprecated!\n`);
68+
reject(new Error(stderr));
69+
return;
70+
}
71+
log(`✅ Package ${packageName}@${versionToDelete} deprecated!\n`);
72+
resolve(true);
73+
}
74+
);
75+
})
76+
)
77+
);
78+
}
79+
})
80+
);
81+
};
82+
83+
main().catch((err) => {
84+
error(err);
85+
process.exit(1);
86+
});

scripts/release-unpublish.js

Lines changed: 0 additions & 59 deletions
This file was deleted.

0 commit comments

Comments
 (0)