@antongolub/lockfile 0.0.0-snapshot.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +109 -0
- package/package.json +54 -0
- package/target/es6/common.d.ts +1 -0
- package/target/es6/index.d.ts +5 -0
- package/target/es6/index.js.map +7 -0
- package/target/es6/index.mjs +16 -0
- package/target/es6/interface.d.ts +63 -0
- package/target/es6/manifest.d.ts +0 -0
- package/target/es6/npm-1.d.ts +19 -0
- package/target/es6/npm-2.d.ts +0 -0
- package/target/es6/util.d.ts +5 -0
- package/target/es6/yarn-1.d.ts +12 -0
- package/target/es6/yarn-5.d.ts +18 -0
- package/target/es6/yarn-6.d.ts +0 -0
- package/target/es6/yarn-7.d.ts +0 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2021 Anton Golub
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
# lockfile
|
|
2
|
+
Read, write, and convert npm (v1, v2) and yarn (classic and berry) lockfiles in any directions with reasonable losses.
|
|
3
|
+
|
|
4
|
+
### Motivation
|
|
5
|
+
Every package manager brings its own philosophy of how to describe, store and control projects dependencies.
|
|
6
|
+
This is awesome for developers, but literally becomes a ~~pain in *** ***~~ headache for isec, devops and release engineers.
|
|
7
|
+
This lib is a naive attempt to build a pm-independent, generic, extensible and reliable deps representation.
|
|
8
|
+
|
|
9
|
+
The package manifest contains its own deps requirements, the lockfile defines the deps resolution snapshot<sup>*</sup>,
|
|
10
|
+
so both of them are required to build a dependency graph. We can convert this data into a normalized representation for further analysis and processing (for example, to fix vulnerabilities).
|
|
11
|
+
And then, if necessary, convert back to the original format.
|
|
12
|
+
|
|
13
|
+
### Status
|
|
14
|
+
⚠️ Initial draft. Alpha-version
|
|
15
|
+
|
|
16
|
+
### Getting started
|
|
17
|
+
#### Install
|
|
18
|
+
```shell
|
|
19
|
+
yarn add @antongolub/lockfile
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
#### Usage
|
|
23
|
+
```js
|
|
24
|
+
import { parse, format } from '@antongolub/lockfile'
|
|
25
|
+
|
|
26
|
+
const parsed = parse({
|
|
27
|
+
lockfile: './yarn.lock',
|
|
28
|
+
workspaces: {'': './package.json', 'foo': './packages/foo/package.json'},
|
|
29
|
+
})
|
|
30
|
+
|
|
31
|
+
// output
|
|
32
|
+
{
|
|
33
|
+
entries: {
|
|
34
|
+
'@babel/code-frame@7.10.4': {
|
|
35
|
+
name: '@babel/code-frame',
|
|
36
|
+
version: '7.10.4',
|
|
37
|
+
scope: 'prod/dev/peer/opt',
|
|
38
|
+
integrities: {
|
|
39
|
+
sha512: 'hashsum',
|
|
40
|
+
sha256: '...',
|
|
41
|
+
sha1: '...',
|
|
42
|
+
md5: '...'
|
|
43
|
+
},
|
|
44
|
+
reference: {
|
|
45
|
+
sourceType: 'npm/git/file/workspace'
|
|
46
|
+
source: 'uri://remote/address',
|
|
47
|
+
linkType: 'hard/soft',
|
|
48
|
+
link: '<root>path/to/package'
|
|
49
|
+
},
|
|
50
|
+
dependencies: {
|
|
51
|
+
'@babel/highlight': '^7.10.4'
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
...
|
|
55
|
+
},
|
|
56
|
+
meta: {
|
|
57
|
+
lockfile: {
|
|
58
|
+
type: 'yarn',
|
|
59
|
+
version: '5', // metadata format version
|
|
60
|
+
},
|
|
61
|
+
packageJson: {...},
|
|
62
|
+
workspaces: {
|
|
63
|
+
patterns: ['./packages/*'],
|
|
64
|
+
packages: {
|
|
65
|
+
'@qiwi/pijma-core': '<root>/packages/core/package.json'
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
const data = format({
|
|
72
|
+
...parsed,
|
|
73
|
+
lockfileType: 'yarn-2'
|
|
74
|
+
})
|
|
75
|
+
// output
|
|
76
|
+
`
|
|
77
|
+
# This file is generated by running "yarn install" inside your project.
|
|
78
|
+
# Manual changes might be lost - proceed with caution!
|
|
79
|
+
|
|
80
|
+
__metadata:
|
|
81
|
+
version: 5
|
|
82
|
+
cacheKey: 8
|
|
83
|
+
|
|
84
|
+
"@babel/code-frame@npm:7.10.4":
|
|
85
|
+
version: 7.10.4
|
|
86
|
+
resolution: "@babel/code-frame@npm:7.10.4"
|
|
87
|
+
...
|
|
88
|
+
`
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### Lockfile (meta) versions
|
|
92
|
+
| Package manager | Meta format | Supported |
|
|
93
|
+
|------------------|-------------|-----------|
|
|
94
|
+
| npm <7 | 1 | x |
|
|
95
|
+
| npm >=7 | 2 | |
|
|
96
|
+
| yarn 1 (classic) | 1 | x |
|
|
97
|
+
| yarn 3 | 5, 6 | x |
|
|
98
|
+
| yarn 4 | 6, 7 | |
|
|
99
|
+
|
|
100
|
+
### Caveats
|
|
101
|
+
* Only `npm` links are supported for now
|
|
102
|
+
* npm1: `optional: true` label is not supported by lockfile formatter
|
|
103
|
+
|
|
104
|
+
### Inspired by
|
|
105
|
+
* [synp](https://github.com/imsnif/synp)
|
|
106
|
+
* [snyk-nodejs-lockfile-parser](https://github.com/snyk/nodejs-lockfile-parser)
|
|
107
|
+
|
|
108
|
+
### License
|
|
109
|
+
[MIT](./LICENSE)
|
package/package.json
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@antongolub/lockfile",
|
|
3
|
+
"version": "0.0.0-snapshot.0",
|
|
4
|
+
"publishConfig": {
|
|
5
|
+
"access": "public"
|
|
6
|
+
},
|
|
7
|
+
"description": "Read, write, and convert npm (v1, v2) and yarn (classic and berry) lockfiles in any directions with reasonable losses.",
|
|
8
|
+
"main": "./target/es6/index.mjs",
|
|
9
|
+
"type": "module",
|
|
10
|
+
"dependencies": {
|
|
11
|
+
"js-yaml": "^4.1.0"
|
|
12
|
+
},
|
|
13
|
+
"devDependencies": {
|
|
14
|
+
"@types/js-yaml": "^4.0.5",
|
|
15
|
+
"esbuild": "^0.15.12",
|
|
16
|
+
"esbuild-node-externals": "^1.5.0",
|
|
17
|
+
"tsc-esm-fix": "^2.20.5",
|
|
18
|
+
"tsm": "^2.2.2",
|
|
19
|
+
"typescript": "^4.8.4",
|
|
20
|
+
"uvu": "^0.5.6"
|
|
21
|
+
},
|
|
22
|
+
"scripts": {
|
|
23
|
+
"build": "yarn build:es6 && yarn build:libdef && yarn build:esmfix",
|
|
24
|
+
"build:es6": "node ./build.js",
|
|
25
|
+
"build:libdef": "tsc --emitDeclarationOnly --outDir target/es6",
|
|
26
|
+
"build:esmfix": "tsc-esm-fix --target=target/es6 --ext=.mjs",
|
|
27
|
+
"test": "uvu -r tsm -i helpers 'src/test/ts/'",
|
|
28
|
+
"publish:snapshot": "npm publish --no-git-tag-version --tag snapshot"
|
|
29
|
+
},
|
|
30
|
+
"files": [
|
|
31
|
+
"target",
|
|
32
|
+
"LICENSE"
|
|
33
|
+
],
|
|
34
|
+
"repository": {
|
|
35
|
+
"type": "git",
|
|
36
|
+
"url": "git+https://github.com/antongolub/lockfile.git"
|
|
37
|
+
},
|
|
38
|
+
"keywords": [
|
|
39
|
+
"lock",
|
|
40
|
+
"lockfile",
|
|
41
|
+
"yarn",
|
|
42
|
+
"yarnlock",
|
|
43
|
+
"yarn.lock",
|
|
44
|
+
"package-lock",
|
|
45
|
+
"npm"
|
|
46
|
+
],
|
|
47
|
+
"author": "Anton Golub <antongolub@antongolub.com>",
|
|
48
|
+
"license": "MIT",
|
|
49
|
+
"bugs": {
|
|
50
|
+
"url": "https://github.com/antongolub/lockfile/issues"
|
|
51
|
+
},
|
|
52
|
+
"homepage": "https://github.com/antongolub/lockfile#readme",
|
|
53
|
+
"packageManager": "yarn@3.1.1"
|
|
54
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const normalizeOptions: () => void;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { parse as parseNpm1, format as formatNpm1 } from './npm-1';
|
|
2
|
+
import { parse as parseYarn1, format as formatYarn1 } from './yarn-1';
|
|
3
|
+
import { parse as parseYarn5, format as formatYarn5 } from './yarn-5';
|
|
4
|
+
export declare const foo = "bar";
|
|
5
|
+
export { parseNpm1, formatNpm1, parseYarn1, formatYarn1, parseYarn5, formatYarn5 };
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/main/ts/index.ts", "../../src/main/ts/util.ts", "../../src/main/ts/npm-1.ts", "../../src/main/ts/yarn-1.ts", "../../src/main/ts/yarn-5.ts"],
|
|
4
|
+
"sourcesContent": ["import {parse as parseNpm1, format as formatNpm1} from './npm-1'\nimport {parse as parseYarn1, format as formatYarn1} from './yarn-1'\nimport {parse as parseYarn5, format as formatYarn5} from './yarn-5'\n\nexport const foo = 'bar'\n\nexport {\n parseNpm1,\n formatNpm1,\n parseYarn1,\n formatYarn1,\n parseYarn5,\n formatYarn5\n}\n", "import {THashes} from \"./interface\";\n\nexport const parseIntegrity = (integrity: string): THashes =>\n integrity\n ? integrity.split(' ').reduce<THashes>((m, item) => {\n const [k, v] = item.split('-')\n if (k === 'sha512' || k === 'sha256' || k === 'sha1' || k === 'checksum') {\n m[k] = v\n } else if (!v){\n m['checksum'] = k\n }\n\n return m\n }, {})\n : {}\n\nexport const formatIntegrity = (hashes: THashes): string => {\n const checksum = hashes['checksum']\n if (checksum) {\n return checksum\n }\n\n return Object.entries(hashes).map(([k, v]) => `${k}-${v}`).join(' ')\n}\n\nexport const sortObject = <T extends Record<string, any>>(unordered: T): T =>\n Object.entries({...unordered})\n .sort(([a], [b]) => a > b ? 1 : -1)\n .reduce((obj, [key, value]: [keyof T, T[keyof T]]) => {\n obj[key] = value\n return obj\n },\n flushObject(unordered) as T,\n )\n\nexport const flushObject = (obj: Record<string, any>) => {\n for (const key in obj) {\n delete obj[key]\n }\n\n return obj\n}", "import {TDependencies, THashes, TLockfileEntry, TManifest, TSnapshot} from './interface'\nimport {parseIntegrity, sortObject} from './util'\nimport fs from 'fs'\n\nexport type TNpm1LockfileEntry = {\n version: string\n resolved: string\n integrity: string\n dev?: boolean\n requires?: Record<string, string>\n dependencies?: TNpm1LockfileDeps\n}\n\nexport type TNpm1LockfileDeps = Record<string, TNpm1LockfileEntry>\n\nexport type TNpm1Lockfile = {\n lockfileVersion: 1\n name: string\n version: string\n requires?: true\n dependencies: TNpm1LockfileDeps\n}\n\ninterface TDepTree {\n dependencies?: Record<string, TDepTree>\n version: string\n requires?: any\n}\n\nexport const parse = async (lockfile: string, pkg: string): Promise<TSnapshot> => {\n const lf: TNpm1Lockfile = await JSON.parse(lockfile)\n const manifest: TManifest = await JSON.parse(pkg)\n const workspaces = {\n \"\": {\n name: manifest.name,\n path: '.',\n manifest\n }\n }\n const entries: Record<string, TLockfileEntry> = {\n \"\": {\n name: manifest.name,\n version: manifest.version,\n dependencies: {\n ...manifest.dependencies,\n ...manifest.devDependencies,\n },\n hashes: {},\n ranges: [],\n }\n }\n const getClosestVersion = (name: string, ...deps: TNpm1LockfileDeps[]): string =>\n deps.find((dep) => dep[name])?.[name]?.version as string\n\n const upsertEntry = (name: string, version: string, data: Partial<TLockfileEntry> = {}): TLockfileEntry => {\n const key = `${name}@${version}`\n if (!entries[key]) {\n // @ts-ignore\n entries[key] = {name, version, ranges: []}\n }\n return Object.assign(entries[key], data)\n }\n const pushRange = (name: string, version: string, range: string): void => {\n const entry = upsertEntry(name, version)\n\n if (!entry.ranges.includes(range)) {\n entry.ranges.push(range)\n entry.ranges.sort()\n }\n }\n const extractRanges = (deps?: TDependencies, ...parents: TNpm1LockfileDeps[]) => deps && Object.entries(deps).forEach(([_name, range]) => {\n const _version = getClosestVersion(_name, ...parents)\n pushRange(_name, _version, range)\n })\n const extractEntries = (deps?: TNpm1LockfileDeps, ...parents: TNpm1LockfileDeps[]) => deps && Object.entries(deps).forEach(([name, entry]) => {\n const requires = entry.requires || entry.dependencies && Object.entries(entry.dependencies).reduce((m, [name, {version}]) => {\n m[name] = version\n return m\n }, {} as Record<string, string>)\n\n upsertEntry(name, entry.version, {\n hashes: parseIntegrity(entry.integrity),\n dependencies: requires\n })\n\n extractEntries(entry.dependencies, deps, ...parents)\n extractRanges(requires, entry.dependencies || {}, deps, ...parents)\n })\n\n extractEntries(lf.dependencies)\n extractRanges(entries[\"\"].dependencies, lf.dependencies || {})\n\n return {\n format: 'npm-1',\n entries: sortObject(entries),\n workspaces,\n }\n}\n\n\nconst formatIntegrity = (hashes: THashes): string => Object.entries(hashes).map(([key, value]) => `${key}-${value}`).join(' ')\n\nconst createIndex = () => {\n const prod = new Set()\n const deps = new Map()\n\n return {\n prod,\n deps,\n getDeps (entry: TLockfileEntry): TLockfileEntry[] {\n if (!deps.has(entry)) { deps.set(entry, [])}\n return deps.get(entry)\n }\n }\n}\n\nconst isProd = (manifest: TManifest, name: string): boolean => !!manifest.dependencies?.[name]\n\nexport const format = async (snap: TSnapshot): Promise<string> => {\n const root = snap.workspaces[''].manifest\n const entries: TLockfileEntry[]= Object.values(snap.entries)\n const idx = createIndex()\n\n entries.forEach((entry) => {\n entry.dependencies && Object.entries(entry.dependencies).forEach(([_name, range]) => {\n const target = entries.find(({name, ranges}) => name === _name && ranges.includes(range))\n if (target) {\n idx.getDeps(entry).push(target)\n }\n })\n })\n\n const deptree: TLockfileEntry[][] = []\n const fillTree = (entry: TLockfileEntry, chain: TLockfileEntry[] = []) => {\n const deps = idx.getDeps(entry)\n deps.forEach(c => isProd(root, chain[0]?.name || c.name) && idx.prod.add(c))\n\n deps\n .sort((a, b) =>\n idx.prod.has(a) && !idx.prod.has(b)\n ? -1\n : idx.prod.has(b) && !idx.prod.has(a)\n ? 1\n : a.name.localeCompare(b.name)\n )\n\n deps.forEach((dep) => deptree.push([...chain, dep]))\n deps.forEach((dep) => fillTree(dep, [...chain, dep]))\n }\n\n const getEntry = (name: string, version: string) => entries.find((e) => e.name === name && e.version === version)\n fillTree(getEntry(root.name, root.version)!)\n\n const formatNpm1LockfileEntry = (entry: TLockfileEntry): TNpm1LockfileEntry => {\n const {name, version, hashes} = entry\n const _name = name.slice(name.indexOf('/') + 1)\n const _entry: TNpm1LockfileDeps[string] = {\n version,\n resolved: `https://registry.npmjs.org/${name}/-/${_name}-${version}.tgz`,\n integrity: formatIntegrity(hashes)\n }\n\n if (!idx.prod.has(entry)) {\n _entry.dev = true\n }\n\n if (entry.dependencies) {\n _entry.requires = entry.dependencies\n }\n\n return _entry\n }\n\n const lf: TNpm1Lockfile = {\n name: root.name,\n version: root.version,\n lockfileVersion: 1,\n requires: true,\n dependencies: {}\n }\n const nmtree = lf\n const nodes: TDepTree[] = [nmtree]\n const processEntry = (name: string, version: string, parents: TNpm1LockfileEntry[]) => {\n const entry = getEntry(name, version)!\n const deps = idx.getDeps(entry)\n const queue: [string, string, TNpm1LockfileEntry[]][] = []\n\n deps.forEach((e) => {\n const closestIndex = parents.findIndex((p) => p.dependencies?.[e.name])\n const closest = parents[closestIndex]\n if (closest?.dependencies?.[e.name].version === e.version) {\n return\n }\n\n const _entry = formatNpm1LockfileEntry(e)\n const _parents = [_entry, ...parents]\n const parent = closest\n ? _parents[closestIndex]\n : _parents[_parents.length - 1]\n\n if (!parent.dependencies) {\n parent.dependencies = {}\n }\n parent.dependencies[e.name] = _entry\n\n nodes.push(parent)\n queue.push([e.name, e.version, _parents])\n })\n\n queue.forEach(([name, version, parents]) => processEntry(name, version, parents))\n }\n\n deptree.forEach((chain) => {\n const entry = chain[chain.length - 1]\n const {name} = entry\n\n if (!nmtree.dependencies[name]) {\n nmtree.dependencies[name] = formatNpm1LockfileEntry(entry)\n }\n })\n Object.entries(nmtree.dependencies).forEach(([name, entry]) => processEntry(name, entry.version, [entry, nmtree] as TNpm1LockfileEntry[]))\n\n nodes.forEach((node) => {\n sortObject(node.dependencies || {})\n\n if (node.requires) {\n const snap1 = Object.entries(node.requires).map(([name, range]) => `${name}@${range}`).join('')\n const snap2 = Object.entries(node.dependencies || {}).map(([name, {version}]) => `${name}@${version}`).join('')\n\n if (snap1 === snap2) {\n delete node.requires\n }\n }\n })\n\n fs.writeFileSync('temp/test.json', JSON.stringify(lf, null, 2))\n fs.writeFileSync('temp/tree.json', JSON.stringify(\n deptree.map(c => c.map(e => `${e.name}@${e.version}`).join(' > ')),\n null,\n 2\n ))\n\n return JSON.stringify(lf, null, 2)\n}\n", "import {load, dump} from 'js-yaml'\nimport {TDependencies, TSnapshot, THashes} from './interface'\n\nconst kvEntryPattern = /^(\\s+)\"?([^\"]+)\"?\\s\"?([^\"]+)\"?$/\n\nexport type TYarn1Lockfile = Record<string, {\n version: string\n resolved: string\n integrity: string\n dependencies?: TDependencies\n optionalDependencies?: TDependencies\n}>\n\nexport const preparse = (value: string): TYarn1Lockfile => {\n const lines = value.split('\\n')\n const _value = lines.map((line) => {\n if (line.startsWith('#')) {\n return ''\n }\n\n // \"@babel/code-frame@^7.0.0\", \"@babel/code-frame@^7.12.13\"\n if (line.length !==0 && line.charAt(0) !== ' ') {\n return `\"${line.replaceAll('\"', '').slice(0, -1)}\":`\n }\n\n const [,p,k,v]: string[] = line.match(kvEntryPattern) || []\n if (line.match(kvEntryPattern)) {\n return `${p}\"${k}\": \"${v}\"`\n }\n\n return line\n }, '').join('\\n')\n\n return load(_value) as TYarn1Lockfile\n}\n\nconst parseIntegrity = (integrity: string): THashes =>\n integrity.split(' ').reduce<THashes>((m, item) => {\n const [k, v] = item.split('-')\n if (k === 'sha512' || k === 'sha256' || k === 'sha1' || k === 'checksum') {\n m[k] = v\n }\n return m\n }, {})\n\nexport const parse = async (value: string): Promise<TSnapshot> => {\n const raw = await preparse(value)\n const snapshot: TSnapshot = {\n entries: {},\n workspaces: {},\n format: 'yarn-1',\n }\n\n Object.entries(raw).forEach((value) => {\n const [_key, _entry] = value\n const chunks = _key.split(', ')\n const ranges = chunks.map(r => r.slice(r.lastIndexOf('@') + 1)).sort()\n const { version, integrity, dependencies, optionalDependencies, resolved: source } = _entry\n const name = chunks[0].slice(0, chunks[0].lastIndexOf('@'))\n const key = `${name}@${version}`\n const hashes = parseIntegrity(integrity)\n\n snapshot.entries[key] = {\n name,\n version,\n ranges,\n hashes,\n dependencies,\n optionalDependencies,\n source,\n }\n })\n\n return snapshot\n}\n\nexport const preformat = (value: TSnapshot): TYarn1Lockfile => {\n const lf: TYarn1Lockfile = {}\n\n Object.values(value.entries).forEach((entry) => {\n const { name, version, ranges, hashes, dependencies, optionalDependencies, source } = entry\n const key = ranges.map(r => `${name}@${r}`).join(', ')\n const integrity = Object.entries(hashes).map(([k, v]) => `${k}-${v}`).join(' ')\n\n lf[key] = {\n version,\n resolved: source as string,\n integrity,\n dependencies,\n optionalDependencies,\n }\n })\n\n return lf\n}\n\nexport const format = (value: TSnapshot): string => {\n const lf = preformat(value)\n const lines: string[] = dump(lf, {\n quotingType: '\"',\n flowLevel: -1,\n lineWidth: -1,\n forceQuotes: true\n }).split('\\n')\n const _value = lines.map((line) => {\n // \"@babel/code-frame@^7.0.0\", \"@babel/code-frame@^7.12.13\"\n if (line.length !==0 && line.charAt(0) !== ' ') {\n const chunks = line.slice(0, -1).replaceAll('\"', '').split(', ').map(chunk => chunk.startsWith('@') || chunk.includes(' ') ? `\"${chunk}\"` : chunk)\n return `\\n${chunks.join(', ')}:`\n }\n\n if (line.startsWith(' integrity')) {\n const _line = line.replace(':', '')\n\n return line.includes('= ') // multiple hashes\n ? _line.replaceAll('\"integrity\"', 'integrity')\n : _line.replaceAll('\"', '')\n }\n\n if (line.endsWith('ependencies:')) {\n return line\n }\n\n return line.replace(':', '')\n }, '').join('\\n')\n\n return `# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.\n# yarn lockfile v1\n\n${_value}`\n}\n", "// https://github.com/yarnpkg/berry/commit/2f9e8073d15745f9d53e6b8b42fa9c81eb143d54\n\nimport {load, dump} from 'js-yaml'\nimport {TDependencies, TDependenciesMeta, TSnapshot} from './interface'\nimport {parseIntegrity} from './util'\n\nexport type TYarn5Lockfile = Record<string, {\n version: string\n resolution: string\n conditions?: string\n checksum: string\n languageName: string\n linkType: string\n dependencies?: TDependencies\n dependenciesMeta?: TDependenciesMeta\n optionalDependencies?: TDependencies\n peerDependencies?: TDependencies\n peerDependenciesMeta?: TDependenciesMeta\n bin?: Record<string, string>\n}>\n\nexport const parse = async (lockfile: string, pkg: string): Promise<TSnapshot> => {\n const snapshot: TSnapshot = {\n entries: {},\n workspaces: {},\n format: 'yarn-5',\n }\n\n const raw = load(lockfile) as TYarn5Lockfile\n\n delete raw.__metadata\n\n Object.entries(raw).forEach((value) => {\n const [_key, _entry] = value\n const chunks = _key.split(', ')\n const ranges = chunks.map(r => r.slice(r.lastIndexOf('@') + 1)).sort()\n const { version, checksum, dependencies, dependenciesMeta, optionalDependencies, peerDependencies, peerDependenciesMeta, resolution: source, bin, conditions } = _entry\n const name = chunks[0].slice(0, chunks[0].lastIndexOf('@'))\n const key = `${name}@${version}`\n const hashes = parseIntegrity(checksum)\n\n snapshot.entries[key] = {\n name,\n version,\n ranges,\n hashes,\n dependencies,\n dependenciesMeta,\n optionalDependencies,\n peerDependencies,\n peerDependenciesMeta,\n source,\n bin,\n conditions,\n }\n })\n\n return snapshot\n}\n\nexport const preformat = (value: TSnapshot): TYarn5Lockfile => {\n const lf: TYarn5Lockfile = {}\n\n Object.values(value.entries).forEach((entry) => {\n const { name, version, ranges, hashes: {checksum}, dependencies, dependenciesMeta, optionalDependencies, peerDependencies, peerDependenciesMeta, source, bin, conditions } = entry\n const key = ranges.map(r => `${name}@${r}`).join(', ')\n const isLocal = version === '0.0.0-use.local'\n const languageName = isLocal ? 'unknown' : 'node'\n const linkType = isLocal ? 'soft' : 'hard'\n\n lf[key] = {\n version,\n resolution: source as string,\n dependencies,\n dependenciesMeta,\n optionalDependencies,\n peerDependencies,\n peerDependenciesMeta,\n bin,\n checksum: checksum as string,\n conditions,\n languageName,\n linkType,\n }\n })\n\n return lf\n}\n\nexport const format = (value: TSnapshot): string => {\n const lines = dump({\n __metadata: {\n version: 5,\n cacheKey: 8,\n },\n ...preformat(value)\n }, {\n quotingType: '\"',\n flowLevel: -1,\n lineWidth: -1,\n forceQuotes: false\n })\n .split('\\n')\n .map(line => {\n if (line === '__metadata:') {\n return `\\n${line}`\n }\n\n if (line.length !==0 && line.charAt(0) !== ' ') {\n return `\\n\"${line.replaceAll('\"', '').slice(0, -1)}\":`\n }\n\n if (line.startsWith(' resolution: ')) {\n return line.replaceAll('\"', '').replace(' resolution: ', ' resolution: \"').concat('\"')\n }\n\n return line\n })\n\n const _value = lines.join('\\n')\n\n return `# This file is generated by running \"yarn install\" inside your project.\n# Manual changes might be lost - proceed with caution!\n${_value}`\n}"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["ts_exports", "__export", "foo", "format", "parse", "__toCommonJS", "parseIntegrity", "integrity", "m", "item", "k", "v", "sortObject", "unordered", "a", "b", "obj", "key", "value", "flushObject", "import_fs", "parse", "lockfile", "pkg", "lf", "manifest", "workspaces", "entries", "getClosestVersion", "name", "deps", "_a", "_b", "dep", "upsertEntry", "version", "data", "key", "pushRange", "range", "entry", "extractRanges", "parents", "_name", "_version", "extractEntries", "requires", "m", "parseIntegrity", "sortObject", "formatIntegrity", "hashes", "value", "createIndex", "prod", "isProd", "format", "snap", "root", "idx", "target", "ranges", "deptree", "fillTree", "chain", "c", "b", "getEntry", "e", "formatNpm1LockfileEntry", "_entry", "nmtree", "nodes", "processEntry", "queue", "closestIndex", "p", "closest", "_parents", "parent", "node", "snap1", "snap2", "fs", "import_js_yaml", "kvEntryPattern", "preparse", "value", "_value", "line", "p", "k", "v", "parseIntegrity", "integrity", "m", "item", "parse", "raw", "snapshot", "_key", "_entry", "chunks", "ranges", "r", "version", "dependencies", "optionalDependencies", "source", "name", "key", "hashes", "preformat", "lf", "entry", "format", "chunk", "_line", "import_js_yaml", "parse", "lockfile", "pkg", "snapshot", "raw", "value", "_key", "_entry", "chunks", "ranges", "r", "version", "checksum", "dependencies", "dependenciesMeta", "optionalDependencies", "peerDependencies", "peerDependenciesMeta", "source", "bin", "conditions", "name", "key", "hashes", "parseIntegrity", "preformat", "lf", "entry", "isLocal", "languageName", "linkType", "format", "line", "foo"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";var W=Object.create;var $=Object.defineProperty;var J=Object.getOwnPropertyDescriptor;var F=Object.getOwnPropertyNames;var C=Object.getPrototypeOf,V=Object.prototype.hasOwnProperty;var Q=(s,n)=>{for(var i in n)$(s,i,{get:n[i],enumerable:!0})},_=(s,n,i,e)=>{if(n&&typeof n=="object"||typeof n=="function")for(let c of F(n))!V.call(s,c)&&c!==i&&$(s,c,{get:()=>n[c],enumerable:!(e=J(n,c))||e.enumerable});return s};var z=(s,n,i)=>(i=s!=null?W(C(s)):{},_(n||!s||!s.__esModule?$(i,"default",{value:s,enumerable:!0}):i,s)),G=s=>_($({},"__esModule",{value:!0}),s);var re={};Q(re,{foo:()=>te,formatNpm1:()=>M,formatYarn1:()=>q,formatYarn5:()=>H,parseNpm1:()=>w,parseYarn1:()=>Y,parseYarn5:()=>A});module.exports=G(re);var j=s=>s?s.split(" ").reduce((n,i)=>{let[e,c]=i.split("-");return e==="sha512"||e==="sha256"||e==="sha1"||e==="checksum"?n[e]=c:c||(n.checksum=e),n},{}):{};var N=s=>Object.entries({...s}).sort(([n],[i])=>n>i?1:-1).reduce((n,[i,e])=>(n[i]=e,n),K(s)),K=s=>{for(let n in s)delete s[n];return s};var S=z(require("fs"),1),w=async(s,n)=>{let i=await JSON.parse(s),e=await JSON.parse(n),c={"":{name:e.name,path:".",manifest:e}},l={"":{name:e.name,version:e.version,dependencies:{...e.dependencies,...e.devDependencies},hashes:{},ranges:[]}},f=(d,...t)=>{var o,r;return(r=(o=t.find(a=>a[d]))==null?void 0:o[d])==null?void 0:r.version},g=(d,t,o={})=>{let r=`${d}@${t}`;return l[r]||(l[r]={name:d,version:t,ranges:[]}),Object.assign(l[r],o)},h=(d,t,o)=>{let r=g(d,t);r.ranges.includes(o)||(r.ranges.push(o),r.ranges.sort())},m=(d,...t)=>d&&Object.entries(d).forEach(([o,r])=>{let a=f(o,...t);h(o,a,r)}),k=(d,...t)=>d&&Object.entries(d).forEach(([o,r])=>{let a=r.requires||r.dependencies&&Object.entries(r.dependencies).reduce((p,[T,{version:u}])=>(p[T]=u,p),{});g(o,r.version,{hashes:j(r.integrity),dependencies:a}),k(r.dependencies,d,...t),m(a,r.dependencies||{},d,...t)});return k(i.dependencies),m(l[""].dependencies,i.dependencies||{}),{format:"npm-1",entries:N(l),workspaces:c}},U=s=>Object.entries(s).map(([n,i])=>`${n}-${i}`).join(" "),B=()=>{let s=new Set,n=new Map;return{prod:s,deps:n,getDeps(i){return n.has(i)||n.set(i,[]),n.get(i)}}},X=(s,n)=>{var i;return!!((i=s.dependencies)!=null&&i[n])},M=async s=>{let n=s.workspaces[""].manifest,i=Object.values(s.entries),e=B();i.forEach(t=>{t.dependencies&&Object.entries(t.dependencies).forEach(([o,r])=>{let a=i.find(({name:p,ranges:T})=>p===o&&T.includes(r));a&&e.getDeps(t).push(a)})});let c=[],l=(t,o=[])=>{let r=e.getDeps(t);r.forEach(a=>{var p;return X(n,((p=o[0])==null?void 0:p.name)||a.name)&&e.prod.add(a)}),r.sort((a,p)=>e.prod.has(a)&&!e.prod.has(p)?-1:e.prod.has(p)&&!e.prod.has(a)?1:a.name.localeCompare(p.name)),r.forEach(a=>c.push([...o,a])),r.forEach(a=>l(a,[...o,a]))},f=(t,o)=>i.find(r=>r.name===t&&r.version===o);l(f(n.name,n.version));let g=t=>{let{name:o,version:r,hashes:a}=t,p=o.slice(o.indexOf("/")+1),T={version:r,resolved:`https://registry.npmjs.org/${o}/-/${p}-${r}.tgz`,integrity:U(a)};return e.prod.has(t)||(T.dev=!0),t.dependencies&&(T.requires=t.dependencies),T},h={name:n.name,version:n.version,lockfileVersion:1,requires:!0,dependencies:{}},m=h,k=[m],d=(t,o,r)=>{let a=f(t,o),p=e.getDeps(a),T=[];p.forEach(u=>{var b;let y=r.findIndex(P=>{var I;return(I=P.dependencies)==null?void 0:I[u.name]}),v=r[y];if(((b=v==null?void 0:v.dependencies)==null?void 0:b[u.name].version)===u.version)return;let D=g(u),E=[D,...r],L=v?E[y]:E[E.length-1];L.dependencies||(L.dependencies={}),L.dependencies[u.name]=D,k.push(L),T.push([u.name,u.version,E])}),T.forEach(([u,y,v])=>d(u,y,v))};return c.forEach(t=>{let o=t[t.length-1],{name:r}=o;m.dependencies[r]||(m.dependencies[r]=g(o))}),Object.entries(m.dependencies).forEach(([t,o])=>d(t,o.version,[o,m])),k.forEach(t=>{if(N(t.dependencies||{}),t.requires){let o=Object.entries(t.requires).map(([a,p])=>`${a}@${p}`).join(""),r=Object.entries(t.dependencies||{}).map(([a,{version:p}])=>`${a}@${p}`).join("");o===r&&delete t.requires}}),S.default.writeFileSync("temp/test.json",JSON.stringify(h,null,2)),S.default.writeFileSync("temp/tree.json",JSON.stringify(c.map(t=>t.map(o=>`${o.name}@${o.version}`).join(" > ")),null,2)),JSON.stringify(h,null,2)};var O=require("js-yaml"),R=/^(\s+)"?([^"]+)"?\s"?([^"]+)"?$/,Z=s=>{let i=s.split(`
|
|
2
|
+
`).map(e=>{if(e.startsWith("#"))return"";if(e.length!==0&&e.charAt(0)!==" ")return`"${e.replaceAll('"',"").slice(0,-1)}":`;let[,c,l,f]=e.match(R)||[];return e.match(R)?`${c}"${l}": "${f}"`:e},"").join(`
|
|
3
|
+
`);return(0,O.load)(i)},ee=s=>s.split(" ").reduce((n,i)=>{let[e,c]=i.split("-");return(e==="sha512"||e==="sha256"||e==="sha1"||e==="checksum")&&(n[e]=c),n},{}),Y=async s=>{let n=await Z(s),i={entries:{},workspaces:{},format:"yarn-1"};return Object.entries(n).forEach(e=>{let[c,l]=e,f=c.split(", "),g=f.map(p=>p.slice(p.lastIndexOf("@")+1)).sort(),{version:h,integrity:m,dependencies:k,optionalDependencies:d,resolved:t}=l,o=f[0].slice(0,f[0].lastIndexOf("@")),r=`${o}@${h}`,a=ee(m);i.entries[r]={name:o,version:h,ranges:g,hashes:a,dependencies:k,optionalDependencies:d,source:t}}),i},ne=s=>{let n={};return Object.values(s.entries).forEach(i=>{let{name:e,version:c,ranges:l,hashes:f,dependencies:g,optionalDependencies:h,source:m}=i,k=l.map(t=>`${e}@${t}`).join(", "),d=Object.entries(f).map(([t,o])=>`${t}-${o}`).join(" ");n[k]={version:c,resolved:m,integrity:d,dependencies:g,optionalDependencies:h}}),n},q=s=>{let n=ne(s);return`# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
|
|
4
|
+
# yarn lockfile v1
|
|
5
|
+
|
|
6
|
+
${(0,O.dump)(n,{quotingType:'"',flowLevel:-1,lineWidth:-1,forceQuotes:!0}).split(`
|
|
7
|
+
`).map(c=>{if(c.length!==0&&c.charAt(0)!==" ")return`
|
|
8
|
+
${c.slice(0,-1).replaceAll('"',"").split(", ").map(f=>f.startsWith("@")||f.includes(" ")?`"${f}"`:f).join(", ")}:`;if(c.startsWith(" integrity")){let l=c.replace(":","");return c.includes("= ")?l.replaceAll('"integrity"',"integrity"):l.replaceAll('"',"")}return c.endsWith("ependencies:")?c:c.replace(":","")},"").join(`
|
|
9
|
+
`)}`};var x=require("js-yaml");var A=async(s,n)=>{let i={entries:{},workspaces:{},format:"yarn-5"},e=(0,x.load)(s);return delete e.__metadata,Object.entries(e).forEach(c=>{let[l,f]=c,g=l.split(", "),h=g.map(E=>E.slice(E.lastIndexOf("@")+1)).sort(),{version:m,checksum:k,dependencies:d,dependenciesMeta:t,optionalDependencies:o,peerDependencies:r,peerDependenciesMeta:a,resolution:p,bin:T,conditions:u}=f,y=g[0].slice(0,g[0].lastIndexOf("@")),v=`${y}@${m}`,D=j(k);i.entries[v]={name:y,version:m,ranges:h,hashes:D,dependencies:d,dependenciesMeta:t,optionalDependencies:o,peerDependencies:r,peerDependenciesMeta:a,source:p,bin:T,conditions:u}}),i},se=s=>{let n={};return Object.values(s.entries).forEach(i=>{let{name:e,version:c,ranges:l,hashes:{checksum:f},dependencies:g,dependenciesMeta:h,optionalDependencies:m,peerDependencies:k,peerDependenciesMeta:d,source:t,bin:o,conditions:r}=i,a=l.map(y=>`${e}@${y}`).join(", "),p=c==="0.0.0-use.local",T=p?"unknown":"node",u=p?"soft":"hard";n[a]={version:c,resolution:t,dependencies:g,dependenciesMeta:h,optionalDependencies:m,peerDependencies:k,peerDependenciesMeta:d,bin:o,checksum:f,conditions:r,languageName:T,linkType:u}}),n},H=s=>`# This file is generated by running "yarn install" inside your project.
|
|
10
|
+
# Manual changes might be lost - proceed with caution!
|
|
11
|
+
${(0,x.dump)({__metadata:{version:5,cacheKey:8},...se(s)},{quotingType:'"',flowLevel:-1,lineWidth:-1,forceQuotes:!1}).split(`
|
|
12
|
+
`).map(e=>e==="__metadata:"?`
|
|
13
|
+
${e}`:e.length!==0&&e.charAt(0)!==" "?`
|
|
14
|
+
"${e.replaceAll('"',"").slice(0,-1)}":`:e.startsWith(" resolution: ")?e.replaceAll('"',"").replace(" resolution: ",' resolution: "').concat('"'):e).join(`
|
|
15
|
+
`)}`;var te="bar";0&&(module.exports={foo,formatNpm1,formatYarn1,formatYarn5,parseNpm1,parseYarn1,parseYarn5});
|
|
16
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
export declare type TLockfileFormat = 'npm-1' | 'npm-2' | 'yarn-1' | 'yarn-5' | 'yarn-6' | 'yarn-7';
|
|
2
|
+
export declare type TScope = 'prod' | 'dev' | 'peer' | 'opt';
|
|
3
|
+
export declare type TSourceType = 'npm' | 'gh' | 'file' | 'workspace';
|
|
4
|
+
export declare type TDependencies = Record<string, string>;
|
|
5
|
+
export declare type TDependenciesMeta = Record<string, {
|
|
6
|
+
optional: boolean;
|
|
7
|
+
}>;
|
|
8
|
+
export interface THashes {
|
|
9
|
+
sha512?: string;
|
|
10
|
+
sha256?: string;
|
|
11
|
+
sha1?: string;
|
|
12
|
+
checksum?: string;
|
|
13
|
+
md5?: string;
|
|
14
|
+
}
|
|
15
|
+
export interface TLockfileEntry {
|
|
16
|
+
name: string;
|
|
17
|
+
version: string;
|
|
18
|
+
ranges: string[];
|
|
19
|
+
hashes: THashes;
|
|
20
|
+
scope?: TScope;
|
|
21
|
+
conditions?: string;
|
|
22
|
+
dependencies?: TDependencies;
|
|
23
|
+
dependenciesMeta?: TDependenciesMeta;
|
|
24
|
+
optionalDependencies?: TDependencies;
|
|
25
|
+
peerDependencies?: TDependencies;
|
|
26
|
+
peerDependenciesMeta?: TDependenciesMeta;
|
|
27
|
+
sourceType?: TSourceType;
|
|
28
|
+
source?: string;
|
|
29
|
+
bin?: Record<string, string>;
|
|
30
|
+
}
|
|
31
|
+
export interface TManifest {
|
|
32
|
+
name: string;
|
|
33
|
+
dependencies?: TDependencies;
|
|
34
|
+
devDependencies?: TDependencies;
|
|
35
|
+
optionalDependencies?: TDependencies;
|
|
36
|
+
peerDependencies?: TDependencies;
|
|
37
|
+
[key: string]: any;
|
|
38
|
+
}
|
|
39
|
+
export interface TWorkspace {
|
|
40
|
+
name: string;
|
|
41
|
+
path: string;
|
|
42
|
+
manifest: TManifest;
|
|
43
|
+
}
|
|
44
|
+
export interface TSnapshot {
|
|
45
|
+
format: TLockfileFormat;
|
|
46
|
+
entries: Record<string, TLockfileEntry>;
|
|
47
|
+
workspaces: Record<string, TWorkspace>;
|
|
48
|
+
}
|
|
49
|
+
export interface TParseOptions {
|
|
50
|
+
cwd?: string;
|
|
51
|
+
lockfile?: string;
|
|
52
|
+
workspaces?: Record<string, TWorkspace>;
|
|
53
|
+
}
|
|
54
|
+
export declare type IParse = {
|
|
55
|
+
(data: string, opts?: TParseOptions): Promise<TSnapshot>;
|
|
56
|
+
(opts?: TParseOptions): Promise<TSnapshot>;
|
|
57
|
+
};
|
|
58
|
+
export declare type IFormatOptions = {
|
|
59
|
+
format: TLockfileFormat;
|
|
60
|
+
};
|
|
61
|
+
export declare type IFormat = {
|
|
62
|
+
(data: TSnapshot, opts?: IFormatOptions): Promise<string>;
|
|
63
|
+
};
|
|
File without changes
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { TSnapshot } from './interface';
|
|
2
|
+
export declare type TNpm1LockfileEntry = {
|
|
3
|
+
version: string;
|
|
4
|
+
resolved: string;
|
|
5
|
+
integrity: string;
|
|
6
|
+
dev?: boolean;
|
|
7
|
+
requires?: Record<string, string>;
|
|
8
|
+
dependencies?: TNpm1LockfileDeps;
|
|
9
|
+
};
|
|
10
|
+
export declare type TNpm1LockfileDeps = Record<string, TNpm1LockfileEntry>;
|
|
11
|
+
export declare type TNpm1Lockfile = {
|
|
12
|
+
lockfileVersion: 1;
|
|
13
|
+
name: string;
|
|
14
|
+
version: string;
|
|
15
|
+
requires?: true;
|
|
16
|
+
dependencies: TNpm1LockfileDeps;
|
|
17
|
+
};
|
|
18
|
+
export declare const parse: (lockfile: string, pkg: string) => Promise<TSnapshot>;
|
|
19
|
+
export declare const format: (snap: TSnapshot) => Promise<string>;
|
|
File without changes
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { THashes } from "./interface";
|
|
2
|
+
export declare const parseIntegrity: (integrity: string) => THashes;
|
|
3
|
+
export declare const formatIntegrity: (hashes: THashes) => string;
|
|
4
|
+
export declare const sortObject: <T extends Record<string, any>>(unordered: T) => T;
|
|
5
|
+
export declare const flushObject: (obj: Record<string, any>) => Record<string, any>;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { TDependencies, TSnapshot } from './interface';
|
|
2
|
+
export declare type TYarn1Lockfile = Record<string, {
|
|
3
|
+
version: string;
|
|
4
|
+
resolved: string;
|
|
5
|
+
integrity: string;
|
|
6
|
+
dependencies?: TDependencies;
|
|
7
|
+
optionalDependencies?: TDependencies;
|
|
8
|
+
}>;
|
|
9
|
+
export declare const preparse: (value: string) => TYarn1Lockfile;
|
|
10
|
+
export declare const parse: (value: string) => Promise<TSnapshot>;
|
|
11
|
+
export declare const preformat: (value: TSnapshot) => TYarn1Lockfile;
|
|
12
|
+
export declare const format: (value: TSnapshot) => string;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { TDependencies, TDependenciesMeta, TSnapshot } from './interface';
|
|
2
|
+
export declare type TYarn5Lockfile = Record<string, {
|
|
3
|
+
version: string;
|
|
4
|
+
resolution: string;
|
|
5
|
+
conditions?: string;
|
|
6
|
+
checksum: string;
|
|
7
|
+
languageName: string;
|
|
8
|
+
linkType: string;
|
|
9
|
+
dependencies?: TDependencies;
|
|
10
|
+
dependenciesMeta?: TDependenciesMeta;
|
|
11
|
+
optionalDependencies?: TDependencies;
|
|
12
|
+
peerDependencies?: TDependencies;
|
|
13
|
+
peerDependenciesMeta?: TDependenciesMeta;
|
|
14
|
+
bin?: Record<string, string>;
|
|
15
|
+
}>;
|
|
16
|
+
export declare const parse: (lockfile: string, pkg: string) => Promise<TSnapshot>;
|
|
17
|
+
export declare const preformat: (value: TSnapshot) => TYarn5Lockfile;
|
|
18
|
+
export declare const format: (value: TSnapshot) => string;
|
|
File without changes
|
|
File without changes
|