@microwiseai/snapshot 0.3.71 → 0.4.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.
Files changed (60) hide show
  1. package/dist/commands/doctor.js.map +1 -1
  2. package/dist/commands/install.d.ts +9 -1
  3. package/dist/commands/install.d.ts.map +1 -1
  4. package/dist/commands/install.js +210 -17
  5. package/dist/commands/install.js.map +1 -1
  6. package/dist/commands/license.js.map +1 -1
  7. package/dist/commands/list.d.ts +15 -0
  8. package/dist/commands/list.d.ts.map +1 -1
  9. package/dist/commands/list.js +21 -39
  10. package/dist/commands/list.js.map +1 -1
  11. package/dist/commands/publish.d.ts.map +1 -1
  12. package/dist/commands/publish.js +22 -0
  13. package/dist/commands/publish.js.map +1 -1
  14. package/dist/index.js +37 -11
  15. package/dist/index.js.map +1 -1
  16. package/dist/lib/config.d.ts.map +1 -1
  17. package/dist/lib/config.js +15 -10
  18. package/dist/lib/config.js.map +1 -1
  19. package/dist/lib/transitive-resolver.js.map +1 -1
  20. package/dist/lib/types.d.ts +1 -0
  21. package/dist/lib/types.d.ts.map +1 -1
  22. package/dist/lib/version-validator.d.ts +28 -0
  23. package/dist/lib/version-validator.d.ts.map +1 -0
  24. package/dist/lib/version-validator.js +105 -0
  25. package/dist/lib/version-validator.js.map +1 -0
  26. package/dist/lib.js.map +1 -1
  27. package/node_modules/@microwiseai/snapshot-dedup/dist/dedup.d.ts +86 -1
  28. package/node_modules/@microwiseai/snapshot-dedup/dist/dedup.d.ts.map +1 -1
  29. package/node_modules/@microwiseai/snapshot-dedup/dist/dedup.js +171 -5
  30. package/node_modules/@microwiseai/snapshot-dedup/dist/dedup.js.map +1 -1
  31. package/node_modules/@microwiseai/snapshot-dedup/dist/index.d.ts +1 -1
  32. package/node_modules/@microwiseai/snapshot-dedup/dist/index.d.ts.map +1 -1
  33. package/node_modules/@microwiseai/snapshot-dedup/dist/index.js +4 -2
  34. package/node_modules/@microwiseai/snapshot-dedup/dist/index.js.map +1 -1
  35. package/node_modules/@microwiseai/snapshot-dedup/package.json +8 -2
  36. package/package.json +9 -4
  37. package/dist/lib/access-sync.test.d.ts +0 -2
  38. package/dist/lib/access-sync.test.d.ts.map +0 -1
  39. package/dist/lib/access-sync.test.js +0 -112
  40. package/dist/lib/access-sync.test.js.map +0 -1
  41. package/dist/lib/auth-flow.test.d.ts +0 -2
  42. package/dist/lib/auth-flow.test.d.ts.map +0 -1
  43. package/dist/lib/auth-flow.test.js +0 -265
  44. package/dist/lib/auth-flow.test.js.map +0 -1
  45. package/dist/lib/config.test.d.ts +0 -2
  46. package/dist/lib/config.test.d.ts.map +0 -1
  47. package/dist/lib/config.test.js +0 -151
  48. package/dist/lib/config.test.js.map +0 -1
  49. package/dist/lib/gitlab.test.d.ts +0 -2
  50. package/dist/lib/gitlab.test.d.ts.map +0 -1
  51. package/dist/lib/gitlab.test.js +0 -63
  52. package/dist/lib/gitlab.test.js.map +0 -1
  53. package/dist/lib/registry.d.ts +0 -3
  54. package/dist/lib/registry.d.ts.map +0 -1
  55. package/dist/lib/registry.js +0 -53
  56. package/dist/lib/registry.js.map +0 -1
  57. package/dist/lib/transitive-resolver.test.d.ts +0 -2
  58. package/dist/lib/transitive-resolver.test.d.ts.map +0 -1
  59. package/dist/lib/transitive-resolver.test.js +0 -279
  60. package/dist/lib/transitive-resolver.test.js.map +0 -1
