From 9c75bb0243786fe228c5856c5480f76af5f1d6a7 Mon Sep 17 00:00:00 2001 From: Martin Hochel Date: Fri, 26 May 2023 13:58:18 +0200 Subject: [PATCH] feat(scripts-executors): use nx-graph to resolve packages that need to be build instead hardcoding strings --- scripts/executors/type-check-ci-hack.js | 86 ++++++++++++++----------- 1 file changed, 50 insertions(+), 36 deletions(-) diff --git a/scripts/executors/type-check-ci-hack.js b/scripts/executors/type-check-ci-hack.js index cd9692df22bb42..5ebe874e97969f 100644 --- a/scripts/executors/type-check-ci-hack.js +++ b/scripts/executors/type-check-ci-hack.js @@ -1,11 +1,14 @@ const { execSync } = require('child_process'); const { getAffectedPackages } = require('@fluentui/scripts-monorepo'); -const { readProjectConfiguration, workspaceRoot, joinPathFragments } = require('@nrwl/devkit'); +const { workspaceRoot, joinPathFragments, createProjectGraphAsync } = require('@nrwl/devkit'); const { FsTree } = require('nx/src/config/tree'); const yargs = require('yargs'); -main(); +main().catch(err => { + console.error(err); + process.exit(1); +}); function processArgs() { const args = yargs @@ -19,54 +22,65 @@ function processArgs() { return args; } -function main() { +async function main() { const { base } = processArgs(); - const affected = Array.from(getAffectedPackages(base)); + const affectedSet = getAffectedPackages(base); + affectedSet.delete('@fluentui/noop'); + const affected = Array.from(affectedSet); const tree = new FsTree(workspaceRoot, false); + /** @type {import('@nrwl/devkit').ProjectGraph<{}>} */ + const nxGraph = await createProjectGraphAsync(); - const needsReactComponentsDts = affected.some(projectName => { - try { - const project = readProjectConfiguration(tree, projectName); + const v9SuiteDeps = new Set( + nxGraph.dependencies['@fluentui/react-components'].map(dep => { + return dep.target; + }), + ); + /** + * + * @param {string[]} affectedPkgs + */ + function handleSpecialPkgDependencies(affectedPkgs) { + /** @type {Set} */ + const pkgsToBuild = new Set(); + const deps = nxGraph.dependencies; + + affectedPkgs.forEach(pkgName => { + const project = nxGraph.nodes[pkgName].data; const isVNext = project.tags?.indexOf('vNext') !== -1; const hasStories = tree.exists(joinPathFragments(project.root, 'stories')); + // @ts-ignore - bug in nx types, projectType is part of API + const isLibrary = project.projectType === 'library'; - if (isVNext && hasStories) { - return true; + if (!(isVNext && hasStories && isLibrary)) { + return; } - // eslint-disable-next-line no-empty - } catch {} - return false; - }); + deps[pkgName].forEach(value => { + const target = value.target; + if (target.indexOf('npm:') !== -1) { + return; + } - /** - * - * @param {string[]} affectedPkgs - */ - function handleSpecialPkgDependencies(affectedPkgs) { - const specialPackages = { '@fluentui/react-table': ['@fluentui/react-data-grid-react-window'] }; - const packages = /** @type {string[]} */ ( - Object.entries(specialPackages) - .map(([pkgName, dependencies]) => { - if (affectedPkgs.includes(pkgName)) { - return dependencies; - } + const projectInner = nxGraph.nodes[target].data; + const isVNextInner = projectInner.tags?.indexOf('vNext') !== -1; + + if (!isVNextInner) { return; - }) - .filter(Boolean) - .flat() - ); + } + if (v9SuiteDeps.has(target)) { + return; + } - return packages; - } + pkgsToBuild.add(target); + }); + }); - const nonSuiteAffectedPackages = handleSpecialPkgDependencies(affected); + return pkgsToBuild; + } - const packagesToBuildFirst = [ - needsReactComponentsDts ? '@fluentui/react-components' : null, - ...nonSuiteAffectedPackages, - ].filter(Boolean); + const packagesToBuildFirst = Array.from(handleSpecialPkgDependencies(affected)); if (packagesToBuildFirst.length > 0) { console.info(