jopi-toolkit 3.0.11 → 3.0.15

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.
Files changed (38) hide show
  1. package/dist/jk_data/index.d.ts +40 -0
  2. package/dist/jk_data/index.js +76 -0
  3. package/dist/jk_data/index.js.map +1 -0
  4. package/dist/jk_fs/jBundler_ifServer.d.ts +1 -1
  5. package/dist/jk_schemas/index.d.ts +76 -6
  6. package/dist/jk_schemas/index.js +82 -47
  7. package/dist/jk_schemas/index.js.map +1 -1
  8. package/dist/jk_schemas/jkSchemas.d.ts +188 -0
  9. package/dist/jk_schemas/jkSchemas.js +257 -0
  10. package/dist/jk_schemas/jkSchemas.js.map +1 -0
  11. package/dist/jk_timer/index.d.ts +2 -0
  12. package/dist/jk_timer/index.js +2 -0
  13. package/dist/jk_timer/index.js.map +1 -1
  14. package/dist/jk_tools/jBundler_ifServer.d.ts +1 -0
  15. package/dist/jk_tools/jBundler_ifServer.js +40 -10
  16. package/dist/jk_tools/jBundler_ifServer.js.map +1 -1
  17. package/package.json +10 -5
  18. package/src/jk_app/common.js +442 -0
  19. package/src/jk_crypto/jBundler_ifServer.js +16 -0
  20. package/src/jk_data/index.js +117 -0
  21. package/src/jk_data/index.ts +129 -0
  22. package/src/jk_events/index.js +213 -0
  23. package/src/jk_fs/index.js +2 -0
  24. package/src/jk_fs/jBundler_ifServer.js +729 -0
  25. package/src/jk_logs/index.js +371 -0
  26. package/src/jk_logs/jBundler_ifServer.js +24 -0
  27. package/src/jk_schemas/index.js +84 -47
  28. package/src/jk_schemas/index.ts +196 -69
  29. package/src/jk_thread/common.js +7 -0
  30. package/src/jk_timer/index.js +2 -0
  31. package/src/jk_timer/index.ts +3 -0
  32. package/src/jk_tools/common.js +101 -0
  33. package/src/jk_tools/index.js +1 -0
  34. package/src/jk_tools/jBundler_ifServer.js +215 -0
  35. package/src/jk_tools/jBundler_ifServer.ts +49 -11
  36. package/src/jk_translate/index.js +56 -0
  37. package/src/jk_what/jBundler_ifServer.js +5 -0
  38. package/src/jk_os/jBundler_ifServer.js +0 -132