@@ -8,12 +8,20 @@
8
8
  * Format: { "packages": { "@ist/sesh@0.3.33": { snapshot, installedAt } } }
9
9
  */
10
10
  export interface InstalledPackageEntry {
11
- /** Which snapshot installed this package */
11
+ /** Which snapshot FIRST installed this package (kept for backward compat) */
12
12
  snapshot: string;
13
13
  /** ISO timestamp */
14
14
  installedAt: string;
15
15
  /** Package version */
16
16
  version: string;
17
+ /**
18
+ * All snapshot names that reference (require) this package.
19
+ * Used by replace-mode (ADR 001) to decide whether a package is safe to
20
+ * remove: a package is only removed when NO other installed snapshot still
21
+ * references it. Optional on disk for backward compatibility — older history
22
+ * files are backfilled to `[snapshot]` on load (see loadInstallHistory).
23
+ */
24
+ referencedBy?: string[];
17
25
  }
18
26
  export interface InstallHistory {
19
27
  /** Map of "name@version" -> metadata */
@@ -54,6 +62,12 @@ export declare function getHistoryFilePath(): string;
54
62
  * Load install history from disk
55
63
  */
56
64
  export declare function loadInstallHistory(historyPath?: string): InstallHistory;
65
+ /**
66
+ * Ensure every history entry has a `referencedBy` array (migration/backfill).
67
+ * Missing/invalid → `[snapshot]` (or `[]` if snapshot also missing).
68
+ * Mutates the passed history in place.
69
+ */
70
+ export declare function backfillReferencedBy(history: InstallHistory): InstallHistory;
57
71
  /**
58
72
  * Save install history to disk
59
73
  */
@@ -62,6 +76,19 @@ export declare function saveInstallHistory(history: InstallHistory, historyPath?
62
76
  * Record successfully installed packages into history
63
77
  */
64
78
  export declare function recordInstalledPackages(packages: Record<string, string>, snapshotName: string, historyPath?: string): void;
79
+ /**
80
+ * Record that a snapshot *references* a set of packages, without (re)installing
81
+ * them. Used for dedup-skipped packages: even when a package was already
82
+ * installed by another snapshot and is skipped, the referencing snapshot must
83
+ * still be recorded in referencedBy so replace-mode won't later remove a
84
+ * package that this snapshot depends on.
85
+ *
86
+ * Only touches packages that already exist in history (skipped ⇒ present).
87
+ * Non-existent keys are ignored (no phantom entries).
88
+ */
89
+ export declare function recordReferences(packages: Record<string, string>, snapshotName: string, historyPath?: string): void;
90
+ /** Record references from a list of specs (e.g. ["@ist/sesh@0.3.33"]). */
91
+ export declare function recordReferencesFromSpecs(specs: string[], snapshotName: string, historyPath?: string): void;
65
92
  /**
66
93
  * Record a list of installed package specs (e.g., ["@ist/sesh@0.3.33"])
67
94
  */
@@ -105,4 +132,62 @@ export declare function getPackagesBySnapshot(snapshotName: string, historyPath?
105
132
  * Get total count of installed packages
106
133
  */
107
134
  export declare function getInstalledCount(historyPath?: string): number;
135
+ /** Snapshot names that reference (require) a given package@version. */
136
+ export declare function getReferencedBy(name: string, version: string, historyPath?: string): string[];
137
+ export interface ReplaceRemovalItem {
138
+ name: string;
139
+ version: string;
140
+ }
141
+ export interface ReplaceSharedItem {
142
+ name: string;
143
+ version: string;
144
+ /** Other snapshots that still reference this package (why it is kept). */
145
+ remainingRefs: string[];
146
+ }
147
+ /**
148
+ * A plan describing how to converge the system onto a snapshot's new version.
149
+ *
150
+ * - `remove`: packages from the previous version that are no longer in the new
151
+ * version AND are referenced by no other snapshot → safe to uninstall.
152
+ * - `keepShared`: packages no longer in the new version but STILL referenced by
153
+ * another installed snapshot → must NOT be uninstalled (would break it); this
154
+ * snapshot is simply dropped from their referencedBy.
155
+ * - `stale`: same package name present in the new version but at a different
156
+ * version → the old-version history entry is superseded (a global install
157
+ * already replaced the files); history-only cleanup, no uninstall.
158
+ */
159
+ export interface ReplacePlan {
160
+ remove: ReplaceRemovalItem[];
161
+ keepShared: ReplaceSharedItem[];
162
+ stale: ReplaceRemovalItem[];
163
+ }
164
+ /**
165
+ * Compute the replace plan for installing a new version of `snapshotName`.
166
+ *
167
+ * @param snapshotName - the snapshot whose version is being replaced
168
+ * @param newSet - the new version's full package set (name -> version),
169
+ * including the extends chain (e.g. from collectAllPackages)
170
+ *
171
+ * Ordering note: history keys are `name@version`, so recording the new version
172
+ * (e.g. `a@2`) never overwrites the previous entry (`a@1`) — both coexist. This
173
+ * function therefore works correctly whether called before OR after recording,
174
+ * and the install flow calls it AFTER recordInstalledSpecs/recordReferences.
175
+ * That order is in fact preferable: referencedBy for shared packages is
176
+ * up to date, the new current-version entries are classified as "keep", and
177
+ * superseded old-version entries are detected as `stale`. The plan is computed
178
+ * by iterating referencedBy (not getPackagesBySnapshot).
179
+ */
180
+ export declare function computeReplacePlan(snapshotName: string, newSet: Record<string, string>, historyPath?: string): ReplacePlan;
181
+ /**
182
+ * Apply the history side of a replace plan.
183
+ *
184
+ * @param removed - items whose uninstall SUCCEEDED (their history key is deleted)
185
+ * @param keepShared - items kept installed; `snapshotName` is dropped from refs
186
+ * @param stale - superseded old-version items; `snapshotName` dropped from refs
187
+ *
188
+ * For keepShared/stale entries, if dropping `snapshotName` leaves an empty
189
+ * referencedBy the history key is deleted too. Uninstall failures should be
190
+ * omitted from `removed` so their entries are preserved for a later retry.
191
+ */
192
+ export declare function applyReplaceHistory(snapshotName: string, removed: ReplaceRemovalItem[], keepShared: ReplaceSharedItem[], stale: ReplaceRemovalItem[], historyPath?: string): void;
108
193
  //# sourceMappingURL=dedup.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"dedup.d.ts","sourceRoot":"","sources":["../src/dedup.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dedup.d.ts","sourceRoot":"","sources":["../src/dedup.ts"],"names":[],"mappings":"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"}
@@ -37,6 +37,12 @@ export function loadInstallHistory(historyPath) {
37
37
  if (!data.packages || typeof data.packages !== 'object') {
38
38
  return { packages: {}, updatedAt: new Date().toISOString() };
39
39
  }
40
+ // Backward-compat migration: ensure every entry has a referencedBy set.
41
+ // Older history files (pre replace-mode / ADR 001) only stored `snapshot`
42
+ // (the first installer). Backfill referencedBy = [snapshot] so the safety
43
+ // check has data to work with. This runs in-memory on every load; it is
44
+ // persisted the next time saveInstallHistory() is called.
45
+ backfillReferencedBy(data);
40
46
  return data;
41
47
  }
42
48
  catch {
@@ -44,6 +50,19 @@ export function loadInstallHistory(historyPath) {
44
50
  return { packages: {}, updatedAt: new Date().toISOString() };
45
51
  }
46
52
  }
53
+ /**
54
+ * Ensure every history entry has a `referencedBy` array (migration/backfill).
55
+ * Missing/invalid → `[snapshot]` (or `[]` if snapshot also missing).
56
+ * Mutates the passed history in place.
57
+ */
58
+ export function backfillReferencedBy(history) {
59
+ for (const entry of Object.values(history.packages)) {
60
+ if (!Array.isArray(entry.referencedBy)) {
61
+ entry.referencedBy = entry.snapshot ? [entry.snapshot] : [];
62
+ }
63
+ }
64
+ return history;
65
+ }
47
66
  /**
48
67
  * Save install history to disk
49
68
  */
@@ -64,14 +83,64 @@ export function recordInstalledPackages(packages, snapshotName, historyPath) {
64
83
  const now = new Date().toISOString();
65
84
  for (const [name, version] of Object.entries(packages)) {
66
85
  const key = `${name}@${version}`;
67
- history.packages[key] = {
68
- snapshot: snapshotName,
69
- installedAt: now,
70
- version,
71
- };
86
+ const existing = history.packages[key];
87
+ if (existing) {
88
+ // Package already tracked: preserve the first-installer metadata
89
+ // (snapshot / installedAt) and just union this snapshot into referencedBy.
90
+ const refs = new Set(existing.referencedBy ?? (existing.snapshot ? [existing.snapshot] : []));
91
+ refs.add(snapshotName);
92
+ existing.referencedBy = Array.from(refs);
93
+ }
94
+ else {
95
+ history.packages[key] = {
96
+ snapshot: snapshotName,
97
+ installedAt: now,
98
+ version,
99
+ referencedBy: [snapshotName],
100
+ };
101
+ }
72
102
  }
73
103
  saveInstallHistory(history, historyPath);
74
104
  }
105
+ /**
106
+ * Record that a snapshot *references* a set of packages, without (re)installing
107
+ * them. Used for dedup-skipped packages: even when a package was already
108
+ * installed by another snapshot and is skipped, the referencing snapshot must
109
+ * still be recorded in referencedBy so replace-mode won't later remove a
110
+ * package that this snapshot depends on.
111
+ *
112
+ * Only touches packages that already exist in history (skipped ⇒ present).
113
+ * Non-existent keys are ignored (no phantom entries).
114
+ */
115
+ export function recordReferences(packages, snapshotName, historyPath) {
116
+ const history = loadInstallHistory(historyPath);
117
+ let changed = false;
118
+ for (const [name, version] of Object.entries(packages)) {
119
+ const key = `${name}@${version}`;
120
+ const existing = history.packages[key];
121
+ if (!existing)
122
+ continue;
123
+ const refs = new Set(existing.referencedBy ?? (existing.snapshot ? [existing.snapshot] : []));
124
+ if (!refs.has(snapshotName)) {
125
+ refs.add(snapshotName);
126
+ existing.referencedBy = Array.from(refs);
127
+ changed = true;
128
+ }
129
+ }
130
+ if (changed)
131
+ saveInstallHistory(history, historyPath);
132
+ }
133
+ /** Record references from a list of specs (e.g. ["@ist/sesh@0.3.33"]). */
134
+ export function recordReferencesFromSpecs(specs, snapshotName, historyPath) {
135
+ const packages = {};
136
+ for (const spec of specs) {
137
+ const atIdx = spec.lastIndexOf('@');
138
+ if (atIdx > 0) {
139
+ packages[spec.substring(0, atIdx)] = spec.substring(atIdx + 1);
140
+ }
141
+ }
142
+ recordReferences(packages, snapshotName, historyPath);
143
+ }
75
144
  /**
76
145
  * Record a list of installed package specs (e.g., ["@ist/sesh@0.3.33"])
77
146
  */
@@ -193,4 +262,101 @@ export function getInstalledCount(historyPath) {
193
262
  const history = loadInstallHistory(historyPath);
194
263
  return Object.keys(history.packages).length;
195
264
  }
265
+ /** Split a "name@version" history key into its package name. */
266
+ function keyToName(key) {
267
+ const atIdx = key.lastIndexOf('@');
268
+ return atIdx > 0 ? key.substring(0, atIdx) : key;
269
+ }
270
+ /** Snapshot names that reference (require) a given package@version. */
271
+ export function getReferencedBy(name, version, historyPath) {
272
+ const history = loadInstallHistory(historyPath);
273
+ const entry = history.packages[`${name}@${version}`];
274
+ if (!entry)
275
+ return [];
276
+ return entry.referencedBy ?? (entry.snapshot ? [entry.snapshot] : []);
277
+ }
278
+ /**
279
+ * Compute the replace plan for installing a new version of `snapshotName`.
280
+ *
281
+ * @param snapshotName - the snapshot whose version is being replaced
282
+ * @param newSet - the new version's full package set (name -> version),
283
+ * including the extends chain (e.g. from collectAllPackages)
284
+ *
285
+ * Ordering note: history keys are `name@version`, so recording the new version
286
+ * (e.g. `a@2`) never overwrites the previous entry (`a@1`) — both coexist. This
287
+ * function therefore works correctly whether called before OR after recording,
288
+ * and the install flow calls it AFTER recordInstalledSpecs/recordReferences.
289
+ * That order is in fact preferable: referencedBy for shared packages is
290
+ * up to date, the new current-version entries are classified as "keep", and
291
+ * superseded old-version entries are detected as `stale`. The plan is computed
292
+ * by iterating referencedBy (not getPackagesBySnapshot).
293
+ */
294
+ export function computeReplacePlan(snapshotName, newSet, historyPath) {
295
+ const history = loadInstallHistory(historyPath); // backfilled → referencedBy present
296
+ const plan = { remove: [], keepShared: [], stale: [] };
297
+ for (const [key, entry] of Object.entries(history.packages)) {
298
+ const refs = new Set(entry.referencedBy ?? (entry.snapshot ? [entry.snapshot] : []));
299
+ if (!refs.has(snapshotName))
300
+ continue; // not part of this snapshot's set → untouched
301
+ const name = keyToName(key);
302
+ const version = entry.version;
303
+ if (name in newSet) {
304
+ if (newSet[name] === version) {
305
+ continue; // still current in the new version → keep as-is
306
+ }
307
+ // Same package, different version → old entry superseded by the new install.
308
+ plan.stale.push({ name, version });
309
+ continue;
310
+ }
311
+ // Package name is gone from the new version → removal candidate.
312
+ const remaining = new Set(refs);
313
+ remaining.delete(snapshotName);
314
+ if (remaining.size === 0) {
315
+ plan.remove.push({ name, version }); // nobody else references it → safe to remove
316
+ }
317
+ else {
318
+ // Still referenced by another snapshot → keep installed (safety guard).
319
+ plan.keepShared.push({ name, version, remainingRefs: Array.from(remaining) });
320
+ }
321
+ }
322
+ return plan;
323
+ }
324
+ /**
325
+ * Apply the history side of a replace plan.
326
+ *
327
+ * @param removed - items whose uninstall SUCCEEDED (their history key is deleted)
328
+ * @param keepShared - items kept installed; `snapshotName` is dropped from refs
329
+ * @param stale - superseded old-version items; `snapshotName` dropped from refs
330
+ *
331
+ * For keepShared/stale entries, if dropping `snapshotName` leaves an empty
332
+ * referencedBy the history key is deleted too. Uninstall failures should be
333
+ * omitted from `removed` so their entries are preserved for a later retry.
334
+ */
335
+ export function applyReplaceHistory(snapshotName, removed, keepShared, stale, historyPath) {
336
+ const history = loadInstallHistory(historyPath);
337
+ // Hard-delete successfully uninstalled packages.
338
+ for (const item of removed) {
339
+ delete history.packages[`${item.name}@${item.version}`];
340
+ }
341
+ // Drop this snapshot from the refs of kept/superseded packages.
342
+ const dropRef = (name, version) => {
343
+ const key = `${name}@${version}`;
344
+ const entry = history.packages[key];
345
+ if (!entry)
346
+ return;
347
+ const refs = new Set(entry.referencedBy ?? (entry.snapshot ? [entry.snapshot] : []));
348
+ refs.delete(snapshotName);
349
+ if (refs.size === 0) {
350
+ delete history.packages[key];
351
+ }
352
+ else {
353
+ entry.referencedBy = Array.from(refs);
354
+ }
355
+ };
356
+ for (const item of keepShared)
357
+ dropRef(item.name, item.version);
358
+ for (const item of stale)
359
+ dropRef(item.name, item.version);
360
+ saveInstallHistory(history, historyPath);
361
+ }
196
362
  //# sourceMappingURL=dedup.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"dedup.js","sourceRoot":"","sources":["../src/dedup.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dedup.js","sourceRoot":"","sources":["../src/dedup.ts"],"names":[],"mappings":"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"}
@@ -17,5 +17,5 @@
17
17
  * // After successful install, record them
18
18
  * recordInstalledPackages(result.toInstall, '@ist/full');
19
19
  */
20
- export { dedup, dedupWithReport, dedupInstallBlock, isAlreadyInstalled, loadInstallHistory, saveInstallHistory, recordInstalledPackages, recordInstalledSpecs, clearInstallHistory, getPackagesBySnapshot, getInstalledCount, getHistoryFilePath, type InstalledPackageEntry, type InstallHistory, type DedupResult, type DedupReport, type SkippedPackage, } from './dedup.js';
20
+ export { dedup, dedupWithReport, dedupInstallBlock, isAlreadyInstalled, loadInstallHistory, saveInstallHistory, recordInstalledPackages, recordInstalledSpecs, recordReferences, recordReferencesFromSpecs, clearInstallHistory, backfillReferencedBy, getPackagesBySnapshot, getInstalledCount, getHistoryFilePath, getReferencedBy, computeReplacePlan, applyReplaceHistory, type InstalledPackageEntry, type InstallHistory, type DedupResult, type DedupReport, type SkippedPackage, type ReplacePlan, type ReplaceRemovalItem, type ReplaceSharedItem, } from './dedup.js';
21
21
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAEL,KAAK,EACL,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAGlB,kBAAkB,EAClB,kBAAkB,EAClB,uBAAuB,EACvB,oBAAoB,EACpB,mBAAmB,EAGnB,qBAAqB,EACrB,iBAAiB,EACjB,kBAAkB,EAGlB,KAAK,qBAAqB,EAC1B,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,cAAc,GACpB,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAEL,KAAK,EACL,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAGlB,kBAAkB,EAClB,kBAAkB,EAClB,uBAAuB,EACvB,oBAAoB,EACpB,gBAAgB,EAChB,yBAAyB,EACzB,mBAAmB,EACnB,oBAAoB,EAGpB,qBAAqB,EACrB,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,EAGf,kBAAkB,EAClB,mBAAmB,EAGnB,KAAK,qBAAqB,EAC1B,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,GACvB,MAAM,YAAY,CAAC"}
@@ -21,7 +21,9 @@ export {
21
21
  // Core dedup functions
22
22
  dedup, dedupWithReport, dedupInstallBlock, isAlreadyInstalled,
23
23
  // History management
24
- loadInstallHistory, saveInstallHistory, recordInstalledPackages, recordInstalledSpecs, clearInstallHistory,
24
+ loadInstallHistory, saveInstallHistory, recordInstalledPackages, recordInstalledSpecs, recordReferences, recordReferencesFromSpecs, clearInstallHistory, backfillReferencedBy,
25
25
  // Utility functions
26
- getPackagesBySnapshot, getInstalledCount, getHistoryFilePath, } from './dedup.js';
26
+ getPackagesBySnapshot, getInstalledCount, getHistoryFilePath, getReferencedBy,
27
+ // Replace mode (ADR 001)
28
+ computeReplacePlan, applyReplaceHistory, } from './dedup.js';
27
29
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO;AACL,uBAAuB;AACvB,KAAK,EACL,eAAe,EACf,iBAAiB,EACjB,kBAAkB;AAElB,qBAAqB;AACrB,kBAAkB,EAClB,kBAAkB,EAClB,uBAAuB,EACvB,oBAAoB,EACpB,mBAAmB;AAEnB,oBAAoB;AACpB,qBAAqB,EACrB,iBAAiB,EACjB,kBAAkB,GAQnB,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO;AACL,uBAAuB;AACvB,KAAK,EACL,eAAe,EACf,iBAAiB,EACjB,kBAAkB;AAElB,qBAAqB;AACrB,kBAAkB,EAClB,kBAAkB,EAClB,uBAAuB,EACvB,oBAAoB,EACpB,gBAAgB,EAChB,yBAAyB,EACzB,mBAAmB,EACnB,oBAAoB;AAEpB,oBAAoB;AACpB,qBAAqB,EACrB,iBAAiB,EACjB,kBAAkB,EAClB,eAAe;AAEf,yBAAyB;AACzB,kBAAkB,EAClB,mBAAmB,GAWpB,MAAM,YAAY,CAAC"}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@microwiseai/snapshot-dedup",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "Deduplication logic for Snapshot CLI - prevents reinstalling already-installed packages",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -12,10 +12,13 @@
12
12
  }
13
13
  },
