diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..e1935bd --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,28 @@ +{ + "editor.defaultFormatter": "esbenp.prettier-vscode", + "workbench.colorTheme": "Default Dark+", + "prettier.tabWidth": 4, + "terminal.integrated.env.windows": {}, + "editor.formatOnSave": true, + "[javascript]": { + "editor.formatOnSave": true + }, + "[javascriptreact]": { + "editor.formatOnSave": true + }, + "[typescript]": { + "editor.formatOnSave": true + }, + "[typescriptreact]": { + "editor.formatOnSave": true + }, + "[json]": { + "editor.formatOnSave": true + }, + "[graphql]": { + "editor.formatOnSave": true + }, + "[handlebars]": { + "editor.formatOnSave": true + } +} \ No newline at end of file diff --git a/scripts/create-gitea-release.js b/scripts/create-gitea-release.js index 7fa85ab..311970a 100644 --- a/scripts/create-gitea-release.js +++ b/scripts/create-gitea-release.js @@ -1,21 +1,23 @@ const version = process.argv[2]; if (!version) { - console.error("Version not passed to create-gitea-release.js"); - process.exit(1); + console.error("Version not passed to create-gitea-release.js"); + process.exit(1); } -import fs from 'fs-extra'; -import { spawnSync } from 'child_process'; -import fetch from 'node-fetch'; -import dotenv from 'dotenv'; -dotenv.config({ path: './.env' }); +import fs from "fs-extra"; +import path from "path"; +import { spawnSync } from "child_process"; +import { fileURLToPath } from "url"; +import fetch from "node-fetch"; +import dotenv from "dotenv"; +dotenv.config({ path: "./.env" }); // Load package.json version // const pkg = await fs.readJson('package.json'); // const version = pkg.version; if (!version) { - console.error('Version not found in package.json'); - process.exit(1); + console.error("Version not found in package.json"); + process.exit(1); } // Resolve the directory of the current script @@ -23,134 +25,139 @@ const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); // Absolute path to BUILD_NUMBER -const buildNumberPath = path.resolve(__dirname, '../BUILD_NUMBER'); +const buildNumberPath = path.resolve(__dirname, "../BUILD_NUMBER"); // Load build number from BUILD_NUMBER file -let buildNumber = '0'; +let buildNumber = "0"; try { - rawBuild = (await fs.readFile(buildNumberPath, 'utf8')).trim(); - console.log("Raw build" ,rawBuild) - if (rawBuild) { - const [numPart, namePart] = rawBuild.split('-'); - const num = parseInt(numPart, 10); + rawBuild = (await fs.readFile(buildNumberPath, "utf8")).trim(); + console.log("Raw build", rawBuild); + if (rawBuild) { + const [numPart, namePart] = rawBuild.split("-"); + const num = parseInt(numPart, 10); - if (!isNaN(num) && namePart) { - buildNumber = `${num - 1}-${namePart}`; + if (!isNaN(num) && namePart) { + buildNumber = `${num - 1}-${namePart}`; + } } - } } catch { - console.warn('BUILD_NUMBER file not found, defaulting to 0'); + console.warn("BUILD_NUMBER file not found, defaulting to 0"); } // Compose full version string with build number const fullVersion = `${version}.${buildNumber}`; -const { - GITEA_URL, - GITEA_USERNAME, - GITEA_REPO, - GITEA_TOKEN -} = process.env; +const { GITEA_URL, GITEA_USERNAME, GITEA_REPO, GITEA_TOKEN } = process.env; if (!GITEA_URL || !GITEA_USERNAME || !GITEA_REPO || !GITEA_TOKEN) { - console.error('Missing required environment variables (GITEA_URL, GITEA_USERNAME, GITEA_REPO, GITEA_TOKEN)'); - process.exit(1); + console.error( + "Missing required environment variables (GITEA_URL, GITEA_USERNAME, GITEA_REPO, GITEA_TOKEN)" + ); + process.exit(1); } // 1) Generate or update CHANGELOG.md using conventional-changelog CLI -console.log('Generating CHANGELOG.md...'); -const result = spawnSync('npx', [ - 'conventional-changelog', - '-p', - 'conventionalcommits', - '-i', - 'CHANGELOG.md', - '-s', - '-r', - '0' -], { stdio: 'inherit', shell: true }); +console.log("Generating CHANGELOG.md..."); +const result = spawnSync( + "npx", + [ + "conventional-changelog", + "-p", + "conventionalcommits", + "-i", + "CHANGELOG.md", + "-s", + "-r", + "0", + ], + { stdio: "inherit", shell: true } +); if (result.status !== 0) { - console.error('Failed to generate changelog'); - process.exit(1); + console.error("Failed to generate changelog"); + process.exit(1); } // 2) Read changelog content for the current version -const changelog = await fs.readFile('CHANGELOG.md', 'utf8'); -const regex = new RegExp(`## \\[${version}\\][\\s\\S]*?(?=## \\[|$)`, 'm'); +const changelog = await fs.readFile("CHANGELOG.md", "utf8"); +const regex = new RegExp(`## \\[${version}\\][\\s\\S]*?(?=## \\[|$)`, "m"); const releaseNotes = changelog.match(regex)?.[0] || changelog; console.log(`Release notes for v${version} saved`); // 3) Create Gitea release const createRelease = async () => { - const apiUrl = `https://${GITEA_URL}/api/v1/repos/${GITEA_USERNAME}/${GITEA_REPO}/releases`; - const releaseData = { - tag_name: `v${version}`, - name: `v${version}`, - body: releaseNotes, - draft: false, - prerelease: true, - }; + const apiUrl = `https://${GITEA_URL}/api/v1/repos/${GITEA_USERNAME}/${GITEA_REPO}/releases`; + const releaseData = { + tag_name: `v${version}`, + name: `v${version}`, + body: releaseNotes, + draft: false, + prerelease: true, + }; - const response = await fetch(apiUrl, { - method: 'POST', - headers: { - Authorization: `token ${GITEA_TOKEN}`, - 'Content-Type': 'application/json', - }, - body: JSON.stringify(releaseData), - }); + const response = await fetch(apiUrl, { + method: "POST", + headers: { + Authorization: `token ${GITEA_TOKEN}`, + "Content-Type": "application/json", + }, + body: JSON.stringify(releaseData), + }); - if (!response.ok) { - const errorText = await response.text(); - throw new Error(`Failed to create release: ${response.status} - ${errorText}`); - } + if (!response.ok) { + const errorText = await response.text(); + throw new Error( + `Failed to create release: ${response.status} - ${errorText}` + ); + } - const release = await response.json(); - console.log('Release created:', release.html_url || release.url); - return release; + const release = await response.json(); + console.log("Release created:", release.html_url || release.url); + return release; }; // 4) Upload release zip asset const uploadAsset = async (release) => { - const apiUrl = `https://${GITEA_URL}/api/v1/repos/${GITEA_USERNAME}/${GITEA_REPO}/releases/assets?tag=${release.tag_name}`; - const filePath = `releases/release-${fullVersion}.zip`; + const apiUrl = `https://${GITEA_URL}/api/v1/repos/${GITEA_USERNAME}/${GITEA_REPO}/releases/assets?tag=${release.tag_name}`; + const filePath = `releases/release-${fullVersion}.zip`; - if (!await fs.pathExists(filePath)) { - console.warn(`Zip file not found: ${filePath}. Skipping asset upload.`); - return; - } + if (!(await fs.pathExists(filePath))) { + console.warn(`Zip file not found: ${filePath}. Skipping asset upload.`); + return; + } - const FormData = (await import('form-data')).default; - const form = new FormData(); - form.append('name', `release-${fullVersion}.zip`); - form.append('attachment', fs.createReadStream(filePath)); + const FormData = (await import("form-data")).default; + const form = new FormData(); + form.append("name", `release-${fullVersion}.zip`); + form.append("attachment", fs.createReadStream(filePath)); - const response = await fetch(apiUrl, { - method: 'POST', - headers: { - Authorization: `token ${GITEA_TOKEN}`, - ...form.getHeaders(), - }, - body: form, - }); + const response = await fetch(apiUrl, { + method: "POST", + headers: { + Authorization: `token ${GITEA_TOKEN}`, + ...form.getHeaders(), + }, + body: form, + }); - if (!response.ok) { - const errorText = await response.text(); - throw new Error(`Failed to upload asset: ${response.status} - ${errorText}`); - } + if (!response.ok) { + const errorText = await response.text(); + throw new Error( + `Failed to upload asset: ${response.status} - ${errorText}` + ); + } - const asset = await response.json(); - console.log('Asset uploaded:', asset.browser_download_url || asset.url); + const asset = await response.json(); + console.log("Asset uploaded:", asset.browser_download_url || asset.url); }; (async () => { - try { - const release = await createRelease(); - await uploadAsset(release); - } catch (err) { - console.error(err); - process.exit(1); - } + try { + const release = await createRelease(); + await uploadAsset(release); + } catch (err) { + console.error(err); + process.exit(1); + } })();