import axios from 'axios'; import * as process from 'node:process'; import { uid } from 'uid'; import { join } from 'path'; import { readFileSync, readdirSync } from 'fs'; type TFile = { buffer: ArrayBuffer; name: string }; class MediaBasket { private readonly client = axios.create({ baseURL: 'http://render.wb.ru/api/v1', headers: { Authorization: `bearer ${process.env.MEDIA_BUSKET_SECRET}`, }, }); private DIST_PATH = join(__dirname, '../../dist/packages/core/styles'); private CHANGELOG_PATH = join(__dirname, '../../CHANGELOG.MD'); private getVersion() { const packageJsonPath = join(this.DIST_PATH, 'package.json'); const version: string = JSON.parse( readFileSync(packageJsonPath, 'utf-8') ).version; // if (version.includes('-')) throw new Error('Нельзя опубликовать бета-версию') return version; } getFileByName(name: string): TFile { return { buffer: readFileSync(join(this.DIST_PATH, name)), name }; } private async uploadFile(file: TFile) { await new Promise((r) => setTimeout(r, 1400)); // const version = this.getVersion() const key = `${process.env.MEDIA_BUSKET_KEY}/${file.name}`; try { const form = new FormData(); form.append( 'file', new Blob([file.buffer], { type: 'text/plain' }), file.name ); const task = { request_id: `ritm-${uid(8)}`, expires: new Date(Date.now() + 1000 * 60), export: [{ target: process.env.MEDIA_BUSKET_TARGET, key }], }; form.append('task', JSON.stringify(task)); await this.client.post('/upload', form); } catch (e) { console.error('Error', e?.response?.data || e); } const fileUrl = `https://static-basket-03.wbbasket.ru/vol48/${key}`; console.log(`${file.name} available as ${fileUrl}`); return fileUrl; } async upload() { if (!process.env.MEDIA_BUSKET_KEY) throw new Error('Создайте ключи в .env для публикации стилей в CDN.'); const styles = readdirSync(join(this.DIST_PATH)).filter((file) => file.includes('.min.css') ); for (const name of styles) { await this.uploadFile(this.getFileByName(name)); } for (const name of readdirSync(join(this.DIST_PATH, 'fonts'))) { const fileName = this.getFileByName(`fonts/${name}`); await this.uploadFile(fileName); } const file: TFile = { buffer: readFileSync(this.CHANGELOG_PATH), name: 'changelog.md', }; await this.uploadFile(file); } } export const mediaBasket = new MediaBasket();