@vltpkg/cmd-shim 1.0.0-rc.2 → 1.0.0-rc.22
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/package.json +28 -38
- package/dist/esm/index.d.ts +0 -5
- package/dist/esm/index.d.ts.map +0 -1
- package/dist/esm/index.js +0 -192
- package/dist/esm/index.js.map +0 -1
- package/dist/esm/package.json +0 -3
- package/dist/esm/paths.d.ts +0 -2
- package/dist/esm/paths.d.ts.map +0 -1
- package/dist/esm/paths.js +0 -12
- package/dist/esm/paths.js.map +0 -1
- package/dist/esm/read.d.ts +0 -24
- package/dist/esm/read.d.ts.map +0 -1
- package/dist/esm/read.js +0 -92
- package/dist/esm/read.js.map +0 -1
- package/dist/esm/to-batch-syntax.d.ts +0 -4
- package/dist/esm/to-batch-syntax.d.ts.map +0 -1
- package/dist/esm/to-batch-syntax.js +0 -28
- package/dist/esm/to-batch-syntax.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,70 +1,60 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vltpkg/cmd-shim",
|
|
3
3
|
"description": "Executable script shims for Windows",
|
|
4
|
-
"version": "1.0.0-rc.
|
|
4
|
+
"version": "1.0.0-rc.22",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
7
7
|
"url": "git+https://github.com/vltpkg/vltpkg.git",
|
|
8
8
|
"directory": "src/cmd-shim"
|
|
9
9
|
},
|
|
10
|
-
"author":
|
|
11
|
-
|
|
12
|
-
"
|
|
13
|
-
"liveDev": true,
|
|
14
|
-
"dialects": [
|
|
15
|
-
"esm"
|
|
16
|
-
],
|
|
17
|
-
"exports": {
|
|
18
|
-
"./package.json": "./package.json",
|
|
19
|
-
".": "./src/index.ts"
|
|
20
|
-
}
|
|
10
|
+
"author": {
|
|
11
|
+
"name": "vlt technology inc.",
|
|
12
|
+
"email": "support@vlt.sh"
|
|
21
13
|
},
|
|
22
14
|
"dependencies": {
|
|
23
|
-
"@vltpkg/error-cause": "1.0.0-rc.
|
|
24
|
-
"@vltpkg/rollback-remove": "1.0.0-rc.
|
|
15
|
+
"@vltpkg/error-cause": "1.0.0-rc.22",
|
|
16
|
+
"@vltpkg/rollback-remove": "1.0.0-rc.22"
|
|
25
17
|
},
|
|
26
18
|
"devDependencies": {
|
|
27
|
-
"@eslint/js": "^9.
|
|
28
|
-
"@types/node": "^22.
|
|
29
|
-
"eslint": "^9.
|
|
30
|
-
"prettier": "^3.
|
|
31
|
-
"tap": "^21.
|
|
32
|
-
"tshy": "^3.0.2",
|
|
19
|
+
"@eslint/js": "^9.39.1",
|
|
20
|
+
"@types/node": "^22.19.2",
|
|
21
|
+
"eslint": "^9.39.1",
|
|
22
|
+
"prettier": "^3.7.4",
|
|
23
|
+
"tap": "^21.5.0",
|
|
33
24
|
"typedoc": "~0.27.9",
|
|
34
25
|
"typescript": "5.7.3",
|
|
35
|
-
"typescript-eslint": "^8.
|
|
26
|
+
"typescript-eslint": "^8.49.0"
|
|
36
27
|
},
|
|
37
28
|
"license": "BSD-2-Clause-Patent",
|
|
38
29
|
"engines": {
|
|
39
|
-
"node": ">=22"
|
|
30
|
+
"node": ">=22.22.0"
|
|
31
|
+
},
|
|
32
|
+
"scripts": {
|
|
33
|
+
"format": "prettier --write . --log-level warn --ignore-path ../../.prettierignore --cache",
|
|
34
|
+
"format:check": "prettier --check . --ignore-path ../../.prettierignore --cache",
|
|
35
|
+
"lint": "eslint . --fix",
|
|
36
|
+
"lint:check": "eslint .",
|
|
37
|
+
"prepack": "tsc -p tsconfig.publish.json && ../../scripts/update-dist-exports.ts",
|
|
38
|
+
"snap": "tap",
|
|
39
|
+
"test": "tap",
|
|
40
|
+
"posttest": "tsc --noEmit",
|
|
41
|
+
"typecheck": "tsc --noEmit"
|
|
40
42
|
},
|
|
41
43
|
"tap": {
|
|
42
44
|
"extends": "../../tap-config.yaml"
|
|
43
45
|
},
|
|
44
46
|
"prettier": "../../.prettierrc.js",
|
|
45
|
-
"module": "./
|
|
47
|
+
"module": "./src/index.ts",
|
|
46
48
|
"type": "module",
|
|
47
49
|
"exports": {
|
|
48
50
|
"./package.json": "./package.json",
|
|
49
51
|
".": {
|
|
50
52
|
"import": {
|
|
51
|
-
"
|
|
52
|
-
"default": "./dist/esm/index.js"
|
|
53
|
+
"default": "./src/index.ts"
|
|
53
54
|
}
|
|
54
55
|
}
|
|
55
56
|
},
|
|
56
57
|
"files": [
|
|
57
58
|
"dist"
|
|
58
|
-
]
|
|
59
|
-
|
|
60
|
-
"format": "prettier --write . --log-level warn --ignore-path ../../.prettierignore --cache",
|
|
61
|
-
"format:check": "prettier --check . --ignore-path ../../.prettierignore --cache",
|
|
62
|
-
"lint": "eslint . --fix",
|
|
63
|
-
"lint:check": "eslint .",
|
|
64
|
-
"snap": "tap",
|
|
65
|
-
"test": "tap",
|
|
66
|
-
"posttest": "tsc --noEmit",
|
|
67
|
-
"tshy": "tshy",
|
|
68
|
-
"typecheck": "tsc --noEmit"
|
|
69
|
-
}
|
|
70
|
-
}
|
|
59
|
+
]
|
|
60
|
+
}
|
package/dist/esm/index.d.ts
DELETED
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import type { RollbackRemove } from '@vltpkg/rollback-remove';
|
|
2
|
-
export { findCmdShim, findCmdShimIfExists, readCmdShim, readCmdShimIfExists, } from './read.ts';
|
|
3
|
-
export declare const cmdShimIfExists: (from: string, to: string, remover: RollbackRemove) => Promise<void>;
|
|
4
|
-
export declare const cmdShim: (from: string, to: string, remover: RollbackRemove) => Promise<void>;
|
|
5
|
-
//# sourceMappingURL=index.d.ts.map
|
package/dist/esm/index.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAG7D,OAAO,EACL,WAAW,EACX,mBAAmB,EACnB,WAAW,EACX,mBAAmB,GACpB,MAAM,WAAW,CAAA;AAKlB,eAAO,MAAM,eAAe,SACpB,MAAM,MACR,MAAM,WACD,cAAc,kBAQxB,CAAA;AAED,eAAO,MAAM,OAAO,SACZ,MAAM,MACR,MAAM,WACD,cAAc,kBAYxB,CAAA"}
|
package/dist/esm/index.js
DELETED
|
@@ -1,192 +0,0 @@
|
|
|
1
|
-
// On windows, create a .cmd file.
|
|
2
|
-
// Read the #! in the file to see what it uses. The vast majority
|
|
3
|
-
// of the time, this will be either:
|
|
4
|
-
// "#!/usr/bin/env <prog> <args...>"
|
|
5
|
-
// or:
|
|
6
|
-
// "#!<prog> <args...>"
|
|
7
|
-
//
|
|
8
|
-
// Write a binroot/pkg.bin + ".cmd" file that has this line in it:
|
|
9
|
-
// @<prog> <args...> %dp0%<target> %*
|
|
10
|
-
import { chmod, mkdir, readFile, stat, writeFile, } from 'node:fs/promises';
|
|
11
|
-
import { error } from '@vltpkg/error-cause';
|
|
12
|
-
import { dirname, relative } from 'node:path';
|
|
13
|
-
import { convertToSetCommands } from "./to-batch-syntax.js";
|
|
14
|
-
export { findCmdShim, findCmdShimIfExists, readCmdShim, readCmdShimIfExists, } from "./read.js";
|
|
15
|
-
const shebangExpr = /^#!\s*(?:\/usr\/bin\/env\s+(?:-S\s+)?((?:[^ \t=]+=[^ \t=]+\s+)*))?([^ \t]+)(.*)$/;
|
|
16
|
-
export const cmdShimIfExists = async (from, to, remover) => {
|
|
17
|
-
try {
|
|
18
|
-
await stat(from);
|
|
19
|
-
}
|
|
20
|
-
catch {
|
|
21
|
-
return;
|
|
22
|
-
}
|
|
23
|
-
await writeShim(from, to, remover);
|
|
24
|
-
};
|
|
25
|
-
export const cmdShim = async (from, to, remover) => {
|
|
26
|
-
try {
|
|
27
|
-
await stat(from);
|
|
28
|
-
await writeShim(from, to, remover);
|
|
29
|
-
}
|
|
30
|
-
catch (er) {
|
|
31
|
-
throw error('Could not shim to executable file', {
|
|
32
|
-
path: from,
|
|
33
|
-
target: to,
|
|
34
|
-
cause: er,
|
|
35
|
-
});
|
|
36
|
-
}
|
|
37
|
-
};
|
|
38
|
-
const writeShim = async (from, to, remover) => {
|
|
39
|
-
await Promise.all([
|
|
40
|
-
remover.rm(to),
|
|
41
|
-
remover.rm(to + '.cmd'),
|
|
42
|
-
remover.rm(to + '.ps1'),
|
|
43
|
-
remover.rm(to + '.pwsh'),
|
|
44
|
-
]);
|
|
45
|
-
// make a cmd file and a sh script
|
|
46
|
-
// First, check if the bin is a #! of some sort.
|
|
47
|
-
// If not, then assume it's something that'll be compiled, or some other
|
|
48
|
-
// sort of script, and just call it directly.
|
|
49
|
-
await mkdir(dirname(to), { recursive: true });
|
|
50
|
-
const data = await readFile(from, 'utf8').catch(() => '');
|
|
51
|
-
if (!data) {
|
|
52
|
-
return await writeShim_(from, to);
|
|
53
|
-
}
|
|
54
|
-
const firstLine = data.trim().split(/\r*\n/)[0];
|
|
55
|
-
const shebang = firstLine?.match(shebangExpr) ?? undefined;
|
|
56
|
-
return writeShim_(from, to, shebang?.[2], shebang?.[3], shebang?.[1]);
|
|
57
|
-
};
|
|
58
|
-
const writeShim_ = async (from, to, prog, args, variables) => {
|
|
59
|
-
let shTarget = relative(dirname(to), from);
|
|
60
|
-
let target = shTarget.split('/').join('\\');
|
|
61
|
-
let longProg;
|
|
62
|
-
let shProg = prog?.split('\\').join('/');
|
|
63
|
-
let shLongProg;
|
|
64
|
-
let pwshProg = shProg && `"${shProg}$exe"`;
|
|
65
|
-
let pwshLongProg;
|
|
66
|
-
shTarget = shTarget.split('\\').join('/');
|
|
67
|
-
args = args || '';
|
|
68
|
-
variables = variables || '';
|
|
69
|
-
if (!prog) {
|
|
70
|
-
prog = `"%dp0%\\${target}"`;
|
|
71
|
-
shProg = `"$basedir/${shTarget}"`;
|
|
72
|
-
pwshProg = shProg;
|
|
73
|
-
args = '';
|
|
74
|
-
target = '';
|
|
75
|
-
shTarget = '';
|
|
76
|
-
}
|
|
77
|
-
else {
|
|
78
|
-
longProg = `"%dp0%\\${prog}.exe"`;
|
|
79
|
-
shLongProg = `"$basedir/${prog}"`;
|
|
80
|
-
pwshLongProg = `"$basedir/${prog}$exe"`;
|
|
81
|
-
target = `"%dp0%\\${target}"`;
|
|
82
|
-
shTarget = `"$basedir/${shTarget}"`;
|
|
83
|
-
}
|
|
84
|
-
// Subroutine trick to fix https://github.com/npm/cmd-shim/issues/10
|
|
85
|
-
// and https://github.com/npm/cli/issues/969
|
|
86
|
-
const head = '@ECHO off\r\n' +
|
|
87
|
-
'GOTO start\r\n' +
|
|
88
|
-
':find_dp0\r\n' +
|
|
89
|
-
'SET dp0=%~dp0\r\n' +
|
|
90
|
-
'EXIT /b\r\n' +
|
|
91
|
-
':start\r\n' +
|
|
92
|
-
'SETLOCAL\r\n' +
|
|
93
|
-
'CALL :find_dp0\r\n';
|
|
94
|
-
let cmd;
|
|
95
|
-
if (longProg) {
|
|
96
|
-
/* c8 ignore next */
|
|
97
|
-
shLongProg = (shLongProg ?? '').trim();
|
|
98
|
-
args = args.trim();
|
|
99
|
-
const variablesBatch = convertToSetCommands(variables);
|
|
100
|
-
cmd =
|
|
101
|
-
`${head}${variablesBatch}\r\n` +
|
|
102
|
-
`IF EXIST ${longProg} (\r\n` +
|
|
103
|
-
` SET "_prog=${longProg.replace(/(^")|("$)/g, '')}"\r\n` +
|
|
104
|
-
') ELSE (\r\n' +
|
|
105
|
-
` SET "_prog=${prog.replace(/(^")|("$)/g, '')}"\r\n` +
|
|
106
|
-
' SET PATHEXT=%PATHEXT:;.JS;=;%\r\n' +
|
|
107
|
-
')\r\n' +
|
|
108
|
-
'\r\n' +
|
|
109
|
-
// prevent "Terminate Batch Job? (Y/n)" message
|
|
110
|
-
// https://github.com/npm/cli/issues/969#issuecomment-737496588
|
|
111
|
-
'endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & ' +
|
|
112
|
-
`"%_prog%" ${args} ${target} %*\r\n`;
|
|
113
|
-
}
|
|
114
|
-
else {
|
|
115
|
-
cmd = `${head}${prog} ${args} ${target} %*\r\n`;
|
|
116
|
-
}
|
|
117
|
-
let sh = '#!/bin/sh\n' +
|
|
118
|
-
`basedir=$(dirname "$(echo "$0" | sed -e 's,\\\\,/,g')")\n` +
|
|
119
|
-
'\n' +
|
|
120
|
-
'case `uname` in\n' +
|
|
121
|
-
' *CYGWIN*|*MINGW*|*MSYS*)\n' +
|
|
122
|
-
' if command -v cygpath > /dev/null 2>&1; then\n' +
|
|
123
|
-
' basedir=`cygpath -w "$basedir"`\n' +
|
|
124
|
-
' fi\n' +
|
|
125
|
-
' ;;\n' +
|
|
126
|
-
'esac\n' +
|
|
127
|
-
'\n';
|
|
128
|
-
if (shLongProg) {
|
|
129
|
-
sh +=
|
|
130
|
-
`if [ -x ${shLongProg} ]; then\n` +
|
|
131
|
-
` exec ${variables}${shLongProg} ${args} ${shTarget} "$@"\n` +
|
|
132
|
-
'else \n' +
|
|
133
|
-
` exec ${variables}${shProg} ${args} ${shTarget} "$@"\n` +
|
|
134
|
-
'fi\n';
|
|
135
|
-
}
|
|
136
|
-
else {
|
|
137
|
-
sh += `exec ${shProg} ${args} ${shTarget} "$@"\n`;
|
|
138
|
-
}
|
|
139
|
-
let pwsh = '#!/usr/bin/env pwsh\n' +
|
|
140
|
-
'$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent\n' +
|
|
141
|
-
'\n' +
|
|
142
|
-
'$exe=""\n' +
|
|
143
|
-
'if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {\n' +
|
|
144
|
-
' # Fix case when both the Windows and Linux builds of Node\n' +
|
|
145
|
-
' # are installed in the same directory\n' +
|
|
146
|
-
' $exe=".exe"\n' +
|
|
147
|
-
'}\n';
|
|
148
|
-
if (shLongProg) {
|
|
149
|
-
pwsh +=
|
|
150
|
-
'$ret=0\n' +
|
|
151
|
-
`if (Test-Path ${pwshLongProg}) {\n` +
|
|
152
|
-
' # Support pipeline input\n' +
|
|
153
|
-
' if ($MyInvocation.ExpectingInput) {\n' +
|
|
154
|
-
` $input | & ${pwshLongProg} ${args} ${shTarget} $args\n` +
|
|
155
|
-
' } else {\n' +
|
|
156
|
-
` & ${pwshLongProg} ${args} ${shTarget} $args\n` +
|
|
157
|
-
' }\n' +
|
|
158
|
-
' $ret=$LASTEXITCODE\n' +
|
|
159
|
-
'} else {\n' +
|
|
160
|
-
' # Support pipeline input\n' +
|
|
161
|
-
' if ($MyInvocation.ExpectingInput) {\n' +
|
|
162
|
-
` $input | & ${pwshProg} ${args} ${shTarget} $args\n` +
|
|
163
|
-
' } else {\n' +
|
|
164
|
-
` & ${pwshProg} ${args} ${shTarget} $args\n` +
|
|
165
|
-
' }\n' +
|
|
166
|
-
' $ret=$LASTEXITCODE\n' +
|
|
167
|
-
'}\n' +
|
|
168
|
-
'exit $ret\n';
|
|
169
|
-
}
|
|
170
|
-
else {
|
|
171
|
-
pwsh +=
|
|
172
|
-
'# Support pipeline input\n' +
|
|
173
|
-
'if ($MyInvocation.ExpectingInput) {\n' +
|
|
174
|
-
` $input | & ${pwshProg} ${args} ${shTarget} $args\n` +
|
|
175
|
-
'} else {\n' +
|
|
176
|
-
` & ${pwshProg} ${args} ${shTarget} $args\n` +
|
|
177
|
-
'}\n' +
|
|
178
|
-
'exit $LASTEXITCODE\n';
|
|
179
|
-
}
|
|
180
|
-
await Promise.all([
|
|
181
|
-
writeFile(to + '.cmd', cmd, 'utf8'),
|
|
182
|
-
writeFile(to + '.ps1', pwsh, 'utf8'),
|
|
183
|
-
writeFile(to, sh, 'utf8'),
|
|
184
|
-
]);
|
|
185
|
-
await chmodShim(to);
|
|
186
|
-
};
|
|
187
|
-
const chmodShim = async (to) => await Promise.all([
|
|
188
|
-
chmod(to, 0o755),
|
|
189
|
-
chmod(to + '.cmd', 0o755),
|
|
190
|
-
chmod(to + '.ps1', 0o755),
|
|
191
|
-
]);
|
|
192
|
-
//# sourceMappingURL=index.js.map
|
package/dist/esm/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["// On windows, create a .cmd file.\n// Read the #! in the file to see what it uses. The vast majority\n// of the time, this will be either:\n// \"#!/usr/bin/env <prog> <args...>\"\n// or:\n// \"#!<prog> <args...>\"\n//\n// Write a binroot/pkg.bin + \".cmd\" file that has this line in it:\n// @<prog> <args...> %dp0%<target> %*\n\nimport {\n chmod,\n mkdir,\n readFile,\n stat,\n writeFile,\n} from 'node:fs/promises'\n\nimport { error } from '@vltpkg/error-cause'\nimport type { RollbackRemove } from '@vltpkg/rollback-remove'\nimport { dirname, relative } from 'node:path'\nimport { convertToSetCommands } from './to-batch-syntax.ts'\nexport {\n findCmdShim,\n findCmdShimIfExists,\n readCmdShim,\n readCmdShimIfExists,\n} from './read.ts'\n\nconst shebangExpr =\n /^#!\\s*(?:\\/usr\\/bin\\/env\\s+(?:-S\\s+)?((?:[^ \\t=]+=[^ \\t=]+\\s+)*))?([^ \\t]+)(.*)$/\n\nexport const cmdShimIfExists = async (\n from: string,\n to: string,\n remover: RollbackRemove,\n) => {\n try {\n await stat(from)\n } catch {\n return\n }\n await writeShim(from, to, remover)\n}\n\nexport const cmdShim = async (\n from: string,\n to: string,\n remover: RollbackRemove,\n) => {\n try {\n await stat(from)\n await writeShim(from, to, remover)\n } catch (er) {\n throw error('Could not shim to executable file', {\n path: from,\n target: to,\n cause: er,\n })\n }\n}\n\nconst writeShim = async (\n from: string,\n to: string,\n remover: RollbackRemove,\n) => {\n await Promise.all([\n remover.rm(to),\n remover.rm(to + '.cmd'),\n remover.rm(to + '.ps1'),\n remover.rm(to + '.pwsh'),\n ])\n // make a cmd file and a sh script\n // First, check if the bin is a #! of some sort.\n // If not, then assume it's something that'll be compiled, or some other\n // sort of script, and just call it directly.\n await mkdir(dirname(to), { recursive: true })\n const data = await readFile(from, 'utf8').catch(() => '')\n if (!data) {\n return await writeShim_(from, to)\n }\n const firstLine = data.trim().split(/\\r*\\n/)[0]\n const shebang = firstLine?.match(shebangExpr) ?? undefined\n return writeShim_(\n from,\n to,\n shebang?.[2],\n shebang?.[3],\n shebang?.[1],\n )\n}\n\nconst writeShim_ = async (\n from: string,\n to: string,\n prog?: string,\n args?: string,\n variables?: string,\n) => {\n let shTarget = relative(dirname(to), from)\n let target = shTarget.split('/').join('\\\\')\n let longProg\n let shProg = prog?.split('\\\\').join('/')\n let shLongProg\n let pwshProg = shProg && `\"${shProg}$exe\"`\n let pwshLongProg\n shTarget = shTarget.split('\\\\').join('/')\n args = args || ''\n variables = variables || ''\n if (!prog) {\n prog = `\"%dp0%\\\\${target}\"`\n shProg = `\"$basedir/${shTarget}\"`\n pwshProg = shProg\n args = ''\n target = ''\n shTarget = ''\n } else {\n longProg = `\"%dp0%\\\\${prog}.exe\"`\n shLongProg = `\"$basedir/${prog}\"`\n pwshLongProg = `\"$basedir/${prog}$exe\"`\n target = `\"%dp0%\\\\${target}\"`\n shTarget = `\"$basedir/${shTarget}\"`\n }\n\n // Subroutine trick to fix https://github.com/npm/cmd-shim/issues/10\n // and https://github.com/npm/cli/issues/969\n const head =\n '@ECHO off\\r\\n' +\n 'GOTO start\\r\\n' +\n ':find_dp0\\r\\n' +\n 'SET dp0=%~dp0\\r\\n' +\n 'EXIT /b\\r\\n' +\n ':start\\r\\n' +\n 'SETLOCAL\\r\\n' +\n 'CALL :find_dp0\\r\\n'\n\n let cmd\n if (longProg) {\n /* c8 ignore next */\n shLongProg = (shLongProg ?? '').trim()\n args = args.trim()\n const variablesBatch = convertToSetCommands(variables)\n cmd =\n `${head}${variablesBatch}\\r\\n` +\n `IF EXIST ${longProg} (\\r\\n` +\n ` SET \"_prog=${longProg.replace(/(^\")|(\"$)/g, '')}\"\\r\\n` +\n ') ELSE (\\r\\n' +\n ` SET \"_prog=${prog.replace(/(^\")|(\"$)/g, '')}\"\\r\\n` +\n ' SET PATHEXT=%PATHEXT:;.JS;=;%\\r\\n' +\n ')\\r\\n' +\n '\\r\\n' +\n // prevent \"Terminate Batch Job? (Y/n)\" message\n // https://github.com/npm/cli/issues/969#issuecomment-737496588\n 'endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & ' +\n `\"%_prog%\" ${args} ${target} %*\\r\\n`\n } else {\n cmd = `${head}${prog} ${args} ${target} %*\\r\\n`\n }\n\n let sh =\n '#!/bin/sh\\n' +\n `basedir=$(dirname \"$(echo \"$0\" | sed -e 's,\\\\\\\\,/,g')\")\\n` +\n '\\n' +\n 'case `uname` in\\n' +\n ' *CYGWIN*|*MINGW*|*MSYS*)\\n' +\n ' if command -v cygpath > /dev/null 2>&1; then\\n' +\n ' basedir=`cygpath -w \"$basedir\"`\\n' +\n ' fi\\n' +\n ' ;;\\n' +\n 'esac\\n' +\n '\\n'\n\n if (shLongProg) {\n sh +=\n `if [ -x ${shLongProg} ]; then\\n` +\n ` exec ${variables}${shLongProg} ${args} ${shTarget} \"$@\"\\n` +\n 'else \\n' +\n ` exec ${variables}${shProg} ${args} ${shTarget} \"$@\"\\n` +\n 'fi\\n'\n } else {\n sh += `exec ${shProg} ${args} ${shTarget} \"$@\"\\n`\n }\n\n let pwsh =\n '#!/usr/bin/env pwsh\\n' +\n '$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent\\n' +\n '\\n' +\n '$exe=\"\"\\n' +\n 'if ($PSVersionTable.PSVersion -lt \"6.0\" -or $IsWindows) {\\n' +\n ' # Fix case when both the Windows and Linux builds of Node\\n' +\n ' # are installed in the same directory\\n' +\n ' $exe=\".exe\"\\n' +\n '}\\n'\n\n if (shLongProg) {\n pwsh +=\n '$ret=0\\n' +\n `if (Test-Path ${pwshLongProg}) {\\n` +\n ' # Support pipeline input\\n' +\n ' if ($MyInvocation.ExpectingInput) {\\n' +\n ` $input | & ${pwshLongProg} ${args} ${shTarget} $args\\n` +\n ' } else {\\n' +\n ` & ${pwshLongProg} ${args} ${shTarget} $args\\n` +\n ' }\\n' +\n ' $ret=$LASTEXITCODE\\n' +\n '} else {\\n' +\n ' # Support pipeline input\\n' +\n ' if ($MyInvocation.ExpectingInput) {\\n' +\n ` $input | & ${pwshProg} ${args} ${shTarget} $args\\n` +\n ' } else {\\n' +\n ` & ${pwshProg} ${args} ${shTarget} $args\\n` +\n ' }\\n' +\n ' $ret=$LASTEXITCODE\\n' +\n '}\\n' +\n 'exit $ret\\n'\n } else {\n pwsh +=\n '# Support pipeline input\\n' +\n 'if ($MyInvocation.ExpectingInput) {\\n' +\n ` $input | & ${pwshProg} ${args} ${shTarget} $args\\n` +\n '} else {\\n' +\n ` & ${pwshProg} ${args} ${shTarget} $args\\n` +\n '}\\n' +\n 'exit $LASTEXITCODE\\n'\n }\n\n await Promise.all([\n writeFile(to + '.cmd', cmd, 'utf8'),\n writeFile(to + '.ps1', pwsh, 'utf8'),\n writeFile(to, sh, 'utf8'),\n ])\n await chmodShim(to)\n}\n\nconst chmodShim = async (to: string) =>\n await Promise.all([\n chmod(to, 0o755),\n chmod(to + '.cmd', 0o755),\n chmod(to + '.ps1', 0o755),\n ])\n"]}
|
package/dist/esm/package.json
DELETED
package/dist/esm/paths.d.ts
DELETED
package/dist/esm/paths.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/paths.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,KAAK,SAEP,MAAM,aAMW,CAAA"}
|
package/dist/esm/paths.js
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
// On non-windows platforms, we only look for symlinks, not shims
|
|
2
|
-
/* c8 ignore start */
|
|
3
|
-
export const paths = process.platform === 'win32' ?
|
|
4
|
-
(path) => [
|
|
5
|
-
path + '.cmd',
|
|
6
|
-
path + '.ps1',
|
|
7
|
-
path,
|
|
8
|
-
path + '.pwsh',
|
|
9
|
-
]
|
|
10
|
-
: (path) => [path];
|
|
11
|
-
/* c8 ignore stop */
|
|
12
|
-
//# sourceMappingURL=paths.js.map
|
package/dist/esm/paths.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/paths.ts"],"names":[],"mappings":"AAAA,iEAAiE;AACjE,qBAAqB;AACrB,MAAM,CAAC,MAAM,KAAK,GAChB,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC;IAC5B,CAAC,IAAY,EAAE,EAAE,CAAC;QAChB,IAAI,GAAG,MAAM;QACb,IAAI,GAAG,MAAM;QACb,IAAI;QACJ,IAAI,GAAG,OAAO;KACf;IACH,CAAC,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAA;AAC5B,oBAAoB","sourcesContent":["// On non-windows platforms, we only look for symlinks, not shims\n/* c8 ignore start */\nexport const paths =\n process.platform === 'win32' ?\n (path: string) => [\n path + '.cmd',\n path + '.ps1',\n path,\n path + '.pwsh',\n ]\n : (path: string) => [path]\n/* c8 ignore stop */\n"]}
|
package/dist/esm/read.d.ts
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Find a matching cmd, cygwin, powershell, or symlink executable,
|
|
3
|
-
* and return the matching file and the target it references in a
|
|
4
|
-
* `[string,string]` tuple if found, or undefined if not.
|
|
5
|
-
*/
|
|
6
|
-
export declare const findCmdShimIfExists: (path: string) => Promise<undefined | [string, string]>;
|
|
7
|
-
/**
|
|
8
|
-
* Find a matching cmd, cygwin, powershell, or symlink executable,
|
|
9
|
-
* and return the matching file and the target it references in a
|
|
10
|
-
* `[string,string]` tuple if found, or throw if not found.
|
|
11
|
-
*/
|
|
12
|
-
export declare const findCmdShim: (path: string) => Promise<[string, string]>;
|
|
13
|
-
/**
|
|
14
|
-
* Read the specified executable shim if it exists, returning the
|
|
15
|
-
* target it references. Return undefined if it does not exist
|
|
16
|
-
* or cannot be dereferenced.
|
|
17
|
-
*/
|
|
18
|
-
export declare const readCmdShimIfExists: (path: string) => Promise<string | undefined>;
|
|
19
|
-
/**
|
|
20
|
-
* Read the specified executable shim, returning the target
|
|
21
|
-
* it references. Raise an error if it does not exist or cannot be read.
|
|
22
|
-
*/
|
|
23
|
-
export declare const readCmdShim: (path: string) => Promise<string>;
|
|
24
|
-
//# sourceMappingURL=read.d.ts.map
|
package/dist/esm/read.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"read.d.ts","sourceRoot":"","sources":["../../src/read.ts"],"names":[],"mappings":"AAoCA;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,SACxB,MAAM,KACX,OAAO,CAAC,SAAS,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAMtC,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,WAAW,SAAgB,MAAM,8BAQ7C,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,SAAgB,MAAM,gCAUrD,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,WAAW,SAAgB,MAAM,oBAmB7C,CAAA"}
|
package/dist/esm/read.js
DELETED
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
import { error } from '@vltpkg/error-cause';
|
|
2
|
-
import { lstat, readFile, readlink } from 'node:fs/promises';
|
|
3
|
-
import { dirname, resolve } from 'node:path';
|
|
4
|
-
import { paths } from "./paths.js";
|
|
5
|
-
const extractPath = (path, cmdshimContents) => {
|
|
6
|
-
if (/\.cmd$/i.test(path)) {
|
|
7
|
-
return extractPathFromCmd(cmdshimContents);
|
|
8
|
-
}
|
|
9
|
-
else if (/\.(ps1|pwsh)$/i.test(path)) {
|
|
10
|
-
return extractPathFromPowershell(cmdshimContents);
|
|
11
|
-
}
|
|
12
|
-
else {
|
|
13
|
-
return extractPathFromCygwin(cmdshimContents);
|
|
14
|
-
}
|
|
15
|
-
};
|
|
16
|
-
const extractPathFromPowershell = (cmdshimContents) => {
|
|
17
|
-
const matches = /"[$]basedir\/([^"]+?)"\s+[$]args/.exec(cmdshimContents);
|
|
18
|
-
return matches?.[1]?.replace(/\\/g, '/');
|
|
19
|
-
};
|
|
20
|
-
const extractPathFromCmd = (cmdshimContents) => {
|
|
21
|
-
const matches = /"%(?:~dp0|dp0%)\\([^"]+?)"\s+%[*]/.exec(cmdshimContents);
|
|
22
|
-
return matches?.[1]?.replace(/\\/g, '/');
|
|
23
|
-
};
|
|
24
|
-
const extractPathFromCygwin = (cmdshimContents) => {
|
|
25
|
-
const matches = /"[$]basedir\/([^"]+?)"\s+"[$]@"/.exec(cmdshimContents);
|
|
26
|
-
return matches?.[1]?.replace(/\\/g, '/');
|
|
27
|
-
};
|
|
28
|
-
/**
|
|
29
|
-
* Find a matching cmd, cygwin, powershell, or symlink executable,
|
|
30
|
-
* and return the matching file and the target it references in a
|
|
31
|
-
* `[string,string]` tuple if found, or undefined if not.
|
|
32
|
-
*/
|
|
33
|
-
export const findCmdShimIfExists = async (path) => {
|
|
34
|
-
path = path.replace(/\.(cmd|pwsh|ps1)$/i, '');
|
|
35
|
-
for (const p of paths(path)) {
|
|
36
|
-
const result = await readCmdShimIfExists(p);
|
|
37
|
-
if (result)
|
|
38
|
-
return [p, result];
|
|
39
|
-
}
|
|
40
|
-
};
|
|
41
|
-
/**
|
|
42
|
-
* Find a matching cmd, cygwin, powershell, or symlink executable,
|
|
43
|
-
* and return the matching file and the target it references in a
|
|
44
|
-
* `[string,string]` tuple if found, or throw if not found.
|
|
45
|
-
*/
|
|
46
|
-
export const findCmdShim = async (path) => {
|
|
47
|
-
const result = await findCmdShimIfExists(path);
|
|
48
|
-
if (result)
|
|
49
|
-
return result;
|
|
50
|
-
throw error('Could not find matching cmd shim', { path }, findCmdShim);
|
|
51
|
-
};
|
|
52
|
-
/**
|
|
53
|
-
* Read the specified executable shim if it exists, returning the
|
|
54
|
-
* target it references. Return undefined if it does not exist
|
|
55
|
-
* or cannot be dereferenced.
|
|
56
|
-
*/
|
|
57
|
-
export const readCmdShimIfExists = async (path) => {
|
|
58
|
-
try {
|
|
59
|
-
const st = await lstat(path);
|
|
60
|
-
if (st.isSymbolicLink()) {
|
|
61
|
-
return resolve(dirname(path), await readlink(path));
|
|
62
|
-
}
|
|
63
|
-
const contents = await readFile(path);
|
|
64
|
-
const destination = extractPath(path, contents.toString());
|
|
65
|
-
if (destination)
|
|
66
|
-
return resolve(dirname(path), destination);
|
|
67
|
-
}
|
|
68
|
-
catch { }
|
|
69
|
-
};
|
|
70
|
-
/**
|
|
71
|
-
* Read the specified executable shim, returning the target
|
|
72
|
-
* it references. Raise an error if it does not exist or cannot be read.
|
|
73
|
-
*/
|
|
74
|
-
export const readCmdShim = async (path) => {
|
|
75
|
-
try {
|
|
76
|
-
const st = await lstat(path);
|
|
77
|
-
if (st.isSymbolicLink()) {
|
|
78
|
-
return resolve(dirname(path), await readlink(path));
|
|
79
|
-
}
|
|
80
|
-
// create a new error to capture the stack trace from this point,
|
|
81
|
-
// instead of getting some opaque stack into node's internals
|
|
82
|
-
const contents = await readFile(path);
|
|
83
|
-
const destination = extractPath(path, contents.toString());
|
|
84
|
-
if (destination)
|
|
85
|
-
return resolve(dirname(path), destination);
|
|
86
|
-
}
|
|
87
|
-
catch (er) {
|
|
88
|
-
throw error('Could not read shim', { path, cause: er }, readCmdShim);
|
|
89
|
-
}
|
|
90
|
-
throw error('Not a valid cmd shim', { path }, readCmdShim);
|
|
91
|
-
};
|
|
92
|
-
//# sourceMappingURL=read.js.map
|
package/dist/esm/read.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"read.js","sourceRoot":"","sources":["../../src/read.ts"],"names":[],"mappings":"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","sourcesContent":["import { error } from '@vltpkg/error-cause'\nimport { lstat, readFile, readlink } from 'node:fs/promises'\nimport { dirname, resolve } from 'node:path'\nimport { paths } from './paths.ts'\n\nconst extractPath = (path: string, cmdshimContents: string) => {\n if (/\\.cmd$/i.test(path)) {\n return extractPathFromCmd(cmdshimContents)\n } else if (/\\.(ps1|pwsh)$/i.test(path)) {\n return extractPathFromPowershell(cmdshimContents)\n } else {\n return extractPathFromCygwin(cmdshimContents)\n }\n}\n\nconst extractPathFromPowershell = (cmdshimContents: string) => {\n const matches = /\"[$]basedir\\/([^\"]+?)\"\\s+[$]args/.exec(\n cmdshimContents,\n )\n return matches?.[1]?.replace(/\\\\/g, '/')\n}\n\nconst extractPathFromCmd = (cmdshimContents: string) => {\n const matches = /\"%(?:~dp0|dp0%)\\\\([^\"]+?)\"\\s+%[*]/.exec(\n cmdshimContents,\n )\n return matches?.[1]?.replace(/\\\\/g, '/')\n}\n\nconst extractPathFromCygwin = (cmdshimContents: string) => {\n const matches = /\"[$]basedir\\/([^\"]+?)\"\\s+\"[$]@\"/.exec(\n cmdshimContents,\n )\n return matches?.[1]?.replace(/\\\\/g, '/')\n}\n\n/**\n * Find a matching cmd, cygwin, powershell, or symlink executable,\n * and return the matching file and the target it references in a\n * `[string,string]` tuple if found, or undefined if not.\n */\nexport const findCmdShimIfExists = async (\n path: string,\n): Promise<undefined | [string, string]> => {\n path = path.replace(/\\.(cmd|pwsh|ps1)$/i, '')\n for (const p of paths(path)) {\n const result = await readCmdShimIfExists(p)\n if (result) return [p, result]\n }\n}\n\n/**\n * Find a matching cmd, cygwin, powershell, or symlink executable,\n * and return the matching file and the target it references in a\n * `[string,string]` tuple if found, or throw if not found.\n */\nexport const findCmdShim = async (path: string) => {\n const result = await findCmdShimIfExists(path)\n if (result) return result\n throw error(\n 'Could not find matching cmd shim',\n { path },\n findCmdShim,\n )\n}\n\n/**\n * Read the specified executable shim if it exists, returning the\n * target it references. Return undefined if it does not exist\n * or cannot be dereferenced.\n */\nexport const readCmdShimIfExists = async (path: string) => {\n try {\n const st = await lstat(path)\n if (st.isSymbolicLink()) {\n return resolve(dirname(path), await readlink(path))\n }\n const contents = await readFile(path)\n const destination = extractPath(path, contents.toString())\n if (destination) return resolve(dirname(path), destination)\n } catch {}\n}\n\n/**\n * Read the specified executable shim, returning the target\n * it references. Raise an error if it does not exist or cannot be read.\n */\nexport const readCmdShim = async (path: string) => {\n try {\n const st = await lstat(path)\n if (st.isSymbolicLink()) {\n return resolve(dirname(path), await readlink(path))\n }\n // create a new error to capture the stack trace from this point,\n // instead of getting some opaque stack into node's internals\n const contents = await readFile(path)\n const destination = extractPath(path, contents.toString())\n if (destination) return resolve(dirname(path), destination)\n } catch (er) {\n throw error(\n 'Could not read shim',\n { path, cause: er },\n readCmdShim,\n )\n }\n throw error('Not a valid cmd shim', { path }, readCmdShim)\n}\n"]}
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
export declare const convertToSetCommand: (key: string, value: string) => string;
|
|
2
|
-
export declare const convertToSetCommands: (variableString: string) => string;
|
|
3
|
-
export declare const replaceDollarWithPercentPair: (value: string) => string;
|
|
4
|
-
//# sourceMappingURL=to-batch-syntax.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"to-batch-syntax.d.ts","sourceRoot":"","sources":["../../src/to-batch-syntax.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,mBAAmB,QAAS,MAAM,SAAS,MAAM,WACd,CAAA;AAiBhD,eAAO,MAAM,oBAAoB,mBAAoB,MAAM,WAG9C,CAAA;AAEb,eAAO,MAAM,4BAA4B,UAAW,MAAM,WAezD,CAAA"}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
export const convertToSetCommand = (key, value) => convertToSetCommand_(key.trim(), value.trim());
|
|
2
|
-
const convertToSetCommand_ = (key, value) => key && value ?
|
|
3
|
-
`@SET ${key}=${replaceDollarWithPercentPair(value)}\r\n`
|
|
4
|
-
: '';
|
|
5
|
-
const extractVariableValuePairs = (declarations) => declarations.reduce((pairs, declaration) => {
|
|
6
|
-
const [key = '', val = ''] = declaration.split('=');
|
|
7
|
-
pairs[key] = val;
|
|
8
|
-
return pairs;
|
|
9
|
-
}, {});
|
|
10
|
-
export const convertToSetCommands = (variableString) => Object.entries(extractVariableValuePairs(variableString.split(' ')))
|
|
11
|
-
.map(([key, val]) => convertToSetCommand(key, val))
|
|
12
|
-
.join('');
|
|
13
|
-
export const replaceDollarWithPercentPair = (value) => {
|
|
14
|
-
const dollarExpressions = /\$\{?([^$@#?\- \t{}:]+)\}?/g;
|
|
15
|
-
let result = '';
|
|
16
|
-
let startIndex = 0;
|
|
17
|
-
do {
|
|
18
|
-
const match = dollarExpressions.exec(value);
|
|
19
|
-
if (match) {
|
|
20
|
-
const betweenMatches = value.substring(startIndex, match.index) || '';
|
|
21
|
-
result += betweenMatches + '%' + String(match[1]) + '%';
|
|
22
|
-
startIndex = dollarExpressions.lastIndex;
|
|
23
|
-
}
|
|
24
|
-
} while (dollarExpressions.lastIndex > 0);
|
|
25
|
-
result += value.slice(startIndex);
|
|
26
|
-
return result;
|
|
27
|
-
};
|
|
28
|
-
//# sourceMappingURL=to-batch-syntax.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"to-batch-syntax.js","sourceRoot":"","sources":["../../src/to-batch-syntax.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,GAAW,EAAE,KAAa,EAAE,EAAE,CAChE,oBAAoB,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAA;AAEhD,MAAM,oBAAoB,GAAG,CAAC,GAAW,EAAE,KAAa,EAAE,EAAE,CAC1D,GAAG,IAAI,KAAK,CAAC,CAAC;IACZ,QAAQ,GAAG,IAAI,4BAA4B,CAAC,KAAK,CAAC,MAAM;IAC1D,CAAC,CAAC,EAAE,CAAA;AAEN,MAAM,yBAAyB,GAAG,CAAC,YAAsB,EAAE,EAAE,CAC3D,YAAY,CAAC,MAAM,CACjB,CAAC,KAA6B,EAAE,WAAW,EAAE,EAAE;IAC7C,MAAM,CAAC,GAAG,GAAG,EAAE,EAAE,GAAG,GAAG,EAAE,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IACnD,KAAK,CAAC,GAAG,CAAC,GAAG,GAAG,CAAA;IAChB,OAAO,KAAK,CAAA;AACd,CAAC,EACD,EAAE,CACH,CAAA;AAEH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,cAAsB,EAAE,EAAE,CAC7D,MAAM,CAAC,OAAO,CAAC,yBAAyB,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;KACjE,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,mBAAmB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;KAClD,IAAI,CAAC,EAAE,CAAC,CAAA;AAEb,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,KAAa,EAAE,EAAE;IAC5D,MAAM,iBAAiB,GAAG,6BAA6B,CAAA;IACvD,IAAI,MAAM,GAAG,EAAE,CAAA;IACf,IAAI,UAAU,GAAG,CAAC,CAAA;IAClB,GAAG,CAAC;QACF,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAC3C,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,cAAc,GAClB,KAAK,CAAC,SAAS,CAAC,UAAU,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAA;YAChD,MAAM,IAAI,cAAc,GAAG,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAA;YACvD,UAAU,GAAG,iBAAiB,CAAC,SAAS,CAAA;QAC1C,CAAC;IACH,CAAC,QAAQ,iBAAiB,CAAC,SAAS,GAAG,CAAC,EAAC;IACzC,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;IACjC,OAAO,MAAM,CAAA;AACf,CAAC,CAAA","sourcesContent":["export const convertToSetCommand = (key: string, value: string) =>\n convertToSetCommand_(key.trim(), value.trim())\n\nconst convertToSetCommand_ = (key: string, value: string) =>\n key && value ?\n `@SET ${key}=${replaceDollarWithPercentPair(value)}\\r\\n`\n : ''\n\nconst extractVariableValuePairs = (declarations: string[]) =>\n declarations.reduce(\n (pairs: Record<string, string>, declaration) => {\n const [key = '', val = ''] = declaration.split('=')\n pairs[key] = val\n return pairs\n },\n {},\n )\n\nexport const convertToSetCommands = (variableString: string) =>\n Object.entries(extractVariableValuePairs(variableString.split(' ')))\n .map(([key, val]) => convertToSetCommand(key, val))\n .join('')\n\nexport const replaceDollarWithPercentPair = (value: string) => {\n const dollarExpressions = /\\$\\{?([^$@#?\\- \\t{}:]+)\\}?/g\n let result = ''\n let startIndex = 0\n do {\n const match = dollarExpressions.exec(value)\n if (match) {\n const betweenMatches =\n value.substring(startIndex, match.index) || ''\n result += betweenMatches + '%' + String(match[1]) + '%'\n startIndex = dollarExpressions.lastIndex\n }\n } while (dollarExpressions.lastIndex > 0)\n result += value.slice(startIndex)\n return result\n}\n"]}
|