gradio
149 строк · 4.3 Кб
1const { join } = require("path");2const { readFileSync, existsSync, writeFileSync, unlinkSync } = require("fs");3const { getPackagesSync } = require("@manypkg/get-packages");4
5const RE_PKG_NAME = /^[\w-]+\b/;6const pkg_meta = getPackagesSync(process.cwd());7
8/**
9* @typedef {{dirs: string[], highlight: {summary: string}[], feat: {summary: string}[], fix: {summary: string}[], current_changelog: string}} ChangesetMeta
10*/
11
12/**
13* @typedef {{[key: string]: ChangesetMeta}} ChangesetMetaCollection
14*/
15
16function run() {17if (!existsSync(join(pkg_meta.rootDir, ".changeset", "_changelog.json"))) {18console.warn("No changesets to process");19return;20}21
22/**23* @type { ChangesetMetaCollection & { _handled: string[] } }}
24*/
25const { _handled, ...packages } = JSON.parse(26readFileSync(27join(pkg_meta.rootDir, ".changeset", "_changelog.json"),28"utf-8"29)30);31
32/**33* @typedef { {packageJson: {name: string, version: string, python: boolean}, dir: string} } PackageMeta
34*/
35
36/**37* @type { {[key:string]: PackageMeta} }
38*/
39const all_packages = pkg_meta.packages.reduce((acc, pkg) => {40acc[pkg.packageJson.name] = /**@type {PackageMeta} */ (41/** @type {unknown} */ (pkg)42);43return acc;44}, /** @type {{[key:string] : PackageMeta}} */ ({}));45
46for (const pkg_name in packages) {47const { dirs, highlight, feat, fix, current_changelog, dependencies } =48/**@type {ChangesetMeta} */ (packages[pkg_name]);49
50if (pkg_name === "@gradio/lite") {51const target = all_packages.gradio.packageJson.version.split(".");52
53const current_version = packages[pkg_name].previous_version.split(".");54
55if (!packages.gradio) {56const patch = parseInt(current_version[2]) + 1;57const new_version = [target[0], target[1], patch];58all_packages[pkg_name].packageJson.version = new_version.join(".");59} else {60if (parseInt(target[1]) > parseInt(current_version[1])) {61all_packages[pkg_name].packageJson.version = target.join(".");62} else if (parseInt(target[1]) === parseInt(current_version[1])) {63const patch = parseInt(current_version[2]) + 1;64const new_version = [target[0], target[1], patch];65all_packages[pkg_name].packageJson.version = new_version.join(".");66}67}68
69writeFileSync(70join(all_packages[pkg_name].dir, "package.json"),71JSON.stringify(all_packages[pkg_name].packageJson, null, "\t") + "\n"72);73}74
75const { version, python } = all_packages[pkg_name].packageJson;76
77const highlights = highlight?.map((h) => `${h.summary}`) || [];78const features = feat?.map((f) => `- ${f.summary}`) || [];79const fixes = fix?.map((f) => `- ${f.summary}`) || [];80const deps = Array.from(new Set(dependencies?.map((d) => d.trim()))) || [];81
82const release_notes = /** @type {[string[], string][]} */ ([83[highlights, "### Highlights"],84[features, "### Features"],85[fixes, "### Fixes"],86[deps, "### Dependency updates"]87])88.filter(([s], i) => s.length > 0)89.map(([lines, title]) => {90if (title === "### Highlights") {91return `${title}\n\n${lines.join("\n\n")}`;92}93
94return `${title}\n\n${lines.join("\n")}`;95})96.join("\n\n");97
98const new_changelog = `# ${pkg_name}99
100## ${version}101
102${release_notes}103
104${current_changelog.replace(`# ${pkg_name}`, "").trim()}105`.trim();106
107dirs.forEach((dir) => {108writeFileSync(join(dir, "CHANGELOG.md"), new_changelog);109});110
111if (python) {112bump_local_dependents(pkg_name, version);113}114}115
116unlinkSync(join(pkg_meta.rootDir, ".changeset", "_changelog.json"));117
118/**119* @param {string} pkg_to_bump The name of the package to bump
120* @param {string} version The version to bump to
121* @returns {void}
122* */
123function bump_local_dependents(pkg_to_bump, version) {124for (const pkg_name in all_packages) {125const {126dir,127packageJson: { python }128} = all_packages[pkg_name];129
130if (!python) continue;131
132const requirements_path = join(dir, "..", "requirements.txt");133const requirements = readFileSync(requirements_path, "utf-8").split("\n");134
135const pkg_index = requirements.findIndex((line) => {136const m = line.trim().match(RE_PKG_NAME);137if (!m) return false;138return m[0] === pkg_to_bump;139});140
141if (pkg_index !== -1) {142requirements[pkg_index] = `${pkg_to_bump}==${version}`;143writeFileSync(requirements_path, requirements.join("\n"));144}145}146}147}
148
149run();150