Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"changes": [
{
"comment": "Fixes a bug where the injected dependency state hash updated on devDependency changes that wouldn't impact the lockfile.",
"type": "none",
"packageName": "@microsoft/rush"
}
],
"packageName": "@microsoft/rush",
"email": "aramissennyeydd@users.noreply.github.com"
}
2 changes: 0 additions & 2 deletions libraries/rush-lib/src/api/Subspace.ts
Original file line number Diff line number Diff line change
Expand Up @@ -478,7 +478,6 @@ export class Subspace {
name,
bin,
dependencies,
devDependencies,
peerDependencies,
optionalDependencies,
dependenciesMeta,
Expand All @@ -500,7 +499,6 @@ export class Subspace {
name,
bin,
dependencies,
devDependencies,
peerDependencies,
optionalDependencies,
dependenciesMeta,
Expand Down
76 changes: 76 additions & 0 deletions libraries/rush-lib/src/api/test/Subspace.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -74,4 +74,80 @@ describe(Subspace.name, () => {
expect(hashWithCatalogs).toBeDefined();
});
});

describe('getPackageJsonInjectedDependenciesHash', () => {
it('returns undefined when no injected dependencies exist', () => {
const rushJsonFilename: string = path.resolve(__dirname, 'repo', 'rush-pnpm.json');
const rushConfiguration: RushConfiguration =
RushConfiguration.loadFromConfigurationFile(rushJsonFilename);
const defaultSubspace: Subspace = rushConfiguration.defaultSubspace;

const hash: string | undefined = defaultSubspace.getPackageJsonInjectedDependenciesHash();
expect(hash).toBeUndefined();
});

it('computes a hash when injected dependencies exist', () => {
const rushJsonFilename: string = path.resolve(__dirname, 'repoInjectedDeps', 'rush.json');
const rushConfiguration: RushConfiguration =
RushConfiguration.loadFromConfigurationFile(rushJsonFilename);
const defaultSubspace: Subspace = rushConfiguration.defaultSubspace;

const hash: string | undefined = defaultSubspace.getPackageJsonInjectedDependenciesHash();
expect(hash).toBeDefined();
expect(typeof hash).toBe('string');
expect(hash).toHaveLength(40); // SHA1 hash
});

it('does not change when devDependencies of the injected package change', () => {
const rushJsonFilename: string = path.resolve(__dirname, 'repoInjectedDeps', 'rush.json');
const rushConfiguration: RushConfiguration =
RushConfiguration.loadFromConfigurationFile(rushJsonFilename);
const defaultSubspace: Subspace = rushConfiguration.defaultSubspace;

const hashBefore: string | undefined = defaultSubspace.getPackageJsonInjectedDependenciesHash();

// Mutate devDependencies of the injected provider package
const providerProject = rushConfiguration.getProjectByName('provider')!;
const originalDevDeps = providerProject.packageJson.devDependencies;
providerProject.packageJson.devDependencies = {
...originalDevDeps,
jest: '^29.0.0'
};

const hashAfter: string | undefined = defaultSubspace.getPackageJsonInjectedDependenciesHash();

expect(hashBefore).toBeDefined();
expect(hashAfter).toBeDefined();
expect(hashBefore).toBe(hashAfter);

// Restore
providerProject.packageJson.devDependencies = originalDevDeps;
});

it('changes when production dependencies of the injected package change', () => {
const rushJsonFilename: string = path.resolve(__dirname, 'repoInjectedDeps', 'rush.json');
const rushConfiguration: RushConfiguration =
RushConfiguration.loadFromConfigurationFile(rushJsonFilename);
const defaultSubspace: Subspace = rushConfiguration.defaultSubspace;

const hashBefore: string | undefined = defaultSubspace.getPackageJsonInjectedDependenciesHash();

// Mutate dependencies of the injected provider package
const providerProject = rushConfiguration.getProjectByName('provider')!;
const originalDeps = providerProject.packageJson.dependencies;
providerProject.packageJson.dependencies = {
...originalDeps,
axios: '^1.6.0'
};

const hashAfter: string | undefined = defaultSubspace.getPackageJsonInjectedDependenciesHash();

expect(hashBefore).toBeDefined();
expect(hashAfter).toBeDefined();
expect(hashBefore).not.toBe(hashAfter);

// Restore
providerProject.packageJson.dependencies = originalDeps;
});
});
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"name": "consumer",
"version": "1.0.0",
"dependencies": {
"provider": "workspace:*"
},
"dependenciesMeta": {
"provider": {
"injected": true
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"name": "provider",
"version": "1.0.0",
"dependencies": {
"lodash": "^4.17.21"
},
"devDependencies": {
"typescript": "~5.3.0"
}
}
17 changes: 17 additions & 0 deletions libraries/rush-lib/src/api/test/repoInjectedDeps/rush.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{
"pnpmVersion": "9.5.0",
"rushVersion": "5.46.1",
"projectFolderMinDepth": 1,
"projectFolderMaxDepth": 99,

"projects": [
{
"packageName": "consumer",
"projectFolder": "consumer"
},
{
"packageName": "provider",
"projectFolder": "provider"
}
]
}