Skip to content

Commit 47c76de

Browse files
committed
chore(repo): wip
1 parent 221ad58 commit 47c76de

File tree

11 files changed

+183
-91
lines changed

11 files changed

+183
-91
lines changed

packages/devkit/src/utils/calculate-hash-for-create-nodes.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,11 @@ export async function calculateHashForCreateNodes(
1414
additionalGlobs: string[] = []
1515
): Promise<string> {
1616
return hashArray([
17-
await hashWithWorkspaceContext(context.workspaceRoot, [
18-
join(projectRoot, '**/*'),
19-
...additionalGlobs,
20-
]),
17+
await hashWithWorkspaceContext(
18+
context.workspaceRoot,
19+
context.nxJsonConfiguration.additionalProjectDirectories ?? [],
20+
[join(projectRoot, '**/*'), ...additionalGlobs]
21+
),
2122
hashObject(options),
2223
]);
2324
}

packages/nx/bin/nx.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import { performance } from 'perf_hooks';
2121
import { setupWorkspaceContext } from '../src/utils/workspace-context';
2222
import { daemonClient } from '../src/daemon/client/client';
2323
import { removeDbConnections } from '../src/utils/db-connection';
24+
import { readNxJson } from '../src/config/nx-json';
2425

2526
async function main() {
2627
if (
@@ -58,8 +59,10 @@ async function main() {
5859
process.env.NX_DAEMON = 'false';
5960
require('nx/src/command-line/nx-commands').commandsObject.argv;
6061
} else {
62+
const additionalProjectDirectories =
63+
readNxJson(workspace.dir).additionalProjectDirectories ?? [];
6164
if (!daemonClient.enabled() && workspace !== null) {
62-
setupWorkspaceContext(workspace.dir);
65+
setupWorkspaceContext(workspace.dir, additionalProjectDirectories);
6366
}
6467

6568
// polyfill rxjs observable to avoid issues with multiple version of Observable installed in node_modules

packages/nx/bin/post-install.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,12 @@
1-
import { buildProjectGraphAndSourceMapsWithoutDaemon } from '../src/project-graph/project-graph';
21
import { workspaceRoot } from '../src/utils/workspace-root';
32
import { fileExists } from '../src/utils/fileutils';
43
import { join } from 'path';
5-
import { daemonClient } from '../src/daemon/client/client';
64
import { assertSupportedPlatform } from '../src/native/assert-supported-platform';
75
import { verifyOrUpdateNxCloudClient } from '../src/nx-cloud/update-manager';
86
import { getCloudOptions } from '../src/nx-cloud/utilities/get-cloud-options';
97
import { isNxCloudUsed } from '../src/utils/nx-cloud-utils';
108
import { readNxJson } from '../src/config/nx-json';
119
import { logger } from '../src/utils/logger';
12-
import { setupWorkspaceContext } from '../src/utils/workspace-context';
1310

1411
// The post install is not critical, to avoid any chance that it may hang
1512
// we will kill this process after 30 seconds.

packages/nx/src/adapter/compat.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ export const allowedWorkspaceExtensions = [
8787
'maxCacheSize',
8888
'tui',
8989
'owners',
90+
'additionalProjectDirectories',
9091
] as const;
9192

9293
if (!patched) {

packages/nx/src/config/nx-json.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -854,6 +854,11 @@ export interface NxJsonConfiguration<T = '*' | string[]> {
854854
*/
855855
sync?: NxSyncConfiguration;
856856

857+
/**
858+
* Additional directories to discover projects within relative to the nx.json
859+
*/
860+
additionalProjectDirectories?: string[];
861+
857862
/**
858863
* Sets the maximum size of the local cache. Accepts a number followed by a unit (e.g. 100MB). Accepted units are B, KB, MB, and GB.
859864
*/

packages/nx/src/daemon/server/server.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,7 @@ import {
142142
REGISTER_PROJECT_GRAPH_LISTENER,
143143
} from '../message-types/register-project-graph-listener';
144144
import { deserialize, serialize } from 'v8';
145+
import { readNxJson } from '../../config/nx-json';
145146

146147
let performanceObserver: PerformanceObserver | undefined;
147148
let workspaceWatcherError: Error | undefined;
@@ -649,7 +650,9 @@ const handleOutputsChanges: FileWatcherCallback = async (err, changeEvents) => {
649650
};
650651

651652
export async function startServer(): Promise<Server> {
652-
setupWorkspaceContext(workspaceRoot);
653+
const additionalProjectDirectories =
654+
readNxJson(workspaceRoot).additionalProjectDirectories ?? [];
655+
setupWorkspaceContext(workspaceRoot, additionalProjectDirectories);
653656

654657
// Persist metadata about the background process so that it can be cleaned up later if needed
655658
await writeDaemonJsonProcessCache({

packages/nx/src/native/index.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ export declare class Watcher {
135135

136136
export declare class WorkspaceContext {
137137
workspaceRoot: string
138-
constructor(workspaceRoot: string, cacheDir: string)
138+
constructor(workspaceRoot: string, additionalProjectDirectories: Array<string>, cacheDir: string)
139139
getWorkspaceFiles(projectRootMap: Record<string, string>): NxWorkspaceFiles
140140
glob(globs: Array<string>, exclude?: Array<string> | undefined | null): Array<string>
141141
/**

packages/nx/src/native/workspace/context.rs

Lines changed: 32 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -30,15 +30,15 @@ pub struct WorkspaceContext {
3030

3131
type Files = Vec<(PathBuf, String)>;
3232

33-
fn gather_and_hash_files(workspace_root: &Path, cache_dir: String) -> Vec<(PathBuf, String)> {
34-
let archived_files = read_files_archive(&cache_dir);
33+
fn gather_and_hash_files(directory: &Path, cache_dir: &String) -> Vec<(PathBuf, String)> {
34+
let archived_files = read_files_archive(cache_dir);
3535

36-
trace!("Gathering files in {}", workspace_root.display());
36+
trace!("Gathering files in {}", directory.display());
3737
let now = std::time::Instant::now();
3838
let file_hashes = if let Some(archived_files) = archived_files {
39-
selective_files_hash(workspace_root, archived_files)
39+
selective_files_hash(directory, archived_files)
4040
} else {
41-
full_files_hash(workspace_root)
41+
full_files_hash(directory)
4242
};
4343

4444
let mut files = file_hashes
@@ -57,7 +57,11 @@ fn gather_and_hash_files(workspace_root: &Path, cache_dir: String) -> Vec<(PathB
5757
struct FilesWorker(Option<Arc<(NxMutex<Files>, NxCondvar)>>);
5858
impl FilesWorker {
5959
#[cfg(not(target_arch = "wasm32"))]
60-
fn gather_files(workspace_root: &Path, cache_dir: String) -> Self {
60+
fn gather_files(
61+
workspace_root: &Path,
62+
additional_project_directories: Vec<PathBuf>,
63+
cache_dir: String,
64+
) -> Self {
6165
if !workspace_root.exists() {
6266
warn!(
6367
"workspace root does not exist: {}",
@@ -75,7 +79,14 @@ impl FilesWorker {
7579
trace!("Initially locking files");
7680
let mut workspace_files = lock.lock().expect("Should be the first time locking files");
7781

78-
let files = gather_and_hash_files(&workspace_root, cache_dir);
82+
let mut files = gather_and_hash_files(&workspace_root, &cache_dir);
83+
84+
for additional_project_directory in additional_project_directories {
85+
let additional_files =
86+
gather_and_hash_files(&additional_project_directory, &cache_dir);
87+
88+
files.extend(additional_files);
89+
}
7990

8091
*workspace_files = files;
8192
let files_len = workspace_files.len();
@@ -200,15 +211,27 @@ impl FilesWorker {
200211
#[napi]
201212
impl WorkspaceContext {
202213
#[napi(constructor)]
203-
pub fn new(workspace_root: String, cache_dir: String) -> Self {
214+
pub fn new(
215+
workspace_root: String,
216+
additional_project_directories: Vec<String>,
217+
cache_dir: String,
218+
) -> Self {
204219
enable_logger();
205220

206221
trace!(?workspace_root);
207222

208223
let workspace_root_path = PathBuf::from(&workspace_root);
224+
let additional_project_directories = additional_project_directories
225+
.iter()
226+
.map(|s| PathBuf::from(s))
227+
.collect::<Vec<PathBuf>>();
209228

210229
WorkspaceContext {
211-
files_worker: FilesWorker::gather_files(&workspace_root_path, cache_dir.clone()),
230+
files_worker: FilesWorker::gather_files(
231+
&workspace_root_path,
232+
additional_project_directories,
233+
cache_dir.clone(),
234+
),
212235
workspace_root,
213236
workspace_root_path,
214237
}

packages/nx/src/project-graph/utils/retrieve-workspace-files.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,11 +111,13 @@ export async function retrieveProjectConfigurationsWithAngularProjects(
111111

112112
export async function retrieveProjectConfigurationPaths(
113113
root: string,
114+
additionalProjectDirectories: string[],
114115
plugins: Array<LoadedNxPlugin>
115116
): Promise<string[]> {
116117
const projectGlobPatterns = getGlobPatternsOfPlugins(plugins);
117118
const pluginConfigFiles = await multiGlobWithWorkspaceContext(
118119
root,
120+
additionalProjectDirectories,
119121
projectGlobPatterns
120122
);
121123
return pluginConfigFiles.flat();
@@ -132,6 +134,8 @@ export async function retrieveProjectConfigurationsWithoutPluginInference(
132134
): Promise<Record<string, ProjectConfiguration>> {
133135
const nxJson = readNxJson(root);
134136
const plugins = await getOnlyDefaultPlugins(); // only load default plugins
137+
const additionalProjectDirectories =
138+
nxJson.additionalProjectDirectories ?? [];
135139
const projectGlobPatterns = getGlobPatternsOfPlugins(plugins);
136140
const cacheKey = root + ',' + projectGlobPatterns.join(',');
137141

@@ -140,7 +144,8 @@ export async function retrieveProjectConfigurationsWithoutPluginInference(
140144
}
141145

142146
const projectFiles =
143-
(await multiGlobWithWorkspaceContext(root, projectGlobPatterns)) ?? [];
147+
(await multiGlobWithWorkspaceContext(root, additionalProjectDirectories,
148+
projectGlobPatterns)) ?? [];
144149
const { projects } = await createProjectConfigurationsWithPlugins(
145150
root,
146151
nxJson,

packages/nx/src/utils/workspace-context.ts

Lines changed: 39 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,21 @@ import { performance } from 'perf_hooks';
33
import { workspaceDataDirectoryForWorkspace } from './cache-directory';
44
import { isOnDaemon } from '../daemon/is-on-daemon';
55
import { daemonClient } from '../daemon/client/client';
6+
import { readNxJson } from '../config/configuration';
7+
import { resolve } from 'path';
68

79
let workspaceContext: WorkspaceContext | undefined;
810

9-
export function setupWorkspaceContext(workspaceRoot: string) {
11+
export function setupWorkspaceContext(
12+
workspaceRoot: string,
13+
additionalProjectDirectories: string[]
14+
) {
1015
const { WorkspaceContext } =
1116
require('../native') as typeof import('../native');
1217
performance.mark('workspace-context');
1318
workspaceContext = new WorkspaceContext(
1419
workspaceRoot,
20+
additionalProjectDirectories.map((p) => resolve(workspaceRoot, p)),
1521
workspaceDataDirectoryForWorkspace(workspaceRoot)
1622
);
1723
performance.mark('workspace-context:end');
@@ -27,8 +33,10 @@ export async function getNxWorkspaceFilesFromContext(
2733
projectRootMap: Record<string, string>,
2834
useDaemonProcess: boolean = true
2935
) {
36+
const additionalProjectDirectories =
37+
readNxJson(workspaceRoot).additionalProjectDirectories ?? [];
3038
if (!useDaemonProcess || isOnDaemon() || !daemonClient.enabled()) {
31-
ensureContextAvailable(workspaceRoot);
39+
ensureContextAvailable(workspaceRoot, additionalProjectDirectories);
3240
return workspaceContext.getWorkspaceFiles(projectRootMap);
3341
}
3442
return daemonClient.getWorkspaceFiles(projectRootMap);
@@ -46,7 +54,9 @@ export function globWithWorkspaceContextSync(
4654
globs: string[],
4755
exclude?: string[]
4856
) {
49-
ensureContextAvailable(workspaceRoot);
57+
const additionalProjectDirectories =
58+
readNxJson(workspaceRoot).additionalProjectDirectories ?? [];
59+
ensureContextAvailable(workspaceRoot, additionalProjectDirectories);
5060
return workspaceContext.glob(globs, exclude);
5161
}
5262

@@ -55,8 +65,10 @@ export async function globWithWorkspaceContext(
5565
globs: string[],
5666
exclude?: string[]
5767
) {
68+
const additionalProjectDirectories =
69+
readNxJson(workspaceRoot).additionalProjectDirectories ?? [];
5870
if (workspaceRoot === '/virtual' || isOnDaemon() || !daemonClient.enabled()) {
59-
ensureContextAvailable(workspaceRoot);
71+
ensureContextAvailable(workspaceRoot, additionalProjectDirectories);
6072
return workspaceContext.glob(globs, exclude);
6173
} else {
6274
return daemonClient.glob(globs, exclude);
@@ -68,8 +80,10 @@ export async function multiGlobWithWorkspaceContext(
6880
globs: string[],
6981
exclude?: string[]
7082
) {
83+
const additionalProjectDirectories =
84+
readNxJson(workspaceRoot).additionalProjectDirectories ?? [];
7185
if (isOnDaemon() || !daemonClient.enabled()) {
72-
ensureContextAvailable(workspaceRoot);
86+
ensureContextAvailable(workspaceRoot, additionalProjectDirectories);
7387
return workspaceContext.multiGlob(globs, exclude);
7488
}
7589
return daemonClient.multiGlob(globs, exclude);
@@ -80,8 +94,10 @@ export async function hashWithWorkspaceContext(
8094
globs: string[],
8195
exclude?: string[]
8296
) {
97+
const additionalProjectDirectories =
98+
readNxJson(workspaceRoot).additionalProjectDirectories ?? [];
8399
if (isOnDaemon() || !daemonClient.enabled()) {
84-
ensureContextAvailable(workspaceRoot);
100+
ensureContextAvailable(workspaceRoot, additionalProjectDirectories);
85101
return workspaceContext.hashFilesMatchingGlob(globs, exclude);
86102
}
87103
return daemonClient.hashGlob(globs, exclude);
@@ -91,8 +107,10 @@ export async function hashMultiGlobWithWorkspaceContext(
91107
workspaceRoot: string,
92108
globGroups: string[][]
93109
) {
110+
const additionalProjectDirectories =
111+
readNxJson(workspaceRoot).additionalProjectDirectories ?? [];
94112
if (isOnDaemon() || !daemonClient.enabled()) {
95-
ensureContextAvailable(workspaceRoot);
113+
ensureContextAvailable(workspaceRoot, additionalProjectDirectories);
96114
return workspaceContext.hashFilesMatchingGlobs(globGroups);
97115
}
98116
return daemonClient.hashMultiGlob(globGroups);
@@ -132,13 +150,17 @@ export function updateFilesInContext(
132150
updatedFiles: string[],
133151
deletedFiles: string[]
134152
) {
135-
ensureContextAvailable(workspaceRoot);
153+
const additionalProjectDirectories =
154+
readNxJson(workspaceRoot).additionalProjectDirectories ?? [];
155+
ensureContextAvailable(workspaceRoot, additionalProjectDirectories);
136156
return workspaceContext?.incrementalUpdate(updatedFiles, deletedFiles);
137157
}
138158

139159
export async function getAllFileDataInContext(workspaceRoot: string) {
160+
const additionalProjectDirectories =
161+
readNxJson(workspaceRoot).additionalProjectDirectories ?? [];
140162
if (isOnDaemon() || !daemonClient.enabled()) {
141-
ensureContextAvailable(workspaceRoot);
163+
ensureContextAvailable(workspaceRoot, additionalProjectDirectories);
142164
return workspaceContext.allFileData();
143165
}
144166
return daemonClient.getWorkspaceContextFileData();
@@ -148,8 +170,10 @@ export async function getFilesInDirectoryUsingContext(
148170
workspaceRoot: string,
149171
dir: string
150172
) {
173+
const additionalProjectDirectories =
174+
readNxJson(workspaceRoot).additionalProjectDirectories ?? [];
151175
if (isOnDaemon() || !daemonClient.enabled()) {
152-
ensureContextAvailable(workspaceRoot);
176+
ensureContextAvailable(workspaceRoot, additionalProjectDirectories);
153177
return workspaceContext.getFilesInDirectory(dir);
154178
}
155179
return daemonClient.getFilesInDirectory(dir);
@@ -170,9 +194,12 @@ export function updateProjectFiles(
170194
);
171195
}
172196

173-
function ensureContextAvailable(workspaceRoot: string) {
197+
function ensureContextAvailable(
198+
workspaceRoot: string,
199+
additionalProjectDirectories: string[]
200+
) {
174201
if (!workspaceContext || workspaceContext?.workspaceRoot !== workspaceRoot) {
175-
setupWorkspaceContext(workspaceRoot);
202+
setupWorkspaceContext(workspaceRoot, additionalProjectDirectories);
176203
}
177204
}
178205

0 commit comments

Comments
 (0)