Skip to content

Commit 6b1fd9d

Browse files
committed
publish: replace local paths
1 parent 128df42 commit 6b1fd9d

File tree

2 files changed

+63
-0
lines changed

2 files changed

+63
-0
lines changed

src/publish.js

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ export async function publish(args) {
3838
writeFileSync(packageJsonPath, JSON.stringify(json, null, 2));
3939
}
4040

41+
4142
/** @type {import('../types').PackageJson} */
4243
const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));
4344
const buildTime = new Date().toISOString();
@@ -53,6 +54,8 @@ export async function publish(args) {
5354
logger.warn(`No access token provided. Publishing to registry ${args.registry} may fail.`);
5455
}
5556

57+
processPackageJson(packageDirectory, packageJson, { logger });
58+
5659
if (webhook) {
5760
let msg = `📦 **Publish package** \`${packageJson.name}\`\n`;
5861
msg += "```\n";
@@ -221,3 +224,59 @@ export async function publish(args) {
221224
appendFileSync(process.env.GITHUB_OUTPUT, `package-published=${needsPublish}\n`);
222225
}
223226
}
227+
228+
229+
230+
/**
231+
* Processes the package.json file to replace local dependencies with their current versions.
232+
* @param {string} packageJsonDirectory - The directory where the package.json file is located.
233+
* @param {import('../types').PackageJson} packageJson - The package.json object to process.
234+
* @param {{logger:import('@caporal/core').Logger}} args
235+
*/
236+
function processPackageJson(packageJsonDirectory, packageJson, args) {
237+
238+
let modified = false;
239+
240+
if (packageJson.dependencies) {
241+
replaceLocalPathWithVersion(packageJson.dependencies);
242+
}
243+
if (packageJson.devDependencies) {
244+
replaceLocalPathWithVersion(packageJson.devDependencies);
245+
}
246+
if (packageJson.peerDependencies) {
247+
replaceLocalPathWithVersion(packageJson.peerDependencies);
248+
}
249+
if (packageJson.optionalDependencies) {
250+
replaceLocalPathWithVersion(packageJson.optionalDependencies);
251+
}
252+
253+
if (modified) {
254+
args.logger.info(`[${packageJson.name}]: Modified package.json to replace local paths with versions.`);
255+
writeFileSync(resolve(packageJsonDirectory, 'package.json'), JSON.stringify(packageJson, null, 2), 'utf-8');
256+
}
257+
258+
/**
259+
* @param {Record<string, string>} object
260+
*/
261+
function replaceLocalPathWithVersion(object) {
262+
for (const [key, value] of Object.entries(object)) {
263+
if (value.startsWith('file:')) {
264+
const localpath = value.substring("file:".length).trim();
265+
const localPackageJsonPath = resolve(packageJsonDirectory, localpath, 'package.json');
266+
if (!existsSync(localPackageJsonPath)) {
267+
args.logger.warn(`[${packageJson.name}]: Dependency '${key}' is a local path '${localpath}' but no package.json found at ${localPackageJsonPath}. Keeping as is.`);
268+
continue;
269+
}
270+
const localPackageJson = JSON.parse(readFileSync(localPackageJsonPath, 'utf-8'));
271+
if (localPackageJson.version) {
272+
modified = true;
273+
args.logger.info(`[${packageJson.name}]: Replacing dependency '${key}' with version '${localPackageJson.version}' (from ${localPackageJsonPath})`);
274+
object[key] = localPackageJson.version;
275+
} else {
276+
args.logger.warn(`[${packageJson.name}]: Dependency '${key}' is a local path but has no version in ${localPackageJsonPath}. Keeping as is.`);
277+
}
278+
279+
}
280+
}
281+
}
282+
}

types/index.d.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@ export type PackageJson = {
55
version: string;
66
description?: string;
77
main?: string,
8+
dependencies?: Record<string, string>;
9+
devDependencies?: Record<string, string>;
10+
peerDependencies?: Record<string, string>;
11+
optionalDependencies?: Record<string, string>;
812
}
913

1014
export type UnityPackageJson = Pick<PackageJson, "name" | "version" | "description">;

0 commit comments

Comments
 (0)