jopi-toolkit 3.0.12 → 3.0.24

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 (53) hide show
  1. package/dist/jk_app/common.d.ts +2 -2
  2. package/dist/jk_app/common.js +7 -12
  3. package/dist/jk_app/common.js.map +1 -1
  4. package/dist/jk_data/index.d.ts +55 -0
  5. package/dist/jk_data/index.js +106 -0
  6. package/dist/jk_data/index.js.map +1 -0
  7. package/dist/jk_events/index.js +14 -6
  8. package/dist/jk_events/index.js.map +1 -1
  9. package/dist/jk_fs/jBundler_ifServer.d.ts +3 -3
  10. package/dist/jk_fs/jBundler_ifServer.js +26 -5
  11. package/dist/jk_fs/jBundler_ifServer.js.map +1 -1
  12. package/dist/jk_schemas/index.d.ts +156 -10
  13. package/dist/jk_schemas/index.js +130 -52
  14. package/dist/jk_schemas/index.js.map +1 -1
  15. package/dist/jk_term/index.d.ts +2 -0
  16. package/dist/jk_term/index.js +2 -0
  17. package/dist/jk_term/index.js.map +1 -1
  18. package/dist/jk_timer/index.d.ts +2 -0
  19. package/dist/jk_timer/index.js +2 -0
  20. package/dist/jk_timer/index.js.map +1 -1
  21. package/dist/jk_tools/jBundler_ifServer.d.ts +1 -0
  22. package/dist/jk_tools/jBundler_ifServer.js +40 -10
  23. package/dist/jk_tools/jBundler_ifServer.js.map +1 -1
  24. package/package.json +9 -8
  25. package/src/jk_app/common.js +442 -0
  26. package/src/jk_app/common.ts +7 -17
  27. package/src/jk_crypto/jBundler_ifServer.js +16 -0
  28. package/src/jk_data/index.js +155 -0
  29. package/src/jk_data/index.ts +166 -0
  30. package/src/jk_events/index.js +221 -0
  31. package/src/jk_events/index.ts +18 -7
  32. package/src/jk_fs/index.js +2 -0
  33. package/src/jk_fs/jBundler_ifServer.js +764 -0
  34. package/src/jk_fs/jBundler_ifServer.ts +26 -5
  35. package/src/jk_logs/index.js +371 -0
  36. package/src/jk_logs/jBundler_ifServer.js +24 -0
  37. package/src/jk_schemas/index.js +134 -52
  38. package/src/jk_schemas/index.ts +334 -78
  39. package/src/jk_term/index.js +2 -0
  40. package/src/jk_term/index.ts +3 -0
  41. package/src/jk_thread/common.js +7 -0
  42. package/src/jk_timer/index.js +2 -0
  43. package/src/jk_timer/index.ts +3 -0
  44. package/src/jk_tools/common.js +101 -0
  45. package/src/jk_tools/index.js +1 -0
  46. package/src/jk_tools/jBundler_ifServer.js +215 -0
  47. package/src/jk_tools/jBundler_ifServer.ts +49 -11
  48. package/src/jk_what/jBundler_ifServer.js +5 -0
  49. package/dist/jk_translate/index.d.ts +0 -21
  50. package/dist/jk_translate/index.js +0 -56
  51. package/dist/jk_translate/index.js.map +0 -1
  52. package/src/jk_os/jBundler_ifServer.js +0 -132
  53. package/src/jk_translate/index.ts +0 -85
@@ -2,6 +2,8 @@ import * as fs from 'node:fs/promises';
2
2
  import * as path from 'node:path';
3
3
  export * from "./common.js";
4
4
  import * as jk_timer from "jopi-toolkit/jk_timer";
5
+ import { exec } from 'child_process';
6
+ import os from 'os';
5
7
  /**
6
8
  * Download a file or a directory from a GitHub repository.
7
9
  */
