UNPKG

nx

Version:

The core Nx plugin contains the core functionality of Nx like the project graph, nx commands and task orchestration.

111 lines (110 loc) 6.04 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.retrieveWorkspaceFiles = retrieveWorkspaceFiles; exports.retrieveProjectConfigurations = retrieveProjectConfigurations; exports.retrieveProjectConfigurationsWithAngularProjects = retrieveProjectConfigurationsWithAngularProjects; exports.retrieveProjectConfigurationPaths = retrieveProjectConfigurationPaths; exports.retrieveProjectConfigurationsWithoutPluginInference = retrieveProjectConfigurationsWithoutPluginInference; exports.clearProjectsWithoutPluginInferenceCache = clearProjectsWithoutPluginInferenceCache; exports.getGlobPatternsOfPlugins = getGlobPatternsOfPlugins; const perf_hooks_1 = require("perf_hooks"); const angular_json_1 = require("../../adapter/angular-json"); const nx_json_1 = require("../../config/nx-json"); const project_configuration_utils_1 = require("./project-configuration-utils"); const workspace_context_1 = require("../../utils/workspace-context"); const path_1 = require("path"); const get_plugins_1 = require("../plugins/get-plugins"); /** * Walks the workspace directory to create the `projectFileMap` and `ProjectConfigurations` * @throws * @param workspaceRoot * @param nxJson */ async function retrieveWorkspaceFiles(workspaceRoot, projectRootMap) { perf_hooks_1.performance.mark('native-file-deps:start'); perf_hooks_1.performance.mark('native-file-deps:end'); perf_hooks_1.performance.measure('native-file-deps', 'native-file-deps:start', 'native-file-deps:end'); perf_hooks_1.performance.mark('get-workspace-files:start'); const { projectFileMap, globalFiles, externalReferences } = await (0, workspace_context_1.getNxWorkspaceFilesFromContext)(workspaceRoot, projectRootMap); perf_hooks_1.performance.mark('get-workspace-files:end'); perf_hooks_1.performance.measure('get-workspace-files', 'get-workspace-files:start', 'get-workspace-files:end'); return { fileMap: { projectFileMap, nonProjectFiles: globalFiles, }, rustReferences: externalReferences, }; } /** * Walk through the workspace and return `ProjectConfigurations`. Only use this if the projectFileMap is not needed. * * Accepts separated plugin sets so that target defaults can be applied * between specified and default plugin processing phases. */ async function retrieveProjectConfigurations(separatedPlugins, workspaceRoot, nxJson) { const specifiedWithCreateNodes = separatedPlugins.specifiedPlugins.filter((p) => !!p.createNodes); const defaultWithCreateNodes = separatedPlugins.defaultPlugins.filter((p) => !!p.createNodes); const specifiedGlobPatterns = getGlobPatternsOfPlugins(specifiedWithCreateNodes); const defaultGlobPatterns = getGlobPatternsOfPlugins(defaultWithCreateNodes); const [specifiedPluginFiles, defaultPluginFiles] = await Promise.all([ (0, workspace_context_1.multiGlobWithWorkspaceContext)(workspaceRoot, specifiedGlobPatterns), (0, workspace_context_1.multiGlobWithWorkspaceContext)(workspaceRoot, defaultGlobPatterns), ]); return (0, project_configuration_utils_1.createProjectConfigurationsWithPlugins)(workspaceRoot, nxJson, { specifiedPluginFiles: specifiedPluginFiles ?? [], defaultPluginFiles: defaultPluginFiles ?? [], }, { specifiedPlugins: specifiedWithCreateNodes, defaultPlugins: defaultWithCreateNodes, }); } async function retrieveProjectConfigurationsWithAngularProjects(workspaceRoot, nxJson) { const pluginsToLoad = nxJson?.plugins ?? []; if ((0, angular_json_1.shouldMergeAngularProjects)(workspaceRoot, true) && !pluginsToLoad.some((p) => p === angular_json_1.NX_ANGULAR_JSON_PLUGIN_NAME || (typeof p === 'object' && p.plugin === angular_json_1.NX_ANGULAR_JSON_PLUGIN_NAME))) { pluginsToLoad.push((0, path_1.join)(__dirname, '../../adapter/angular-json')); } const separatedPlugins = await (0, get_plugins_1.getPluginsSeparated)(nxJson, workspaceRoot); const res = await retrieveProjectConfigurations(separatedPlugins, workspaceRoot, nxJson); return res; } async function retrieveProjectConfigurationPaths(root, plugins) { const projectGlobPatterns = getGlobPatternsOfPlugins(plugins); const pluginConfigFiles = await (0, workspace_context_1.multiGlobWithWorkspaceContext)(root, projectGlobPatterns); return pluginConfigFiles.flat(); } const projectsWithoutPluginCache = new Map(); // TODO: This function is called way too often, it should be optimized without this cache async function retrieveProjectConfigurationsWithoutPluginInference(root) { const nxJson = (0, nx_json_1.readNxJson)(root); const defaultPlugins = await (0, get_plugins_1.getOnlyDefaultPlugins)(); // only load default plugins const pluginsWithCreateNodes = defaultPlugins.filter((p) => !!p.createNodes); const projectGlobPatterns = getGlobPatternsOfPlugins(pluginsWithCreateNodes); const cacheKey = root + ',' + projectGlobPatterns.join(','); if (projectsWithoutPluginCache.has(cacheKey)) { return projectsWithoutPluginCache.get(cacheKey); } const projectFiles = (await (0, workspace_context_1.multiGlobWithWorkspaceContext)(root, projectGlobPatterns)) ?? []; const { projects } = await (0, project_configuration_utils_1.createProjectConfigurationsWithPlugins)(root, nxJson, { specifiedPluginFiles: [], defaultPluginFiles: projectFiles, }, { specifiedPlugins: [], defaultPlugins: pluginsWithCreateNodes, }); projectsWithoutPluginCache.set(cacheKey, projects); return projects; } /** * Clears the cache backing `retrieveProjectConfigurationsWithoutPluginInference`, * so a long-lived daemon picks up projects (e.g. a new local plugin) added * after the first snapshot instead of serving it forever. */ function clearProjectsWithoutPluginInferenceCache() { projectsWithoutPluginCache.clear(); } function getGlobPatternsOfPlugins(plugins) { return plugins.map((p) => p.createNodes[0]); }