mirror of
https://github.com/awatertrevi/infisical.git
synced 2026-09-22 13:39:35 +00:00
fix: cli npm release windows and symlink bugs
This commit is contained in:
31
npm/package-lock.json
generated
31
npm/package-lock.json
generated
@@ -9,12 +9,22 @@
|
|||||||
"version": "0.0.0",
|
"version": "0.0.0",
|
||||||
"hasInstallScript": true,
|
"hasInstallScript": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"tar": "^6.2.0"
|
"tar": "^6.2.0",
|
||||||
|
"yauzl": "^3.2.0"
|
||||||
},
|
},
|
||||||
"bin": {
|
"bin": {
|
||||||
"infisical": "bin/infisical"
|
"infisical": "bin/infisical"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/buffer-crc32": {
|
||||||
|
"version": "0.2.13",
|
||||||
|
"resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
|
||||||
|
"integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==",
|
||||||
|
"license": "MIT",
|
||||||
|
"engines": {
|
||||||
|
"node": "*"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/chownr": {
|
"node_modules/chownr": {
|
||||||
"version": "2.0.0",
|
"version": "2.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
|
||||||
@@ -87,6 +97,12 @@
|
|||||||
"node": ">=10"
|
"node": ">=10"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/pend": {
|
||||||
|
"version": "1.2.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
|
||||||
|
"integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==",
|
||||||
|
"license": "MIT"
|
||||||
|
},
|
||||||
"node_modules/tar": {
|
"node_modules/tar": {
|
||||||
"version": "6.2.0",
|
"version": "6.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz",
|
||||||
@@ -107,6 +123,19 @@
|
|||||||
"version": "4.0.0",
|
"version": "4.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
|
||||||
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
|
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
|
||||||
|
},
|
||||||
|
"node_modules/yauzl": {
|
||||||
|
"version": "3.2.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/yauzl/-/yauzl-3.2.0.tgz",
|
||||||
|
"integrity": "sha512-Ow9nuGZE+qp1u4JIPvg+uCiUr7xGQWdff7JQSk5VGYTAZMDe2q8lxJ10ygv10qmSj031Ty/6FNJpLO4o1Sgc+w==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"buffer-crc32": "~0.2.3",
|
||||||
|
"pend": "~1.2.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=12"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
"command-line"
|
"command-line"
|
||||||
],
|
],
|
||||||
"bin": {
|
"bin": {
|
||||||
"infisical": "bin/infisical"
|
"infisical": "./bin/infisical"
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
@@ -16,9 +16,10 @@
|
|||||||
},
|
},
|
||||||
"author": "Infisical Inc, <daniel@infisical.com>",
|
"author": "Infisical Inc, <daniel@infisical.com>",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"postinstall": "node src/index.cjs"
|
"preinstall": "node src/index.cjs"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"tar": "^6.2.0"
|
"tar": "^6.2.0",
|
||||||
|
"yauzl": "^3.2.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,13 +4,20 @@ const stream = require("node:stream");
|
|||||||
const tar = require("tar");
|
const tar = require("tar");
|
||||||
const path = require("path");
|
const path = require("path");
|
||||||
const zlib = require("zlib");
|
const zlib = require("zlib");
|
||||||
|
const yauzl = require("yauzl");
|
||||||
|
|
||||||
const packageJSON = require("../package.json");
|
const packageJSON = require("../package.json");
|
||||||
|
|
||||||
const supportedPlatforms = ["linux", "darwin", "win32", "freebsd"];
|
const supportedPlatforms = ["linux", "darwin", "win32", "freebsd", "windows"];
|
||||||
const outputDir = "bin";
|
const outputDir = "bin";
|
||||||
|
|
||||||
const getPlatform = () => {
|
const getPlatform = () => {
|
||||||
const platform = process.platform;
|
let platform = process.platform;
|
||||||
|
|
||||||
|
if (platform === "win32") {
|
||||||
|
platform = "windows";
|
||||||
|
}
|
||||||
|
|
||||||
if (!supportedPlatforms.includes(platform)) {
|
if (!supportedPlatforms.includes(platform)) {
|
||||||
console.error("Your platform doesn't seem to be of type darwin, linux or windows");
|
console.error("Your platform doesn't seem to be of type darwin, linux or windows");
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
@@ -53,12 +60,47 @@ const getArchitecture = () => {
|
|||||||
return arch;
|
return arch;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
async function extractZip(buffer, targetPath) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
yauzl.fromBuffer(buffer, { lazyEntries: true }, (err, zipfile) => {
|
||||||
|
if (err) return reject(err);
|
||||||
|
|
||||||
|
zipfile.readEntry();
|
||||||
|
zipfile.on("entry", entry => {
|
||||||
|
const isExecutable = entry.fileName === "infisical" || entry.fileName === "infisical.exe";
|
||||||
|
|
||||||
|
if (/\/$/.test(entry.fileName) || !isExecutable) {
|
||||||
|
// Directory entry
|
||||||
|
zipfile.readEntry();
|
||||||
|
} else {
|
||||||
|
// File entry
|
||||||
|
zipfile.openReadStream(entry, (err, readStream) => {
|
||||||
|
if (err) return reject(err);
|
||||||
|
|
||||||
|
const outputPath = path.join(targetPath, entry.fileName.includes("infisical") ? "infisical" : entry.fileName);
|
||||||
|
const writeStream = fs.createWriteStream(outputPath);
|
||||||
|
|
||||||
|
readStream.pipe(writeStream);
|
||||||
|
writeStream.on("close", () => {
|
||||||
|
zipfile.readEntry();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
zipfile.on("end", resolve);
|
||||||
|
zipfile.on("error", reject);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
async function main() {
|
async function main() {
|
||||||
const PLATFORM = getPlatform();
|
const PLATFORM = getPlatform();
|
||||||
const ARCH = getArchitecture();
|
const ARCH = getArchitecture();
|
||||||
const NUMERIC_RELEASE_VERSION = packageJSON.version;
|
const NUMERIC_RELEASE_VERSION = packageJSON.version;
|
||||||
const LATEST_RELEASE_VERSION = `v${NUMERIC_RELEASE_VERSION}`;
|
const LATEST_RELEASE_VERSION = `v${NUMERIC_RELEASE_VERSION}`;
|
||||||
const downloadLink = `https://github.com/Infisical/infisical/releases/download/infisical-cli/${LATEST_RELEASE_VERSION}/infisical_${NUMERIC_RELEASE_VERSION}_${PLATFORM}_${ARCH}.tar.gz`;
|
const EXTENSION = PLATFORM === "windows" ? "zip" : "tar.gz";
|
||||||
|
const downloadLink = `https://github.com/Infisical/infisical/releases/download/infisical-cli/${LATEST_RELEASE_VERSION}/infisical_${NUMERIC_RELEASE_VERSION}_${PLATFORM}_${ARCH}.${EXTENSION}`;
|
||||||
|
|
||||||
// Ensure the output directory exists
|
// Ensure the output directory exists
|
||||||
if (!fs.existsSync(outputDir)) {
|
if (!fs.existsSync(outputDir)) {
|
||||||
@@ -77,19 +119,26 @@ async function main() {
|
|||||||
throw new Error(`Failed to fetch: ${response.status} - ${response.statusText}`);
|
throw new Error(`Failed to fetch: ${response.status} - ${response.statusText}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
await new Promise((resolve, reject) => {
|
if (EXTENSION === "zip") {
|
||||||
const outStream = stream.Readable.fromWeb(response.body)
|
// For ZIP files, we need to buffer the whole thing first
|
||||||
.pipe(zlib.createGunzip())
|
const buffer = await response.arrayBuffer();
|
||||||
.pipe(
|
await extractZip(Buffer.from(buffer), outputDir);
|
||||||
tar.x({
|
} else {
|
||||||
C: path.join(outputDir),
|
// For tar.gz files, we stream
|
||||||
filter: path => path === "infisical"
|
await new Promise((resolve, reject) => {
|
||||||
})
|
const outStream = stream.Readable.fromWeb(response.body)
|
||||||
);
|
.pipe(zlib.createGunzip())
|
||||||
|
.pipe(
|
||||||
|
tar.x({
|
||||||
|
C: path.join(outputDir),
|
||||||
|
filter: path => path === "infisical"
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
outStream.on("error", reject);
|
outStream.on("error", reject);
|
||||||
outStream.on("close", resolve);
|
outStream.on("close", resolve);
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
|
||||||
// Give the binary execute permissions if we're not on Windows
|
// Give the binary execute permissions if we're not on Windows
|
||||||
if (PLATFORM !== "win32") {
|
if (PLATFORM !== "win32") {
|
||||||
|
|||||||
Reference in New Issue
Block a user