@infisical/cli 0.31.7 → 0.31.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Binary file
package/package.json CHANGED
@@ -1,14 +1,14 @@
1
1
  {
2
2
  "name": "@infisical/cli",
3
3
  "private": false,
4
- "version": "0.31.7",
4
+ "version": "0.31.8",
5
5
  "keywords": [
6
6
  "infisical",
7
7
  "cli",
8
8
  "command-line"
9
9
  ],
10
10
  "bin": {
11
- "infisical": "bin/infisical"
11
+ "infisical": "./bin/infisical"
12
12
  },
13
13
  "repository": {
14
14
  "type": "git",
@@ -16,9 +16,10 @@
16
16
  },
17
17
  "author": "Infisical Inc, <daniel@infisical.com>",
18
18
  "scripts": {
19
- "postinstall": "node src/index.cjs"
19
+ "preinstall": "node src/index.cjs"
20
20
  },
21
21
  "dependencies": {
22
- "tar": "^6.2.0"
22
+ "tar": "^6.2.0",
23
+ "yauzl": "^3.2.0"
23
24
  }
24
25
  }
package/src/index.cjs CHANGED
@@ -4,13 +4,20 @@ const stream = require("node:stream");
4
4
  const tar = require("tar");
5
5
  const path = require("path");
6
6
  const zlib = require("zlib");
7
+ const yauzl = require("yauzl");
8
+
7
9
  const packageJSON = require("../package.json");
8
10
 
9
- const supportedPlatforms = ["linux", "darwin", "win32", "freebsd"];
11
+ const supportedPlatforms = ["linux", "darwin", "win32", "freebsd", "windows"];
10
12
  const outputDir = "bin";
11
13
 
12
14
  const getPlatform = () => {
13
- const platform = process.platform;
15
+ let platform = process.platform;
16
+
17
+ if (platform === "win32") {
18
+ platform = "windows";
19
+ }
20
+
14
21
  if (!supportedPlatforms.includes(platform)) {
15
22
  console.error("Your platform doesn't seem to be of type darwin, linux or windows");
16
23
  process.exit(1);
@@ -53,12 +60,55 @@ const getArchitecture = () => {
53
60
  return arch;
54
61
  };
55
62
 
63
+ async function extractZip(buffer, targetPath) {
64
+ return new Promise((resolve, reject) => {
65
+ yauzl.fromBuffer(buffer, { lazyEntries: true }, (err, zipfile) => {
66
+ if (err) return reject(err);
67
+
68
+ zipfile.readEntry();
69
+ zipfile.on("entry", entry => {
70
+ const isExecutable = entry.fileName === "infisical" || entry.fileName === "infisical.exe";
71
+
72
+ if (/\/$/.test(entry.fileName) || !isExecutable) {
73
+ // Directory entry
74
+ zipfile.readEntry();
75
+ } else {
76
+ // File entry
77
+ zipfile.openReadStream(entry, (err, readStream) => {
78
+ if (err) return reject(err);
79
+
80
+ let fileName = entry.fileName;
81
+
82
+ if (entry.fileName.endsWith(".exe")) {
83
+ fileName = "infisical.exe";
84
+ } else if (entry.fileName.includes("infisical")) {
85
+ fileName = "infisical";
86
+ }
87
+
88
+ const outputPath = path.join(targetPath, fileName);
89
+ const writeStream = fs.createWriteStream(outputPath);
90
+
91
+ readStream.pipe(writeStream);
92
+ writeStream.on("close", () => {
93
+ zipfile.readEntry();
94
+ });
95
+ });
96
+ }
97
+ });
98
+
99
+ zipfile.on("end", resolve);
100
+ zipfile.on("error", reject);
101
+ });
102
+ });
103
+ }
104
+
56
105
  async function main() {
57
106
  const PLATFORM = getPlatform();
58
107
  const ARCH = getArchitecture();
59
108
  const NUMERIC_RELEASE_VERSION = packageJSON.version;
60
109
  const LATEST_RELEASE_VERSION = `v${NUMERIC_RELEASE_VERSION}`;
61
- const downloadLink = `https://github.com/Infisical/infisical/releases/download/infisical-cli/${LATEST_RELEASE_VERSION}/infisical_${NUMERIC_RELEASE_VERSION}_${PLATFORM}_${ARCH}.tar.gz`;
110
+ const EXTENSION = PLATFORM === "windows" ? "zip" : "tar.gz";
111
+ const downloadLink = `https://github.com/Infisical/infisical/releases/download/infisical-cli/${LATEST_RELEASE_VERSION}/infisical_${NUMERIC_RELEASE_VERSION}_${PLATFORM}_${ARCH}.${EXTENSION}`;
62
112
 
63
113
  // Ensure the output directory exists
64
114
  if (!fs.existsSync(outputDir)) {
@@ -77,22 +127,35 @@ async function main() {
77
127
  throw new Error(`Failed to fetch: ${response.status} - ${response.statusText}`);
78
128
  }
79
129
 
80
- await new Promise((resolve, reject) => {
81
- const outStream = stream.Readable.fromWeb(response.body)
82
- .pipe(zlib.createGunzip())
83
- .pipe(
84
- tar.x({
85
- C: path.join(outputDir),
86
- filter: path => path === "infisical"
87
- })
88
- );
89
-
90
- outStream.on("error", reject);
91
- outStream.on("close", resolve);
92
- });
130
+ if (EXTENSION === "zip") {
131
+ // For ZIP files, we need to buffer the whole thing first
132
+ const buffer = await response.arrayBuffer();
133
+ await extractZip(Buffer.from(buffer), outputDir);
134
+ } else {
135
+ // For tar.gz files, we stream
136
+ await new Promise((resolve, reject) => {
137
+ const outStream = stream.Readable.fromWeb(response.body)
138
+ .pipe(zlib.createGunzip())
139
+ .pipe(
140
+ tar.x({
141
+ C: path.join(outputDir),
142
+ filter: path => path === "infisical"
143
+ })
144
+ );
145
+
146
+ outStream.on("error", reject);
147
+ outStream.on("close", resolve);
148
+ });
149
+ }
93
150
 
94
- // Give the binary execute permissions if we're not on Windows
95
- if (PLATFORM !== "win32") {
151
+ // Platform-specific tasks
152
+ if (PLATFORM === "windows") {
153
+ // We create an empty file called 'infisical'. This file has no functionality, except allowing NPM to correctly create the symlink.
154
+ // Reason why this doesn't work without the empty file, is because the files downloaded are a .ps1, .exe, and .cmd file. None of these match the binary name from the package.json['bin'] field.
155
+ // This is a bit hacky, but it assures that the symlink is correctly created.
156
+ fs.closeSync(fs.openSync(path.join(outputDir, "infisical"), "w"));
157
+ } else {
158
+ // Unix systems only need chmod
96
159
  fs.chmodSync(path.join(outputDir, "infisical"), "755");
97
160
  }
98
161
  } catch (error) {
Binary file