@@ -0,0 +1,215 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ var __generator = (this && this.__generator) || function (thisArg, body) {
11
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
12
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
13
+ function verb(n) { return function (v) { return step([n, v]); }; }
14
+ function step(op) {
15
+ if (f) throw new TypeError("Generator is already executing.");
16
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
17
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
18
+ if (y = 0, t) op = [op[0] & 2, t.value];
19
+ switch (op[0]) {
20
+ case 0: case 1: t = op; break;
21
+ case 4: _.label++; return { value: op[1], done: false };
22
+ case 5: _.label++; y = op[1]; op = [0]; continue;
23
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
24
+ default:
25
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
26
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
27
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
28
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
29
+ if (t[2]) _.ops.pop();
30
+ _.trys.pop(); continue;
31
+ }
32
+ op = body.call(thisArg, _);
33
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
34
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
35
+ }
36
+ };
37
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
38
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
39
+ if (ar || !(i in from)) {
40
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
41
+ ar[i] = from[i];
42
+ }
43
+ }
44
+ return to.concat(ar || Array.prototype.slice.call(from));
45
+ };
46
+ import * as fs from 'node:fs/promises';
47
+ import * as path from 'node:path';
48
+ export * from "./common.ts";
49
+ import * as jk_timer from "jopi-toolkit/jk_timer";
50
+ import { exec } from 'child_process';
51
+ import os from 'os';
52
+ /**
53
+ * Download a file or a directory from a GitHub repository.
54
+ */
55
+ export function githubDownload(params) {
56
+ return __awaiter(this, void 0, void 0, function () {
57
+ function downloadFile(localPath, contentUrl) {
58
+ return __awaiter(this, void 0, void 0, function () {
59
+ var localDir, headers, response, buffer;
60
+ return __generator(this, function (_a) {
61
+ switch (_a.label) {
62
+ case 0:
63
+ localDir = path.dirname(localPath);
64
+ headers = {};
65
+ return [4 /*yield*/, fs.mkdir(localDir, { recursive: true })];
66
+ case 1:
67
+ _a.sent();
68
+ return [4 /*yield*/, fetch(contentUrl, { headers: headers, })];
69
+ case 2:
70
+ response = _a.sent();
71
+ if (!response.ok) {
72
+ throw new Error("Github download error: ".concat(response.status, " ").concat(response.statusText));
73
+ }
74
+ return [4 /*yield*/, response.arrayBuffer()];
75
+ case 3:
76
+ buffer = _a.sent();
77
+ return [4 /*yield*/, fs.writeFile(localPath, Buffer.from(buffer))];
78
+ case 4:
79
+ _a.sent();
80
+ if (params.log)
81
+ console.log("Downloaded", contentUrl);
82
+ return [2 /*return*/];
83
+ }
84
+ });
85
+ });
86
+ }
87
+ function fetchAndProcessContent(currentPath, downloadRoot) {
88
+ return __awaiter(this, void 0, void 0, function () {
89
+ var apiUrl, headers, response, data, isFile, contents, _i, contents_1, item, itemPath;
90
+ return __generator(this, function (_a) {
91
+ switch (_a.label) {
92
+ case 0:
93
+ apiUrl = "https://api.github.com/repos/".concat(repoOwner, "/").concat(repoName, "/contents/").concat(currentPath, "?ref=").concat(branchName);
94
+ headers = {};
95
+ return [4 /*yield*/, fetch(apiUrl, { headers: headers })];
96
+ case 1:
97
+ response = _a.sent();
98
+ if (!response.ok) {
99
+ throw new Error("Github download error: ".concat(response.status, " ").concat(response.statusText));
100
+ }
101
+ return [4 /*yield*/, response.json()];
102
+ case 2:
103
+ data = _a.sent();
104
+ isFile = !Array.isArray(data) && (data.type === 'file');
105
+ if (!(isFile && isFirst)) return [3 /*break*/, 4];
106
+ return [4 /*yield*/, downloadFile(downloadRoot, data.download_url)];
107
+ case 3:
108
+ _a.sent();
109
+ return [2 /*return*/];
110
+ case 4:
111
+ contents = Array.isArray(data) ? data : [data];
112
+ isFirst = false;
113
+ _i = 0, contents_1 = contents;
114
+ _a.label = 5;
115
+ case 5:
116
+ if (!(_i < contents_1.length)) return [3 /*break*/, 11];
117
+ item = contents_1[_i];
118
+ // Reduce, otherwise we get a "403 rate limit exceed" error.
119
+ return [4 /*yield*/, jk_timer.tick(50)];
120
+ case 6:
121
+ // Reduce, otherwise we get a "403 rate limit exceed" error.
122
+ _a.sent();
123
+ if (!(item.type === 'file' && item.download_url)) return [3 /*break*/, 8];
124
+ itemPath = item.path;
125
+ itemPath = itemPath.substring(pathInsideRepo.length + 1);
126
+ return [4 /*yield*/, downloadFile(path.join(downloadRoot, itemPath), item.download_url)];
127
+ case 7:
128
+ _a.sent();
129
+ return [3 /*break*/, 10];
130
+ case 8:
131
+ if (!(item.type === 'dir')) return [3 /*break*/, 10];
132
+ return [4 /*yield*/, fetchAndProcessContent(item.path, downloadRoot)];
133
+ case 9:
134
+ _a.sent();
135
+ _a.label = 10;
136
+ case 10:
137
+ _i++;
138
+ return [3 /*break*/, 5];
139
+ case 11: return [2 /*return*/];
140
+ }
141
+ });
142
+ });
143
+ }
144
+ var isFirst, url, parts, repoOwner, repoName, tree, branchName, pathInsideRepo;
145
+ return __generator(this, function (_a) {
146
+ switch (_a.label) {
147
+ case 0:
148
+ isFirst = true;
149
+ url = params.url;
150
+ if (!url.startsWith("https://github.com/"))
151
+ throw new Error("Invalid URL - Must be of type https://github.com/ownerName/repoName/tree/branchName/path/to/folder");
152
+ url = url.substring("https://github.com/".length);
153
+ parts = url.split("/").reverse();
154
+ repoOwner = parts.pop();
155
+ repoName = parts.pop();
156
+ tree = parts.pop();
157
+ if (tree !== "tree")
158
+ throw new Error("Invalid URL - Must be of type https://github.com/ownerName/repoName/tree/branchName/path/to/folder");
159
+ branchName = parts.pop();
160
+ pathInsideRepo = parts.reverse().join("/");
161
+ return [4 /*yield*/, fetchAndProcessContent(pathInsideRepo, params.downloadPath)];
162
+ case 1:
163
+ _a.sent();
164
+ return [2 /*return*/];
165
+ }
166
+ });
167
+ });
168
+ }
169
+ export function killPort(port) {
170
+ var _this = this;
171
+ if (port === void 0) { port = '3000'; }
172
+ return new Promise(function (resolve) {
173
+ var isWindows = os.platform() === 'win32';
174
+ var command = isWindows
175
+ ? "netstat -ano | findstr :".concat(port)
176
+ : "lsof -ti :".concat(port);
177
+ exec(command, function (_error, stdout) {
178
+ if (!stdout) {
179
+ resolve();
180
+ return;
181
+ }
182
+ var pids = isWindows
183
+ ? __spreadArray([], new Set(stdout.trim().split('\n').map(function (line) {
184
+ var parts = line.trim().split(/\s+/);
185
+ return parts[parts.length - 1];
186
+ }).filter(function (pid) { return pid && /^\d+$/.test(pid) && pid !== '0'; })), true) : stdout.trim().split('\n');
187
+ var killCmd = isWindows ? 'taskkill /PID' : 'kill -9';
188
+ var pending = pids.length;
189
+ if (pending === 0) {
190
+ resolve();
191
+ return;
192
+ }
193
+ pids.forEach(function (pid) {
194
+ exec("".concat(killCmd, " ").concat(pid).concat(isWindows ? ' /F' : ''), function (err) { return __awaiter(_this, void 0, void 0, function () {
195
+ return __generator(this, function (_a) {
196
+ switch (_a.label) {
197
+ case 0:
198
+ if (err)
199
+ console.error("Failed to kill process ".concat(pid));
200
+ else
201
+ console.log("\u26A0\uFE0F Process ".concat(pid, " automatically killed to free the port ").concat(port));
202
+ if (!(--pending === 0)) return [3 /*break*/, 2];
203
+ return [4 /*yield*/, jk_timer.tick(250)];
204
+ case 1:
205
+ _a.sent();
206
+ resolve();
207
+ _a.label = 2;
208
+ case 2: return [2 /*return*/];
209
+ }
210
+ });
211
+ }); });
212
+ });
213
+ });
214
+ });
215
+ }
@@ -3,6 +3,9 @@ import * as path from 'node:path';
3
3
  export * from "./common.ts";
