From 64af085e529a9fb6adf98e07182586e35671ac62 Mon Sep 17 00:00:00 2001 From: Isaac Mann Date: Thu, 17 Nov 2022 13:41:38 -0500 Subject: [PATCH] docs(core): improved worst case ci times (#13188) --- affected.json | 4267 +++++++++++++++++ docs/map.json | 10 +- ...{dte-guide.md => illustrated-dte-guide.md} | 0 .../concepts/improve-worst-case-ci-times.md | 128 + .../distribute-task-execution.md | 8 +- 5 files changed, 4405 insertions(+), 8 deletions(-) create mode 100644 affected.json rename docs/shared/concepts/{dte-guide.md => illustrated-dte-guide.md} (100%) create mode 100644 docs/shared/concepts/improve-worst-case-ci-times.md diff --git a/affected.json b/affected.json new file mode 100644 index 0000000000..cf5d4b2360 --- /dev/null +++ b/affected.json @@ -0,0 +1,4267 @@ +{ + "tasks": [], + "projects": ["docs", "nx-dev", "nx-dev-e2e"], + "projectGraph": { + "nodes": [ + "nx-dev-feature-package-schema-viewer", + "make-angular-cli-faster", + "nx-dev-data-access-documents", + "create-nx-workspace", + "e2e-make-angular-cli-faster", + "nx-dev-data-access-packages", + "add-nx-to-monorepo", + "nx-dev-feature-doc-viewer", + "create-nx-plugin", + "eslint-plugin-nx", + "nx-dev-feature-analytics", + "nx-dev-data-access-menu", + "e2e-add-nx-to-monorepo", + "e2e-angular-extensions", + "nx-dev-models-document", + "nx-dev-ui-sponsor-card", + "e2e-storybook-angular", + "nx-dev-feature-search", + "nx-dev-models-package", + "nx-dev-ui-member-card", + "react-native", + "e2e-workspace-create", + "nx-dev-ui-conference", + "nx-dev-ui-references", + "nx-dev-ui-community", + "nx-dev-models-menu", + "nx-dev-ui-commands", + "cra-to-nx", + "nx-plugin", + "storybook", + "workspace", + "eslint-rules", + "nx-dev-e2e", + "nx-dev-ui-markdoc", + "e2e-angular-core", + "e2e-react-native", + "e2e-graph-client", + "nx-dev-ui-common", + "angular", + "cypress", + "esbuild", + "express", + "webpack", + "nx-dev-ui-theme", + "devkit", + "linter", + "rollup", + "graph-ui-graph", + "nx-dev-ui-home", + "detox", + "react", + "typedoc-theme", + "e2e-cra-to-nx", + "e2e-nx-plugin", + "e2e-storybook", + "nx-dev", + "expo", + "jest", + "nest", + "next", + "node", + "vite", + "graph-client", + "cli", + "tao", + "web", + "e2e-cypress", + "e2e-esbuild", + "e2e-nx-init", + "e2e-nx-misc", + "e2e-webpack", + "js", + "nx", + "e2e-linter", + "e2e-nx-run", + "e2e-rollup", + "e2e-detox", + "e2e-react", + "e2e-utils", + "e2e-expo", + "e2e-jest", + "e2e-next", + "e2e-node", + "e2e-vite", + "e2e-web", + "e2e-js", + "docs" + ], + "dependencies": { + "nx-dev-feature-package-schema-viewer": [ + { + "source": "nx-dev-feature-package-schema-viewer", + "target": "npm:@heroicons/react", + "type": "static" + }, + { + "source": "nx-dev-feature-package-schema-viewer", + "target": "nx-dev-data-access-packages", + "type": "static" + }, + { + "source": "nx-dev-feature-package-schema-viewer", + "target": "nx-dev-models-package", + "type": "static" + }, + { + "source": "nx-dev-feature-package-schema-viewer", + "target": "nx-dev-ui-markdoc", + "type": "static" + }, + { + "source": "nx-dev-feature-package-schema-viewer", + "target": "npm:next", + "type": "static" + }, + { + "source": "nx-dev-feature-package-schema-viewer", + "target": "npm:react", + "type": "static" + }, + { + "source": "nx-dev-feature-package-schema-viewer", + "target": "npm:querystring", + "type": "static" + }, + { + "source": "nx-dev-feature-package-schema-viewer", + "target": "nx-dev-models-menu", + "type": "static" + }, + { + "source": "nx-dev-feature-package-schema-viewer", + "target": "nx-dev-ui-common", + "type": "static" + }, + { + "source": "nx-dev-feature-package-schema-viewer", + "target": "npm:next-seo", + "type": "static" + }, + { + "source": "nx-dev-feature-package-schema-viewer", + "target": "npm:@monaco-editor/react", + "type": "static" + }, + { + "source": "nx-dev-feature-package-schema-viewer", + "target": "nx-dev-ui-theme", + "type": "static" + } + ], + "make-angular-cli-faster": [ + { + "source": "make-angular-cli-faster", + "target": "devkit", + "type": "static" + }, + { + "source": "make-angular-cli-faster", + "target": "workspace", + "type": "static" + }, + { + "source": "make-angular-cli-faster", + "target": "npm:enquirer", + "type": "static" + }, + { + "source": "make-angular-cli-faster", + "target": "nx", + "type": "static" + }, + { + "source": "make-angular-cli-faster", + "target": "npm:semver", + "type": "static" + }, + { + "source": "make-angular-cli-faster", + "target": "npm:tmp", + "type": "static" + }, + { + "source": "make-angular-cli-faster", + "target": "npm:yargs", + "type": "static" + }, + { + "source": "make-angular-cli-faster", + "target": "npm:yargs-parser", + "type": "static" + } + ], + "nx-dev-data-access-documents": [ + { + "source": "nx-dev-data-access-documents", + "target": "nx-dev-models-document", + "type": "static" + }, + { + "source": "nx-dev-data-access-documents", + "target": "nx-dev-models-menu", + "type": "static" + }, + { + "source": "nx-dev-data-access-documents", + "target": "nx-dev-ui-markdoc", + "type": "static" + }, + { + "source": "nx-dev-data-access-documents", + "target": "npm:js-yaml", + "type": "static" + } + ], + "create-nx-workspace": [ + { + "source": "create-nx-workspace", + "target": "workspace", + "type": "implicit" + }, + { + "source": "create-nx-workspace", + "target": "npm:axios", + "type": "static" + }, + { + "source": "create-nx-workspace", + "target": "npm:enquirer", + "type": "static" + }, + { + "source": "create-nx-workspace", + "target": "npm:tmp", + "type": "static" + }, + { + "source": "create-nx-workspace", + "target": "npm:yargs", + "type": "static" + }, + { + "source": "create-nx-workspace", + "target": "npm:ora", + "type": "static" + }, + { + "source": "create-nx-workspace", + "target": "npm:chalk", + "type": "static" + }, + { + "source": "create-nx-workspace", + "target": "npm:flat", + "type": "static" + }, + { + "source": "create-nx-workspace", + "target": "npm:tslib", + "type": "static" + } + ], + "e2e-make-angular-cli-faster": [ + { + "source": "e2e-make-angular-cli-faster", + "target": "make-angular-cli-faster", + "type": "implicit" + }, + { + "source": "e2e-make-angular-cli-faster", + "target": "e2e-utils", + "type": "static" + }, + { + "source": "e2e-make-angular-cli-faster", + "target": "nx", + "type": "static" + } + ], + "nx-dev-data-access-packages": [ + { + "source": "nx-dev-data-access-packages", + "target": "nx-dev-models-package", + "type": "static" + }, + { + "source": "nx-dev-data-access-packages", + "target": "npm:jsonpointer", + "type": "static" + }, + { + "source": "nx-dev-data-access-packages", + "target": "nx-dev-models-document", + "type": "static" + } + ], + "add-nx-to-monorepo": [ + { + "source": "add-nx-to-monorepo", + "target": "npm:enquirer", + "type": "static" + }, + { + "source": "add-nx-to-monorepo", + "target": "npm:ignore", + "type": "static" + }, + { + "source": "add-nx-to-monorepo", + "target": "nx", + "type": "static" + }, + { + "source": "add-nx-to-monorepo", + "target": "npm:yargs-parser", + "type": "static" + } + ], + "nx-dev-feature-doc-viewer": [ + { + "source": "nx-dev-feature-doc-viewer", + "target": "nx-dev-models-document", + "type": "static" + }, + { + "source": "nx-dev-feature-doc-viewer", + "target": "nx-dev-ui-markdoc", + "type": "static" + }, + { + "source": "nx-dev-feature-doc-viewer", + "target": "nx-dev-ui-common", + "type": "static" + }, + { + "source": "nx-dev-feature-doc-viewer", + "target": "npm:next-seo", + "type": "static" + }, + { + "source": "nx-dev-feature-doc-viewer", + "target": "npm:next", + "type": "static" + } + ], + "create-nx-plugin": [ + { + "source": "create-nx-plugin", + "target": "nx-plugin", + "type": "implicit" + }, + { + "source": "create-nx-plugin", + "target": "devkit", + "type": "static" + }, + { + "source": "create-nx-plugin", + "target": "npm:fs-extra", + "type": "static" + }, + { + "source": "create-nx-plugin", + "target": "npm:tmp", + "type": "static" + }, + { + "source": "create-nx-plugin", + "target": "npm:enquirer", + "type": "static" + }, + { + "source": "create-nx-plugin", + "target": "npm:yargs-parser", + "type": "static" + }, + { + "source": "create-nx-plugin", + "target": "nx", + "type": "static" + } + ], + "eslint-plugin-nx": [ + { + "source": "eslint-plugin-nx", + "target": "devkit", + "type": "static" + }, + { + "source": "eslint-plugin-nx", + "target": "workspace", + "type": "static" + }, + { + "source": "eslint-plugin-nx", + "target": "npm:@typescript-eslint/utils", + "type": "static" + }, + { + "source": "eslint-plugin-nx", + "target": "npm:chalk", + "type": "static" + }, + { + "source": "eslint-plugin-nx", + "target": "npm:confusing-browser-globals", + "type": "static" + }, + { + "source": "eslint-plugin-nx", + "target": "npm:semver", + "type": "static" + }, + { + "source": "eslint-plugin-nx", + "target": "npm:@typescript-eslint/parser", + "type": "static" + }, + { + "source": "eslint-plugin-nx", + "target": "npm:eslint-config-prettier", + "type": "static" + }, + { + "source": "eslint-plugin-nx", + "target": "npm:@angular-eslint/eslint-plugin", + "type": "static" + }, + { + "source": "eslint-plugin-nx", + "target": "nx", + "type": "static" + }, + { + "source": "eslint-plugin-nx", + "target": "npm:memfs", + "type": "static" + }, + { + "source": "eslint-plugin-nx", + "target": "npm:jsonc-eslint-parser", + "type": "static" + }, + { + "source": "eslint-plugin-nx", + "target": "npm:typescript", + "type": "static" + } + ], + "nx-dev-feature-analytics": [], + "nx-dev-data-access-menu": [ + { + "source": "nx-dev-data-access-menu", + "target": "nx-dev-models-document", + "type": "static" + }, + { + "source": "nx-dev-data-access-menu", + "target": "nx-dev-models-menu", + "type": "static" + } + ], + "e2e-add-nx-to-monorepo": [ + { + "source": "e2e-add-nx-to-monorepo", + "target": "workspace", + "type": "implicit" + }, + { + "source": "e2e-add-nx-to-monorepo", + "target": "e2e-utils", + "type": "static" + }, + { + "source": "e2e-add-nx-to-monorepo", + "target": "nx", + "type": "static" + } + ], + "e2e-angular-extensions": [ + { + "source": "e2e-angular-extensions", + "target": "angular", + "type": "implicit" + }, + { + "source": "e2e-angular-extensions", + "target": "e2e-utils", + "type": "static" + }, + { + "source": "e2e-angular-extensions", + "target": "devkit", + "type": "static" + }, + { + "source": "e2e-angular-extensions", + "target": "npm:@angular/core", + "type": "static" + }, + { + "source": "e2e-angular-extensions", + "target": "npm:@angular/common", + "type": "static" + }, + { + "source": "e2e-angular-extensions", + "target": "npm:cypress", + "type": "static" + }, + { + "source": "e2e-angular-extensions", + "target": "workspace", + "type": "static" + }, + { + "source": "e2e-angular-extensions", + "target": "cypress", + "type": "static" + } + ], + "nx-dev-models-document": [], + "nx-dev-ui-sponsor-card": [ + { + "source": "nx-dev-ui-sponsor-card", + "target": "npm:@testing-library/react", + "type": "static" + }, + { + "source": "nx-dev-ui-sponsor-card", + "target": "npm:next", + "type": "static" + } + ], + "e2e-storybook-angular": [ + { + "source": "e2e-storybook-angular", + "target": "storybook", + "type": "implicit" + }, + { + "source": "e2e-storybook-angular", + "target": "e2e-utils", + "type": "static" + }, + { + "source": "e2e-storybook-angular", + "target": "npm:react", + "type": "static" + }, + { + "source": "e2e-storybook-angular", + "target": "npm:@storybook/react", + "type": "static" + }, + { + "source": "e2e-storybook-angular", + "target": "npm:@storybook/angular", + "type": "static" + }, + { + "source": "e2e-storybook-angular", + "target": "npm:@angular/core", + "type": "static" + } + ], + "nx-dev-feature-search": [ + { + "source": "nx-dev-feature-search", + "target": "npm:@docsearch/react", + "type": "static" + }, + { + "source": "nx-dev-feature-search", + "target": "npm:@heroicons/react", + "type": "static" + }, + { + "source": "nx-dev-feature-search", + "target": "npm:next", + "type": "static" + }, + { + "source": "nx-dev-feature-search", + "target": "npm:react", + "type": "static" + }, + { + "source": "nx-dev-feature-search", + "target": "npm:react-dom", + "type": "static" + } + ], + "nx-dev-models-package": [], + "nx-dev-ui-member-card": [ + { + "source": "nx-dev-ui-member-card", + "target": "npm:@testing-library/react", + "type": "static" + }, + { + "source": "nx-dev-ui-member-card", + "target": "npm:next", + "type": "static" + } + ], + "react-native": [ + { + "source": "react-native", + "target": "detox", + "type": "static" + }, + { + "source": "react-native", + "target": "devkit", + "type": "static" + }, + { + "source": "react-native", + "target": "jest", + "type": "static" + }, + { + "source": "react-native", + "target": "linter", + "type": "static" + }, + { + "source": "react-native", + "target": "react", + "type": "static" + }, + { + "source": "react-native", + "target": "storybook", + "type": "static" + }, + { + "source": "react-native", + "target": "workspace", + "type": "static" + }, + { + "source": "react-native", + "target": "npm:chalk", + "type": "static" + }, + { + "source": "react-native", + "target": "npm:enhanced-resolve", + "type": "static" + }, + { + "source": "react-native", + "target": "npm:fs-extra", + "type": "static" + }, + { + "source": "react-native", + "target": "npm:ignore", + "type": "static" + }, + { + "source": "react-native", + "target": "npm:metro-resolver", + "type": "static" + }, + { + "source": "react-native", + "target": "npm:minimatch", + "type": "static" + }, + { + "source": "react-native", + "target": "npm:node-fetch", + "type": "static" + }, + { + "source": "react-native", + "target": "npm:tsconfig-paths", + "type": "static" + }, + { + "source": "react-native", + "target": "npm:react", + "type": "static" + }, + { + "source": "react-native", + "target": "npm:@storybook/addon-actions", + "type": "static" + }, + { + "source": "react-native", + "target": "npm:typescript", + "type": "static" + }, + { + "source": "react-native", + "target": "nx", + "type": "static" + }, + { + "source": "react-native", + "target": "npm:@jest/globals", + "type": "static" + }, + { + "source": "react-native", + "target": "npm:eslint", + "type": "static" + }, + { + "source": "react-native", + "target": "npm:prettier", + "type": "static" + } + ], + "e2e-workspace-create": [ + { + "source": "e2e-workspace-create", + "target": "create-nx-workspace", + "type": "implicit" + }, + { + "source": "e2e-workspace-create", + "target": "e2e-utils", + "type": "static" + }, + { + "source": "e2e-workspace-create", + "target": "npm:fs-extra", + "type": "static" + } + ], + "nx-dev-ui-conference": [ + { + "source": "nx-dev-ui-conference", + "target": "nx-dev-ui-member-card", + "type": "static" + }, + { + "source": "nx-dev-ui-conference", + "target": "nx-dev-ui-sponsor-card", + "type": "static" + }, + { + "source": "nx-dev-ui-conference", + "target": "npm:classnames", + "type": "static" + } + ], + "nx-dev-ui-references": [ + { + "source": "nx-dev-ui-references", + "target": "npm:classnames", + "type": "static" + }, + { + "source": "nx-dev-ui-references", + "target": "npm:@heroicons/react", + "type": "static" + }, + { + "source": "nx-dev-ui-references", + "target": "nx-dev-models-menu", + "type": "static" + } + ], + "nx-dev-ui-community": [ + { + "source": "nx-dev-ui-community", + "target": "npm:@heroicons/react", + "type": "static" + }, + { + "source": "nx-dev-ui-community", + "target": "npm:next", + "type": "static" + }, + { + "source": "nx-dev-ui-community", + "target": "nx-dev-ui-common", + "type": "static" + }, + { + "source": "nx-dev-ui-community", + "target": "npm:react", + "type": "static" + } + ], + "nx-dev-models-menu": [ + { + "source": "nx-dev-models-menu", + "target": "nx-dev-models-document", + "type": "static" + } + ], + "nx-dev-ui-commands": [ + { + "source": "nx-dev-ui-commands", + "target": "npm:react", + "type": "static" + }, + { + "source": "nx-dev-ui-commands", + "target": "npm:react-copy-to-clipboard", + "type": "static" + }, + { + "source": "nx-dev-ui-commands", + "target": "npm:react-syntax-highlighter", + "type": "static" + } + ], + "cra-to-nx": [ + { + "source": "cra-to-nx", + "target": "npm:fs-extra", + "type": "static" + }, + { + "source": "cra-to-nx", + "target": "npm:glob", + "type": "static" + }, + { + "source": "cra-to-nx", + "target": "nx", + "type": "static" + }, + { + "source": "cra-to-nx", + "target": "npm:tslib", + "type": "static" + }, + { + "source": "cra-to-nx", + "target": "npm:yargs", + "type": "static" + }, + { + "source": "cra-to-nx", + "target": "npm:vite", + "type": "static" + } + ], + "nx-plugin": [ + { + "source": "nx-plugin", + "target": "devkit", + "type": "static" + }, + { + "source": "nx-plugin", + "target": "jest", + "type": "static" + }, + { + "source": "nx-plugin", + "target": "js", + "type": "static" + }, + { + "source": "nx-plugin", + "target": "linter", + "type": "static" + }, + { + "source": "nx-plugin", + "target": "npm:dotenv", + "type": "static" + }, + { + "source": "nx-plugin", + "target": "npm:fs-extra", + "type": "static" + }, + { + "source": "nx-plugin", + "target": "npm:tslib", + "type": "static" + }, + { + "source": "nx-plugin", + "target": "workspace", + "type": "static" + }, + { + "source": "nx-plugin", + "target": "nx", + "type": "static" + }, + { + "source": "nx-plugin", + "target": "npm:eslint", + "type": "static" + }, + { + "source": "nx-plugin", + "target": "npm:@nrwl/linter", + "type": "static" + } + ], + "storybook": [ + { + "source": "storybook", + "target": "cypress", + "type": "static" + }, + { + "source": "storybook", + "target": "devkit", + "type": "static" + }, + { + "source": "storybook", + "target": "linter", + "type": "static" + }, + { + "source": "storybook", + "target": "workspace", + "type": "static" + }, + { + "source": "storybook", + "target": "npm:dotenv", + "type": "static" + }, + { + "source": "storybook", + "target": "npm:semver", + "type": "static" + }, + { + "source": "storybook", + "target": "npm:@storybook/core-server", + "type": "static" + }, + { + "source": "storybook", + "target": "npm:memfs", + "type": "static" + }, + { + "source": "storybook", + "target": "npm:fs-extra", + "type": "static" + }, + { + "source": "storybook", + "target": "npm:typescript", + "type": "static" + }, + { + "source": "storybook", + "target": "npm:@storybook/core-common", + "type": "static" + }, + { + "source": "storybook", + "target": "npm:@angular-devkit/schematics", + "type": "static" + }, + { + "source": "storybook", + "target": "npm:@angular/core", + "type": "static" + } + ], + "workspace": [ + { + "source": "workspace", + "target": "devkit", + "type": "static" + }, + { + "source": "workspace", + "target": "nx", + "type": "static" + }, + { + "source": "workspace", + "target": "npm:@parcel/watcher", + "type": "static" + }, + { + "source": "workspace", + "target": "npm:chalk", + "type": "static" + }, + { + "source": "workspace", + "target": "npm:chokidar", + "type": "static" + }, + { + "source": "workspace", + "target": "npm:cli-cursor", + "type": "static" + }, + { + "source": "workspace", + "target": "npm:cli-spinners", + "type": "static" + }, + { + "source": "workspace", + "target": "npm:dotenv", + "type": "static" + }, + { + "source": "workspace", + "target": "npm:enquirer", + "type": "static" + }, + { + "source": "workspace", + "target": "npm:figures", + "type": "static" + }, + { + "source": "workspace", + "target": "npm:flat", + "type": "static" + }, + { + "source": "workspace", + "target": "npm:fs-extra", + "type": "static" + }, + { + "source": "workspace", + "target": "npm:glob", + "type": "static" + }, + { + "source": "workspace", + "target": "npm:ignore", + "type": "static" + }, + { + "source": "workspace", + "target": "npm:minimatch", + "type": "static" + }, + { + "source": "workspace", + "target": "npm:npm-run-path", + "type": "static" + }, + { + "source": "workspace", + "target": "npm:open", + "type": "static" + }, + { + "source": "workspace", + "target": "npm:rxjs", + "type": "static" + }, + { + "source": "workspace", + "target": "npm:semver", + "type": "static" + }, + { + "source": "workspace", + "target": "npm:tmp", + "type": "static" + }, + { + "source": "workspace", + "target": "npm:tslib", + "type": "static" + }, + { + "source": "workspace", + "target": "npm:yargs", + "type": "static" + }, + { + "source": "workspace", + "target": "npm:yargs-parser", + "type": "static" + }, + { + "source": "workspace", + "target": "npm:prettier", + "type": "static" + }, + { + "source": "workspace", + "target": "npm:typescript", + "type": "static" + }, + { + "source": "workspace", + "target": "npm:@angular/core", + "type": "static" + }, + { + "source": "workspace", + "target": "npm:@angular/common", + "type": "static" + }, + { + "source": "workspace", + "target": "npm:@nestjs/common", + "type": "static" + }, + { + "source": "workspace", + "target": "npm:react", + "type": "static" + }, + { + "source": "workspace", + "target": "npm:@testing-library/react", + "type": "static" + }, + { + "source": "workspace", + "target": "npm:express", + "type": "static" + }, + { + "source": "workspace", + "target": "npm:ajv", + "type": "static" + }, + { + "source": "workspace", + "target": "npm:memfs", + "type": "static" + }, + { + "source": "workspace", + "target": "npm:@angular-devkit/schematics", + "type": "static" + }, + { + "source": "workspace", + "target": "npm:@angular-devkit/core", + "type": "static" + }, + { + "source": "workspace", + "target": "npm:@angular-devkit/architect", + "type": "static" + } + ], + "eslint-rules": [ + { + "source": "eslint-rules", + "target": "npm:@typescript-eslint/utils", + "type": "static" + }, + { + "source": "eslint-rules", + "target": "npm:jsonc-eslint-parser", + "type": "static" + } + ], + "nx-dev-e2e": [ + { + "source": "nx-dev-e2e", + "target": "nx-dev", + "type": "implicit" + }, + { + "source": "nx-dev-e2e", + "target": "npm:cypress", + "type": "static" + }, + { + "source": "nx-dev-e2e", + "target": "cypress", + "type": "static" + } + ], + "nx-dev-ui-markdoc": [ + { + "source": "nx-dev-ui-markdoc", + "target": "npm:@markdoc/markdoc", + "type": "static" + }, + { + "source": "nx-dev-ui-markdoc", + "target": "nx-dev-models-document", + "type": "static" + }, + { + "source": "nx-dev-ui-markdoc", + "target": "npm:react", + "type": "static" + }, + { + "source": "nx-dev-ui-markdoc", + "target": "npm:@heroicons/react", + "type": "static" + }, + { + "source": "nx-dev-ui-markdoc", + "target": "npm:react-copy-to-clipboard", + "type": "static" + }, + { + "source": "nx-dev-ui-markdoc", + "target": "npm:react-syntax-highlighter", + "type": "static" + }, + { + "source": "nx-dev-ui-markdoc", + "target": "npm:next", + "type": "static" + }, + { + "source": "nx-dev-ui-markdoc", + "target": "npm:classnames", + "type": "static" + }, + { + "source": "nx-dev-ui-markdoc", + "target": "nx-dev-ui-theme", + "type": "static" + }, + { + "source": "nx-dev-ui-markdoc", + "target": "graph-ui-graph", + "type": "static" + } + ], + "e2e-angular-core": [ + { + "source": "e2e-angular-core", + "target": "angular", + "type": "implicit" + }, + { + "source": "e2e-angular-core", + "target": "e2e-utils", + "type": "static" + }, + { + "source": "e2e-angular-core", + "target": "npm:@angular/core", + "type": "static" + }, + { + "source": "e2e-angular-core", + "target": "nx", + "type": "static" + }, + { + "source": "e2e-angular-core", + "target": "devkit", + "type": "static" + } + ], + "e2e-react-native": [ + { + "source": "e2e-react-native", + "target": "react-native", + "type": "implicit" + }, + { + "source": "e2e-react-native", + "target": "e2e-utils", + "type": "static" + } + ], + "e2e-graph-client": [ + { + "source": "e2e-graph-client", + "target": "graph-client", + "type": "implicit" + }, + { + "source": "e2e-graph-client", + "target": "npm:cypress", + "type": "static" + }, + { + "source": "e2e-graph-client", + "target": "cypress", + "type": "static" + } + ], + "nx-dev-ui-common": [ + { + "source": "nx-dev-ui-common", + "target": "npm:next", + "type": "static" + }, + { + "source": "nx-dev-ui-common", + "target": "npm:@heroicons/react", + "type": "static" + }, + { + "source": "nx-dev-ui-common", + "target": "npm:classnames", + "type": "static" + }, + { + "source": "nx-dev-ui-common", + "target": "nx-dev-feature-search", + "type": "static" + }, + { + "source": "nx-dev-ui-common", + "target": "nx-dev-ui-theme", + "type": "static" + }, + { + "source": "nx-dev-ui-common", + "target": "npm:@headlessui/react", + "type": "static" + }, + { + "source": "nx-dev-ui-common", + "target": "npm:react", + "type": "static" + }, + { + "source": "nx-dev-ui-common", + "target": "nx-dev-models-menu", + "type": "static" + } + ], + "angular": [ + { + "source": "angular", + "target": "workspace", + "type": "implicit" + }, + { + "source": "angular", + "target": "cypress", + "type": "implicit" + }, + { + "source": "angular", + "target": "jest", + "type": "implicit" + }, + { + "source": "angular", + "target": "npm:@angular-devkit/schematics", + "type": "static" + }, + { + "source": "angular", + "target": "devkit", + "type": "static" + }, + { + "source": "angular", + "target": "linter", + "type": "static" + }, + { + "source": "angular", + "target": "storybook", + "type": "static" + }, + { + "source": "angular", + "target": "webpack", + "type": "static" + }, + { + "source": "angular", + "target": "npm:@phenomnomnominal/tsquery", + "type": "static" + }, + { + "source": "angular", + "target": "npm:@schematics/angular", + "type": "static" + }, + { + "source": "angular", + "target": "npm:chalk", + "type": "static" + }, + { + "source": "angular", + "target": "npm:chokidar", + "type": "static" + }, + { + "source": "angular", + "target": "npm:http-server", + "type": "static" + }, + { + "source": "angular", + "target": "npm:ignore", + "type": "static" + }, + { + "source": "angular", + "target": "npm:magic-string", + "type": "static" + }, + { + "source": "angular", + "target": "npm:minimatch", + "type": "static" + }, + { + "source": "angular", + "target": "npm:semver", + "type": "static" + }, + { + "source": "angular", + "target": "npm:ts-node", + "type": "static" + }, + { + "source": "angular", + "target": "npm:tsconfig-paths", + "type": "static" + }, + { + "source": "angular", + "target": "npm:webpack", + "type": "static" + }, + { + "source": "angular", + "target": "npm:webpack-merge", + "type": "static" + }, + { + "source": "angular", + "target": "nx", + "type": "static" + }, + { + "source": "angular", + "target": "npm:rxjs", + "type": "static" + }, + { + "source": "angular", + "target": "npm:@angular-devkit/architect", + "type": "static" + }, + { + "source": "angular", + "target": "npm:@angular-devkit/core", + "type": "static" + }, + { + "source": "angular", + "target": "npm:@angular-devkit/build-angular", + "type": "static" + }, + { + "source": "angular", + "target": "npm:injection-js", + "type": "static" + }, + { + "source": "angular", + "target": "npm:ng-packagr", + "type": "static" + }, + { + "source": "angular", + "target": "npm:typescript", + "type": "static" + }, + { + "source": "angular", + "target": "npm:@angular/compiler", + "type": "static" + }, + { + "source": "angular", + "target": "npm:find-cache-dir", + "type": "static" + }, + { + "source": "angular", + "target": "npm:@angular/compiler-cli", + "type": "static" + }, + { + "source": "angular", + "target": "npm:browserslist", + "type": "static" + }, + { + "source": "angular", + "target": "npm:postcss-preset-env", + "type": "static" + }, + { + "source": "angular", + "target": "npm:postcss-url", + "type": "static" + }, + { + "source": "angular", + "target": "npm:postcss", + "type": "static" + }, + { + "source": "angular", + "target": "npm:sass", + "type": "static" + }, + { + "source": "angular", + "target": "npm:less", + "type": "static" + }, + { + "source": "angular", + "target": "npm:stylus", + "type": "static" + }, + { + "source": "angular", + "target": "npm:ora", + "type": "static" + }, + { + "source": "angular", + "target": "npm:postcss-import", + "type": "static" + }, + { + "source": "angular", + "target": "npm:@angular/core", + "type": "static" + }, + { + "source": "angular", + "target": "npm:eslint", + "type": "static" + }, + { + "source": "angular", + "target": "npm:@angular/router", + "type": "static" + }, + { + "source": "angular", + "target": "npm:@angular/common", + "type": "static" + }, + { + "source": "angular", + "target": "npm:cypress", + "type": "static" + }, + { + "source": "angular", + "target": "npm:@storybook/core", + "type": "static" + }, + { + "source": "angular", + "target": "npm:@ngrx/router-store", + "type": "static" + }, + { + "source": "angular", + "target": "npm:@ngrx/store", + "type": "static" + } + ], + "cypress": [ + { + "source": "cypress", + "target": "npm:@babel/core", + "type": "static" + }, + { + "source": "cypress", + "target": "npm:@babel/preset-env", + "type": "static" + }, + { + "source": "cypress", + "target": "npm:@cypress/webpack-preprocessor", + "type": "static" + }, + { + "source": "cypress", + "target": "devkit", + "type": "static" + }, + { + "source": "cypress", + "target": "linter", + "type": "static" + }, + { + "source": "cypress", + "target": "workspace", + "type": "static" + }, + { + "source": "cypress", + "target": "npm:@phenomnomnominal/tsquery", + "type": "static" + }, + { + "source": "cypress", + "target": "npm:babel-loader", + "type": "static" + }, + { + "source": "cypress", + "target": "npm:chalk", + "type": "static" + }, + { + "source": "cypress", + "target": "npm:dotenv", + "type": "static" + }, + { + "source": "cypress", + "target": "npm:fork-ts-checker-webpack-plugin", + "type": "static" + }, + { + "source": "cypress", + "target": "npm:semver", + "type": "static" + }, + { + "source": "cypress", + "target": "npm:ts-loader", + "type": "static" + }, + { + "source": "cypress", + "target": "npm:tsconfig-paths-webpack-plugin", + "type": "static" + }, + { + "source": "cypress", + "target": "npm:tslib", + "type": "static" + }, + { + "source": "cypress", + "target": "npm:webpack", + "type": "static" + }, + { + "source": "cypress", + "target": "npm:webpack-node-externals", + "type": "static" + }, + { + "source": "cypress", + "target": "npm:cypress", + "type": "static" + }, + { + "source": "cypress", + "target": "nx", + "type": "static" + }, + { + "source": "cypress", + "target": "npm:eslint", + "type": "static" + }, + { + "source": "cypress", + "target": "npm:typescript", + "type": "static" + }, + { + "source": "cypress", + "target": "npm:react-dom", + "type": "static" + }, + { + "source": "cypress", + "target": "npm:jest-mock", + "type": "static" + }, + { + "source": "cypress", + "target": "npm:@angular-devkit/schematics", + "type": "static" + } + ], + "esbuild": [ + { + "source": "esbuild", + "target": "devkit", + "type": "static" + }, + { + "source": "esbuild", + "target": "js", + "type": "static" + }, + { + "source": "esbuild", + "target": "workspace", + "type": "static" + }, + { + "source": "esbuild", + "target": "npm:chalk", + "type": "static" + }, + { + "source": "esbuild", + "target": "npm:dotenv", + "type": "static" + }, + { + "source": "esbuild", + "target": "npm:fs-extra", + "type": "static" + }, + { + "source": "esbuild", + "target": "npm:tslib", + "type": "static" + }, + { + "source": "esbuild", + "target": "npm:esbuild", + "type": "static" + }, + { + "source": "esbuild", + "target": "nx", + "type": "static" + } + ], + "express": [ + { + "source": "express", + "target": "node", + "type": "implicit" + }, + { + "source": "express", + "target": "devkit", + "type": "static" + }, + { + "source": "express", + "target": "workspace", + "type": "static" + }, + { + "source": "express", + "target": "npm:express", + "type": "static" + }, + { + "source": "express", + "target": "linter", + "type": "static" + } + ], + "webpack": [ + { + "source": "webpack", + "target": "devkit", + "type": "static" + }, + { + "source": "webpack", + "target": "js", + "type": "static" + }, + { + "source": "webpack", + "target": "workspace", + "type": "static" + }, + { + "source": "webpack", + "target": "npm:autoprefixer", + "type": "static" + }, + { + "source": "webpack", + "target": "npm:babel-loader", + "type": "static" + }, + { + "source": "webpack", + "target": "npm:browserslist", + "type": "static" + }, + { + "source": "webpack", + "target": "npm:caniuse-lite", + "type": "static" + }, + { + "source": "webpack", + "target": "npm:chalk", + "type": "static" + }, + { + "source": "webpack", + "target": "npm:chokidar", + "type": "static" + }, + { + "source": "webpack", + "target": "npm:copy-webpack-plugin", + "type": "static" + }, + { + "source": "webpack", + "target": "npm:css-loader", + "type": "static" + }, + { + "source": "webpack", + "target": "npm:css-minimizer-webpack-plugin", + "type": "static" + }, + { + "source": "webpack", + "target": "npm:dotenv", + "type": "static" + }, + { + "source": "webpack", + "target": "npm:file-loader", + "type": "static" + }, + { + "source": "webpack", + "target": "npm:fork-ts-checker-webpack-plugin", + "type": "static" + }, + { + "source": "webpack", + "target": "npm:fs-extra", + "type": "static" + }, + { + "source": "webpack", + "target": "npm:ignore", + "type": "static" + }, + { + "source": "webpack", + "target": "npm:less", + "type": "static" + }, + { + "source": "webpack", + "target": "npm:less-loader", + "type": "static" + }, + { + "source": "webpack", + "target": "npm:license-webpack-plugin", + "type": "static" + }, + { + "source": "webpack", + "target": "npm:loader-utils", + "type": "static" + }, + { + "source": "webpack", + "target": "npm:mini-css-extract-plugin", + "type": "static" + }, + { + "source": "webpack", + "target": "npm:parse5", + "type": "static" + }, + { + "source": "webpack", + "target": "npm:parse5-html-rewriting-stream", + "type": "static" + }, + { + "source": "webpack", + "target": "npm:postcss", + "type": "static" + }, + { + "source": "webpack", + "target": "npm:postcss-import", + "type": "static" + }, + { + "source": "webpack", + "target": "npm:postcss-loader", + "type": "static" + }, + { + "source": "webpack", + "target": "npm:raw-loader", + "type": "static" + }, + { + "source": "webpack", + "target": "npm:rxjs", + "type": "static" + }, + { + "source": "webpack", + "target": "npm:sass", + "type": "static" + }, + { + "source": "webpack", + "target": "npm:sass-loader", + "type": "static" + }, + { + "source": "webpack", + "target": "npm:source-map-loader", + "type": "static" + }, + { + "source": "webpack", + "target": "npm:style-loader", + "type": "static" + }, + { + "source": "webpack", + "target": "npm:stylus", + "type": "static" + }, + { + "source": "webpack", + "target": "npm:stylus-loader", + "type": "static" + }, + { + "source": "webpack", + "target": "npm:terser-webpack-plugin", + "type": "static" + }, + { + "source": "webpack", + "target": "npm:ts-loader", + "type": "static" + }, + { + "source": "webpack", + "target": "npm:ts-node", + "type": "static" + }, + { + "source": "webpack", + "target": "npm:tsconfig-paths", + "type": "static" + }, + { + "source": "webpack", + "target": "npm:tsconfig-paths-webpack-plugin", + "type": "static" + }, + { + "source": "webpack", + "target": "npm:tslib", + "type": "static" + }, + { + "source": "webpack", + "target": "npm:webpack", + "type": "static" + }, + { + "source": "webpack", + "target": "npm:webpack-dev-server", + "type": "static" + }, + { + "source": "webpack", + "target": "npm:webpack-merge", + "type": "static" + }, + { + "source": "webpack", + "target": "npm:webpack-node-externals", + "type": "static" + }, + { + "source": "webpack", + "target": "npm:webpack-sources", + "type": "static" + }, + { + "source": "webpack", + "target": "npm:webpack-subresource-integrity", + "type": "static" + }, + { + "source": "webpack", + "target": "npm:typescript", + "type": "static" + }, + { + "source": "webpack", + "target": "nx", + "type": "static" + }, + { + "source": "webpack", + "target": "npm:memfs", + "type": "static" + }, + { + "source": "webpack", + "target": "npm:url", + "type": "static" + } + ], + "nx-dev-ui-theme": [ + { + "source": "nx-dev-ui-theme", + "target": "npm:@headlessui/react", + "type": "static" + }, + { + "source": "nx-dev-ui-theme", + "target": "npm:@heroicons/react", + "type": "static" + }, + { + "source": "nx-dev-ui-theme", + "target": "npm:classnames", + "type": "static" + }, + { + "source": "nx-dev-ui-theme", + "target": "npm:react", + "type": "static" + } + ], + "devkit": [ + { + "source": "devkit", + "target": "nx", + "type": "static" + }, + { + "source": "devkit", + "target": "npm:ejs", + "type": "static" + }, + { + "source": "devkit", + "target": "npm:ignore", + "type": "static" + }, + { + "source": "devkit", + "target": "npm:tslib", + "type": "static" + }, + { + "source": "devkit", + "target": "npm:@phenomnomnominal/tsquery", + "type": "static" + }, + { + "source": "devkit", + "target": "npm:semver", + "type": "static" + }, + { + "source": "devkit", + "target": "npm:prettier", + "type": "static" + }, + { + "source": "devkit", + "target": "npm:file-type", + "type": "static" + }, + { + "source": "devkit", + "target": "npm:typescript", + "type": "static" + }, + { + "source": "devkit", + "target": "npm:rxjs", + "type": "static" + }, + { + "source": "devkit", + "target": "npm:@angular-devkit/architect", + "type": "static" + }, + { + "source": "devkit", + "target": "npm:webpack", + "type": "static" + } + ], + "linter": [ + { + "source": "linter", + "target": "eslint-plugin-nx", + "type": "implicit" + }, + { + "source": "linter", + "target": "devkit", + "type": "static" + }, + { + "source": "linter", + "target": "jest", + "type": "static" + }, + { + "source": "linter", + "target": "npm:@phenomnomnominal/tsquery", + "type": "static" + }, + { + "source": "linter", + "target": "nx", + "type": "static" + }, + { + "source": "linter", + "target": "npm:tmp", + "type": "static" + }, + { + "source": "linter", + "target": "npm:tslib", + "type": "static" + }, + { + "source": "linter", + "target": "npm:eslint", + "type": "static" + }, + { + "source": "linter", + "target": "npm:@angular-devkit/core", + "type": "static" + }, + { + "source": "linter", + "target": "workspace", + "type": "static" + }, + { + "source": "linter", + "target": "npm:typescript", + "type": "static" + }, + { + "source": "linter", + "target": "npm:tslint-to-eslint-config", + "type": "static" + }, + { + "source": "linter", + "target": "npm:@typescript-eslint/eslint-plugin", + "type": "static" + }, + { + "source": "linter", + "target": "npm:@angular-devkit/schematics", + "type": "static" + } + ], + "rollup": [ + { + "source": "rollup", + "target": "devkit", + "type": "static" + }, + { + "source": "rollup", + "target": "js", + "type": "static" + }, + { + "source": "rollup", + "target": "workspace", + "type": "static" + }, + { + "source": "rollup", + "target": "npm:@rollup/plugin-babel", + "type": "static" + }, + { + "source": "rollup", + "target": "npm:@rollup/plugin-commonjs", + "type": "static" + }, + { + "source": "rollup", + "target": "npm:@rollup/plugin-image", + "type": "static" + }, + { + "source": "rollup", + "target": "npm:@rollup/plugin-json", + "type": "static" + }, + { + "source": "rollup", + "target": "npm:@rollup/plugin-node-resolve", + "type": "static" + }, + { + "source": "rollup", + "target": "npm:autoprefixer", + "type": "static" + }, + { + "source": "rollup", + "target": "npm:babel-plugin-transform-async-to-promises", + "type": "static" + }, + { + "source": "rollup", + "target": "npm:chalk", + "type": "static" + }, + { + "source": "rollup", + "target": "npm:dotenv", + "type": "static" + }, + { + "source": "rollup", + "target": "npm:fs-extra", + "type": "static" + }, + { + "source": "rollup", + "target": "npm:postcss", + "type": "static" + }, + { + "source": "rollup", + "target": "npm:rollup", + "type": "static" + }, + { + "source": "rollup", + "target": "npm:rollup-plugin-copy", + "type": "static" + }, + { + "source": "rollup", + "target": "npm:rollup-plugin-peer-deps-external", + "type": "static" + }, + { + "source": "rollup", + "target": "npm:rollup-plugin-postcss", + "type": "static" + }, + { + "source": "rollup", + "target": "npm:rollup-plugin-typescript2", + "type": "static" + }, + { + "source": "rollup", + "target": "npm:rxjs", + "type": "static" + }, + { + "source": "rollup", + "target": "npm:tslib", + "type": "static" + }, + { + "source": "rollup", + "target": "npm:@swc/core", + "type": "static" + }, + { + "source": "rollup", + "target": "nx", + "type": "static" + }, + { + "source": "rollup", + "target": "npm:typescript", + "type": "static" + } + ], + "graph-ui-graph": [ + { + "source": "graph-ui-graph", + "target": "npm:@popperjs/core", + "type": "static" + }, + { + "source": "graph-ui-graph", + "target": "npm:cytoscape-dagre", + "type": "static" + }, + { + "source": "graph-ui-graph", + "target": "npm:cytoscape-popper", + "type": "static" + }, + { + "source": "graph-ui-graph", + "target": "npm:@storybook/react", + "type": "static" + }, + { + "source": "graph-ui-graph", + "target": "npm:react", + "type": "static" + }, + { + "source": "graph-ui-graph", + "target": "npm:cytoscape", + "type": "static" + } + ], + "nx-dev-ui-home": [ + { + "source": "nx-dev-ui-home", + "target": "npm:@headlessui/react", + "type": "static" + }, + { + "source": "nx-dev-ui-home", + "target": "npm:classnames", + "type": "static" + }, + { + "source": "nx-dev-ui-home", + "target": "npm:framer-motion", + "type": "static" + }, + { + "source": "nx-dev-ui-home", + "target": "npm:next", + "type": "static" + }, + { + "source": "nx-dev-ui-home", + "target": "npm:react", + "type": "static" + }, + { + "source": "nx-dev-ui-home", + "target": "npm:@heroicons/react", + "type": "static" + }, + { + "source": "nx-dev-ui-home", + "target": "npm:react-copy-to-clipboard", + "type": "static" + }, + { + "source": "nx-dev-ui-home", + "target": "npm:react-intersection-observer", + "type": "static" + }, + { + "source": "nx-dev-ui-home", + "target": "nx-dev-ui-common", + "type": "static" + } + ], + "detox": [ + { + "source": "detox", + "target": "devkit", + "type": "static" + }, + { + "source": "detox", + "target": "jest", + "type": "static" + }, + { + "source": "detox", + "target": "linter", + "type": "static" + }, + { + "source": "detox", + "target": "react", + "type": "static" + }, + { + "source": "detox", + "target": "workspace", + "type": "static" + }, + { + "source": "detox", + "target": "npm:chalk", + "type": "static" + } + ], + "react": [ + { + "source": "react", + "target": "web", + "type": "static" + }, + { + "source": "react", + "target": "npm:@babel/core", + "type": "static" + }, + { + "source": "react", + "target": "npm:@babel/preset-react", + "type": "static" + }, + { + "source": "react", + "target": "cypress", + "type": "static" + }, + { + "source": "react", + "target": "devkit", + "type": "static" + }, + { + "source": "react", + "target": "jest", + "type": "static" + }, + { + "source": "react", + "target": "js", + "type": "static" + }, + { + "source": "react", + "target": "linter", + "type": "static" + }, + { + "source": "react", + "target": "storybook", + "type": "static" + }, + { + "source": "react", + "target": "webpack", + "type": "static" + }, + { + "source": "react", + "target": "workspace", + "type": "static" + }, + { + "source": "react", + "target": "npm:@pmmmwh/react-refresh-webpack-plugin", + "type": "static" + }, + { + "source": "react", + "target": "npm:@phenomnomnominal/tsquery", + "type": "static" + }, + { + "source": "react", + "target": "npm:@svgr/webpack", + "type": "static" + }, + { + "source": "react", + "target": "npm:chalk", + "type": "static" + }, + { + "source": "react", + "target": "npm:css-loader", + "type": "static" + }, + { + "source": "react", + "target": "npm:minimatch", + "type": "static" + }, + { + "source": "react", + "target": "npm:react-refresh", + "type": "static" + }, + { + "source": "react", + "target": "npm:semver", + "type": "static" + }, + { + "source": "react", + "target": "npm:style-loader", + "type": "static" + }, + { + "source": "react", + "target": "npm:stylus", + "type": "static" + }, + { + "source": "react", + "target": "npm:stylus-loader", + "type": "static" + }, + { + "source": "react", + "target": "npm:url-loader", + "type": "static" + }, + { + "source": "react", + "target": "npm:webpack", + "type": "static" + }, + { + "source": "react", + "target": "npm:webpack-merge", + "type": "static" + }, + { + "source": "react", + "target": "npm:rollup", + "type": "static" + }, + { + "source": "react", + "target": "npm:tsconfig-paths-webpack-plugin", + "type": "static" + }, + { + "source": "react", + "target": "npm:sass", + "type": "static" + }, + { + "source": "react", + "target": "npm:react", + "type": "static" + }, + { + "source": "react", + "target": "nx", + "type": "static" + }, + { + "source": "react", + "target": "npm:typescript", + "type": "static" + }, + { + "source": "react", + "target": "npm:@storybook/react", + "type": "static" + }, + { + "source": "react", + "target": "npm:@angular-devkit/schematics", + "type": "static" + }, + { + "source": "react", + "target": "npm:react-dom", + "type": "static" + }, + { + "source": "react", + "target": "npm:react-router-dom", + "type": "static" + }, + { + "source": "react", + "target": "npm:@reduxjs/toolkit", + "type": "static" + }, + { + "source": "react", + "target": "npm:react-redux", + "type": "static" + }, + { + "source": "react", + "target": "npm:prettier", + "type": "static" + }, + { + "source": "react", + "target": "npm:eslint", + "type": "static" + } + ], + "typedoc-theme": [ + { + "source": "typedoc-theme", + "target": "npm:typedoc", + "type": "static" + }, + { + "source": "typedoc-theme", + "target": "npm:typedoc-plugin-markdown", + "type": "static" + } + ], + "e2e-cra-to-nx": [ + { + "source": "e2e-cra-to-nx", + "target": "workspace", + "type": "implicit" + }, + { + "source": "e2e-cra-to-nx", + "target": "e2e-utils", + "type": "static" + }, + { + "source": "e2e-cra-to-nx", + "target": "npm:fs-extra", + "type": "static" + }, + { + "source": "e2e-cra-to-nx", + "target": "npm:glob", + "type": "static" + } + ], + "e2e-nx-plugin": [ + { + "source": "e2e-nx-plugin", + "target": "create-nx-plugin", + "type": "implicit" + }, + { + "source": "e2e-nx-plugin", + "target": "devkit", + "type": "static" + }, + { + "source": "e2e-nx-plugin", + "target": "e2e-utils", + "type": "static" + } + ], + "e2e-storybook": [ + { + "source": "e2e-storybook", + "target": "storybook", + "type": "implicit" + }, + { + "source": "e2e-storybook", + "target": "e2e-utils", + "type": "static" + }, + { + "source": "e2e-storybook", + "target": "npm:react", + "type": "static" + } + ], + "nx-dev": [ + { + "source": "nx-dev", + "target": "docs", + "type": "implicit" + }, + { + "source": "nx-dev", + "target": "jest", + "type": "static" + }, + { + "source": "nx-dev", + "target": "nx-dev-data-access-documents", + "type": "static" + }, + { + "source": "nx-dev", + "target": "nx-dev-data-access-menu", + "type": "static" + }, + { + "source": "nx-dev", + "target": "nx-dev-data-access-packages", + "type": "static" + }, + { + "source": "nx-dev", + "target": "nx-dev-models-document", + "type": "static" + }, + { + "source": "nx-dev", + "target": "npm:next", + "type": "static" + }, + { + "source": "nx-dev", + "target": "npm:react", + "type": "static" + }, + { + "source": "nx-dev", + "target": "npm:fs-extra", + "type": "static" + }, + { + "source": "nx-dev", + "target": "nx-dev-feature-analytics", + "type": "static" + }, + { + "source": "nx-dev", + "target": "npm:next-seo", + "type": "static" + }, + { + "source": "nx-dev", + "target": "nx-dev-feature-package-schema-viewer", + "type": "static" + }, + { + "source": "nx-dev", + "target": "nx-dev-feature-doc-viewer", + "type": "static" + }, + { + "source": "nx-dev", + "target": "nx-dev-models-menu", + "type": "static" + }, + { + "source": "nx-dev", + "target": "nx-dev-models-package", + "type": "static" + }, + { + "source": "nx-dev", + "target": "nx-dev-ui-common", + "type": "static" + }, + { + "source": "nx-dev", + "target": "npm:@heroicons/react", + "type": "static" + }, + { + "source": "nx-dev", + "target": "nx-dev-ui-community", + "type": "static" + }, + { + "source": "nx-dev", + "target": "nx-dev-ui-conference", + "type": "static" + }, + { + "source": "nx-dev", + "target": "nx-dev-ui-home", + "type": "static" + }, + { + "source": "nx-dev", + "target": "nx-dev-ui-references", + "type": "static" + }, + { + "source": "nx-dev", + "target": "npm:@nrwl/next", + "type": "static" + }, + { + "source": "nx-dev", + "target": "npm:@tailwindcss/aspect-ratio", + "type": "static" + }, + { + "source": "nx-dev", + "target": "npm:@tailwindcss/typography", + "type": "static" + }, + { + "source": "nx-dev", + "target": "npm:@tailwindcss/forms", + "type": "static" + }, + { + "source": "nx-dev", + "target": "npm:@tailwindcss/line-clamp", + "type": "static" + } + ], + "expo": [ + { + "source": "expo", + "target": "detox", + "type": "static" + }, + { + "source": "expo", + "target": "devkit", + "type": "static" + }, + { + "source": "expo", + "target": "jest", + "type": "static" + }, + { + "source": "expo", + "target": "linter", + "type": "static" + }, + { + "source": "expo", + "target": "react", + "type": "static" + }, + { + "source": "expo", + "target": "webpack", + "type": "static" + }, + { + "source": "expo", + "target": "workspace", + "type": "static" + }, + { + "source": "expo", + "target": "npm:@svgr/webpack", + "type": "static" + }, + { + "source": "expo", + "target": "npm:chalk", + "type": "static" + }, + { + "source": "expo", + "target": "npm:enhanced-resolve", + "type": "static" + }, + { + "source": "expo", + "target": "npm:fs-extra", + "type": "static" + }, + { + "source": "expo", + "target": "npm:metro-resolver", + "type": "static" + }, + { + "source": "expo", + "target": "npm:node-fetch", + "type": "static" + }, + { + "source": "expo", + "target": "npm:tar-fs", + "type": "static" + }, + { + "source": "expo", + "target": "npm:tsconfig-paths", + "type": "static" + }, + { + "source": "expo", + "target": "npm:tsconfig-paths-webpack-plugin", + "type": "static" + }, + { + "source": "expo", + "target": "npm:util", + "type": "static" + }, + { + "source": "expo", + "target": "npm:yargs", + "type": "static" + }, + { + "source": "expo", + "target": "npm:typescript", + "type": "static" + }, + { + "source": "expo", + "target": "npm:eslint", + "type": "static" + }, + { + "source": "expo", + "target": "npm:react", + "type": "static" + } + ], + "jest": [ + { + "source": "jest", + "target": "npm:@jest/reporters", + "type": "static" + }, + { + "source": "jest", + "target": "npm:@jest/test-result", + "type": "static" + }, + { + "source": "jest", + "target": "devkit", + "type": "static" + }, + { + "source": "jest", + "target": "npm:@phenomnomnominal/tsquery", + "type": "static" + }, + { + "source": "jest", + "target": "npm:chalk", + "type": "static" + }, + { + "source": "jest", + "target": "npm:dotenv", + "type": "static" + }, + { + "source": "jest", + "target": "npm:identity-obj-proxy", + "type": "static" + }, + { + "source": "jest", + "target": "npm:jest-config", + "type": "static" + }, + { + "source": "jest", + "target": "npm:jest-resolve", + "type": "static" + }, + { + "source": "jest", + "target": "npm:jest-util", + "type": "static" + }, + { + "source": "jest", + "target": "npm:resolve.exports", + "type": "static" + }, + { + "source": "jest", + "target": "npm:tslib", + "type": "static" + }, + { + "source": "jest", + "target": "npm:jest", + "type": "static" + }, + { + "source": "jest", + "target": "npm:@jest/types", + "type": "static" + }, + { + "source": "jest", + "target": "workspace", + "type": "static" + }, + { + "source": "jest", + "target": "npm:prettier", + "type": "static" + }, + { + "source": "jest", + "target": "npm:typescript", + "type": "static" + }, + { + "source": "jest", + "target": "nx", + "type": "static" + }, + { + "source": "jest", + "target": "npm:expect", + "type": "static" + }, + { + "source": "jest", + "target": "npm:@angular-devkit/schematics", + "type": "static" + } + ], + "nest": [ + { + "source": "nest", + "target": "node", + "type": "implicit" + }, + { + "source": "nest", + "target": "linter", + "type": "implicit" + }, + { + "source": "nest", + "target": "npm:@nestjs/schematics", + "type": "static" + }, + { + "source": "nest", + "target": "devkit", + "type": "static" + }, + { + "source": "nest", + "target": "js", + "type": "static" + }, + { + "source": "nest", + "target": "npm:enquirer", + "type": "static" + }, + { + "source": "nest", + "target": "workspace", + "type": "static" + }, + { + "source": "nest", + "target": "npm:eslint", + "type": "static" + }, + { + "source": "nest", + "target": "npm:typescript", + "type": "static" + }, + { + "source": "nest", + "target": "npm:semver", + "type": "static" + } + ], + "next": [ + { + "source": "next", + "target": "npm:@babel/plugin-proposal-decorators", + "type": "static" + }, + { + "source": "next", + "target": "cypress", + "type": "static" + }, + { + "source": "next", + "target": "devkit", + "type": "static" + }, + { + "source": "next", + "target": "jest", + "type": "static" + }, + { + "source": "next", + "target": "linter", + "type": "static" + }, + { + "source": "next", + "target": "react", + "type": "static" + }, + { + "source": "next", + "target": "webpack", + "type": "static" + }, + { + "source": "next", + "target": "workspace", + "type": "static" + }, + { + "source": "next", + "target": "npm:@svgr/webpack", + "type": "static" + }, + { + "source": "next", + "target": "npm:chalk", + "type": "static" + }, + { + "source": "next", + "target": "npm:dotenv", + "type": "static" + }, + { + "source": "next", + "target": "npm:fs-extra", + "type": "static" + }, + { + "source": "next", + "target": "npm:ignore", + "type": "static" + }, + { + "source": "next", + "target": "npm:semver", + "type": "static" + }, + { + "source": "next", + "target": "npm:ts-node", + "type": "static" + }, + { + "source": "next", + "target": "npm:tsconfig-paths", + "type": "static" + }, + { + "source": "next", + "target": "npm:url-loader", + "type": "static" + }, + { + "source": "next", + "target": "npm:webpack-merge", + "type": "static" + }, + { + "source": "next", + "target": "npm:next", + "type": "static" + }, + { + "source": "next", + "target": "npm:@nrwl/next", + "type": "static" + }, + { + "source": "next", + "target": "npm:typescript", + "type": "static" + }, + { + "source": "next", + "target": "npm:express", + "type": "static" + }, + { + "source": "next", + "target": "npm:http-proxy-middleware", + "type": "static" + }, + { + "source": "next", + "target": "nx", + "type": "static" + }, + { + "source": "next", + "target": "npm:tsconfig-paths-webpack-plugin", + "type": "static" + }, + { + "source": "next", + "target": "npm:memfs", + "type": "static" + }, + { + "source": "next", + "target": "npm:webpack", + "type": "static" + }, + { + "source": "next", + "target": "npm:react", + "type": "static" + } + ], + "node": [ + { + "source": "node", + "target": "devkit", + "type": "static" + }, + { + "source": "node", + "target": "jest", + "type": "static" + }, + { + "source": "node", + "target": "js", + "type": "static" + }, + { + "source": "node", + "target": "linter", + "type": "static" + }, + { + "source": "node", + "target": "webpack", + "type": "static" + }, + { + "source": "node", + "target": "workspace", + "type": "static" + }, + { + "source": "node", + "target": "npm:chalk", + "type": "static" + }, + { + "source": "node", + "target": "npm:tslib", + "type": "static" + }, + { + "source": "node", + "target": "nx", + "type": "static" + } + ], + "vite": [ + { + "source": "vite", + "target": "devkit", + "type": "static" + }, + { + "source": "vite", + "target": "workspace", + "type": "static" + }, + { + "source": "vite", + "target": "js", + "type": "static" + }, + { + "source": "vite", + "target": "npm:@swc/helpers", + "type": "static" + }, + { + "source": "vite", + "target": "npm:chalk", + "type": "static" + }, + { + "source": "vite", + "target": "npm:dotenv", + "type": "static" + }, + { + "source": "vite", + "target": "npm:vite", + "type": "static" + }, + { + "source": "vite", + "target": "npm:vitest", + "type": "static" + } + ], + "graph-client": [ + { + "source": "graph-client", + "target": "npm:react-router-dom", + "type": "static" + }, + { + "source": "graph-client", + "target": "npm:@xstate/react", + "type": "static" + }, + { + "source": "graph-client", + "target": "npm:@xstate/immer", + "type": "static" + }, + { + "source": "graph-client", + "target": "npm:xstate", + "type": "static" + }, + { + "source": "graph-client", + "target": "npm:@storybook/react", + "type": "static" + }, + { + "source": "graph-client", + "target": "npm:react", + "type": "static" + }, + { + "source": "graph-client", + "target": "npm:@heroicons/react", + "type": "static" + }, + { + "source": "graph-client", + "target": "npm:@headlessui/react", + "type": "static" + }, + { + "source": "graph-client", + "target": "npm:classnames", + "type": "static" + }, + { + "source": "graph-client", + "target": "graph-ui-graph", + "type": "static" + }, + { + "source": "graph-client", + "target": "npm:history", + "type": "static" + }, + { + "source": "graph-client", + "target": "npm:@tippyjs/react", + "type": "static" + }, + { + "source": "graph-client", + "target": "npm:use-sync-external-store", + "type": "static" + }, + { + "source": "graph-client", + "target": "npm:@popperjs/core", + "type": "static" + }, + { + "source": "graph-client", + "target": "npm:react-dom", + "type": "static" + }, + { + "source": "graph-client", + "target": "npm:@xstate/inspect", + "type": "static" + }, + { + "source": "graph-client", + "target": "npm:core-js", + "type": "static" + }, + { + "source": "graph-client", + "target": "npm:regenerator-runtime", + "type": "static" + }, + { + "source": "graph-client", + "target": "npm:@tailwindcss/typography", + "type": "static" + } + ], + "cli": [ + { + "source": "cli", + "target": "workspace", + "type": "implicit" + }, + { + "source": "cli", + "target": "nx", + "type": "static" + } + ], + "tao": [ + { + "source": "tao", + "target": "nx", + "type": "static" + } + ], + "web": [ + { + "source": "web", + "target": "npm:@babel/core", + "type": "static" + }, + { + "source": "web", + "target": "npm:@babel/plugin-proposal-class-properties", + "type": "static" + }, + { + "source": "web", + "target": "npm:@babel/plugin-proposal-decorators", + "type": "static" + }, + { + "source": "web", + "target": "npm:@babel/plugin-transform-runtime", + "type": "static" + }, + { + "source": "web", + "target": "npm:@babel/preset-env", + "type": "static" + }, + { + "source": "web", + "target": "npm:@babel/preset-typescript", + "type": "static" + }, + { + "source": "web", + "target": "npm:@babel/runtime", + "type": "static" + }, + { + "source": "web", + "target": "cypress", + "type": "static" + }, + { + "source": "web", + "target": "devkit", + "type": "static" + }, + { + "source": "web", + "target": "jest", + "type": "static" + }, + { + "source": "web", + "target": "js", + "type": "static" + }, + { + "source": "web", + "target": "linter", + "type": "static" + }, + { + "source": "web", + "target": "rollup", + "type": "static" + }, + { + "source": "web", + "target": "webpack", + "type": "static" + }, + { + "source": "web", + "target": "workspace", + "type": "static" + }, + { + "source": "web", + "target": "npm:babel-plugin-const-enum", + "type": "static" + }, + { + "source": "web", + "target": "npm:babel-plugin-macros", + "type": "static" + }, + { + "source": "web", + "target": "npm:babel-plugin-transform-typescript-metadata", + "type": "static" + }, + { + "source": "web", + "target": "npm:chalk", + "type": "static" + }, + { + "source": "web", + "target": "npm:chokidar", + "type": "static" + }, + { + "source": "web", + "target": "npm:http-server", + "type": "static" + }, + { + "source": "web", + "target": "npm:ignore", + "type": "static" + }, + { + "source": "web", + "target": "npm:tslib", + "type": "static" + }, + { + "source": "web", + "target": "nx", + "type": "static" + } + ], + "e2e-cypress": [ + { + "source": "e2e-cypress", + "target": "cypress", + "type": "implicit" + }, + { + "source": "e2e-cypress", + "target": "react", + "type": "implicit" + }, + { + "source": "e2e-cypress", + "target": "e2e-utils", + "type": "static" + }, + { + "source": "e2e-cypress", + "target": "npm:cypress", + "type": "static" + } + ], + "e2e-esbuild": [ + { + "source": "e2e-esbuild", + "target": "esbuild", + "type": "implicit" + }, + { + "source": "e2e-esbuild", + "target": "e2e-utils", + "type": "static" + }, + { + "source": "e2e-esbuild", + "target": "npm:lodash", + "type": "static" + } + ], + "e2e-nx-init": [ + { + "source": "e2e-nx-init", + "target": "nx", + "type": "implicit" + }, + { + "source": "e2e-nx-init", + "target": "e2e-utils", + "type": "static" + } + ], + "e2e-nx-misc": [ + { + "source": "e2e-nx-misc", + "target": "js", + "type": "implicit" + }, + { + "source": "e2e-nx-misc", + "target": "e2e-utils", + "type": "static" + }, + { + "source": "e2e-nx-misc", + "target": "devkit", + "type": "static" + }, + { + "source": "e2e-nx-misc", + "target": "nx", + "type": "static" + } + ], + "e2e-webpack": [ + { + "source": "e2e-webpack", + "target": "webpack", + "type": "implicit" + }, + { + "source": "e2e-webpack", + "target": "e2e-utils", + "type": "static" + } + ], + "js": [ + { + "source": "js", + "target": "devkit", + "type": "static" + }, + { + "source": "js", + "target": "jest", + "type": "static" + }, + { + "source": "js", + "target": "linter", + "type": "static" + }, + { + "source": "js", + "target": "workspace", + "type": "static" + }, + { + "source": "js", + "target": "npm:@parcel/watcher", + "type": "static" + }, + { + "source": "js", + "target": "npm:chalk", + "type": "static" + }, + { + "source": "js", + "target": "npm:fast-glob", + "type": "static" + }, + { + "source": "js", + "target": "npm:fs-extra", + "type": "static" + }, + { + "source": "js", + "target": "npm:ignore", + "type": "static" + }, + { + "source": "js", + "target": "npm:js-tokens", + "type": "static" + }, + { + "source": "js", + "target": "npm:minimatch", + "type": "static" + }, + { + "source": "js", + "target": "npm:source-map-support", + "type": "static" + }, + { + "source": "js", + "target": "npm:tree-kill", + "type": "static" + }, + { + "source": "js", + "target": "nx", + "type": "static" + }, + { + "source": "js", + "target": "npm:util", + "type": "static" + }, + { + "source": "js", + "target": "npm:typescript", + "type": "static" + } + ], + "nx": [ + { + "source": "nx", + "target": "graph-client", + "type": "implicit" + }, + { + "source": "nx", + "target": "npm:enquirer", + "type": "static" + }, + { + "source": "nx", + "target": "npm:chalk", + "type": "static" + }, + { + "source": "nx", + "target": "npm:v8-compile-cache", + "type": "static" + }, + { + "source": "nx", + "target": "npm:@parcel/watcher", + "type": "static" + }, + { + "source": "nx", + "target": "npm:@yarnpkg/lockfile", + "type": "static" + }, + { + "source": "nx", + "target": "npm:@yarnpkg/parsers", + "type": "static" + }, + { + "source": "nx", + "target": "npm:@zkochan/js-yaml", + "type": "static" + }, + { + "source": "nx", + "target": "npm:chokidar", + "type": "static" + }, + { + "source": "nx", + "target": "npm:cli-cursor", + "type": "static" + }, + { + "source": "nx", + "target": "npm:cli-spinners", + "type": "static" + }, + { + "source": "nx", + "target": "npm:cliui", + "type": "static" + }, + { + "source": "nx", + "target": "npm:dotenv", + "type": "static" + }, + { + "source": "nx", + "target": "npm:fast-glob", + "type": "static" + }, + { + "source": "nx", + "target": "npm:figures", + "type": "static" + }, + { + "source": "nx", + "target": "npm:flat", + "type": "static" + }, + { + "source": "nx", + "target": "npm:fs-extra", + "type": "static" + }, + { + "source": "nx", + "target": "npm:glob", + "type": "static" + }, + { + "source": "nx", + "target": "npm:ignore", + "type": "static" + }, + { + "source": "nx", + "target": "npm:jsonc-parser", + "type": "static" + }, + { + "source": "nx", + "target": "npm:minimatch", + "type": "static" + }, + { + "source": "nx", + "target": "npm:npm-run-path", + "type": "static" + }, + { + "source": "nx", + "target": "npm:open", + "type": "static" + }, + { + "source": "nx", + "target": "npm:semver", + "type": "static" + }, + { + "source": "nx", + "target": "npm:string-width", + "type": "static" + }, + { + "source": "nx", + "target": "npm:strong-log-transformer", + "type": "static" + }, + { + "source": "nx", + "target": "npm:tar-stream", + "type": "static" + }, + { + "source": "nx", + "target": "npm:tmp", + "type": "static" + }, + { + "source": "nx", + "target": "npm:tsconfig-paths", + "type": "static" + }, + { + "source": "nx", + "target": "npm:tslib", + "type": "static" + }, + { + "source": "nx", + "target": "npm:yargs", + "type": "static" + }, + { + "source": "nx", + "target": "npm:yargs-parser", + "type": "static" + }, + { + "source": "nx", + "target": "npm:js-yaml", + "type": "static" + }, + { + "source": "nx", + "target": "npm:axios", + "type": "static" + }, + { + "source": "nx", + "target": "npm:@swc-node/register", + "type": "static" + }, + { + "source": "nx", + "target": "npm:@swc/core", + "type": "static" + }, + { + "source": "nx", + "target": "npm:@angular-devkit/build-angular", + "type": "static" + }, + { + "source": "nx", + "target": "npm:@angular-devkit/core", + "type": "static" + }, + { + "source": "nx", + "target": "npm:@angular-devkit/architect", + "type": "static" + }, + { + "source": "nx", + "target": "npm:rxjs", + "type": "static" + }, + { + "source": "nx", + "target": "npm:@angular-devkit/schematics", + "type": "static" + }, + { + "source": "nx", + "target": "npm:url", + "type": "static" + }, + { + "source": "nx", + "target": "npm:prettier", + "type": "static" + }, + { + "source": "nx", + "target": "npm:util", + "type": "static" + }, + { + "source": "nx", + "target": "npm:typescript", + "type": "static" + }, + { + "source": "nx", + "target": "npm:memfs", + "type": "static" + }, + { + "source": "nx", + "target": "npm:process", + "type": "static" + }, + { + "source": "nx", + "target": "npm:ajv", + "type": "static" + }, + { + "source": "nx", + "target": "npm:ts-node", + "type": "static" + } + ], + "e2e-linter": [ + { + "source": "e2e-linter", + "target": "linter", + "type": "implicit" + }, + { + "source": "e2e-linter", + "target": "e2e-utils", + "type": "static" + }, + { + "source": "e2e-linter", + "target": "npm:typescript", + "type": "static" + }, + { + "source": "e2e-linter", + "target": "npm:@typescript-eslint/type-utils", + "type": "static" + } + ], + "e2e-nx-run": [ + { + "source": "e2e-nx-run", + "target": "js", + "type": "implicit" + }, + { + "source": "e2e-nx-run", + "target": "devkit", + "type": "static" + }, + { + "source": "e2e-nx-run", + "target": "e2e-utils", + "type": "static" + } + ], + "e2e-rollup": [ + { + "source": "e2e-rollup", + "target": "rollup", + "type": "implicit" + }, + { + "source": "e2e-rollup", + "target": "e2e-utils", + "type": "static" + } + ], + "e2e-detox": [ + { + "source": "e2e-detox", + "target": "detox", + "type": "implicit" + }, + { + "source": "e2e-detox", + "target": "e2e-utils", + "type": "static" + } + ], + "e2e-react": [ + { + "source": "e2e-react", + "target": "react", + "type": "implicit" + }, + { + "source": "e2e-react", + "target": "e2e-utils", + "type": "static" + }, + { + "source": "e2e-react", + "target": "npm:react", + "type": "static" + }, + { + "source": "e2e-react", + "target": "devkit", + "type": "static" + } + ], + "e2e-utils": [ + { + "source": "e2e-utils", + "target": "devkit", + "type": "static" + }, + { + "source": "e2e-utils", + "target": "workspace", + "type": "static" + }, + { + "source": "e2e-utils", + "target": "npm:fs-extra", + "type": "static" + }, + { + "source": "e2e-utils", + "target": "npm:tcp-port-used", + "type": "static" + }, + { + "source": "e2e-utils", + "target": "npm:tmp", + "type": "static" + }, + { + "source": "e2e-utils", + "target": "npm:util", + "type": "static" + }, + { + "source": "e2e-utils", + "target": "npm:chalk", + "type": "static" + }, + { + "source": "e2e-utils", + "target": "npm:is-ci", + "type": "static" + }, + { + "source": "e2e-utils", + "target": "npm:tree-kill", + "type": "static" + }, + { + "source": "e2e-utils", + "target": "nx", + "type": "static" + }, + { + "source": "e2e-utils", + "target": "npm:kill-port", + "type": "static" + }, + { + "source": "e2e-utils", + "target": "npm:is-windows", + "type": "static" + } + ], + "e2e-expo": [ + { + "source": "e2e-expo", + "target": "expo", + "type": "implicit" + }, + { + "source": "e2e-expo", + "target": "e2e-utils", + "type": "static" + } + ], + "e2e-jest": [ + { + "source": "e2e-jest", + "target": "jest", + "type": "implicit" + }, + { + "source": "e2e-jest", + "target": "npm:@angular-devkit/core", + "type": "static" + }, + { + "source": "e2e-jest", + "target": "e2e-utils", + "type": "static" + }, + { + "source": "e2e-jest", + "target": "nx", + "type": "static" + } + ], + "e2e-next": [ + { + "source": "e2e-next", + "target": "next", + "type": "implicit" + }, + { + "source": "e2e-next", + "target": "e2e-utils", + "type": "static" + }, + { + "source": "e2e-next", + "target": "workspace", + "type": "static" + }, + { + "source": "e2e-next", + "target": "npm:next", + "type": "static" + }, + { + "source": "e2e-next", + "target": "npm:react", + "type": "static" + }, + { + "source": "e2e-next", + "target": "npm:@nrwl/next", + "type": "static" + } + ], + "e2e-node": [ + { + "source": "e2e-node", + "target": "node", + "type": "implicit" + }, + { + "source": "e2e-node", + "target": "nest", + "type": "implicit" + }, + { + "source": "e2e-node", + "target": "npm:@angular-devkit/core", + "type": "static" + }, + { + "source": "e2e-node", + "target": "e2e-utils", + "type": "static" + }, + { + "source": "e2e-node", + "target": "npm:semver", + "type": "static" + }, + { + "source": "e2e-node", + "target": "npm:@nestjs/common", + "type": "static" + }, + { + "source": "e2e-node", + "target": "npm:@nestjs/swagger", + "type": "static" + } + ], + "e2e-vite": [ + { + "source": "e2e-vite", + "target": "vite", + "type": "implicit" + }, + { + "source": "e2e-vite", + "target": "e2e-utils", + "type": "static" + }, + { + "source": "e2e-vite", + "target": "npm:vite", + "type": "static" + } + ], + "e2e-web": [ + { + "source": "e2e-web", + "target": "web", + "type": "implicit" + }, + { + "source": "e2e-web", + "target": "e2e-utils", + "type": "static" + } + ], + "e2e-js": [ + { + "source": "e2e-js", + "target": "jest", + "type": "implicit" + }, + { + "source": "e2e-js", + "target": "npm:semver", + "type": "static" + }, + { + "source": "e2e-js", + "target": "e2e-utils", + "type": "static" + } + ], + "docs": [] + } + } +} diff --git a/docs/map.json b/docs/map.json index 34f5813653..2f68c36b78 100644 --- a/docs/map.json +++ b/docs/map.json @@ -317,10 +317,10 @@ "file": "shared/concepts/how-caching-works" }, { - "name": "Distributed Task Execution Guide", + "name": "Improve Worst Case CI Times", "tags": ["distribute-task-execution"], "id": "dte", - "file": "shared/concepts/dte-guide" + "file": "shared/concepts/improve-worst-case-ci-times" }, { "name": "Task Pipeline Configuration", @@ -358,6 +358,12 @@ "tags": ["use-task-executors"], "file": "shared/incremental-builds" }, + { + "name": "Illustrated Distributed Task Execution", + "tags": ["distribute-task-execution"], + "id": "illustrated-dte", + "file": "shared/concepts/illustrated-dte-guide" + }, { "name": "Nx and Turborepo", "id": "turbo-and-nx", diff --git a/docs/shared/concepts/dte-guide.md b/docs/shared/concepts/illustrated-dte-guide.md similarity index 100% rename from docs/shared/concepts/dte-guide.md rename to docs/shared/concepts/illustrated-dte-guide.md diff --git a/docs/shared/concepts/improve-worst-case-ci-times.md b/docs/shared/concepts/improve-worst-case-ci-times.md new file mode 100644 index 0000000000..89b0879806 --- /dev/null +++ b/docs/shared/concepts/improve-worst-case-ci-times.md @@ -0,0 +1,128 @@ +# Improve Worst Case CI Times + +In this guide we'll show three CI setups and discuss the pros and cons of each. Nx is designed to be dropped in to any setup and immediately show some benefits. There are some setups, however, that are more able to take advantage of the performance boosts that Nx provides. + +The CI setups we'll discuss are: + +1. Single CI Job +2. Binning +3. Distributed Task Execution + +## Approach 1: Single CI Job + +Most organizations start their CI as a single job that is responsible for running any tasks that are required. The script for this CI setup using Nx would look something like this: + +```yaml +- nx affected --target=lint +- nx affected --target=test +- nx affected --target=build +``` + +This script will run all lint, test and build targets for projects that are affected by the current PR. + +### 🎉 Pro: Simple Setup + +This approach is the simplest to setup of the three types. The execution flow is the exact same as if a developer were manually checking everything on their own machine. + +### 🎉 Pro: Simple Debugging + +Since all the tasks are executed on the same job, all the error logs and build artifacts are located in one place. This makes it easy to find and diagnose errors. + +### ⛔️ Con: Slow + +This approach works fine for smaller repos, but as the repo grows and the tasks take longer to execute, CI takes longer and longer to run. Nx's affected and computation caching help improve the average CI time, but the worst case CI time will still grow significantly for each project that is added to the repo. + +## Approach 2: Binning + +To improve the performance of the worst case CI time, you have to implement some sort of parallelization strategy. Binning is a parallelization strategy where there is a planning job that divides the work into bins, one for each agent job. Then every agent executes the work prepared for it. Here is a simplified version of the binning strategy. + +```yaml {% fileName="planning-job.yml" %} +# Get the list of affected projects +- nx print-affected > affected-projects.json +# Store the list of affected projects in a PROJECTS environment variable +# that is accessible to the agent jobs +- node storeAffectedProjects.js +``` + +```yaml {% fileName="lint-agent.yml" %} +# Run lint for all projects defined in PROJECTS +- nx run-many --projects=$PROJECTS --target=lint +``` + +```yaml {% fileName="test-agent.yml" %} +# Run test for all projects defined in PROJECTS +- nx run-many --projects=$PROJECTS --target=test +``` + +```yaml {% fileName="build-agent.yml" %} +# Run build for all projects defined in PROJECTS +- nx run-many --projects=$PROJECTS --target=build +``` + +Here's a visualization of how this approach works: +![CI using binning](../images/dte/binning.svg) + +### 🎉 Pro: Faster + +Because there are now three different jobs running the tasks, the worst case CI time is now only as long as the longest group of tasks. (For this scenario, the build tasks usually take the longest.) + +### ⛔️ Con: Complex Debugging + +With tasks being run on multiple machines, it can be difficult to find where a particular task was run. Tracking down a specific error message or build artifact becomes more and more difficult the more agents are used and the more complex the planning script becomes. + +### ⛔️ Con: Difficult to Share Build Artifacts + +If one task needs the outputs file of another task, they either need to be run on the same agent job, or you need to create some mechanism to copy the build artifacts from one job to another. Also, the planning script needs to account for all of these task dependencies as it assigns tasks to each agent. + +### ⛔️ Con: Complex Setup + +This approach requires you to create extra jobs and maintain the script that assigns tasks to each agent job. You could certainly be smarter about assigning tasks to jobs so that you are more optimally dividing work across agent jobs, but that requires making the planning job more complex. + +Even if you make the perfect script that correctly divides up the tasks into evenly-sized bins, the repo will continue to change. Tasks that used to take very little time could start to take more time, and someone will need to revisit the script and keep adjusting it to account for the latest timing values for each task. + +## Approach 3: Distributed Task Execution with Nx Cloud + +Nx Cloud's Distributed Task Execution removes the burden of the complex setup of binning so that you can fully optimize your worst case CI times while maintaining the ease of setup and debug-ability of the single job approach. + +The setup looks like this: + +```yaml {% fileName="main-job.yml" %} +# Coordinate the agents to run the tasks +- npx nx-cloud start-ci-run +# Run any commands you want here +- nx affected --target=lint & nx affected --target=test & nx affected --target=build +# Stop any run away agents +- npx nx-cloud stop-all-agents +``` + +```yaml {% fileName="agent.yml" %} +# Wait for tasks to execute +- npx nx-cloud start-agent +``` + +The visualization for distributed task execution looks like this: +![CI using DTE](../images/dte/3agents.svg) + +### 🎉 Pro: Fastest + +This approach fully optimizes the binning strategy so that tasks are optimally distributed to however many agents are available. + +### 🎉 Pro: Easy to Scale + +If CI is taking too long, simply increase the number of agent jobs being started in your CI system and Nx will recognize the new agent jobs are available and distribute tasks accordingly. With this approach, your worst case CI time is only limited by your longest running individual task. + +### 🎉 Pro: Build Artifacts + +Nx uses the dependency graph to ensure that tasks are executed in the correct order. Nx Cloud then uses the distributed computation cache to make sure that build artifacts from prior tasks are always present for the current task, no matter which agent the tasks were run on. When developing your tasks, you can think of your CI as a single job, even though it is being distributed across an arbitrary number of agents. + +### 🎉 Pro: Simple Debugging + +Because Nx uses distributed computation caching to replay all the tasks back on the main job, every log and build artifact is present on that single job. No matter how many agents are used to speed up the CI time, all the debugging information can be found in a single place. + +## Conclusion + +If your repo is starting to grow large enough that CI times are suffering, or if your parallelization strategy is growing too complex to manage effectively, try [setting up Nx Cloud with Distributed Task Execution](/core-features/distribute-task-execution). You can generate a simple workflow for common CI providers with a single command and then customize from there. + +Nx Cloud is [free for up to 500 hours](https://nx.app/pricing/) of time saved per month. Most organizations do not exceed the free tier. If you're working on an open source repo, we'll give you a coupon for unlimited free use of Nx Cloud. + +Organizations that want extra help setting up Nx Cloud or getting the most out of Nx can [sign up for Nx Enterprise](https://nx.app/enterprise/). This package comes with extra support from the Nx team and the option to host Nx Cloud on your own servers. diff --git a/docs/shared/core-features/distribute-task-execution.md b/docs/shared/core-features/distribute-task-execution.md index 6983e18cc9..72d6711f02 100644 --- a/docs/shared/core-features/distribute-task-execution.md +++ b/docs/shared/core-features/distribute-task-execution.md @@ -14,6 +14,8 @@ When you set up Nx's distributed task execution, your task graph will look more And not only will CI finish faster, but the debugging experience is the same as if you ran all of your CI on a single job. That's because Nx uses distributed caching to recreate all of the logs and build artifacts on the main job. +Find more information in this [detailed guide to improve your worst case CI times](/concepts/dte). + ## Set up To distribute your task execution, you need to (1) connect to Nx Cloud and (2) enable DTE in your CI workflow. Each of these steps can be enabled with a single command: @@ -116,12 +118,6 @@ Read the guides for more information on how to configure them in CI. Note that only cacheable operations can be distributed because they have to be replayed on the main job. -## Illustrated Guide - -For more details about how distributed task execution works, check out the [illustrated guide](/concepts/dte) by Nrwlian [Nicole Oliver](https://twitter.com/nixcodes). - -[![how does distributed task execution work in Nx Cloud?](../images/dte/how-does-dte-work.jpeg)](/concepts/dte) - ## Relevant Repositories and Examples - [Nx: On how to make your CI 16 times faster with a small config change](https://github.com/vsavkin/interstellar)