@fgv/repo-template 5.1.0-25 → 5.1.0-27
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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../../src/commands/link.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAUH,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;
|
|
1
|
+
{"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../../src/commands/link.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAUH,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAsOD,wBAAsB,OAAO,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAqElE;AAED,wBAAsB,SAAS,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CA4CtE;AAED,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC,CA0B5F"}
|
package/lib/commands/link.js
CHANGED
|
@@ -54,6 +54,26 @@ function readRushProjects(rushJsonPath) {
|
|
|
54
54
|
const rush = (0, jsonc_parser_1.parse)(content);
|
|
55
55
|
return rush.projects;
|
|
56
56
|
}
|
|
57
|
+
/**
|
|
58
|
+
* Read a package.json and return its dependency sections.
|
|
59
|
+
*/
|
|
60
|
+
function readPackageJson(pkgJsonPath) {
|
|
61
|
+
return JSON.parse(fs.readFileSync(pkgJsonPath, 'utf-8'));
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Collect a package.json's dependency names for direct consumer discovery.
|
|
65
|
+
*/
|
|
66
|
+
function collectDirectFgvDependencies(pkgJson) {
|
|
67
|
+
var _a, _b, _c;
|
|
68
|
+
const allDeps = Object.assign(Object.assign(Object.assign({}, ((_a = pkgJson.dependencies) !== null && _a !== void 0 ? _a : {})), ((_b = pkgJson.devDependencies) !== null && _b !== void 0 ? _b : {})), ((_c = pkgJson.peerDependencies) !== null && _c !== void 0 ? _c : {}));
|
|
69
|
+
const deps = new Set();
|
|
70
|
+
for (const [name, spec] of Object.entries(allDeps)) {
|
|
71
|
+
if (name.startsWith('@fgv/') && spec !== 'workspace:*') {
|
|
72
|
+
deps.add(name);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return deps;
|
|
76
|
+
}
|
|
57
77
|
/**
|
|
58
78
|
* Scan a consumer Rush repo and collect all @fgv/* dependencies (excluding workspace:* entries).
|
|
59
79
|
* Returns a map of packageName -> list of project folders that depend on it.
|
|
@@ -71,18 +91,68 @@ function discoverFgvDeps(repoDir) {
|
|
|
71
91
|
if (!fs.existsSync(pkgJsonPath)) {
|
|
72
92
|
continue;
|
|
73
93
|
}
|
|
74
|
-
const pkgJson =
|
|
75
|
-
const
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
existing.push(project.projectFolder);
|
|
80
|
-
deps.set(name, existing);
|
|
81
|
-
}
|
|
94
|
+
const pkgJson = readPackageJson(pkgJsonPath);
|
|
95
|
+
for (const name of collectDirectFgvDependencies(pkgJson)) {
|
|
96
|
+
const existing = (_a = deps.get(name)) !== null && _a !== void 0 ? _a : [];
|
|
97
|
+
existing.push(project.projectFolder);
|
|
98
|
+
deps.set(name, existing);
|
|
82
99
|
}
|
|
83
100
|
}
|
|
84
101
|
return deps;
|
|
85
102
|
}
|
|
103
|
+
/**
|
|
104
|
+
* Build an internal @fgv package dependency graph from the fgv worktree.
|
|
105
|
+
* Only dependencies that exist in the fgv Rush projects are retained.
|
|
106
|
+
*/
|
|
107
|
+
function buildFgvDependencyGraph(fgvDir, fgvPackageMap) {
|
|
108
|
+
var _a, _b, _c;
|
|
109
|
+
const rushJsonPath = path.join(fgvDir, 'rush.json');
|
|
110
|
+
if (!fs.existsSync(rushJsonPath)) {
|
|
111
|
+
throw new Error(`fgv rush.json not found at ${rushJsonPath}`);
|
|
112
|
+
}
|
|
113
|
+
const projects = readRushProjects(rushJsonPath);
|
|
114
|
+
const graph = new Map();
|
|
115
|
+
for (const project of projects) {
|
|
116
|
+
const pkgJsonPath = path.join(fgvDir, project.projectFolder, 'package.json');
|
|
117
|
+
if (!fs.existsSync(pkgJsonPath)) {
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
const pkgJson = readPackageJson(pkgJsonPath);
|
|
121
|
+
const internalDeps = new Set();
|
|
122
|
+
const allDeps = Object.assign(Object.assign(Object.assign({}, ((_a = pkgJson.dependencies) !== null && _a !== void 0 ? _a : {})), ((_b = pkgJson.devDependencies) !== null && _b !== void 0 ? _b : {})), ((_c = pkgJson.peerDependencies) !== null && _c !== void 0 ? _c : {}));
|
|
123
|
+
for (const [dependencyName] of Object.entries(allDeps)) {
|
|
124
|
+
if (fgvPackageMap.has(dependencyName) && dependencyName !== project.packageName) {
|
|
125
|
+
internalDeps.add(dependencyName);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
graph.set(project.packageName, internalDeps);
|
|
129
|
+
}
|
|
130
|
+
return graph;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Expand a set of package names to include all transitive internal dependencies.
|
|
134
|
+
*/
|
|
135
|
+
function expandFgvDependencyClosure(seedPackageNames, graph) {
|
|
136
|
+
const resolved = new Set();
|
|
137
|
+
const pending = [...seedPackageNames];
|
|
138
|
+
while (pending.length > 0) {
|
|
139
|
+
const packageName = pending.pop();
|
|
140
|
+
if (!packageName || resolved.has(packageName)) {
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
resolved.add(packageName);
|
|
144
|
+
const directDeps = graph.get(packageName);
|
|
145
|
+
if (!directDeps) {
|
|
146
|
+
continue;
|
|
147
|
+
}
|
|
148
|
+
for (const dependencyName of directDeps) {
|
|
149
|
+
if (!resolved.has(dependencyName)) {
|
|
150
|
+
pending.push(dependencyName);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return resolved;
|
|
155
|
+
}
|
|
86
156
|
/**
|
|
87
157
|
* Read the fgv worktree's rush.json and build a map of packageName -> projectFolder.
|
|
88
158
|
*/
|
|
@@ -160,11 +230,13 @@ async function runLink(options) {
|
|
|
160
230
|
return;
|
|
161
231
|
}
|
|
162
232
|
const fgvPackageMap = buildFgvPackageMap(fgvDir);
|
|
233
|
+
const fgvDependencyGraph = buildFgvDependencyGraph(fgvDir, fgvPackageMap);
|
|
234
|
+
const linkedPackageNames = expandFgvDependencyClosure(fgvDeps.keys(), fgvDependencyGraph);
|
|
163
235
|
// Compute file: overrides relative to common/temp/
|
|
164
236
|
const commonTempDir = path.join(repoDir, 'common', 'temp');
|
|
165
237
|
const overrides = {};
|
|
166
238
|
const warnings = [];
|
|
167
|
-
for (const packageName of
|
|
239
|
+
for (const packageName of linkedPackageNames) {
|
|
168
240
|
const projectFolder = fgvPackageMap.get(packageName);
|
|
169
241
|
if (!projectFolder) {
|
|
170
242
|
warnings.push(` Warning: ${packageName} not found in fgv worktree — skipping`);
|
package/lib/commands/link.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"link.js","sourceRoot":"","sources":["../../src/commands/link.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0JH,0BAmEC;AAED,8BA4CC;AAED,oDA0BC;AArSD,uCAAyB;AACzB,2CAA6B;AAC7B,iDAAyC;AACzC,+CAAmD;AACnD,6CAA+D;AAwB/D,0BAA0B;AAE1B;;GAEG;AACH,SAAS,gBAAgB,CAAC,YAAoB;IAC5C,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IACvD,MAAM,IAAI,GAAG,IAAA,oBAAU,EAAC,OAAO,CAAiC,CAAC;IACjE,OAAO,IAAI,CAAC,QAAQ,CAAC;AACvB,CAAC;AAED;;;GAGG;AACH,SAAS,eAAe,CAAC,OAAe;;IACtC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IACrD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,0BAA0B,YAAY,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED,MAAM,QAAQ,GAAG,gBAAgB,CAAC,YAAY,CAAC,CAAC;IAChD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAoB,CAAC;IAEzC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;QAC9E,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAChC,SAAS;QACX,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;QAClE,MAAM,OAAO,mCACR,OAAO,CAAC,YAAY,GACpB,OAAO,CAAC,eAAe,CAC3B,CAAC;QAEF,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACnD,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,IAAI,KAAK,aAAa,EAAE,CAAC;gBACvD,MAAM,QAAQ,GAAG,MAAA,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,mCAAI,EAAE,CAAC;gBACtC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;gBACrC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CAAC,MAAc;IACxC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACpD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,8BAA8B,YAAY,EAAE,CAAC,CAAC;IAChE,CAAC;IAED,MAAM,QAAQ,GAAG,gBAAgB,CAAC,YAAY,CAAC,CAAC;IAChD,MAAM,GAAG,GAAG,IAAI,GAAG,EAAkB,CAAC;IACtC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IACtD,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,wBAAwB;AAExB;;GAEG;AACH,SAAS,uBAAuB;;IAC9B,MAAM,MAAM,GAAG,IAAA,wBAAQ,EAAC,yCAAyC,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;IAC1F,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAA2B,CAAC;IAC1D,MAAM,OAAO,GAAG,MAAA,IAAI,CAAC,KAAK,mCAAI,IAAI,CAAC,MAAM,CAAC;IAC1C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;IAChF,CAAC;IACD,OAAO,IAAI,OAAO,EAAE,CAAC;AACvB,CAAC;AAED;;;GAGG;AACH,SAAS,4BAA4B,CAAC,OAAe,EAAE,WAAmB;IACxE,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IACrD,MAAM,QAAQ,GAAG,gBAAgB,CAAC,YAAY,CAAC,CAAC;IAChD,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;QAC9E,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAChC,SAAS;QACX,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;QAClE,MAAM,UAAU,GAAsB,EAAE,CAAC;QAEzC,KAAK,MAAM,QAAQ,IAAI,CAAC,cAAc,EAAE,iBAAiB,CAAU,EAAE,CAAC;YACpE,MAAM,IAAI,GAAuC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACnE,IAAI,CAAC,IAAI;gBAAE,SAAS;YAEpB,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;gBAChD,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,IAAI,KAAK,aAAa,EAAE,CAAC;oBACvD,UAAU,CAAC,IAAI,CAAC;wBACd,IAAI,EAAE,UAAU;wBAChB,IAAI,EAAE,GAAG,QAAQ,IAAI,IAAI,EAAE;wBAC3B,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC;qBACnC,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,IAAA,iBAAS,EAAC,WAAW,EAAE,UAAU,CAAC,CAAC;YACnC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,wBAAwB;AAEjB,KAAK,UAAU,OAAO,CAAC,OAAqB;IACjD,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IAEpC,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;IACjD,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,EAAE,CAAC,CAAC;IACrC,OAAO,CAAC,GAAG,CAAC,eAAe,OAAO,EAAE,CAAC,CAAC;IAEtC,MAAM,OAAO,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IACzC,IAAI,OAAO,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC;QAChE,OAAO;IACT,CAAC;IAED,MAAM,aAAa,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAEjD,mDAAmD;IACnD,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC3D,MAAM,SAAS,GAA2B,EAAE,CAAC;IAC7C,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,KAAK,MAAM,WAAW,IAAI,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QACzC,MAAM,aAAa,GAAG,aAAa,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACrD,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,QAAQ,CAAC,IAAI,CAAC,cAAc,WAAW,uCAAuC,CAAC,CAAC;YAChF,SAAS;QACX,CAAC;QACD,MAAM,mBAAmB,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;QAC7D,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,mBAAmB,CAAC,CAAC;QACvE,SAAS,CAAC,WAAW,CAAC,GAAG,QAAQ,YAAY,EAAE,CAAC;IAClD,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,yBAAyB;IACzB,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,kBAAkB,CAAC,CAAC;IAC1F,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,iCAAiC,cAAc,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,QAAQ,GAAsB;QAClC;YACE,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,iBAAiB;YACvB,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;SACjC;QACD;YACE,IAAI,EAAE,KAAK;YACX,IAAI,EAAE,wBAAwB;YAC9B,KAAK,EAAE,KAAK;SACb;QACD;YACE,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,2BAA2B;YACjC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,aAAa,EAAE,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC;SAC7E;KACF,CAAC;IAEF,IAAA,iBAAS,EAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;IAEpC,OAAO,CAAC,GAAG,CAAC,gBAAgB,cAAc,EAAE,CAAC,CAAC;IAC9C,OAAO,CAAC,GAAG,CAAC,gBAAgB,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,aAAa,CAAC,CAAC;IACxE,KAAK,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,OAAO,QAAQ,EAAE,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC;AAC3E,CAAC;AAEM,KAAK,UAAU,SAAS,CAAC,OAAuB;IACrD,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IAErC,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,eAAe,OAAO,EAAE,CAAC,CAAC;IAEtC,uCAAuC;IACvC,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,kBAAkB,CAAC,CAAC;IAC1F,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,iCAAiC,cAAc,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,QAAQ,GAAsB;QAClC;YACE,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,iBAAiB;YACvB,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;SAC1B;QACD;YACE,IAAI,EAAE,KAAK;YACX,IAAI,EAAE,wBAAwB;YAC9B,KAAK,EAAE,IAAI;SACZ;QACD;YACE,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,2BAA2B;YACjC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;SAC1B;KACF,CAAC;IAEF,IAAA,iBAAS,EAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;IACpC,OAAO,CAAC,GAAG,CAAC,cAAc,cAAc,sBAAsB,CAAC,CAAC;IAEhE,2BAA2B;IAC3B,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,8BAA8B,OAAO,KAAK,CAAC,CAAC;QACxD,MAAM,OAAO,GAAG,4BAA4B,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC/D,OAAO,CAAC,GAAG,CAAC,aAAa,OAAO,CAAC,MAAM,wBAAwB,CAAC,CAAC;QACjE,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC;AAC3E,CAAC;AAEM,KAAK,UAAU,oBAAoB,CAAC,OAAkC;IAC3E,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IAE5B,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;IACjD,OAAO,CAAC,GAAG,CAAC,eAAe,OAAO,EAAE,CAAC,CAAC;IAEtC,kBAAkB;IAClB,IAAI,WAAmB,CAAC;IACxB,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,6BAA6B,WAAW,EAAE,CAAC,CAAC;IAC1D,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;QACpD,WAAW,GAAG,uBAAuB,EAAE,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,uBAAuB,WAAW,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,MAAM,OAAO,GAAG,4BAA4B,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IACnE,OAAO,CAAC,GAAG,CAAC,eAAe,OAAO,CAAC,MAAM,wBAAwB,CAAC,CAAC;IACnE,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC1B,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC;IAC3E,CAAC;AACH,CAAC","sourcesContent":["/**\n * Link/unlink/update-fgv-versions commands — automate cross-repo development\n * between fgv and consumer Rush monorepos.\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { execSync } from 'child_process';\nimport { parse as parseJsonc } from 'jsonc-parser';\nimport { IPatchOperation, patchFile } from '../packlets/jsonc';\n\n// ── Interfaces ──\n\nexport interface ILinkOptions {\n fgvDir: string;\n repoDir: string;\n}\n\nexport interface IUnlinkOptions {\n repoDir: string;\n version?: string;\n}\n\nexport interface IUpdateFgvVersionsOptions {\n repoDir: string;\n version?: string;\n}\n\ninterface IRushProject {\n packageName: string;\n projectFolder: string;\n}\n\n// ── Discovery helpers ──\n\n/**\n * Read a rush.json and return its project entries.\n */\nfunction readRushProjects(rushJsonPath: string): IRushProject[] {\n const content = fs.readFileSync(rushJsonPath, 'utf-8');\n const rush = parseJsonc(content) as { projects: IRushProject[] };\n return rush.projects;\n}\n\n/**\n * Scan a consumer Rush repo and collect all @fgv/* dependencies (excluding workspace:* entries).\n * Returns a map of packageName -> list of project folders that depend on it.\n */\nfunction discoverFgvDeps(repoDir: string): Map<string, string[]> {\n const rushJsonPath = path.join(repoDir, 'rush.json');\n if (!fs.existsSync(rushJsonPath)) {\n throw new Error(`rush.json not found at ${rushJsonPath}`);\n }\n\n const projects = readRushProjects(rushJsonPath);\n const deps = new Map<string, string[]>();\n\n for (const project of projects) {\n const pkgJsonPath = path.join(repoDir, project.projectFolder, 'package.json');\n if (!fs.existsSync(pkgJsonPath)) {\n continue;\n }\n\n const pkgJson = JSON.parse(fs.readFileSync(pkgJsonPath, 'utf-8'));\n const allDeps: Record<string, string> = {\n ...pkgJson.dependencies,\n ...pkgJson.devDependencies\n };\n\n for (const [name, spec] of Object.entries(allDeps)) {\n if (name.startsWith('@fgv/') && spec !== 'workspace:*') {\n const existing = deps.get(name) ?? [];\n existing.push(project.projectFolder);\n deps.set(name, existing);\n }\n }\n }\n\n return deps;\n}\n\n/**\n * Read the fgv worktree's rush.json and build a map of packageName -> projectFolder.\n */\nfunction buildFgvPackageMap(fgvDir: string): Map<string, string> {\n const rushJsonPath = path.join(fgvDir, 'rush.json');\n if (!fs.existsSync(rushJsonPath)) {\n throw new Error(`fgv rush.json not found at ${rushJsonPath}`);\n }\n\n const projects = readRushProjects(rushJsonPath);\n const map = new Map<string, string>();\n for (const project of projects) {\n map.set(project.packageName, project.projectFolder);\n }\n return map;\n}\n\n// ── Version helpers ──\n\n/**\n * Query npm for the latest prerelease version of @fgv/ts-utils and construct a ~X.Y.Z spec.\n */\nfunction resolveLatestFgvVersion(): string {\n const output = execSync('npm view @fgv/ts-utils dist-tags --json', { encoding: 'utf-8' });\n const tags = JSON.parse(output) as Record<string, string>;\n const version = tags.alpha ?? tags.latest;\n if (!version) {\n throw new Error('Could not determine latest @fgv version from npm dist-tags');\n }\n return `~${version}`;\n}\n\n/**\n * Update all @fgv/* dependency versions (excluding workspace:*) in a consumer repo's package.json files.\n * Uses jsonc-parser modify() to preserve formatting.\n */\nfunction updateVersionsInPackageJsons(repoDir: string, versionSpec: string): string[] {\n const rushJsonPath = path.join(repoDir, 'rush.json');\n const projects = readRushProjects(rushJsonPath);\n const changed: string[] = [];\n\n for (const project of projects) {\n const pkgJsonPath = path.join(repoDir, project.projectFolder, 'package.json');\n if (!fs.existsSync(pkgJsonPath)) {\n continue;\n }\n\n const pkgJson = JSON.parse(fs.readFileSync(pkgJsonPath, 'utf-8'));\n const operations: IPatchOperation[] = [];\n\n for (const depField of ['dependencies', 'devDependencies'] as const) {\n const deps: Record<string, string> | undefined = pkgJson[depField];\n if (!deps) continue;\n\n for (const [name, spec] of Object.entries(deps)) {\n if (name.startsWith('@fgv/') && spec !== 'workspace:*') {\n operations.push({\n type: 'set-json',\n path: `${depField}.${name}`,\n value: JSON.stringify(versionSpec)\n });\n }\n }\n }\n\n if (operations.length > 0) {\n patchFile(pkgJsonPath, operations);\n changed.push(pkgJsonPath);\n }\n }\n\n return changed;\n}\n\n// ── Command runners ──\n\nexport async function runLink(options: ILinkOptions): Promise<void> {\n const { fgvDir, repoDir } = options;\n\n console.log(`==> Linking to local fgv worktree`);\n console.log(` fgv dir: ${fgvDir}`);\n console.log(` repo dir: ${repoDir}`);\n\n const fgvDeps = discoverFgvDeps(repoDir);\n if (fgvDeps.size === 0) {\n console.log(' No @fgv/* dependencies found in consumer repo.');\n return;\n }\n\n const fgvPackageMap = buildFgvPackageMap(fgvDir);\n\n // Compute file: overrides relative to common/temp/\n const commonTempDir = path.join(repoDir, 'common', 'temp');\n const overrides: Record<string, string> = {};\n const warnings: string[] = [];\n\n for (const packageName of fgvDeps.keys()) {\n const projectFolder = fgvPackageMap.get(packageName);\n if (!projectFolder) {\n warnings.push(` Warning: ${packageName} not found in fgv worktree — skipping`);\n continue;\n }\n const absoluteProjectPath = path.join(fgvDir, projectFolder);\n const relativePath = path.relative(commonTempDir, absoluteProjectPath);\n overrides[packageName] = `file:${relativePath}`;\n }\n\n for (const w of warnings) {\n console.warn(w);\n }\n\n // Patch pnpm-config.json\n const pnpmConfigPath = path.join(repoDir, 'common', 'config', 'rush', 'pnpm-config.json');\n if (!fs.existsSync(pnpmConfigPath)) {\n throw new Error(`pnpm-config.json not found at ${pnpmConfigPath}`);\n }\n\n const patchOps: IPatchOperation[] = [\n {\n type: 'set-json',\n path: 'globalOverrides',\n value: JSON.stringify(overrides)\n },\n {\n type: 'set',\n path: 'strictPeerDependencies',\n value: false\n },\n {\n type: 'set-json',\n path: 'globalPeerDependencyRules',\n value: JSON.stringify({ ignoreMissing: ['mustache'], allowAny: ['@fgv/*'] })\n }\n ];\n\n patchFile(pnpmConfigPath, patchOps);\n\n console.log(`\\n Patched: ${pnpmConfigPath}`);\n console.log(` Overrides (${Object.keys(overrides).length} packages):`);\n for (const [name, filePath] of Object.entries(overrides)) {\n console.log(` ${name} -> ${filePath}`);\n }\n console.log(`\\n Next: run \"rush update --purge\" in the consumer repo.`);\n}\n\nexport async function runUnlink(options: IUnlinkOptions): Promise<void> {\n const { repoDir, version } = options;\n\n console.log(`==> Unlinking from local fgv worktree`);\n console.log(` repo dir: ${repoDir}`);\n\n // Restore pnpm-config.json to defaults\n const pnpmConfigPath = path.join(repoDir, 'common', 'config', 'rush', 'pnpm-config.json');\n if (!fs.existsSync(pnpmConfigPath)) {\n throw new Error(`pnpm-config.json not found at ${pnpmConfigPath}`);\n }\n\n const patchOps: IPatchOperation[] = [\n {\n type: 'set-json',\n path: 'globalOverrides',\n value: JSON.stringify({})\n },\n {\n type: 'set',\n path: 'strictPeerDependencies',\n value: true\n },\n {\n type: 'set-json',\n path: 'globalPeerDependencyRules',\n value: JSON.stringify({})\n }\n ];\n\n patchFile(pnpmConfigPath, patchOps);\n console.log(` Patched: ${pnpmConfigPath} (restored defaults)`);\n\n // Optionally bump versions\n if (version) {\n console.log(`\\n Bumping @fgv/* deps to ${version}...`);\n const changed = updateVersionsInPackageJsons(repoDir, version);\n console.log(` Updated ${changed.length} package.json file(s):`);\n for (const f of changed) {\n console.log(` ${f}`);\n }\n }\n\n console.log(`\\n Next: run \"rush update --purge\" in the consumer repo.`);\n}\n\nexport async function runUpdateFgvVersions(options: IUpdateFgvVersionsOptions): Promise<void> {\n const { repoDir } = options;\n\n console.log(`==> Updating @fgv/* version specs`);\n console.log(` repo dir: ${repoDir}`);\n\n // Resolve version\n let versionSpec: string;\n if (options.version) {\n versionSpec = options.version;\n console.log(` Using explicit version: ${versionSpec}`);\n } else {\n console.log(' Querying npm for latest version...');\n versionSpec = resolveLatestFgvVersion();\n console.log(` Resolved version: ${versionSpec}`);\n }\n\n const changed = updateVersionsInPackageJsons(repoDir, versionSpec);\n console.log(`\\n Updated ${changed.length} package.json file(s):`);\n for (const f of changed) {\n console.log(` ${f}`);\n }\n\n if (changed.length > 0) {\n console.log(`\\n Next: run \"rush update --purge\" in the consumer repo.`);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"link.js","sourceRoot":"","sources":["../../src/commands/link.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Link/unlink/update-fgv-versions commands — automate cross-repo development\n * between fgv and consumer Rush monorepos.\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { execSync } from 'child_process';\nimport { parse as parseJsonc } from 'jsonc-parser';\nimport { IPatchOperation, patchFile } from '../packlets/jsonc';\n\n// ── Interfaces ──\n\nexport interface ILinkOptions {\n fgvDir: string;\n repoDir: string;\n}\n\nexport interface IUnlinkOptions {\n repoDir: string;\n version?: string;\n}\n\nexport interface IUpdateFgvVersionsOptions {\n repoDir: string;\n version?: string;\n}\n\ninterface IRushProject {\n packageName: string;\n projectFolder: string;\n}\n\ninterface IPackageJsonDependencies {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n}\n\ntype FgvDependencyGraph = Map<string, Set<string>>;\n\n// ── Discovery helpers ──\n\n/**\n * Read a rush.json and return its project entries.\n */\nfunction readRushProjects(rushJsonPath: string): IRushProject[] {\n const content = fs.readFileSync(rushJsonPath, 'utf-8');\n const rush = parseJsonc(content) as { projects: IRushProject[] };\n return rush.projects;\n}\n\n/**\n * Read a package.json and return its dependency sections.\n */\nfunction readPackageJson(pkgJsonPath: string): IPackageJsonDependencies {\n return JSON.parse(fs.readFileSync(pkgJsonPath, 'utf-8')) as IPackageJsonDependencies;\n}\n\n/**\n * Collect a package.json's dependency names for direct consumer discovery.\n */\nfunction collectDirectFgvDependencies(pkgJson: IPackageJsonDependencies): Set<string> {\n const allDeps: Record<string, string> = {\n ...(pkgJson.dependencies ?? {}),\n ...(pkgJson.devDependencies ?? {}),\n ...(pkgJson.peerDependencies ?? {})\n };\n\n const deps = new Set<string>();\n for (const [name, spec] of Object.entries(allDeps)) {\n if (name.startsWith('@fgv/') && spec !== 'workspace:*') {\n deps.add(name);\n }\n }\n\n return deps;\n}\n\n/**\n * Scan a consumer Rush repo and collect all @fgv/* dependencies (excluding workspace:* entries).\n * Returns a map of packageName -> list of project folders that depend on it.\n */\nfunction discoverFgvDeps(repoDir: string): Map<string, string[]> {\n const rushJsonPath = path.join(repoDir, 'rush.json');\n if (!fs.existsSync(rushJsonPath)) {\n throw new Error(`rush.json not found at ${rushJsonPath}`);\n }\n\n const projects = readRushProjects(rushJsonPath);\n const deps = new Map<string, string[]>();\n\n for (const project of projects) {\n const pkgJsonPath = path.join(repoDir, project.projectFolder, 'package.json');\n if (!fs.existsSync(pkgJsonPath)) {\n continue;\n }\n\n const pkgJson = readPackageJson(pkgJsonPath);\n for (const name of collectDirectFgvDependencies(pkgJson)) {\n const existing = deps.get(name) ?? [];\n existing.push(project.projectFolder);\n deps.set(name, existing);\n }\n }\n\n return deps;\n}\n\n/**\n * Build an internal @fgv package dependency graph from the fgv worktree.\n * Only dependencies that exist in the fgv Rush projects are retained.\n */\nfunction buildFgvDependencyGraph(fgvDir: string, fgvPackageMap: Map<string, string>): FgvDependencyGraph {\n const rushJsonPath = path.join(fgvDir, 'rush.json');\n if (!fs.existsSync(rushJsonPath)) {\n throw new Error(`fgv rush.json not found at ${rushJsonPath}`);\n }\n\n const projects = readRushProjects(rushJsonPath);\n const graph = new Map<string, Set<string>>();\n\n for (const project of projects) {\n const pkgJsonPath = path.join(fgvDir, project.projectFolder, 'package.json');\n if (!fs.existsSync(pkgJsonPath)) {\n continue;\n }\n\n const pkgJson = readPackageJson(pkgJsonPath);\n const internalDeps = new Set<string>();\n const allDeps: Record<string, string> = {\n ...(pkgJson.dependencies ?? {}),\n ...(pkgJson.devDependencies ?? {}),\n ...(pkgJson.peerDependencies ?? {})\n };\n\n for (const [dependencyName] of Object.entries(allDeps)) {\n if (fgvPackageMap.has(dependencyName) && dependencyName !== project.packageName) {\n internalDeps.add(dependencyName);\n }\n }\n\n graph.set(project.packageName, internalDeps);\n }\n\n return graph;\n}\n\n/**\n * Expand a set of package names to include all transitive internal dependencies.\n */\nfunction expandFgvDependencyClosure(\n seedPackageNames: Iterable<string>,\n graph: FgvDependencyGraph\n): Set<string> {\n const resolved = new Set<string>();\n const pending = [...seedPackageNames];\n\n while (pending.length > 0) {\n const packageName = pending.pop();\n if (!packageName || resolved.has(packageName)) {\n continue;\n }\n\n resolved.add(packageName);\n const directDeps = graph.get(packageName);\n if (!directDeps) {\n continue;\n }\n\n for (const dependencyName of directDeps) {\n if (!resolved.has(dependencyName)) {\n pending.push(dependencyName);\n }\n }\n }\n\n return resolved;\n}\n\n/**\n * Read the fgv worktree's rush.json and build a map of packageName -> projectFolder.\n */\nfunction buildFgvPackageMap(fgvDir: string): Map<string, string> {\n const rushJsonPath = path.join(fgvDir, 'rush.json');\n if (!fs.existsSync(rushJsonPath)) {\n throw new Error(`fgv rush.json not found at ${rushJsonPath}`);\n }\n\n const projects = readRushProjects(rushJsonPath);\n const map = new Map<string, string>();\n for (const project of projects) {\n map.set(project.packageName, project.projectFolder);\n }\n return map;\n}\n\n// ── Version helpers ──\n\n/**\n * Query npm for the latest prerelease version of @fgv/ts-utils and construct a ~X.Y.Z spec.\n */\nfunction resolveLatestFgvVersion(): string {\n const output = execSync('npm view @fgv/ts-utils dist-tags --json', { encoding: 'utf-8' });\n const tags = JSON.parse(output) as Record<string, string>;\n const version = tags.alpha ?? tags.latest;\n if (!version) {\n throw new Error('Could not determine latest @fgv version from npm dist-tags');\n }\n return `~${version}`;\n}\n\n/**\n * Update all @fgv/* dependency versions (excluding workspace:*) in a consumer repo's package.json files.\n * Uses jsonc-parser modify() to preserve formatting.\n */\nfunction updateVersionsInPackageJsons(repoDir: string, versionSpec: string): string[] {\n const rushJsonPath = path.join(repoDir, 'rush.json');\n const projects = readRushProjects(rushJsonPath);\n const changed: string[] = [];\n\n for (const project of projects) {\n const pkgJsonPath = path.join(repoDir, project.projectFolder, 'package.json');\n if (!fs.existsSync(pkgJsonPath)) {\n continue;\n }\n\n const pkgJson = JSON.parse(fs.readFileSync(pkgJsonPath, 'utf-8'));\n const operations: IPatchOperation[] = [];\n\n for (const depField of ['dependencies', 'devDependencies'] as const) {\n const deps: Record<string, string> | undefined = pkgJson[depField];\n if (!deps) continue;\n\n for (const [name, spec] of Object.entries(deps)) {\n if (name.startsWith('@fgv/') && spec !== 'workspace:*') {\n operations.push({\n type: 'set-json',\n path: `${depField}.${name}`,\n value: JSON.stringify(versionSpec)\n });\n }\n }\n }\n\n if (operations.length > 0) {\n patchFile(pkgJsonPath, operations);\n changed.push(pkgJsonPath);\n }\n }\n\n return changed;\n}\n\n// ── Command runners ──\n\nexport async function runLink(options: ILinkOptions): Promise<void> {\n const { fgvDir, repoDir } = options;\n\n console.log(`==> Linking to local fgv worktree`);\n console.log(` fgv dir: ${fgvDir}`);\n console.log(` repo dir: ${repoDir}`);\n\n const fgvDeps = discoverFgvDeps(repoDir);\n if (fgvDeps.size === 0) {\n console.log(' No @fgv/* dependencies found in consumer repo.');\n return;\n }\n\n const fgvPackageMap = buildFgvPackageMap(fgvDir);\n const fgvDependencyGraph = buildFgvDependencyGraph(fgvDir, fgvPackageMap);\n const linkedPackageNames = expandFgvDependencyClosure(fgvDeps.keys(), fgvDependencyGraph);\n\n // Compute file: overrides relative to common/temp/\n const commonTempDir = path.join(repoDir, 'common', 'temp');\n const overrides: Record<string, string> = {};\n const warnings: string[] = [];\n\n for (const packageName of linkedPackageNames) {\n const projectFolder = fgvPackageMap.get(packageName);\n if (!projectFolder) {\n warnings.push(` Warning: ${packageName} not found in fgv worktree — skipping`);\n continue;\n }\n const absoluteProjectPath = path.join(fgvDir, projectFolder);\n const relativePath = path.relative(commonTempDir, absoluteProjectPath);\n overrides[packageName] = `file:${relativePath}`;\n }\n\n for (const w of warnings) {\n console.warn(w);\n }\n\n // Patch pnpm-config.json\n const pnpmConfigPath = path.join(repoDir, 'common', 'config', 'rush', 'pnpm-config.json');\n if (!fs.existsSync(pnpmConfigPath)) {\n throw new Error(`pnpm-config.json not found at ${pnpmConfigPath}`);\n }\n\n const patchOps: IPatchOperation[] = [\n {\n type: 'set-json',\n path: 'globalOverrides',\n value: JSON.stringify(overrides)\n },\n {\n type: 'set',\n path: 'strictPeerDependencies',\n value: false\n },\n {\n type: 'set-json',\n path: 'globalPeerDependencyRules',\n value: JSON.stringify({ ignoreMissing: ['mustache'], allowAny: ['@fgv/*'] })\n }\n ];\n\n patchFile(pnpmConfigPath, patchOps);\n\n console.log(`\\n Patched: ${pnpmConfigPath}`);\n console.log(` Overrides (${Object.keys(overrides).length} packages):`);\n for (const [name, filePath] of Object.entries(overrides)) {\n console.log(` ${name} -> ${filePath}`);\n }\n console.log(`\\n Next: run \"rush update --purge\" in the consumer repo.`);\n}\n\nexport async function runUnlink(options: IUnlinkOptions): Promise<void> {\n const { repoDir, version } = options;\n\n console.log(`==> Unlinking from local fgv worktree`);\n console.log(` repo dir: ${repoDir}`);\n\n // Restore pnpm-config.json to defaults\n const pnpmConfigPath = path.join(repoDir, 'common', 'config', 'rush', 'pnpm-config.json');\n if (!fs.existsSync(pnpmConfigPath)) {\n throw new Error(`pnpm-config.json not found at ${pnpmConfigPath}`);\n }\n\n const patchOps: IPatchOperation[] = [\n {\n type: 'set-json',\n path: 'globalOverrides',\n value: JSON.stringify({})\n },\n {\n type: 'set',\n path: 'strictPeerDependencies',\n value: true\n },\n {\n type: 'set-json',\n path: 'globalPeerDependencyRules',\n value: JSON.stringify({})\n }\n ];\n\n patchFile(pnpmConfigPath, patchOps);\n console.log(` Patched: ${pnpmConfigPath} (restored defaults)`);\n\n // Optionally bump versions\n if (version) {\n console.log(`\\n Bumping @fgv/* deps to ${version}...`);\n const changed = updateVersionsInPackageJsons(repoDir, version);\n console.log(` Updated ${changed.length} package.json file(s):`);\n for (const f of changed) {\n console.log(` ${f}`);\n }\n }\n\n console.log(`\\n Next: run \"rush update --purge\" in the consumer repo.`);\n}\n\nexport async function runUpdateFgvVersions(options: IUpdateFgvVersionsOptions): Promise<void> {\n const { repoDir } = options;\n\n console.log(`==> Updating @fgv/* version specs`);\n console.log(` repo dir: ${repoDir}`);\n\n // Resolve version\n let versionSpec: string;\n if (options.version) {\n versionSpec = options.version;\n console.log(` Using explicit version: ${versionSpec}`);\n } else {\n console.log(' Querying npm for latest version...');\n versionSpec = resolveLatestFgvVersion();\n console.log(` Resolved version: ${versionSpec}`);\n }\n\n const changed = updateVersionsInPackageJsons(repoDir, versionSpec);\n console.log(`\\n Updated ${changed.length} package.json file(s):`);\n for (const f of changed) {\n console.log(` ${f}`);\n }\n\n if (changed.length > 0) {\n console.log(`\\n Next: run \"rush update --purge\" in the consumer repo.`);\n }\n}\n"]}
|