4
4
  import * as jk_timer from "jopi-toolkit/jk_timer";
5
5
 
6
+ import { exec } from 'child_process';
7
+ import os from 'os';
8
+
6
9
  export interface GithubDownloadParams {
7
10
  /**
8
11
  * The file or directory to download.
@@ -33,7 +36,7 @@ export async function githubDownload(params: GithubDownloadParams) {
33
36
 
34
37
  await fs.mkdir(localDir, { recursive: true });
35
38
 
36
- const response = await fetch(contentUrl, {headers: headers,});
39
+ const response = await fetch(contentUrl, { headers: headers, });
37
40
 
38
41
  if (!response.ok) {
39
42
  throw new Error(`Github download error: ${response.status} ${response.statusText}`);
@@ -68,7 +71,7 @@ export async function githubDownload(params: GithubDownloadParams) {
68
71
 
69
72
  for (const item of contents) {
70
73
  // Reduce, otherwise we get a "403 rate limit exceed" error.
71
- await jk_timer.tick(gRateLimit);
74
+ await jk_timer.tick(50);
72
75
 
73
76
  if (item.type === 'file' && item.download_url) {
74
77
  let itemPath = item.path;
@@ -91,19 +94,54 @@ export async function githubDownload(params: GithubDownloadParams) {
91
94
  let repoOwner = parts.pop();
92
95
  let repoName = parts.pop();
93
96
  let tree = parts.pop();
94
- if (tree!=="tree") throw new Error("Invalid URL - Must be of type https://github.com/ownerName/repoName/tree/branchName/path/to/folder");
97
+ if (tree !== "tree") throw new Error("Invalid URL - Must be of type https://github.com/ownerName/repoName/tree/branchName/path/to/folder");
95
98
  let branchName = parts.pop();
96
99
  const pathInsideRepo = parts.reverse().join("/");
97
100
 
98
101
  await fetchAndProcessContent(pathInsideRepo, params.downloadPath);
99
102
  }
100
103
 
101
- function getRateLimit() {
102
- let sLimit = process.env.GITHUB_API_LIMIT_SECONDS;
103
- if (!sLimit) return 50;
104
- let res = parseInt(sLimit);
105
- if (isNaN(res)) return 50;
106
- return res;
107
- }
108
104
 
109
- const gRateLimit = getRateLimit();
105
+ export function killPort(port: string = '3000'): Promise<void> {
106
+ return new Promise<void>((resolve) => {
107
+ const isWindows = os.platform() === 'win32';
108
+
109
+ const command = isWindows
110
+ ? `netstat -ano | findstr :${port}`
111
+ : `lsof -ti :${port}`;
112
+
113
+ exec(command, (_error, stdout) => {
114
+ if (!stdout) {
115
+ resolve();
116
+ return;
117
+ }
118
+
119
+ const pids = isWindows
120
+ ? [...new Set(stdout.trim().split('\n').map(line => {
121
+ const parts = line.trim().split(/\s+/);
122
+ return parts[parts.length - 1];
123
+ }).filter(pid => pid && /^\d+$/.test(pid) && pid !== '0'))]
124
+ : stdout.trim().split('\n');
125
+
126
+ const killCmd = isWindows ? 'taskkill /PID' : 'kill -9';
127
+ let pending = pids.length;
128
+
129
+ if (pending === 0) {
130
+ resolve();
131
+ return;
132
+ }
133
+
134
+ pids.forEach(pid => {
135
+ exec(`${killCmd} ${pid}${isWindows ? ' /F' : ''}`, async (err) => {
136
+ if (err) console.error(`Failed to kill process ${pid}`);
137
+ else console.log(`⚠️ Process ${pid} automatically killed to free the port ${port}`);
138
+
139
+ if (--pending === 0) {
140
+ await jk_timer.tick(250);
141
+ resolve();
142
+ }
143
+ });
144
+ });
145
+ });
146
+ });
147
+ }
@@ -0,0 +1,56 @@
1
+ var gCurrentLanguage = 'en';
2
+ var gTranslations = {};
3
+ export function setLanguage(languageName) {
4
+ gCurrentLanguage = languageName;
5
+ }
6
+ export function translate(key, p) {
7
+ return translateTo(gCurrentLanguage, key, p);
8
+ }
9
+ export function translateTo(language, key, p) {
10
+ // Does it exist?
11
+ if (!gTranslations[language]) {
12
+ gTranslations[language] = {};
13
+ }
14
+ var translation;
15
+ // Must use plural?
16
+ //
17
+ var translationKey = key;
18
+ //
19
+ if ((p.count !== undefined) && (p.count > 1)) {
20
+ var pluralKey = "".concat(key, "_plural");
21
+ translation = gTranslations[language][pluralKey];
22
+ }
23
+ // Get the translation.
24
+ if (!translation) {
25
+ translation = gTranslations[language][translationKey];
26
+ }
27
+ // Not found?
28
+ if (!translation) {
29
+ if (p.default) {
30
+ gTranslations[language][translationKey] = p.default;
31
+ return p.default;
32
+ }
33
+ translation = "[trNotFound:".concat(key, "]");
34
+ }
35
+ // Replace the parameters in the translation.
36
+ if (p.params && translation.includes("$")) {
37
+ for (var _i = 0, _a = Object.entries(p.params); _i < _a.length; _i++) {
38
+ var _b = _a[_i], paramKey = _b[0], paramValue = _b[1];
39
+ var placeholder = "$" + paramKey;
40
+ translation = translation.replace(placeholder, String(paramValue));
41
+ }
42
+ }
43
+ return translation;
44
+ }
45
+ export function addTranslation(language, key, value) {
46
+ if (!gTranslations[language]) {
47
+ gTranslations[language] = {};
48
+ }
49
+ gTranslations[language][key] = value;
50
+ }
51
+ export function addTranslations(language, newTranslations) {
52
+ if (!gTranslations[language]) {
53
+ gTranslations[language] = {};
54
+ }
55
+ Object.assign(gTranslations[language], newTranslations);
56
+ }
@@ -0,0 +1,5 @@
1
+ export var isNodeJS = typeof (Bun) === "undefined";
2
+ export var isBunJS = typeof (Bun) !== "undefined";
3
+ export var isServerSide = true;
4
+ export var isBrowser = false;
5
+ export var serverType = isNodeJS ? "node" : "bun";
@@ -1,132 +0,0 @@
1
- "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
- var __generator = (this && this.__generator) || function (thisArg, body) {
12
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
13
- return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
- function verb(n) { return function (v) { return step([n, v]); }; }
15
- function step(op) {
16
- if (f) throw new TypeError("Generator is already executing.");
17
- while (g && (g = 0, op[0] && (_ = 0)), _) try {
18
- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
19
- if (y = 0, t) op = [op[0] & 2, t.value];
20
- switch (op[0]) {
21
- case 0: case 1: t = op; break;
22
- case 4: _.label++; return { value: op[1], done: false };
23
- case 5: _.label++; y = op[1]; op = [0]; continue;
24
- case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
- default:
26
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
- if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
- if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
- if (t[2]) _.ops.pop();
31
- _.trys.pop(); continue;
32
- }
33
- op = body.call(thisArg, _);
34
- } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
- if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
- }
37
- };
38
- Object.defineProperty(exports, "__esModule", { value: true });
39
- exports.whichSync = whichSync;
40
- exports.exec = exec;
41
- var node_child_process_1 = require("node:child_process");
42
- var node_process_1 = require("node:process");
43
- var path = require("node:path");
44
- var fs = require("node:fs/promises");
45
- var node_fs_1 = require("node:fs");
46
- function which(command, ifNotFound) {
47
- return __awaiter(this, void 0, void 0, function () {
48
- var pathArray, extensions, _i, pathArray_1, dir, _a, extensions_1, ext, fullPath, stats, _b;
49
- return __generator(this, function (_c) {
50
- switch (_c.label) {
51
- case 0:
52
- pathArray = (node_process_1.env.PATH || '').split(process.platform === 'win32' ? ';' : ':');
53
- extensions = process.platform === 'win32' ? ['.exe', '.cmd', '.bat'] : [''];
54
- _i = 0, pathArray_1 = pathArray;
55
- _c.label = 1;
56
- case 1:
57
- if (!(_i < pathArray_1.length)) return [3 /*break*/, 8];
58
- dir = pathArray_1[_i];
59
- _a = 0, extensions_1 = extensions;
60
- _c.label = 2;
61
- case 2:
62
- if (!(_a < extensions_1.length)) return [3 /*break*/, 7];
63
- ext = extensions_1[_a];
64
- fullPath = path.join(dir, command + ext);
65
- _c.label = 3;
66
- case 3:
67
- _c.trys.push([3, 5, , 6]);
68
- return [4 /*yield*/, fs.stat(fullPath)];
69
- case 4:
70
- stats = _c.sent();
71
- if (stats.isFile())
72
- return [2 /*return*/, fullPath];
73
- return [3 /*break*/, 6];
74
- case 5:
75
- _b = _c.sent();
76
- return [3 /*break*/, 6];
77
- case 6:
78
- _a++;
79
- return [3 /*break*/, 2];
80
- case 7:
81
- _i++;
82
- return [3 /*break*/, 1];
83
- case 8:
84
- if (ifNotFound)
85
- return [2 /*return*/, ifNotFound];
86
- return [2 /*return*/, null];
87
- }
88
- });
89
- });
90
- }
91
- function whichSync(cmd, ifNotFound) {
92
- var paths = (process.env.PATH || '').split(path.delimiter);
93
- if (process.platform === 'win32') {
94
- var extToTest = process.env.PATHEXT ? process.env.PATHEXT.split(';') : ['.EXE', '.CMD', '.BAT'];
95
- for (var _i = 0, paths_1 = paths; _i < paths_1.length; _i++) {
96
- var p = paths_1[_i];
97
- for (var _a = 0, extToTest_1 = extToTest; _a < extToTest_1.length; _a++) {
98
- var ext = extToTest_1[_a];
99
- var full = path.join(p, cmd + ext.toLowerCase());
100
- if (node_fs_1.default.existsSync(full))
101
- return full;
102
- var fullUpper = path.join(p, cmd + ext);
103
- if (node_fs_1.default.existsSync(fullUpper))
104
- return fullUpper;
105
- }
106
- }
107
- }
108
- else {
109
- for (var _b = 0, paths_2 = paths; _b < paths_2.length; _b++) {
110
- var p = paths_2[_b];
111
- var full = path.join(p, cmd);
112
- if (node_fs_1.default.existsSync(full))
113
- return full;
114
- var fullUpper = path.join(p, cmd);
115
- if (node_fs_1.default.existsSync(fullUpper))
116
- return fullUpper;
117
- }
118
- }
119
- if (ifNotFound)
120
- return ifNotFound;
121
- return null;
122
- }
123
- function exec(command) {
124
- return new Promise(function (resolve, reject) {
125
- (0, node_child_process_1.exec)(command, function (error) {
126
- if (error)
127
- reject(error);
128
- else
129
- resolve();
130
- });
131
- });
132
- }