@microwiseai/snapshot 0.3.48 → 0.3.58

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/commands/access.js +1 -1
  2. package/dist/commands/access.js.map +1 -1
  3. package/dist/commands/doctor.d.ts +2 -0
  4. package/dist/commands/doctor.d.ts.map +1 -0
  5. package/dist/commands/doctor.js +37 -0
  6. package/dist/commands/doctor.js.map +1 -0
  7. package/dist/commands/install.d.ts.map +1 -1
  8. package/dist/commands/install.js +121 -76
  9. package/dist/commands/install.js.map +1 -1
  10. package/dist/commands/setup.d.ts +5 -0
  11. package/dist/commands/setup.d.ts.map +1 -0
  12. package/dist/commands/setup.js +52 -0
  13. package/dist/commands/setup.js.map +1 -0
  14. package/dist/index.js +16 -0
  15. package/dist/index.js.map +1 -1
  16. package/dist/lib/access-sync.d.ts.map +1 -1
  17. package/dist/lib/access-sync.js +2 -0
  18. package/dist/lib/access-sync.js.map +1 -1
  19. package/dist/lib/config.d.ts +15 -0
  20. package/dist/lib/config.d.ts.map +1 -1
  21. package/dist/lib/config.js +96 -0
  22. package/dist/lib/config.js.map +1 -1
  23. package/dist/lib/gitlab.js +3 -3
  24. package/dist/lib/gitlab.js.map +1 -1
  25. package/dist/lib/prerequisites.d.ts +33 -0
  26. package/dist/lib/prerequisites.d.ts.map +1 -0
  27. package/dist/lib/prerequisites.js +109 -0
  28. package/dist/lib/prerequisites.js.map +1 -0
  29. package/dist/lib/session.d.ts +6 -8
  30. package/dist/lib/session.d.ts.map +1 -1
  31. package/dist/lib/session.js +10 -12
  32. package/dist/lib/session.js.map +1 -1
  33. package/dist/lib/types.d.ts +1 -1
  34. package/dist/lib/types.d.ts.map +1 -1
  35. package/node_modules/@microwiseai/snapshot-dedup/dist/dedup.d.ts +108 -0
  36. package/node_modules/@microwiseai/snapshot-dedup/dist/dedup.d.ts.map +1 -0
  37. package/node_modules/@microwiseai/snapshot-dedup/dist/dedup.js +196 -0
  38. package/node_modules/@microwiseai/snapshot-dedup/dist/dedup.js.map +1 -0
  39. package/node_modules/@microwiseai/snapshot-dedup/dist/index.d.ts +21 -0
  40. package/node_modules/@microwiseai/snapshot-dedup/dist/index.d.ts.map +1 -0
  41. package/node_modules/@microwiseai/snapshot-dedup/dist/index.js +27 -0
  42. package/node_modules/@microwiseai/snapshot-dedup/dist/index.js.map +1 -0
  43. package/node_modules/@microwiseai/snapshot-dedup/package.json +41 -0
  44. package/node_modules/@microwiseai/snapshot-parallel/dist/index.d.ts +9 -0
  45. package/node_modules/@microwiseai/snapshot-parallel/dist/index.d.ts.map +1 -0
  46. package/node_modules/@microwiseai/snapshot-parallel/dist/index.js +8 -0
  47. package/node_modules/@microwiseai/snapshot-parallel/dist/index.js.map +1 -0
  48. package/node_modules/@microwiseai/snapshot-parallel/dist/parallel-installer.d.ts +86 -0
  49. package/node_modules/@microwiseai/snapshot-parallel/dist/parallel-installer.d.ts.map +1 -0
  50. package/node_modules/@microwiseai/snapshot-parallel/dist/parallel-installer.js +159 -0
  51. package/node_modules/@microwiseai/snapshot-parallel/dist/parallel-installer.js.map +1 -0
  52. package/node_modules/@microwiseai/snapshot-parallel/package.json +41 -0
  53. package/package.json +7 -3
