comty/scripts/publishWidget.js
2024-11-17 20:35:20 +00:00

135 lines
3.7 KiB
JavaScript
Executable File

#!/usr/bin/env node
import path from "path"
import fs from "fs"
import axios from "axios"
import sevenzip from "7zip-min"
import formdata from "form-data"
const marketplaceAPIOrigin = "https://indev.comty.app/api/extensions"
const token = process.argv[2]
const excludedFiles = [
"/.git",
"/.tmp",
"/bundle.7z",
"/node_modules",
"/package-lock.json",
]
const rootPath = process.cwd()
const tmpPath = path.join(rootPath, ".tmp")
const buildPath = path.join(tmpPath, "build")
const bundlePath = path.join(tmpPath, "bundle.7z")
async function copySources(origin, to) {
const files = fs.readdirSync(origin)
if (!fs.existsSync(to)) {
await fs.promises.mkdir(to, { recursive: true })
}
for (const file of files) {
const filePath = path.join(origin, file)
// run a rexeg to check if the filePath is excluded
const isExcluded = excludedFiles.some((excludedPath) => {
return filePath.match(excludedPath)
})
if (isExcluded) {
continue
}
if (fs.lstatSync(filePath).isDirectory()) {
await copySources(filePath, path.join(to, file))
} else {
await fs.promises.copyFile(filePath, path.join(to, file))
}
}
}
async function createBundle(origin, desitinationFile) {
return new Promise((resolve, reject) => {
sevenzip.pack(origin, desitinationFile, (err) => {
if (err) {
reject(err)
} else {
resolve()
}
})
})
}
async function main() {
if (!token) {
console.error("🛑 You need to pass a token as argument")
return
}
// create a .tmp folder
if (fs.existsSync(tmpPath)) {
await fs.promises.rm(tmpPath, { recursive: true, force: true })
}
try {
// try to read package.json
if (!fs.existsSync(path.resolve(rootPath, "package.json"))) {
console.error("🛑 package.json not found")
return
}
const packageJSON = require(path.resolve(rootPath, "package.json"))
// check if package.json has a main file
if (!packageJSON.main) {
console.error("🛑 package.json does not have a main file")
return
}
if (!fs.existsSync(path.resolve(rootPath, packageJSON.main))) {
console.error("🛑 main file not found")
return
}
console.log(packageJSON)
console.log("📦 Creating bundle...")
await copySources(rootPath, buildPath)
await createBundle(`${buildPath}/*`, bundlePath)
console.log("📦✅ Bundle created successfully")
console.log("🚚 Publishing bundle...")
const formData = new formdata()
formData.append("file", fs.createReadStream(bundlePath))
const response = await axios({
method: "PUT",
url: `${marketplaceAPIOrigin}/publish`,
headers: {
...formData.getHeaders(),
pkg: JSON.stringify(packageJSON),
Authorization: `Bearer ${token}`,
},
data: formData,
}).catch((error) => {
console.error("🛑 Error while publishing bundle \n\t", error.response?.data ?? error)
return false
})
if (response) {
console.log("🚚✅ Bundle published successfully! \n", response.data)
}
await fs.promises.rm(tmpPath, { recursive: true, force: true })
} catch (error) {
console.error("🛑 Error while publishing bundle \n\t", error)
await fs.promises.rm(tmpPath, { recursive: true, force: true })
}
}
main().catch(console.error)