@atmyapp/cli 0.0.2 → 0.0.4

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.
@@ -0,0 +1,126 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.WorkerPool = void 0;
13
+ const worker_threads_1 = require("worker_threads");
14
+ const os_1 = require("os");
15
+ class WorkerPool {
16
+ constructor(logger, maxWorkers) {
17
+ this.workers = [];
18
+ this.taskQueue = [];
19
+ this.activeWorkers = new Set();
20
+ this.results = new Map();
21
+ this.logger = logger;
22
+ this.maxWorkers = maxWorkers || Math.min((0, os_1.cpus)().length, 8); // Cap at 8 workers
23
+ }
24
+ processFiles(tasks) {
25
+ return __awaiter(this, void 0, void 0, function* () {
26
+ this.taskQueue = [...tasks];
27
+ this.results.clear();
28
+ this.logger.info(`🚀 Starting parallel processing with ${this.maxWorkers} workers`);
29
+ this.logger.verbose_log(`Processing ${tasks.length} tasks in parallel`);
30
+ // Create workers
31
+ const workerPromises = [];
32
+ const workersToCreate = Math.min(this.maxWorkers, tasks.length);
33
+ // Determine the correct worker script path
34
+ const workerScriptPath = __filename.endsWith(".ts")
35
+ ? __filename.replace(".ts", ".js").replace("/src/", "/dist/")
36
+ : __filename;
37
+ for (let i = 0; i < workersToCreate; i++) {
38
+ const worker = new worker_threads_1.Worker(workerScriptPath);
39
+ this.workers.push(worker);
40
+ workerPromises.push(this.setupWorker(worker));
41
+ }
42
+ // Wait for all workers to complete
43
+ yield Promise.all(workerPromises);
44
+ // Cleanup workers
45
+ yield this.cleanup();
46
+ // Return results in original order
47
+ return tasks.map((task) => this.results.get(task.id));
48
+ });
49
+ }
50
+ setupWorker(worker) {
51
+ return __awaiter(this, void 0, void 0, function* () {
52
+ return new Promise((resolve, reject) => {
53
+ worker.on("message", (result) => {
54
+ this.results.set(result.id, result);
55
+ if (result.success) {
56
+ this.logger.verbose_log(`✅ Worker completed task ${result.id}`);
57
+ }
58
+ else {
59
+ this.logger.error(`❌ Worker failed task ${result.id}: ${result.error}`);
60
+ }
61
+ // Assign next task or finish
62
+ this.assignNextTask(worker, resolve);
63
+ });
64
+ worker.on("error", (error) => {
65
+ this.logger.error(`Worker error: ${error.message}`);
66
+ reject(error);
67
+ });
68
+ worker.on("exit", (code) => {
69
+ if (code !== 0 && this.activeWorkers.has(worker)) {
70
+ this.logger.error(`Worker exited with code ${code}`);
71
+ }
72
+ this.activeWorkers.delete(worker);
73
+ });
74
+ // Start with first task
75
+ this.assignNextTask(worker, resolve);
76
+ });
77
+ });
78
+ }
79
+ assignNextTask(worker, resolve) {
80
+ const task = this.taskQueue.shift();
81
+ if (task) {
82
+ this.activeWorkers.add(worker);
83
+ worker.postMessage(task);
84
+ }
85
+ else {
86
+ // No more tasks, resolve this worker
87
+ this.activeWorkers.delete(worker);
88
+ resolve();
89
+ }
90
+ }
91
+ cleanup() {
92
+ return __awaiter(this, void 0, void 0, function* () {
93
+ const terminationPromises = this.workers.map((worker) => worker
94
+ .terminate()
95
+ .catch((err) => this.logger.warn(`Error terminating worker: ${err.message}`)));
96
+ yield Promise.all(terminationPromises);
97
+ this.workers = [];
98
+ });
99
+ }
100
+ }
101
+ exports.WorkerPool = WorkerPool;
102
+ // Worker thread implementation
103
+ if (!worker_threads_1.isMainThread && worker_threads_1.parentPort) {
104
+ // Import required modules in worker context
105
+ const { processFileInWorker } = require("./worker-file-processor");
106
+ worker_threads_1.parentPort.on("message", (task) => __awaiter(void 0, void 0, void 0, function* () {
107
+ try {
108
+ const contents = yield processFileInWorker(task.filePath, task.tsconfigPath);
109
+ const result = {
110
+ id: task.id,
111
+ success: true,
112
+ contents,
113
+ };
114
+ worker_threads_1.parentPort.postMessage(result);
115
+ }
116
+ catch (error) {
117
+ const result = {
118
+ id: task.id,
119
+ success: false,
120
+ contents: [],
121
+ error: error instanceof Error ? error.message : "Unknown error",
122
+ };
123
+ worker_threads_1.parentPort.postMessage(result);
124
+ }
125
+ }));
126
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atmyapp/cli",
3
- "version": "0.0.2",
3
+ "version": "0.0.4",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "scripts": {
@@ -28,7 +28,7 @@
28
28
  "license": "ISC",
29
29
  "description": "",
30
30
  "devDependencies": {
31
- "@atmyapp/core": "^0.0.3",
31
+ "@atmyapp/core": "^0.0.5",
32
32
  "@types/jest": "^29.5.14",
33
33
  "@typescript-eslint/eslint-plugin": "^8.32.1",
34
34
  "@typescript-eslint/parser": "^8.32.1",