@webbies.dev/dotenvify 0.3.5 โ†’ 0.3.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.
package/README.md CHANGED
@@ -71,6 +71,10 @@ dotenvify your-vars.txt custom-output.env
71
71
  # Overwrite existing .env without backup
72
72
  dotenvify -f your-vars.txt
73
73
 
74
+ # Preserve specific variables (keep their existing values)
75
+ # Note: Flags must come before file arguments
76
+ dotenvify -preserve "DATABASE_URL,API_KEY" your-vars.txt
77
+
74
78
  # Ignore variables with lowercase keys
75
79
  dotenvify -nl your-vars.txt
76
80
  ```
@@ -93,6 +97,7 @@ dotenvify -azure -url "https://dev.azure.com/your-org/your-project" -group "your
93
97
 
94
98
  **Options:**
95
99
  - `-out file.env` - Custom output file
100
+ - `-preserve "VAR1,VAR2"` or `-k` - Keep existing values for specified variables
96
101
  - `-nl` - Ignore lowercase variables
97
102
  - `-export` - Add 'export' prefix
98
103
  - `-urls` - Only URL values
@@ -117,6 +122,7 @@ Just make sure you're logged in with `az login` before running the tool.
117
122
  - ๐Ÿงน **Smart**: Auto-detects input formats
118
123
  - ๐Ÿ”ค **Flexible**: Multiple output options
119
124
  - ๐Ÿ’พ **Safe**: Auto-backup with incremental counters
125
+ - ๐Ÿ›ก๏ธ **Preserve**: Keep existing values for specific variables
120
126
  - ๐Ÿ“ฆ **Easy Install**: npm
121
127
  - ๐Ÿ”„ **Self-Updating**: Built-in update mechanism
122
128
 
package/bin/dotenvify ADDED
@@ -0,0 +1,30 @@
1
+ #!/usr/bin/env node
2
+
3
+ const { spawn } = require('child_process');
4
+ const path = require('path');
5
+ const fs = require('fs');
6
+
7
+ const isWindows = process.platform === 'win32';
8
+ const binaryName = isWindows ? 'dotenvify.exe' : 'dotenvify';
9
+ const binaryPath = path.join(__dirname, binaryName);
10
+
11
+ if (!fs.existsSync(binaryPath)) {
12
+ console.error('dotenvify binary not found. Try reinstalling:');
13
+ console.error(' npm uninstall -g @webbies.dev/dotenvify');
14
+ console.error(' npm install -g @webbies.dev/dotenvify');
15
+ process.exit(1);
16
+ }
17
+
18
+ const child = spawn(binaryPath, process.argv.slice(2), {
19
+ stdio: 'inherit',
20
+ windowsHide: true,
21
+ });
22
+
23
+ child.on('error', (err) => {
24
+ console.error('Failed to execute dotenvify:', err.message);
25
+ process.exit(1);
26
+ });
27
+
28
+ child.on('close', (code) => {
29
+ process.exit(code || 0);
30
+ });
package/package.json CHANGED
@@ -1,12 +1,13 @@
1
1
  {
2
2
  "name": "@webbies.dev/dotenvify",
3
- "version": "0.3.5",
3
+ "version": "0.3.8",
4
4
  "description": "A utility to convert environment variables from various sources into different formats",
5
5
  "bin": {
6
- "dotenvify": "./dotenvify"
6
+ "dotenvify": "./bin/dotenvify"
7
7
  },
8
8
  "scripts": {
9
- "test": "./dotenvify --help"
9
+ "postinstall": "node scripts/install.js",
10
+ "test": "node bin/dotenvify --help"
10
11
  },
11
12
  "keywords": [
12
13
  "dotenv",
@@ -23,9 +24,19 @@
23
24
  "url": "https://github.com/webb1es/dotenvify.git"
24
25
  },
25
26
  "files": [
26
- "dotenvify"
27
+ "bin/dotenvify",
28
+ "scripts/install.js"
29
+ ],
30
+ "os": [
31
+ "darwin",
32
+ "linux",
33
+ "win32"
34
+ ],
35
+ "cpu": [
36
+ "x64",
37
+ "arm64"
27
38
  ],
28
39
  "engines": {
29
- "node": ">=12"
40
+ "node": ">=14"
30
41
  }
31
42
  }
@@ -0,0 +1,154 @@
1
+ #!/usr/bin/env node
2
+
3
+ const { execSync } = require('child_process');
4
+ const fs = require('fs');
5
+ const path = require('path');
6
+ const https = require('https');
7
+ const { createWriteStream, mkdirSync, chmodSync, existsSync } = fs;
8
+
9
+ const REPO = 'webb1es/dotenvify';
10
+ const BINARY_NAME = 'dotenvify';
11
+
12
+ function getPlatformInfo() {
13
+ const platform = process.platform;
14
+ const arch = process.arch;
15
+
16
+ const platformMap = {
17
+ darwin: 'darwin',
18
+ linux: 'linux',
19
+ win32: 'windows',
20
+ };
21
+
22
+ const archMap = {
23
+ x64: 'amd64',
24
+ arm64: 'arm64',
25
+ };
26
+
27
+ const os = platformMap[platform];
28
+ const goArch = archMap[arch];
29
+
30
+ if (!os || !goArch) {
31
+ console.error(`Unsupported platform: ${platform} ${arch}`);
32
+ process.exit(1);
33
+ }
34
+
35
+ // Windows arm64 not supported
36
+ if (os === 'windows' && goArch === 'arm64') {
37
+ console.error('Windows arm64 is not supported');
38
+ process.exit(1);
39
+ }
40
+
41
+ return { os, arch: goArch, isWindows: platform === 'win32' };
42
+ }
43
+
44
+ function getPackageVersion() {
45
+ const packageJson = require('../package.json');
46
+ return packageJson.version;
47
+ }
48
+
49
+ function downloadFile(url, dest) {
50
+ return new Promise((resolve, reject) => {
51
+ const follow = (url) => {
52
+ https.get(url, (response) => {
53
+ if (response.statusCode === 302 || response.statusCode === 301) {
54
+ follow(response.headers.location);
55
+ return;
56
+ }
57
+
58
+ if (response.statusCode !== 200) {
59
+ reject(new Error(`Download failed: ${response.statusCode}`));
60
+ return;
61
+ }
62
+
63
+ const file = createWriteStream(dest);
64
+ response.pipe(file);
65
+ file.on('finish', () => {
66
+ file.close();
67
+ resolve();
68
+ });
69
+ file.on('error', (err) => {
70
+ fs.unlinkSync(dest);
71
+ reject(err);
72
+ });
73
+ }).on('error', reject);
74
+ };
75
+ follow(url);
76
+ });
77
+ }
78
+
79
+ async function extractTarGz(archive, dest) {
80
+ execSync(`tar -xzf "${archive}" -C "${dest}"`, { stdio: 'inherit' });
81
+ }
82
+
83
+ async function extractZip(archive, dest) {
84
+ if (process.platform === 'win32') {
85
+ execSync(`powershell -command "Expand-Archive -Path '${archive}' -DestinationPath '${dest}'"`, { stdio: 'inherit' });
86
+ } else {
87
+ execSync(`unzip -o "${archive}" -d "${dest}"`, { stdio: 'inherit' });
88
+ }
89
+ }
90
+
91
+ async function install() {
92
+ const { os, arch, isWindows } = getPlatformInfo();
93
+ const version = getPackageVersion();
94
+ const ext = isWindows ? 'zip' : 'tar.gz';
95
+ const binaryExt = isWindows ? '.exe' : '';
96
+
97
+ const archiveName = `${BINARY_NAME}_${version}_${os}_${arch}.${ext}`;
98
+ const downloadUrl = `https://github.com/${REPO}/releases/download/v${version}/${archiveName}`;
99
+
100
+ const binDir = path.join(__dirname, '..', 'bin');
101
+ const tmpDir = path.join(__dirname, '..', '.tmp');
102
+ const archivePath = path.join(tmpDir, archiveName);
103
+ const binaryDest = path.join(binDir, `${BINARY_NAME}${binaryExt}`);
104
+
105
+ // Create directories
106
+ if (!existsSync(binDir)) mkdirSync(binDir, { recursive: true });
107
+ if (!existsSync(tmpDir)) mkdirSync(tmpDir, { recursive: true });
108
+
109
+ console.log(`Downloading ${BINARY_NAME} v${version} for ${os}/${arch}...`);
110
+ console.log(`URL: ${downloadUrl}`);
111
+
112
+ try {
113
+ await downloadFile(downloadUrl, archivePath);
114
+ } catch (err) {
115
+ console.error(`Failed to download binary: ${err.message}`);
116
+ console.error('');
117
+ console.error('This may happen if:');
118
+ console.error(` - Version v${version} has not been released on GitHub yet`);
119
+ console.error(' - Your platform is not supported');
120
+ console.error('');
121
+ console.error('You can manually download from:');
122
+ console.error(` https://github.com/${REPO}/releases`);
123
+ process.exit(1);
124
+ }
125
+
126
+ console.log('Extracting...');
127
+ if (isWindows) {
128
+ await extractZip(archivePath, tmpDir);
129
+ } else {
130
+ await extractTarGz(archivePath, tmpDir);
131
+ }
132
+
133
+ // Find and move the binary
134
+ const extractedBinary = path.join(tmpDir, `${BINARY_NAME}${binaryExt}`);
135
+ if (existsSync(extractedBinary)) {
136
+ fs.renameSync(extractedBinary, binaryDest);
137
+ if (!isWindows) {
138
+ chmodSync(binaryDest, 0o755);
139
+ }
140
+ } else {
141
+ console.error('Binary not found in archive');
142
+ process.exit(1);
143
+ }
144
+
145
+ // Cleanup
146
+ fs.rmSync(tmpDir, { recursive: true, force: true });
147
+
148
+ console.log(`Successfully installed ${BINARY_NAME} to ${binaryDest}`);
149
+ }
150
+
151
+ install().catch((err) => {
152
+ console.error('Installation failed:', err);
153
+ process.exit(1);
154
+ });