@@ -36,7 +38,7 @@ export async function githubDownload(params) {
36
38
  isFirst = false;
37
39
  for (const item of contents) {
38
40
  // Reduce, otherwise we get a "403 rate limit exceed" error.
39
- await jk_timer.tick(gRateLimit);
41
+ await jk_timer.tick(50);
40
42
  if (item.type === 'file' && item.download_url) {
41
43
  let itemPath = item.path;
42
44
  itemPath = itemPath.substring(pathInsideRepo.length + 1);
@@ -62,14 +64,42 @@ export async function githubDownload(params) {
62
64
  const pathInsideRepo = parts.reverse().join("/");
63
65
  await fetchAndProcessContent(pathInsideRepo, params.downloadPath);
64
66
  }
65
- function getRateLimit() {
66
- let sLimit = process.env.GITHUB_API_LIMIT_SECONDS;
67
- if (!sLimit)
68
- return 50;
69
- let res = parseInt(sLimit);
70
- if (isNaN(res))
71
- return 50;
72
- return res;
67
+ export function killPort(port = '3000') {
68
+ return new Promise((resolve) => {
69
+ const isWindows = os.platform() === 'win32';
70
+ const command = isWindows
71
+ ? `netstat -ano | findstr :${port}`
72
+ : `lsof -ti :${port}`;
73
+ exec(command, (_error, stdout) => {
74
+ if (!stdout) {
75
+ resolve();
76
+ return;
77
+ }
78
+ const pids = isWindows
79
+ ? [...new Set(stdout.trim().split('\n').map(line => {
80
+ const parts = line.trim().split(/\s+/);
81
+ return parts[parts.length - 1];
82
+ }).filter(pid => pid && /^\d+$/.test(pid) && pid !== '0'))]
83
+ : stdout.trim().split('\n');
84
+ const killCmd = isWindows ? 'taskkill /PID' : 'kill -9';
85
+ let pending = pids.length;
86
+ if (pending === 0) {
87
+ resolve();
88
+ return;
89
+ }
90
+ pids.forEach(pid => {
91
+ exec(`${killCmd} ${pid}${isWindows ? ' /F' : ''}`, async (err) => {
92
+ if (err)
93
+ console.error(`Failed to kill process ${pid}`);
94
+ else
95
+ console.log(`⚠️ Process ${pid} automatically killed to free the port ${port}`);
96
+ if (--pending === 0) {
97
+ await jk_timer.tick(250);
98
+ resolve();
99
+ }
100
+ });
101
+ });
102
+ });
103
+ });
73
104
  }
74
- const gRateLimit = getRateLimit();
75
105
  //# sourceMappingURL=jBundler_ifServer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"jBundler_ifServer.js","sourceRoot":"","sources":["../../src/jk_tools/jBundler_ifServer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"jBundler_ifServer.js","sourceRoot":"","sources":["../../src/jk_tools/jBundler_ifServer.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "3.0.12",
2
+ "version": "3.0.24",
3
3
  "name": "jopi-toolkit",
4
4
  "license": "MIT",
5
5
  "homepage": "https://github.com/johanpiquet/jopi-toolkit",
@@ -22,7 +22,8 @@
22
22
  "tsc": "tsc",
23
23
  "bun-publish": "npx tsc && bun publish",
24
24
  "untrack": "git rm -r --cached -- ./dist/**;",
25
- "jopiLink": "npx jopi-mono link-add"
25
+ "jopiLink": "npx jopi-mono link-add",
26
+ "dev:tsc": "npx tsc --watch"
26
27
  },
27
28
  "devDependencies": {
28
29
  "@types/adm-zip": "^0.5.7",
@@ -36,8 +37,8 @@
36
37
  "mime-types": "^3.0.1",
37
38
  "ws": "^8.18.3"
38
39
  },
39
- "publishedDate": "12/9/2025",
40
- "publicPublishedDate": "12/9/2025",
40
+ "publishedDate": "12/20/2025",
41
+ "publicPublishedDate": "12/20/2025",
41
42
  "exports": {
42
43
  "./jk_schema": {
43
44
  "bun": "./src/jk_schemas/index.ts",
@@ -47,14 +48,14 @@
47
48
  "bun": "./src/jk_tools/index.ts",
48
49
  "default": "./dist/jk_tools/index.js"
49
50
  },
50
- "./jk_translate": {
51
- "bun": "./src/jk_translate/index.ts",
52
- "default": "./dist/jk_translate/index.js"
53
- },
54
51
  "./jk_process": {
55
52
  "bun": "./src/jk_process/index.ts",
56
53
  "default": "./dist/jk_process/index.js"
57
54
  },
55
+ "./jk_data": {
56
+ "bun": "./src/jk_data/index.ts",
57
+ "default": "./dist/jk_data/index.js"
58
+ },
58
59
  "./jk_what": {
59
60
  "bun": "./src/jk_what/index.ts",
60
61
  "default": "./dist/jk_what/index.js"
@@ -0,0 +1,442 @@
1
+ // noinspection JSUnusedGlobalSymbols
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
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
39
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
40
+ if (ar || !(i in from)) {
41
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
42
+ ar[i] = from[i];
43
+ }
44
+ }
45
+ return to.concat(ar || Array.prototype.slice.call(from));
46
+ };
47
+ import * as jk_thread from "jopi-toolkit/jk_thread";
48
+ import * as jk_fs from "jopi-toolkit/jk_fs";
49
+ import * as jk_timer from "jopi-toolkit/jk_timer";
50
+ import { isBunJS, isNodeJS } from "jopi-toolkit/jk_what";
51
+ import { isUsingWorker } from "jopi-toolkit/jk_thread";
52
+ function execListeners(listeners) {
53
+ return __awaiter(this, void 0, void 0, function () {
54
+ var list, _i, list_1, listener, res, e_1;
55
+ return __generator(this, function (_a) {
56
+ switch (_a.label) {
57
+ case 0:
58
+ list = __spreadArray([], listeners, true);
59
+ listeners.splice(0);
60
+ _i = 0, list_1 = list;
61
+ _a.label = 1;
62
+ case 1:
63
+ if (!(_i < list_1.length)) return [3 /*break*/, 7];
64
+ listener = list_1[_i];
65
+ _a.label = 2;
66
+ case 2:
67
+ _a.trys.push([2, 5, , 6]);
68
+ res = listener();
69
+ if (!(res instanceof Promise)) return [3 /*break*/, 4];
70
+ return [4 /*yield*/, res];
71
+ case 3:
72
+ _a.sent();
73
+ _a.label = 4;
74
+ case 4: return [3 /*break*/, 6];
75
+ case 5:
76
+ e_1 = _a.sent();
77
+ console.error(e_1);
78
+ return [3 /*break*/, 6];
79
+ case 6:
80
+ _i++;
81
+ return [3 /*break*/, 1];
82
+ case 7: return [2 /*return*/];
83
+ }
84
+ });
85
+ });
86
+ }
87
+ var gOnServerSideReady = [];
88
+ var gOnAppExiting = [];
89
+ var gOnAppExited = [];
90
+ var gOnAppStart = [];
91
+ var gIsServerSideReady = !(isNodeJS || isBunJS);
92
+ var gIsHotReload = globalThis.jopiHotReload !== undefined;
93
+ var gIsAppStarted = false;
94
+ if (gIsHotReload) {
95
+ execListeners(globalThis.jopiHotReload.onHotReload).then();
96
+ }
97
+ else {
98
+ globalThis.jopiHotReload = {
99
+ onHotReload: [],
100
+ memory: {}
101
+ };
102
+ }
103
+ var gOnHotReload = globalThis.jopiHotReload.onHotReload;
104
+ var gMemory = globalThis.jopiHotReload.memory;
105
+ export function onServerSideReady(listener) {
106
+ if (gIsServerSideReady)
107
+ listener();
108
+ else
109
+ gOnServerSideReady.push(listener);
110
+ }
111
+ export function waitServerSideReady() {
112
+ if (gIsServerSideReady) {
113
+ return Promise.resolve();
114
+ }
115
+ return new Promise(function (r) {
116
+ onServerSideReady(r);
117
+ });
118
+ }
119
+ export function declareServerSideReady() {
120
+ return __awaiter(this, void 0, void 0, function () {
121
+ return __generator(this, function (_a) {
122
+ switch (_a.label) {
123
+ case 0:
124
+ gIsServerSideReady = true;
125
+ return [4 /*yield*/, execListeners(gOnServerSideReady)];
126
+ case 1:
127
+ _a.sent();
128
+ return [2 /*return*/];
129
+ }
130
+ });
131
+ });
132
+ }
133
+ export function onAppStart(listener) {
134
+ if (gIsAppStarted)
135
+ listener();
136
+ else
137
+ gOnAppStart.push(listener);
138
+ }
139
+ export function onAppExiting(listener) {
140
+ if (gIsExited)
141
+ listener();
142
+ else
143
+ gOnAppExiting.push(listener);
144
+ }
145
+ export function onAppExited(listener) {
146
+ if (gIsExited)
147
+ listener();
148
+ else
149
+ gOnAppExited.push(listener);
150
+ }
151
+ export function declareAppStarted() {
152
+ return __awaiter(this, void 0, void 0, function () {
153
+ return __generator(this, function (_a) {
154
+ switch (_a.label) {
155
+ case 0:
156
+ gIsAppStarted = true;
157
+ return [4 /*yield*/, execListeners(gOnAppStart)];
158
+ case 1:
159
+ _a.sent();
160
+ return [2 /*return*/];
161
+ }
162
+ });
163
+ });
164
+ }
165
+ export function declareAppExiting() {
166
+ return __awaiter(this, void 0, void 0, function () {
167
+ return __generator(this, function (_a) {
168
+ switch (_a.label) {
169
+ case 0:
170
+ if (gIsExited)
171
+ return [2 /*return*/];
172
+ gIsExited = true;
173
+ if (!isUsingWorker()) return [3 /*break*/, 2];
174
+ // Wait 1 sec, which allows the worker to correctly initialize.
175
+ return [4 /*yield*/, jk_timer.tick(1000)];
176
+ case 1:
177
+ // Wait 1 sec, which allows the worker to correctly initialize.
178
+ _a.sent();
179
+ _a.label = 2;
180
+ case 2:
181
+ gIsAppStarted = false;
182
+ return [4 /*yield*/, execListeners(gOnAppExiting)];
183
+ case 3:
184
+ _a.sent();
185
+ if (!isUsingWorker()) return [3 /*break*/, 5];
186
+ // Allows to worker to correctly stop their activity.
187
+ return [4 /*yield*/, jk_timer.tick(100)];
188
+ case 4:
189
+ // Allows to worker to correctly stop their activity.
190
+ _a.sent();
191
+ _a.label = 5;
192
+ case 5:
193
+ if (!!jk_thread.isMainThread) return [3 /*break*/, 7];
194
+ // Allows to worker to correctly stop their activity.
195
+ return [4 /*yield*/, jk_timer.tick(50)];
196
+ case 6:
197
+ // Allows to worker to correctly stop their activity.
198
+ _a.sent();
199
+ _a.label = 7;
200
+ case 7: return [4 /*yield*/, execListeners(gOnAppExited)];
201
+ case 8:
202
+ _a.sent();
203
+ return [2 /*return*/];
204
+ }
205
+ });
206
+ });
207
+ }
208
+ export function executeApp(app) {
209
+ return __awaiter(this, void 0, void 0, function () {
210
+ var res;
211
+ return __generator(this, function (_a) {
212
+ switch (_a.label) {
213
+ case 0: return [4 /*yield*/, waitServerSideReady()];
214
+ case 1:
215
+ _a.sent();
216
+ declareAppStarted();
217
+ _a.label = 2;
218
+ case 2:
219
+ _a.trys.push([2, , 5, 6]);
220
+ res = app();
221
+ if (!(res instanceof Promise)) return [3 /*break*/, 4];
222
+ return [4 /*yield*/, res];
223
+ case 3:
224
+ _a.sent();
225
+ _a.label = 4;
226
+ case 4: return [3 /*break*/, 6];
227
+ case 5:
228
+ declareAppExiting();
229
+ return [7 /*endfinally*/];
230
+ case 6: return [2 /*return*/];
231
+ }
232
+ });
233
+ });
234
+ }
235
+ //endregion
236
+ //region Hot-reload
237
+ export function onHotReload(listener) {
238
+ gOnHotReload.push(listener);
239
+ }
240
+ export function keepOnHotReload(key, provider) {
241
+ var current = gMemory[key];
242
+ if (current !== undefined)
243
+ return current;
244
+ return gMemory[key] = provider();
245
+ }
246
+ export function clearHotReloadKey(key) {
247
+ delete (gMemory[key]);
248
+ }
249
+ //endregion
250
+ //region Temp dir
251
+ export function getTempDir() {
252
+ if (!gTempDir) {
253
+ gTempDir = jk_fs.resolve(process.cwd(), "temp");
254
+ }
255
+ return gTempDir;
256
+ }
257
+ var gIsExited = false;
258
+ var gTempDir;
259
+ //endregion
260
+ //region Resolving
261
+ export function findNodePackageDir(packageName, useLinuxPathFormat) {
262
+ if (useLinuxPathFormat === void 0) { useLinuxPathFormat = true; }
263
+ var currentDir = jk_fs.dirname(findPackageJson());
264
+ while (true) {
265
+ var packagePath = jk_fs.join(currentDir, 'node_modules', packageName);
266
+ if (jk_fs.isDirectorySync(packagePath)) {
267
+ if (useLinuxPathFormat)
268
+ return jk_fs.win32ToLinuxPath(packagePath);
269
+ return packagePath;
270
+ }
271
+ var parentDir = jk_fs.dirname(currentDir);
272
+ // Reached root directory
273
+ if (parentDir === currentDir) {
274
+ break;
275
+ }
276
+ currentDir = parentDir;
277
+ }
278
+ return undefined;
279
+ }
280
+ export function requireNodePackageDir(packageName, useLinuxPathFormat) {
281
+ if (useLinuxPathFormat === void 0) { useLinuxPathFormat = true; }
282
+ var pkgDir = findNodePackageDir(packageName, useLinuxPathFormat);
283
+ if (!pkgDir)
284
+ throw new Error("Package '" + packageName + "' not found");
285
+ return pkgDir;
286
+ }
287
+ export function findPackageJsonDir(searchFromDir) {
288
+ if (searchFromDir === void 0) { searchFromDir = getCodeSourceDirHint(); }
289
+ var pkgJsonPath = findPackageJson(searchFromDir);
290
+ return jk_fs.dirname(pkgJsonPath);
291
+ }
292
+ export function findPackageJson(searchFromDir) {
293
+ if (searchFromDir === void 0) { searchFromDir = getCodeSourceDirHint(); }
294
+ if (!searchFromDir && (gPackageJsonPath !== undefined))
295
+ return gPackageJsonPath;
296
+ var currentDir = searchFromDir;
297
+ while (true) {
298
+ var packagePath = jk_fs.join(currentDir, 'package.json');
299
+ if (jk_fs.isFileSync(packagePath))
300
+ return gPackageJsonPath = packagePath;
301
+ var parentDir = jk_fs.dirname(currentDir);
302
+ // Reached root directory
303
+ if (parentDir === currentDir)
304
+ break;
305
+ currentDir = parentDir;
306
+ }
307
+ throw "No package.json found.";
308
+ }
309
+ //
310
+ var gPackageJsonPath;
311
+ export function setApplicationMainFile(applicationMainFile) {
312
+ gApplicationMainFile = applicationMainFile;
313
+ gCodeSourceDirHint = jk_fs.dirname(applicationMainFile);
314
+ }
315
+ export function getApplicationMainFile() {
316
+ return gApplicationMainFile;
317
+ }
318
+ export function getCodeSourceDirHint() {
319
+ if (!gCodeSourceDirHint)
320
+ return process.cwd();
321
+ return gCodeSourceDirHint;
322
+ }
323
+ export function getSourceCodeDir() {
324
+ if (gSourceCodeDir)
325
+ return gSourceCodeDir;
326
+ var pkgJsonPath = findPackageJson();
327
+ var dirName = jk_fs.join(jk_fs.dirname(pkgJsonPath), "src");
328
+ if (jk_fs.isDirectorySync(dirName)) {
329
+ return gSourceCodeDir = dirName;
330
+ }
331
+ return gSourceCodeDir = jk_fs.dirname(pkgJsonPath);
332
+ }
333
+ export function getCompiledCodeDir() {
334
+ if (gCompiledSourcesDir)
335
+ return gCompiledSourcesDir;
336
+ var sourceCodeDir = getSourceCodeDir();
337
+ if (!sourceCodeDir.endsWith("src")) {
338
+ return gCompiledSourcesDir = sourceCodeDir;
339
+ }
340
+ // This means that it's Bun.js, and it directly uses the TypeScript version.
341
+ if (gApplicationMainFile && isBunJS && gApplicationMainFile.startsWith(sourceCodeDir)) {
342
+ return gCompiledSourcesDir = sourceCodeDir;
343
+ }
344
+ var pkgJsonPath = findPackageJson();
345
+ var rootDir = jk_fs.dirname(pkgJsonPath);
346
+ for (var _i = 0, _a = ["dist", "build", "out"]; _i < _a.length; _i++) {
347
+ var toTest = _a[_i];
348
+ if (jk_fs.isDirectorySync(jk_fs.join(rootDir, toTest))) {
349
+ return gCompiledSourcesDir = jk_fs.join(rootDir, toTest);
350
+ }
351
+ }
352
+ // No output dir? Assume we compiled on the same dir.
353
+ return rootDir;
354
+ }
355
+ export function getCompiledFilePathFor(sourceFilePath) {
356
+ var compiledCodeDir = getCompiledCodeDir();
357
+ var sourceCodeDir = getSourceCodeDir();
358
+ if (!sourceFilePath.startsWith(sourceCodeDir)) {
359
+ throw new Error("jopi-loader - The source file must be in the source code directory: " + sourceFilePath);
360
+ }
361
+ var filePath = sourceFilePath.substring(sourceCodeDir.length);
362
+ if (isNodeJS && !filePath.endsWith(".js")) {
363
+ var idx = filePath.lastIndexOf(".");
364
+ if (idx !== -1)
365
+ filePath = filePath.substring(0, idx) + ".js";
366
+ }
367
+ return jk_fs.join(compiledCodeDir, filePath);
368
+ }
369
+ export function getSourcesCodePathFor(compiledFilePath) {
370
+ var compiledCodeDir = getCompiledCodeDir();
371
+ var sourceCodeDir = getSourceCodeDir();
372
+ if (!compiledFilePath.startsWith(compiledCodeDir)) {
373
+ throw new Error("jopi-loader - The compiled file must be in the compiled code directory: " + compiledFilePath);
374
+ }
375
+ var filePath = jk_fs.join(sourceCodeDir, compiledFilePath.substring(compiledCodeDir.length));
376
+ var idx = filePath.lastIndexOf(".");
377
+ if (idx !== -1)
378
+ filePath = filePath.substring(0, idx);
379
+ if (jk_fs.isFileSync(filePath + ".tsx")) {
380
+ return filePath + ".tsx";
381
+ }
382
+ if (jk_fs.isFileSync(filePath + ".ts")) {
383
+ return filePath + ".ts";
384
+ }
385
+ return filePath + ".js";
386
+ }
387
+ export function requireSourceOf(scriptPath) {
388
+ var src = searchSourceOf(scriptPath);
389
+ if (!src)
390
+ throw new Error("Cannot find source of " + scriptPath);
391
+ return src;
392
+ }
393
+ /**
394
+ * Search the source of the component if it's a JavaScript and not a TypeScript.
395
+ * Why? Because EsBuild doesn't work well on already transpiled code.
396
+ */
397
+ export function searchSourceOf(scriptPath) {
398
+ function tryResolve(filePath, outDir) {
399
+ var out = jk_fs.sep + outDir + jk_fs.sep;
400
+ var idx = filePath.lastIndexOf(out);
401
+ if (idx !== -1) {
402
+ filePath = filePath.slice(0, idx) + jk_fs.sep + "src" + jk_fs.sep + filePath.slice(idx + out.length);
403
+ if (jk_fs.isFileSync(filePath))
404
+ return filePath;
405
+ }
406
+ return undefined;
407
+ }
408
+ var scriptExt = jk_fs.extname(scriptPath);
409
+ if ((scriptExt === ".ts") || (scriptExt === ".tsx")) {
410
+ // Is already the source.
411
+ return scriptPath;
412
+ }
413
+ var originalScriptPath = scriptPath;
414
+ var isJavascript = (scriptPath.endsWith(".js") || (scriptPath.endsWith(".jsx")));
415
+ if (isJavascript) {
416
+ // Remove his extension.
417
+ scriptPath = scriptPath.slice(0, -scriptExt.length);
418
+ }
419
+ var tryDirs = ["dist", "build"];
420
+ for (var _i = 0, tryDirs_1 = tryDirs; _i < tryDirs_1.length; _i++) {
421
+ var toTry = tryDirs_1[_i];
422
+ if (isJavascript) {
423
+ var found = tryResolve(scriptPath + ".tsx", toTry);
424
+ if (found)
425
+ return found;
426
+ found = tryResolve(scriptPath + ".ts", toTry);
427
+ if (found)
428
+ return found;
429
+ }
430
+ else {
431
+ var found = tryResolve(scriptPath, toTry);
432
+ if (found)
433
+ return found;
434
+ }
435
+ }
436
+ return originalScriptPath;
437
+ }
438
+ var gSourceCodeDir;
439
+ var gCodeSourceDirHint;
440
+ var gApplicationMainFile;
441
+ var gCompiledSourcesDir;
442
+ //endregion
@@ -171,32 +171,22 @@ let gTempDir: string|undefined;
171
171
 
172
172
  //region Resolving
173
173
 
174
- export function findNodePackageDir(packageName: string, useLinuxPathFormat: boolean = true): string|undefined {
175
- let currentDir = jk_fs.dirname(findPackageJson());
174
+ export async function findNodePackageDir(packageName: string, searchFromDir = getCodeSourceDirHint()): Promise<string | undefined> {
175
+ let currentDir = jk_fs.resolve(searchFromDir);
176
176
 
177
177
  while (true) {
178
- const packagePath = jk_fs.join(currentDir, 'node_modules', packageName);
179
-
180
- if (jk_fs.isDirectorySync(packagePath)) {
181
- if (useLinuxPathFormat) return jk_fs.win32ToLinuxPath(packagePath);
182
- return packagePath;
183
- }
184
-
178
+ let packagePath = jk_fs.join(currentDir, 'node_modules', packageName);
179
+ if (await jk_fs.isDirectory(packagePath)) return packagePath;
185
180
  const parentDir = jk_fs.dirname(currentDir);
186
-
187
- // Reached root directory
188
- if (parentDir === currentDir) {
189
- break;
190
- }
191
-
181
+ if (parentDir === currentDir) break;
192
182
  currentDir = parentDir;
193
183
  }
194
184
 
195
185
  return undefined;
196
186
  }
197
187
 
198
- export function requireNodePackageDir(packageName: string, useLinuxPathFormat: boolean = true): string {
199
- let pkgDir = findNodePackageDir(packageName, useLinuxPathFormat);
188
+ export async function requireNodePackageDir(packageName: string, searchFromDir = getCodeSourceDirHint()): Promise<string> {
189
+ let pkgDir = await findNodePackageDir(packageName, searchFromDir);
200
190
  if (!pkgDir) throw new Error("Package '" + packageName + "' not found");
201
191
  return pkgDir;
202
192
  }
@@ -0,0 +1,16 @@
1
+ import crypto from "node:crypto";
2
+ import { isNodeJS } from "jopi-toolkit/jk_what";
3
+ function node_md5(data) {
4
+ return crypto.createHash('md5').update(data).digest('hex');
5
+ }
6
+ function node_fastHash(data) {
7
+ return crypto.createHash('sha256').update(data).digest('hex');
8
+ }
9
+ function bun_fastHash(data) {
10
+ return Bun.hash(data, 12346).toString();
11
+ }
12
+ function bun_md5(data) {
13
+ return Bun.MD5.hash(data, "hex");
14
+ }
15
+ export var md5 = isNodeJS ? node_md5 : bun_md5;
16
+ export var fastHash = isNodeJS ? node_fastHash : bun_fastHash;