diff --git a/tools/generators/dependency-mismatch/index.spec.ts b/tools/generators/dependency-mismatch/index.spec.ts index 12f0261ac86384..f85c7cbf57f278 100644 --- a/tools/generators/dependency-mismatch/index.spec.ts +++ b/tools/generators/dependency-mismatch/index.spec.ts @@ -18,9 +18,10 @@ describe('dependency-mismatch generator', () => { name: 'public-docsite-v9', version: '9.0.0', dependencies: { - [`${workspaceNpmScope}/react-theme`]: '^9.0.0', + [`@${workspaceNpmScope}/react-theme`]: '^9.0.0', }, devDependencies: {}, + peerDependencies: {}, }); setupDummyPackage(appTree, { @@ -28,13 +29,14 @@ describe('dependency-mismatch generator', () => { version: '9.0.1', dependencies: {}, devDependencies: {}, + peerDependencies: {}, }); await generator(appTree); const packageJson: PackageJson = await readTargetPackageJson(); expect(packageJson.dependencies).toMatchInlineSnapshot(` Object { - "proj/react-theme": "^9.0.1", + "@proj/react-theme": "^9.0.1", } `); }); @@ -44,9 +46,10 @@ describe('dependency-mismatch generator', () => { name: 'public-docsite-v9', version: '9.0.0', devDependencies: { - [`${workspaceNpmScope}/react-theme`]: '^9.0.0', + [`@${workspaceNpmScope}/react-theme`]: '^9.0.0', }, dependencies: {}, + peerDependencies: {}, }); setupDummyPackage(appTree, { @@ -54,39 +57,42 @@ describe('dependency-mismatch generator', () => { version: '9.0.1', dependencies: {}, devDependencies: {}, + peerDependencies: {}, }); await generator(appTree); const packageJson: PackageJson = await readTargetPackageJson(); expect(packageJson.devDependencies).toMatchInlineSnapshot(` Object { - "proj/react-theme": "^9.0.1", + "@proj/react-theme": "^9.0.1", } `); }); - it('should ignore non-converged dependency', async () => { + it('should also fix peer dependencies', async () => { const { readPackageJson: readTargetPackageJson } = setupDummyPackage(appTree, { name: 'public-docsite-v9', version: '9.0.0', - dependencies: { - [`${workspaceNpmScope}/react-focus`]: '^8.0.0', + peerDependencies: { + [`@${workspaceNpmScope}/react-theme`]: '^9.0.0', }, + dependencies: {}, devDependencies: {}, }); setupDummyPackage(appTree, { - name: 'react-focus', - version: '8.0.1', + name: 'react-theme', + version: '9.0.1', dependencies: {}, devDependencies: {}, + peerDependencies: {}, }); await generator(appTree); const packageJson: PackageJson = await readTargetPackageJson(); - expect(packageJson.dependencies).toMatchInlineSnapshot(` + expect(packageJson.peerDependencies).toMatchInlineSnapshot(` Object { - "proj/react-focus": "^8.0.0", + "@proj/react-theme": "^9.0.1", } `); }); @@ -96,10 +102,11 @@ describe('dependency-mismatch generator', () => { name: 'public-docsite-v9', version: '9.0.0', dependencies: { - [`${workspaceNpmScope}/react-select`]: '^9.0.0-beta.1', - [`${workspaceNpmScope}/react-spinbutton`]: '9.0.0-beta.1', + [`@${workspaceNpmScope}/react-select`]: '^9.0.0-beta.1', + [`@${workspaceNpmScope}/react-spinbutton`]: '9.0.0-beta.1', }, devDependencies: {}, + peerDependencies: {}, }); setupDummyPackage(appTree, { @@ -107,20 +114,22 @@ describe('dependency-mismatch generator', () => { version: '9.0.0-beta.2', dependencies: {}, devDependencies: {}, + peerDependencies: {}, }); setupDummyPackage(appTree, { name: 'react-spinbutton', version: '9.0.0-beta.2', dependencies: {}, devDependencies: {}, + peerDependencies: {}, }); await generator(appTree); const packageJson: PackageJson = await readTargetPackageJson(); expect(packageJson.dependencies).toMatchInlineSnapshot(` Object { - "proj/react-select": "^9.0.0-beta.2", - "proj/react-spinbutton": "9.0.0-beta.2", + "@proj/react-select": "^9.0.0-beta.2", + "@proj/react-spinbutton": "9.0.0-beta.2", } `); }); @@ -130,9 +139,10 @@ describe('dependency-mismatch generator', () => { name: 'react', version: '8.0.0', dependencies: { - [`${workspaceNpmScope}/react-portal-compat-context`]: '^9.0.0', + [`@${workspaceNpmScope}/react-portal-compat-context`]: '^9.0.0', }, devDependencies: {}, + peerDependencies: {}, }); setupDummyPackage(appTree, { @@ -140,13 +150,14 @@ describe('dependency-mismatch generator', () => { version: '9.0.1', dependencies: {}, devDependencies: {}, + peerDependencies: {}, }); await generator(appTree); const packageJson: PackageJson = await readTargetPackageJson(); expect(packageJson.dependencies).toMatchInlineSnapshot(` Object { - "proj/react-portal-compat-context": "^9.0.1", + "@proj/react-portal-compat-context": "^9.0.1", } `); }); @@ -156,15 +167,51 @@ describe('dependency-mismatch generator', () => { name: 'react', version: '8.0.0', dependencies: { - [`${workspaceNpmScope}/tslib`]: '^2.1.1', + [`@${workspaceNpmScope}/tslib`]: '^2.1.1', }, devDependencies: {}, + peerDependencies: {}, }); + await generator(appTree); + + const packageJson: PackageJson = await readTargetPackageJson(); + expect(packageJson.dependencies).toMatchInlineSnapshot(` + Object { + "@proj/tslib": "^2.1.1", + } + `); + }); + + it('generator should not run on northstar packages', async () => { + const { readPackageJson: readTargetPackageJson } = setupDummyPackage( + appTree, + { + name: 'react-northstar', + version: '0.66.0', + dependencies: { + [`@${workspaceNpmScope}/dom-utilities`]: '^1.1.1', + }, + devDependencies: {}, + peerDependencies: {}, + }, + ['react-northstar'], + ); + + setupDummyPackage(appTree, { + name: 'dom-utilities', + version: '2.1.2', + dependencies: {}, + devDependencies: {}, + peerDependencies: {}, + }); + + await generator(appTree); + const packageJson: PackageJson = await readTargetPackageJson(); expect(packageJson.dependencies).toMatchInlineSnapshot(` Object { - "proj/tslib": "^2.1.1", + "@proj/dom-utilities": "^1.1.1", } `); }); @@ -172,23 +219,25 @@ describe('dependency-mismatch generator', () => { function setupDummyPackage( tree: Tree, - options: { + packageJson: { name: string; version: string; devDependencies: Record; dependencies: Record; + peerDependencies: Record; }, + tags: string[] = [], ) { const workspaceConfig = readWorkspaceConfiguration(tree); - const normalizedPkgName = `${workspaceConfig.npmScope}/${options.name}`; + const normalizedPkgName = `@${workspaceConfig.npmScope}/${packageJson.name}`; const paths = { - root: `packages/${options.name}`, + root: `packages/${packageJson.name}`, }; const templates = { packageJson: { - ...options, + ...packageJson, name: normalizedPkgName, }, }; @@ -200,7 +249,7 @@ function setupDummyPackage( root: paths.root, projectType: 'library', targets: {}, - tags: ['platform:web'], + tags: ['platform:web', ...tags], }); return { diff --git a/tools/generators/dependency-mismatch/index.ts b/tools/generators/dependency-mismatch/index.ts index d84fb81d030ed2..599f097ec3096c 100644 --- a/tools/generators/dependency-mismatch/index.ts +++ b/tools/generators/dependency-mismatch/index.ts @@ -1,7 +1,7 @@ import * as semver from 'semver'; import { Tree, formatFiles, updateJson, readJson, readProjectConfiguration } from '@nrwl/devkit'; -import { getProjectConfig, getProjects, isPackageVersionConverged, isPackageVersionPrerelease } from '../../utils'; +import { getProjectConfig, getProjects, isPackageVersionPrerelease } from '../../utils'; import { PackageJson } from '../../types'; export default async function (tree: Tree) { @@ -10,6 +10,12 @@ export default async function (tree: Tree) { projects.forEach((_project, projectName) => { const config = getProjectConfig(tree, { packageName: projectName }); + const { tags = [] } = readProjectConfiguration(tree, projectName); + // Ignore northstar packages + if (tags.includes('react-northstar')) { + return; + } + updateJson(tree, config.paths.packageJson, (packageJson: PackageJson) => { if (packageJson.dependencies) { packageJson.dependencies = getUpdatedDependencies(tree, packageJson.dependencies); @@ -19,6 +25,10 @@ export default async function (tree: Tree) { packageJson.devDependencies = getUpdatedDependencies(tree, packageJson.devDependencies); } + if (packageJson.peerDependencies) { + packageJson.peerDependencies = getUpdatedDependencies(tree, packageJson.peerDependencies); + } + return packageJson; }); }); @@ -38,6 +48,10 @@ function isProjectInWorkspace(tree: Tree, projectName: string) { function getUpdatedDependencies(tree: Tree, dependencies: Record) { return Object.entries(dependencies).reduce((acc, [dependencyName, versionRange]) => { + if (versionRange === '*') { + return acc; + } + if (!isProjectInWorkspace(tree, dependencyName)) { return acc; } @@ -48,10 +62,6 @@ function getUpdatedDependencies(tree: Tree, dependencies: Record return acc; } - if (!isPackageVersionConverged(minVersion.raw)) { - return acc; - } - const shouldHaveCaret = !isPackageVersionPrerelease(minVersion.raw) || versionRange[0] === '^'; const depPackageConfig = getProjectConfig(tree, { packageName: dependencyName }); diff --git a/workspace.json b/workspace.json index 223e01dd6a7880..64c263fc9de6f0 100644 --- a/workspace.json +++ b/workspace.json @@ -10,12 +10,14 @@ "@fluentui/ability-attributes": { "root": "packages/fluentui/ability-attributes", "projectType": "library", - "implicitDependencies": [] + "implicitDependencies": [], + "tags": ["react-northstar"] }, "@fluentui/accessibility": { "root": "packages/fluentui/accessibility", "projectType": "library", - "implicitDependencies": [] + "implicitDependencies": [], + "tags": ["react-northstar"] }, "@fluentui/api-docs": { "root": "packages/api-docs", @@ -45,12 +47,14 @@ "@fluentui/circulars-test": { "root": "packages/fluentui/circulars-test", "projectType": "library", - "implicitDependencies": [] + "implicitDependencies": [], + "tags": ["react-northstar"] }, "@fluentui/code-sandbox": { "root": "packages/fluentui/code-sandbox", "projectType": "library", - "implicitDependencies": [] + "implicitDependencies": [], + "tags": ["react-northstar"] }, "@fluentui/codemods": { "root": "packages/codemods", @@ -76,17 +80,20 @@ "@fluentui/digest": { "root": "packages/fluentui/digest", "projectType": "library", - "implicitDependencies": [] + "implicitDependencies": [], + "tags": ["react-northstar"] }, "@fluentui/docs": { "root": "packages/fluentui/docs", "projectType": "library", - "implicitDependencies": [] + "implicitDependencies": [], + "tags": ["react-northstar"] }, "@fluentui/docs-components": { "root": "packages/fluentui/docs-components", "projectType": "library", - "implicitDependencies": [] + "implicitDependencies": [], + "tags": ["react-northstar"] }, "@fluentui/dom-utilities": { "root": "packages/dom-utilities", @@ -96,7 +103,8 @@ "@fluentui/e2e": { "root": "packages/fluentui/e2e", "projectType": "library", - "implicitDependencies": [] + "implicitDependencies": [], + "tags": ["react-northstar"] }, "@fluentui/eslint-plugin": { "root": "packages/eslint-plugin", @@ -146,7 +154,8 @@ "@fluentui/local-sandbox": { "root": "packages/fluentui/local-sandbox", "projectType": "library", - "implicitDependencies": [] + "implicitDependencies": [], + "tags": ["react-northstar"] }, "@fluentui/merge-styles": { "root": "packages/merge-styles", @@ -196,7 +205,8 @@ "@fluentui/perf": { "root": "packages/fluentui/perf", "projectType": "library", - "implicitDependencies": [] + "implicitDependencies": [], + "tags": ["react-northstar"] }, "@fluentui/perf-test": { "root": "apps/perf-test", @@ -206,7 +216,8 @@ "@fluentui/perf-test-northstar": { "root": "packages/fluentui/perf-test-northstar", "projectType": "library", - "implicitDependencies": [] + "implicitDependencies": [], + "tags": ["react-northstar"] }, "@fluentui/perf-test-react-components": { "root": "apps/perf-test-react-components", @@ -228,7 +239,8 @@ "@fluentui/projects-test": { "root": "packages/fluentui/projects-test", "projectType": "library", - "implicitDependencies": [] + "implicitDependencies": [], + "tags": ["react-northstar"] }, "@fluentui/public-docsite": { "root": "apps/public-docsite", @@ -303,12 +315,14 @@ "@fluentui/react-bindings": { "root": "packages/fluentui/react-bindings", "projectType": "library", - "implicitDependencies": [] + "implicitDependencies": [], + "tags": ["react-northstar"] }, "@fluentui/react-builder": { "root": "packages/fluentui/react-builder", "projectType": "library", - "implicitDependencies": [] + "implicitDependencies": [], + "tags": ["react-northstar"] }, "@fluentui/react-button": { "root": "packages/react-components/react-button", @@ -358,17 +372,20 @@ "@fluentui/react-component-event-listener": { "root": "packages/fluentui/react-component-event-listener", "projectType": "library", - "implicitDependencies": [] + "implicitDependencies": [], + "tags": ["react-northstar"] }, "@fluentui/react-component-nesting-registry": { "root": "packages/fluentui/react-component-nesting-registry", "projectType": "library", - "implicitDependencies": [] + "implicitDependencies": [], + "tags": ["react-northstar"] }, "@fluentui/react-component-ref": { "root": "packages/fluentui/react-component-ref", "projectType": "library", - "implicitDependencies": [] + "implicitDependencies": [], + "tags": ["react-northstar"] }, "@fluentui/react-components": { "root": "packages/react-components/react-components", @@ -471,7 +488,8 @@ "@fluentui/react-icons-northstar": { "root": "packages/fluentui/react-icons-northstar", "projectType": "library", - "implicitDependencies": [] + "implicitDependencies": [], + "tags": ["react-northstar"] }, "@fluentui/react-image": { "root": "packages/react-components/react-image", @@ -523,27 +541,32 @@ "@fluentui/react-northstar": { "root": "packages/fluentui/react-northstar", "projectType": "library", - "implicitDependencies": [] + "implicitDependencies": [], + "tags": ["react-northstar"] }, "@fluentui/react-northstar-emotion-renderer": { "root": "packages/fluentui/react-northstar-emotion-renderer", "projectType": "library", - "implicitDependencies": [] + "implicitDependencies": [], + "tags": ["react-northstar"] }, "@fluentui/react-northstar-fela-renderer": { "root": "packages/fluentui/react-northstar-fela-renderer", "projectType": "library", - "implicitDependencies": [] + "implicitDependencies": [], + "tags": ["react-northstar"] }, "@fluentui/react-northstar-prototypes": { "root": "packages/fluentui/react-northstar-prototypes", "projectType": "library", - "implicitDependencies": [] + "implicitDependencies": [], + "tags": ["react-northstar"] }, "@fluentui/react-northstar-styles-renderer": { "root": "packages/fluentui/react-northstar-styles-renderer", "projectType": "library", - "implicitDependencies": [] + "implicitDependencies": [], + "tags": ["react-northstar"] }, "@fluentui/react-overflow": { "root": "packages/react-components/react-overflow", @@ -604,7 +627,8 @@ "@fluentui/react-proptypes": { "root": "packages/fluentui/react-proptypes", "projectType": "library", - "implicitDependencies": [] + "implicitDependencies": [], + "tags": ["react-northstar"] }, "@fluentui/react-provider": { "root": "packages/react-components/react-provider", @@ -707,7 +731,8 @@ "@fluentui/react-telemetry": { "root": "packages/fluentui/react-telemetry", "projectType": "library", - "implicitDependencies": [] + "implicitDependencies": [], + "tags": ["react-northstar"] }, "@fluentui/react-text": { "root": "packages/react-components/react-text",