fix(core): update yarn-parser to handle yarn v4 syntax (#29067)
Update the yarn-parser so that yarn.lock file generation works with yarn
v4
## Current Behavior
yarn.lock is not correctly created when using yarn v4
```
"":
version: 1.22.8
resolution: "resolve@patch:resolve@npm%3A1.22.8#optional!builtin<compat/resolve>::version=1.22.8&hash=c3c19d"
dependencies:
is-core-module: "npm:^2.13.0"
path-parse: "npm:^1.0.7"
supports-preserve-symlinks-flag: "npm:^1.0.0"
bin:
resolve: bin/resolve
checksum: 0446f024439cd2e50c6c8fa8ba77eaa8370b4180f401a96abf3d1ebc770ac51c1955e12764cde449fde3fff480a61f84388e3505ecdbab778f4bef5f8212c729
languageName: node
linkType: hard
```
## Expected Behavior
yarn.lock should be created correctly with no missing keys
## Related Issue(s)
<!-- Please link the issue being fixed so it gets closed when this is
merged. -->
Fixes #19881
This commit is contained in:
parent
09800062e7
commit
efa5ba2bb6
@ -2678,6 +2678,131 @@ __metadata:
|
|||||||
"
|
"
|
||||||
`);
|
`);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should keep the builtin patch for yarn 4 patch syntax', () => {
|
||||||
|
const lockFile = `# This file is generated by running "yarn install" inside your project.
|
||||||
|
# Manual changes might be lost - proceed with caution!
|
||||||
|
|
||||||
|
__metadata:
|
||||||
|
version: 6
|
||||||
|
cacheKey: 8
|
||||||
|
|
||||||
|
"resolve@npm:1.22.8, resolve@npm:^1.1.7, resolve@npm:^1.10.0, resolve@npm:^1.12.0, resolve@npm:^1.14.2, resolve@npm:^1.19.0, resolve@npm:^1.20.0, resolve@npm:^1.22.1, resolve@npm:^1.22.4, resolve@npm:^1.22.8, resolve@npm:^1.9.0":
|
||||||
|
version: 1.22.8
|
||||||
|
resolution: "resolve@npm:1.22.8"
|
||||||
|
dependencies:
|
||||||
|
is-core-module: "npm:^2.13.0"
|
||||||
|
path-parse: "npm:^1.0.7"
|
||||||
|
supports-preserve-symlinks-flag: "npm:^1.0.0"
|
||||||
|
bin:
|
||||||
|
resolve: bin/resolve
|
||||||
|
checksum: 10/c473506ee01eb45cbcfefb68652ae5759e092e6b0fb64547feadf9736a6394f258fbc6f88e00c5ca36d5477fbb65388b272432a3600fa223062e54333c156753
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
|
"resolve@patch:resolve@npm%3A1.22.8#optional!builtin<compat/resolve>, resolve@patch:resolve@npm%3A^1.1.7#optional!builtin<compat/resolve>, resolve@patch:resolve@npm%3A^1.10.0#optional!builtin<compat/resolve>, resolve@patch:resolve@npm%3A^1.12.0#optional!builtin<compat/resolve>, resolve@patch:resolve@npm%3A^1.14.2#optional!builtin<compat/resolve>, resolve@patch:resolve@npm%3A^1.19.0#optional!builtin<compat/resolve>, resolve@patch:resolve@npm%3A^1.20.0#optional!builtin<compat/resolve>, resolve@patch:resolve@npm%3A^1.22.1#optional!builtin<compat/resolve>, resolve@patch:resolve@npm%3A^1.22.4#optional!builtin<compat/resolve>, resolve@patch:resolve@npm%3A^1.22.8#optional!builtin<compat/resolve>, resolve@patch:resolve@npm%3A^1.9.0#optional!builtin<compat/resolve>":
|
||||||
|
version: 1.22.8
|
||||||
|
resolution: "resolve@patch:resolve@npm%3A1.22.8#optional!builtin<compat/resolve>::version=1.22.8&hash=c3c19d"
|
||||||
|
dependencies:
|
||||||
|
is-core-module: "npm:^2.13.0"
|
||||||
|
path-parse: "npm:^1.0.7"
|
||||||
|
supports-preserve-symlinks-flag: "npm:^1.0.0"
|
||||||
|
bin:
|
||||||
|
resolve: bin/resolve
|
||||||
|
checksum: 10/f345cd37f56a2c0275e3fe062517c650bb673815d885e7507566df589375d165bbbf4bdb6aa95600a9bc55f4744b81f452b5a63f95b9f10a72787dba3c90890a
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
`;
|
||||||
|
|
||||||
|
const packageJson: PackageJson = {
|
||||||
|
name: '@my-ns/example',
|
||||||
|
version: '0.0.1',
|
||||||
|
type: 'commonjs',
|
||||||
|
dependencies: {
|
||||||
|
resolve: '^1.12.0',
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
const hash = uniq('mock-hash');
|
||||||
|
const externalNodes = getYarnLockfileNodes(lockFile, hash, packageJson);
|
||||||
|
const pg = {
|
||||||
|
nodes: {},
|
||||||
|
dependencies: {},
|
||||||
|
externalNodes,
|
||||||
|
};
|
||||||
|
const ctx: CreateDependenciesContext = {
|
||||||
|
projects: {},
|
||||||
|
externalNodes,
|
||||||
|
fileMap: {
|
||||||
|
nonProjectFiles: [],
|
||||||
|
projectFileMap: {},
|
||||||
|
},
|
||||||
|
filesToProcess: {
|
||||||
|
nonProjectFiles: [],
|
||||||
|
projectFileMap: {},
|
||||||
|
},
|
||||||
|
nxJsonConfiguration: null,
|
||||||
|
workspaceRoot: '/virtual',
|
||||||
|
};
|
||||||
|
const dependencies = getYarnLockfileDependencies(lockFile, hash, ctx);
|
||||||
|
|
||||||
|
const builder = new ProjectGraphBuilder(pg);
|
||||||
|
for (const dep of dependencies) {
|
||||||
|
builder.addDependency(
|
||||||
|
dep.source,
|
||||||
|
dep.target,
|
||||||
|
dep.type,
|
||||||
|
'sourceFile' in dep ? dep.sourceFile : null
|
||||||
|
);
|
||||||
|
}
|
||||||
|
const graph = builder.getUpdatedProjectGraph();
|
||||||
|
|
||||||
|
const prunedGraph = pruneProjectGraph(graph, packageJson);
|
||||||
|
const result = stringifyYarnLockfile(prunedGraph, lockFile, packageJson);
|
||||||
|
expect(result).toMatchInlineSnapshot(`
|
||||||
|
"# This file is generated by running "yarn install" inside your project.
|
||||||
|
# Manual changes might be lost - proceed with caution!
|
||||||
|
|
||||||
|
__metadata:
|
||||||
|
version: 6
|
||||||
|
cacheKey: 8
|
||||||
|
|
||||||
|
"@my-ns/example@workspace:.":
|
||||||
|
version: 0.0.0-use.local
|
||||||
|
resolution: "@my-ns/example@workspace:."
|
||||||
|
dependencies:
|
||||||
|
resolve: ^1.12.0
|
||||||
|
languageName: unknown
|
||||||
|
linkType: soft
|
||||||
|
|
||||||
|
"resolve@npm:^1.12.0":
|
||||||
|
version: 1.22.8
|
||||||
|
resolution: "resolve@npm:1.22.8"
|
||||||
|
dependencies:
|
||||||
|
is-core-module: "npm:^2.13.0"
|
||||||
|
path-parse: "npm:^1.0.7"
|
||||||
|
supports-preserve-symlinks-flag: "npm:^1.0.0"
|
||||||
|
bin:
|
||||||
|
resolve: bin/resolve
|
||||||
|
checksum: 10/c473506ee01eb45cbcfefb68652ae5759e092e6b0fb64547feadf9736a6394f258fbc6f88e00c5ca36d5477fbb65388b272432a3600fa223062e54333c156753
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
|
"resolve@patch:resolve@npm%3A^1.12.0#optional!builtin<compat/resolve>":
|
||||||
|
version: 1.22.8
|
||||||
|
resolution: "resolve@patch:resolve@npm%3A1.22.8#optional!builtin<compat/resolve>::version=1.22.8&hash=c3c19d"
|
||||||
|
dependencies:
|
||||||
|
is-core-module: "npm:^2.13.0"
|
||||||
|
path-parse: "npm:^1.0.7"
|
||||||
|
supports-preserve-symlinks-flag: "npm:^1.0.0"
|
||||||
|
bin:
|
||||||
|
resolve: bin/resolve
|
||||||
|
checksum: 10/f345cd37f56a2c0275e3fe062517c650bb673815d885e7507566df589375d165bbbf4bdb6aa95600a9bc55f4744b81f452b5a63f95b9f10a72787dba3c90890a
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
"
|
||||||
|
`);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@ -474,9 +474,10 @@ function mapSnapshots(
|
|||||||
const packageName = key.slice(0, key.indexOf('@', 1));
|
const packageName = key.slice(0, key.indexOf('@', 1));
|
||||||
let normalizedKey = key;
|
let normalizedKey = key;
|
||||||
if (isBerry && key.includes('@patch:') && key.includes('#')) {
|
if (isBerry && key.includes('@patch:') && key.includes('#')) {
|
||||||
|
const regEx = new RegExp(`@patch:${packageName}@(npm%3A)?(.*)$`);
|
||||||
normalizedKey = key
|
normalizedKey = key
|
||||||
.slice(0, key.indexOf('#'))
|
.slice(0, key.indexOf('#'))
|
||||||
.replace(`@patch:${packageName}@`, '@npm:');
|
.replace(regEx, '@npm:$2');
|
||||||
}
|
}
|
||||||
if (
|
if (
|
||||||
!existingKeys.get(packageName) ||
|
!existingKeys.get(packageName) ||
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user