@@ -0,0 +1,159 @@
1
+ /**
2
+ * Parallel Package Installer
3
+ *
4
+ * Concurrency-limited parallel execution for package installation.
5
+ * Replaces serial for-loops in core/install.ts with Promise-pool pattern.
6
+ */
7
+ // ============================================================
8
+ // Core: Concurrency-limited Promise Pool
9
+ // ============================================================
10
+ /**
11
+ * Run an array of async tasks with a concurrency limit.
12
+ * Uses a pool pattern (not chunking) so a new task starts
13
+ * as soon as a slot frees up.
14
+ */
15
+ async function runPool(items, concurrency, fn, signal) {
16
+ const results = new Array(items.length);
17
+ let nextIndex = 0;
18
+ async function worker() {
19
+ while (nextIndex < items.length) {
20
+ if (signal?.aborted) {
21
+ break;
22
+ }
23
+ const idx = nextIndex++;
24
+ results[idx] = await fn(items[idx], idx);
25
+ }
26
+ }
27
+ const workers = Array.from({ length: Math.min(concurrency, items.length) }, () => worker());
28
+ await Promise.all(workers);
29
+ return results;
30
+ }
31
+ // ============================================================
32
+ // Public API
33
+ // ============================================================
34
+ /**
35
+ * Install packages in parallel with concurrency control.
36
+ *
37
+ * @param entries - List of packages to install
38
+ * @param installFn - Function that installs a single package (caller provides the actual logic)
39
+ * @param options - Concurrency, progress callback, abort signal
40
+ *
41
+ * @example
42
+ * ```ts
43
+ * import { parallelInstall } from '@microwiseai/snapshot-parallel';
44
+ *
45
+ * const result = await parallelInstall(
46
+ * [{ name: '@ist/smon', version: '0.2.15' }],
47
+ * async (entry) => {
48
+ * // your install logic here
49
+ * return { success: true };
50
+ * },
51
+ * { concurrency: 4, onProgress: (e) => console.log(`${e.current}/${e.total}`) }
52
+ * );
53
+ * ```
54
+ */
55
+ export async function parallelInstall(entries, installFn, options = {}) {
56
+ const { concurrency = 4, onProgress, signal } = options;
57
+ if (entries.length === 0) {
58
+ return { installed: [], failed: [], results: [], totalDurationMs: 0 };
59
+ }
60
+ const totalStart = Date.now();
61
+ let completedCount = 0;
62
+ const results = await runPool(entries, concurrency, async (entry, _index) => {
63
+ const spec = `${entry.name}@${entry.version}`;
64
+ const start = Date.now();
65
+ if (signal?.aborted) {
66
+ const res = {
67
+ name: entry.name,
68
+ version: entry.version,
69
+ spec,
70
+ success: false,
71
+ error: 'Aborted',
72
+ durationMs: 0,
73
+ };
74
+ return res;
75
+ }
76
+ try {
77
+ const outcome = await installFn(entry);
78
+ const durationMs = Date.now() - start;
79
+ const res = {
80
+ name: entry.name,
81
+ version: entry.version,
82
+ spec,
83
+ success: outcome.success,
84
+ error: outcome.error,
85
+ durationMs,
86
+ };
87
+ completedCount++;
88
+ onProgress?.({
89
+ current: completedCount,
90
+ total: entries.length,
91
+ result: res,
92
+ });
93
+ return res;
94
+ }
95
+ catch (err) {
96
+ const durationMs = Date.now() - start;
97
+ const error = err instanceof Error ? err.message : String(err);
98
+ const res = {
99
+ name: entry.name,
100
+ version: entry.version,
101
+ spec,
102
+ success: false,
103
+ error,
104
+ durationMs,
105
+ };
106
+ completedCount++;
107
+ onProgress?.({
108
+ current: completedCount,
109
+ total: entries.length,
110
+ result: res,
111
+ });
112
+ return res;
113
+ }
114
+ }, signal);
115
+ const installed = [];
116
+ const failed = [];
117
+ for (const r of results) {
118
+ if (!r)
119
+ continue; // skipped due to abort
120
+ if (r.success) {
121
+ installed.push(r.spec);
122
+ }
123
+ else {
124
+ failed.push(r.spec);
125
+ }
126
+ }
127
+ return {
128
+ installed,
129
+ failed,
130
+ results: results.filter(Boolean),
131
+ totalDurationMs: Date.now() - totalStart,
132
+ };
133
+ }
134
+ // ============================================================
135
+ // Helpers: Convert between Record<string,string> and PackageEntry[]
136
+ // ============================================================
137
+ /**
138
+ * Convert a { name: version } record to PackageEntry[].
139
+ * Preserves insertion order.
140
+ */
141
+ export function recordToEntries(packages) {
142
+ return Object.entries(packages).map(([name, version]) => ({ name, version }));
143
+ }
144
+ /**
145
+ * Partition entries by a classifier function.
146
+ * Useful for splitting skit vs npm vs generic before parallel install.
147
+ */
148
+ export function partitionEntries(entries, classifier) {
149
+ const result = {};
150
+ for (const entry of entries) {
151
+ const key = classifier(entry);
152
+ if (!result[key]) {
153
+ result[key] = [];
154
+ }
155
+ result[key].push(entry);
156
+ }
157
+ return result;
158
+ }
159
+ //# sourceMappingURL=parallel-installer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parallel-installer.js","sourceRoot":"","sources":["../src/parallel-installer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ {
2
+ "name": "@microwiseai/snapshot-parallel",
3
+ "version": "0.1.0",
4
+ "description": "Parallel package installer with concurrency control for Snapshot CLI",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ }
13
+ },
14
+ "scripts": {
15
+ "build": "tsc",
16
+ "dev": "tsc --watch",
17
+ "test": "vitest",
18
+ "test:run": "vitest run",
19
+ "prepublishOnly": "npm run build"
20
+ },
21
+ "files": [
22
+ "dist"
23
+ ],
24
+ "keywords": [
25
+ "snapshot",
26
+ "parallel",
27
+ "installer",
28
+ "concurrency"
29
+ ],
30
+ "author": "IST Team",
31
+ "license": "MIT",
32
+ "dependencies": {},
33
+ "devDependencies": {
34
+ "@types/node": "^20.11.0",
35
+ "typescript": "^5.7.3",
36
+ "vitest": "^4.0.18"
37
+ },
38
+ "engines": {
39
+ "node": ">=18.0.0"
40
+ }
41
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@microwiseai/snapshot",
3
- "version": "0.3.48",
3
+ "version": "0.3.58",
4
4
  "description": "CLI for installing IST Snapshot packages",
5
5
  "type": "module",
6
6
  "main": "./dist/lib.js",
@@ -35,7 +35,9 @@
35
35
  "@ist/registry-config",
36
36
  "@microwiseai/import-telemetry",
37
37
  "@microwiseai/license",
38
- "@microwiseai/skit"
38
+ "@microwiseai/skit",
39
+ "@microwiseai/snapshot-dedup",
40
+ "@microwiseai/snapshot-parallel"
39
41
  ],
40
42
  "keywords": [
41
43
  "snapshot",
@@ -72,6 +74,8 @@
72
74
  "@ist/registry-config",
73
75
  "@microwiseai/import-telemetry",
74
76
  "@microwiseai/license",
75
- "@microwiseai/skit"
77
+ "@microwiseai/skit",
78
+ "@microwiseai/snapshot-dedup",
79
+ "@microwiseai/snapshot-parallel"
76
80
  ]
77
81
  }