diff --git a/packages/devkit/src/executors/parse-target-string.ts b/packages/devkit/src/executors/parse-target-string.ts index e21609e81ce882..4c4984d99952cb 100644 --- a/packages/devkit/src/executors/parse-target-string.ts +++ b/packages/devkit/src/executors/parse-target-string.ts @@ -40,7 +40,7 @@ export function parseTargetString( targetString: string, projectGraphOrCtx?: ProjectGraph | ExecutorContext ): Target { - let projectGraph = + let projectGraph: ProjectGraph = projectGraphOrCtx && 'projectGraph' in projectGraphOrCtx ? projectGraphOrCtx.projectGraph : (projectGraphOrCtx as ProjectGraph); diff --git a/packages/nx/src/native/nx.wasi-browser.js b/packages/nx/src/native/nx.wasi-browser.js index e04ab91262822a..35f45f5364992e 100644 --- a/packages/nx/src/native/nx.wasi-browser.js +++ b/packages/nx/src/native/nx.wasi-browser.js @@ -85,15 +85,18 @@ function __napi_rs_initialize_modules(__napiInstance) { __napiInstance.exports['__napi_register__ExternalDependenciesInput_struct_36']?.() __napiInstance.exports['__napi_register__DepsOutputsInput_struct_37']?.() __napiInstance.exports['__napi_register__NxJson_struct_38']?.() - __napiInstance.exports['__napi_register__WorkspaceContext_struct_39']?.() - __napiInstance.exports['__napi_register__WorkspaceContext_impl_48']?.() - __napiInstance.exports['__napi_register__WorkspaceErrors_49']?.() - __napiInstance.exports['__napi_register__NxWorkspaceFiles_struct_50']?.() - __napiInstance.exports['__napi_register__NxWorkspaceFilesExternals_struct_51']?.() - __napiInstance.exports['__napi_register__UpdatedWorkspaceFiles_struct_52']?.() - __napiInstance.exports['__napi_register__FileMap_struct_53']?.() - __napiInstance.exports['__napi_register____test_only_transfer_file_map_54']?.() + __napiInstance.exports['__napi_register__FileLock_struct_39']?.() + __napiInstance.exports['__napi_register__FileLock_impl_41']?.() + __napiInstance.exports['__napi_register__WorkspaceContext_struct_42']?.() + __napiInstance.exports['__napi_register__WorkspaceContext_impl_51']?.() + __napiInstance.exports['__napi_register__WorkspaceErrors_52']?.() + __napiInstance.exports['__napi_register__NxWorkspaceFiles_struct_53']?.() + __napiInstance.exports['__napi_register__NxWorkspaceFilesExternals_struct_54']?.() + __napiInstance.exports['__napi_register__UpdatedWorkspaceFiles_struct_55']?.() + __napiInstance.exports['__napi_register__FileMap_struct_56']?.() + __napiInstance.exports['__napi_register____test_only_transfer_file_map_57']?.() } +export const FileLock = __napiModule.exports.FileLock export const HashPlanner = __napiModule.exports.HashPlanner export const ImportResult = __napiModule.exports.ImportResult export const TaskHasher = __napiModule.exports.TaskHasher diff --git a/packages/nx/src/native/nx.wasi.cjs b/packages/nx/src/native/nx.wasi.cjs index eaa7f5df386a02..27bfa514042b05 100644 --- a/packages/nx/src/native/nx.wasi.cjs +++ b/packages/nx/src/native/nx.wasi.cjs @@ -116,15 +116,18 @@ function __napi_rs_initialize_modules(__napiInstance) { __napiInstance.exports['__napi_register__ExternalDependenciesInput_struct_36']?.() __napiInstance.exports['__napi_register__DepsOutputsInput_struct_37']?.() __napiInstance.exports['__napi_register__NxJson_struct_38']?.() - __napiInstance.exports['__napi_register__WorkspaceContext_struct_39']?.() - __napiInstance.exports['__napi_register__WorkspaceContext_impl_48']?.() - __napiInstance.exports['__napi_register__WorkspaceErrors_49']?.() - __napiInstance.exports['__napi_register__NxWorkspaceFiles_struct_50']?.() - __napiInstance.exports['__napi_register__NxWorkspaceFilesExternals_struct_51']?.() - __napiInstance.exports['__napi_register__UpdatedWorkspaceFiles_struct_52']?.() - __napiInstance.exports['__napi_register__FileMap_struct_53']?.() - __napiInstance.exports['__napi_register____test_only_transfer_file_map_54']?.() + __napiInstance.exports['__napi_register__FileLock_struct_39']?.() + __napiInstance.exports['__napi_register__FileLock_impl_41']?.() + __napiInstance.exports['__napi_register__WorkspaceContext_struct_42']?.() + __napiInstance.exports['__napi_register__WorkspaceContext_impl_51']?.() + __napiInstance.exports['__napi_register__WorkspaceErrors_52']?.() + __napiInstance.exports['__napi_register__NxWorkspaceFiles_struct_53']?.() + __napiInstance.exports['__napi_register__NxWorkspaceFilesExternals_struct_54']?.() + __napiInstance.exports['__napi_register__UpdatedWorkspaceFiles_struct_55']?.() + __napiInstance.exports['__napi_register__FileMap_struct_56']?.() + __napiInstance.exports['__napi_register____test_only_transfer_file_map_57']?.() } +module.exports.FileLock = __napiModule.exports.FileLock module.exports.HashPlanner = __napiModule.exports.HashPlanner module.exports.ImportResult = __napiModule.exports.ImportResult module.exports.TaskHasher = __napiModule.exports.TaskHasher diff --git a/packages/nx/src/native/tests/fixtures/file-lock-fixture.spec.js b/packages/nx/src/native/tests/__fixtures__/file-lock.fixture.js similarity index 100% rename from packages/nx/src/native/tests/fixtures/file-lock-fixture.spec.js rename to packages/nx/src/native/tests/__fixtures__/file-lock.fixture.js diff --git a/packages/nx/src/native/tests/file-lock.spec.ts b/packages/nx/src/native/tests/file-lock.spec.ts index 3059825257abb0..c07aa53309197d 100644 --- a/packages/nx/src/native/tests/file-lock.spec.ts +++ b/packages/nx/src/native/tests/file-lock.spec.ts @@ -4,7 +4,7 @@ import { join } from 'path'; describe('withLock', () => { it('should block the second call until the first one is done', async () => { let combinedOutputs = []; - let a = fork(join(__dirname, './fixtures/file-lock-fixture.spec.js'), { + let a = fork(join(__dirname, './__fixtures__/file-lock.fixture.js'), { env: { LABEL: 'a', NX_NATIVE_LOGGING: 'trace', @@ -17,7 +17,7 @@ describe('withLock', () => { // if both start at the same time, its hard to guarantee that a will get the lock before b. await new Promise((r) => setTimeout(r, 500)); - let b = fork(join(__dirname, './fixtures/file-lock-fixture.spec.js'), { + let b = fork(join(__dirname, './__fixtures__/file-lock.fixture.js'), { env: { LABEL: 'b', NX_NATIVE_LOGGING: 'trace', diff --git a/packages/nx/src/native/utils/file_lock.rs b/packages/nx/src/native/utils/file_lock.rs index ee46af1f646098..2487bb6237fb85 100644 --- a/packages/nx/src/native/utils/file_lock.rs +++ b/packages/nx/src/native/utils/file_lock.rs @@ -1,4 +1,3 @@ -use fs4::fs_std::FileExt; use napi::bindgen_prelude::*; use std::{ fs::{self, OpenOptions}, @@ -6,6 +5,9 @@ use std::{ }; use tracing::trace; +#[cfg(not(target_arch = "wasm32"))] +use fs4::fs_std::FileExt; + #[napi] pub struct FileLock { #[napi] @@ -26,6 +28,7 @@ pub struct FileLock { /// } #[napi] +#[cfg(not(target_arch = "wasm32"))] impl FileLock { #[napi(constructor)] pub fn new(lock_file_path: String) -> anyhow::Result { @@ -104,6 +107,15 @@ impl FileLock { } } +#[napi] +#[cfg(target_arch = "wasm32")] +impl FileLock { + #[napi(constructor)] + pub fn new(lock_file_path: String) -> anyhow::Result { + anyhow::bail!("FileLock is not supported on WASM") + } +} + // TODO: Fix the tests #[cfg(test)] mod test { diff --git a/packages/nx/src/project-graph/project-graph.ts b/packages/nx/src/project-graph/project-graph.ts index febfe96ca9afa2..7ed3ed40ad1350 100644 --- a/packages/nx/src/project-graph/project-graph.ts +++ b/packages/nx/src/project-graph/project-graph.ts @@ -36,7 +36,7 @@ import { } from './utils/retrieve-workspace-files'; import { getPlugins } from './plugins/get-plugins'; import { logger } from '../utils/logger'; -import { FileLock } from '../native'; +import { FileLock, IS_WASM } from '../native'; import { join } from 'path'; import { workspaceDataDirectory } from '../utils/cache-directory'; import { DelayedSpinner } from '../utils/delayed-spinner'; @@ -282,13 +282,11 @@ export async function createProjectGraphAndSourceMapsAsync( performance.mark('create-project-graph-async:start'); if (!daemonClient.enabled()) { - const lock = new FileLock( - join(workspaceDataDirectory, 'project-graph.lock') - ); - const initiallyLocked = lock.locked; - let locked = lock.locked; - - while (lock.locked) { + const lock = !IS_WASM + ? new FileLock(join(workspaceDataDirectory, 'project-graph.lock')) + : null; + let locked = lock?.locked; + while (locked) { logger.verbose( 'Waiting for graph construction in another process to complete' ); @@ -324,9 +322,7 @@ export async function createProjectGraphAndSourceMapsAsync( } locked = lock.check(); } - // if (!initiallyLocked) { - lock.lock(); - // } + lock?.lock(); try { const res = await buildProjectGraphAndSourceMapsWithoutDaemon(); performance.measure( diff --git a/packages/nx/src/utils/project-graph-utils.ts b/packages/nx/src/utils/project-graph-utils.ts index 01bbf7a73bc7fd..0add87c70f7e09 100644 --- a/packages/nx/src/utils/project-graph-utils.ts +++ b/packages/nx/src/utils/project-graph-utils.ts @@ -26,7 +26,7 @@ export function projectHasTargetAndConfiguration( export function getSourceDirOfDependentProjects( projectName: string, - projectGraph = readCachedProjectGraph() + projectGraph: ProjectGraph = readCachedProjectGraph() ): [projectDirs: string[], warnings: string[]] { if (!projectGraph.nodes[projectName]) { throw new Error( diff --git a/packages/nx/tsconfig.spec.json b/packages/nx/tsconfig.spec.json index e4ae1d418cfc5f..275b62a07bcb51 100644 --- a/packages/nx/tsconfig.spec.json +++ b/packages/nx/tsconfig.spec.json @@ -11,6 +11,8 @@ "**/*.spec.tsx", "**/*.spec.js", "**/*.spec.jsx", + "**/*.fixture.js", + "**/*.fixture.ts", "**/*.d.ts", "./src/internal-testing-utils/**/*.ts", "jest.config.ts"