14
14
  "scripts": {
15
- "build": "tsc",
15
+ "prebuild": "node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\"",
16
+ "build": "tsc -p tsconfig.build.json",
16
17
  "dev": "tsc --watch",
18
+ "typecheck": "tsc --noEmit",
17
19
  "test": "vitest",
18
20
  "test:run": "vitest run",
21
+ "lint": "eslint src",
19
22
  "prepublishOnly": "npm run build"
20
23
  },
21
24
  "files": [
@@ -32,6 +35,9 @@
32
35
  "dependencies": {},
33
36
  "devDependencies": {
34
37
  "@types/node": "^20.11.0",
38
+ "@typescript-eslint/eslint-plugin": "^8.57.0",
39
+ "@typescript-eslint/parser": "^8.57.0",
40
+ "eslint": "^10.0.3",
35
41
  "typescript": "^5.7.3",
36
42
  "vitest": "^4.0.18"
37
43
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@microwiseai/snapshot",
3
- "version": "0.3.71",
3
+ "version": "0.4.0",
4
4
  "description": "CLI for installing IST Snapshot packages",
5
5
  "type": "module",
6
6
  "main": "./dist/lib.js",
@@ -19,8 +19,10 @@
19
19
  "snapshot": "./dist/index.js"
20
20
  },
21
21
  "scripts": {
22
- "build": "tsc",
22
+ "prebuild": "node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\"",
23
+ "build": "tsc -p tsconfig.build.json",
23
24
  "dev": "tsc --watch",
25
+ "typecheck": "tsc --noEmit",
24
26
  "test": "vitest",
25
27
  "test:run": "vitest run",
26
28
  "lint": "eslint src",
@@ -43,7 +45,7 @@
43
45
  "@microwiseai/import-telemetry": "^0.1.0",
44
46
  "@microwiseai/license": "^0.1.4",
45
47
  "@microwiseai/skit": "^0.1.19",
46
- "@microwiseai/snapshot-dedup": "^0.1.0",
48
+ "@microwiseai/snapshot-dedup": "0.2.0",
47
49
  "@microwiseai/snapshot-parallel": "^0.1.0",
48
50
  "chalk": "^5.3.0",
49
51
  "commander": "^12.1.0",
@@ -67,5 +69,8 @@
67
69
  "@microwiseai/skit",
68
70
  "@microwiseai/snapshot-dedup",
69
71
  "@microwiseai/snapshot-parallel"
70
- ]
72
+ ],
73
+ "glpkg": {
74
+ "group": "microwiseai"
75
+ }
71
76
  }
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=access-sync.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"access-sync.test.d.ts","sourceRoot":"","sources":["../../src/lib/access-sync.test.ts"],"names":[],"mappings":""}
@@ -1,112 +0,0 @@
1
- import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
2
- import { syncPackageAccess } from './access-sync.js';
3
- import { LICENSE_API_URL } from './config.js';
4
- /**
5
- * Unit tests for access-sync.
6
- *
7
- * `fetch` is fully mocked — no real license-api write calls are made.
8
- * Transitive resolution is disabled so the only network surface is the
9
- * idempotent upsert (POST /admin/package-access/with-deps).
10
- */
11
- const UPSERT_URL = `${LICENSE_API_URL}/admin/package-access/with-deps`;
12
- function makeFetchMock() {
13
- return vi.fn(async () => ({
14
- ok: true,
15
- json: async () => ({}),
16
- }));
17
- }
18
- /** Extract parsed bodies of every upsert call recorded by the fetch mock. */
19
- function upsertBodies(fetchMock) {
20
- return fetchMock.mock.calls
21
- .filter((call) => call[0] === UPSERT_URL)
22
- .map((call) => JSON.parse(call[1].body));
23
- }
24
- describe('syncPackageAccess - snapshot own package registration', () => {
25
- let originalFetch;
26
- beforeEach(() => {
27
- originalFetch = globalThis.fetch;
28
- process.env.LICENSE_API_ADMIN_KEY = 'test-admin-key';
29
- vi.spyOn(console, 'log').mockImplementation(() => { });
30
- vi.spyOn(console, 'error').mockImplementation(() => { });
31
- });
32
- afterEach(() => {
33
- globalThis.fetch = originalFetch;
34
- delete process.env.LICENSE_API_ADMIN_KEY;
35
- vi.restoreAllMocks();
36
- });
37
- it("registers the snapshot's own package with its declared access level", async () => {
38
- const fetchMock = makeFetchMock();
39
- globalThis.fetch = fetchMock;
40
- const snapshot = {
41
- name: '@ist/testing',
42
- version: '0.1.0',
43
- access: 'authenticated',
44
- install: {
45
- 'gitlab-install': {
46
- '@ist/member-a': '1.0.0',
47
- },
48
- },
49
- };
50
- const result = await syncPackageAccess(snapshot, { includeTransitive: false });
51
- const bodies = upsertBodies(fetchMock);
52
- const self = bodies.find((b) => b.scope === '@ist' && b.packageName === 'testing');
53
- expect(self).toBeDefined();
54
- expect(self.accessLevel).toBe('authenticated');
55
- // Snapshot's own package has no parent.
56
- expect(self.parentPackage).toBeUndefined();
57
- // Still uses the idempotent with-deps upsert with empty dependencies.
58
- expect(self.dependencies).toEqual([]);
59
- // Member package is registered too and points to the snapshot as parent.
60
- const member = bodies.find((b) => b.packageName === 'member-a');
61
- expect(member).toBeDefined();
62
- expect(member.parentPackage).toBe('@ist/testing');
63
- expect(result.registered).toContain('@ist/testing');
64
- });
65
- it('maps public access for the snapshot own package', async () => {
66
- const fetchMock = makeFetchMock();
67
- globalThis.fetch = fetchMock;
68
- const snapshot = {
69
- name: '@ist/free',
70
- version: '1.0.0',
71
- access: 'public',
72
- install: {},
73
- };
74
- await syncPackageAccess(snapshot, { includeTransitive: false });
75
- const self = upsertBodies(fetchMock).find((b) => b.packageName === 'free');
76
- expect(self).toBeDefined();
77
- expect(self.accessLevel).toBe('public');
78
- });
79
- it('maps licensed access and propagates productId for the snapshot own package', async () => {
80
- const fetchMock = makeFetchMock();
81
- globalThis.fetch = fetchMock;
82
- const snapshot = {
83
- name: '@ist/pro',
84
- version: '1.0.0',
85
- access: { type: 'licensed', productId: 'prod_123' },
86
- install: {},
87
- };
88
- await syncPackageAccess(snapshot, { includeTransitive: false });
89
- const self = upsertBodies(fetchMock).find((b) => b.packageName === 'pro');
90
- expect(self).toBeDefined();
91
- expect(self.accessLevel).toBe('licensed');
92
- expect(self.requiredProductIds).toBe('prod_123');
93
- });
94
- it('does not duplicate when the snapshot package also appears as a member', async () => {
95
- const fetchMock = makeFetchMock();
96
- globalThis.fetch = fetchMock;
97
- const snapshot = {
98
- name: '@ist/testing',
99
- version: '0.1.0',
100
- access: 'authenticated',
101
- install: {
102
- 'gitlab-install': {
103
- '@ist/testing': '0.1.0',
104
- },
105
- },
106
- };
107
- await syncPackageAccess(snapshot, { includeTransitive: false });
108
- const selfHits = upsertBodies(fetchMock).filter((b) => b.scope === '@ist' && b.packageName === 'testing');
109
- expect(selfHits).toHaveLength(1);
110
- });
111
- });
112
- //# sourceMappingURL=access-sync.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"access-sync.test.js","sourceRoot":"","sources":["../../src/lib/access-sync.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=auth-flow.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"auth-flow.test.d.ts","sourceRoot":"","sources":["../../src/lib/auth-flow.test.ts"],"names":[],"mappings":""}