fix(nextjs): Moving a library using @nx/workspace:move should update … (#23311)

## Current
When you using `@nx/workspace:move` after create a Next.js library the
server path remains unchanged.

## Expected
The server path is changed as well as the main entry point for the
library path.

Fixes: #20821
This commit is contained in:
Nicholas Cunningham 2024-05-13 12:48:27 -06:00 committed by GitHub
parent 61255ce540
commit d879279fc1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 65 additions and 0 deletions

View File

@ -493,4 +493,41 @@ export MyExtendedClass extends MyClass {};`
'@proj/my-source': ['my-destination/src/index.ts'], '@proj/my-source': ['my-destination/src/index.ts'],
}); });
}); });
it("should update project ref in the root tsconfig file if it contains a secondary entry point for Next.js's server", async () => {
await libraryGenerator(tree, {
name: 'my-source',
projectNameAndRootFormat: 'as-provided',
});
tree.write('my-source/src/server.ts', '');
updateJson(tree, '/tsconfig.base.json', (json) => {
json.compilerOptions.paths['@proj/my-source/server'] = [
'my-source/src/server.ts',
];
return json;
});
const projectConfig = readProjectConfiguration(tree, 'my-source');
updateImports(
tree,
await normalizeSchema(
tree,
{
...schema,
updateImportPath: false,
},
projectConfig
),
projectConfig
);
const tsConfig = readJson(tree, '/tsconfig.base.json');
expect(tsConfig.compilerOptions.paths).toEqual({
'@proj/my-source': ['my-destination/src/index.ts'],
'@proj/my-source/server': ['my-destination/src/server.ts'],
});
});
}); });

View File

@ -47,6 +47,7 @@ export function updateImports(
let tsConfig: any; let tsConfig: any;
let mainEntryPointImportPath: string; let mainEntryPointImportPath: string;
let secondaryEntryPointImportPaths: string[]; let secondaryEntryPointImportPaths: string[];
let serverEntryPointImportPath: string;
if (tree.exists(tsConfigPath)) { if (tree.exists(tsConfigPath)) {
tsConfig = readJson(tree, tsConfigPath); tsConfig = readJson(tree, tsConfigPath);
const sourceRoot = const sourceRoot =
@ -68,6 +69,19 @@ export function updateImports(
!x.startsWith(ensureTrailingSlash(sourceRoot)) !x.startsWith(ensureTrailingSlash(sourceRoot))
) )
); );
// Next.js libs have a custom path for the server we need to update that as well
// example "paths": { @acme/lib/server : ['libs/lib/src/server.ts'] }
serverEntryPointImportPath = Object.keys(
tsConfig.compilerOptions?.paths ?? {}
).find((path) =>
tsConfig.compilerOptions.paths[path].some(
(x) =>
x.startsWith(ensureTrailingSlash(sourceRoot)) &&
x.includes('server') &&
path.endsWith('server')
)
);
} }
mainEntryPointImportPath ??= normalizePathSlashes( mainEntryPointImportPath ??= normalizePathSlashes(
@ -94,6 +108,20 @@ export function updateImports(
})), })),
]; ];
if (
serverEntryPointImportPath &&
schema.importPath &&
serverEntryPointImportPath.startsWith(mainEntryPointImportPath)
) {
projectRefs.push({
from: serverEntryPointImportPath,
to: serverEntryPointImportPath.replace(
mainEntryPointImportPath,
schema.importPath
),
});
}
for (const projectRef of projectRefs) { for (const projectRef of projectRefs) {
if (schema.updateImportPath && projectRef.to) { if (schema.updateImportPath && projectRef.to) {
const replaceProjectRef = new RegExp(projectRef.from, 'g'); const replaceProjectRef = new RegExp(projectRef.from, 'g');