@udondan/avanti 0.14.0 → 0.15.0
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 +14 -1
- package/dist/diff.d.ts.map +1 -1
- package/dist/diff.js +3 -2
- package/dist/diff.js.map +1 -1
- package/dist/processors/post.d.ts.map +1 -1
- package/dist/processors/post.js +3 -1
- package/dist/processors/post.js.map +1 -1
- package/dist/shell.d.ts +6 -0
- package/dist/shell.d.ts.map +1 -0
- package/dist/shell.js +76 -0
- package/dist/shell.js.map +1 -0
- package/dist/sources/exec.d.ts.map +1 -1
- package/dist/sources/exec.js +3 -1
- package/dist/sources/exec.js.map +1 -1
- package/dist/sources/local.d.ts.map +1 -1
- package/dist/sources/local.js +2 -5
- package/dist/sources/local.js.map +1 -1
- package/dist/variables.d.ts.map +1 -1
- package/dist/variables.js +38 -27
- package/dist/variables.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -689,7 +689,7 @@ Variables are resolved in every string field: target keys, `ref`, `exec` command
|
|
|
689
689
|
|
|
690
690
|
For `raw:` sources, variables are resolved in the content itself. For all other source types (`http`, `local`, `github`, `gitlab`, `exec`), variables are only resolved in the fields that locate the source (URL, path, command) — not in the fetched content. Use a `replace:` rule if you need to substitute values in fetched content.
|
|
691
691
|
|
|
692
|
-
**Shell safety in `exec:` and `post:`** — when a variable is substituted into an `exec:` command or a `post:` script, its value is automatically
|
|
692
|
+
**Shell safety in `exec:` and `post:`** — when a variable is substituted into an `exec:` command or a `post:` script, its value is automatically single-quoted. This means shell metacharacters (`;`, `&&`, `$(...)`, etc.) in the value are treated as literal data and are never executed. The surrounding command template itself is not quoted, so the static shell syntax you write is executed as usual. On Unix the script runs via `sh -c`; on Windows it runs via PowerShell (`-EncodedCommand`).
|
|
693
693
|
|
|
694
694
|
```yaml
|
|
695
695
|
variables:
|
|
@@ -702,6 +702,19 @@ files:
|
|
|
702
702
|
post: sed 's/$version/replaced/g' # expands to: sed 's/'\''1.0'\''/replaced/g'
|
|
703
703
|
```
|
|
704
704
|
|
|
705
|
+
**Escaping a literal `$`** — use `$$` to emit a literal `$` that is not treated as a variable reference. This is useful in `exec:` and `post:` scripts that contain shell or PowerShell syntax with `$`-prefixed identifiers (e.g. PowerShell built-ins like `$$true` or `$$null`):
|
|
706
|
+
|
|
707
|
+
```yaml
|
|
708
|
+
files:
|
|
709
|
+
out.txt:
|
|
710
|
+
src:
|
|
711
|
+
# On Windows exec: runs in PowerShell — $true is a PS built-in, needs $$
|
|
712
|
+
exec: "if ($$true) { Write-Output 'yes' }"
|
|
713
|
+
post: sed 's/$$HOME/redacted/g' # $HOME would be treated as an avanti variable
|
|
714
|
+
```
|
|
715
|
+
|
|
716
|
+
`$$` produces a single `$` after substitution. `$$$name` produces `$` followed by the value of `name`.
|
|
717
|
+
|
|
705
718
|
**Environment variables** use the `$env:NAME` form:
|
|
706
719
|
|
|
707
720
|
```yaml
|
package/dist/diff.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../src/diff.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAGpC,MAAM,WAAW,QAAQ;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,EAAE,OAAO,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,QAAQ,CAc9D;AAED,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,QAAQ,CAgB5E;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAajD;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,IAAI,CASlD;AAED,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,EAC1B,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,IAAI,GAAE,SAAc,GACnB,MAAM,
|
|
1
|
+
{"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../src/diff.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAGpC,MAAM,WAAW,QAAQ;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,EAAE,OAAO,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,QAAQ,CAc9D;AAED,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,QAAQ,CAgB5E;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAajD;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,IAAI,CASlD;AAED,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,EAC1B,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,IAAI,GAAE,SAAc,GACnB,MAAM,CA4BR"}
|
package/dist/diff.js
CHANGED
|
@@ -93,8 +93,9 @@ function resolveTargetPath(entry, relPath, workingDir, vars = {}) {
|
|
|
93
93
|
const target = entry.target ? (0, variables_1.resolveVars)(entry.target, vars) : undefined;
|
|
94
94
|
if (target) {
|
|
95
95
|
if (path.isAbsolute(target)) {
|
|
96
|
-
|
|
97
|
-
|
|
96
|
+
const fsRoot = path.parse(workingDir).root;
|
|
97
|
+
if (workingDir !== fsRoot) {
|
|
98
|
+
throw new Error(`Absolute target path "${target}" is not allowed unless the working directory is the filesystem root. Use a relative path or run with -w ${fsRoot}.`);
|
|
98
99
|
}
|
|
99
100
|
if (target.endsWith('/') || target.endsWith(path.sep)) {
|
|
100
101
|
return path.resolve(target, relPath);
|
package/dist/diff.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../src/diff.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAcA,8CAcC;AAED,kCAgBC;AAED,gCAaC;AAED,gCASC;AAED,
|
|
1
|
+
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../src/diff.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"post.d.ts","sourceRoot":"","sources":["../../src/processors/post.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"post.d.ts","sourceRoot":"","sources":["../../src/processors/post.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAIrC,wBAAgB,SAAS,CACvB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,IAAI,GAAE,SAAc,GACnB,MAAM,CAiBR"}
|
package/dist/processors/post.js
CHANGED
|
@@ -3,9 +3,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.applyPost = applyPost;
|
|
4
4
|
const child_process_1 = require("child_process");
|
|
5
5
|
const variables_1 = require("../variables");
|
|
6
|
+
const shell_1 = require("../shell");
|
|
6
7
|
function applyPost(content, script, vars = {}) {
|
|
7
8
|
const resolvedScript = (0, variables_1.resolveVarsShellSafe)(script, vars);
|
|
8
|
-
const
|
|
9
|
+
const { shell, args } = (0, shell_1.getShellArgs)(resolvedScript);
|
|
10
|
+
const result = (0, child_process_1.spawnSync)(shell, args, {
|
|
9
11
|
input: content,
|
|
10
12
|
encoding: 'utf8',
|
|
11
13
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"post.js","sourceRoot":"","sources":["../../src/processors/post.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"post.js","sourceRoot":"","sources":["../../src/processors/post.ts"],"names":[],"mappings":";;AAKA,8BAqBC;AA1BD,iDAA0C;AAE1C,4CAAoD;AACpD,oCAAwC;AAExC,SAAgB,SAAS,CACvB,OAAe,EACf,MAAc,EACd,OAAkB,EAAE;IAEpB,MAAM,cAAc,GAAG,IAAA,gCAAoB,EAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC1D,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,IAAA,oBAAY,EAAC,cAAc,CAAC,CAAC;IACrD,MAAM,MAAM,GAAG,IAAA,yBAAS,EAAC,KAAK,EAAE,IAAI,EAAE;QACpC,KAAK,EAAE,OAAO;QACd,QAAQ,EAAE,MAAM;KACjB,CAAC,CAAC;IACH,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CACb,gCAAgC,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAC9E,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,gCAAgC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAC1E,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC;AACvB,CAAC"}
|
package/dist/shell.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../src/shell.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,SAAS,SAA+B,CAAC;AA+BtD,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG;IAC5C,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB,CAeA"}
|
package/dist/shell.js
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.isWindows = void 0;
|
|
37
|
+
exports.getShellArgs = getShellArgs;
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
exports.isWindows = process.platform === 'win32';
|
|
40
|
+
// Absolute path to the inbox PowerShell on Windows.
|
|
41
|
+
// Using %SystemRoot% (rather than a bare 'powershell') prevents PATH-based
|
|
42
|
+
// command hijacking when avanti runs inside an untrusted working directory.
|
|
43
|
+
// We validate that SystemRoot is non-empty and absolute before trusting it;
|
|
44
|
+
// an empty or relative value would reintroduce the hijack risk.
|
|
45
|
+
const _sysRoot = process.env['SystemRoot'];
|
|
46
|
+
const _winRoot = _sysRoot && path.isAbsolute(_sysRoot) ? _sysRoot : 'C:\\Windows';
|
|
47
|
+
const POWERSHELL_EXE = path.join(_winRoot, 'System32', 'WindowsPowerShell', 'v1.0', 'powershell.exe');
|
|
48
|
+
// Returns the shell binary + args needed to run a script string.
|
|
49
|
+
//
|
|
50
|
+
// On Windows: PowerShell is built into every Windows version since 7 — no
|
|
51
|
+
// external tools required. We pass the script as a Base64-encoded UTF-16LE
|
|
52
|
+
// command (-EncodedCommand) so command-line quoting is bypassed entirely.
|
|
53
|
+
// We also set UTF-8 I/O up front so non-ASCII content round-trips correctly.
|
|
54
|
+
//
|
|
55
|
+
// The user script is wrapped in a scriptblock (& { ... }) so that param()
|
|
56
|
+
// declarations at the start of the script are legal. Note: script-file-level
|
|
57
|
+
// directives (#requires, using namespace/module) are not supported in inline
|
|
58
|
+
// scripts regardless of wrapping and must live in a .ps1 file.
|
|
59
|
+
//
|
|
60
|
+
// On Unix/macOS: plain sh -c.
|
|
61
|
+
function getShellArgs(script) {
|
|
62
|
+
if (!exports.isWindows) {
|
|
63
|
+
return { shell: 'sh', args: ['-c', script] };
|
|
64
|
+
}
|
|
65
|
+
const wrapped = '[Console]::InputEncoding=[Text.Encoding]::UTF8;' +
|
|
66
|
+
'[Console]::OutputEncoding=[Text.Encoding]::UTF8;' +
|
|
67
|
+
'& {' +
|
|
68
|
+
script +
|
|
69
|
+
'}';
|
|
70
|
+
const encoded = Buffer.from(wrapped, 'utf16le').toString('base64');
|
|
71
|
+
return {
|
|
72
|
+
shell: POWERSHELL_EXE,
|
|
73
|
+
args: ['-NoProfile', '-NonInteractive', '-EncodedCommand', encoded],
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=shell.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shell.js","sourceRoot":"","sources":["../src/shell.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiCA,oCAkBC;AAnDD,2CAA6B;AAEhB,QAAA,SAAS,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC;AAEtD,oDAAoD;AACpD,2EAA2E;AAC3E,4EAA4E;AAC5E,4EAA4E;AAC5E,gEAAgE;AAChE,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;AAC3C,MAAM,QAAQ,GACZ,QAAQ,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC;AACnE,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAC9B,QAAQ,EACR,UAAU,EACV,mBAAmB,EACnB,MAAM,EACN,gBAAgB,CACjB,CAAC;AAEF,iEAAiE;AACjE,EAAE;AACF,0EAA0E;AAC1E,2EAA2E;AAC3E,0EAA0E;AAC1E,6EAA6E;AAC7E,EAAE;AACF,0EAA0E;AAC1E,6EAA6E;AAC7E,6EAA6E;AAC7E,+DAA+D;AAC/D,EAAE;AACF,8BAA8B;AAC9B,SAAgB,YAAY,CAAC,MAAc;IAIzC,IAAI,CAAC,iBAAS,EAAE,CAAC;QACf,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC;IAC/C,CAAC;IACD,MAAM,OAAO,GACX,iDAAiD;QACjD,kDAAkD;QAClD,KAAK;QACL,MAAM;QACN,GAAG,CAAC;IACN,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACnE,OAAO;QACL,KAAK,EAAE,cAAc;QACrB,IAAI,EAAE,CAAC,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,OAAO,CAAC;KACpE,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../../src/sources/exec.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../../src/sources/exec.ts"],"names":[],"mappings":"AAGA,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAajD"}
|
package/dist/sources/exec.js
CHANGED
|
@@ -2,8 +2,10 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.fetchExec = fetchExec;
|
|
4
4
|
const child_process_1 = require("child_process");
|
|
5
|
+
const shell_1 = require("../shell");
|
|
5
6
|
function fetchExec(command) {
|
|
6
|
-
const
|
|
7
|
+
const { shell, args } = (0, shell_1.getShellArgs)(command);
|
|
8
|
+
const result = (0, child_process_1.spawnSync)(shell, args, { encoding: 'utf8' });
|
|
7
9
|
if (result.error) {
|
|
8
10
|
throw new Error(`exec failed to spawn: ${result.error.message}`);
|
|
9
11
|
}
|
package/dist/sources/exec.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exec.js","sourceRoot":"","sources":["../../src/sources/exec.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"exec.js","sourceRoot":"","sources":["../../src/sources/exec.ts"],"names":[],"mappings":";;AAGA,8BAaC;AAhBD,iDAA0C;AAC1C,oCAAwC;AAExC,SAAgB,SAAS,CAAC,OAAe;IACvC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,IAAA,oBAAY,EAAC,OAAO,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,IAAA,yBAAS,EAAC,KAAK,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;IAC5D,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,yBAAyB,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACnE,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CACb,yBAAyB,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CACvE,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC;AACvB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../src/sources/local.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../src/sources/local.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,UAAU,CACxB,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,MAAM,EAClB,QAAQ,UAAQ,GACf,WAAW,CAqBb"}
|
package/dist/sources/local.js
CHANGED
|
@@ -35,15 +35,12 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
exports.fetchLocal = fetchLocal;
|
|
37
37
|
const fs = __importStar(require("fs"));
|
|
38
|
+
const os = __importStar(require("os"));
|
|
38
39
|
const path = __importStar(require("path"));
|
|
39
40
|
function fetchLocal(src, workingDir, optional = false) {
|
|
40
41
|
let resolved;
|
|
41
42
|
if (src.startsWith('~/')) {
|
|
42
|
-
|
|
43
|
-
if (!home) {
|
|
44
|
-
throw new Error(`Cannot expand '~/' in source '${src}': HOME environment variable is not set`);
|
|
45
|
-
}
|
|
46
|
-
resolved = path.join(home, src.slice(2));
|
|
43
|
+
resolved = path.join(os.homedir(), src.slice(2));
|
|
47
44
|
}
|
|
48
45
|
else if (path.isAbsolute(src)) {
|
|
49
46
|
resolved = src;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local.js","sourceRoot":"","sources":["../../src/sources/local.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"local.js","sourceRoot":"","sources":["../../src/sources/local.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AASA,gCAyBC;AAlCD,uCAAyB;AACzB,uCAAyB;AACzB,2CAA6B;AAO7B,SAAgB,UAAU,CACxB,GAAW,EACX,UAAkB,EAClB,QAAQ,GAAG,KAAK;IAEhB,IAAI,QAAgB,CAAC;IACrB,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACzB,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACnD,CAAC;SAAM,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAChC,QAAQ,GAAG,GAAG,CAAC;IACjB,CAAC;SAAM,CAAC;QACN,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;IAC3C,CAAC;IACD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,IAAI,QAAQ;YAAE,OAAO,EAAE,KAAK,EAAE,IAAI,GAAG,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACzD,MAAM,IAAI,KAAK,CAAC,2BAA2B,QAAQ,EAAE,CAAC,CAAC;IACzD,CAAC;IACD,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACnC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;IACxC,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;QACvB,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC9C,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;IACxE,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,CAAC;AACnB,CAAC;AAED,SAAS,gBAAgB,CACvB,IAAY,EACZ,OAAe,EACf,GAAwB;IAExB,KAAK,MAAM,KAAK,IAAI,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACvC,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACtC,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACvB,gBAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;QACpC,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;AACH,CAAC"}
|
package/dist/variables.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"variables.d.ts","sourceRoot":"","sources":["../src/variables.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAGpC,eAAO,MAAM,aAAa,aAAsB,CAAC;AAEjD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,CAMvD;
|
|
1
|
+
{"version":3,"file":"variables.d.ts","sourceRoot":"","sources":["../src/variables.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAGpC,eAAO,MAAM,aAAa,aAAsB,CAAC;AAEjD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,CAMvD;AAOD,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,MAAM,CAmBlE;AAgBD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,MAAM,CAmB3E"}
|
package/dist/variables.js
CHANGED
|
@@ -13,48 +13,59 @@ function validateVariables(vars) {
|
|
|
13
13
|
}
|
|
14
14
|
}
|
|
15
15
|
}
|
|
16
|
+
// Single-pass regex: $$ → literal $, then $env:NAME, then $name.
|
|
17
|
+
// Ordering within the alternation matters: $$ must come first so it is
|
|
18
|
+
// consumed before the $name branch can match the second $.
|
|
19
|
+
const TOKEN = /\$\$|\$env:([A-Za-z_][A-Za-z0-9_]*)|\$([A-Za-z_][A-Za-z0-9_]*)/g;
|
|
16
20
|
function resolveVars(value, vars) {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
if (
|
|
21
|
-
|
|
21
|
+
return value.replace(TOKEN, (match, envName, varName) => {
|
|
22
|
+
if (match === '$$')
|
|
23
|
+
return '$';
|
|
24
|
+
if (envName !== undefined) {
|
|
25
|
+
const val = process.env[envName];
|
|
26
|
+
if (val === undefined) {
|
|
27
|
+
throw new Error(`Undefined environment variable: $env:${envName}`);
|
|
28
|
+
}
|
|
29
|
+
return val;
|
|
22
30
|
}
|
|
23
|
-
|
|
24
|
-
});
|
|
25
|
-
// Second pass: $name → variable value (reserved names are passed through unchanged)
|
|
26
|
-
return afterEnv.replace(/\$([A-Za-z_][A-Za-z0-9_]*)/g, (match, name) => {
|
|
27
|
-
if (exports.RESERVED_VARS.has(name))
|
|
31
|
+
if (exports.RESERVED_VARS.has(varName))
|
|
28
32
|
return match;
|
|
29
|
-
if (!(
|
|
30
|
-
throw new Error(`Undefined variable: $${
|
|
33
|
+
if (!(varName in vars)) {
|
|
34
|
+
throw new Error(`Undefined variable: $${varName}`);
|
|
31
35
|
}
|
|
32
|
-
return vars[
|
|
36
|
+
return vars[varName];
|
|
33
37
|
});
|
|
34
38
|
}
|
|
35
|
-
//
|
|
39
|
+
// Single-quote escaping for shell injection prevention.
|
|
40
|
+
// POSIX sh: escape ' as '\'' — PowerShell: escape ' as ''
|
|
36
41
|
function shellQuote(val) {
|
|
42
|
+
if (process.platform === 'win32') {
|
|
43
|
+
return "'" + val.replace(/'/g, "''") + "'";
|
|
44
|
+
}
|
|
37
45
|
return "'" + val.replace(/'/g, "'\\''") + "'";
|
|
38
46
|
}
|
|
39
47
|
// Like resolveVars but shell-quotes each substituted value, preventing
|
|
40
48
|
// metacharacters in variable values (especially $env: vars) from being
|
|
41
|
-
// interpreted by the shell.
|
|
42
|
-
// to sh -c
|
|
49
|
+
// interpreted by the shell. Used by exec sources and post processors.
|
|
50
|
+
// On Unix the resolved script is passed to sh -c; on Windows it is
|
|
51
|
+
// Base64-encoded and passed to PowerShell via -EncodedCommand.
|
|
43
52
|
function resolveVarsShellSafe(value, vars) {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
53
|
+
return value.replace(TOKEN, (match, envName, varName) => {
|
|
54
|
+
if (match === '$$')
|
|
55
|
+
return '$';
|
|
56
|
+
if (envName !== undefined) {
|
|
57
|
+
const val = process.env[envName];
|
|
58
|
+
if (val === undefined) {
|
|
59
|
+
throw new Error(`Undefined environment variable: $env:${envName}`);
|
|
60
|
+
}
|
|
61
|
+
return shellQuote(val);
|
|
48
62
|
}
|
|
49
|
-
|
|
50
|
-
});
|
|
51
|
-
return afterEnv.replace(/\$([A-Za-z_][A-Za-z0-9_]*)/g, (match, name) => {
|
|
52
|
-
if (exports.RESERVED_VARS.has(name))
|
|
63
|
+
if (exports.RESERVED_VARS.has(varName))
|
|
53
64
|
return match;
|
|
54
|
-
if (!(
|
|
55
|
-
throw new Error(`Undefined variable: $${
|
|
65
|
+
if (!(varName in vars)) {
|
|
66
|
+
throw new Error(`Undefined variable: $${varName}`);
|
|
56
67
|
}
|
|
57
|
-
return shellQuote(vars[
|
|
68
|
+
return shellQuote(vars[varName]);
|
|
58
69
|
});
|
|
59
70
|
}
|
|
60
71
|
//# sourceMappingURL=variables.js.map
|
package/dist/variables.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"variables.js","sourceRoot":"","sources":["../src/variables.ts"],"names":[],"mappings":";;;AAKA,8CAMC;
|
|
1
|
+
{"version":3,"file":"variables.js","sourceRoot":"","sources":["../src/variables.ts"],"names":[],"mappings":"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"}
|