vlt 0.0.0-3 → 0.0.0-4
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/README.md +2 -1
- package/package.json +17 -10
- package/postinstall.cjs +56 -0
- package/vlix +25 -0
- package/vlr +25 -0
- package/vlrx +25 -0
- package/vlt +25 -0
- package/vlx +25 -0
- package/cache-unzip-src-unzip.js +0 -7896
- package/cache-unzip-src-unzip.js.map +0 -7
- package/chunk-227OF2U2.js +0 -1183
- package/chunk-227OF2U2.js.map +0 -7
- package/chunk-3HXIYJS2.js +0 -54
- package/chunk-3HXIYJS2.js.map +0 -7
- package/chunk-AA6MVXJX.js +0 -19823
- package/chunk-AA6MVXJX.js.map +0 -7
- package/chunk-BCK4ZGNG.js +0 -41
- package/chunk-BCK4ZGNG.js.map +0 -7
- package/chunk-DH36SF3E.js +0 -35
- package/chunk-DH36SF3E.js.map +0 -7
- package/chunk-FNKWJ7AZ.js +0 -1379
- package/chunk-FNKWJ7AZ.js.map +0 -7
- package/chunk-H77UDCL3.js +0 -9820
- package/chunk-H77UDCL3.js.map +0 -7
- package/chunk-HL76E44L.js +0 -73
- package/chunk-HL76E44L.js.map +0 -7
- package/chunk-IN7DEH7F.js +0 -44
- package/chunk-IN7DEH7F.js.map +0 -7
- package/chunk-JLP2QDXQ.js +0 -1137
- package/chunk-JLP2QDXQ.js.map +0 -7
- package/chunk-JMGSFQ32.js +0 -969
- package/chunk-JMGSFQ32.js.map +0 -7
- package/chunk-JQRUGUZ3.js +0 -512
- package/chunk-JQRUGUZ3.js.map +0 -7
- package/chunk-K2BYYPM7.js +0 -8656
- package/chunk-K2BYYPM7.js.map +0 -7
- package/chunk-LNUDEBGP.js +0 -2071
- package/chunk-LNUDEBGP.js.map +0 -7
- package/chunk-MV5ZQ3LW.js +0 -1105
- package/chunk-MV5ZQ3LW.js.map +0 -7
- package/chunk-O7CDQZDW.js +0 -5234
- package/chunk-O7CDQZDW.js.map +0 -7
- package/chunk-OFW7MWFP.js +0 -82
- package/chunk-OFW7MWFP.js.map +0 -7
- package/chunk-PGDJ2ZZ6.js +0 -4810
- package/chunk-PGDJ2ZZ6.js.map +0 -7
- package/chunk-POVPHE2F.js +0 -1864
- package/chunk-POVPHE2F.js.map +0 -7
- package/chunk-PTVPYZHU.js +0 -72
- package/chunk-PTVPYZHU.js.map +0 -7
- package/chunk-SXBMMXTY.js +0 -11837
- package/chunk-SXBMMXTY.js.map +0 -7
- package/chunk-UZZ72UON.js +0 -152
- package/chunk-UZZ72UON.js.map +0 -7
- package/chunk-V7KRP7IO.js +0 -481
- package/chunk-V7KRP7IO.js.map +0 -7
- package/chunk-WVNUD273.js +0 -83
- package/chunk-WVNUD273.js.map +0 -7
- package/chunk-WYPE3MV4.js +0 -62
- package/chunk-WYPE3MV4.js.map +0 -7
- package/chunk-ZRNJWPYC.js +0 -37
- package/chunk-ZRNJWPYC.js.map +0 -7
- package/cli-package.json +0 -107
- package/config-3QQHUYLI.js +0 -179
- package/config-3QQHUYLI.js.map +0 -7
- package/devtools-5BBQJTDW.js +0 -16682
- package/devtools-5BBQJTDW.js.map +0 -7
- package/exec-C6GK336U.js +0 -50
- package/exec-C6GK336U.js.map +0 -7
- package/gui-IQ4M4K5X.js +0 -46
- package/gui-IQ4M4K5X.js.map +0 -7
- package/gui-assets/favicon.ico +0 -0
- package/gui-assets/fonts/geist-mono.ttf +0 -0
- package/gui-assets/fonts/inter.ttf +0 -0
- package/gui-assets/images/folder.png +0 -0
- package/gui-assets/index.html +0 -34
- package/gui-assets/index.js +0 -1549
- package/gui-assets/index.js.map +0 -7
- package/gui-assets/main.css +0 -1
- package/help-R6TSKVEA.js +0 -25
- package/help-R6TSKVEA.js.map +0 -7
- package/init-UTJGYULC.js +0 -25
- package/init-UTJGYULC.js.map +0 -7
- package/install-5XDTGLAU.js +0 -56
- package/install-5XDTGLAU.js.map +0 -7
- package/install-exec-VMPN3JE7.js +0 -28
- package/install-exec-VMPN3JE7.js.map +0 -7
- package/list-Q7IANZ3I.js +0 -129
- package/list-Q7IANZ3I.js.map +0 -7
- package/login-VHJEIRVU.js +0 -36
- package/login-VHJEIRVU.js.map +0 -7
- package/logout-5KMCSSR4.js +0 -36
- package/logout-5KMCSSR4.js.map +0 -7
- package/pkg-WYFDWETL.js +0 -364
- package/pkg-WYFDWETL.js.map +0 -7
- package/query-KP4F5D2Y.js +0 -117
- package/query-KP4F5D2Y.js.map +0 -7
- package/registry-client-package.json +0 -85
- package/reporter-LFGXWL6N.js +0 -18
- package/reporter-LFGXWL6N.js.map +0 -7
- package/rollback-remove-src-remove.js +0 -7398
- package/rollback-remove-src-remove.js.map +0 -7
- package/run-XNDZH72D.js +0 -68
- package/run-XNDZH72D.js.map +0 -7
- package/run-exec-NXA33NXJ.js +0 -41
- package/run-exec-NXA33NXJ.js.map +0 -7
- package/source-JWPG6PR3.js +0 -33
- package/source-JWPG6PR3.js.map +0 -7
- package/token-6IJNGEMI.js +0 -86
- package/token-6IJNGEMI.js.map +0 -7
- package/uninstall-MI7NFD27.js +0 -45
- package/uninstall-MI7NFD27.js.map +0 -7
- package/vlix.js +0 -25
- package/vlix.js.map +0 -7
- package/vlr.js +0 -25
- package/vlr.js.map +0 -7
- package/vlrx.js +0 -25
- package/vlrx.js.map +0 -7
- package/vlt.js +0 -24
- package/vlt.js.map +0 -7
- package/vlx.js +0 -25
- package/vlx.js.map +0 -7
- package/whoami-3IEXJF3U.js +0 -46
- package/whoami-3IEXJF3U.js.map +0 -7
- package/yoga.wasm +0 -0
package/chunk-K2BYYPM7.js.map
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/graph/src/visualization/json-output.ts", "../../../src/graph/src/visualization/human-readable-output.ts", "../../../src/satisfies/src/index.ts", "../../../src/graph/src/edge.ts", "../../../src/dep-id/src/browser.ts", "../../../src/graph/src/stringify-node.ts", "../../../src/graph/src/node.ts", "../../../src/graph/src/visualization/mermaid-output.ts", "../../../src/tar/src/unpack.ts", "../../../node_modules/.pnpm/tar@7.4.3/node_modules/tar/src/header.ts", "../../../node_modules/.pnpm/tar@7.4.3/node_modules/tar/src/large-numbers.ts", "../../../node_modules/.pnpm/tar@7.4.3/node_modules/tar/src/types.ts", "../../../node_modules/.pnpm/tar@7.4.3/node_modules/tar/src/pax.ts", "../../../src/tar/src/find-tar-dir.ts", "../../../src/tar/src/pool.ts", "../../../src/tar/src/unpack-request.ts", "../../../src/tar/src/worker.ts", "../../../src/package-info/src/index.ts", "../../../node_modules/.pnpm/@isaacs+fs-minipass@4.0.1/node_modules/@isaacs/fs-minipass/src/index.ts", "../../../node_modules/.pnpm/tar@7.4.3/node_modules/tar/src/create.ts", "../../../node_modules/.pnpm/tar@7.4.3/node_modules/tar/src/list.ts", "../../../node_modules/.pnpm/tar@7.4.3/node_modules/tar/src/options.ts", "../../../node_modules/.pnpm/tar@7.4.3/node_modules/tar/src/make-command.ts", "../../../node_modules/.pnpm/tar@7.4.3/node_modules/tar/src/parse.ts", "../../../node_modules/.pnpm/minizlib@3.0.1/node_modules/minizlib/src/index.ts", "../../../node_modules/.pnpm/minizlib@3.0.1/node_modules/minizlib/src/constants.ts", "../../../node_modules/.pnpm/yallist@5.0.0/node_modules/yallist/src/index.ts", "../../../node_modules/.pnpm/tar@7.4.3/node_modules/tar/src/normalize-windows-path.ts", "../../../node_modules/.pnpm/tar@7.4.3/node_modules/tar/src/read-entry.ts", "../../../node_modules/.pnpm/tar@7.4.3/node_modules/tar/src/warn-method.ts", "../../../node_modules/.pnpm/tar@7.4.3/node_modules/tar/src/strip-trailing-slashes.ts", "../../../node_modules/.pnpm/tar@7.4.3/node_modules/tar/src/pack.ts", "../../../node_modules/.pnpm/tar@7.4.3/node_modules/tar/src/write-entry.ts", "../../../node_modules/.pnpm/tar@7.4.3/node_modules/tar/src/mode-fix.ts", "../../../node_modules/.pnpm/tar@7.4.3/node_modules/tar/src/strip-absolute-path.ts", "../../../node_modules/.pnpm/tar@7.4.3/node_modules/tar/src/winchars.ts", "../../../node_modules/.pnpm/tar@7.4.3/node_modules/tar/src/extract.ts", "../../../node_modules/.pnpm/tar@7.4.3/node_modules/tar/src/unpack.ts", "../../../node_modules/.pnpm/tar@7.4.3/node_modules/tar/src/get-write-flag.ts", "../../../node_modules/.pnpm/chownr@3.0.0/node_modules/chownr/src/index.ts", "../../../node_modules/.pnpm/tar@7.4.3/node_modules/tar/src/mkdir.ts", "../../../node_modules/.pnpm/mkdirp@3.0.1/node_modules/mkdirp/src/mkdirp-manual.ts", "../../../node_modules/.pnpm/mkdirp@3.0.1/node_modules/mkdirp/src/opts-arg.ts", "../../../node_modules/.pnpm/mkdirp@3.0.1/node_modules/mkdirp/src/mkdirp-native.ts", "../../../node_modules/.pnpm/mkdirp@3.0.1/node_modules/mkdirp/src/find-made.ts", "../../../node_modules/.pnpm/mkdirp@3.0.1/node_modules/mkdirp/src/path-arg.ts", "../../../node_modules/.pnpm/mkdirp@3.0.1/node_modules/mkdirp/src/use-native.ts", "../../../node_modules/.pnpm/mkdirp@3.0.1/node_modules/mkdirp/src/index.ts", "../../../node_modules/.pnpm/tar@7.4.3/node_modules/tar/src/cwd-error.ts", "../../../node_modules/.pnpm/tar@7.4.3/node_modules/tar/src/symlink-error.ts", "../../../node_modules/.pnpm/tar@7.4.3/node_modules/tar/src/normalize-unicode.ts", "../../../node_modules/.pnpm/tar@7.4.3/node_modules/tar/src/path-reservations.ts", "../../../node_modules/.pnpm/tar@7.4.3/node_modules/tar/src/replace.ts", "../../../node_modules/.pnpm/tar@7.4.3/node_modules/tar/src/update.ts", "../../../src/package-info/src/rename.ts", "../../../src/graph/src/dependencies.ts", "../../../src/graph/src/graph.ts", "../../../src/graph/src/lockfile/save.ts", "../../../src/graph/src/lockfile/types.ts", "../../../src/graph/src/lockfile/load.ts", "../../../src/graph/src/lockfile/load-edges.ts", "../../../src/graph/src/lockfile/load-nodes.ts", "../../../src/graph/src/actual/load.ts", "../../../src/graph/src/ideal/remove-satisfied-specs.ts", "../../../src/graph/src/ideal/get-importer-specs.ts", "../../../src/graph/src/remove-optional-subgraph.ts", "../../../src/graph/src/ideal/append-nodes.ts", "../../../src/graph/src/ideal/add-nodes.ts", "../../../src/graph/src/ideal/remove-nodes.ts", "../../../src/graph/src/ideal/build-ideal-from-starting-graph.ts", "../../../src/graph/src/ideal/build.ts", "../../../src/rollback-remove/src/index.ts", "../../../src/rollback-remove/src/remove.ts", "../../../src/graph/src/reify/index.ts", "../../../node_modules/.pnpm/promise-call-limit@3.0.2/node_modules/promise-call-limit/src/index.ts", "../../../src/graph/src/diff.ts", "../../../src/graph/src/uninstall.ts", "../../../src/graph/src/index.ts", "../../../src/graph/src/reify/add-edge.ts", "../../../src/graph/src/reify/bin-paths.ts", "../../../src/graph/src/reify/add-edges.ts", "../../../src/graph/src/reify/optional-fail.ts", "../../../src/graph/src/reify/add-nodes.ts", "../../../src/graph/src/reify/build.ts", "../../../src/graph/src/non-empty-list.ts", "../../../src/graph/src/reify/delete-edge.ts", "../../../src/graph/src/reify/delete-edges.ts", "../../../src/graph/src/reify/delete-nodes.ts", "../../../src/graph/src/reify/rollback.ts", "../../../src/graph/src/reify/update-importers-package-json.ts", "../../../src/graph/src/install.ts"],
|
|
4
|
-
"sourcesContent": ["import type { DepID } from '@vltpkg/dep-id'\nimport type { EdgeLike, NodeLike } from '../types.ts'\n\n/**\n * A JSON output item describes a package that is present in the install\n * graph. It represents an edge plus it's linking Node.\n */\nexport type JSONOutputItem = {\n /**\n * The name of the package.\n */\n name: string\n /**\n * A reference to the id of the Node that this package is linked from.\n */\n fromID?: DepID\n /**\n * The dependency spec definition for this package.\n */\n spec?: string\n /**\n * The package type.\n */\n type?: EdgeLike['type']\n /**\n * A representation of the package object that fulfills this dependency.\n */\n to?: NodeLike\n}\n\nexport type JSONOutputGraph = {\n edges: EdgeLike[]\n nodes: NodeLike[]\n}\n\n/**\n * Returns a JSON string representation of the graph.\n */\nexport function jsonOutput({ edges, nodes }: JSONOutputGraph) {\n const res: JSONOutputItem[] = []\n\n // Collects importer nodes as edgeless json output items\n for (const node of nodes) {\n if (node.importer) {\n res.push({\n /* c8 ignore next - name can't be missing but ts won't know */\n name: node.name || node.id,\n to: node,\n })\n }\n }\n\n // Collects edge & it's linked nodes as json output items\n for (const edge of edges) {\n res.push({\n name: edge.name,\n fromID: edge.from.id,\n spec: String(edge.spec),\n type: edge.type,\n to: edge.to,\n })\n }\n\n return res\n}\n", "import { splitDepID } from '@vltpkg/dep-id'\nimport type { EdgeLike, NodeLike } from '../types.ts'\nimport type { ChalkInstance } from 'chalk'\n\nconst chars = new Map(\n Object.entries({\n connection: '\u2500',\n down: '\u2502',\n 'last-child': '\u2514',\n 'middle-child': '\u251C',\n t: '\u252C',\n }),\n)\n\nexport type TreeItem = {\n name?: string | null\n edge: EdgeLike | undefined\n node: NodeLike | undefined\n prefix: string\n padding: string\n hasSibling: boolean\n deduped: boolean\n include: boolean\n parent: TreeItem | undefined\n}\n\nexport type HumanReadableOutputGraph = {\n edges: EdgeLike[]\n importers: Set<NodeLike>\n nodes: NodeLike[]\n highlightSelection?: boolean\n}\n\nexport type EdgeMap = Map<NodeLike | undefined, TreeItem>\n\nexport type TreeMap = Map<EdgeLike | undefined, EdgeMap>\n\nconst isSelected = (\n options: HumanReadableOutputGraph,\n edge?: EdgeLike,\n node?: NodeLike,\n) =>\n !!(\n (!node || options.nodes.includes(node)) &&\n (!edge || options.edges.includes(edge))\n )\n\n/**\n * Returns a map of tree items to be printed.\n */\nconst getTreeItems = (\n initialItems: Set<TreeItem>,\n options: HumanReadableOutputGraph,\n) => {\n const seenNodes = new Set<NodeLike>()\n const treeItems: TreeMap = new Map()\n const traverse = new Set<TreeItem>(initialItems)\n for (const item of traverse) {\n if (item.node) {\n if (seenNodes.has(item.node)) {\n item.deduped = true\n continue\n }\n seenNodes.add(item.node)\n const edges = [...item.node.edgesOut.values()].sort(i =>\n Number(i.to?.importer),\n )\n for (const edge of edges) {\n const toItems: EdgeMap =\n treeItems.get(edge) ?? (new Map() as EdgeMap)\n const nextItem: TreeItem = {\n edge,\n node: edge.to,\n hasSibling: false,\n padding: '',\n prefix: '',\n deduped: false,\n include: isSelected(options, edge, edge.to),\n parent: item,\n }\n toItems.set(edge.to, nextItem)\n treeItems.set(edge, toItems)\n traverse.add(nextItem)\n }\n }\n }\n for (const item of [...traverse].reverse()) {\n if (item.include && item.parent) {\n item.parent.include = true\n }\n }\n return treeItems\n}\n\n/**\n * Returns a human-readable output of the graph.\n */\nexport function humanReadableOutput(\n options: HumanReadableOutputGraph,\n { colors }: { colors?: ChalkInstance },\n) {\n const { importers } = options\n const noop = (s?: string | null) => s\n const {\n dim = noop,\n red = noop,\n reset = noop,\n yellow = noop,\n } = colors ?? {}\n const initialItems = new Set<TreeItem>()\n for (const importer of importers) {\n initialItems.add({\n name: importer.name,\n edge: undefined,\n node: importer,\n prefix: '',\n padding: '',\n hasSibling: false,\n deduped: false,\n include: isSelected(options, undefined, importer),\n parent: undefined,\n })\n }\n const treeItems = getTreeItems(initialItems, options)\n\n let res = ''\n const traverse = (item: TreeItem) => {\n let header = ''\n let content = ''\n\n const depIdTuple = item.node?.id && splitDepID(item.node.id)\n const hasCustomReg =\n depIdTuple?.[0] === 'registry' && depIdTuple[1]\n const name =\n hasCustomReg ? `${depIdTuple[1]}:${item.name}` : item.name\n const decoratedName =\n (\n options.highlightSelection &&\n isSelected(options, item.edge, item.node)\n ) ?\n yellow(name)\n : name\n if (!item.node && item.include) {\n const missing =\n item.edge?.type.endsWith('ptional') ?\n dim('(missing optional)')\n : red('(missing)')\n return `${item.padding}${item.prefix}${decoratedName} ${missing}\\n`\n }\n\n const deduped = item.deduped ? ` ${dim('(deduped)')}` : ''\n header += `${item.padding}${item.prefix}${decoratedName}${deduped}\\n`\n\n // deduped items need not to be printed or traversed\n if (!item.deduped) {\n const edges = item.node ? [...item.node.edgesOut.values()] : []\n const nextItems = edges.map(i => treeItems.get(i)?.get(i.to))\n const includedItems = nextItems.filter(i => i?.include)\n\n for (const nextItem of nextItems) {\n /* c8 ignore next -- impossible but TS doesn't know that */\n if (!nextItem) continue\n\n const parent = item\n const isLast =\n includedItems.indexOf(nextItem) === includedItems.length - 1\n const toName =\n nextItem.node?.version ?\n `${nextItem.node.name}@${nextItem.node.version}`\n : nextItem.node?.name\n const nextChar = isLast ? 'last-child' : 'middle-child'\n\n nextItem.name =\n (\n nextItem.node?.name &&\n nextItem.edge?.name !== nextItem.edge?.to?.name\n ) ?\n `${nextItem.edge?.name} (${toName})`\n : `${nextItem.edge?.name}@${nextItem.node?.version || nextItem.edge?.spec.bareSpec}`\n nextItem.padding =\n parent.prefix.length ?\n `${parent.padding}${parent.hasSibling ? chars.get('down') : ' '} `\n : ''\n nextItem.prefix = `${chars.get(nextChar)}${chars.get('connection')}${chars.get('connection')} `\n nextItem.hasSibling = !isLast\n\n content += traverse(nextItem)\n }\n }\n\n const regularConnection = `${chars.get('connection')} `\n const parentConnection = `${chars.get('t')} `\n return item.include ?\n `${content ? header.replace(regularConnection, parentConnection) : header}${content}`\n : ''\n }\n\n for (const item of initialItems) {\n res += traverse(item)\n }\n return reset(res)\n}\n", "import { splitDepID } from '@vltpkg/dep-id'\nimport type { DepID, DepIDTuple } from '@vltpkg/dep-id'\nimport { error } from '@vltpkg/error-cause'\nimport { parse, Version } from '@vltpkg/semver'\nimport { Spec } from '@vltpkg/spec'\nimport type { GitSelectorParsed } from '@vltpkg/spec'\nimport { Monorepo } from '@vltpkg/workspaces'\nimport { relative, resolve } from 'path'\n\n/**\n * Return true if the node referenced by this DepID would satisfy the\n * supplied Spec object.\n */\nexport const satisfies = (\n id: DepID | undefined,\n spec: Spec,\n fromLocation = process.cwd(),\n projectRoot = process.cwd(),\n monorepo?: Monorepo,\n): boolean =>\n !!id &&\n satisfiesTuple(\n splitDepID(id),\n spec,\n fromLocation,\n projectRoot,\n monorepo,\n )\n\nexport const satisfiesTuple = (\n tuple: DepIDTuple,\n spec: Spec,\n fromLocation = process.cwd(),\n projectRoot = process.cwd(),\n monorepo?: Monorepo,\n): boolean => {\n const { options } = spec\n spec = spec.final\n const [type, first, second] = tuple\n if (spec.type !== type) return false\n\n switch (spec.type) {\n case 'registry': {\n if (!first) {\n // must be from the default registry\n if (spec.registry !== options.registry) {\n return false\n }\n } else {\n const namedRegistry = options.registries[first]\n if (namedRegistry && namedRegistry !== spec.registry) {\n // we know the name, and it's not the registry being used\n return false\n } else if (!namedRegistry && first !== spec.registry) {\n // an explicit registry URL, but does not match\n return false\n }\n }\n /* c8 ignore next */\n if (!second) throw error('Invalid DepID', { found: tuple })\n const [name, version] = parseNameVer(second)\n return (\n // mismatched name always invalid\n name !== spec.name || !version ? false\n // if just a dist-tag, assume valid\n : !spec.range ? true\n : spec.range.test(Version.parse(version))\n )\n }\n\n case 'file': {\n /* c8 ignore next - should be impossible */\n if (spec.file === undefined) return false\n const resolvedSpec = resolve(\n projectRoot,\n fromLocation,\n spec.file,\n )\n const resolvedId = resolve(projectRoot, first)\n // valid if the relative path is '', refers to the same path\n return !relative(resolvedSpec, resolvedId)\n }\n\n case 'workspace': {\n monorepo ??= Monorepo.load(projectRoot)\n /* c8 ignore next */\n if (!spec.workspace) return false\n const fromID = monorepo.get(first)\n const fromSpec = monorepo.get(spec.workspace)\n if (fromID !== fromSpec || !fromSpec || !fromID) return false\n if (!spec.range) return true\n const v = parse(fromID.manifest.version ?? '')\n return !!v && spec.range.test(v)\n }\n\n case 'remote': {\n return spec.remoteURL === first\n }\n\n case 'git': {\n const {\n gitRemote,\n gitSelectorParsed = {},\n gitSelector,\n gitCommittish,\n namedGitHost,\n namedGitHostPath,\n } = spec\n if (gitRemote !== first) {\n if (namedGitHost && namedGitHostPath) {\n const ngh = `${namedGitHost}:`\n if (first.startsWith(ngh)) {\n if (first !== ngh + namedGitHostPath) return false\n } else return false\n } else return false\n }\n if (gitSelector && !second) return false\n /* c8 ignore next - always set to something, even if empty */\n const [parsed, committish] = Spec.parseGitSelector(second ?? '')\n if (gitCommittish && committish)\n return !!committish.startsWith(gitCommittish)\n for (const [k, v] of Object.entries(gitSelectorParsed)) {\n if (parsed[k as keyof GitSelectorParsed] !== v) return false\n }\n return true\n }\n\n /* c8 ignore start */\n default: {\n throw error('Invalid spec type', { spec })\n }\n }\n /* c8 ignore stop */\n}\n\nconst parseNameVer = (nv: string): [string, string] => {\n const at = nv.lastIndexOf('@')\n // if it's 0, means @scoped without a version\n return at <= 0 ?\n [nv, '']\n : [nv.substring(0, at), nv.substring(at + 1)]\n}\n", "import { satisfies } from '@vltpkg/satisfies'\nimport type { Spec } from '@vltpkg/spec'\nimport { inspect } from 'util'\nimport type { InspectOptions } from 'util'\nimport type { DependencyTypeShort } from '@vltpkg/types'\nimport type { Node } from './node.ts'\nimport type { EdgeLike } from './types.ts'\n\nconst kCustomInspect = Symbol.for('nodejs.util.inspect.custom')\n\nexport class Edge implements EdgeLike {\n get [Symbol.toStringTag]() {\n return '@vltpkg/graph.Edge'\n }\n\n [kCustomInspect](_: number, options: InspectOptions) {\n const str = inspect(\n {\n from: this.from.id,\n type: this.type,\n spec: String(this.spec),\n to: this.to?.id,\n },\n options,\n )\n return `${this[Symbol.toStringTag]} ${str}`\n }\n\n /**\n * The Node this Edge is connecting from, this is usually the dependent.\n */\n from: Node\n\n /**\n * The node this Edge is connecting to, this is usually a direct dependency.\n */\n to?: Node\n\n /**\n * What type of dependency relationship `from` and `to` nodes have.\n */\n type: DependencyTypeShort\n\n /**\n * The defined spec value for `to` as parsed from the dependent metadata.\n */\n spec: Spec\n\n constructor(\n type: DependencyTypeShort,\n spec: Spec,\n from: Node,\n to?: Node,\n ) {\n this.from = from\n this.to = to\n this.type = type\n this.spec = spec\n }\n\n /**\n * The name of the dependency `to` as defined in the dependent metadata.\n */\n get name() {\n return this.spec.name\n }\n\n /**\n * This edge was defined as part of a `devDependencies` in `package.json`\n */\n get dev(): boolean {\n return this.type === 'dev'\n }\n\n get optional(): boolean {\n return this.type === 'peerOptional' || this.type === 'optional'\n }\n\n get peer(): boolean {\n return this.type === 'peer' || this.type === 'peerOptional'\n }\n\n get peerOptional(): boolean {\n return this.type === 'peerOptional'\n }\n\n valid(): boolean {\n return !this.to ?\n this.optional\n : satisfies(\n this.to.id,\n this.spec,\n this.from.location,\n this.from.projectRoot,\n )\n }\n}\n", "import { error } from '@vltpkg/error-cause'\nimport { Spec } from '@vltpkg/spec/browser'\nimport type { SpecOptions } from '@vltpkg/spec/browser'\n\nexport const delimiter: Delimiter = '\u00B7'\nexport type Delimiter = '\u00B7'\n\n/**\n * Dependency IDs are a URI-encoded set of strings, separated\n * by the {@link Delimiter} character (`'\u00B7'`).\n *\n * The first entry is always the specifier type. The rest depend on the\n * type. `git`, `registry`, and `workspace` entries have 3 fields, the rest\n * have 2.\n *\n * - `registry`: `'registry\u00B7<registry>\u00B7name@specifier'`\n * The `<registry>` portion can be a known named registry name, or a\n * url to a registry. If empty, it is the default registry. Examples:\n * - `\u00B7\u00B7some-package@2.0.1`\n * - `\u00B7npm\u00B7whatever@1.2.3`\n * - `\u00B7http%3A%2F%2Fvlt.sh%2F\u00B7x@1.2.3`\n * - `git`: `'git\u00B7<git remote>\u00B7<git selector>'`. For example:\n * - `git\u00B7github:user/project\u00B7branchname`\n * - `git\u00B7git%2Bssh%3A%2F%2Fuser%40host%3Aproject.git\u00B7semver:1.x`\n * - `workspace`: `'workspace\u00B7<path>'`. For example:\n * - `workspace\u00B7src/mything`\n * - `remote`: `'remote\u00B7<url>'`\n * - `file`: `'file\u00B7<path>'`\n *\n * Lastly, the final portion can contain arbitrary string data, and is\n * used to store peer dep resolutions to maintain the peerDep contract.\n */\nexport type DepID =\n | `${'' | 'git'}${Delimiter}${string}${Delimiter}${string}${Delimiter}${string}`\n | `${'' | 'git'}${Delimiter}${string}${Delimiter}${string}`\n | `${'file' | 'remote' | 'workspace'}${Delimiter}${string}${Delimiter}${string}`\n | `${'file' | 'remote' | 'workspace'}${Delimiter}${string}`\n\n/**\n * A {@link DepID}, split apart and URI-decoded\n */\nexport type DepIDTuple =\n | [\n type: 'git',\n gitRemote: string,\n gitSelector: string,\n extra?: string,\n ]\n | [\n type: 'registry',\n registry: string,\n registrySpec: string,\n extra?: string,\n ]\n | [type: 'file', path: string, extra?: string]\n | [type: 'remote', url: string, extra?: string]\n | [type: 'workspace', workspace: string, extra?: string]\n\nconst depIDRegExp = new RegExp(\n `^((git)?${delimiter}[^${delimiter}]*${delimiter}[^${delimiter}]*(${\n delimiter\n }[^${delimiter}]*)?$` +\n `|` +\n `^(file|remote|workspace)${delimiter}[^${\n delimiter\n }]*)(${delimiter}[^${delimiter}]*)?$`,\n)\n\nexport const isDepID = (str: unknown): str is DepID =>\n typeof str === 'string' && depIDRegExp.test(str)\n\nexport const asDepID = (str: string): DepID => {\n if (!isDepID(str)) {\n throw error('Expected dep id', {\n found: str,\n })\n }\n return str\n}\n\n/**\n * turn a {@link DepIDTuple} into a {@link DepID}\n */\nexport const joinDepIDTuple = (list: DepIDTuple): DepID => {\n const [type, first, second, extra] = list\n const f = encode(first)\n switch (type) {\n case 'registry':\n return `${delimiter}${f}${delimiter}${encode(second)}${extra ? `${delimiter}${encode(extra)}` : ''}`\n case 'git':\n return `${type}${delimiter}${f}${delimiter}${encode(second)}${extra ? `${delimiter}${encode(extra)}` : ''}`\n default:\n return `${type}${delimiter}${f}${second ? `${delimiter}${encode(second)}` : ''}`\n }\n}\n\n// allow @, but otherwise, escape everything urls do\nconst encode = (s: string): string =>\n encodeURIComponent(s)\n .replaceAll('%40', '@')\n .replaceAll('%2f', '\u00A7')\n .replaceAll('%2F', '\u00A7')\n\n/**\n * turn a {@link DepID} into a {@link DepIDTuple}\n */\nexport const splitDepID = (id: string): DepIDTuple => {\n const [type, first = '', second, extra] = id\n .replaceAll('\u00A7', '/')\n .split(delimiter, 4)\n const f = decodeURIComponent(first)\n switch (type) {\n case 'git':\n case '': {\n if (second === undefined) {\n throw error(`invalid ${type} id`, { found: id })\n }\n const t: DepIDTuple = [\n type || 'registry',\n f,\n decodeURIComponent(second),\n ]\n if (extra) t.push(decodeURIComponent(extra))\n return t\n }\n case 'file':\n case 'remote':\n case 'workspace': {\n const t: DepIDTuple = [type, f]\n if (second) t.push(decodeURIComponent(second))\n return t\n }\n default: {\n throw error('invalid DepID type', {\n found: type,\n validOptions: ['git', 'file', 'workspace', 'remote', ''],\n })\n }\n }\n}\n\n/**\n * Turn a {@link DepID} into a {@link Spec} object\n */\nexport const hydrate = (\n id: DepID,\n name?: string,\n options: SpecOptions = {},\n): Spec => hydrateTuple(splitDepID(id), name, options)\n\n/**\n * Turn a {@link DepIDTuple} into a {@link Spec} object\n */\nexport const hydrateTuple = (\n tuple: DepIDTuple,\n name?: string,\n options: SpecOptions = {},\n) => {\n const [type, first, second] = tuple\n switch (type) {\n case 'remote': {\n if (!first)\n throw error('no remoteURL found on remote id', {\n found: tuple,\n })\n return Spec.parse(name ?? '(unknown)', first)\n }\n case 'file': {\n if (!first) {\n throw error('no file path found on remote id', {\n found: tuple,\n })\n }\n return Spec.parse(name ?? '(unknown)', `file:${first}`, options)\n }\n case 'registry': {\n if (typeof first !== 'string') {\n throw error('no registry url or name in registry ID', {\n found: tuple,\n })\n }\n if (!second) {\n throw error('no name/specifier in registry ID', {\n found: tuple,\n })\n }\n if (!first) {\n // just a normal name@version on the default registry\n const s = Spec.parse(second)\n if (name && s.name !== name) {\n return Spec.parse(`${name}@npm:${second}`)\n } else {\n return s\n }\n }\n if (!/^https?:\\/\\//.test(first)) {\n const reg = options.registries?.[first]\n if (first !== 'npm' && !reg) {\n throw error('named registry not found in options', {\n name: first,\n found: tuple,\n })\n }\n return Spec.parse(\n name ?? '(unknown)',\n `${first}:${second}`,\n options,\n )\n }\n const s = Spec.parse(\n name ?? '(unknown)',\n `registry:${first}#${second}`,\n options,\n )\n return name && s.final.name !== name ?\n Spec.parse(s.final.name + '@' + s.bareSpec)\n : s\n }\n case 'git': {\n if (!first) {\n throw error('no git remote in git ID', {\n found: tuple,\n })\n }\n return Spec.parse(\n name ?? '(unknown)',\n first + '#' + second,\n options,\n )\n }\n case 'workspace': {\n if (!first) {\n throw error('no name/path on workspace id', { found: tuple })\n }\n return name && name !== first ?\n Spec.parse(name, `workspace:${first}@*`, options)\n : Spec.parse(first, `workspace:*`, options)\n }\n }\n}\n", "import { splitDepID } from '@vltpkg/dep-id/browser'\nimport type { NodeLike } from './types.ts'\n\nexport const stringifyNode = (node?: NodeLike) => {\n if (!node) return ''\n const version = node.version ? `@${node.version}` : ''\n const [type, ref, nameVersion] = splitDepID(node.id)\n\n if (type === 'registry') {\n const prefix = ref ? `${ref}:` : 'npm:'\n return `${prefix}${nameVersion}`\n } else if (type === 'workspace') {\n return `workspace:${node.name}`\n } else if (type === 'file' && node.mainImporter) {\n return `root:${node.name}`\n } else {\n // node.name getter will return the id if the package has no name\n // property so here we check for that in order to return `type(ref)` only\n const nameVersion =\n node.name !== node.id ? `:${node.name}${version}` : ''\n return `${type}(${ref})${nameVersion}`\n }\n}\n", "import type { PathScurry } from 'path-scurry'\nimport { getId, hydrateTuple, splitDepID } from '@vltpkg/dep-id'\nimport type { DepID, DepIDTuple } from '@vltpkg/dep-id'\nimport { typeError } from '@vltpkg/error-cause'\nimport type { Spec, SpecOptions } from '@vltpkg/spec'\nimport type {\n Integrity,\n Manifest,\n DependencyTypeShort,\n} from '@vltpkg/types'\nimport { Edge } from './edge.ts'\nimport type { GraphLike, NodeLike } from './types.ts'\nimport { stringifyNode } from './stringify-node.ts'\nimport type { PackageInfoClient } from '@vltpkg/package-info'\n\nexport type NodeOptions = SpecOptions & {\n projectRoot: string\n graph: GraphLike\n}\n\nexport class Node implements NodeLike {\n get [Symbol.toStringTag]() {\n return '@vltpkg/graph.Node'\n }\n\n #options: SpecOptions\n #location?: string\n\n #optional = false\n /**\n * True if a node is only reachable via optional or peerOptional edges from\n * any importer.\n *\n * Setting this to false, if previously set to true, will also unset\n * the flag on any optional-flagged non-optional dependencies.\n */\n get optional() {\n return this.#optional\n }\n set optional(optional: boolean) {\n const before = this.#optional\n this.#optional = optional\n if (before && !optional) {\n // unset for all deps, as well\n for (const { to, optional } of this.edgesOut.values()) {\n if (!optional && to?.optional) to.optional = false\n }\n }\n }\n\n isOptional(): this is Node & { optional: true } {\n return this.#optional\n }\n\n #dev = false\n /**\n * True if a node is only reachable via dev edges from any importer.\n *\n * Setting this to false, if previously set to true, will also unset\n * the flag on any dev-flagged non-dev dependencies.\n */\n get dev() {\n return this.#dev\n }\n set dev(dev: boolean) {\n const before = this.#dev\n this.#dev = dev\n if (before && !dev) {\n // unset for all deps, as well\n for (const { to, dev } of this.edgesOut.values()) {\n if (!dev && to?.dev) to.dev = false\n }\n }\n }\n\n isDev(): this is Node & { dev: true } {\n return this.#dev\n }\n\n /**\n * List of edges coming into this node.\n */\n edgesIn = new Set<Edge>()\n\n /**\n * List of edges from this node into other nodes. This usually represents\n * that the connected node is a direct dependency of this node.\n */\n edgesOut = new Map<string, Edge>()\n\n /**\n * A reference to the {@link DepID} this node represents in the graph.\n */\n id: DepID\n\n /**\n * True if this node is an importer node.\n */\n importer = false\n\n /**\n * True if this node is the project root node.\n */\n mainImporter = false\n\n /**\n * A reference to the graph this node is a part of.\n */\n graph: GraphLike\n\n /**\n * The manifest integrity value.\n */\n integrity?: Integrity\n\n /**\n * The manifest this node represents in the graph.\n */\n manifest?: Manifest\n\n /**\n * Project where this node resides\n */\n projectRoot: string\n\n /**\n * For registry nodes, this is the registry we fetched them from.\n * Needed because their un-prefixed dependencies need to come from\n * the same registry, if it's not the default.\n */\n registry?: string\n\n /**\n * The name of the package represented by this node, this is usually\n * equivalent to `manifest.name` but in a few ways it may differ such as\n * nodes loaded from a lockfile that lacks a loaded manifest.\n * This field should be used to retrieve package names instead.\n */\n #name?: string\n get name() {\n if (this.#name) return this.#name\n this.#name = this.id\n return this.#name\n }\n\n /**\n * The version of the package represented by this node, this is usually\n * equivalent to `manifest.version` but in a few ways it may differ such as\n * nodes loaded from a lockfile that lacks a loaded manifest.\n * This field should be used to retrieve package versions instead.\n */\n version?: string\n\n /**\n * An address {@link PackageInfoClient} may use to extract this package.\n */\n resolved?: string\n\n /**\n * The file system location for this node.\n */\n get location(): string {\n if (this.#location) {\n return this.#location\n }\n this.#location = `./node_modules/.vlt/${this.id}/node_modules/${this.name}`\n // if using the default location, it is in the store\n this.inVltStore = () => true\n return this.#location\n }\n\n set location(location: string) {\n this.#location = location\n // reset memoization, since it might be elsewhere now\n if (this.inVltStore !== Node.prototype.inVltStore) {\n this.inVltStore = Node.prototype.inVltStore\n }\n }\n\n /**\n * The resolved location of the node in the file system.\n */\n resolvedLocation(scurry: PathScurry): string {\n return scurry.cwd.resolve(this.location).fullpath()\n }\n\n /**\n * The location of the node_modules folder where this node's edgesOut\n * should be linked into. For nodes in the store, this is the parent\n * directory, since they're extracted into a node_modules folder\n * side by side with links to their deps. For nodes outside of the store\n * (ie, importers and arbitrary link deps) this is the node_modules folder\n * directly inside the node's directory.\n */\n nodeModules(scurry: PathScurry): string {\n const loc = this.resolvedLocation(scurry)\n return this.inVltStore() ?\n loc.substring(0, loc.length - this.name.length - 1)\n : scurry.resolve(loc, 'node_modules')\n }\n\n constructor(\n options: NodeOptions,\n id?: DepID,\n manifest?: Manifest,\n spec?: Spec,\n name?: string,\n version?: string,\n ) {\n this.#options = options\n this.projectRoot = options.projectRoot\n if (id) {\n this.id = id\n } else {\n if (!manifest || !spec) {\n throw typeError(\n 'A new Node needs either a manifest & spec or an id parameter',\n {\n manifest,\n },\n )\n }\n this.id = getId(spec, manifest)\n }\n this.graph = options.graph\n this.manifest = manifest\n this.#name = name || this.manifest?.name\n this.version = version || this.manifest?.version\n }\n\n /**\n * return true if this node is located in the vlt store\n * memoized the first time it's called, since the store location\n * doesn't change within the context of a single operation.\n */\n inVltStore(): boolean {\n // technically this just means it's in *a* vlt store, but we can safely\n // assume that a user won't construct a path like this by accident,\n // and there's only ever one store in any given project.\n const inStore = this.location.endsWith(\n `.vlt/${this.id}/node_modules/${this.name}`,\n )\n this.inVltStore = () => inStore\n return inStore\n }\n\n #registryNodeResolved(tuple: DepIDTuple) {\n const spec = hydrateTuple(tuple, this.#name, this.#options)\n this.resolved =\n this.manifest?.dist?.tarball || spec.conventionalRegistryTarball\n this.integrity ??= this.manifest?.dist?.integrity\n }\n\n equals(other: Node) {\n return this.id === other.id && this.location === other.location\n }\n\n /**\n * Sets the node as an importer along with its location.\n */\n setImporterLocation(location: string) {\n this.#location = location\n this.importer = true\n }\n\n /**\n * Sets the appropriate resolve / integrity value for this node.\n * Note that other places might also set these values, like for\n * example the lockfile that might have already have this info.\n */\n setResolved() {\n // file | remote | workspace type of ids all points to a URI that\n // can be used as the `resolved` value, so we split the dep id\n // for these cases.\n const tuple = splitDepID(this.id)\n const [type, resolved] = tuple\n switch (type) {\n case 'registry':\n this.#registryNodeResolved(tuple)\n break\n default:\n this.resolved = resolved\n break\n }\n }\n\n setDefaultLocation() {\n const def = `./node_modules/.vlt/${this.id}/node_modules/${this.name}`\n\n // only relocate if the location is in node_modules already\n if (\n !this.importer &&\n (!this.#location ||\n (this.#location !== def &&\n /^(?:\\.\\/)?node_modules\\//.test(this.#location)))\n ) {\n this.#location = def\n }\n }\n\n /**\n * Add an edge from this node connecting it to a direct dependency.\n */\n addEdgesTo(type: DependencyTypeShort, spec: Spec, node?: Node) {\n const edge = new Edge(type, spec, this, node)\n node?.edgesIn.add(edge)\n this.edgesOut.set(spec.name, edge)\n return edge\n }\n\n toJSON() {\n return {\n id: this.id,\n name: this.name,\n version: this.version,\n location: this.location,\n importer: this.importer,\n manifest: this.manifest,\n projectRoot: this.projectRoot,\n integrity: this.integrity,\n resolved: this.resolved,\n dev: this.dev,\n optional: this.optional,\n }\n }\n\n toString() {\n return stringifyNode(this)\n }\n}\n", "import type { DepID } from '@vltpkg/dep-id'\nimport { Edge } from '../edge.ts'\nimport { Node } from '../node.ts'\nimport type { EdgeLike, NodeLike } from '../types.ts'\n\nexport type MermaidOutputGraph = {\n edges: EdgeLike[]\n importers: Set<NodeLike>\n nodes: NodeLike[]\n}\n\ntype TraverseItem = {\n self: EdgeLike | NodeLike\n parent: EdgeLike | NodeLike | undefined\n}\n\nlet missingCount = 0\n\nconst nodeLabel = (node: NodeLike) =>\n `\"${String(node).replaceAll('@', '#64;')}\"`\n\nfunction parseNode(\n seenNodes: Set<DepID>,\n includedItems: Map<EdgeLike | NodeLike, boolean>,\n node: NodeLike,\n) {\n if (seenNodes.has(node.id) || !includedItems.get(node)) {\n return ''\n }\n seenNodes.add(node.id)\n const edges: string = [...node.edgesOut.values()]\n .map(e => parseEdge(seenNodes, includedItems, e))\n .filter(Boolean)\n .join('\\n')\n return `${encodeURIComponent(node.id)}(${nodeLabel(node)})${edges.length ? '\\n' : ''}${edges}`\n}\n\nfunction parseEdge(\n seenNodes: Set<DepID>,\n includedItems: Map<EdgeLike | NodeLike, boolean>,\n edge: EdgeLike,\n) {\n if (!includedItems.get(edge)) {\n return ''\n }\n\n const edgeResult =\n `${encodeURIComponent(edge.from.id)}(${nodeLabel(edge.from)})` +\n ` -->|\"${String(edge.spec).replaceAll('@', '#64;')} (${edge.type})\"| `\n\n const missingLabel =\n edge.type.endsWith('ptional') ? 'Missing Optional' : 'Missing'\n if (!edge.to) {\n return edgeResult + `missing-${missingCount++}(${missingLabel})\\n`\n }\n\n return (\n edgeResult +\n `${encodeURIComponent(edge.to.id)}(${nodeLabel(edge.to)})\\n` +\n parseNode(seenNodes, includedItems, edge.to)\n )\n}\n\n/**\n * Returns a mermaid string representation of the graph.\n */\nexport function mermaidOutput({\n edges,\n importers,\n nodes,\n}: MermaidOutputGraph) {\n const seen = new Set<EdgeLike | NodeLike>()\n const includedItems = new Map<EdgeLike | NodeLike, boolean>()\n const traverse = new Set<TraverseItem>(\n [...importers].map(i => ({ self: i, parent: undefined })),\n )\n\n for (const item of traverse) {\n if (seen.has(item.self)) continue\n seen.add(item.self)\n\n if (item.self instanceof Edge) {\n if (edges.includes(item.self)) {\n includedItems.set(item.self, true)\n }\n if (item.self.to) {\n traverse.add({ self: item.self.to, parent: item.self })\n }\n }\n\n if (item.self instanceof Node) {\n if (nodes.includes(item.self)) {\n includedItems.set(item.self, true)\n }\n for (const edge of item.self.edgesOut.values()) {\n traverse.add({ self: edge, parent: item.self })\n }\n }\n }\n\n for (const item of [...traverse].reverse()) {\n if (includedItems.has(item.self) && item.parent) {\n includedItems.set(item.parent, true)\n }\n }\n\n return (\n 'flowchart TD\\n' +\n [...importers]\n .map(i => parseNode(new Set<DepID>(), includedItems, i))\n .join('\\n')\n )\n}\n", "import { error } from '@vltpkg/error-cause'\nimport { randomBytes } from 'crypto'\nimport { lstat, mkdir, rename, writeFile } from 'fs/promises'\nimport { basename, dirname, parse, resolve } from 'path'\nimport { rimraf } from 'rimraf'\nimport { Header } from 'tar/header'\nimport type { HeaderData } from 'tar/header'\nimport { Pax } from 'tar/pax'\nimport { unzip as unzipCB } from 'zlib'\nimport { findTarDir } from './find-tar-dir.ts'\n\nconst unzip = async (input: Buffer) =>\n new Promise<Buffer>(\n (res, rej) =>\n /* c8 ignore start */\n unzipCB(input, (er, result) => (er ? rej(er) : res(result))),\n /* c8 ignore stop */\n )\n\nconst exists = async (path: string): Promise<boolean> => {\n try {\n await lstat(path)\n return true\n } catch {\n return false\n }\n}\n\nlet id = 1\nconst tmp = randomBytes(6).toString('hex') + '.'\nconst tmpSuffix = () => tmp + String(id++)\n\nconst checkFs = (\n h: Header,\n tarDir: string | undefined,\n): h is Header & { path: string } => {\n /* c8 ignore start - impossible */\n if (!h.path) return false\n if (!tarDir) return false\n /* c8 ignore stop */\n h.path = h.path.replace(/[\\\\/]+/g, '/')\n const parsed = parse(h.path)\n if (parsed.root) return false\n const p = h.path.replace(/\\\\/, '/')\n // any .. at the beginning, end, or middle = no good\n if (/(\\/|)^\\.\\.(\\/|$)/.test(p)) return false\n // packages should always be in a 'package' tarDir in the archive\n if (!p.startsWith(tarDir)) return false\n return true\n}\n\nconst write = async (\n path: string,\n body: Buffer,\n executable = false,\n) => {\n await mkdirp(dirname(path))\n // if the mode is world-executable, then make it executable\n // this is needed for some packages that have a file that is\n // not a declared bin, but still used as a cli executable.\n await writeFile(path, body, {\n mode: executable ? 0o777 : 0o666,\n })\n}\n\nconst made = new Set<string>()\nconst making = new Map<string, Promise<boolean>>()\nconst mkdirp = async (d: string) => {\n if (!made.has(d)) {\n const m =\n making.get(d) ??\n mkdir(d, { recursive: true, mode: 0o777 }).then(() =>\n making.delete(d),\n )\n making.set(d, m)\n await m\n made.add(d)\n }\n}\n\nexport const unpack = async (\n tarData: Buffer,\n target: string,\n): Promise<void> => {\n const isGzip = tarData[0] === 0x1f && tarData[1] === 0x8b\n await unpackUnzipped(\n isGzip ? await unzip(tarData) : tarData,\n target,\n )\n}\n\nconst unpackUnzipped = async (\n buffer: Buffer,\n target: string,\n): Promise<void> => {\n /* c8 ignore start */\n const isGzip = buffer[0] === 0x1f && buffer[1] === 0x8b\n if (isGzip) {\n throw error('still gzipped after unzipping', {\n found: isGzip,\n wanted: false,\n })\n }\n /* c8 ignore stop */\n\n // another real quick gutcheck before we get started\n if (buffer.length % 512 !== 0) {\n throw error('Invalid tarball: length not divisible by 512', {\n found: buffer.length,\n })\n }\n if (buffer.length < 1024) {\n throw error(\n 'Invalid tarball: not terminated by 1024 null bytes',\n { found: buffer.length },\n )\n }\n // make sure the last kb is all zeros\n for (let i = buffer.length - 1024; i < buffer.length; i++) {\n if (buffer[i] !== 0) {\n throw error(\n 'Invalid tarball: not terminated by 1024 null bytes',\n { found: buffer.subarray(i, i + 10) },\n )\n }\n }\n\n const tmp =\n dirname(target) + '/.' + basename(target) + '.' + tmpSuffix()\n const og = tmp + '.ORIGINAL'\n await Promise.all([rimraf(tmp), rimraf(og)])\n\n let succeeded = false\n try {\n let tarDir: string | undefined = undefined\n let offset = 0\n let h: Header\n let ex: HeaderData | undefined = undefined\n let gex: HeaderData | undefined = undefined\n while (\n offset < buffer.length &&\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n (h = new Header(buffer, offset, ex, gex)) &&\n !h.nullBlock\n ) {\n offset += 512\n ex = undefined\n gex = undefined\n const size = h.size ?? 0\n const body = buffer.subarray(offset, offset + size)\n // skip invalid headers\n if (!h.cksumValid) continue\n offset += 512 * Math.ceil(size / 512)\n\n // TODO: tarDir might not be named \"package/\"\n // find the first tarDir in the first entry, and use that.\n switch (h.type) {\n case 'File':\n if (!tarDir) tarDir = findTarDir(h.path, tarDir)\n /* c8 ignore next */\n if (!tarDir) continue\n if (!checkFs(h, tarDir)) continue\n await write(\n resolve(tmp, h.path.substring(tarDir.length)),\n body,\n // if it's world-executable, it's an executable\n // otherwise, make it read-only.\n 1 === ((h.mode ?? 0x666) & 1),\n )\n break\n\n case 'Directory':\n /* c8 ignore next 2 */\n if (!tarDir) tarDir = findTarDir(h.path, tarDir)\n if (!tarDir) continue\n if (!checkFs(h, tarDir)) continue\n await mkdirp(resolve(tmp, h.path.substring(tarDir.length)))\n break\n\n case 'GlobalExtendedHeader':\n gex = Pax.parse(body.toString(), gex, true)\n break\n\n case 'ExtendedHeader':\n case 'OldExtendedHeader':\n ex = Pax.parse(body.toString(), ex, false)\n break\n\n case 'NextFileHasLongPath':\n case 'OldGnuLongPath':\n ex ??= Object.create(null) as HeaderData\n ex.path = body.toString().replace(/\\0.*/, '')\n break\n }\n }\n\n const targetExists = await exists(target)\n if (targetExists) await rename(target, og)\n await rename(tmp, target)\n if (targetExists) await rimraf(og)\n succeeded = true\n } finally {\n // do not handle error or obscure throw site, just do the cleanup\n // if it didn't complete successfully.\n if (!succeeded) {\n /* c8 ignore start */\n if (await exists(og)) {\n await rimraf(target)\n await rename(og, target)\n }\n /* c8 ignore stop */\n await rimraf(tmp)\n }\n }\n}\n", "// parse a 512-byte header block to a data object, or vice-versa\n// encode returns `true` if a pax extended header is needed, because\n// the data could not be faithfully encoded in a simple header.\n// (Also, check header.needPax to see if it needs a pax header.)\n\nimport { posix as pathModule } from 'node:path'\nimport * as large from './large-numbers.js'\nimport type { EntryTypeCode, EntryTypeName } from './types.js'\nimport * as types from './types.js'\n\nexport type HeaderData = {\n path?: string\n mode?: number\n uid?: number\n gid?: number\n size?: number\n cksum?: number\n type?: EntryTypeName | 'Unsupported'\n linkpath?: string\n uname?: string\n gname?: string\n devmaj?: number\n devmin?: number\n atime?: Date\n ctime?: Date\n mtime?: Date\n\n // fields that are common in extended PAX headers, but not in the\n // \"standard\" tar header block\n charset?: string\n comment?: string\n dev?: number\n ino?: number\n nlink?: number\n}\n\nexport class Header implements HeaderData {\n cksumValid: boolean = false\n needPax: boolean = false\n nullBlock: boolean = false\n\n block?: Buffer\n path?: string\n mode?: number\n uid?: number\n gid?: number\n size?: number\n cksum?: number\n #type: EntryTypeCode | 'Unsupported' = 'Unsupported'\n linkpath?: string\n uname?: string\n gname?: string\n devmaj: number = 0\n devmin: number = 0\n atime?: Date\n ctime?: Date\n mtime?: Date\n\n charset?: string\n comment?: string\n\n constructor(\n data?: Buffer | HeaderData,\n off: number = 0,\n ex?: HeaderData,\n gex?: HeaderData,\n ) {\n if (Buffer.isBuffer(data)) {\n this.decode(data, off || 0, ex, gex)\n } else if (data) {\n this.#slurp(data)\n }\n }\n\n decode(\n buf: Buffer,\n off: number,\n ex?: HeaderData,\n gex?: HeaderData,\n ) {\n if (!off) {\n off = 0\n }\n\n if (!buf || !(buf.length >= off + 512)) {\n throw new Error('need 512 bytes for header')\n }\n\n this.path = decString(buf, off, 100)\n this.mode = decNumber(buf, off + 100, 8)\n this.uid = decNumber(buf, off + 108, 8)\n this.gid = decNumber(buf, off + 116, 8)\n this.size = decNumber(buf, off + 124, 12)\n this.mtime = decDate(buf, off + 136, 12)\n this.cksum = decNumber(buf, off + 148, 12)\n\n // if we have extended or global extended headers, apply them now\n // See https://github.com/npm/node-tar/pull/187\n // Apply global before local, so it overrides\n if (gex) this.#slurp(gex, true)\n if (ex) this.#slurp(ex)\n\n // old tar versions marked dirs as a file with a trailing /\n const t = decString(buf, off + 156, 1)\n if (types.isCode(t)) {\n this.#type = t || '0'\n }\n if (this.#type === '0' && this.path.slice(-1) === '/') {\n this.#type = '5'\n }\n\n // tar implementations sometimes incorrectly put the stat(dir).size\n // as the size in the tarball, even though Directory entries are\n // not able to have any body at all. In the very rare chance that\n // it actually DOES have a body, we weren't going to do anything with\n // it anyway, and it'll just be a warning about an invalid header.\n if (this.#type === '5') {\n this.size = 0\n }\n\n this.linkpath = decString(buf, off + 157, 100)\n if (\n buf.subarray(off + 257, off + 265).toString() ===\n 'ustar\\u000000'\n ) {\n this.uname = decString(buf, off + 265, 32)\n this.gname = decString(buf, off + 297, 32)\n /* c8 ignore start */\n this.devmaj = decNumber(buf, off + 329, 8) ?? 0\n this.devmin = decNumber(buf, off + 337, 8) ?? 0\n /* c8 ignore stop */\n if (buf[off + 475] !== 0) {\n // definitely a prefix, definitely >130 chars.\n const prefix = decString(buf, off + 345, 155)\n this.path = prefix + '/' + this.path\n } else {\n const prefix = decString(buf, off + 345, 130)\n if (prefix) {\n this.path = prefix + '/' + this.path\n }\n this.atime = decDate(buf, off + 476, 12)\n this.ctime = decDate(buf, off + 488, 12)\n }\n }\n\n let sum = 8 * 0x20\n for (let i = off; i < off + 148; i++) {\n sum += buf[i] as number\n }\n\n for (let i = off + 156; i < off + 512; i++) {\n sum += buf[i] as number\n }\n\n this.cksumValid = sum === this.cksum\n if (this.cksum === undefined && sum === 8 * 0x20) {\n this.nullBlock = true\n }\n }\n\n #slurp(ex: HeaderData, gex: boolean = false) {\n Object.assign(\n this,\n Object.fromEntries(\n Object.entries(ex).filter(([k, v]) => {\n // we slurp in everything except for the path attribute in\n // a global extended header, because that's weird. Also, any\n // null/undefined values are ignored.\n return !(\n v === null ||\n v === undefined ||\n (k === 'path' && gex) ||\n (k === 'linkpath' && gex) ||\n k === 'global'\n )\n }),\n ),\n )\n }\n\n encode(buf?: Buffer, off: number = 0) {\n if (!buf) {\n buf = this.block = Buffer.alloc(512)\n }\n\n if (this.#type === 'Unsupported') {\n this.#type = '0'\n }\n\n if (!(buf.length >= off + 512)) {\n throw new Error('need 512 bytes for header')\n }\n\n const prefixSize = this.ctime || this.atime ? 130 : 155\n const split = splitPrefix(this.path || '', prefixSize)\n const path = split[0]\n const prefix = split[1]\n this.needPax = !!split[2]\n\n this.needPax = encString(buf, off, 100, path) || this.needPax\n this.needPax =\n encNumber(buf, off + 100, 8, this.mode) || this.needPax\n this.needPax =\n encNumber(buf, off + 108, 8, this.uid) || this.needPax\n this.needPax =\n encNumber(buf, off + 116, 8, this.gid) || this.needPax\n this.needPax =\n encNumber(buf, off + 124, 12, this.size) || this.needPax\n this.needPax =\n encDate(buf, off + 136, 12, this.mtime) || this.needPax\n buf[off + 156] = this.#type.charCodeAt(0)\n this.needPax =\n encString(buf, off + 157, 100, this.linkpath) || this.needPax\n buf.write('ustar\\u000000', off + 257, 8)\n this.needPax =\n encString(buf, off + 265, 32, this.uname) || this.needPax\n this.needPax =\n encString(buf, off + 297, 32, this.gname) || this.needPax\n this.needPax =\n encNumber(buf, off + 329, 8, this.devmaj) || this.needPax\n this.needPax =\n encNumber(buf, off + 337, 8, this.devmin) || this.needPax\n this.needPax =\n encString(buf, off + 345, prefixSize, prefix) || this.needPax\n if (buf[off + 475] !== 0) {\n this.needPax =\n encString(buf, off + 345, 155, prefix) || this.needPax\n } else {\n this.needPax =\n encString(buf, off + 345, 130, prefix) || this.needPax\n this.needPax =\n encDate(buf, off + 476, 12, this.atime) || this.needPax\n this.needPax =\n encDate(buf, off + 488, 12, this.ctime) || this.needPax\n }\n\n let sum = 8 * 0x20\n for (let i = off; i < off + 148; i++) {\n sum += buf[i] as number\n }\n\n for (let i = off + 156; i < off + 512; i++) {\n sum += buf[i] as number\n }\n\n this.cksum = sum\n encNumber(buf, off + 148, 8, this.cksum)\n this.cksumValid = true\n\n return this.needPax\n }\n\n get type(): EntryTypeName {\n return (\n this.#type === 'Unsupported' ?\n this.#type\n : types.name.get(this.#type)) as EntryTypeName\n }\n\n get typeKey(): EntryTypeCode | 'Unsupported' {\n return this.#type\n }\n\n set type(type: EntryTypeCode | EntryTypeName | 'Unsupported') {\n const c = String(types.code.get(type as EntryTypeName))\n if (types.isCode(c) || c === 'Unsupported') {\n this.#type = c\n } else if (types.isCode(type)) {\n this.#type = type\n } else {\n throw new TypeError('invalid entry type: ' + type)\n }\n }\n}\n\nconst splitPrefix = (\n p: string,\n prefixSize: number,\n): [string, string, boolean] => {\n const pathSize = 100\n let pp = p\n let prefix = ''\n let ret: undefined | [string, string, boolean] = undefined\n const root = pathModule.parse(p).root || '.'\n\n if (Buffer.byteLength(pp) < pathSize) {\n ret = [pp, prefix, false]\n } else {\n // first set prefix to the dir, and path to the base\n prefix = pathModule.dirname(pp)\n pp = pathModule.basename(pp)\n\n do {\n if (\n Buffer.byteLength(pp) <= pathSize &&\n Buffer.byteLength(prefix) <= prefixSize\n ) {\n // both fit!\n ret = [pp, prefix, false]\n } else if (\n Buffer.byteLength(pp) > pathSize &&\n Buffer.byteLength(prefix) <= prefixSize\n ) {\n // prefix fits in prefix, but path doesn't fit in path\n ret = [pp.slice(0, pathSize - 1), prefix, true]\n } else {\n // make path take a bit from prefix\n pp = pathModule.join(pathModule.basename(prefix), pp)\n prefix = pathModule.dirname(prefix)\n }\n } while (prefix !== root && ret === undefined)\n\n // at this point, found no resolution, just truncate\n if (!ret) {\n ret = [p.slice(0, pathSize - 1), '', true]\n }\n }\n return ret\n}\n\nconst decString = (buf: Buffer, off: number, size: number) =>\n buf\n .subarray(off, off + size)\n .toString('utf8')\n .replace(/\\0.*/, '')\n\nconst decDate = (buf: Buffer, off: number, size: number) =>\n numToDate(decNumber(buf, off, size))\n\nconst numToDate = (num?: number) =>\n num === undefined ? undefined : new Date(num * 1000)\n\nconst decNumber = (buf: Buffer, off: number, size: number) =>\n Number(buf[off]) & 0x80 ?\n large.parse(buf.subarray(off, off + size))\n : decSmallNumber(buf, off, size)\n\nconst nanUndef = (value: number) => (isNaN(value) ? undefined : value)\n\nconst decSmallNumber = (buf: Buffer, off: number, size: number) =>\n nanUndef(\n parseInt(\n buf\n .subarray(off, off + size)\n .toString('utf8')\n .replace(/\\0.*$/, '')\n .trim(),\n 8,\n ),\n )\n\n// the maximum encodable as a null-terminated octal, by field size\nconst MAXNUM = {\n 12: 0o77777777777,\n 8: 0o7777777,\n}\n\nconst encNumber = (\n buf: Buffer,\n off: number,\n size: 12 | 8,\n num?: number,\n) =>\n num === undefined ? false\n : num > MAXNUM[size] || num < 0 ?\n (large.encode(num, buf.subarray(off, off + size)), true)\n : (encSmallNumber(buf, off, size, num), false)\n\nconst encSmallNumber = (\n buf: Buffer,\n off: number,\n size: number,\n num: number,\n) => buf.write(octalString(num, size), off, size, 'ascii')\n\nconst octalString = (num: number, size: number) =>\n padOctal(Math.floor(num).toString(8), size)\n\nconst padOctal = (str: string, size: number) =>\n (str.length === size - 1 ?\n str\n : new Array(size - str.length - 1).join('0') + str + ' ') + '\\0'\n\nconst encDate = (\n buf: Buffer,\n off: number,\n size: 8 | 12,\n date?: Date,\n) =>\n date === undefined ? false : (\n encNumber(buf, off, size, date.getTime() / 1000)\n )\n\n// enough to fill the longest string we've got\nconst NULLS = new Array(156).join('\\0')\n// pad with nulls, return true if it's longer or non-ascii\nconst encString = (\n buf: Buffer,\n off: number,\n size: number,\n str?: string,\n) =>\n str === undefined ? false : (\n (buf.write(str + NULLS, off, size, 'utf8'),\n str.length !== Buffer.byteLength(str) || str.length > size)\n )\n", "// Tar can encode large and negative numbers using a leading byte of\n// 0xff for negative, and 0x80 for positive.\n\nexport const encode = (num: number, buf: Buffer) => {\n if (!Number.isSafeInteger(num)) {\n // The number is so large that javascript cannot represent it with integer\n // precision.\n throw Error(\n 'cannot encode number outside of javascript safe integer range',\n )\n } else if (num < 0) {\n encodeNegative(num, buf)\n } else {\n encodePositive(num, buf)\n }\n return buf\n}\n\nconst encodePositive = (num: number, buf: Buffer) => {\n buf[0] = 0x80\n\n for (var i = buf.length; i > 1; i--) {\n buf[i - 1] = num & 0xff\n num = Math.floor(num / 0x100)\n }\n}\n\nconst encodeNegative = (num: number, buf: Buffer) => {\n buf[0] = 0xff\n var flipped = false\n num = num * -1\n for (var i = buf.length; i > 1; i--) {\n var byte = num & 0xff\n num = Math.floor(num / 0x100)\n if (flipped) {\n buf[i - 1] = onesComp(byte)\n } else if (byte === 0) {\n buf[i - 1] = 0\n } else {\n flipped = true\n buf[i - 1] = twosComp(byte)\n }\n }\n}\n\nexport const parse = (buf: Buffer) => {\n const pre = buf[0]\n const value =\n pre === 0x80 ? pos(buf.subarray(1, buf.length))\n : pre === 0xff ? twos(buf)\n : null\n if (value === null) {\n throw Error('invalid base256 encoding')\n }\n\n if (!Number.isSafeInteger(value)) {\n // The number is so large that javascript cannot represent it with integer\n // precision.\n throw Error(\n 'parsed number outside of javascript safe integer range',\n )\n }\n\n return value\n}\n\nconst twos = (buf: Buffer) => {\n var len = buf.length\n var sum = 0\n var flipped = false\n for (var i = len - 1; i > -1; i--) {\n var byte = Number(buf[i])\n var f\n if (flipped) {\n f = onesComp(byte)\n } else if (byte === 0) {\n f = byte\n } else {\n flipped = true\n f = twosComp(byte)\n }\n if (f !== 0) {\n sum -= f * Math.pow(256, len - i - 1)\n }\n }\n return sum\n}\n\nconst pos = (buf: Buffer) => {\n var len = buf.length\n var sum = 0\n for (var i = len - 1; i > -1; i--) {\n var byte = Number(buf[i])\n if (byte !== 0) {\n sum += byte * Math.pow(256, len - i - 1)\n }\n }\n return sum\n}\n\nconst onesComp = (byte: number) => (0xff ^ byte) & 0xff\n\nconst twosComp = (byte: number) => ((0xff ^ byte) + 1) & 0xff\n", "export const isCode = (c: string): c is EntryTypeCode =>\n name.has(c as EntryTypeCode)\n\nexport const isName = (c: string): c is EntryTypeName =>\n code.has(c as EntryTypeName)\n\nexport type EntryTypeCode =\n | '0'\n | ''\n | '1'\n | '2'\n | '3'\n | '4'\n | '5'\n | '6'\n | '7'\n | 'g'\n | 'x'\n | 'A'\n | 'D'\n | 'I'\n | 'K'\n | 'L'\n | 'M'\n | 'N'\n | 'S'\n | 'V'\n | 'X'\n\nexport type EntryTypeName =\n | 'File'\n | 'OldFile'\n | 'Link'\n | 'SymbolicLink'\n | 'CharacterDevice'\n | 'BlockDevice'\n | 'Directory'\n | 'FIFO'\n | 'ContiguousFile'\n | 'GlobalExtendedHeader'\n | 'ExtendedHeader'\n | 'SolarisACL'\n | 'GNUDumpDir'\n | 'Inode'\n | 'NextFileHasLongLinkpath'\n | 'NextFileHasLongPath'\n | 'ContinuationFile'\n | 'OldGnuLongPath'\n | 'SparseFile'\n | 'TapeVolumeHeader'\n | 'OldExtendedHeader'\n | 'Unsupported'\n\n// map types from key to human-friendly name\nexport const name = new Map<EntryTypeCode, EntryTypeName>([\n ['0', 'File'],\n // same as File\n ['', 'OldFile'],\n ['1', 'Link'],\n ['2', 'SymbolicLink'],\n // Devices and FIFOs aren't fully supported\n // they are parsed, but skipped when unpacking\n ['3', 'CharacterDevice'],\n ['4', 'BlockDevice'],\n ['5', 'Directory'],\n ['6', 'FIFO'],\n // same as File\n ['7', 'ContiguousFile'],\n // pax headers\n ['g', 'GlobalExtendedHeader'],\n ['x', 'ExtendedHeader'],\n // vendor-specific stuff\n // skip\n ['A', 'SolarisACL'],\n // like 5, but with data, which should be skipped\n ['D', 'GNUDumpDir'],\n // metadata only, skip\n ['I', 'Inode'],\n // data = link path of next file\n ['K', 'NextFileHasLongLinkpath'],\n // data = path of next file\n ['L', 'NextFileHasLongPath'],\n // skip\n ['M', 'ContinuationFile'],\n // like L\n ['N', 'OldGnuLongPath'],\n // skip\n ['S', 'SparseFile'],\n // skip\n ['V', 'TapeVolumeHeader'],\n // like x\n ['X', 'OldExtendedHeader'],\n])\n\n// map the other direction\nexport const code = new Map<EntryTypeName, EntryTypeCode>(\n Array.from(name).map(kv => [kv[1], kv[0]]),\n)\n", "import { basename } from 'node:path'\nimport { Header, HeaderData } from './header.js'\n\nexport class Pax implements HeaderData {\n atime?: Date\n mtime?: Date\n ctime?: Date\n\n charset?: string\n comment?: string\n\n gid?: number\n uid?: number\n\n gname?: string\n uname?: string\n linkpath?: string\n dev?: number\n ino?: number\n nlink?: number\n path?: string\n size?: number\n mode?: number\n\n global: boolean\n\n constructor(obj: HeaderData, global: boolean = false) {\n this.atime = obj.atime\n this.charset = obj.charset\n this.comment = obj.comment\n this.ctime = obj.ctime\n this.dev = obj.dev\n this.gid = obj.gid\n this.global = global\n this.gname = obj.gname\n this.ino = obj.ino\n this.linkpath = obj.linkpath\n this.mtime = obj.mtime\n this.nlink = obj.nlink\n this.path = obj.path\n this.size = obj.size\n this.uid = obj.uid\n this.uname = obj.uname\n }\n\n encode() {\n const body = this.encodeBody()\n if (body === '') {\n return Buffer.allocUnsafe(0)\n }\n\n const bodyLen = Buffer.byteLength(body)\n // round up to 512 bytes\n // add 512 for header\n const bufLen = 512 * Math.ceil(1 + bodyLen / 512)\n const buf = Buffer.allocUnsafe(bufLen)\n\n // 0-fill the header section, it might not hit every field\n for (let i = 0; i < 512; i++) {\n buf[i] = 0\n }\n\n new Header({\n // XXX split the path\n // then the path should be PaxHeader + basename, but less than 99,\n // prepend with the dirname\n /* c8 ignore start */\n path: ('PaxHeader/' + basename(this.path ?? '')).slice(0, 99),\n /* c8 ignore stop */\n mode: this.mode || 0o644,\n uid: this.uid,\n gid: this.gid,\n size: bodyLen,\n mtime: this.mtime,\n type: this.global ? 'GlobalExtendedHeader' : 'ExtendedHeader',\n linkpath: '',\n uname: this.uname || '',\n gname: this.gname || '',\n devmaj: 0,\n devmin: 0,\n atime: this.atime,\n ctime: this.ctime,\n }).encode(buf)\n\n buf.write(body, 512, bodyLen, 'utf8')\n\n // null pad after the body\n for (let i = bodyLen + 512; i < buf.length; i++) {\n buf[i] = 0\n }\n\n return buf\n }\n\n encodeBody() {\n return (\n this.encodeField('path') +\n this.encodeField('ctime') +\n this.encodeField('atime') +\n this.encodeField('dev') +\n this.encodeField('ino') +\n this.encodeField('nlink') +\n this.encodeField('charset') +\n this.encodeField('comment') +\n this.encodeField('gid') +\n this.encodeField('gname') +\n this.encodeField('linkpath') +\n this.encodeField('mtime') +\n this.encodeField('size') +\n this.encodeField('uid') +\n this.encodeField('uname')\n )\n }\n\n encodeField(field: keyof Pax): string {\n if (this[field] === undefined) {\n return ''\n }\n const r = this[field]\n const v = r instanceof Date ? r.getTime() / 1000 : r\n const s =\n ' ' +\n (field === 'dev' || field === 'ino' || field === 'nlink' ?\n 'SCHILY.'\n : '') +\n field +\n '=' +\n v +\n '\\n'\n const byteLen = Buffer.byteLength(s)\n // the digits includes the length of the digits in ascii base-10\n // so if it's 9 characters, then adding 1 for the 9 makes it 10\n // which makes it 11 chars.\n let digits = Math.floor(Math.log(byteLen) / Math.log(10)) + 1\n if (byteLen + digits >= Math.pow(10, digits)) {\n digits += 1\n }\n const len = digits + byteLen\n return len + s\n }\n\n static parse(str: string, ex?: HeaderData, g: boolean = false) {\n return new Pax(merge(parseKV(str), ex), g)\n }\n}\n\nconst merge = (a: HeaderData, b?: HeaderData) =>\n b ? Object.assign({}, b, a) : a\n\nconst parseKV = (str: string) =>\n str\n .replace(/\\n$/, '')\n .split('\\n')\n .reduce(parseKVLine, Object.create(null))\n\nconst parseKVLine = (set: Record<string, any>, line: string) => {\n const n = parseInt(line, 10)\n\n // XXX Values with \\n in them will fail this.\n // Refactor to not be a naive line-by-line parse.\n if (n !== Buffer.byteLength(line) + 1) {\n return set\n }\n\n line = line.slice((n + ' ').length)\n const kv = line.split('=')\n const r = kv.shift()\n\n if (!r) {\n return set\n }\n\n const k = r.replace(/^SCHILY\\.(dev|ino|nlink)/, '$1')\n\n const v = kv.join('=')\n set[k] =\n /^([A-Z]+\\.)?([mac]|birth|creation)time$/.test(k) ?\n new Date(Number(v) * 1000)\n : /^[0-9]+$/.test(v) ? +v\n : v\n return set\n}\n", "// usually this will be 'package/', but could also be anything\n// eg, github tarballs are ${user}-${project}-${committish}\n// if it starts with `./` then all entries must as well.\nexport const findTarDir = (\n path: string | undefined,\n tarDir?: string,\n) => {\n if (tarDir !== undefined) return tarDir\n if (!path) return undefined\n const i = path.indexOf('/', path.startsWith('./') ? 2 : 0)\n if (i === -1) return undefined\n const chomp = path.substring(0, i)\n if (\n chomp === '.' ||\n chomp === '..' ||\n chomp === '' ||\n chomp === './.' ||\n chomp === './..' ||\n chomp === './'\n ) {\n return undefined\n }\n return chomp + '/'\n}\n", "import { error } from '@vltpkg/error-cause'\nimport os from 'os'\nimport { UnpackRequest } from './unpack-request.ts'\nimport { isResponseOK, Worker } from './worker.ts'\nimport type { ResponseError, ResponseOK } from './worker.ts'\n\nexport * from './worker.ts'\n\n/**\n * Automatically expanding/contracting set of workers to maximize parallelism\n * of unpack operations up to 1 less than the number of CPUs (or 1).\n *\n * `pool.unpack(tarData, target)` will perform the unpack operation\n * synchronously, in one of these workers, and returns a promise when the\n * worker has confirmed completion of the task.\n */\nexport class Pool {\n /**\n * Number of workers to emplly. Defaults to 1 less than the number of\n * CPUs, or 1.\n */\n /* c8 ignore next */\n jobs: number = 8 * (Math.max(os.availableParallelism(), 2) - 1)\n /**\n * Set of currently active worker threads\n */\n workers = new Set<Worker>()\n /**\n * Queue of requests awaiting an available worker\n */\n queue: UnpackRequest[] = []\n /**\n * Requests that have been assigned to a worker, but have not yet\n * been confirmed completed.\n */\n pending = new Map<number, UnpackRequest>()\n\n // handle a message from the worker\n #onMessage(w: Worker, m: ResponseError | ResponseOK) {\n const { id } = m\n // a request has been met or failed, report and either\n // pick up the next item in the queue, or terminate worker\n const ur = this.pending.get(id)\n /* c8 ignore next */\n if (!ur) return\n if (isResponseOK(m)) {\n ur.resolve()\n /* c8 ignore start - nearly impossible in normal circumstances */\n } else {\n const message =\n m.error instanceof Error ? m.error.message : String(m.error)\n ur.reject(\n error(message || 'failed without error message', {\n found: m,\n cause: m.error,\n }),\n )\n }\n /* c8 ignore stop */\n const next = this.queue.shift()\n if (!next) {\n this.workers.delete(w)\n } else {\n void w.process(next)\n }\n }\n\n // create a new worker\n #createWorker(req: UnpackRequest) {\n const w: Worker = new Worker((m: ResponseError | ResponseOK) =>\n this.#onMessage(w, m),\n )\n this.workers.add(w)\n void w.process(req)\n }\n\n /**\n * Provide the tardata to be unpacked, and the location where it's to be\n * placed. Will create a new worker up to the `jobs` value, and then start\n * pushing in the queue for workers to pick up as they become available.\n *\n * Returned promise resolves when the provided tarball has been extracted.\n */\n async unpack(tarData: Buffer, target: string) {\n const ur = new UnpackRequest(tarData, target)\n this.pending.set(ur.id, ur)\n if (this.workers.size < this.jobs) {\n this.#createWorker(ur)\n } else {\n this.queue.push(ur)\n }\n return ur.promise\n }\n}\n", "let ID = 1\nexport class UnpackRequest {\n id: number = ID++\n tarData: Buffer\n target: string\n resolve!: () => void\n reject!: (reason?: any) => void\n promise = new Promise<void>((res, rej) => {\n this.resolve = res\n this.reject = rej\n })\n constructor(tarData: Buffer, target: string) {\n this.tarData = tarData\n this.target = target\n }\n}\n", "import type { UnpackRequest } from './unpack-request.ts'\nimport { unpack } from './unpack.ts'\n\nexport type ResponseError = { id: number; error: unknown }\nexport type ResponseOK = { id: number; ok: true }\n\nconst isObj = (o: unknown): o is Record<string, unknown> =>\n !!o && typeof o === 'object'\n\nexport const isResponseOK = (o: unknown): o is ResponseOK =>\n isObj(o) && typeof o.id === 'number' && o.ok === true\n\n/**\n * Basically just a queue of unpack requests,\n * to keep them throttled to a reasonable amount of parallelism\n */\nexport class Worker {\n onMessage: (m: ResponseError | ResponseOK) => void\n\n constructor(onMessage: (m: ResponseError | ResponseOK) => void) {\n this.onMessage = onMessage\n }\n\n async process(req: UnpackRequest) {\n const { target, tarData, id } = req\n try {\n await unpack(tarData, target)\n const m: ResponseOK = { id, ok: true }\n this.onMessage(m)\n } catch (error) {\n const m: ResponseError = { id, error }\n this.onMessage(m)\n }\n }\n}\n", "import { error } from '@vltpkg/error-cause'\nimport type { ErrorCauseObject } from '@vltpkg/error-cause'\nimport { clone, resolve as gitResolve, revs } from '@vltpkg/git'\nimport { PackageJson } from '@vltpkg/package-json'\nimport { pickManifest } from '@vltpkg/pick-manifest'\nimport type { PickManifestOptions } from '@vltpkg/pick-manifest'\nimport { RegistryClient } from '@vltpkg/registry-client'\nimport type { RegistryClientOptions } from '@vltpkg/registry-client'\nimport { Spec } from '@vltpkg/spec'\nimport type { SpecOptions } from '@vltpkg/spec'\nimport { Pool } from '@vltpkg/tar'\nimport { asPackument } from '@vltpkg/types'\nimport type { Integrity, Manifest, Packument } from '@vltpkg/types'\nimport { Monorepo } from '@vltpkg/workspaces'\nimport { XDG } from '@vltpkg/xdg'\nimport { randomBytes } from 'crypto'\nimport { readFile, rm, stat, symlink } from 'fs/promises'\nimport {\n basename,\n dirname,\n relative,\n resolve as pathResolve,\n} from 'path'\nimport { create as tarC } from 'tar'\nimport { rename } from './rename.ts'\n\nconst xdg = new XDG('vlt')\n\nexport type Resolution = {\n resolved: string\n integrity?: Integrity\n signatures?: Exclude<Manifest['dist'], undefined>['signatures']\n spec: Spec\n}\n\nexport type PackageInfoClientOptions = RegistryClientOptions &\n SpecOptions & {\n /** root of the project. Defaults to process.cwd() */\n projectRoot?: string\n /** PackageJson object */\n packageJson?: PackageJson\n\n monorepo?: Monorepo\n\n /** workspace groups to load, irrelevant if Monorepo provided */\n 'workspace-group'?: string[]\n\n /** workspace paths to load, irrelevant if Monorepo provided */\n workspace?: string[]\n }\n\nexport type PackageInfoClientRequestOptions = PickManifestOptions & {\n /** dir to resolve `file://` specifiers against. Defaults to projectRoot. */\n from?: string\n}\n\nexport type PackageInfoClientExtractOptions =\n PackageInfoClientRequestOptions & {\n integrity?: Integrity\n resolved?: string\n }\n\nexport type PackageInfoClientAllOptions = PackageInfoClientOptions &\n PackageInfoClientRequestOptions &\n PackageInfoClientExtractOptions\n\n// provide some helper methods at the top level. Re-use the client if\n// the same options are provided.\nconst clients = new Map<string, PackageInfoClient>()\nconst client = (o: PackageInfoClientAllOptions = {}) => {\n const {\n from: _from,\n packageJson: _packageJson,\n workspace: _workspace,\n 'workspace-group': _workspaceGroup,\n ...opts\n } = o\n const key = JSON.stringify(\n Object.entries(opts).sort(([a], [b]) => a.localeCompare(b, 'en')),\n )\n const c = clients.get(key) ?? new PackageInfoClient(opts)\n clients.set(key, c)\n return c\n}\n\nexport const packument = async (\n spec: Spec | string,\n options: PackageInfoClientAllOptions = {},\n): Promise<Packument> => client(options).packument(spec, options)\n\nexport const manifest = async (\n spec: Spec | string,\n options: PackageInfoClientAllOptions = {},\n): Promise<Manifest> => client(options).manifest(spec, options)\n\nexport const resolve = async (\n spec: Spec | string,\n options: PackageInfoClientAllOptions = {},\n): Promise<Resolution> => client(options).resolve(spec, options)\n\nexport const tarball = async (\n spec: Spec | string,\n options: PackageInfoClientAllOptions = {},\n): Promise<Buffer> => client(options).tarball(spec, options)\n\nexport const extract = async (\n spec: Spec | string,\n target: string,\n options: PackageInfoClientAllOptions = {},\n): Promise<Resolution> =>\n client(options).extract(spec, target, options)\n\nexport class PackageInfoClient {\n #registryClient?: RegistryClient\n #projectRoot: string\n #tarPool?: Pool\n options: PackageInfoClientOptions\n #resolutions = new Map<string, Resolution>()\n packageJson: PackageJson\n monorepo?: Monorepo\n\n get registryClient() {\n if (!this.#registryClient) {\n this.#registryClient = new RegistryClient(this.options)\n }\n return this.#registryClient\n }\n\n get tarPool() {\n if (!this.#tarPool) this.#tarPool = new Pool()\n return this.#tarPool\n }\n\n constructor(options: PackageInfoClientOptions = {}) {\n this.options = options\n this.#projectRoot = options.projectRoot || process.cwd()\n this.packageJson = options.packageJson ?? new PackageJson()\n const wsLoad = {\n ...(options.workspace?.length && { paths: options.workspace }),\n ...(options['workspace-group']?.length && {\n groups: options['workspace-group'],\n }),\n }\n this.monorepo =\n options.monorepo ??\n Monorepo.maybeLoad(this.#projectRoot, {\n load: wsLoad,\n packageJson: this.packageJson,\n })\n }\n\n async extract(\n spec: Spec | string,\n target: string,\n options: PackageInfoClientExtractOptions = {},\n ): Promise<Resolution> {\n if (typeof spec === 'string')\n spec = Spec.parse(spec, this.options)\n const { from = this.#projectRoot, integrity, resolved } = options\n const f = spec.final\n const r =\n integrity && resolved ?\n { resolved, integrity, spec }\n : await this.resolve(spec, options)\n switch (f.type) {\n case 'git': {\n const {\n gitRemote,\n gitCommittish,\n remoteURL,\n gitSelectorParsed,\n } = f\n if (!remoteURL) {\n /* c8 ignore start - Impossible, would throw on the resolve */\n if (!gitRemote)\n throw this.#resolveError(\n spec,\n options,\n 'no remote on git: specifier',\n )\n /* c8 ignore stop */\n const { path } = gitSelectorParsed ?? {}\n if (path !== undefined) {\n // use obvious name because it's in node_modules\n const tmp = pathResolve(\n dirname(target),\n `.TEMP.${basename(target)}-${randomBytes(6).toString('hex')}`,\n )\n await clone(gitRemote, gitCommittish, tmp, { spec })\n const src = pathResolve(tmp, path)\n await rename(src, target)\n // intentionally not awaited\n void rm(tmp, { recursive: true, force: true })\n } else {\n await clone(gitRemote, gitCommittish, target, { spec })\n // intentionally not awaited\n void rm(target + '/.git', { recursive: true })\n }\n return r\n }\n // fallthrough if a remote tarball url present\n }\n case 'registry':\n case 'remote': {\n const response = await this.registryClient.request(\n r.resolved,\n {\n integrity: r.integrity,\n },\n )\n if (response.statusCode !== 200) {\n throw this.#resolveError(\n spec,\n options,\n 'failed to fetch tarball',\n {\n url: r.resolved,\n response,\n },\n )\n }\n try {\n await this.tarPool.unpack(response.buffer(), target)\n } catch (er) {\n throw this.#resolveError(\n spec,\n options,\n 'tar unpack failed',\n { cause: er },\n )\n }\n return r\n }\n case 'file': {\n // if it's a directory, then \"extract\" means \"symlink\"\n const { file } = f\n /* c8 ignore start - asserted in resolve() */\n if (file === undefined)\n throw this.#resolveError(spec, options, 'no file path')\n /* c8 ignore stop */\n const path = pathResolve(from, file)\n const st = await stat(path)\n if (st.isFile()) {\n try {\n await this.tarPool.unpack(\n await this.tarball(spec, options),\n target,\n )\n } catch (er) {\n throw this.#resolveError(\n spec,\n options,\n 'tar unpack failed',\n { cause: er },\n )\n }\n } else if (st.isDirectory()) {\n const rel = relative(dirname(target), path)\n await symlink(rel, target, 'dir')\n /* c8 ignore start */\n } else {\n throw this.#resolveError(\n spec,\n options,\n 'file: specifier does not resolve to directory or tarball',\n )\n }\n /* c8 ignore stop */\n return r\n }\n case 'workspace': {\n const ws = this.#getWS(spec, options)\n const rel = relative(dirname(target), ws.fullpath)\n await symlink(rel, target, 'dir')\n return r\n }\n }\n }\n\n #getWS(spec: Spec, options: PackageInfoClientRequestOptions) {\n const { workspace } = spec\n /* c8 ignore start - asserted in resolve() */\n if (workspace === undefined)\n throw this.#resolveError(spec, options, 'no workspace ID')\n /* c8 ignore stop */\n if (!this.monorepo) {\n throw this.#resolveError(\n spec,\n options,\n 'Not in a monorepo, cannot resolve workspace spec',\n )\n }\n const ws = this.monorepo.get(workspace)\n if (!ws) {\n throw this.#resolveError(spec, options, 'workspace not found', {\n wanted: workspace,\n })\n }\n return ws\n }\n\n async tarball(\n spec: Spec | string,\n options: PackageInfoClientRequestOptions = {},\n ): Promise<Buffer> {\n if (typeof spec === 'string')\n spec = Spec.parse(spec, this.options)\n const f = spec.final\n switch (f.type) {\n case 'registry': {\n const { dist } = await this.manifest(spec, options)\n if (!dist)\n throw this.#resolveError(\n spec,\n options,\n 'no dist object found in manifest',\n )\n //TODO: handle signatures as well as integrity\n const { tarball, integrity } = dist\n if (!tarball)\n throw this.#resolveError(\n spec,\n options,\n 'no tarball found in manifest.dist',\n )\n const response = await this.registryClient.request(tarball, {\n integrity,\n })\n if (response.statusCode !== 200) {\n throw this.#resolveError(\n spec,\n options,\n 'failed to fetch tarball',\n { response, url: tarball },\n )\n }\n return response.buffer()\n }\n case 'git': {\n const {\n remoteURL,\n gitRemote,\n gitCommittish,\n gitSelectorParsed,\n } = f\n const s: Spec = spec\n if (!remoteURL) {\n if (!gitRemote) {\n throw this.#resolveError(\n spec,\n options,\n 'no remote on git: specifier',\n )\n }\n const { path } = gitSelectorParsed ?? {}\n return await this.#tmpdir(async dir => {\n await clone(gitRemote, gitCommittish, dir + '/package', {\n spec: s,\n })\n let cwd = dir\n if (path !== undefined) {\n const src = pathResolve(dir, 'package', path)\n cwd = dirname(src)\n const pkg = pathResolve(cwd, 'package')\n if (src !== pkg) {\n const rand = randomBytes(6).toString('hex')\n // faster than deleting\n await rename(pkg, pkg + rand).catch(() => {})\n await rename(src, pkg)\n }\n }\n return tarC({ cwd, gzip: true }, ['package']).concat()\n })\n }\n // fallthrough if remoteURL set\n }\n case 'remote': {\n const { remoteURL } = f\n if (!remoteURL) {\n throw this.#resolveError(spec, options)\n }\n const response = await this.registryClient.request(remoteURL)\n if (response.statusCode !== 200) {\n throw this.#resolveError(\n spec,\n options,\n 'failed to fetch URL',\n { response, url: remoteURL },\n )\n }\n return response.buffer()\n }\n case 'file': {\n const { file } = f\n if (file === undefined)\n throw this.#resolveError(spec, options, 'no file path')\n const { from = this.#projectRoot } = options\n const path = pathResolve(from, file)\n const st = await stat(path)\n if (st.isDirectory()) {\n const p = dirname(path)\n const b = basename(path)\n // TODO: Pack properly, ignore stuff, bundleDeps, etc\n return tarC({ cwd: p, gzip: true }, [b]).concat()\n }\n return readFile(path)\n }\n case 'workspace': {\n // TODO: Pack properly, ignore stuff, bundleDeps, etc\n const ws = this.#getWS(spec, options)\n const p = dirname(ws.fullpath)\n const b = basename(ws.fullpath)\n return tarC({ cwd: p, gzip: true }, [b]).concat()\n }\n }\n }\n\n async manifest(\n spec: Spec | string,\n options: PackageInfoClientRequestOptions = {},\n ) {\n const { from = this.#projectRoot } = options\n if (typeof spec === 'string')\n spec = Spec.parse(spec, this.options)\n const f = spec.final\n\n switch (f.type) {\n case 'registry': {\n const mani = pickManifest(\n await this.packument(f, options),\n spec,\n options,\n )\n if (!mani) throw this.#resolveError(spec, options)\n return mani\n }\n case 'git': {\n const {\n gitRemote,\n gitCommittish,\n remoteURL,\n gitSelectorParsed,\n } = f\n if (!remoteURL) {\n const s = spec\n if (!gitRemote)\n throw this.#resolveError(spec, options, 'no git remote')\n return await this.#tmpdir(async dir => {\n await clone(gitRemote, gitCommittish, dir, { spec: s })\n const { path } = gitSelectorParsed ?? {}\n const pkgDir =\n path !== undefined ? pathResolve(dir, path) : dir\n return this.packageJson.read(pkgDir)\n })\n }\n // fallthrough to remote\n }\n case 'remote': {\n const { remoteURL } = f\n if (!remoteURL) {\n throw this.#resolveError(\n spec,\n options,\n 'no remoteURL on remote specifier',\n )\n }\n const s = spec\n return await this.#tmpdir(async dir => {\n const response =\n await this.registryClient.request(remoteURL)\n if (response.statusCode !== 200) {\n throw this.#resolveError(\n s,\n options,\n 'failed to fetch URL',\n { response, url: remoteURL },\n )\n }\n const buf = response.buffer()\n try {\n await this.tarPool.unpack(buf, dir)\n } catch (er) {\n throw this.#resolveError(\n s,\n options,\n 'tar unpack failed',\n { cause: er },\n )\n }\n return this.packageJson.read(dir)\n })\n }\n case 'file': {\n const { file } = f\n if (file === undefined)\n throw this.#resolveError(spec, options, 'no file path')\n const path = pathResolve(from, file)\n const st = await stat(path)\n if (st.isDirectory()) {\n return this.packageJson.read(path)\n }\n const s = spec\n return await this.#tmpdir(async dir => {\n try {\n await this.tarPool.unpack(await readFile(path), dir)\n } catch (er) {\n throw this.#resolveError(\n s,\n options,\n 'tar unpack failed',\n { cause: er },\n )\n }\n return this.packageJson.read(dir)\n })\n }\n case 'workspace': {\n return this.#getWS(spec, options).manifest\n }\n }\n }\n\n async packument(\n spec: Spec | string,\n options: PackageInfoClientRequestOptions = {},\n ): Promise<Packument> {\n if (typeof spec === 'string')\n spec = Spec.parse(spec, this.options)\n const f = spec.final\n switch (f.type) {\n // RevDoc is the equivalent of a packument for a git repo\n case 'git': {\n const { gitRemote } = f\n if (!gitRemote) {\n throw this.#resolveError(\n spec,\n options,\n 'git remote could not be determined',\n )\n }\n const revDoc = await revs(gitRemote, {\n cwd: this.options.projectRoot,\n })\n if (!revDoc) throw this.#resolveError(spec, options)\n return asPackument(revDoc)\n }\n // these are all faked packuments\n case 'file':\n case 'workspace':\n case 'remote': {\n const manifest = await this.manifest(f, options)\n return {\n name: manifest.name ?? '',\n 'dist-tags': {\n latest: manifest.version ?? '',\n },\n versions: {\n [manifest.version ?? '']: manifest,\n },\n }\n }\n case 'registry': {\n const { registry, name } = f\n const pakuURL = new URL(name, registry)\n const response = await this.registryClient.request(pakuURL, {\n headers: {\n accept: 'application/json',\n },\n })\n if (response.statusCode !== 200) {\n throw this.#resolveError(\n spec,\n options,\n 'failed to fetch packument',\n {\n url: pakuURL,\n response,\n },\n )\n }\n return response.json() as Packument\n }\n }\n }\n\n async resolve(\n spec: Spec | string,\n options: PackageInfoClientRequestOptions = {},\n ): Promise<Resolution> {\n const memoKey = String(spec)\n if (typeof spec === 'string')\n spec = Spec.parse(spec, this.options)\n const memo = this.#resolutions.get(memoKey)\n if (memo) return memo\n const f = spec.final\n switch (f.type) {\n case 'file': {\n const { file } = f\n if (!file || !spec.file) {\n throw this.#resolveError(\n spec,\n options,\n 'no path on file: specifier',\n )\n }\n const { from = this.#projectRoot } = options\n const resolved = pathResolve(from, spec.file)\n const r = { resolved, spec }\n this.#resolutions.set(memoKey, r)\n return r\n }\n\n case 'remote': {\n const { remoteURL } = f\n if (!remoteURL)\n throw this.#resolveError(\n spec,\n options,\n 'no URL in remote specifier',\n )\n const r = { resolved: remoteURL, spec }\n this.#resolutions.set(memoKey, r)\n return r\n }\n\n case 'workspace': {\n const ws = this.#getWS(spec, options)\n return {\n resolved: ws.fullpath,\n spec,\n }\n }\n\n case 'registry': {\n const mani = await this.manifest(spec, options)\n if (mani.dist) {\n const { integrity, tarball, signatures } = mani.dist\n if (tarball) {\n const r = {\n resolved: tarball,\n integrity,\n signatures,\n spec,\n }\n this.#resolutions.set(memoKey, r)\n return r\n }\n }\n throw this.#resolveError(spec, options)\n }\n\n case 'git': {\n const { gitRemote, remoteURL, gitSelectorParsed } = f\n if (remoteURL && gitSelectorParsed?.path === undefined) {\n // known git host with a tarball download endpoint\n const r = { resolved: remoteURL, spec }\n this.#resolutions.set(memoKey, r)\n return r\n }\n if (!gitRemote) {\n throw this.#resolveError(\n spec,\n options,\n 'no remote on git specifier',\n )\n }\n const rev = await gitResolve(gitRemote, spec.gitCommittish, {\n spec,\n })\n if (rev) {\n const r = {\n resolved: `${gitRemote}#${rev.sha}`,\n spec,\n }\n if (gitSelectorParsed) {\n r.resolved += Object.entries(gitSelectorParsed)\n .filter(([_, v]) => v)\n .map(([k, v]) => `::${k}:${v}`)\n .join('')\n }\n this.#resolutions.set(memoKey, r)\n return r\n }\n // have to actually clone somewhere\n const s: Spec = spec\n return this.#tmpdir(async tmpdir => {\n const sha = await clone(\n gitRemote,\n s.gitCommittish,\n tmpdir,\n {\n spec: s,\n },\n )\n const r = {\n resolved: `${gitRemote}#${sha}`,\n spec: s,\n }\n this.#resolutions.set(memoKey, r)\n return r\n })\n }\n }\n }\n\n async #tmpdir<T>(fn: (dir: string) => Promise<T>): Promise<T> {\n const p = `package-info/${randomBytes(6).toString('hex')}`\n const dir = xdg.runtime(p)\n try {\n return await fn(dir)\n } finally {\n // intentionally do not await\n void rm(dir, { recursive: true, force: true })\n }\n }\n\n // error resolving\n #resolveError(\n spec?: Spec,\n options: PackageInfoClientRequestOptions = {},\n message = 'Could not resolve',\n extra: ErrorCauseObject = {},\n ) {\n const { from = this.#projectRoot } = options\n const er = error(\n message,\n {\n code: 'ERESOLVE',\n spec,\n from,\n ...extra,\n },\n this.#resolveError,\n )\n return er\n }\n}\n", "import EE from 'events'\nimport fs from 'fs'\nimport { Minipass } from 'minipass'\n\nconst writev = fs.writev\n\nconst _autoClose = Symbol('_autoClose')\nconst _close = Symbol('_close')\nconst _ended = Symbol('_ended')\nconst _fd = Symbol('_fd')\nconst _finished = Symbol('_finished')\nconst _flags = Symbol('_flags')\nconst _flush = Symbol('_flush')\nconst _handleChunk = Symbol('_handleChunk')\nconst _makeBuf = Symbol('_makeBuf')\nconst _mode = Symbol('_mode')\nconst _needDrain = Symbol('_needDrain')\nconst _onerror = Symbol('_onerror')\nconst _onopen = Symbol('_onopen')\nconst _onread = Symbol('_onread')\nconst _onwrite = Symbol('_onwrite')\nconst _open = Symbol('_open')\nconst _path = Symbol('_path')\nconst _pos = Symbol('_pos')\nconst _queue = Symbol('_queue')\nconst _read = Symbol('_read')\nconst _readSize = Symbol('_readSize')\nconst _reading = Symbol('_reading')\nconst _remain = Symbol('_remain')\nconst _size = Symbol('_size')\nconst _write = Symbol('_write')\nconst _writing = Symbol('_writing')\nconst _defaultFlag = Symbol('_defaultFlag')\nconst _errored = Symbol('_errored')\n\nexport type ReadStreamOptions =\n Minipass.Options<Minipass.ContiguousData> & {\n fd?: number\n readSize?: number\n size?: number\n autoClose?: boolean\n }\n\nexport type ReadStreamEvents = Minipass.Events<Minipass.ContiguousData> & {\n open: [fd: number]\n}\n\nexport class ReadStream extends Minipass<\n Minipass.ContiguousData,\n Buffer,\n ReadStreamEvents\n> {\n [_errored]: boolean = false;\n [_fd]?: number;\n [_path]: string;\n [_readSize]: number;\n [_reading]: boolean = false;\n [_size]: number;\n [_remain]: number;\n [_autoClose]: boolean\n\n constructor(path: string, opt: ReadStreamOptions) {\n opt = opt || {}\n super(opt)\n\n this.readable = true\n this.writable = false\n\n if (typeof path !== 'string') {\n throw new TypeError('path must be a string')\n }\n\n this[_errored] = false\n this[_fd] = typeof opt.fd === 'number' ? opt.fd : undefined\n this[_path] = path\n this[_readSize] = opt.readSize || 16 * 1024 * 1024\n this[_reading] = false\n this[_size] = typeof opt.size === 'number' ? opt.size : Infinity\n this[_remain] = this[_size]\n this[_autoClose] =\n typeof opt.autoClose === 'boolean' ? opt.autoClose : true\n\n if (typeof this[_fd] === 'number') {\n this[_read]()\n } else {\n this[_open]()\n }\n }\n\n get fd() {\n return this[_fd]\n }\n\n get path() {\n return this[_path]\n }\n\n //@ts-ignore\n write() {\n throw new TypeError('this is a readable stream')\n }\n\n //@ts-ignore\n end() {\n throw new TypeError('this is a readable stream')\n }\n\n [_open]() {\n fs.open(this[_path], 'r', (er, fd) => this[_onopen](er, fd))\n }\n\n [_onopen](er?: NodeJS.ErrnoException | null, fd?: number) {\n if (er) {\n this[_onerror](er)\n } else {\n this[_fd] = fd\n this.emit('open', fd as number)\n this[_read]()\n }\n }\n\n [_makeBuf]() {\n return Buffer.allocUnsafe(Math.min(this[_readSize], this[_remain]))\n }\n\n [_read]() {\n if (!this[_reading]) {\n this[_reading] = true\n const buf = this[_makeBuf]()\n /* c8 ignore start */\n if (buf.length === 0) {\n return process.nextTick(() => this[_onread](null, 0, buf))\n }\n /* c8 ignore stop */\n fs.read(this[_fd] as number, buf, 0, buf.length, null, (er, br, b) =>\n this[_onread](er, br, b),\n )\n }\n }\n\n [_onread](er?: NodeJS.ErrnoException | null, br?: number, buf?: Buffer) {\n this[_reading] = false\n if (er) {\n this[_onerror](er)\n } else if (this[_handleChunk](br as number, buf as Buffer)) {\n this[_read]()\n }\n }\n\n [_close]() {\n if (this[_autoClose] && typeof this[_fd] === 'number') {\n const fd = this[_fd]\n this[_fd] = undefined\n fs.close(fd, er =>\n er ? this.emit('error', er) : this.emit('close'),\n )\n }\n }\n\n [_onerror](er: NodeJS.ErrnoException) {\n this[_reading] = true\n this[_close]()\n this.emit('error', er)\n }\n\n [_handleChunk](br: number, buf: Buffer) {\n let ret = false\n // no effect if infinite\n this[_remain] -= br\n if (br > 0) {\n ret = super.write(br < buf.length ? buf.subarray(0, br) : buf)\n }\n\n if (br === 0 || this[_remain] <= 0) {\n ret = false\n this[_close]()\n super.end()\n }\n\n return ret\n }\n\n emit<Event extends keyof ReadStreamEvents>(\n ev: Event,\n ...args: ReadStreamEvents[Event]\n ): boolean {\n switch (ev) {\n case 'prefinish':\n case 'finish':\n return false\n\n case 'drain':\n if (typeof this[_fd] === 'number') {\n this[_read]()\n }\n return false\n\n case 'error':\n if (this[_errored]) {\n return false\n }\n this[_errored] = true\n return super.emit(ev, ...args)\n\n default:\n return super.emit(ev, ...args)\n }\n }\n}\n\nexport class ReadStreamSync extends ReadStream {\n [_open]() {\n let threw = true\n try {\n this[_onopen](null, fs.openSync(this[_path], 'r'))\n threw = false\n } finally {\n if (threw) {\n this[_close]()\n }\n }\n }\n\n [_read]() {\n let threw = true\n try {\n if (!this[_reading]) {\n this[_reading] = true\n do {\n const buf = this[_makeBuf]()\n /* c8 ignore start */\n const br =\n buf.length === 0\n ? 0\n : fs.readSync(this[_fd] as number, buf, 0, buf.length, null)\n /* c8 ignore stop */\n if (!this[_handleChunk](br, buf)) {\n break\n }\n } while (true)\n this[_reading] = false\n }\n threw = false\n } finally {\n if (threw) {\n this[_close]()\n }\n }\n }\n\n [_close]() {\n if (this[_autoClose] && typeof this[_fd] === 'number') {\n const fd = this[_fd]\n this[_fd] = undefined\n fs.closeSync(fd)\n this.emit('close')\n }\n }\n}\n\nexport type WriteStreamOptions = {\n fd?: number\n autoClose?: boolean\n mode?: number\n captureRejections?: boolean\n start?: number\n flags?: string\n}\n\nexport class WriteStream extends EE {\n readable: false = false\n writable: boolean = true;\n [_errored]: boolean = false;\n [_writing]: boolean = false;\n [_ended]: boolean = false;\n [_queue]: Buffer[] = [];\n [_needDrain]: boolean = false;\n [_path]: string;\n [_mode]: number;\n [_autoClose]: boolean;\n [_fd]?: number;\n [_defaultFlag]: boolean;\n [_flags]: string;\n [_finished]: boolean = false;\n [_pos]?: number\n\n constructor(path: string, opt: WriteStreamOptions) {\n opt = opt || {}\n super(opt)\n this[_path] = path\n this[_fd] = typeof opt.fd === 'number' ? opt.fd : undefined\n this[_mode] = opt.mode === undefined ? 0o666 : opt.mode\n this[_pos] = typeof opt.start === 'number' ? opt.start : undefined\n this[_autoClose] =\n typeof opt.autoClose === 'boolean' ? opt.autoClose : true\n\n // truncating makes no sense when writing into the middle\n const defaultFlag = this[_pos] !== undefined ? 'r+' : 'w'\n this[_defaultFlag] = opt.flags === undefined\n this[_flags] = opt.flags === undefined ? defaultFlag : opt.flags\n\n if (this[_fd] === undefined) {\n this[_open]()\n }\n }\n\n emit(ev: string, ...args: any[]) {\n if (ev === 'error') {\n if (this[_errored]) {\n return false\n }\n this[_errored] = true\n }\n return super.emit(ev, ...args)\n }\n\n get fd() {\n return this[_fd]\n }\n\n get path() {\n return this[_path]\n }\n\n [_onerror](er: NodeJS.ErrnoException) {\n this[_close]()\n this[_writing] = true\n this.emit('error', er)\n }\n\n [_open]() {\n fs.open(this[_path], this[_flags], this[_mode], (er, fd) =>\n this[_onopen](er, fd),\n )\n }\n\n [_onopen](er?: null | NodeJS.ErrnoException, fd?: number) {\n if (\n this[_defaultFlag] &&\n this[_flags] === 'r+' &&\n er &&\n er.code === 'ENOENT'\n ) {\n this[_flags] = 'w'\n this[_open]()\n } else if (er) {\n this[_onerror](er)\n } else {\n this[_fd] = fd\n this.emit('open', fd)\n if (!this[_writing]) {\n this[_flush]()\n }\n }\n }\n\n end(buf: string, enc?: BufferEncoding): this\n end(buf?: Buffer, enc?: undefined): this\n end(buf?: Buffer | string, enc?: BufferEncoding): this {\n if (buf) {\n //@ts-ignore\n this.write(buf, enc)\n }\n\n this[_ended] = true\n\n // synthetic after-write logic, where drain/finish live\n if (\n !this[_writing] &&\n !this[_queue].length &&\n typeof this[_fd] === 'number'\n ) {\n this[_onwrite](null, 0)\n }\n return this\n }\n\n write(buf: string, enc?: BufferEncoding): boolean\n write(buf: Buffer, enc?: undefined): boolean\n write(buf: Buffer | string, enc?: BufferEncoding): boolean {\n if (typeof buf === 'string') {\n buf = Buffer.from(buf, enc)\n }\n\n if (this[_ended]) {\n this.emit('error', new Error('write() after end()'))\n return false\n }\n\n if (this[_fd] === undefined || this[_writing] || this[_queue].length) {\n this[_queue].push(buf)\n this[_needDrain] = true\n return false\n }\n\n this[_writing] = true\n this[_write](buf)\n return true\n }\n\n [_write](buf: Buffer) {\n fs.write(\n this[_fd] as number,\n buf,\n 0,\n buf.length,\n this[_pos],\n (er, bw) => this[_onwrite](er, bw),\n )\n }\n\n [_onwrite](er?: null | NodeJS.ErrnoException, bw?: number) {\n if (er) {\n this[_onerror](er)\n } else {\n if (this[_pos] !== undefined && typeof bw === 'number') {\n this[_pos] += bw\n }\n if (this[_queue].length) {\n this[_flush]()\n } else {\n this[_writing] = false\n\n if (this[_ended] && !this[_finished]) {\n this[_finished] = true\n this[_close]()\n this.emit('finish')\n } else if (this[_needDrain]) {\n this[_needDrain] = false\n this.emit('drain')\n }\n }\n }\n }\n\n [_flush]() {\n if (this[_queue].length === 0) {\n if (this[_ended]) {\n this[_onwrite](null, 0)\n }\n } else if (this[_queue].length === 1) {\n this[_write](this[_queue].pop() as Buffer)\n } else {\n const iovec = this[_queue]\n this[_queue] = []\n writev(this[_fd] as number, iovec, this[_pos] as number, (er, bw) =>\n this[_onwrite](er, bw),\n )\n }\n }\n\n [_close]() {\n if (this[_autoClose] && typeof this[_fd] === 'number') {\n const fd = this[_fd]\n this[_fd] = undefined\n fs.close(fd, er =>\n er ? this.emit('error', er) : this.emit('close'),\n )\n }\n }\n}\n\nexport class WriteStreamSync extends WriteStream {\n [_open](): void {\n let fd\n // only wrap in a try{} block if we know we'll retry, to avoid\n // the rethrow obscuring the error's source frame in most cases.\n if (this[_defaultFlag] && this[_flags] === 'r+') {\n try {\n fd = fs.openSync(this[_path], this[_flags], this[_mode])\n } catch (er) {\n if ((er as NodeJS.ErrnoException)?.code === 'ENOENT') {\n this[_flags] = 'w'\n return this[_open]()\n } else {\n throw er\n }\n }\n } else {\n fd = fs.openSync(this[_path], this[_flags], this[_mode])\n }\n\n this[_onopen](null, fd)\n }\n\n [_close]() {\n if (this[_autoClose] && typeof this[_fd] === 'number') {\n const fd = this[_fd]\n this[_fd] = undefined\n fs.closeSync(fd)\n this.emit('close')\n }\n }\n\n [_write](buf: Buffer) {\n // throw the original, but try to close if it fails\n let threw = true\n try {\n this[_onwrite](\n null,\n fs.writeSync(this[_fd] as number, buf, 0, buf.length, this[_pos]),\n )\n threw = false\n } finally {\n if (threw) {\n try {\n this[_close]()\n } catch {\n // ok error\n }\n }\n }\n }\n}\n", "import { WriteStream, WriteStreamSync } from '@isaacs/fs-minipass'\nimport { Minipass } from 'minipass'\nimport path from 'node:path'\nimport { list } from './list.js'\nimport { makeCommand } from './make-command.js'\nimport {\n TarOptions,\n TarOptionsFile,\n TarOptionsSync,\n TarOptionsSyncFile,\n} from './options.js'\nimport { Pack, PackSync } from './pack.js'\n\nconst createFileSync = (opt: TarOptionsSyncFile, files: string[]) => {\n const p = new PackSync(opt)\n const stream = new WriteStreamSync(opt.file, {\n mode: opt.mode || 0o666,\n })\n p.pipe(stream as unknown as Minipass.Writable)\n addFilesSync(p, files)\n}\n\nconst createFile = (opt: TarOptionsFile, files: string[]) => {\n const p = new Pack(opt)\n const stream = new WriteStream(opt.file, {\n mode: opt.mode || 0o666,\n })\n p.pipe(stream as unknown as Minipass.Writable)\n\n const promise = new Promise<void>((res, rej) => {\n stream.on('error', rej)\n stream.on('close', res)\n p.on('error', rej)\n })\n\n addFilesAsync(p, files)\n\n return promise\n}\n\nconst addFilesSync = (p: PackSync, files: string[]) => {\n files.forEach(file => {\n if (file.charAt(0) === '@') {\n list({\n file: path.resolve(p.cwd, file.slice(1)),\n sync: true,\n noResume: true,\n onReadEntry: entry => p.add(entry),\n })\n } else {\n p.add(file)\n }\n })\n p.end()\n}\n\nconst addFilesAsync = async (\n p: Pack,\n files: string[],\n): Promise<void> => {\n for (let i = 0; i < files.length; i++) {\n const file = String(files[i])\n if (file.charAt(0) === '@') {\n await list({\n file: path.resolve(String(p.cwd), file.slice(1)),\n noResume: true,\n onReadEntry: entry => {\n p.add(entry)\n },\n })\n } else {\n p.add(file)\n }\n }\n p.end()\n}\n\nconst createSync = (opt: TarOptionsSync, files: string[]) => {\n const p = new PackSync(opt)\n addFilesSync(p, files)\n return p\n}\n\nconst createAsync = (opt: TarOptions, files: string[]) => {\n const p = new Pack(opt)\n addFilesAsync(p, files)\n return p\n}\n\nexport const create = makeCommand(\n createFileSync,\n createFile,\n createSync,\n createAsync,\n (_opt, files) => {\n if (!files?.length) {\n throw new TypeError('no paths specified to add to archive')\n }\n },\n)\n", "// tar -t\nimport * as fsm from '@isaacs/fs-minipass'\nimport fs from 'node:fs'\nimport { dirname, parse } from 'path'\nimport { makeCommand } from './make-command.js'\nimport {\n TarOptions,\n TarOptionsFile,\n TarOptionsSyncFile,\n} from './options.js'\nimport { Parser } from './parse.js'\nimport { stripTrailingSlashes } from './strip-trailing-slashes.js'\n\nconst onReadEntryFunction = (opt: TarOptions) => {\n const onReadEntry = opt.onReadEntry\n opt.onReadEntry =\n onReadEntry ?\n e => {\n onReadEntry(e)\n e.resume()\n }\n : e => e.resume()\n}\n\n// construct a filter that limits the file entries listed\n// include child entries if a dir is included\nexport const filesFilter = (opt: TarOptions, files: string[]) => {\n const map = new Map<string, boolean>(\n files.map(f => [stripTrailingSlashes(f), true]),\n )\n const filter = opt.filter\n\n const mapHas = (file: string, r: string = ''): boolean => {\n const root = r || parse(file).root || '.'\n let ret: boolean\n if (file === root) ret = false\n else {\n const m = map.get(file)\n if (m !== undefined) {\n ret = m\n } else {\n ret = mapHas(dirname(file), root)\n }\n }\n\n map.set(file, ret)\n return ret\n }\n\n opt.filter =\n filter ?\n (file, entry) =>\n filter(file, entry) && mapHas(stripTrailingSlashes(file))\n : file => mapHas(stripTrailingSlashes(file))\n}\n\nconst listFileSync = (opt: TarOptionsSyncFile) => {\n const p = new Parser(opt)\n const file = opt.file\n let fd\n try {\n const stat = fs.statSync(file)\n const readSize = opt.maxReadSize || 16 * 1024 * 1024\n if (stat.size < readSize) {\n p.end(fs.readFileSync(file))\n } else {\n let pos = 0\n const buf = Buffer.allocUnsafe(readSize)\n fd = fs.openSync(file, 'r')\n while (pos < stat.size) {\n const bytesRead = fs.readSync(fd, buf, 0, readSize, pos)\n pos += bytesRead\n p.write(buf.subarray(0, bytesRead))\n }\n p.end()\n }\n } finally {\n if (typeof fd === 'number') {\n try {\n fs.closeSync(fd)\n /* c8 ignore next */\n } catch (er) {}\n }\n }\n}\n\nconst listFile = (\n opt: TarOptionsFile,\n _files: string[],\n): Promise<void> => {\n const parse = new Parser(opt)\n const readSize = opt.maxReadSize || 16 * 1024 * 1024\n\n const file = opt.file\n const p = new Promise<void>((resolve, reject) => {\n parse.on('error', reject)\n parse.on('end', resolve)\n\n fs.stat(file, (er, stat) => {\n if (er) {\n reject(er)\n } else {\n const stream = new fsm.ReadStream(file, {\n readSize: readSize,\n size: stat.size,\n })\n stream.on('error', reject)\n stream.pipe(parse)\n }\n })\n })\n return p\n}\n\nexport const list = makeCommand(\n listFileSync,\n listFile,\n opt => new Parser(opt) as Parser & { sync: true },\n opt => new Parser(opt),\n (opt, files) => {\n if (files?.length) filesFilter(opt, files)\n if (!opt.noResume) onReadEntryFunction(opt)\n },\n)\n", "// turn tar(1) style args like `C` into the more verbose things like `cwd`\n\nimport { type GzipOptions, type ZlibOptions } from 'minizlib'\nimport { type Stats } from 'node:fs'\nimport { type ReadEntry } from './read-entry.js'\nimport { type WarnData } from './warn-method.js'\nimport { WriteEntry } from './write-entry.js'\n\nconst argmap = new Map<keyof TarOptionsWithAliases, keyof TarOptions>(\n [\n ['C', 'cwd'],\n ['f', 'file'],\n ['z', 'gzip'],\n ['P', 'preservePaths'],\n ['U', 'unlink'],\n ['strip-components', 'strip'],\n ['stripComponents', 'strip'],\n ['keep-newer', 'newer'],\n ['keepNewer', 'newer'],\n ['keep-newer-files', 'newer'],\n ['keepNewerFiles', 'newer'],\n ['k', 'keep'],\n ['keep-existing', 'keep'],\n ['keepExisting', 'keep'],\n ['m', 'noMtime'],\n ['no-mtime', 'noMtime'],\n ['p', 'preserveOwner'],\n ['L', 'follow'],\n ['h', 'follow'],\n ['onentry', 'onReadEntry'],\n ],\n)\n\n/**\n * The options that can be provided to tar commands.\n *\n * Note that some of these are only relevant for certain commands, since\n * they are specific to reading or writing.\n *\n * Aliases are provided in the {@link TarOptionsWithAliases} type.\n */\nexport interface TarOptions {\n //////////////////////////\n // shared options\n\n /**\n * Perform all I/O operations synchronously. If the stream is ended\n * immediately, then it will be processed entirely synchronously.\n */\n sync?: boolean\n\n /**\n * The tar file to be read and/or written. When this is set, a stream\n * is not returned. Asynchronous commands will return a promise indicating\n * when the operation is completed, and synchronous commands will return\n * immediately.\n */\n file?: string\n\n /**\n * Treat warnings as crash-worthy errors. Defaults false.\n */\n strict?: boolean\n\n /**\n * The effective current working directory for this tar command\n */\n cwd?: string\n\n /**\n * When creating a tar archive, this can be used to compress it as well.\n * Set to `true` to use the default gzip options, or customize them as\n * needed.\n *\n * When reading, if this is unset, then the compression status will be\n * inferred from the archive data. This is generally best, unless you are\n * sure of the compression settings in use to create the archive, and want to\n * fail if the archive doesn't match expectations.\n */\n gzip?: boolean | GzipOptions\n\n /**\n * When creating archives, preserve absolute and `..` paths in the archive,\n * rather than sanitizing them under the cwd.\n *\n * When extracting, allow absolute paths, paths containing `..`, and\n * extracting through symbolic links. By default, the root `/` is stripped\n * from absolute paths (eg, turning `/x/y/z` into `x/y/z`), paths containing\n * `..` are not extracted, and any file whose location would be modified by a\n * symbolic link is not extracted.\n *\n * **WARNING** This is almost always unsafe, and must NEVER be used on\n * archives from untrusted sources, such as user input, and every entry must\n * be validated to ensure it is safe to write. Even if the input is not\n * malicious, mistakes can cause a lot of damage!\n */\n preservePaths?: boolean\n\n /**\n * When extracting, do not set the `mtime` value for extracted entries to\n * match the `mtime` in the archive.\n *\n * When creating archives, do not store the `mtime` value in the entry. Note\n * that this prevents properly using other mtime-based features (such as\n * `tar.update` or the `newer` option) with the resulting archive.\n */\n noMtime?: boolean\n\n /**\n * Set to `true` or an object with settings for `zlib.BrotliCompress()` to\n * create a brotli-compressed archive\n *\n * When extracting, this will cause the archive to be treated as a\n * brotli-compressed file if set to `true` or a ZlibOptions object.\n *\n * If set `false`, then brotli options will not be used.\n *\n * If both this and the `gzip` option are left `undefined`, then tar will\n * attempt to infer the brotli compression status, but can only do so based\n * on the filename. If the filename ends in `.tbr` or `.tar.br`, and the\n * first 512 bytes are not a valid tar header, then brotli decompression\n * will be attempted.\n */\n brotli?: boolean | ZlibOptions\n\n /**\n * A function that is called with `(path, stat)` when creating an archive, or\n * `(path, entry)` when extracting. Return true to process the file/entry, or\n * false to exclude it.\n */\n filter?: (path: string, entry: Stats | ReadEntry) => boolean\n\n /**\n * A function that gets called for any warning encountered.\n *\n * Note: if `strict` is set, then the warning will throw, and this method\n * will not be called.\n */\n onwarn?: (code: string, message: string, data: WarnData) => any\n\n //////////////////////////\n // extraction options\n\n /**\n * When extracting, unlink files before creating them. Without this option,\n * tar overwrites existing files, which preserves existing hardlinks. With\n * this option, existing hardlinks will be broken, as will any symlink that\n * would affect the location of an extracted file.\n */\n unlink?: boolean\n\n /**\n * When extracting, strip the specified number of path portions from the\n * entry path. For example, with `{strip: 2}`, the entry `a/b/c/d` would be\n * extracted to `{cwd}/c/d`.\n *\n * Any entry whose entire path is stripped will be excluded.\n */\n strip?: number\n\n /**\n * When extracting, keep the existing file on disk if it's newer than the\n * file in the archive.\n */\n newer?: boolean\n\n /**\n * When extracting, do not overwrite existing files at all.\n */\n keep?: boolean\n\n /**\n * When extracting, set the `uid` and `gid` of extracted entries to the `uid`\n * and `gid` fields in the archive. Defaults to true when run as root, and\n * false otherwise.\n *\n * If false, then files and directories will be set with the owner and group\n * of the user running the process. This is similar to `-p` in `tar(1)`, but\n * ACLs and other system-specific data is never unpacked in this\n * implementation, and modes are set by default already.\n */\n preserveOwner?: boolean\n\n /**\n * The maximum depth of subfolders to extract into. This defaults to 1024.\n * Anything deeper than the limit will raise a warning and skip the entry.\n * Set to `Infinity` to remove the limitation.\n */\n maxDepth?: number\n\n /**\n * When extracting, force all created files and directories, and all\n * implicitly created directories, to be owned by the specified user id,\n * regardless of the `uid` field in the archive.\n *\n * Cannot be used along with `preserveOwner`. Requires also setting the `gid`\n * option.\n */\n uid?: number\n\n /**\n * When extracting, force all created files and directories, and all\n * implicitly created directories, to be owned by the specified group id,\n * regardless of the `gid` field in the archive.\n *\n * Cannot be used along with `preserveOwner`. Requires also setting the `uid`\n * option.\n */\n gid?: number\n\n /**\n * When extracting, provide a function that takes an `entry` object, and\n * returns a stream, or any falsey value. If a stream is provided, then that\n * stream's data will be written instead of the contents of the archive\n * entry. If a falsey value is provided, then the entry is written to disk as\n * normal.\n *\n * To exclude items from extraction, use the `filter` option.\n *\n * Note that using an asynchronous stream type with the `transform` option\n * will cause undefined behavior in synchronous extractions.\n * [MiniPass](http://npm.im/minipass)-based streams are designed for this use\n * case.\n */\n transform?: (entry: ReadEntry) => any\n\n /**\n * Call `chmod()` to ensure that extracted files match the entry's mode\n * field. Without this field set, all mode fields in archive entries are a\n * best effort attempt only.\n *\n * Setting this necessitates a call to the deprecated `process.umask()`\n * method to determine the default umask value, unless a `processUmask`\n * config is provided as well.\n *\n * If not set, tar will attempt to create file system entries with whatever\n * mode is provided, and let the implicit process `umask` apply normally, but\n * if a file already exists to be written to, then its existing mode will not\n * be modified.\n *\n * When setting `chmod: true`, it is highly recommend to set the\n * {@link TarOptions#processUmask} option as well, to avoid the call to the\n * deprecated (and thread-unsafe) `process.umask()` method.\n */\n chmod?: boolean\n\n /**\n * When setting the {@link TarOptions#chmod} option to `true`, you may\n * provide a value here to avoid having to call the deprecated and\n * thread-unsafe `process.umask()` method.\n *\n * This has no effect with `chmod` is not set to true, as mode values are not\n * set explicitly anyway. If `chmod` is set to `true`, and a value is not\n * provided here, then `process.umask()` must be called, which will result in\n * deprecation warnings.\n *\n * The most common values for this are `0o22` (resulting in directories\n * created with mode `0o755` and files with `0o644` by default) and `0o2`\n * (resulting in directores created with mode `0o775` and files `0o664`, so\n * they are group-writable).\n */\n processUmask?: number\n\n //////////////////////////\n // archive creation options\n\n /**\n * When parsing/listing archives, `entry` streams are by default resumed\n * (set into \"flowing\" mode) immediately after the call to `onReadEntry()`.\n * Set `noResume: true` to suppress this behavior.\n *\n * Note that when this is set, the stream will never complete until the\n * data is consumed somehow.\n *\n * Set automatically in extract operations, since the entry is piped to\n * a file system entry right away. Only relevant when parsing.\n */\n noResume?: boolean\n\n /**\n * When creating, updating, or replacing within archives, this method will\n * be called with each WriteEntry that is created.\n */\n onWriteEntry?: (entry: WriteEntry) => any\n\n /**\n * When extracting or listing archives, this method will be called with\n * each entry that is not excluded by a `filter`.\n *\n * Important when listing archives synchronously from a file, because there\n * is otherwise no way to interact with the data!\n */\n onReadEntry?: (entry: ReadEntry) => any\n\n /**\n * Pack the targets of symbolic links rather than the link itself.\n */\n follow?: boolean\n\n /**\n * When creating archives, omit any metadata that is system-specific:\n * `ctime`, `atime`, `uid`, `gid`, `uname`, `gname`, `dev`, `ino`, and\n * `nlink`. Note that `mtime` is still included, because this is necessary\n * for other time-based operations such as `tar.update`. Additionally, `mode`\n * is set to a \"reasonable default\" for mose unix systems, based on an\n * effective `umask` of `0o22`.\n *\n * This also defaults the `portable` option in the gzip configs when creating\n * a compressed archive, in order to produce deterministic archives that are\n * not operating-system specific.\n */\n portable?: boolean\n\n /**\n * When creating archives, do not recursively archive the contents of\n * directories. By default, archiving a directory archives all of its\n * contents as well.\n */\n noDirRecurse?: boolean\n\n /**\n * Suppress Pax extended headers when creating archives. Note that this means\n * long paths and linkpaths will be truncated, and large or negative numeric\n * values may be interpreted incorrectly.\n */\n noPax?: boolean\n\n /**\n * Set to a `Date` object to force a specific `mtime` value for everything\n * written to an archive.\n *\n * This is useful when creating archives that are intended to be\n * deterministic based on their contents, irrespective of the file's last\n * modification time.\n *\n * Overridden by `noMtime`.\n */\n mtime?: Date\n\n /**\n * A path portion to prefix onto the entries added to an archive.\n */\n prefix?: string\n\n /**\n * The mode to set on any created file archive, defaults to 0o666\n * masked by the process umask, often resulting in 0o644.\n *\n * This does *not* affect the mode fields of individual entries, or the\n * mode status of extracted entries on the filesystem.\n */\n mode?: number\n\n //////////////////////////\n // internal options\n\n /**\n * A cache of mtime values, to avoid having to stat the same file repeatedly.\n *\n * @internal\n */\n mtimeCache?: Map<string, Date>\n\n /**\n * maximum buffer size for `fs.read()` operations.\n *\n * @internal\n */\n maxReadSize?: number\n\n /**\n * Filter modes of entries being unpacked, like `process.umask()`\n *\n * @internal\n */\n umask?: number\n\n /**\n * Default mode for directories. Used for all implicitly created directories,\n * and any directories in the archive that do not have a mode field.\n *\n * @internal\n */\n dmode?: number\n\n /**\n * default mode for files\n *\n * @internal\n */\n fmode?: number\n\n /**\n * Map that tracks which directories already exist, for extraction\n *\n * @internal\n */\n dirCache?: Map<string, boolean>\n /**\n * maximum supported size of meta entries. Defaults to 1MB\n *\n * @internal\n */\n maxMetaEntrySize?: number\n\n /**\n * A Map object containing the device and inode value for any file whose\n * `nlink` value is greater than 1, to identify hard links when creating\n * archives.\n *\n * @internal\n */\n linkCache?: Map<LinkCacheKey, string>\n\n /**\n * A map object containing the results of `fs.readdir()` calls.\n *\n * @internal\n */\n readdirCache?: Map<string, string[]>\n\n /**\n * A cache of all `lstat` results, for use in creating archives.\n *\n * @internal\n */\n statCache?: Map<string, Stats>\n\n /**\n * Number of concurrent jobs to run when creating archives.\n *\n * Defaults to 4.\n *\n * @internal\n */\n jobs?: number\n\n /**\n * Automatically set to true on Windows systems.\n *\n * When extracting, causes behavior where filenames containing `<|>?:`\n * characters are converted to windows-compatible escape sequences in the\n * created filesystem entries.\n *\n * When packing, causes behavior where paths replace `\\` with `/`, and\n * filenames containing the windows-compatible escaped forms of `<|>?:` are\n * converted to actual `<|>?:` characters in the archive.\n *\n * @internal\n */\n win32?: boolean\n\n /**\n * For `WriteEntry` objects, the absolute path to the entry on the\n * filesystem. By default, this is `resolve(cwd, entry.path)`, but it can be\n * overridden explicitly.\n *\n * @internal\n */\n absolute?: string\n\n /**\n * Used with Parser stream interface, to attach and take over when the\n * stream is completely parsed. If this is set, then the prefinish,\n * finish, and end events will not fire, and are the responsibility of\n * the ondone method to emit properly.\n *\n * @internal\n */\n ondone?: () => void\n\n /**\n * Mostly for testing, but potentially useful in some cases.\n * Forcibly trigger a chown on every entry, no matter what.\n */\n forceChown?: boolean\n\n /**\n * ambiguous deprecated name for {@link onReadEntry}\n *\n * @deprecated\n */\n onentry?: (entry: ReadEntry) => any\n}\n\nexport type TarOptionsSync = TarOptions & { sync: true }\nexport type TarOptionsAsync = TarOptions & { sync?: false }\nexport type TarOptionsFile = TarOptions & { file: string }\nexport type TarOptionsNoFile = TarOptions & { file?: undefined }\nexport type TarOptionsSyncFile = TarOptionsSync & TarOptionsFile\nexport type TarOptionsAsyncFile = TarOptionsAsync & TarOptionsFile\nexport type TarOptionsSyncNoFile = TarOptionsSync & TarOptionsNoFile\nexport type TarOptionsAsyncNoFile = TarOptionsAsync & TarOptionsNoFile\n\nexport type LinkCacheKey = `${number}:${number}`\n\nexport interface TarOptionsWithAliases extends TarOptions {\n /**\n * The effective current working directory for this tar command\n */\n C?: TarOptions['cwd']\n /**\n * The tar file to be read and/or written. When this is set, a stream\n * is not returned. Asynchronous commands will return a promise indicating\n * when the operation is completed, and synchronous commands will return\n * immediately.\n */\n f?: TarOptions['file']\n /**\n * When creating a tar archive, this can be used to compress it as well.\n * Set to `true` to use the default gzip options, or customize them as\n * needed.\n *\n * When reading, if this is unset, then the compression status will be\n * inferred from the archive data. This is generally best, unless you are\n * sure of the compression settings in use to create the archive, and want to\n * fail if the archive doesn't match expectations.\n */\n z?: TarOptions['gzip']\n /**\n * When creating archives, preserve absolute and `..` paths in the archive,\n * rather than sanitizing them under the cwd.\n *\n * When extracting, allow absolute paths, paths containing `..`, and\n * extracting through symbolic links. By default, the root `/` is stripped\n * from absolute paths (eg, turning `/x/y/z` into `x/y/z`), paths containing\n * `..` are not extracted, and any file whose location would be modified by a\n * symbolic link is not extracted.\n *\n * **WARNING** This is almost always unsafe, and must NEVER be used on\n * archives from untrusted sources, such as user input, and every entry must\n * be validated to ensure it is safe to write. Even if the input is not\n * malicious, mistakes can cause a lot of damage!\n */\n P?: TarOptions['preservePaths']\n /**\n * When extracting, unlink files before creating them. Without this option,\n * tar overwrites existing files, which preserves existing hardlinks. With\n * this option, existing hardlinks will be broken, as will any symlink that\n * would affect the location of an extracted file.\n */\n U?: TarOptions['unlink']\n /**\n * When extracting, strip the specified number of path portions from the\n * entry path. For example, with `{strip: 2}`, the entry `a/b/c/d` would be\n * extracted to `{cwd}/c/d`.\n */\n 'strip-components'?: TarOptions['strip']\n /**\n * When extracting, strip the specified number of path portions from the\n * entry path. For example, with `{strip: 2}`, the entry `a/b/c/d` would be\n * extracted to `{cwd}/c/d`.\n */\n stripComponents?: TarOptions['strip']\n /**\n * When extracting, keep the existing file on disk if it's newer than the\n * file in the archive.\n */\n 'keep-newer'?: TarOptions['newer']\n /**\n * When extracting, keep the existing file on disk if it's newer than the\n * file in the archive.\n */\n keepNewer?: TarOptions['newer']\n /**\n * When extracting, keep the existing file on disk if it's newer than the\n * file in the archive.\n */\n 'keep-newer-files'?: TarOptions['newer']\n /**\n * When extracting, keep the existing file on disk if it's newer than the\n * file in the archive.\n */\n keepNewerFiles?: TarOptions['newer']\n /**\n * When extracting, do not overwrite existing files at all.\n */\n k?: TarOptions['keep']\n /**\n * When extracting, do not overwrite existing files at all.\n */\n 'keep-existing'?: TarOptions['keep']\n /**\n * When extracting, do not overwrite existing files at all.\n */\n keepExisting?: TarOptions['keep']\n /**\n * When extracting, do not set the `mtime` value for extracted entries to\n * match the `mtime` in the archive.\n *\n * When creating archives, do not store the `mtime` value in the entry. Note\n * that this prevents properly using other mtime-based features (such as\n * `tar.update` or the `newer` option) with the resulting archive.\n */\n m?: TarOptions['noMtime']\n /**\n * When extracting, do not set the `mtime` value for extracted entries to\n * match the `mtime` in the archive.\n *\n * When creating archives, do not store the `mtime` value in the entry. Note\n * that this prevents properly using other mtime-based features (such as\n * `tar.update` or the `newer` option) with the resulting archive.\n */\n 'no-mtime'?: TarOptions['noMtime']\n /**\n * When extracting, set the `uid` and `gid` of extracted entries to the `uid`\n * and `gid` fields in the archive. Defaults to true when run as root, and\n * false otherwise.\n *\n * If false, then files and directories will be set with the owner and group\n * of the user running the process. This is similar to `-p` in `tar(1)`, but\n * ACLs and other system-specific data is never unpacked in this\n * implementation, and modes are set by default already.\n */\n p?: TarOptions['preserveOwner']\n /**\n * Pack the targets of symbolic links rather than the link itself.\n */\n L?: TarOptions['follow']\n /**\n * Pack the targets of symbolic links rather than the link itself.\n */\n h?: TarOptions['follow']\n\n /**\n * Deprecated option. Set explicitly false to set `chmod: true`. Ignored\n * if {@link TarOptions#chmod} is set to any boolean value.\n *\n * @deprecated\n */\n noChmod?: boolean\n}\n\nexport type TarOptionsWithAliasesSync = TarOptionsWithAliases & {\n sync: true\n}\nexport type TarOptionsWithAliasesAsync = TarOptionsWithAliases & {\n sync?: false\n}\nexport type TarOptionsWithAliasesFile =\n | (TarOptionsWithAliases & {\n file: string\n })\n | (TarOptionsWithAliases & { f: string })\nexport type TarOptionsWithAliasesSyncFile =\n TarOptionsWithAliasesSync & TarOptionsWithAliasesFile\nexport type TarOptionsWithAliasesAsyncFile =\n TarOptionsWithAliasesAsync & TarOptionsWithAliasesFile\n\nexport type TarOptionsWithAliasesNoFile = TarOptionsWithAliases & {\n f?: undefined\n file?: undefined\n}\n\nexport type TarOptionsWithAliasesSyncNoFile =\n TarOptionsWithAliasesSync & TarOptionsWithAliasesNoFile\nexport type TarOptionsWithAliasesAsyncNoFile =\n TarOptionsWithAliasesAsync & TarOptionsWithAliasesNoFile\n\nexport const isSyncFile = <O extends TarOptions>(\n o: O,\n): o is O & TarOptionsSyncFile => !!o.sync && !!o.file\nexport const isAsyncFile = <O extends TarOptions>(\n o: O,\n): o is O & TarOptionsAsyncFile => !o.sync && !!o.file\nexport const isSyncNoFile = <O extends TarOptions>(\n o: O,\n): o is O & TarOptionsSyncNoFile => !!o.sync && !o.file\nexport const isAsyncNoFile = <O extends TarOptions>(\n o: O,\n): o is O & TarOptionsAsyncNoFile => !o.sync && !o.file\nexport const isSync = <O extends TarOptions>(\n o: O,\n): o is O & TarOptionsSync => !!o.sync\nexport const isAsync = <O extends TarOptions>(\n o: O,\n): o is O & TarOptionsAsync => !o.sync\nexport const isFile = <O extends TarOptions>(\n o: O,\n): o is O & TarOptionsFile => !!o.file\nexport const isNoFile = <O extends TarOptions>(\n o: O,\n): o is O & TarOptionsNoFile => !o.file\n\nconst dealiasKey = (\n k: keyof TarOptionsWithAliases,\n): keyof TarOptions => {\n const d = argmap.get(k)\n if (d) return d\n return k as keyof TarOptions\n}\n\nexport const dealias = (\n opt: TarOptionsWithAliases = {},\n): TarOptions => {\n if (!opt) return {}\n const result: Record<string, any> = {}\n for (const [key, v] of Object.entries(opt) as [\n keyof TarOptionsWithAliases,\n any,\n ][]) {\n // TS doesn't know that aliases are going to always be the same type\n const k = dealiasKey(key)\n result[k] = v\n }\n // affordance for deprecated noChmod -> chmod\n if (result.chmod === undefined && result.noChmod === false) {\n result.chmod = true\n }\n delete result.noChmod\n return result as TarOptions\n}\n", "import {\n dealias,\n isAsyncFile,\n isAsyncNoFile,\n isSyncFile,\n isSyncNoFile,\n TarOptions,\n TarOptionsAsyncFile,\n TarOptionsAsyncNoFile,\n TarOptionsSyncFile,\n TarOptionsSyncNoFile,\n TarOptionsWithAliases,\n TarOptionsWithAliasesAsync,\n TarOptionsWithAliasesAsyncFile,\n TarOptionsWithAliasesAsyncNoFile,\n TarOptionsWithAliasesFile,\n TarOptionsWithAliasesNoFile,\n TarOptionsWithAliasesSync,\n TarOptionsWithAliasesSyncFile,\n TarOptionsWithAliasesSyncNoFile,\n} from './options.js'\n\nexport type CB = (er?: Error) => any\n\nexport type TarCommand<\n AsyncClass,\n SyncClass extends { sync: true },\n> = {\n // async and no file specified\n (): AsyncClass\n (opt: TarOptionsWithAliasesAsyncNoFile): AsyncClass\n (entries: string[]): AsyncClass\n (\n opt: TarOptionsWithAliasesAsyncNoFile,\n entries: string[],\n ): AsyncClass\n} & {\n // sync and no file\n (opt: TarOptionsWithAliasesSyncNoFile): SyncClass\n (opt: TarOptionsWithAliasesSyncNoFile, entries: string[]): SyncClass\n} & {\n // async and file\n (opt: TarOptionsWithAliasesAsyncFile): Promise<void>\n (\n opt: TarOptionsWithAliasesAsyncFile,\n entries: string[],\n ): Promise<void>\n (opt: TarOptionsWithAliasesAsyncFile, cb: CB): Promise<void>\n (\n opt: TarOptionsWithAliasesAsyncFile,\n entries: string[],\n cb: CB,\n ): Promise<void>\n} & {\n // sync and file\n (opt: TarOptionsWithAliasesSyncFile): void\n (opt: TarOptionsWithAliasesSyncFile, entries: string[]): void\n} & {\n // sync, maybe file\n (opt: TarOptionsWithAliasesSync): typeof opt extends (\n TarOptionsWithAliasesFile\n ) ?\n void\n : typeof opt extends TarOptionsWithAliasesNoFile ? SyncClass\n : void | SyncClass\n (\n opt: TarOptionsWithAliasesSync,\n entries: string[],\n ): typeof opt extends TarOptionsWithAliasesFile ? void\n : typeof opt extends TarOptionsWithAliasesNoFile ? SyncClass\n : void | SyncClass\n} & {\n // async, maybe file\n (opt: TarOptionsWithAliasesAsync): typeof opt extends (\n TarOptionsWithAliasesFile\n ) ?\n Promise<void>\n : typeof opt extends TarOptionsWithAliasesNoFile ? AsyncClass\n : Promise<void> | AsyncClass\n (\n opt: TarOptionsWithAliasesAsync,\n entries: string[],\n ): typeof opt extends TarOptionsWithAliasesFile ? Promise<void>\n : typeof opt extends TarOptionsWithAliasesNoFile ? AsyncClass\n : Promise<void> | AsyncClass\n (opt: TarOptionsWithAliasesAsync, cb: CB): Promise<void>\n (\n opt: TarOptionsWithAliasesAsync,\n entries: string[],\n cb: CB,\n ): typeof opt extends TarOptionsWithAliasesFile ? Promise<void>\n : typeof opt extends TarOptionsWithAliasesNoFile ? never\n : Promise<void>\n} & {\n // maybe sync, file\n (opt: TarOptionsWithAliasesFile): Promise<void> | void\n (\n opt: TarOptionsWithAliasesFile,\n entries: string[],\n ): typeof opt extends TarOptionsWithAliasesSync ? void\n : typeof opt extends TarOptionsWithAliasesAsync ? Promise<void>\n : Promise<void> | void\n (opt: TarOptionsWithAliasesFile, cb: CB): Promise<void>\n (\n opt: TarOptionsWithAliasesFile,\n entries: string[],\n cb: CB,\n ): typeof opt extends TarOptionsWithAliasesSync ? never\n : typeof opt extends TarOptionsWithAliasesAsync ? Promise<void>\n : Promise<void>\n} & {\n // maybe sync, no file\n (opt: TarOptionsWithAliasesNoFile): typeof opt extends (\n TarOptionsWithAliasesSync\n ) ?\n SyncClass\n : typeof opt extends TarOptionsWithAliasesAsync ? AsyncClass\n : SyncClass | AsyncClass\n (\n opt: TarOptionsWithAliasesNoFile,\n entries: string[],\n ): typeof opt extends TarOptionsWithAliasesSync ? SyncClass\n : typeof opt extends TarOptionsWithAliasesAsync ? AsyncClass\n : SyncClass | AsyncClass\n} & {\n // maybe sync, maybe file\n (opt: TarOptionsWithAliases): typeof opt extends (\n TarOptionsWithAliasesFile\n ) ?\n typeof opt extends TarOptionsWithAliasesSync ? void\n : typeof opt extends TarOptionsWithAliasesAsync ? Promise<void>\n : void | Promise<void>\n : typeof opt extends TarOptionsWithAliasesNoFile ?\n typeof opt extends TarOptionsWithAliasesSync ? SyncClass\n : typeof opt extends TarOptionsWithAliasesAsync ? AsyncClass\n : SyncClass | AsyncClass\n : typeof opt extends TarOptionsWithAliasesSync ? SyncClass | void\n : typeof opt extends TarOptionsWithAliasesAsync ?\n AsyncClass | Promise<void>\n : SyncClass | void | AsyncClass | Promise<void>\n} & {\n // extras\n syncFile: (opt: TarOptionsSyncFile, entries: string[]) => void\n asyncFile: (\n opt: TarOptionsAsyncFile,\n entries: string[],\n cb?: CB,\n ) => Promise<void>\n syncNoFile: (\n opt: TarOptionsSyncNoFile,\n entries: string[],\n ) => SyncClass\n asyncNoFile: (\n opt: TarOptionsAsyncNoFile,\n entries: string[],\n ) => AsyncClass\n validate?: (opt: TarOptions, entries?: string[]) => void\n}\n\nexport const makeCommand = <\n AsyncClass,\n SyncClass extends { sync: true },\n>(\n syncFile: (opt: TarOptionsSyncFile, entries: string[]) => void,\n asyncFile: (\n opt: TarOptionsAsyncFile,\n entries: string[],\n cb?: CB,\n ) => Promise<void>,\n syncNoFile: (\n opt: TarOptionsSyncNoFile,\n entries: string[],\n ) => SyncClass,\n asyncNoFile: (\n opt: TarOptionsAsyncNoFile,\n entries: string[],\n ) => AsyncClass,\n validate?: (opt: TarOptions, entries?: string[]) => void,\n): TarCommand<AsyncClass, SyncClass> => {\n return Object.assign(\n (\n opt_: TarOptionsWithAliases | string[] = [],\n entries?: string[] | CB,\n cb?: CB,\n ) => {\n if (Array.isArray(opt_)) {\n entries = opt_\n opt_ = {}\n }\n\n if (typeof entries === 'function') {\n cb = entries\n entries = undefined\n }\n\n if (!entries) {\n entries = []\n } else {\n entries = Array.from(entries)\n }\n\n const opt = dealias(opt_)\n\n validate?.(opt, entries)\n\n if (isSyncFile(opt)) {\n if (typeof cb === 'function') {\n throw new TypeError(\n 'callback not supported for sync tar functions',\n )\n }\n return syncFile(opt, entries)\n } else if (isAsyncFile(opt)) {\n const p = asyncFile(opt, entries)\n // weirdness to make TS happy\n const c = cb ? cb : undefined\n return c ? p.then(() => c(), c) : p\n } else if (isSyncNoFile(opt)) {\n if (typeof cb === 'function') {\n throw new TypeError(\n 'callback not supported for sync tar functions',\n )\n }\n return syncNoFile(opt, entries)\n } else if (isAsyncNoFile(opt)) {\n if (typeof cb === 'function') {\n throw new TypeError(\n 'callback only supported with file option',\n )\n }\n return asyncNoFile(opt, entries)\n /* c8 ignore start */\n } else {\n throw new Error('impossible options??')\n }\n /* c8 ignore stop */\n },\n {\n syncFile,\n asyncFile,\n syncNoFile,\n asyncNoFile,\n validate,\n },\n ) as TarCommand<AsyncClass, SyncClass>\n}\n", "// this[BUFFER] is the remainder of a chunk if we're waiting for\n// the full 512 bytes of a header to come in. We will Buffer.concat()\n// it to the next write(), which is a mem copy, but a small one.\n//\n// this[QUEUE] is a Yallist of entries that haven't been emitted\n// yet this can only get filled up if the user keeps write()ing after\n// a write() returns false, or does a write() with more than one entry\n//\n// We don't buffer chunks, we always parse them and either create an\n// entry, or push it into the active entry. The ReadEntry class knows\n// to throw data away if .ignore=true\n//\n// Shift entry off the buffer when it emits 'end', and emit 'entry' for\n// the next one in the list.\n//\n// At any time, we're pushing body chunks into the entry at WRITEENTRY,\n// and waiting for 'end' on the entry at READENTRY\n//\n// ignored entries get .resume() called on them straight away\n\nimport { EventEmitter as EE } from 'events'\nimport { BrotliDecompress, Unzip } from 'minizlib'\nimport { Yallist } from 'yallist'\nimport { Header } from './header.js'\nimport { TarOptions } from './options.js'\nimport { Pax } from './pax.js'\nimport { ReadEntry } from './read-entry.js'\nimport {\n warnMethod,\n type WarnData,\n type Warner,\n} from './warn-method.js'\n\nconst maxMetaEntrySize = 1024 * 1024\nconst gzipHeader = Buffer.from([0x1f, 0x8b])\n\nconst STATE = Symbol('state')\nconst WRITEENTRY = Symbol('writeEntry')\nconst READENTRY = Symbol('readEntry')\nconst NEXTENTRY = Symbol('nextEntry')\nconst PROCESSENTRY = Symbol('processEntry')\nconst EX = Symbol('extendedHeader')\nconst GEX = Symbol('globalExtendedHeader')\nconst META = Symbol('meta')\nconst EMITMETA = Symbol('emitMeta')\nconst BUFFER = Symbol('buffer')\nconst QUEUE = Symbol('queue')\nconst ENDED = Symbol('ended')\nconst EMITTEDEND = Symbol('emittedEnd')\nconst EMIT = Symbol('emit')\nconst UNZIP = Symbol('unzip')\nconst CONSUMECHUNK = Symbol('consumeChunk')\nconst CONSUMECHUNKSUB = Symbol('consumeChunkSub')\nconst CONSUMEBODY = Symbol('consumeBody')\nconst CONSUMEMETA = Symbol('consumeMeta')\nconst CONSUMEHEADER = Symbol('consumeHeader')\nconst CONSUMING = Symbol('consuming')\nconst BUFFERCONCAT = Symbol('bufferConcat')\nconst MAYBEEND = Symbol('maybeEnd')\nconst WRITING = Symbol('writing')\nconst ABORTED = Symbol('aborted')\nconst DONE = Symbol('onDone')\nconst SAW_VALID_ENTRY = Symbol('sawValidEntry')\nconst SAW_NULL_BLOCK = Symbol('sawNullBlock')\nconst SAW_EOF = Symbol('sawEOF')\nconst CLOSESTREAM = Symbol('closeStream')\n\nconst noop = () => true\n\nexport type State = 'begin' | 'header' | 'ignore' | 'meta' | 'body'\n\nexport class Parser extends EE implements Warner {\n file: string\n strict: boolean\n maxMetaEntrySize: number\n filter: Exclude<TarOptions['filter'], undefined>\n brotli?: TarOptions['brotli']\n\n writable: true = true\n readable: false = false;\n\n [QUEUE]: Yallist<ReadEntry | [string | symbol, any, any]> =\n new Yallist();\n [BUFFER]?: Buffer;\n [READENTRY]?: ReadEntry;\n [WRITEENTRY]?: ReadEntry;\n [STATE]: State = 'begin';\n [META]: string = '';\n [EX]?: Pax;\n [GEX]?: Pax;\n [ENDED]: boolean = false;\n [UNZIP]?: false | Unzip | BrotliDecompress;\n [ABORTED]: boolean = false;\n [SAW_VALID_ENTRY]?: boolean;\n [SAW_NULL_BLOCK]: boolean = false;\n [SAW_EOF]: boolean = false;\n [WRITING]: boolean = false;\n [CONSUMING]: boolean = false;\n [EMITTEDEND]: boolean = false\n\n constructor(opt: TarOptions = {}) {\n super()\n\n this.file = opt.file || ''\n\n // these BADARCHIVE errors can't be detected early. listen on DONE.\n this.on(DONE, () => {\n if (\n this[STATE] === 'begin' ||\n this[SAW_VALID_ENTRY] === false\n ) {\n // either less than 1 block of data, or all entries were invalid.\n // Either way, probably not even a tarball.\n this.warn('TAR_BAD_ARCHIVE', 'Unrecognized archive format')\n }\n })\n\n if (opt.ondone) {\n this.on(DONE, opt.ondone)\n } else {\n this.on(DONE, () => {\n this.emit('prefinish')\n this.emit('finish')\n this.emit('end')\n })\n }\n\n this.strict = !!opt.strict\n this.maxMetaEntrySize = opt.maxMetaEntrySize || maxMetaEntrySize\n this.filter = typeof opt.filter === 'function' ? opt.filter : noop\n // Unlike gzip, brotli doesn't have any magic bytes to identify it\n // Users need to explicitly tell us they're extracting a brotli file\n // Or we infer from the file extension\n const isTBR =\n opt.file &&\n (opt.file.endsWith('.tar.br') || opt.file.endsWith('.tbr'))\n // if it's a tbr file it MIGHT be brotli, but we don't know until\n // we look at it and verify it's not a valid tar file.\n this.brotli =\n !opt.gzip && opt.brotli !== undefined ? opt.brotli\n : isTBR ? undefined\n : false\n\n // have to set this so that streams are ok piping into it\n this.on('end', () => this[CLOSESTREAM]())\n\n if (typeof opt.onwarn === 'function') {\n this.on('warn', opt.onwarn)\n }\n if (typeof opt.onReadEntry === 'function') {\n this.on('entry', opt.onReadEntry)\n }\n }\n\n warn(\n code: string,\n message: string | Error,\n data: WarnData = {},\n ): void {\n warnMethod(this, code, message, data)\n }\n\n [CONSUMEHEADER](chunk: Buffer, position: number) {\n if (this[SAW_VALID_ENTRY] === undefined) {\n this[SAW_VALID_ENTRY] = false\n }\n let header\n try {\n header = new Header(chunk, position, this[EX], this[GEX])\n } catch (er) {\n return this.warn('TAR_ENTRY_INVALID', er as Error)\n }\n\n if (header.nullBlock) {\n if (this[SAW_NULL_BLOCK]) {\n this[SAW_EOF] = true\n // ending an archive with no entries. pointless, but legal.\n if (this[STATE] === 'begin') {\n this[STATE] = 'header'\n }\n this[EMIT]('eof')\n } else {\n this[SAW_NULL_BLOCK] = true\n this[EMIT]('nullBlock')\n }\n } else {\n this[SAW_NULL_BLOCK] = false\n if (!header.cksumValid) {\n this.warn('TAR_ENTRY_INVALID', 'checksum failure', { header })\n } else if (!header.path) {\n this.warn('TAR_ENTRY_INVALID', 'path is required', { header })\n } else {\n const type = header.type\n if (/^(Symbolic)?Link$/.test(type) && !header.linkpath) {\n this.warn('TAR_ENTRY_INVALID', 'linkpath required', {\n header,\n })\n } else if (\n !/^(Symbolic)?Link$/.test(type) &&\n !/^(Global)?ExtendedHeader$/.test(type) &&\n header.linkpath\n ) {\n this.warn('TAR_ENTRY_INVALID', 'linkpath forbidden', {\n header,\n })\n } else {\n const entry = (this[WRITEENTRY] = new ReadEntry(\n header,\n this[EX],\n this[GEX],\n ))\n\n // we do this for meta & ignored entries as well, because they\n // are still valid tar, or else we wouldn't know to ignore them\n if (!this[SAW_VALID_ENTRY]) {\n if (entry.remain) {\n // this might be the one!\n const onend = () => {\n if (!entry.invalid) {\n this[SAW_VALID_ENTRY] = true\n }\n }\n entry.on('end', onend)\n } else {\n this[SAW_VALID_ENTRY] = true\n }\n }\n\n if (entry.meta) {\n if (entry.size > this.maxMetaEntrySize) {\n entry.ignore = true\n this[EMIT]('ignoredEntry', entry)\n this[STATE] = 'ignore'\n entry.resume()\n } else if (entry.size > 0) {\n this[META] = ''\n entry.on('data', c => (this[META] += c))\n this[STATE] = 'meta'\n }\n } else {\n this[EX] = undefined\n entry.ignore =\n entry.ignore || !this.filter(entry.path, entry)\n\n if (entry.ignore) {\n // probably valid, just not something we care about\n this[EMIT]('ignoredEntry', entry)\n this[STATE] = entry.remain ? 'ignore' : 'header'\n entry.resume()\n } else {\n if (entry.remain) {\n this[STATE] = 'body'\n } else {\n this[STATE] = 'header'\n entry.end()\n }\n\n if (!this[READENTRY]) {\n this[QUEUE].push(entry)\n this[NEXTENTRY]()\n } else {\n this[QUEUE].push(entry)\n }\n }\n }\n }\n }\n }\n }\n\n [CLOSESTREAM]() {\n queueMicrotask(() => this.emit('close'))\n }\n\n [PROCESSENTRY](entry?: ReadEntry | [string | symbol, any, any]) {\n let go = true\n\n if (!entry) {\n this[READENTRY] = undefined\n go = false\n } else if (Array.isArray(entry)) {\n const [ev, ...args]: [string | symbol, any, any] = entry\n this.emit(ev, ...args)\n } else {\n this[READENTRY] = entry\n this.emit('entry', entry)\n if (!entry.emittedEnd) {\n entry.on('end', () => this[NEXTENTRY]())\n go = false\n }\n }\n\n return go\n }\n\n [NEXTENTRY]() {\n do {} while (this[PROCESSENTRY](this[QUEUE].shift()))\n\n if (!this[QUEUE].length) {\n // At this point, there's nothing in the queue, but we may have an\n // entry which is being consumed (readEntry).\n // If we don't, then we definitely can handle more data.\n // If we do, and either it's flowing, or it has never had any data\n // written to it, then it needs more.\n // The only other possibility is that it has returned false from a\n // write() call, so we wait for the next drain to continue.\n const re = this[READENTRY]\n const drainNow = !re || re.flowing || re.size === re.remain\n if (drainNow) {\n if (!this[WRITING]) {\n this.emit('drain')\n }\n } else {\n re.once('drain', () => this.emit('drain'))\n }\n }\n }\n\n [CONSUMEBODY](chunk: Buffer, position: number) {\n // write up to but no more than writeEntry.blockRemain\n const entry = this[WRITEENTRY]\n /* c8 ignore start */\n if (!entry) {\n throw new Error('attempt to consume body without entry??')\n }\n const br = entry.blockRemain ?? 0\n /* c8 ignore stop */\n const c =\n br >= chunk.length && position === 0 ?\n chunk\n : chunk.subarray(position, position + br)\n\n entry.write(c)\n\n if (!entry.blockRemain) {\n this[STATE] = 'header'\n this[WRITEENTRY] = undefined\n entry.end()\n }\n\n return c.length\n }\n\n [CONSUMEMETA](chunk: Buffer, position: number) {\n const entry = this[WRITEENTRY]\n const ret = this[CONSUMEBODY](chunk, position)\n\n // if we finished, then the entry is reset\n if (!this[WRITEENTRY] && entry) {\n this[EMITMETA](entry)\n }\n\n return ret\n }\n\n [EMIT](ev: string | symbol, data?: any, extra?: any) {\n if (!this[QUEUE].length && !this[READENTRY]) {\n this.emit(ev, data, extra)\n } else {\n this[QUEUE].push([ev, data, extra])\n }\n }\n\n [EMITMETA](entry: ReadEntry) {\n this[EMIT]('meta', this[META])\n switch (entry.type) {\n case 'ExtendedHeader':\n case 'OldExtendedHeader':\n this[EX] = Pax.parse(this[META], this[EX], false)\n break\n\n case 'GlobalExtendedHeader':\n this[GEX] = Pax.parse(this[META], this[GEX], true)\n break\n\n case 'NextFileHasLongPath':\n case 'OldGnuLongPath': {\n const ex = this[EX] ?? Object.create(null)\n this[EX] = ex\n ex.path = this[META].replace(/\\0.*/, '')\n break\n }\n\n case 'NextFileHasLongLinkpath': {\n const ex = this[EX] || Object.create(null)\n this[EX] = ex\n ex.linkpath = this[META].replace(/\\0.*/, '')\n break\n }\n\n /* c8 ignore start */\n default:\n throw new Error('unknown meta: ' + entry.type)\n /* c8 ignore stop */\n }\n }\n\n abort(error: Error) {\n this[ABORTED] = true\n this.emit('abort', error)\n // always throws, even in non-strict mode\n this.warn('TAR_ABORT', error, { recoverable: false })\n }\n\n write(\n buffer: Uint8Array | string,\n cb?: (err?: Error | null) => void,\n ): boolean\n write(\n str: string,\n encoding?: BufferEncoding,\n cb?: (err?: Error | null) => void,\n ): boolean\n write(\n chunk: Buffer | string,\n encoding?: BufferEncoding | (() => any),\n cb?: () => any,\n ): boolean {\n if (typeof encoding === 'function') {\n cb = encoding\n encoding = undefined\n }\n if (typeof chunk === 'string') {\n chunk = Buffer.from(\n chunk,\n /* c8 ignore next */\n typeof encoding === 'string' ? encoding : 'utf8',\n )\n }\n if (this[ABORTED]) {\n /* c8 ignore next */\n cb?.()\n return false\n }\n\n // first write, might be gzipped\n const needSniff =\n this[UNZIP] === undefined ||\n (this.brotli === undefined && this[UNZIP] === false)\n if (needSniff && chunk) {\n if (this[BUFFER]) {\n chunk = Buffer.concat([this[BUFFER], chunk])\n this[BUFFER] = undefined\n }\n if (chunk.length < gzipHeader.length) {\n this[BUFFER] = chunk\n /* c8 ignore next */\n cb?.()\n return true\n }\n\n // look for gzip header\n for (\n let i = 0;\n this[UNZIP] === undefined && i < gzipHeader.length;\n i++\n ) {\n if (chunk[i] !== gzipHeader[i]) {\n this[UNZIP] = false\n }\n }\n\n const maybeBrotli = this.brotli === undefined\n if (this[UNZIP] === false && maybeBrotli) {\n // read the first header to see if it's a valid tar file. If so,\n // we can safely assume that it's not actually brotli, despite the\n // .tbr or .tar.br file extension.\n // if we ended before getting a full chunk, yes, def brotli\n if (chunk.length < 512) {\n if (this[ENDED]) {\n this.brotli = true\n } else {\n this[BUFFER] = chunk\n /* c8 ignore next */\n cb?.()\n return true\n }\n } else {\n // if it's tar, it's pretty reliably not brotli, chances of\n // that happening are astronomical.\n try {\n new Header(chunk.subarray(0, 512))\n this.brotli = false\n } catch (_) {\n this.brotli = true\n }\n }\n }\n\n if (\n this[UNZIP] === undefined ||\n (this[UNZIP] === false && this.brotli)\n ) {\n const ended = this[ENDED]\n this[ENDED] = false\n this[UNZIP] =\n this[UNZIP] === undefined ?\n new Unzip({})\n : new BrotliDecompress({})\n this[UNZIP].on('data', chunk => this[CONSUMECHUNK](chunk))\n this[UNZIP].on('error', er => this.abort(er as Error))\n this[UNZIP].on('end', () => {\n this[ENDED] = true\n this[CONSUMECHUNK]()\n })\n this[WRITING] = true\n const ret = !!this[UNZIP][ended ? 'end' : 'write'](chunk)\n this[WRITING] = false\n cb?.()\n return ret\n }\n }\n\n this[WRITING] = true\n if (this[UNZIP]) {\n this[UNZIP].write(chunk)\n } else {\n this[CONSUMECHUNK](chunk)\n }\n this[WRITING] = false\n\n // return false if there's a queue, or if the current entry isn't flowing\n const ret =\n this[QUEUE].length ? false\n : this[READENTRY] ? this[READENTRY].flowing\n : true\n\n // if we have no queue, then that means a clogged READENTRY\n if (!ret && !this[QUEUE].length) {\n this[READENTRY]?.once('drain', () => this.emit('drain'))\n }\n\n /* c8 ignore next */\n cb?.()\n return ret\n }\n\n [BUFFERCONCAT](c: Buffer) {\n if (c && !this[ABORTED]) {\n this[BUFFER] =\n this[BUFFER] ? Buffer.concat([this[BUFFER], c]) : c\n }\n }\n\n [MAYBEEND]() {\n if (\n this[ENDED] &&\n !this[EMITTEDEND] &&\n !this[ABORTED] &&\n !this[CONSUMING]\n ) {\n this[EMITTEDEND] = true\n const entry = this[WRITEENTRY]\n if (entry && entry.blockRemain) {\n // truncated, likely a damaged file\n const have = this[BUFFER] ? this[BUFFER].length : 0\n this.warn(\n 'TAR_BAD_ARCHIVE',\n `Truncated input (needed ${entry.blockRemain} more bytes, only ${have} available)`,\n { entry },\n )\n if (this[BUFFER]) {\n entry.write(this[BUFFER])\n }\n entry.end()\n }\n this[EMIT](DONE)\n }\n }\n\n [CONSUMECHUNK](chunk?: Buffer) {\n if (this[CONSUMING] && chunk) {\n this[BUFFERCONCAT](chunk)\n } else if (!chunk && !this[BUFFER]) {\n this[MAYBEEND]()\n } else if (chunk) {\n this[CONSUMING] = true\n if (this[BUFFER]) {\n this[BUFFERCONCAT](chunk)\n const c = this[BUFFER]\n this[BUFFER] = undefined\n this[CONSUMECHUNKSUB](c)\n } else {\n this[CONSUMECHUNKSUB](chunk)\n }\n\n while (\n this[BUFFER] &&\n (this[BUFFER] as Buffer)?.length >= 512 &&\n !this[ABORTED] &&\n !this[SAW_EOF]\n ) {\n const c = this[BUFFER]\n this[BUFFER] = undefined\n this[CONSUMECHUNKSUB](c)\n }\n this[CONSUMING] = false\n }\n\n if (!this[BUFFER] || this[ENDED]) {\n this[MAYBEEND]()\n }\n }\n\n [CONSUMECHUNKSUB](chunk: Buffer) {\n // we know that we are in CONSUMING mode, so anything written goes into\n // the buffer. Advance the position and put any remainder in the buffer.\n let position = 0\n const length = chunk.length\n while (\n position + 512 <= length &&\n !this[ABORTED] &&\n !this[SAW_EOF]\n ) {\n switch (this[STATE]) {\n case 'begin':\n case 'header':\n this[CONSUMEHEADER](chunk, position)\n position += 512\n break\n\n case 'ignore':\n case 'body':\n position += this[CONSUMEBODY](chunk, position)\n break\n\n case 'meta':\n position += this[CONSUMEMETA](chunk, position)\n break\n\n /* c8 ignore start */\n default:\n throw new Error('invalid state: ' + this[STATE])\n /* c8 ignore stop */\n }\n }\n\n if (position < length) {\n if (this[BUFFER]) {\n this[BUFFER] = Buffer.concat([\n chunk.subarray(position),\n this[BUFFER],\n ])\n } else {\n this[BUFFER] = chunk.subarray(position)\n }\n }\n }\n\n end(cb?: () => void): this\n end(data: string | Buffer, cb?: () => void): this\n end(str: string, encoding?: BufferEncoding, cb?: () => void): this\n end(\n chunk?: string | Buffer | (() => void),\n encoding?: BufferEncoding | (() => void),\n cb?: () => void,\n ) {\n if (typeof chunk === 'function') {\n cb = chunk\n encoding = undefined\n chunk = undefined\n }\n if (typeof encoding === 'function') {\n cb = encoding\n encoding = undefined\n }\n if (typeof chunk === 'string') {\n chunk = Buffer.from(chunk, encoding)\n }\n if (cb) this.once('finish', cb)\n if (!this[ABORTED]) {\n if (this[UNZIP]) {\n /* c8 ignore start */\n if (chunk) this[UNZIP].write(chunk)\n /* c8 ignore stop */\n this[UNZIP].end()\n } else {\n this[ENDED] = true\n if (this.brotli === undefined)\n chunk = chunk || Buffer.alloc(0)\n if (chunk) this.write(chunk)\n this[MAYBEEND]()\n }\n }\n return this\n }\n}\n", "import assert from 'assert'\nimport { Buffer } from 'buffer'\nimport { Minipass } from 'minipass'\nimport realZlib from 'zlib'\nimport { constants } from './constants.js'\nexport { constants } from './constants.js'\n\nconst OriginalBufferConcat = Buffer.concat\nconst _superWrite = Symbol('_superWrite')\n\nexport class ZlibError extends Error {\n code?: string\n errno?: number\n constructor(err: NodeJS.ErrnoException | Error) {\n super('zlib: ' + err.message)\n this.code = (err as NodeJS.ErrnoException).code\n this.errno = (err as NodeJS.ErrnoException).errno\n /* c8 ignore next */\n if (!this.code) this.code = 'ZLIB_ERROR'\n\n this.message = 'zlib: ' + err.message\n Error.captureStackTrace(this, this.constructor)\n }\n\n get name() {\n return 'ZlibError'\n }\n}\n\n// the Zlib class they all inherit from\n// This thing manages the queue of requests, and returns\n// true or false if there is anything in the queue when\n// you call the .write() method.\nconst _flushFlag = Symbol('flushFlag')\n\nexport type ChunkWithFlushFlag = Minipass.ContiguousData & {\n [_flushFlag]?: number\n}\n\nexport type ZlibBaseOptions = Minipass.Options<Minipass.ContiguousData> & {\n flush?: number\n finishFlush?: number\n fullFlushFlag?: number\n}\nexport type ZlibMode =\n | 'Gzip'\n | 'Gunzip'\n | 'Deflate'\n | 'Inflate'\n | 'DeflateRaw'\n | 'InflateRaw'\n | 'Unzip'\nexport type ZlibHandle =\n | realZlib.Gzip\n | realZlib.Gunzip\n | realZlib.Deflate\n | realZlib.Inflate\n | realZlib.DeflateRaw\n | realZlib.InflateRaw\nexport type BrotliMode = 'BrotliCompress' | 'BrotliDecompress'\n\nabstract class ZlibBase extends Minipass<Buffer, ChunkWithFlushFlag> {\n #sawError: boolean = false\n #ended: boolean = false\n #flushFlag: number\n #finishFlushFlag: number\n #fullFlushFlag: number\n #handle?: ZlibHandle\n #onError: (err: ZlibError) => any\n\n get sawError() {\n return this.#sawError\n }\n get handle() {\n return this.#handle\n }\n /* c8 ignore start */\n get flushFlag() {\n return this.#flushFlag\n }\n /* c8 ignore stop */\n\n constructor(opts: ZlibBaseOptions, mode: ZlibMode | BrotliMode) {\n if (!opts || typeof opts !== 'object')\n throw new TypeError('invalid options for ZlibBase constructor')\n\n //@ts-ignore\n super(opts)\n\n /* c8 ignore start */\n this.#flushFlag = opts.flush ?? 0\n this.#finishFlushFlag = opts.finishFlush ?? 0\n this.#fullFlushFlag = opts.fullFlushFlag ?? 0\n /* c8 ignore stop */\n\n // this will throw if any options are invalid for the class selected\n try {\n // @types/node doesn't know that it exports the classes, but they're there\n //@ts-ignore\n this.#handle = new realZlib[mode](opts)\n } catch (er) {\n // make sure that all errors get decorated properly\n throw new ZlibError(er as NodeJS.ErrnoException)\n }\n\n this.#onError = err => {\n // no sense raising multiple errors, since we abort on the first one.\n if (this.#sawError) return\n\n this.#sawError = true\n\n // there is no way to cleanly recover.\n // continuing only obscures problems.\n this.close()\n this.emit('error', err)\n }\n\n this.#handle?.on('error', er => this.#onError(new ZlibError(er)))\n this.once('end', () => this.close)\n }\n\n close() {\n if (this.#handle) {\n this.#handle.close()\n this.#handle = undefined\n this.emit('close')\n }\n }\n\n reset() {\n if (!this.#sawError) {\n assert(this.#handle, 'zlib binding closed')\n //@ts-ignore\n return this.#handle.reset?.()\n }\n }\n\n flush(flushFlag?: number) {\n if (this.ended) return\n\n if (typeof flushFlag !== 'number') flushFlag = this.#fullFlushFlag\n\n this.write(Object.assign(Buffer.alloc(0), { [_flushFlag]: flushFlag }))\n }\n\n end(cb?: () => void): this\n end(chunk: ChunkWithFlushFlag, cb?: () => void): this\n end(\n chunk: ChunkWithFlushFlag,\n encoding?: Minipass.Encoding,\n cb?: () => void,\n ): this\n end(\n chunk?: ChunkWithFlushFlag | (() => void),\n encoding?: Minipass.Encoding | (() => void),\n cb?: () => void,\n ) {\n /* c8 ignore start */\n if (typeof chunk === 'function') {\n cb = chunk\n encoding = undefined\n chunk = undefined\n }\n if (typeof encoding === 'function') {\n cb = encoding\n encoding = undefined\n }\n /* c8 ignore stop */\n if (chunk) {\n if (encoding) this.write(chunk, encoding)\n else this.write(chunk)\n }\n this.flush(this.#finishFlushFlag)\n this.#ended = true\n return super.end(cb)\n }\n\n get ended() {\n return this.#ended\n }\n\n // overridden in the gzip classes to do portable writes\n [_superWrite](data: Buffer & { [_flushFlag]?: number }) {\n return super.write(data)\n }\n\n write(chunk: ChunkWithFlushFlag, cb?: () => void): boolean\n write(\n chunk: ChunkWithFlushFlag,\n encoding?: Minipass.Encoding,\n cb?: () => void,\n ): boolean\n write(\n chunk: ChunkWithFlushFlag,\n encoding?: Minipass.Encoding | (() => void),\n cb?: () => void,\n ) {\n // process the chunk using the sync process\n // then super.write() all the outputted chunks\n if (typeof encoding === 'function')\n (cb = encoding), (encoding = 'utf8')\n\n if (typeof chunk === 'string')\n chunk = Buffer.from(chunk as string, encoding as BufferEncoding)\n\n if (this.#sawError) return\n assert(this.#handle, 'zlib binding closed')\n\n // _processChunk tries to .close() the native handle after it's done, so we\n // intercept that by temporarily making it a no-op.\n // diving into the node:zlib internals a bit here\n const nativeHandle = (this.#handle as unknown as { _handle: any })\n ._handle\n const originalNativeClose = nativeHandle.close\n nativeHandle.close = () => {}\n const originalClose = this.#handle.close\n this.#handle.close = () => {}\n // It also calls `Buffer.concat()` at the end, which may be convenient\n // for some, but which we are not interested in as it slows us down.\n Buffer.concat = args => args as unknown as Buffer\n let result: undefined | Buffer | Buffer[] = undefined\n try {\n const flushFlag =\n typeof chunk[_flushFlag] === 'number'\n ? chunk[_flushFlag]\n : this.#flushFlag\n result = (\n this.#handle as unknown as {\n _processChunk: (chunk: Buffer, flushFlag: number) => Buffer[]\n }\n )._processChunk(chunk as Buffer, flushFlag)\n // if we don't throw, reset it back how it was\n Buffer.concat = OriginalBufferConcat\n } catch (err) {\n // or if we do, put Buffer.concat() back before we emit error\n // Error events call into user code, which may call Buffer.concat()\n Buffer.concat = OriginalBufferConcat\n this.#onError(new ZlibError(err as NodeJS.ErrnoException))\n } finally {\n if (this.#handle) {\n // Core zlib resets `_handle` to null after attempting to close the\n // native handle. Our no-op handler prevented actual closure, but we\n // need to restore the `._handle` property.\n ;(this.#handle as unknown as { _handle: any })._handle =\n nativeHandle\n nativeHandle.close = originalNativeClose\n this.#handle.close = originalClose\n // `_processChunk()` adds an 'error' listener. If we don't remove it\n // after each call, these handlers start piling up.\n this.#handle.removeAllListeners('error')\n // make sure OUR error listener is still attached tho\n }\n }\n\n if (this.#handle)\n this.#handle.on('error', er => this.#onError(new ZlibError(er)))\n\n let writeReturn\n if (result) {\n if (Array.isArray(result) && result.length > 0) {\n const r = result[0]\n // The first buffer is always `handle._outBuffer`, which would be\n // re-used for later invocations; so, we always have to copy that one.\n writeReturn = this[_superWrite](Buffer.from(r as Buffer))\n for (let i = 1; i < result.length; i++) {\n writeReturn = this[_superWrite](result[i] as Buffer)\n }\n } else {\n // either a single Buffer or an empty array\n writeReturn = this[_superWrite](Buffer.from(result as Buffer | []))\n }\n }\n\n if (cb) cb()\n return writeReturn\n }\n}\n\nexport type ZlibOptions = ZlibBaseOptions & {\n level?: number\n strategy?: number\n}\n\nexport class Zlib extends ZlibBase {\n #level?: number\n #strategy?: number\n\n constructor(opts: ZlibOptions, mode: ZlibMode) {\n opts = opts || {}\n\n opts.flush = opts.flush || constants.Z_NO_FLUSH\n opts.finishFlush = opts.finishFlush || constants.Z_FINISH\n opts.fullFlushFlag = constants.Z_FULL_FLUSH\n super(opts, mode)\n\n this.#level = opts.level\n this.#strategy = opts.strategy\n }\n\n params(level: number, strategy: number) {\n if (this.sawError) return\n\n if (!this.handle)\n throw new Error('cannot switch params when binding is closed')\n\n // no way to test this without also not supporting params at all\n /* c8 ignore start */\n if (!(this.handle as { params?: any }).params)\n throw new Error('not supported in this implementation')\n /* c8 ignore stop */\n\n if (this.#level !== level || this.#strategy !== strategy) {\n this.flush(constants.Z_SYNC_FLUSH)\n assert(this.handle, 'zlib binding closed')\n // .params() calls .flush(), but the latter is always async in the\n // core zlib. We override .flush() temporarily to intercept that and\n // flush synchronously.\n const origFlush = this.handle.flush\n this.handle.flush = (\n flushFlag?: (() => void) | number,\n cb?: () => void,\n ) => {\n /* c8 ignore start */\n if (typeof flushFlag === 'function') {\n cb = flushFlag\n flushFlag = this.flushFlag\n }\n /* c8 ignore stop */\n this.flush(flushFlag)\n cb?.()\n }\n try {\n ;(\n this.handle as unknown as {\n params: (level?: number, strategy?: number) => void\n }\n ).params(level, strategy)\n } finally {\n this.handle.flush = origFlush\n }\n /* c8 ignore start */\n if (this.handle) {\n this.#level = level\n this.#strategy = strategy\n }\n /* c8 ignore stop */\n }\n }\n}\n\n// minimal 2-byte header\nexport class Deflate extends Zlib {\n constructor(opts: ZlibOptions) {\n super(opts, 'Deflate')\n }\n}\n\nexport class Inflate extends Zlib {\n constructor(opts: ZlibOptions) {\n super(opts, 'Inflate')\n }\n}\n\n// gzip - bigger header, same deflate compression\nexport type GzipOptions = ZlibOptions & { portable?: boolean }\nexport class Gzip extends Zlib {\n #portable: boolean\n constructor(opts: GzipOptions) {\n super(opts, 'Gzip')\n this.#portable = opts && !!opts.portable\n }\n\n [_superWrite](data: Buffer & { [_flushFlag]?: number }) {\n if (!this.#portable) return super[_superWrite](data)\n\n // we'll always get the header emitted in one first chunk\n // overwrite the OS indicator byte with 0xFF\n this.#portable = false\n data[9] = 255\n return super[_superWrite](data)\n }\n}\n\nexport class Gunzip extends Zlib {\n constructor(opts: ZlibOptions) {\n super(opts, 'Gunzip')\n }\n}\n\n// raw - no header\nexport class DeflateRaw extends Zlib {\n constructor(opts: ZlibOptions) {\n super(opts, 'DeflateRaw')\n }\n}\n\nexport class InflateRaw extends Zlib {\n constructor(opts: ZlibOptions) {\n super(opts, 'InflateRaw')\n }\n}\n\n// auto-detect header.\nexport class Unzip extends Zlib {\n constructor(opts: ZlibOptions) {\n super(opts, 'Unzip')\n }\n}\n\nexport class Brotli extends ZlibBase {\n constructor(opts: ZlibOptions, mode: BrotliMode) {\n opts = opts || {}\n\n opts.flush = opts.flush || constants.BROTLI_OPERATION_PROCESS\n opts.finishFlush =\n opts.finishFlush || constants.BROTLI_OPERATION_FINISH\n opts.fullFlushFlag = constants.BROTLI_OPERATION_FLUSH\n super(opts, mode)\n }\n}\n\nexport class BrotliCompress extends Brotli {\n constructor(opts: ZlibOptions) {\n super(opts, 'BrotliCompress')\n }\n}\n\nexport class BrotliDecompress extends Brotli {\n constructor(opts: ZlibOptions) {\n super(opts, 'BrotliDecompress')\n }\n}\n", "// Update with any zlib constants that are added or changed in the future.\n// Node v6 didn't export this, so we just hard code the version and rely\n// on all the other hard-coded values from zlib v4736. When node v6\n// support drops, we can just export the realZlibConstants object.\nimport realZlib from 'zlib'\n/* c8 ignore start */\nconst realZlibConstants = realZlib.constants || { ZLIB_VERNUM: 4736 }\n/* c8 ignore stop */\n\nexport const constants = Object.freeze(\n Object.assign(\n Object.create(null),\n {\n Z_NO_FLUSH: 0,\n Z_PARTIAL_FLUSH: 1,\n Z_SYNC_FLUSH: 2,\n Z_FULL_FLUSH: 3,\n Z_FINISH: 4,\n Z_BLOCK: 5,\n Z_OK: 0,\n Z_STREAM_END: 1,\n Z_NEED_DICT: 2,\n Z_ERRNO: -1,\n Z_STREAM_ERROR: -2,\n Z_DATA_ERROR: -3,\n Z_MEM_ERROR: -4,\n Z_BUF_ERROR: -5,\n Z_VERSION_ERROR: -6,\n Z_NO_COMPRESSION: 0,\n Z_BEST_SPEED: 1,\n Z_BEST_COMPRESSION: 9,\n Z_DEFAULT_COMPRESSION: -1,\n Z_FILTERED: 1,\n Z_HUFFMAN_ONLY: 2,\n Z_RLE: 3,\n Z_FIXED: 4,\n Z_DEFAULT_STRATEGY: 0,\n DEFLATE: 1,\n INFLATE: 2,\n GZIP: 3,\n GUNZIP: 4,\n DEFLATERAW: 5,\n INFLATERAW: 6,\n UNZIP: 7,\n BROTLI_DECODE: 8,\n BROTLI_ENCODE: 9,\n Z_MIN_WINDOWBITS: 8,\n Z_MAX_WINDOWBITS: 15,\n Z_DEFAULT_WINDOWBITS: 15,\n Z_MIN_CHUNK: 64,\n Z_MAX_CHUNK: Infinity,\n Z_DEFAULT_CHUNK: 16384,\n Z_MIN_MEMLEVEL: 1,\n Z_MAX_MEMLEVEL: 9,\n Z_DEFAULT_MEMLEVEL: 8,\n Z_MIN_LEVEL: -1,\n Z_MAX_LEVEL: 9,\n Z_DEFAULT_LEVEL: -1,\n BROTLI_OPERATION_PROCESS: 0,\n BROTLI_OPERATION_FLUSH: 1,\n BROTLI_OPERATION_FINISH: 2,\n BROTLI_OPERATION_EMIT_METADATA: 3,\n BROTLI_MODE_GENERIC: 0,\n BROTLI_MODE_TEXT: 1,\n BROTLI_MODE_FONT: 2,\n BROTLI_DEFAULT_MODE: 0,\n BROTLI_MIN_QUALITY: 0,\n BROTLI_MAX_QUALITY: 11,\n BROTLI_DEFAULT_QUALITY: 11,\n BROTLI_MIN_WINDOW_BITS: 10,\n BROTLI_MAX_WINDOW_BITS: 24,\n BROTLI_LARGE_MAX_WINDOW_BITS: 30,\n BROTLI_DEFAULT_WINDOW: 22,\n BROTLI_MIN_INPUT_BLOCK_BITS: 16,\n BROTLI_MAX_INPUT_BLOCK_BITS: 24,\n BROTLI_PARAM_MODE: 0,\n BROTLI_PARAM_QUALITY: 1,\n BROTLI_PARAM_LGWIN: 2,\n BROTLI_PARAM_LGBLOCK: 3,\n BROTLI_PARAM_DISABLE_LITERAL_CONTEXT_MODELING: 4,\n BROTLI_PARAM_SIZE_HINT: 5,\n BROTLI_PARAM_LARGE_WINDOW: 6,\n BROTLI_PARAM_NPOSTFIX: 7,\n BROTLI_PARAM_NDIRECT: 8,\n BROTLI_DECODER_RESULT_ERROR: 0,\n BROTLI_DECODER_RESULT_SUCCESS: 1,\n BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT: 2,\n BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT: 3,\n BROTLI_DECODER_PARAM_DISABLE_RING_BUFFER_REALLOCATION: 0,\n BROTLI_DECODER_PARAM_LARGE_WINDOW: 1,\n BROTLI_DECODER_NO_ERROR: 0,\n BROTLI_DECODER_SUCCESS: 1,\n BROTLI_DECODER_NEEDS_MORE_INPUT: 2,\n BROTLI_DECODER_NEEDS_MORE_OUTPUT: 3,\n BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_NIBBLE: -1,\n BROTLI_DECODER_ERROR_FORMAT_RESERVED: -2,\n BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_META_NIBBLE: -3,\n BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_ALPHABET: -4,\n BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_SAME: -5,\n BROTLI_DECODER_ERROR_FORMAT_CL_SPACE: -6,\n BROTLI_DECODER_ERROR_FORMAT_HUFFMAN_SPACE: -7,\n BROTLI_DECODER_ERROR_FORMAT_CONTEXT_MAP_REPEAT: -8,\n BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_1: -9,\n BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_2: -10,\n BROTLI_DECODER_ERROR_FORMAT_TRANSFORM: -11,\n BROTLI_DECODER_ERROR_FORMAT_DICTIONARY: -12,\n BROTLI_DECODER_ERROR_FORMAT_WINDOW_BITS: -13,\n BROTLI_DECODER_ERROR_FORMAT_PADDING_1: -14,\n BROTLI_DECODER_ERROR_FORMAT_PADDING_2: -15,\n BROTLI_DECODER_ERROR_FORMAT_DISTANCE: -16,\n BROTLI_DECODER_ERROR_DICTIONARY_NOT_SET: -19,\n BROTLI_DECODER_ERROR_INVALID_ARGUMENTS: -20,\n BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MODES: -21,\n BROTLI_DECODER_ERROR_ALLOC_TREE_GROUPS: -22,\n BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MAP: -25,\n BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_1: -26,\n BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_2: -27,\n BROTLI_DECODER_ERROR_ALLOC_BLOCK_TYPE_TREES: -30,\n BROTLI_DECODER_ERROR_UNREACHABLE: -31,\n },\n realZlibConstants,\n ),\n)\n", "export class Yallist<T = unknown> {\n tail?: Node<T>\n head?: Node<T>\n length: number = 0\n\n static create<T = unknown>(list: Iterable<T> = []) {\n return new Yallist(list)\n }\n\n constructor(list: Iterable<T> = []) {\n for (const item of list) {\n this.push(item)\n }\n }\n\n *[Symbol.iterator]() {\n for (let walker = this.head; walker; walker = walker.next) {\n yield walker.value\n }\n }\n\n removeNode(node: Node<T>) {\n if (node.list !== this) {\n throw new Error(\n 'removing node which does not belong to this list',\n )\n }\n\n const next = node.next\n const prev = node.prev\n\n if (next) {\n next.prev = prev\n }\n\n if (prev) {\n prev.next = next\n }\n\n if (node === this.head) {\n this.head = next\n }\n if (node === this.tail) {\n this.tail = prev\n }\n\n this.length--\n node.next = undefined\n node.prev = undefined\n node.list = undefined\n\n return next\n }\n\n unshiftNode(node: Node<T>) {\n if (node === this.head) {\n return\n }\n\n if (node.list) {\n node.list.removeNode(node)\n }\n\n const head = this.head\n node.list = this\n node.next = head\n if (head) {\n head.prev = node\n }\n\n this.head = node\n if (!this.tail) {\n this.tail = node\n }\n this.length++\n }\n\n pushNode(node: Node<T>) {\n if (node === this.tail) {\n return\n }\n\n if (node.list) {\n node.list.removeNode(node)\n }\n\n const tail = this.tail\n node.list = this\n node.prev = tail\n if (tail) {\n tail.next = node\n }\n\n this.tail = node\n if (!this.head) {\n this.head = node\n }\n this.length++\n }\n\n push(...args: T[]) {\n for (let i = 0, l = args.length; i < l; i++) {\n push(this, args[i])\n }\n return this.length\n }\n\n unshift(...args: T[]) {\n for (var i = 0, l = args.length; i < l; i++) {\n unshift(this, args[i])\n }\n return this.length\n }\n\n pop() {\n if (!this.tail) {\n return undefined\n }\n\n const res = this.tail.value\n const t = this.tail\n this.tail = this.tail.prev\n if (this.tail) {\n this.tail.next = undefined\n } else {\n this.head = undefined\n }\n t.list = undefined\n this.length--\n return res\n }\n\n shift() {\n if (!this.head) {\n return undefined\n }\n\n const res = this.head.value\n const h = this.head\n this.head = this.head.next\n if (this.head) {\n this.head.prev = undefined\n } else {\n this.tail = undefined\n }\n h.list = undefined\n this.length--\n return res\n }\n\n forEach(\n fn: (value: T, i: number, list: Yallist<T>) => any,\n thisp?: any,\n ) {\n thisp = thisp || this\n for (let walker = this.head, i = 0; !!walker; i++) {\n fn.call(thisp, walker.value, i, this)\n walker = walker.next\n }\n }\n\n forEachReverse(\n fn: (value: T, i: number, list: Yallist<T>) => any,\n thisp?: any,\n ) {\n thisp = thisp || this\n for (let walker = this.tail, i = this.length - 1; !!walker; i--) {\n fn.call(thisp, walker.value, i, this)\n walker = walker.prev\n }\n }\n\n get(n: number) {\n let i = 0\n let walker = this.head\n for (; !!walker && i < n; i++) {\n walker = walker.next\n }\n if (i === n && !!walker) {\n return walker.value\n }\n }\n\n getReverse(n: number) {\n let i = 0\n let walker = this.tail\n for (; !!walker && i < n; i++) {\n // abort out of the list early if we hit a cycle\n walker = walker.prev\n }\n if (i === n && !!walker) {\n return walker.value\n }\n }\n\n map<R = any>(\n fn: (value: T, list: Yallist<T>) => R,\n thisp?: any,\n ): Yallist<R> {\n thisp = thisp || this\n const res = new Yallist<R>()\n for (let walker = this.head; !!walker; ) {\n res.push(fn.call(thisp, walker.value, this))\n walker = walker.next\n }\n return res\n }\n\n mapReverse<R = any>(\n fn: (value: T, list: Yallist<T>) => R,\n thisp?: any,\n ): Yallist<R> {\n thisp = thisp || this\n var res = new Yallist<R>()\n for (let walker = this.tail; !!walker; ) {\n res.push(fn.call(thisp, walker.value, this))\n walker = walker.prev\n }\n return res\n }\n\n reduce(fn: (left: T, right: T, i: number) => T): T\n reduce<R = any>(\n fn: (acc: R, next: T, i: number) => R,\n initial: R,\n ): R\n reduce<R = any>(\n fn: (acc: R, next: T, i: number) => R,\n initial?: R,\n ): R {\n let acc: R | T\n let walker = this.head\n if (arguments.length > 1) {\n acc = initial as R\n } else if (this.head) {\n walker = this.head.next\n acc = this.head.value\n } else {\n throw new TypeError(\n 'Reduce of empty list with no initial value',\n )\n }\n\n for (var i = 0; !!walker; i++) {\n acc = fn(acc as R, walker.value, i)\n walker = walker.next\n }\n\n return acc as R\n }\n\n reduceReverse(fn: (left: T, right: T, i: number) => T): T\n reduceReverse<R = any>(\n fn: (acc: R, next: T, i: number) => R,\n initial: R,\n ): R\n reduceReverse<R = any>(\n fn: (acc: R, next: T, i: number) => R,\n initial?: R,\n ): R {\n let acc: R | T\n let walker = this.tail\n if (arguments.length > 1) {\n acc = initial as R\n } else if (this.tail) {\n walker = this.tail.prev\n acc = this.tail.value\n } else {\n throw new TypeError(\n 'Reduce of empty list with no initial value',\n )\n }\n\n for (let i = this.length - 1; !!walker; i--) {\n acc = fn(acc as R, walker.value, i)\n walker = walker.prev\n }\n\n return acc as R\n }\n\n toArray() {\n const arr = new Array(this.length)\n for (let i = 0, walker = this.head; !!walker; i++) {\n arr[i] = walker.value\n walker = walker.next\n }\n return arr\n }\n\n toArrayReverse() {\n const arr = new Array(this.length)\n for (let i = 0, walker = this.tail; !!walker; i++) {\n arr[i] = walker.value\n walker = walker.prev\n }\n return arr\n }\n\n slice(from: number = 0, to: number = this.length) {\n if (to < 0) {\n to += this.length\n }\n if (from < 0) {\n from += this.length\n }\n const ret = new Yallist()\n if (to < from || to < 0) {\n return ret\n }\n if (from < 0) {\n from = 0\n }\n if (to > this.length) {\n to = this.length\n }\n let walker = this.head\n let i = 0\n for (i = 0; !!walker && i < from; i++) {\n walker = walker.next\n }\n for (; !!walker && i < to; i++, walker = walker.next) {\n ret.push(walker.value)\n }\n return ret\n }\n\n sliceReverse(from: number = 0, to: number = this.length) {\n if (to < 0) {\n to += this.length\n }\n if (from < 0) {\n from += this.length\n }\n const ret = new Yallist()\n if (to < from || to < 0) {\n return ret\n }\n if (from < 0) {\n from = 0\n }\n if (to > this.length) {\n to = this.length\n }\n let i = this.length\n let walker = this.tail\n for (; !!walker && i > to; i--) {\n walker = walker.prev\n }\n for (; !!walker && i > from; i--, walker = walker.prev) {\n ret.push(walker.value)\n }\n return ret\n }\n\n splice(start: number, deleteCount: number = 0, ...nodes: T[]) {\n if (start > this.length) {\n start = this.length - 1\n }\n if (start < 0) {\n start = this.length + start\n }\n\n let walker = this.head\n\n for (let i = 0; !!walker && i < start; i++) {\n walker = walker.next\n }\n\n const ret: T[] = []\n for (let i = 0; !!walker && i < deleteCount; i++) {\n ret.push(walker.value)\n walker = this.removeNode(walker)\n }\n if (!walker) {\n walker = this.tail\n } else if (walker !== this.tail) {\n walker = walker.prev\n }\n\n for (const v of nodes) {\n walker = insertAfter<T>(this, walker, v)\n }\n\n return ret\n }\n\n reverse() {\n const head = this.head\n const tail = this.tail\n for (let walker = head; !!walker; walker = walker.prev) {\n const p = walker.prev\n walker.prev = walker.next\n walker.next = p\n }\n this.head = tail\n this.tail = head\n return this\n }\n}\n\n// insertAfter undefined means \"make the node the new head of list\"\nfunction insertAfter<T>(\n self: Yallist<T>,\n node: Node<T> | undefined,\n value: T,\n) {\n const prev = node\n const next = node ? node.next : self.head\n const inserted = new Node<T>(value, prev, next, self)\n\n if (inserted.next === undefined) {\n self.tail = inserted\n }\n if (inserted.prev === undefined) {\n self.head = inserted\n }\n\n self.length++\n\n return inserted\n}\n\nfunction push<T>(self: Yallist<T>, item: T) {\n self.tail = new Node<T>(item, self.tail, undefined, self)\n if (!self.head) {\n self.head = self.tail\n }\n self.length++\n}\n\nfunction unshift<T>(self: Yallist<T>, item: T) {\n self.head = new Node<T>(item, undefined, self.head, self)\n if (!self.tail) {\n self.tail = self.head\n }\n self.length++\n}\n\nexport class Node<T = unknown> {\n list?: Yallist<T>\n next?: Node<T>\n prev?: Node<T>\n value: T\n\n constructor(\n value: T,\n prev?: Node<T> | undefined,\n next?: Node<T> | undefined,\n list?: Yallist<T> | undefined,\n ) {\n this.list = list\n this.value = value\n\n if (prev) {\n prev.next = this\n this.prev = prev\n } else {\n this.prev = undefined\n }\n\n if (next) {\n next.prev = this\n this.next = next\n } else {\n this.next = undefined\n }\n }\n}\n", "// on windows, either \\ or / are valid directory separators.\n// on unix, \\ is a valid character in filenames.\n// so, on windows, and only on windows, we replace all \\ chars with /,\n// so that we can use / as our one and only directory separator char.\n\nconst platform =\n process.env.TESTING_TAR_FAKE_PLATFORM || process.platform\n\nexport const normalizeWindowsPath =\n platform !== 'win32' ?\n (p: string) => p\n : (p: string) => p && p.replace(/\\\\/g, '/')\n", "import { Minipass } from 'minipass'\nimport { Header } from './header.js'\nimport { normalizeWindowsPath } from './normalize-windows-path.js'\nimport { Pax } from './pax.js'\nimport { EntryTypeName } from './types.js'\n\nexport class ReadEntry extends Minipass<Buffer, Buffer> {\n extended?: Pax\n globalExtended?: Pax\n header: Header\n startBlockSize: number\n blockRemain: number\n remain: number\n type: EntryTypeName\n meta: boolean = false\n ignore: boolean = false\n path: string\n mode?: number\n uid?: number\n gid?: number\n uname?: string\n gname?: string\n size: number = 0\n mtime?: Date\n atime?: Date\n ctime?: Date\n linkpath?: string\n\n dev?: number\n ino?: number\n nlink?: number\n invalid: boolean = false\n absolute?: string\n unsupported: boolean = false\n\n constructor(header: Header, ex?: Pax, gex?: Pax) {\n super({})\n // read entries always start life paused. this is to avoid the\n // situation where Minipass's auto-ending empty streams results\n // in an entry ending before we're ready for it.\n this.pause()\n this.extended = ex\n this.globalExtended = gex\n this.header = header\n /* c8 ignore start */\n this.remain = header.size ?? 0\n /* c8 ignore stop */\n this.startBlockSize = 512 * Math.ceil(this.remain / 512)\n this.blockRemain = this.startBlockSize\n this.type = header.type\n switch (this.type) {\n case 'File':\n case 'OldFile':\n case 'Link':\n case 'SymbolicLink':\n case 'CharacterDevice':\n case 'BlockDevice':\n case 'Directory':\n case 'FIFO':\n case 'ContiguousFile':\n case 'GNUDumpDir':\n break\n\n case 'NextFileHasLongLinkpath':\n case 'NextFileHasLongPath':\n case 'OldGnuLongPath':\n case 'GlobalExtendedHeader':\n case 'ExtendedHeader':\n case 'OldExtendedHeader':\n this.meta = true\n break\n\n // NOTE: gnutar and bsdtar treat unrecognized types as 'File'\n // it may be worth doing the same, but with a warning.\n default:\n this.ignore = true\n }\n\n /* c8 ignore start */\n if (!header.path) {\n throw new Error('no path provided for tar.ReadEntry')\n }\n /* c8 ignore stop */\n\n this.path = normalizeWindowsPath(header.path) as string\n this.mode = header.mode\n if (this.mode) {\n this.mode = this.mode & 0o7777\n }\n this.uid = header.uid\n this.gid = header.gid\n this.uname = header.uname\n this.gname = header.gname\n this.size = this.remain\n this.mtime = header.mtime\n this.atime = header.atime\n this.ctime = header.ctime\n /* c8 ignore start */\n this.linkpath =\n header.linkpath ?\n normalizeWindowsPath(header.linkpath)\n : undefined\n /* c8 ignore stop */\n this.uname = header.uname\n this.gname = header.gname\n\n if (ex) {\n this.#slurp(ex)\n }\n if (gex) {\n this.#slurp(gex, true)\n }\n }\n\n write(data: Buffer) {\n const writeLen = data.length\n if (writeLen > this.blockRemain) {\n throw new Error('writing more to entry than is appropriate')\n }\n\n const r = this.remain\n const br = this.blockRemain\n this.remain = Math.max(0, r - writeLen)\n this.blockRemain = Math.max(0, br - writeLen)\n if (this.ignore) {\n return true\n }\n\n if (r >= writeLen) {\n return super.write(data)\n }\n\n // r < writeLen\n return super.write(data.subarray(0, r))\n }\n\n #slurp(ex: Pax, gex: boolean = false) {\n if (ex.path) ex.path = normalizeWindowsPath(ex.path)\n if (ex.linkpath) ex.linkpath = normalizeWindowsPath(ex.linkpath)\n Object.assign(\n this,\n Object.fromEntries(\n Object.entries(ex).filter(([k, v]) => {\n // we slurp in everything except for the path attribute in\n // a global extended header, because that's weird. Also, any\n // null/undefined values are ignored.\n return !(\n v === null ||\n v === undefined ||\n (k === 'path' && gex)\n )\n }),\n ),\n )\n }\n}\n", "import { type Minipass } from 'minipass'\n\n/** has a warn method */\nexport type Warner = {\n warn(code: string, message: string | Error, data: any): void\n file?: string\n cwd?: string\n strict?: boolean\n\n emit(\n event: 'warn',\n code: string,\n message: string,\n data?: WarnData,\n ): void\n emit(event: 'error', error: TarError): void\n}\n\nexport type WarnEvent<T = Buffer> = Minipass.Events<T> & {\n warn: [code: string, message: string, data: WarnData]\n}\n\nexport type WarnData = {\n file?: string\n cwd?: string\n code?: string\n tarCode?: string\n recoverable?: boolean\n [k: string]: any\n}\n\nexport type TarError = Error & WarnData\n\nexport const warnMethod = (\n self: Warner,\n code: string,\n message: string | Error,\n data: WarnData = {},\n) => {\n if (self.file) {\n data.file = self.file\n }\n if (self.cwd) {\n data.cwd = self.cwd\n }\n data.code =\n (message instanceof Error &&\n (message as NodeJS.ErrnoException).code) ||\n code\n data.tarCode = code\n if (!self.strict && data.recoverable !== false) {\n if (message instanceof Error) {\n data = Object.assign(message, data)\n message = message.message\n }\n self.emit('warn', code, message, data)\n } else if (message instanceof Error) {\n self.emit('error', Object.assign(message, data))\n } else {\n self.emit(\n 'error',\n Object.assign(new Error(`${code}: ${message}`), data),\n )\n }\n}\n", "// warning: extremely hot code path.\n// This has been meticulously optimized for use\n// within npm install on large package trees.\n// Do not edit without careful benchmarking.\nexport const stripTrailingSlashes = (str: string) => {\n let i = str.length - 1\n let slashesStart = -1\n while (i > -1 && str.charAt(i) === '/') {\n slashesStart = i\n i--\n }\n return slashesStart === -1 ? str : str.slice(0, slashesStart)\n}\n", "// A readable tar stream creator\n// Technically, this is a transform stream that you write paths into,\n// and tar format comes out of.\n// The `add()` method is like `write()` but returns this,\n// and end() return `this` as well, so you can\n// do `new Pack(opt).add('files').add('dir').end().pipe(output)\n// You could also do something like:\n// streamOfPaths().pipe(new Pack()).pipe(new fs.WriteStream('out.tar'))\n\nimport fs, { type Stats } from 'fs'\nimport {\n WriteEntry,\n WriteEntrySync,\n WriteEntryTar,\n} from './write-entry.js'\n\nexport class PackJob {\n path: string\n absolute: string\n entry?: WriteEntry | WriteEntryTar\n stat?: Stats\n readdir?: string[]\n pending: boolean = false\n ignore: boolean = false\n piped: boolean = false\n constructor(path: string, absolute: string) {\n this.path = path || './'\n this.absolute = absolute\n }\n}\n\nimport { Minipass } from 'minipass'\nimport * as zlib from 'minizlib'\nimport { Yallist } from 'yallist'\nimport { ReadEntry } from './read-entry.js'\nimport {\n WarnEvent,\n warnMethod,\n type WarnData,\n type Warner,\n} from './warn-method.js'\n\nconst EOF = Buffer.alloc(1024)\nconst ONSTAT = Symbol('onStat')\nconst ENDED = Symbol('ended')\nconst QUEUE = Symbol('queue')\nconst CURRENT = Symbol('current')\nconst PROCESS = Symbol('process')\nconst PROCESSING = Symbol('processing')\nconst PROCESSJOB = Symbol('processJob')\nconst JOBS = Symbol('jobs')\nconst JOBDONE = Symbol('jobDone')\nconst ADDFSENTRY = Symbol('addFSEntry')\nconst ADDTARENTRY = Symbol('addTarEntry')\nconst STAT = Symbol('stat')\nconst READDIR = Symbol('readdir')\nconst ONREADDIR = Symbol('onreaddir')\nconst PIPE = Symbol('pipe')\nconst ENTRY = Symbol('entry')\nconst ENTRYOPT = Symbol('entryOpt')\nconst WRITEENTRYCLASS = Symbol('writeEntryClass')\nconst WRITE = Symbol('write')\nconst ONDRAIN = Symbol('ondrain')\n\nimport path from 'path'\nimport { normalizeWindowsPath } from './normalize-windows-path.js'\nimport { TarOptions } from './options.js'\n\nexport class Pack\n extends Minipass<Buffer, ReadEntry | string, WarnEvent<Buffer>>\n implements Warner\n{\n opt: TarOptions\n cwd: string\n maxReadSize?: number\n preservePaths: boolean\n strict: boolean\n noPax: boolean\n prefix: string\n linkCache: Exclude<TarOptions['linkCache'], undefined>\n statCache: Exclude<TarOptions['statCache'], undefined>\n file: string\n portable: boolean\n zip?: zlib.BrotliCompress | zlib.Gzip\n readdirCache: Exclude<TarOptions['readdirCache'], undefined>\n noDirRecurse: boolean\n follow: boolean\n noMtime: boolean\n mtime?: Date\n filter: Exclude<TarOptions['filter'], undefined>\n jobs: number;\n\n [WRITEENTRYCLASS]: typeof WriteEntry | typeof WriteEntrySync\n onWriteEntry?: (entry: WriteEntry) => void;\n [QUEUE]: Yallist<PackJob>;\n [JOBS]: number = 0;\n [PROCESSING]: boolean = false;\n [ENDED]: boolean = false\n\n constructor(opt: TarOptions = {}) {\n //@ts-ignore\n super()\n this.opt = opt\n this.file = opt.file || ''\n this.cwd = opt.cwd || process.cwd()\n this.maxReadSize = opt.maxReadSize\n this.preservePaths = !!opt.preservePaths\n this.strict = !!opt.strict\n this.noPax = !!opt.noPax\n this.prefix = normalizeWindowsPath(opt.prefix || '')\n this.linkCache = opt.linkCache || new Map()\n this.statCache = opt.statCache || new Map()\n this.readdirCache = opt.readdirCache || new Map()\n this.onWriteEntry = opt.onWriteEntry\n\n this[WRITEENTRYCLASS] = WriteEntry\n if (typeof opt.onwarn === 'function') {\n this.on('warn', opt.onwarn)\n }\n\n this.portable = !!opt.portable\n\n if (opt.gzip || opt.brotli) {\n if (opt.gzip && opt.brotli) {\n throw new TypeError('gzip and brotli are mutually exclusive')\n }\n if (opt.gzip) {\n if (typeof opt.gzip !== 'object') {\n opt.gzip = {}\n }\n if (this.portable) {\n opt.gzip.portable = true\n }\n this.zip = new zlib.Gzip(opt.gzip)\n }\n if (opt.brotli) {\n if (typeof opt.brotli !== 'object') {\n opt.brotli = {}\n }\n this.zip = new zlib.BrotliCompress(opt.brotli)\n }\n /* c8 ignore next */\n if (!this.zip) throw new Error('impossible')\n const zip = this.zip\n zip.on('data', chunk => super.write(chunk as unknown as string))\n zip.on('end', () => super.end())\n zip.on('drain', () => this[ONDRAIN]())\n this.on('resume', () => zip.resume())\n } else {\n this.on('drain', this[ONDRAIN])\n }\n\n this.noDirRecurse = !!opt.noDirRecurse\n this.follow = !!opt.follow\n this.noMtime = !!opt.noMtime\n if (opt.mtime) this.mtime = opt.mtime\n\n this.filter =\n typeof opt.filter === 'function' ? opt.filter : () => true\n\n this[QUEUE] = new Yallist<PackJob>()\n this[JOBS] = 0\n this.jobs = Number(opt.jobs) || 4\n this[PROCESSING] = false\n this[ENDED] = false\n }\n\n [WRITE](chunk: Buffer) {\n return super.write(chunk as unknown as string)\n }\n\n add(path: string | ReadEntry) {\n this.write(path)\n return this\n }\n\n end(cb?: () => void): this\n end(path: string | ReadEntry, cb?: () => void): this\n end(\n path: string | ReadEntry,\n encoding?: Minipass.Encoding,\n cb?: () => void,\n ): this\n end(\n path?: string | ReadEntry | (() => void),\n encoding?: Minipass.Encoding | (() => void),\n cb?: () => void,\n ) {\n /* c8 ignore start */\n if (typeof path === 'function') {\n cb = path\n path = undefined\n }\n if (typeof encoding === 'function') {\n cb = encoding\n encoding = undefined\n }\n /* c8 ignore stop */\n if (path) {\n this.add(path)\n }\n this[ENDED] = true\n this[PROCESS]()\n /* c8 ignore next */\n if (cb) cb()\n return this\n }\n\n write(path: string | ReadEntry) {\n if (this[ENDED]) {\n throw new Error('write after end')\n }\n\n if (path instanceof ReadEntry) {\n this[ADDTARENTRY](path)\n } else {\n this[ADDFSENTRY](path)\n }\n return this.flowing\n }\n\n [ADDTARENTRY](p: ReadEntry) {\n const absolute = normalizeWindowsPath(\n path.resolve(this.cwd, p.path),\n )\n // in this case, we don't have to wait for the stat\n if (!this.filter(p.path, p)) {\n p.resume()\n } else {\n const job = new PackJob(p.path, absolute)\n job.entry = new WriteEntryTar(p, this[ENTRYOPT](job))\n job.entry.on('end', () => this[JOBDONE](job))\n this[JOBS] += 1\n this[QUEUE].push(job)\n }\n\n this[PROCESS]()\n }\n\n [ADDFSENTRY](p: string) {\n const absolute = normalizeWindowsPath(path.resolve(this.cwd, p))\n this[QUEUE].push(new PackJob(p, absolute))\n this[PROCESS]()\n }\n\n [STAT](job: PackJob) {\n job.pending = true\n this[JOBS] += 1\n const stat = this.follow ? 'stat' : 'lstat'\n fs[stat](job.absolute, (er, stat) => {\n job.pending = false\n this[JOBS] -= 1\n if (er) {\n this.emit('error', er)\n } else {\n this[ONSTAT](job, stat)\n }\n })\n }\n\n [ONSTAT](job: PackJob, stat: Stats) {\n this.statCache.set(job.absolute, stat)\n job.stat = stat\n\n // now we have the stat, we can filter it.\n if (!this.filter(job.path, stat)) {\n job.ignore = true\n }\n\n this[PROCESS]()\n }\n\n [READDIR](job: PackJob) {\n job.pending = true\n this[JOBS] += 1\n fs.readdir(job.absolute, (er, entries) => {\n job.pending = false\n this[JOBS] -= 1\n if (er) {\n return this.emit('error', er)\n }\n this[ONREADDIR](job, entries)\n })\n }\n\n [ONREADDIR](job: PackJob, entries: string[]) {\n this.readdirCache.set(job.absolute, entries)\n job.readdir = entries\n this[PROCESS]()\n }\n\n [PROCESS]() {\n if (this[PROCESSING]) {\n return\n }\n\n this[PROCESSING] = true\n for (\n let w = this[QUEUE].head;\n !!w && this[JOBS] < this.jobs;\n w = w.next\n ) {\n this[PROCESSJOB](w.value)\n if (w.value.ignore) {\n const p = w.next\n this[QUEUE].removeNode(w)\n w.next = p\n }\n }\n\n this[PROCESSING] = false\n\n if (this[ENDED] && !this[QUEUE].length && this[JOBS] === 0) {\n if (this.zip) {\n this.zip.end(EOF)\n } else {\n super.write(EOF as unknown as string)\n super.end()\n }\n }\n }\n\n get [CURRENT]() {\n return this[QUEUE] && this[QUEUE].head && this[QUEUE].head.value\n }\n\n [JOBDONE](_job: PackJob) {\n this[QUEUE].shift()\n this[JOBS] -= 1\n this[PROCESS]()\n }\n\n [PROCESSJOB](job: PackJob) {\n if (job.pending) {\n return\n }\n\n if (job.entry) {\n if (job === this[CURRENT] && !job.piped) {\n this[PIPE](job)\n }\n return\n }\n\n if (!job.stat) {\n const sc = this.statCache.get(job.absolute)\n if (sc) {\n this[ONSTAT](job, sc)\n } else {\n this[STAT](job)\n }\n }\n if (!job.stat) {\n return\n }\n\n // filtered out!\n if (job.ignore) {\n return\n }\n\n if (\n !this.noDirRecurse &&\n job.stat.isDirectory() &&\n !job.readdir\n ) {\n const rc = this.readdirCache.get(job.absolute)\n if (rc) {\n this[ONREADDIR](job, rc)\n } else {\n this[READDIR](job)\n }\n if (!job.readdir) {\n return\n }\n }\n\n // we know it doesn't have an entry, because that got checked above\n job.entry = this[ENTRY](job)\n if (!job.entry) {\n job.ignore = true\n return\n }\n\n if (job === this[CURRENT] && !job.piped) {\n this[PIPE](job)\n }\n }\n\n [ENTRYOPT](job: PackJob): TarOptions {\n return {\n onwarn: (code, msg, data) => this.warn(code, msg, data),\n noPax: this.noPax,\n cwd: this.cwd,\n absolute: job.absolute,\n preservePaths: this.preservePaths,\n maxReadSize: this.maxReadSize,\n strict: this.strict,\n portable: this.portable,\n linkCache: this.linkCache,\n statCache: this.statCache,\n noMtime: this.noMtime,\n mtime: this.mtime,\n prefix: this.prefix,\n onWriteEntry: this.onWriteEntry,\n }\n }\n\n [ENTRY](job: PackJob) {\n this[JOBS] += 1\n try {\n const e = new this[WRITEENTRYCLASS](\n job.path,\n this[ENTRYOPT](job),\n )\n return e\n .on('end', () => this[JOBDONE](job))\n .on('error', er => this.emit('error', er))\n } catch (er) {\n this.emit('error', er)\n }\n }\n\n [ONDRAIN]() {\n if (this[CURRENT] && this[CURRENT].entry) {\n this[CURRENT].entry.resume()\n }\n }\n\n // like .pipe() but using super, because our write() is special\n [PIPE](job: PackJob) {\n job.piped = true\n\n if (job.readdir) {\n job.readdir.forEach(entry => {\n const p = job.path\n const base = p === './' ? '' : p.replace(/\\/*$/, '/')\n this[ADDFSENTRY](base + entry)\n })\n }\n\n const source = job.entry\n const zip = this.zip\n /* c8 ignore start */\n if (!source) throw new Error('cannot pipe without source')\n /* c8 ignore stop */\n\n if (zip) {\n source.on('data', chunk => {\n if (!zip.write(chunk)) {\n source.pause()\n }\n })\n } else {\n source.on('data', chunk => {\n if (!super.write(chunk as unknown as string)) {\n source.pause()\n }\n })\n }\n }\n\n pause() {\n if (this.zip) {\n this.zip.pause()\n }\n return super.pause()\n }\n warn(\n code: string,\n message: string | Error,\n data: WarnData = {},\n ): void {\n warnMethod(this, code, message, data)\n }\n}\n\nexport class PackSync extends Pack {\n sync: true = true\n constructor(opt: TarOptions) {\n super(opt)\n this[WRITEENTRYCLASS] = WriteEntrySync\n }\n\n // pause/resume are no-ops in sync streams.\n pause() {}\n resume() {}\n\n [STAT](job: PackJob) {\n const stat = this.follow ? 'statSync' : 'lstatSync'\n this[ONSTAT](job, fs[stat](job.absolute))\n }\n\n [READDIR](job: PackJob) {\n this[ONREADDIR](job, fs.readdirSync(job.absolute))\n }\n\n // gotta get it all in this tick\n [PIPE](job: PackJob) {\n const source = job.entry\n const zip = this.zip\n\n if (job.readdir) {\n job.readdir.forEach(entry => {\n const p = job.path\n const base = p === './' ? '' : p.replace(/\\/*$/, '/')\n this[ADDFSENTRY](base + entry)\n })\n }\n\n /* c8 ignore start */\n if (!source) throw new Error('Cannot pipe without source')\n /* c8 ignore stop */\n\n if (zip) {\n source.on('data', chunk => {\n zip.write(chunk)\n })\n } else {\n source.on('data', chunk => {\n super[WRITE](chunk)\n })\n }\n }\n}\n", "import fs, { type Stats } from 'fs'\nimport { Minipass } from 'minipass'\nimport path from 'path'\nimport { Header } from './header.js'\nimport { modeFix } from './mode-fix.js'\nimport { normalizeWindowsPath } from './normalize-windows-path.js'\nimport {\n dealias,\n LinkCacheKey,\n TarOptions,\n TarOptionsWithAliases,\n} from './options.js'\nimport { Pax } from './pax.js'\nimport { ReadEntry } from './read-entry.js'\nimport { stripAbsolutePath } from './strip-absolute-path.js'\nimport { stripTrailingSlashes } from './strip-trailing-slashes.js'\nimport { EntryTypeName } from './types.js'\nimport {\n WarnData,\n Warner,\n WarnEvent,\n warnMethod,\n} from './warn-method.js'\nimport * as winchars from './winchars.js'\n\nconst prefixPath = (path: string, prefix?: string) => {\n if (!prefix) {\n return normalizeWindowsPath(path)\n }\n path = normalizeWindowsPath(path).replace(/^\\.(\\/|$)/, '')\n return stripTrailingSlashes(prefix) + '/' + path\n}\n\nconst maxReadSize = 16 * 1024 * 1024\n\nconst PROCESS = Symbol('process')\nconst FILE = Symbol('file')\nconst DIRECTORY = Symbol('directory')\nconst SYMLINK = Symbol('symlink')\nconst HARDLINK = Symbol('hardlink')\nconst HEADER = Symbol('header')\nconst READ = Symbol('read')\nconst LSTAT = Symbol('lstat')\nconst ONLSTAT = Symbol('onlstat')\nconst ONREAD = Symbol('onread')\nconst ONREADLINK = Symbol('onreadlink')\nconst OPENFILE = Symbol('openfile')\nconst ONOPENFILE = Symbol('onopenfile')\nconst CLOSE = Symbol('close')\nconst MODE = Symbol('mode')\nconst AWAITDRAIN = Symbol('awaitDrain')\nconst ONDRAIN = Symbol('ondrain')\nconst PREFIX = Symbol('prefix')\n\nexport class WriteEntry\n extends Minipass<Buffer, Minipass.ContiguousData, WarnEvent>\n implements Warner\n{\n path: string\n portable: boolean\n myuid: number = (process.getuid && process.getuid()) || 0\n // until node has builtin pwnam functions, this'll have to do\n myuser: string = process.env.USER || ''\n maxReadSize: number\n linkCache: Exclude<TarOptions['linkCache'], undefined>\n statCache: Exclude<TarOptions['statCache'], undefined>\n preservePaths: boolean\n cwd: string\n strict: boolean\n mtime?: Date\n noPax: boolean\n noMtime: boolean\n prefix?: string\n fd?: number\n\n blockLen: number = 0\n blockRemain: number = 0\n buf?: Buffer\n pos: number = 0\n remain: number = 0\n length: number = 0\n offset: number = 0\n\n win32: boolean\n absolute: string\n\n header?: Header\n type?: EntryTypeName | 'Unsupported'\n linkpath?: string\n stat?: Stats\n onWriteEntry?: (entry: WriteEntry) => any\n\n #hadError: boolean = false\n\n constructor(p: string, opt_: TarOptionsWithAliases = {}) {\n const opt = dealias(opt_)\n super()\n this.path = normalizeWindowsPath(p)\n // suppress atime, ctime, uid, gid, uname, gname\n this.portable = !!opt.portable\n this.maxReadSize = opt.maxReadSize || maxReadSize\n this.linkCache = opt.linkCache || new Map()\n this.statCache = opt.statCache || new Map()\n this.preservePaths = !!opt.preservePaths\n this.cwd = normalizeWindowsPath(opt.cwd || process.cwd())\n this.strict = !!opt.strict\n this.noPax = !!opt.noPax\n this.noMtime = !!opt.noMtime\n this.mtime = opt.mtime\n this.prefix =\n opt.prefix ? normalizeWindowsPath(opt.prefix) : undefined\n this.onWriteEntry = opt.onWriteEntry\n\n if (typeof opt.onwarn === 'function') {\n this.on('warn', opt.onwarn)\n }\n\n let pathWarn: string | boolean = false\n if (!this.preservePaths) {\n const [root, stripped] = stripAbsolutePath(this.path)\n if (root && typeof stripped === 'string') {\n this.path = stripped\n pathWarn = root\n }\n }\n\n this.win32 = !!opt.win32 || process.platform === 'win32'\n if (this.win32) {\n // force the \\ to / normalization, since we might not *actually*\n // be on windows, but want \\ to be considered a path separator.\n this.path = winchars.decode(this.path.replace(/\\\\/g, '/'))\n p = p.replace(/\\\\/g, '/')\n }\n\n this.absolute = normalizeWindowsPath(\n opt.absolute || path.resolve(this.cwd, p),\n )\n\n if (this.path === '') {\n this.path = './'\n }\n\n if (pathWarn) {\n this.warn(\n 'TAR_ENTRY_INFO',\n `stripping ${pathWarn} from absolute path`,\n {\n entry: this,\n path: pathWarn + this.path,\n },\n )\n }\n\n const cs = this.statCache.get(this.absolute)\n if (cs) {\n this[ONLSTAT](cs)\n } else {\n this[LSTAT]()\n }\n }\n\n warn(code: string, message: string | Error, data: WarnData = {}) {\n return warnMethod(this, code, message, data)\n }\n\n emit(ev: keyof WarnEvent, ...data: any[]) {\n if (ev === 'error') {\n this.#hadError = true\n }\n return super.emit(ev, ...data)\n }\n\n [LSTAT]() {\n fs.lstat(this.absolute, (er, stat) => {\n if (er) {\n return this.emit('error', er)\n }\n this[ONLSTAT](stat)\n })\n }\n\n [ONLSTAT](stat: Stats) {\n this.statCache.set(this.absolute, stat)\n this.stat = stat\n if (!stat.isFile()) {\n stat.size = 0\n }\n this.type = getType(stat)\n this.emit('stat', stat)\n this[PROCESS]()\n }\n\n [PROCESS]() {\n switch (this.type) {\n case 'File':\n return this[FILE]()\n case 'Directory':\n return this[DIRECTORY]()\n case 'SymbolicLink':\n return this[SYMLINK]()\n // unsupported types are ignored.\n default:\n return this.end()\n }\n }\n\n [MODE](mode: number) {\n return modeFix(mode, this.type === 'Directory', this.portable)\n }\n\n [PREFIX](path: string) {\n return prefixPath(path, this.prefix)\n }\n\n [HEADER]() {\n /* c8 ignore start */\n if (!this.stat) {\n throw new Error('cannot write header before stat')\n }\n /* c8 ignore stop */\n\n if (this.type === 'Directory' && this.portable) {\n this.noMtime = true\n }\n\n this.onWriteEntry?.(this)\n this.header = new Header({\n path: this[PREFIX](this.path),\n // only apply the prefix to hard links.\n linkpath:\n this.type === 'Link' && this.linkpath !== undefined ?\n this[PREFIX](this.linkpath)\n : this.linkpath,\n // only the permissions and setuid/setgid/sticky bitflags\n // not the higher-order bits that specify file type\n mode: this[MODE](this.stat.mode),\n uid: this.portable ? undefined : this.stat.uid,\n gid: this.portable ? undefined : this.stat.gid,\n size: this.stat.size,\n mtime: this.noMtime ? undefined : this.mtime || this.stat.mtime,\n /* c8 ignore next */\n type: this.type === 'Unsupported' ? undefined : this.type,\n uname:\n this.portable ? undefined\n : this.stat.uid === this.myuid ? this.myuser\n : '',\n atime: this.portable ? undefined : this.stat.atime,\n ctime: this.portable ? undefined : this.stat.ctime,\n })\n\n if (this.header.encode() && !this.noPax) {\n super.write(\n new Pax({\n atime: this.portable ? undefined : this.header.atime,\n ctime: this.portable ? undefined : this.header.ctime,\n gid: this.portable ? undefined : this.header.gid,\n mtime:\n this.noMtime ? undefined : (\n this.mtime || this.header.mtime\n ),\n path: this[PREFIX](this.path),\n linkpath:\n this.type === 'Link' && this.linkpath !== undefined ?\n this[PREFIX](this.linkpath)\n : this.linkpath,\n size: this.header.size,\n uid: this.portable ? undefined : this.header.uid,\n uname: this.portable ? undefined : this.header.uname,\n dev: this.portable ? undefined : this.stat.dev,\n ino: this.portable ? undefined : this.stat.ino,\n nlink: this.portable ? undefined : this.stat.nlink,\n }).encode(),\n )\n }\n const block = this.header?.block\n /* c8 ignore start */\n if (!block) {\n throw new Error('failed to encode header')\n }\n /* c8 ignore stop */\n super.write(block)\n }\n\n [DIRECTORY]() {\n /* c8 ignore start */\n if (!this.stat) {\n throw new Error('cannot create directory entry without stat')\n }\n /* c8 ignore stop */\n if (this.path.slice(-1) !== '/') {\n this.path += '/'\n }\n this.stat.size = 0\n this[HEADER]()\n this.end()\n }\n\n [SYMLINK]() {\n fs.readlink(this.absolute, (er, linkpath) => {\n if (er) {\n return this.emit('error', er)\n }\n this[ONREADLINK](linkpath)\n })\n }\n\n [ONREADLINK](linkpath: string) {\n this.linkpath = normalizeWindowsPath(linkpath)\n this[HEADER]()\n this.end()\n }\n\n [HARDLINK](linkpath: string) {\n /* c8 ignore start */\n if (!this.stat) {\n throw new Error('cannot create link entry without stat')\n }\n /* c8 ignore stop */\n this.type = 'Link'\n this.linkpath = normalizeWindowsPath(\n path.relative(this.cwd, linkpath),\n )\n this.stat.size = 0\n this[HEADER]()\n this.end()\n }\n\n [FILE]() {\n /* c8 ignore start */\n if (!this.stat) {\n throw new Error('cannot create file entry without stat')\n }\n /* c8 ignore stop */\n if (this.stat.nlink > 1) {\n const linkKey =\n `${this.stat.dev}:${this.stat.ino}` as LinkCacheKey\n const linkpath = this.linkCache.get(linkKey)\n if (linkpath?.indexOf(this.cwd) === 0) {\n return this[HARDLINK](linkpath)\n }\n this.linkCache.set(linkKey, this.absolute)\n }\n\n this[HEADER]()\n if (this.stat.size === 0) {\n return this.end()\n }\n\n this[OPENFILE]()\n }\n\n [OPENFILE]() {\n fs.open(this.absolute, 'r', (er, fd) => {\n if (er) {\n return this.emit('error', er)\n }\n this[ONOPENFILE](fd)\n })\n }\n\n [ONOPENFILE](fd: number) {\n this.fd = fd\n if (this.#hadError) {\n return this[CLOSE]()\n }\n /* c8 ignore start */\n if (!this.stat) {\n throw new Error('should stat before calling onopenfile')\n }\n /* c8 ignore start */\n\n this.blockLen = 512 * Math.ceil(this.stat.size / 512)\n this.blockRemain = this.blockLen\n const bufLen = Math.min(this.blockLen, this.maxReadSize)\n this.buf = Buffer.allocUnsafe(bufLen)\n this.offset = 0\n this.pos = 0\n this.remain = this.stat.size\n this.length = this.buf.length\n this[READ]()\n }\n\n [READ]() {\n const { fd, buf, offset, length, pos } = this\n if (fd === undefined || buf === undefined) {\n throw new Error('cannot read file without first opening')\n }\n fs.read(fd, buf, offset, length, pos, (er, bytesRead) => {\n if (er) {\n // ignoring the error from close(2) is a bad practice, but at\n // this point we already have an error, don't need another one\n return this[CLOSE](() => this.emit('error', er))\n }\n this[ONREAD](bytesRead)\n })\n }\n\n /* c8 ignore start */\n [CLOSE](\n cb: (er?: null | Error | NodeJS.ErrnoException) => any = () => {},\n ) {\n /* c8 ignore stop */\n if (this.fd !== undefined) fs.close(this.fd, cb)\n }\n\n [ONREAD](bytesRead: number) {\n if (bytesRead <= 0 && this.remain > 0) {\n const er = Object.assign(\n new Error('encountered unexpected EOF'),\n {\n path: this.absolute,\n syscall: 'read',\n code: 'EOF',\n },\n )\n return this[CLOSE](() => this.emit('error', er))\n }\n\n if (bytesRead > this.remain) {\n const er = Object.assign(\n new Error('did not encounter expected EOF'),\n {\n path: this.absolute,\n syscall: 'read',\n code: 'EOF',\n },\n )\n return this[CLOSE](() => this.emit('error', er))\n }\n\n /* c8 ignore start */\n if (!this.buf) {\n throw new Error('should have created buffer prior to reading')\n }\n /* c8 ignore stop */\n\n // null out the rest of the buffer, if we could fit the block padding\n // at the end of this loop, we've incremented bytesRead and this.remain\n // to be incremented up to the blockRemain level, as if we had expected\n // to get a null-padded file, and read it until the end. then we will\n // decrement both remain and blockRemain by bytesRead, and know that we\n // reached the expected EOF, without any null buffer to append.\n if (bytesRead === this.remain) {\n for (\n let i = bytesRead;\n i < this.length && bytesRead < this.blockRemain;\n i++\n ) {\n this.buf[i + this.offset] = 0\n bytesRead++\n this.remain++\n }\n }\n\n const chunk =\n this.offset === 0 && bytesRead === this.buf.length ?\n this.buf\n : this.buf.subarray(this.offset, this.offset + bytesRead)\n\n const flushed = this.write(chunk)\n if (!flushed) {\n this[AWAITDRAIN](() => this[ONDRAIN]())\n } else {\n this[ONDRAIN]()\n }\n }\n\n [AWAITDRAIN](cb: () => any) {\n this.once('drain', cb)\n }\n\n write(buffer: Buffer | string, cb?: () => void): boolean\n write(\n str: Buffer | string,\n encoding?: BufferEncoding | null,\n cb?: () => void,\n ): boolean\n write(\n chunk: Buffer | string,\n encoding?: BufferEncoding | (() => any) | null,\n cb?: () => any,\n ): boolean {\n /* c8 ignore start - just junk to comply with NodeJS.WritableStream */\n if (typeof encoding === 'function') {\n cb = encoding\n encoding = undefined\n }\n if (typeof chunk === 'string') {\n chunk = Buffer.from(\n chunk,\n typeof encoding === 'string' ? encoding : 'utf8',\n )\n }\n /* c8 ignore stop */\n\n if (this.blockRemain < chunk.length) {\n const er = Object.assign(\n new Error('writing more data than expected'),\n {\n path: this.absolute,\n },\n )\n return this.emit('error', er)\n }\n this.remain -= chunk.length\n this.blockRemain -= chunk.length\n this.pos += chunk.length\n this.offset += chunk.length\n return super.write(chunk, null, cb)\n }\n\n [ONDRAIN]() {\n if (!this.remain) {\n if (this.blockRemain) {\n super.write(Buffer.alloc(this.blockRemain))\n }\n return this[CLOSE](er =>\n er ? this.emit('error', er) : this.end(),\n )\n }\n\n /* c8 ignore start */\n if (!this.buf) {\n throw new Error('buffer lost somehow in ONDRAIN')\n }\n /* c8 ignore stop */\n\n if (this.offset >= this.length) {\n // if we only have a smaller bit left to read, alloc a smaller buffer\n // otherwise, keep it the same length it was before.\n this.buf = Buffer.allocUnsafe(\n Math.min(this.blockRemain, this.buf.length),\n )\n this.offset = 0\n }\n this.length = this.buf.length - this.offset\n this[READ]()\n }\n}\n\nexport class WriteEntrySync extends WriteEntry implements Warner {\n sync: true = true;\n\n [LSTAT]() {\n this[ONLSTAT](fs.lstatSync(this.absolute))\n }\n\n [SYMLINK]() {\n this[ONREADLINK](fs.readlinkSync(this.absolute))\n }\n\n [OPENFILE]() {\n this[ONOPENFILE](fs.openSync(this.absolute, 'r'))\n }\n\n [READ]() {\n let threw = true\n try {\n const { fd, buf, offset, length, pos } = this\n /* c8 ignore start */\n if (fd === undefined || buf === undefined) {\n throw new Error('fd and buf must be set in READ method')\n }\n /* c8 ignore stop */\n const bytesRead = fs.readSync(fd, buf, offset, length, pos)\n this[ONREAD](bytesRead)\n threw = false\n } finally {\n // ignoring the error from close(2) is a bad practice, but at\n // this point we already have an error, don't need another one\n if (threw) {\n try {\n this[CLOSE](() => {})\n } catch (er) {}\n }\n }\n }\n\n [AWAITDRAIN](cb: () => any) {\n cb()\n }\n\n /* c8 ignore start */\n [CLOSE](\n cb: (er?: null | Error | NodeJS.ErrnoException) => any = () => {},\n ) {\n /* c8 ignore stop */\n if (this.fd !== undefined) fs.closeSync(this.fd)\n cb()\n }\n}\n\nexport class WriteEntryTar\n extends Minipass<Buffer, Buffer | string, WarnEvent>\n implements Warner\n{\n blockLen: number = 0\n blockRemain: number = 0\n buf: number = 0\n pos: number = 0\n remain: number = 0\n length: number = 0\n preservePaths: boolean\n portable: boolean\n strict: boolean\n noPax: boolean\n noMtime: boolean\n readEntry: ReadEntry\n type: EntryTypeName\n prefix?: string\n path: string\n mode?: number\n uid?: number\n gid?: number\n uname?: string\n gname?: string\n header?: Header\n mtime?: Date\n atime?: Date\n ctime?: Date\n linkpath?: string\n size: number\n onWriteEntry?: (entry: WriteEntry) => any\n\n warn(code: string, message: string | Error, data: WarnData = {}) {\n return warnMethod(this, code, message, data)\n }\n\n constructor(\n readEntry: ReadEntry,\n opt_: TarOptionsWithAliases = {},\n ) {\n const opt = dealias(opt_)\n super()\n this.preservePaths = !!opt.preservePaths\n this.portable = !!opt.portable\n this.strict = !!opt.strict\n this.noPax = !!opt.noPax\n this.noMtime = !!opt.noMtime\n this.onWriteEntry = opt.onWriteEntry\n\n this.readEntry = readEntry\n const { type } = readEntry\n /* c8 ignore start */\n if (type === 'Unsupported') {\n throw new Error('writing entry that should be ignored')\n }\n /* c8 ignore stop */\n this.type = type\n if (this.type === 'Directory' && this.portable) {\n this.noMtime = true\n }\n\n this.prefix = opt.prefix\n\n this.path = normalizeWindowsPath(readEntry.path)\n this.mode =\n readEntry.mode !== undefined ?\n this[MODE](readEntry.mode)\n : undefined\n this.uid = this.portable ? undefined : readEntry.uid\n this.gid = this.portable ? undefined : readEntry.gid\n this.uname = this.portable ? undefined : readEntry.uname\n this.gname = this.portable ? undefined : readEntry.gname\n this.size = readEntry.size\n this.mtime =\n this.noMtime ? undefined : opt.mtime || readEntry.mtime\n this.atime = this.portable ? undefined : readEntry.atime\n this.ctime = this.portable ? undefined : readEntry.ctime\n this.linkpath =\n readEntry.linkpath !== undefined ?\n normalizeWindowsPath(readEntry.linkpath)\n : undefined\n\n if (typeof opt.onwarn === 'function') {\n this.on('warn', opt.onwarn)\n }\n\n let pathWarn: false | string = false\n if (!this.preservePaths) {\n const [root, stripped] = stripAbsolutePath(this.path)\n if (root && typeof stripped === 'string') {\n this.path = stripped\n pathWarn = root\n }\n }\n\n this.remain = readEntry.size\n this.blockRemain = readEntry.startBlockSize\n\n this.onWriteEntry?.(this as unknown as WriteEntry)\n this.header = new Header({\n path: this[PREFIX](this.path),\n linkpath:\n this.type === 'Link' && this.linkpath !== undefined ?\n this[PREFIX](this.linkpath)\n : this.linkpath,\n // only the permissions and setuid/setgid/sticky bitflags\n // not the higher-order bits that specify file type\n mode: this.mode,\n uid: this.portable ? undefined : this.uid,\n gid: this.portable ? undefined : this.gid,\n size: this.size,\n mtime: this.noMtime ? undefined : this.mtime,\n type: this.type,\n uname: this.portable ? undefined : this.uname,\n atime: this.portable ? undefined : this.atime,\n ctime: this.portable ? undefined : this.ctime,\n })\n\n if (pathWarn) {\n this.warn(\n 'TAR_ENTRY_INFO',\n `stripping ${pathWarn} from absolute path`,\n {\n entry: this,\n path: pathWarn + this.path,\n },\n )\n }\n\n if (this.header.encode() && !this.noPax) {\n super.write(\n new Pax({\n atime: this.portable ? undefined : this.atime,\n ctime: this.portable ? undefined : this.ctime,\n gid: this.portable ? undefined : this.gid,\n mtime: this.noMtime ? undefined : this.mtime,\n path: this[PREFIX](this.path),\n linkpath:\n this.type === 'Link' && this.linkpath !== undefined ?\n this[PREFIX](this.linkpath)\n : this.linkpath,\n size: this.size,\n uid: this.portable ? undefined : this.uid,\n uname: this.portable ? undefined : this.uname,\n dev: this.portable ? undefined : this.readEntry.dev,\n ino: this.portable ? undefined : this.readEntry.ino,\n nlink: this.portable ? undefined : this.readEntry.nlink,\n }).encode(),\n )\n }\n\n const b = this.header?.block\n /* c8 ignore start */\n if (!b) throw new Error('failed to encode header')\n /* c8 ignore stop */\n super.write(b)\n readEntry.pipe(this)\n }\n\n [PREFIX](path: string) {\n return prefixPath(path, this.prefix)\n }\n\n [MODE](mode: number) {\n return modeFix(mode, this.type === 'Directory', this.portable)\n }\n\n write(buffer: Buffer | string, cb?: () => void): boolean\n write(\n str: Buffer | string,\n encoding?: BufferEncoding | null,\n cb?: () => void,\n ): boolean\n write(\n chunk: Buffer | string,\n encoding?: BufferEncoding | (() => any) | null,\n cb?: () => any,\n ): boolean {\n /* c8 ignore start - just junk to comply with NodeJS.WritableStream */\n if (typeof encoding === 'function') {\n cb = encoding\n encoding = undefined\n }\n if (typeof chunk === 'string') {\n chunk = Buffer.from(\n chunk,\n typeof encoding === 'string' ? encoding : 'utf8',\n )\n }\n /* c8 ignore stop */\n const writeLen = chunk.length\n if (writeLen > this.blockRemain) {\n throw new Error('writing more to entry than is appropriate')\n }\n this.blockRemain -= writeLen\n return super.write(chunk, cb)\n }\n\n end(cb?: () => void): this\n end(chunk: Buffer | string, cb?: () => void): this\n end(\n chunk: Buffer | string,\n encoding?: BufferEncoding,\n cb?: () => void,\n ): this\n end(\n chunk?: Buffer | string | (() => void),\n encoding?: BufferEncoding | (() => void),\n cb?: () => void,\n ): this {\n if (this.blockRemain) {\n super.write(Buffer.alloc(this.blockRemain))\n }\n /* c8 ignore start - just junk to comply with NodeJS.WritableStream */\n if (typeof chunk === 'function') {\n cb = chunk\n encoding = undefined\n chunk = undefined\n }\n if (typeof encoding === 'function') {\n cb = encoding\n encoding = undefined\n }\n if (typeof chunk === 'string') {\n chunk = Buffer.from(chunk, encoding ?? 'utf8')\n }\n if (cb) this.once('finish', cb)\n chunk ? super.end(chunk, cb) : super.end(cb)\n /* c8 ignore stop */\n return this\n }\n}\n\nconst getType = (stat: Stats): EntryTypeName | 'Unsupported' =>\n stat.isFile() ? 'File'\n : stat.isDirectory() ? 'Directory'\n : stat.isSymbolicLink() ? 'SymbolicLink'\n : 'Unsupported'\n", "export const modeFix = (\n mode: number,\n isDir: boolean,\n portable: boolean,\n) => {\n mode &= 0o7777\n\n // in portable mode, use the minimum reasonable umask\n // if this system creates files with 0o664 by default\n // (as some linux distros do), then we'll write the\n // archive with 0o644 instead. Also, don't ever create\n // a file that is not readable/writable by the owner.\n if (portable) {\n mode = (mode | 0o600) & ~0o22\n }\n\n // if dirs are readable, then they should be listable\n if (isDir) {\n if (mode & 0o400) {\n mode |= 0o100\n }\n if (mode & 0o40) {\n mode |= 0o10\n }\n if (mode & 0o4) {\n mode |= 0o1\n }\n }\n return mode\n}\n", "// unix absolute paths are also absolute on win32, so we use this for both\nimport { win32 } from 'node:path'\nconst { isAbsolute, parse } = win32\n\n// returns [root, stripped]\n// Note that windows will think that //x/y/z/a has a \"root\" of //x/y, and in\n// those cases, we want to sanitize it to x/y/z/a, not z/a, so we strip /\n// explicitly if it's the first character.\n// drive-specific relative paths on Windows get their root stripped off even\n// though they are not absolute, so `c:../foo` becomes ['c:', '../foo']\nexport const stripAbsolutePath = (path: string) => {\n let r = ''\n\n let parsed = parse(path)\n while (isAbsolute(path) || parsed.root) {\n // windows will think that //x/y/z has a \"root\" of //x/y/\n // but strip the //?/C:/ off of //?/C:/path\n const root =\n path.charAt(0) === '/' && path.slice(0, 4) !== '//?/' ?\n '/'\n : parsed.root\n path = path.slice(root.length)\n r += root\n parsed = parse(path)\n }\n return [r, path]\n}\n", "// When writing files on Windows, translate the characters to their\n// 0xf000 higher-encoded versions.\n\nconst raw = ['|', '<', '>', '?', ':']\n\nconst win = raw.map(char =>\n String.fromCharCode(0xf000 + char.charCodeAt(0)),\n)\n\nconst toWin = new Map(raw.map((char, i) => [char, win[i]]))\nconst toRaw = new Map(win.map((char, i) => [char, raw[i]]))\n\nexport const encode = (s: string) =>\n raw.reduce((s, c) => s.split(c).join(toWin.get(c)), s)\nexport const decode = (s: string) =>\n win.reduce((s, c) => s.split(c).join(toRaw.get(c)), s)\n", "// tar -x\nimport * as fsm from '@isaacs/fs-minipass'\nimport fs from 'node:fs'\nimport { filesFilter } from './list.js'\nimport { makeCommand } from './make-command.js'\nimport { TarOptionsFile, TarOptionsSyncFile } from './options.js'\nimport { Unpack, UnpackSync } from './unpack.js'\n\nconst extractFileSync = (opt: TarOptionsSyncFile) => {\n const u = new UnpackSync(opt)\n const file = opt.file\n const stat = fs.statSync(file)\n // This trades a zero-byte read() syscall for a stat\n // However, it will usually result in less memory allocation\n const readSize = opt.maxReadSize || 16 * 1024 * 1024\n const stream = new fsm.ReadStreamSync(file, {\n readSize: readSize,\n size: stat.size,\n })\n stream.pipe(u)\n}\n\nconst extractFile = (opt: TarOptionsFile, _?: string[]) => {\n const u = new Unpack(opt)\n const readSize = opt.maxReadSize || 16 * 1024 * 1024\n\n const file = opt.file\n const p = new Promise<void>((resolve, reject) => {\n u.on('error', reject)\n u.on('close', resolve)\n\n // This trades a zero-byte read() syscall for a stat\n // However, it will usually result in less memory allocation\n fs.stat(file, (er, stat) => {\n if (er) {\n reject(er)\n } else {\n const stream = new fsm.ReadStream(file, {\n readSize: readSize,\n size: stat.size,\n })\n stream.on('error', reject)\n stream.pipe(u)\n }\n })\n })\n return p\n}\n\nexport const extract = makeCommand<Unpack, UnpackSync>(\n extractFileSync,\n extractFile,\n opt => new UnpackSync(opt),\n opt => new Unpack(opt),\n (opt, files) => {\n if (files?.length) filesFilter(opt, files)\n },\n)\n", "// the PEND/UNPEND stuff tracks whether we're ready to emit end/close yet.\n// but the path reservations are required to avoid race conditions where\n// parallelized unpack ops may mess with one another, due to dependencies\n// (like a Link depending on its target) or destructive operations (like\n// clobbering an fs object to create one of a different type.)\n\nimport * as fsm from '@isaacs/fs-minipass'\nimport assert from 'node:assert'\nimport { randomBytes } from 'node:crypto'\nimport fs, { type Stats } from 'node:fs'\nimport path from 'node:path'\nimport { getWriteFlag } from './get-write-flag.js'\nimport { mkdir, MkdirError, mkdirSync } from './mkdir.js'\nimport { normalizeUnicode } from './normalize-unicode.js'\nimport { normalizeWindowsPath } from './normalize-windows-path.js'\nimport { Parser } from './parse.js'\nimport { stripAbsolutePath } from './strip-absolute-path.js'\nimport { stripTrailingSlashes } from './strip-trailing-slashes.js'\nimport * as wc from './winchars.js'\n\nimport { TarOptions } from './options.js'\nimport { PathReservations } from './path-reservations.js'\nimport { ReadEntry } from './read-entry.js'\nimport { WarnData } from './warn-method.js'\n\nconst ONENTRY = Symbol('onEntry')\nconst CHECKFS = Symbol('checkFs')\nconst CHECKFS2 = Symbol('checkFs2')\nconst PRUNECACHE = Symbol('pruneCache')\nconst ISREUSABLE = Symbol('isReusable')\nconst MAKEFS = Symbol('makeFs')\nconst FILE = Symbol('file')\nconst DIRECTORY = Symbol('directory')\nconst LINK = Symbol('link')\nconst SYMLINK = Symbol('symlink')\nconst HARDLINK = Symbol('hardlink')\nconst UNSUPPORTED = Symbol('unsupported')\nconst CHECKPATH = Symbol('checkPath')\nconst MKDIR = Symbol('mkdir')\nconst ONERROR = Symbol('onError')\nconst PENDING = Symbol('pending')\nconst PEND = Symbol('pend')\nconst UNPEND = Symbol('unpend')\nconst ENDED = Symbol('ended')\nconst MAYBECLOSE = Symbol('maybeClose')\nconst SKIP = Symbol('skip')\nconst DOCHOWN = Symbol('doChown')\nconst UID = Symbol('uid')\nconst GID = Symbol('gid')\nconst CHECKED_CWD = Symbol('checkedCwd')\nconst platform =\n process.env.TESTING_TAR_FAKE_PLATFORM || process.platform\nconst isWindows = platform === 'win32'\nconst DEFAULT_MAX_DEPTH = 1024\n\n// Unlinks on Windows are not atomic.\n//\n// This means that if you have a file entry, followed by another\n// file entry with an identical name, and you cannot re-use the file\n// (because it's a hardlink, or because unlink:true is set, or it's\n// Windows, which does not have useful nlink values), then the unlink\n// will be committed to the disk AFTER the new file has been written\n// over the old one, deleting the new file.\n//\n// To work around this, on Windows systems, we rename the file and then\n// delete the renamed file. It's a sloppy kludge, but frankly, I do not\n// know of a better way to do this, given windows' non-atomic unlink\n// semantics.\n//\n// See: https://github.com/npm/node-tar/issues/183\n/* c8 ignore start */\nconst unlinkFile = (\n path: string,\n cb: (er?: Error | null) => void,\n) => {\n if (!isWindows) {\n return fs.unlink(path, cb)\n }\n\n const name = path + '.DELETE.' + randomBytes(16).toString('hex')\n fs.rename(path, name, er => {\n if (er) {\n return cb(er)\n }\n fs.unlink(name, cb)\n })\n}\n/* c8 ignore stop */\n\n/* c8 ignore start */\nconst unlinkFileSync = (path: string) => {\n if (!isWindows) {\n return fs.unlinkSync(path)\n }\n\n const name = path + '.DELETE.' + randomBytes(16).toString('hex')\n fs.renameSync(path, name)\n fs.unlinkSync(name)\n}\n/* c8 ignore stop */\n\n// this.gid, entry.gid, this.processUid\nconst uint32 = (\n a: number | undefined,\n b: number | undefined,\n c: number | undefined,\n) =>\n a !== undefined && a === a >>> 0 ? a\n : b !== undefined && b === b >>> 0 ? b\n : c\n\n// clear the cache if it's a case-insensitive unicode-squashing match.\n// we can't know if the current file system is case-sensitive or supports\n// unicode fully, so we check for similarity on the maximally compatible\n// representation. Err on the side of pruning, since all it's doing is\n// preventing lstats, and it's not the end of the world if we get a false\n// positive.\n// Note that on windows, we always drop the entire cache whenever a\n// symbolic link is encountered, because 8.3 filenames are impossible\n// to reason about, and collisions are hazards rather than just failures.\nconst cacheKeyNormalize = (path: string) =>\n stripTrailingSlashes(\n normalizeWindowsPath(normalizeUnicode(path)),\n ).toLowerCase()\n\n// remove all cache entries matching ${abs}/**\nconst pruneCache = (cache: Map<string, boolean>, abs: string) => {\n abs = cacheKeyNormalize(abs)\n for (const path of cache.keys()) {\n const pnorm = cacheKeyNormalize(path)\n if (pnorm === abs || pnorm.indexOf(abs + '/') === 0) {\n cache.delete(path)\n }\n }\n}\n\nconst dropCache = (cache: Map<string, boolean>) => {\n for (const key of cache.keys()) {\n cache.delete(key)\n }\n}\n\nexport class Unpack extends Parser {\n [ENDED]: boolean = false;\n [CHECKED_CWD]: boolean = false;\n [PENDING]: number = 0\n\n reservations: PathReservations = new PathReservations()\n transform?: TarOptions['transform']\n writable: true = true\n readable: false = false\n dirCache: Exclude<TarOptions['dirCache'], undefined>\n uid?: number\n gid?: number\n setOwner: boolean\n preserveOwner: boolean\n processGid?: number\n processUid?: number\n maxDepth: number\n forceChown: boolean\n win32: boolean\n newer: boolean\n keep: boolean\n noMtime: boolean\n preservePaths: boolean\n unlink: boolean\n cwd: string\n strip: number\n processUmask: number\n umask: number\n dmode: number\n fmode: number\n chmod: boolean\n\n constructor(opt: TarOptions = {}) {\n opt.ondone = () => {\n this[ENDED] = true\n this[MAYBECLOSE]()\n }\n\n super(opt)\n\n this.transform = opt.transform\n\n this.dirCache = opt.dirCache || new Map()\n this.chmod = !!opt.chmod\n\n if (typeof opt.uid === 'number' || typeof opt.gid === 'number') {\n // need both or neither\n if (\n typeof opt.uid !== 'number' ||\n typeof opt.gid !== 'number'\n ) {\n throw new TypeError(\n 'cannot set owner without number uid and gid',\n )\n }\n if (opt.preserveOwner) {\n throw new TypeError(\n 'cannot preserve owner in archive and also set owner explicitly',\n )\n }\n this.uid = opt.uid\n this.gid = opt.gid\n this.setOwner = true\n } else {\n this.uid = undefined\n this.gid = undefined\n this.setOwner = false\n }\n\n // default true for root\n if (\n opt.preserveOwner === undefined &&\n typeof opt.uid !== 'number'\n ) {\n this.preserveOwner = !!(\n process.getuid && process.getuid() === 0\n )\n } else {\n this.preserveOwner = !!opt.preserveOwner\n }\n\n this.processUid =\n (this.preserveOwner || this.setOwner) && process.getuid ?\n process.getuid()\n : undefined\n this.processGid =\n (this.preserveOwner || this.setOwner) && process.getgid ?\n process.getgid()\n : undefined\n\n // prevent excessively deep nesting of subfolders\n // set to `Infinity` to remove this restriction\n this.maxDepth =\n typeof opt.maxDepth === 'number' ?\n opt.maxDepth\n : DEFAULT_MAX_DEPTH\n\n // mostly just for testing, but useful in some cases.\n // Forcibly trigger a chown on every entry, no matter what\n this.forceChown = opt.forceChown === true\n\n // turn ><?| in filenames into 0xf000-higher encoded forms\n this.win32 = !!opt.win32 || isWindows\n\n // do not unpack over files that are newer than what's in the archive\n this.newer = !!opt.newer\n\n // do not unpack over ANY files\n this.keep = !!opt.keep\n\n // do not set mtime/atime of extracted entries\n this.noMtime = !!opt.noMtime\n\n // allow .., absolute path entries, and unpacking through symlinks\n // without this, warn and skip .., relativize absolutes, and error\n // on symlinks in extraction path\n this.preservePaths = !!opt.preservePaths\n\n // unlink files and links before writing. This breaks existing hard\n // links, and removes symlink directories rather than erroring\n this.unlink = !!opt.unlink\n\n this.cwd = normalizeWindowsPath(\n path.resolve(opt.cwd || process.cwd()),\n )\n this.strip = Number(opt.strip) || 0\n // if we're not chmodding, then we don't need the process umask\n this.processUmask =\n !this.chmod ? 0\n : typeof opt.processUmask === 'number' ? opt.processUmask\n : process.umask()\n this.umask =\n typeof opt.umask === 'number' ? opt.umask : this.processUmask\n\n // default mode for dirs created as parents\n this.dmode = opt.dmode || 0o0777 & ~this.umask\n this.fmode = opt.fmode || 0o0666 & ~this.umask\n\n this.on('entry', entry => this[ONENTRY](entry))\n }\n\n // a bad or damaged archive is a warning for Parser, but an error\n // when extracting. Mark those errors as unrecoverable, because\n // the Unpack contract cannot be met.\n warn(code: string, msg: string | Error, data: WarnData = {}) {\n if (code === 'TAR_BAD_ARCHIVE' || code === 'TAR_ABORT') {\n data.recoverable = false\n }\n return super.warn(code, msg, data)\n }\n\n [MAYBECLOSE]() {\n if (this[ENDED] && this[PENDING] === 0) {\n this.emit('prefinish')\n this.emit('finish')\n this.emit('end')\n }\n }\n\n [CHECKPATH](entry: ReadEntry) {\n const p = normalizeWindowsPath(entry.path)\n const parts = p.split('/')\n\n if (this.strip) {\n if (parts.length < this.strip) {\n return false\n }\n if (entry.type === 'Link') {\n const linkparts = normalizeWindowsPath(\n String(entry.linkpath),\n ).split('/')\n if (linkparts.length >= this.strip) {\n entry.linkpath = linkparts.slice(this.strip).join('/')\n } else {\n return false\n }\n }\n parts.splice(0, this.strip)\n entry.path = parts.join('/')\n }\n\n if (isFinite(this.maxDepth) && parts.length > this.maxDepth) {\n this.warn('TAR_ENTRY_ERROR', 'path excessively deep', {\n entry,\n path: p,\n depth: parts.length,\n maxDepth: this.maxDepth,\n })\n return false\n }\n\n if (!this.preservePaths) {\n if (\n parts.includes('..') ||\n /* c8 ignore next */\n (isWindows && /^[a-z]:\\.\\.$/i.test(parts[0] ?? ''))\n ) {\n this.warn('TAR_ENTRY_ERROR', `path contains '..'`, {\n entry,\n path: p,\n })\n return false\n }\n\n // strip off the root\n const [root, stripped] = stripAbsolutePath(p)\n if (root) {\n entry.path = String(stripped)\n this.warn(\n 'TAR_ENTRY_INFO',\n `stripping ${root} from absolute path`,\n {\n entry,\n path: p,\n },\n )\n }\n }\n\n if (path.isAbsolute(entry.path)) {\n entry.absolute = normalizeWindowsPath(path.resolve(entry.path))\n } else {\n entry.absolute = normalizeWindowsPath(\n path.resolve(this.cwd, entry.path),\n )\n }\n\n // if we somehow ended up with a path that escapes the cwd, and we are\n // not in preservePaths mode, then something is fishy! This should have\n // been prevented above, so ignore this for coverage.\n /* c8 ignore start - defense in depth */\n if (\n !this.preservePaths &&\n typeof entry.absolute === 'string' &&\n entry.absolute.indexOf(this.cwd + '/') !== 0 &&\n entry.absolute !== this.cwd\n ) {\n this.warn('TAR_ENTRY_ERROR', 'path escaped extraction target', {\n entry,\n path: normalizeWindowsPath(entry.path),\n resolvedPath: entry.absolute,\n cwd: this.cwd,\n })\n return false\n }\n /* c8 ignore stop */\n\n // an archive can set properties on the extraction directory, but it\n // may not replace the cwd with a different kind of thing entirely.\n if (\n entry.absolute === this.cwd &&\n entry.type !== 'Directory' &&\n entry.type !== 'GNUDumpDir'\n ) {\n return false\n }\n\n // only encode : chars that aren't drive letter indicators\n if (this.win32) {\n const { root: aRoot } = path.win32.parse(String(entry.absolute))\n entry.absolute =\n aRoot + wc.encode(String(entry.absolute).slice(aRoot.length))\n const { root: pRoot } = path.win32.parse(entry.path)\n entry.path = pRoot + wc.encode(entry.path.slice(pRoot.length))\n }\n\n return true\n }\n\n [ONENTRY](entry: ReadEntry) {\n if (!this[CHECKPATH](entry)) {\n return entry.resume()\n }\n\n assert.equal(typeof entry.absolute, 'string')\n\n switch (entry.type) {\n case 'Directory':\n case 'GNUDumpDir':\n if (entry.mode) {\n entry.mode = entry.mode | 0o700\n }\n\n // eslint-disable-next-line no-fallthrough\n case 'File':\n case 'OldFile':\n case 'ContiguousFile':\n case 'Link':\n case 'SymbolicLink':\n return this[CHECKFS](entry)\n\n case 'CharacterDevice':\n case 'BlockDevice':\n case 'FIFO':\n default:\n return this[UNSUPPORTED](entry)\n }\n }\n\n [ONERROR](er: Error, entry: ReadEntry) {\n // Cwd has to exist, or else nothing works. That's serious.\n // Other errors are warnings, which raise the error in strict\n // mode, but otherwise continue on.\n if (er.name === 'CwdError') {\n this.emit('error', er)\n } else {\n this.warn('TAR_ENTRY_ERROR', er, { entry })\n this[UNPEND]()\n entry.resume()\n }\n }\n\n [MKDIR](\n dir: string,\n mode: number,\n cb: (er?: null | MkdirError, made?: string) => void,\n ) {\n mkdir(\n normalizeWindowsPath(dir),\n {\n uid: this.uid,\n gid: this.gid,\n processUid: this.processUid,\n processGid: this.processGid,\n umask: this.processUmask,\n preserve: this.preservePaths,\n unlink: this.unlink,\n cache: this.dirCache,\n cwd: this.cwd,\n mode: mode,\n },\n cb,\n )\n }\n\n [DOCHOWN](entry: ReadEntry) {\n // in preserve owner mode, chown if the entry doesn't match process\n // in set owner mode, chown if setting doesn't match process\n return (\n this.forceChown ||\n (this.preserveOwner &&\n ((typeof entry.uid === 'number' &&\n entry.uid !== this.processUid) ||\n (typeof entry.gid === 'number' &&\n entry.gid !== this.processGid))) ||\n (typeof this.uid === 'number' &&\n this.uid !== this.processUid) ||\n (typeof this.gid === 'number' && this.gid !== this.processGid)\n )\n }\n\n [UID](entry: ReadEntry) {\n return uint32(this.uid, entry.uid, this.processUid)\n }\n\n [GID](entry: ReadEntry) {\n return uint32(this.gid, entry.gid, this.processGid)\n }\n\n [FILE](entry: ReadEntry, fullyDone: () => void) {\n const mode =\n typeof entry.mode === 'number' ?\n entry.mode & 0o7777\n : this.fmode\n const stream = new fsm.WriteStream(String(entry.absolute), {\n // slight lie, but it can be numeric flags\n flags: getWriteFlag(entry.size) as string,\n mode: mode,\n autoClose: false,\n })\n stream.on('error', (er: Error) => {\n if (stream.fd) {\n fs.close(stream.fd, () => {})\n }\n\n // flush all the data out so that we aren't left hanging\n // if the error wasn't actually fatal. otherwise the parse\n // is blocked, and we never proceed.\n stream.write = () => true\n this[ONERROR](er, entry)\n fullyDone()\n })\n\n let actions = 1\n const done = (er?: null | Error) => {\n if (er) {\n /* c8 ignore start - we should always have a fd by now */\n if (stream.fd) {\n fs.close(stream.fd, () => {})\n }\n /* c8 ignore stop */\n\n this[ONERROR](er, entry)\n fullyDone()\n return\n }\n\n if (--actions === 0) {\n if (stream.fd !== undefined) {\n fs.close(stream.fd, er => {\n if (er) {\n this[ONERROR](er, entry)\n } else {\n this[UNPEND]()\n }\n fullyDone()\n })\n }\n }\n }\n\n stream.on('finish', () => {\n // if futimes fails, try utimes\n // if utimes fails, fail with the original error\n // same for fchown/chown\n const abs = String(entry.absolute)\n const fd = stream.fd\n\n if (typeof fd === 'number' && entry.mtime && !this.noMtime) {\n actions++\n const atime = entry.atime || new Date()\n const mtime = entry.mtime\n fs.futimes(fd, atime, mtime, er =>\n er ?\n fs.utimes(abs, atime, mtime, er2 => done(er2 && er))\n : done(),\n )\n }\n\n if (typeof fd === 'number' && this[DOCHOWN](entry)) {\n actions++\n const uid = this[UID](entry)\n const gid = this[GID](entry)\n if (typeof uid === 'number' && typeof gid === 'number') {\n fs.fchown(fd, uid, gid, er =>\n er ?\n fs.chown(abs, uid, gid, er2 => done(er2 && er))\n : done(),\n )\n }\n }\n\n done()\n })\n\n const tx = this.transform ? this.transform(entry) || entry : entry\n if (tx !== entry) {\n tx.on('error', (er: Error) => {\n this[ONERROR](er, entry)\n fullyDone()\n })\n entry.pipe(tx)\n }\n tx.pipe(stream)\n }\n\n [DIRECTORY](entry: ReadEntry, fullyDone: () => void) {\n const mode =\n typeof entry.mode === 'number' ?\n entry.mode & 0o7777\n : this.dmode\n this[MKDIR](String(entry.absolute), mode, er => {\n if (er) {\n this[ONERROR](er, entry)\n fullyDone()\n return\n }\n\n let actions = 1\n const done = () => {\n if (--actions === 0) {\n fullyDone()\n this[UNPEND]()\n entry.resume()\n }\n }\n\n if (entry.mtime && !this.noMtime) {\n actions++\n fs.utimes(\n String(entry.absolute),\n entry.atime || new Date(),\n entry.mtime,\n done,\n )\n }\n\n if (this[DOCHOWN](entry)) {\n actions++\n fs.chown(\n String(entry.absolute),\n Number(this[UID](entry)),\n Number(this[GID](entry)),\n done,\n )\n }\n\n done()\n })\n }\n\n [UNSUPPORTED](entry: ReadEntry) {\n entry.unsupported = true\n this.warn(\n 'TAR_ENTRY_UNSUPPORTED',\n `unsupported entry type: ${entry.type}`,\n { entry },\n )\n entry.resume()\n }\n\n [SYMLINK](entry: ReadEntry, done: () => void) {\n this[LINK](entry, String(entry.linkpath), 'symlink', done)\n }\n\n [HARDLINK](entry: ReadEntry, done: () => void) {\n const linkpath = normalizeWindowsPath(\n path.resolve(this.cwd, String(entry.linkpath)),\n )\n this[LINK](entry, linkpath, 'link', done)\n }\n\n [PEND]() {\n this[PENDING]++\n }\n\n [UNPEND]() {\n this[PENDING]--\n this[MAYBECLOSE]()\n }\n\n [SKIP](entry: ReadEntry) {\n this[UNPEND]()\n entry.resume()\n }\n\n // Check if we can reuse an existing filesystem entry safely and\n // overwrite it, rather than unlinking and recreating\n // Windows doesn't report a useful nlink, so we just never reuse entries\n [ISREUSABLE](entry: ReadEntry, st: Stats) {\n return (\n entry.type === 'File' &&\n !this.unlink &&\n st.isFile() &&\n st.nlink <= 1 &&\n !isWindows\n )\n }\n\n // check if a thing is there, and if so, try to clobber it\n [CHECKFS](entry: ReadEntry) {\n this[PEND]()\n const paths = [entry.path]\n if (entry.linkpath) {\n paths.push(entry.linkpath)\n }\n this.reservations.reserve(paths, done =>\n this[CHECKFS2](entry, done),\n )\n }\n\n [PRUNECACHE](entry: ReadEntry) {\n // if we are not creating a directory, and the path is in the dirCache,\n // then that means we are about to delete the directory we created\n // previously, and it is no longer going to be a directory, and neither\n // is any of its children.\n // If a symbolic link is encountered, all bets are off. There is no\n // reasonable way to sanitize the cache in such a way we will be able to\n // avoid having filesystem collisions. If this happens with a non-symlink\n // entry, it'll just fail to unpack, but a symlink to a directory, using an\n // 8.3 shortname or certain unicode attacks, can evade detection and lead\n // to arbitrary writes to anywhere on the system.\n if (entry.type === 'SymbolicLink') {\n dropCache(this.dirCache)\n } else if (entry.type !== 'Directory') {\n pruneCache(this.dirCache, String(entry.absolute))\n }\n }\n\n [CHECKFS2](entry: ReadEntry, fullyDone: (er?: Error) => void) {\n this[PRUNECACHE](entry)\n\n const done = (er?: Error) => {\n this[PRUNECACHE](entry)\n fullyDone(er)\n }\n\n const checkCwd = () => {\n this[MKDIR](this.cwd, this.dmode, er => {\n if (er) {\n this[ONERROR](er, entry)\n done()\n return\n }\n this[CHECKED_CWD] = true\n start()\n })\n }\n\n const start = () => {\n if (entry.absolute !== this.cwd) {\n const parent = normalizeWindowsPath(\n path.dirname(String(entry.absolute)),\n )\n if (parent !== this.cwd) {\n return this[MKDIR](parent, this.dmode, er => {\n if (er) {\n this[ONERROR](er, entry)\n done()\n return\n }\n afterMakeParent()\n })\n }\n }\n afterMakeParent()\n }\n\n const afterMakeParent = () => {\n fs.lstat(String(entry.absolute), (lstatEr, st) => {\n if (\n st &&\n (this.keep ||\n /* c8 ignore next */\n (this.newer && st.mtime > (entry.mtime ?? st.mtime)))\n ) {\n this[SKIP](entry)\n done()\n return\n }\n if (lstatEr || this[ISREUSABLE](entry, st)) {\n return this[MAKEFS](null, entry, done)\n }\n\n if (st.isDirectory()) {\n if (entry.type === 'Directory') {\n const needChmod =\n this.chmod &&\n entry.mode &&\n (st.mode & 0o7777) !== entry.mode\n const afterChmod = (er?: Error | null | undefined) =>\n this[MAKEFS](er ?? null, entry, done)\n if (!needChmod) {\n return afterChmod()\n }\n return fs.chmod(\n String(entry.absolute),\n Number(entry.mode),\n afterChmod,\n )\n }\n // Not a dir entry, have to remove it.\n // NB: the only way to end up with an entry that is the cwd\n // itself, in such a way that == does not detect, is a\n // tricky windows absolute path with UNC or 8.3 parts (and\n // preservePaths:true, or else it will have been stripped).\n // In that case, the user has opted out of path protections\n // explicitly, so if they blow away the cwd, c'est la vie.\n if (entry.absolute !== this.cwd) {\n return fs.rmdir(\n String(entry.absolute),\n (er?: null | Error) =>\n this[MAKEFS](er ?? null, entry, done),\n )\n }\n }\n\n // not a dir, and not reusable\n // don't remove if the cwd, we want that error\n if (entry.absolute === this.cwd) {\n return this[MAKEFS](null, entry, done)\n }\n\n unlinkFile(String(entry.absolute), er =>\n this[MAKEFS](er ?? null, entry, done),\n )\n })\n }\n\n if (this[CHECKED_CWD]) {\n start()\n } else {\n checkCwd()\n }\n }\n\n [MAKEFS](\n er: null | undefined | Error,\n entry: ReadEntry,\n done: () => void,\n ) {\n if (er) {\n this[ONERROR](er, entry)\n done()\n return\n }\n\n switch (entry.type) {\n case 'File':\n case 'OldFile':\n case 'ContiguousFile':\n return this[FILE](entry, done)\n\n case 'Link':\n return this[HARDLINK](entry, done)\n\n case 'SymbolicLink':\n return this[SYMLINK](entry, done)\n\n case 'Directory':\n case 'GNUDumpDir':\n return this[DIRECTORY](entry, done)\n }\n }\n\n [LINK](\n entry: ReadEntry,\n linkpath: string,\n link: 'link' | 'symlink',\n done: () => void,\n ) {\n // XXX: get the type ('symlink' or 'junction') for windows\n fs[link](linkpath, String(entry.absolute), er => {\n if (er) {\n this[ONERROR](er, entry)\n } else {\n this[UNPEND]()\n entry.resume()\n }\n done()\n })\n }\n}\n\nconst callSync = (fn: () => any) => {\n try {\n return [null, fn()]\n } catch (er) {\n return [er, null]\n }\n}\n\nexport class UnpackSync extends Unpack {\n sync: true = true;\n\n [MAKEFS](er: null | Error | undefined, entry: ReadEntry) {\n return super[MAKEFS](er, entry, () => {})\n }\n\n [CHECKFS](entry: ReadEntry) {\n this[PRUNECACHE](entry)\n\n if (!this[CHECKED_CWD]) {\n const er = this[MKDIR](this.cwd, this.dmode)\n if (er) {\n return this[ONERROR](er as Error, entry)\n }\n this[CHECKED_CWD] = true\n }\n\n // don't bother to make the parent if the current entry is the cwd,\n // we've already checked it.\n if (entry.absolute !== this.cwd) {\n const parent = normalizeWindowsPath(\n path.dirname(String(entry.absolute)),\n )\n if (parent !== this.cwd) {\n const mkParent = this[MKDIR](parent, this.dmode)\n if (mkParent) {\n return this[ONERROR](mkParent as Error, entry)\n }\n }\n }\n\n const [lstatEr, st] = callSync(() =>\n fs.lstatSync(String(entry.absolute)),\n )\n if (\n st &&\n (this.keep ||\n /* c8 ignore next */\n (this.newer && st.mtime > (entry.mtime ?? st.mtime)))\n ) {\n return this[SKIP](entry)\n }\n\n if (lstatEr || this[ISREUSABLE](entry, st)) {\n return this[MAKEFS](null, entry)\n }\n\n if (st.isDirectory()) {\n if (entry.type === 'Directory') {\n const needChmod =\n this.chmod &&\n entry.mode &&\n (st.mode & 0o7777) !== entry.mode\n const [er] =\n needChmod ?\n callSync(() => {\n fs.chmodSync(String(entry.absolute), Number(entry.mode))\n })\n : []\n return this[MAKEFS](er, entry)\n }\n // not a dir entry, have to remove it\n const [er] = callSync(() =>\n fs.rmdirSync(String(entry.absolute)),\n )\n this[MAKEFS](er, entry)\n }\n\n // not a dir, and not reusable.\n // don't remove if it's the cwd, since we want that error.\n const [er] =\n entry.absolute === this.cwd ?\n []\n : callSync(() => unlinkFileSync(String(entry.absolute)))\n this[MAKEFS](er, entry)\n }\n\n [FILE](entry: ReadEntry, done: () => void) {\n const mode =\n typeof entry.mode === 'number' ?\n entry.mode & 0o7777\n : this.fmode\n\n const oner = (er?: null | Error | undefined) => {\n let closeError\n try {\n fs.closeSync(fd)\n } catch (e) {\n closeError = e\n }\n if (er || closeError) {\n this[ONERROR]((er as Error) || closeError, entry)\n }\n done()\n }\n\n let fd: number\n try {\n fd = fs.openSync(\n String(entry.absolute),\n getWriteFlag(entry.size),\n mode,\n )\n } catch (er) {\n return oner(er as Error)\n }\n const tx = this.transform ? this.transform(entry) || entry : entry\n if (tx !== entry) {\n tx.on('error', (er: Error) => this[ONERROR](er, entry))\n entry.pipe(tx)\n }\n\n tx.on('data', (chunk: Buffer) => {\n try {\n fs.writeSync(fd, chunk, 0, chunk.length)\n } catch (er) {\n oner(er as Error)\n }\n })\n\n tx.on('end', () => {\n let er = null\n // try both, falling futimes back to utimes\n // if either fails, handle the first error\n if (entry.mtime && !this.noMtime) {\n const atime = entry.atime || new Date()\n const mtime = entry.mtime\n try {\n fs.futimesSync(fd, atime, mtime)\n } catch (futimeser) {\n try {\n fs.utimesSync(String(entry.absolute), atime, mtime)\n } catch (utimeser) {\n er = futimeser\n }\n }\n }\n\n if (this[DOCHOWN](entry)) {\n const uid = this[UID](entry)\n const gid = this[GID](entry)\n\n try {\n fs.fchownSync(fd, Number(uid), Number(gid))\n } catch (fchowner) {\n try {\n fs.chownSync(\n String(entry.absolute),\n Number(uid),\n Number(gid),\n )\n } catch (chowner) {\n er = er || fchowner\n }\n }\n }\n\n oner(er as Error)\n })\n }\n\n [DIRECTORY](entry: ReadEntry, done: () => void) {\n const mode =\n typeof entry.mode === 'number' ?\n entry.mode & 0o7777\n : this.dmode\n const er = this[MKDIR](String(entry.absolute), mode)\n if (er) {\n this[ONERROR](er as Error, entry)\n done()\n return\n }\n if (entry.mtime && !this.noMtime) {\n try {\n fs.utimesSync(\n String(entry.absolute),\n entry.atime || new Date(),\n entry.mtime,\n )\n /* c8 ignore next */\n } catch (er) {}\n }\n if (this[DOCHOWN](entry)) {\n try {\n fs.chownSync(\n String(entry.absolute),\n Number(this[UID](entry)),\n Number(this[GID](entry)),\n )\n } catch (er) {}\n }\n done()\n entry.resume()\n }\n\n [MKDIR](dir: string, mode: number) {\n try {\n return mkdirSync(normalizeWindowsPath(dir), {\n uid: this.uid,\n gid: this.gid,\n processUid: this.processUid,\n processGid: this.processGid,\n umask: this.processUmask,\n preserve: this.preservePaths,\n unlink: this.unlink,\n cache: this.dirCache,\n cwd: this.cwd,\n mode: mode,\n })\n } catch (er) {\n return er\n }\n }\n\n [LINK](\n entry: ReadEntry,\n linkpath: string,\n link: 'link' | 'symlink',\n done: () => void,\n ) {\n const ls: `${typeof link}Sync` = `${link}Sync`\n try {\n fs[ls](linkpath, String(entry.absolute))\n done()\n entry.resume()\n } catch (er) {\n return this[ONERROR](er as Error, entry)\n }\n }\n}\n", "// Get the appropriate flag to use for creating files\n// We use fmap on Windows platforms for files less than\n// 512kb. This is a fairly low limit, but avoids making\n// things slower in some cases. Since most of what this\n// library is used for is extracting tarballs of many\n// relatively small files in npm packages and the like,\n// it can be a big boost on Windows platforms.\n\nimport fs from 'fs'\n\nconst platform = process.env.__FAKE_PLATFORM__ || process.platform\nconst isWindows = platform === 'win32'\n\n/* c8 ignore start */\nconst { O_CREAT, O_TRUNC, O_WRONLY } = fs.constants\nconst UV_FS_O_FILEMAP =\n Number(process.env.__FAKE_FS_O_FILENAME__) ||\n fs.constants.UV_FS_O_FILEMAP ||\n 0\n/* c8 ignore stop */\n\nconst fMapEnabled = isWindows && !!UV_FS_O_FILEMAP\nconst fMapLimit = 512 * 1024\nconst fMapFlag = UV_FS_O_FILEMAP | O_TRUNC | O_CREAT | O_WRONLY\nexport const getWriteFlag =\n !fMapEnabled ?\n () => 'w'\n : (size: number) => (size < fMapLimit ? fMapFlag : 'w')\n", "import fs, { type Dirent } from 'node:fs'\nimport path from 'node:path'\n\nconst lchownSync = (path: string, uid: number, gid: number) => {\n try {\n return fs.lchownSync(path, uid, gid)\n } catch (er) {\n if ((er as NodeJS.ErrnoException)?.code !== 'ENOENT') throw er\n }\n}\n\nconst chown = (\n cpath: string,\n uid: number,\n gid: number,\n cb: (er?: unknown) => any,\n) => {\n fs.lchown(cpath, uid, gid, er => {\n // Skip ENOENT error\n cb(er && (er as NodeJS.ErrnoException)?.code !== 'ENOENT' ? er : null)\n })\n}\n\nconst chownrKid = (\n p: string,\n child: Dirent,\n uid: number,\n gid: number,\n cb: (er?: unknown) => any,\n) => {\n if (child.isDirectory()) {\n chownr(path.resolve(p, child.name), uid, gid, (er: unknown) => {\n if (er) return cb(er)\n const cpath = path.resolve(p, child.name)\n chown(cpath, uid, gid, cb)\n })\n } else {\n const cpath = path.resolve(p, child.name)\n chown(cpath, uid, gid, cb)\n }\n}\n\nexport const chownr = (\n p: string,\n uid: number,\n gid: number,\n cb: (er?: unknown) => any,\n) => {\n fs.readdir(p, { withFileTypes: true }, (er, children) => {\n // any error other than ENOTDIR or ENOTSUP means it's not readable,\n // or doesn't exist. give up.\n if (er) {\n if (er.code === 'ENOENT') return cb()\n else if (er.code !== 'ENOTDIR' && er.code !== 'ENOTSUP')\n return cb(er)\n }\n if (er || !children.length) return chown(p, uid, gid, cb)\n\n let len = children.length\n let errState: null | NodeJS.ErrnoException = null\n const then = (er?: unknown) => {\n /* c8 ignore start */\n if (errState) return\n /* c8 ignore stop */\n if (er) return cb((errState = er as NodeJS.ErrnoException))\n if (--len === 0) return chown(p, uid, gid, cb)\n }\n\n for (const child of children) {\n chownrKid(p, child, uid, gid, then)\n }\n })\n}\n\nconst chownrKidSync = (\n p: string,\n child: Dirent,\n uid: number,\n gid: number,\n) => {\n if (child.isDirectory())\n chownrSync(path.resolve(p, child.name), uid, gid)\n\n lchownSync(path.resolve(p, child.name), uid, gid)\n}\n\nexport const chownrSync = (p: string, uid: number, gid: number) => {\n let children: Dirent[]\n try {\n children = fs.readdirSync(p, { withFileTypes: true })\n } catch (er) {\n const e = er as NodeJS.ErrnoException\n if (e?.code === 'ENOENT') return\n else if (e?.code === 'ENOTDIR' || e?.code === 'ENOTSUP')\n return lchownSync(p, uid, gid)\n else throw e\n }\n\n for (const child of children) {\n chownrKidSync(p, child, uid, gid)\n }\n\n return lchownSync(p, uid, gid)\n}\n", "import { chownr, chownrSync } from 'chownr'\nimport fs from 'fs'\nimport { mkdirp, mkdirpSync } from 'mkdirp'\nimport path from 'node:path'\nimport { CwdError } from './cwd-error.js'\nimport { normalizeWindowsPath } from './normalize-windows-path.js'\nimport { SymlinkError } from './symlink-error.js'\n\nexport type MkdirOptions = {\n uid?: number\n gid?: number\n processUid?: number\n processGid?: number\n umask?: number\n preserve: boolean\n unlink: boolean\n cache: Map<string, boolean>\n cwd: string\n mode: number\n}\n\nexport type MkdirError =\n | NodeJS.ErrnoException\n | CwdError\n | SymlinkError\n\nconst cGet = (cache: Map<string, boolean>, key: string) =>\n cache.get(normalizeWindowsPath(key))\nconst cSet = (\n cache: Map<string, boolean>,\n key: string,\n val: boolean,\n) => cache.set(normalizeWindowsPath(key), val)\n\nconst checkCwd = (\n dir: string,\n cb: (er?: null | MkdirError) => any,\n) => {\n fs.stat(dir, (er, st) => {\n if (er || !st.isDirectory()) {\n er = new CwdError(\n dir,\n (er as NodeJS.ErrnoException)?.code || 'ENOTDIR',\n )\n }\n cb(er)\n })\n}\n\n/**\n * Wrapper around mkdirp for tar's needs.\n *\n * The main purpose is to avoid creating directories if we know that\n * they already exist (and track which ones exist for this purpose),\n * and prevent entries from being extracted into symlinked folders,\n * if `preservePaths` is not set.\n */\nexport const mkdir = (\n dir: string,\n opt: MkdirOptions,\n cb: (er?: null | MkdirError, made?: string) => void,\n) => {\n dir = normalizeWindowsPath(dir)\n\n // if there's any overlap between mask and mode,\n // then we'll need an explicit chmod\n /* c8 ignore next */\n const umask = opt.umask ?? 0o22\n const mode = opt.mode | 0o0700\n const needChmod = (mode & umask) !== 0\n\n const uid = opt.uid\n const gid = opt.gid\n const doChown =\n typeof uid === 'number' &&\n typeof gid === 'number' &&\n (uid !== opt.processUid || gid !== opt.processGid)\n\n const preserve = opt.preserve\n const unlink = opt.unlink\n const cache = opt.cache\n const cwd = normalizeWindowsPath(opt.cwd)\n\n const done = (er?: null | MkdirError, created?: string) => {\n if (er) {\n cb(er)\n } else {\n cSet(cache, dir, true)\n if (created && doChown) {\n chownr(created, uid, gid, er =>\n done(er as NodeJS.ErrnoException),\n )\n } else if (needChmod) {\n fs.chmod(dir, mode, cb)\n } else {\n cb()\n }\n }\n }\n\n if (cache && cGet(cache, dir) === true) {\n return done()\n }\n\n if (dir === cwd) {\n return checkCwd(dir, done)\n }\n\n if (preserve) {\n return mkdirp(dir, { mode }).then(\n made => done(null, made ?? undefined), // oh, ts\n done,\n )\n }\n\n const sub = normalizeWindowsPath(path.relative(cwd, dir))\n const parts = sub.split('/')\n mkdir_(cwd, parts, mode, cache, unlink, cwd, undefined, done)\n}\n\nconst mkdir_ = (\n base: string,\n parts: string[],\n mode: number,\n cache: Map<string, boolean>,\n unlink: boolean,\n cwd: string,\n created: string | undefined,\n cb: (er?: null | MkdirError, made?: string) => void,\n): void => {\n if (!parts.length) {\n return cb(null, created)\n }\n const p = parts.shift()\n const part = normalizeWindowsPath(path.resolve(base + '/' + p))\n if (cGet(cache, part)) {\n return mkdir_(part, parts, mode, cache, unlink, cwd, created, cb)\n }\n fs.mkdir(\n part,\n mode,\n onmkdir(part, parts, mode, cache, unlink, cwd, created, cb),\n )\n}\n\nconst onmkdir =\n (\n part: string,\n parts: string[],\n mode: number,\n cache: Map<string, boolean>,\n unlink: boolean,\n cwd: string,\n created: string | undefined,\n cb: (er?: null | MkdirError, made?: string) => void,\n ) =>\n (er?: null | NodeJS.ErrnoException) => {\n if (er) {\n fs.lstat(part, (statEr, st) => {\n if (statEr) {\n statEr.path =\n statEr.path && normalizeWindowsPath(statEr.path)\n cb(statEr)\n } else if (st.isDirectory()) {\n mkdir_(part, parts, mode, cache, unlink, cwd, created, cb)\n } else if (unlink) {\n fs.unlink(part, er => {\n if (er) {\n return cb(er)\n }\n fs.mkdir(\n part,\n mode,\n onmkdir(\n part,\n parts,\n mode,\n cache,\n unlink,\n cwd,\n created,\n cb,\n ),\n )\n })\n } else if (st.isSymbolicLink()) {\n return cb(\n new SymlinkError(part, part + '/' + parts.join('/')),\n )\n } else {\n cb(er)\n }\n })\n } else {\n created = created || part\n mkdir_(part, parts, mode, cache, unlink, cwd, created, cb)\n }\n }\n\nconst checkCwdSync = (dir: string) => {\n let ok = false\n let code: string | undefined = undefined\n try {\n ok = fs.statSync(dir).isDirectory()\n } catch (er) {\n code = (er as NodeJS.ErrnoException)?.code\n } finally {\n if (!ok) {\n throw new CwdError(dir, code ?? 'ENOTDIR')\n }\n }\n}\n\nexport const mkdirSync = (dir: string, opt: MkdirOptions) => {\n dir = normalizeWindowsPath(dir)\n // if there's any overlap between mask and mode,\n // then we'll need an explicit chmod\n /* c8 ignore next */\n const umask = opt.umask ?? 0o22\n const mode = opt.mode | 0o700\n const needChmod = (mode & umask) !== 0\n\n const uid = opt.uid\n const gid = opt.gid\n const doChown =\n typeof uid === 'number' &&\n typeof gid === 'number' &&\n (uid !== opt.processUid || gid !== opt.processGid)\n\n const preserve = opt.preserve\n const unlink = opt.unlink\n const cache = opt.cache\n const cwd = normalizeWindowsPath(opt.cwd)\n\n const done = (created?: string | undefined) => {\n cSet(cache, dir, true)\n if (created && doChown) {\n chownrSync(created, uid, gid)\n }\n if (needChmod) {\n fs.chmodSync(dir, mode)\n }\n }\n\n if (cache && cGet(cache, dir) === true) {\n return done()\n }\n\n if (dir === cwd) {\n checkCwdSync(cwd)\n return done()\n }\n\n if (preserve) {\n return done(mkdirpSync(dir, mode) ?? undefined)\n }\n\n const sub = normalizeWindowsPath(path.relative(cwd, dir))\n const parts = sub.split('/')\n let created: string | undefined = undefined\n for (\n let p = parts.shift(), part = cwd;\n p && (part += '/' + p);\n p = parts.shift()\n ) {\n part = normalizeWindowsPath(path.resolve(part))\n if (cGet(cache, part)) {\n continue\n }\n\n try {\n fs.mkdirSync(part, mode)\n created = created || part\n cSet(cache, part, true)\n } catch (er) {\n const st = fs.lstatSync(part)\n if (st.isDirectory()) {\n cSet(cache, part, true)\n continue\n } else if (unlink) {\n fs.unlinkSync(part)\n fs.mkdirSync(part, mode)\n created = created || part\n cSet(cache, part, true)\n continue\n } else if (st.isSymbolicLink()) {\n return new SymlinkError(part, part + '/' + parts.join('/'))\n }\n }\n }\n\n return done(created)\n}\n", "import { dirname } from 'path'\nimport { MkdirpOptions, optsArg } from './opts-arg.js'\n\nexport const mkdirpManualSync = (\n path: string,\n options?: MkdirpOptions,\n made?: string | undefined | void\n): string | undefined | void => {\n const parent = dirname(path)\n const opts = { ...optsArg(options), recursive: false }\n\n if (parent === path) {\n try {\n return opts.mkdirSync(path, opts)\n } catch (er) {\n // swallowed by recursive implementation on posix systems\n // any other error is a failure\n const fer = er as NodeJS.ErrnoException\n if (fer && fer.code !== 'EISDIR') {\n throw er\n }\n return\n }\n }\n\n try {\n opts.mkdirSync(path, opts)\n return made || path\n } catch (er) {\n const fer = er as NodeJS.ErrnoException\n if (fer && fer.code === 'ENOENT') {\n return mkdirpManualSync(path, opts, mkdirpManualSync(parent, opts, made))\n }\n if (fer && fer.code !== 'EEXIST' && fer && fer.code !== 'EROFS') {\n throw er\n }\n try {\n if (!opts.statSync(path).isDirectory()) throw er\n } catch (_) {\n throw er\n }\n }\n}\n\nexport const mkdirpManual = Object.assign(\n async (\n path: string,\n options?: MkdirpOptions,\n made?: string | undefined | void\n ): Promise<string | undefined | void> => {\n const opts = optsArg(options)\n opts.recursive = false\n const parent = dirname(path)\n if (parent === path) {\n return opts.mkdirAsync(path, opts).catch(er => {\n // swallowed by recursive implementation on posix systems\n // any other error is a failure\n const fer = er as NodeJS.ErrnoException\n if (fer && fer.code !== 'EISDIR') {\n throw er\n }\n })\n }\n\n return opts.mkdirAsync(path, opts).then(\n () => made || path,\n async er => {\n const fer = er as NodeJS.ErrnoException\n if (fer && fer.code === 'ENOENT') {\n return mkdirpManual(parent, opts).then(\n (made?: string | undefined | void) => mkdirpManual(path, opts, made)\n )\n }\n if (fer && fer.code !== 'EEXIST' && fer.code !== 'EROFS') {\n throw er\n }\n return opts.statAsync(path).then(\n st => {\n if (st.isDirectory()) {\n return made\n } else {\n throw er\n }\n },\n () => {\n throw er\n }\n )\n }\n )\n },\n { sync: mkdirpManualSync }\n)\n", "import {\n MakeDirectoryOptions,\n mkdir,\n mkdirSync,\n stat,\n Stats,\n statSync,\n} from 'fs'\n\nexport interface FsProvider {\n stat?: (\n path: string,\n callback: (err: NodeJS.ErrnoException | null, stats: Stats) => any\n ) => any\n mkdir?: (\n path: string,\n opts: MakeDirectoryOptions & { recursive?: boolean },\n callback: (err: NodeJS.ErrnoException | null, made?: string) => any\n ) => any\n statSync?: (path: string) => Stats\n mkdirSync?: (\n path: string,\n opts: MakeDirectoryOptions & { recursive?: boolean }\n ) => string | undefined\n}\n\ninterface Options extends FsProvider {\n mode?: number | string\n fs?: FsProvider\n mkdirAsync?: (\n path: string,\n opts: MakeDirectoryOptions & { recursive?: boolean }\n ) => Promise<string | undefined>\n statAsync?: (path: string) => Promise<Stats>\n}\n\nexport type MkdirpOptions = Options | number | string\n\nexport interface MkdirpOptionsResolved {\n mode: number\n fs: FsProvider\n mkdirAsync: (\n path: string,\n opts: MakeDirectoryOptions & { recursive?: boolean }\n ) => Promise<string | undefined>\n statAsync: (path: string) => Promise<Stats>\n stat: (\n path: string,\n callback: (err: NodeJS.ErrnoException | null, stats: Stats) => any\n ) => any\n mkdir: (\n path: string,\n opts: MakeDirectoryOptions & { recursive?: boolean },\n callback: (err: NodeJS.ErrnoException | null, made?: string) => any\n ) => any\n statSync: (path: string) => Stats\n mkdirSync: (\n path: string,\n opts: MakeDirectoryOptions & { recursive?: boolean }\n ) => string | undefined\n recursive?: boolean\n}\n\nexport const optsArg = (opts?: MkdirpOptions): MkdirpOptionsResolved => {\n if (!opts) {\n opts = { mode: 0o777 }\n } else if (typeof opts === 'object') {\n opts = { mode: 0o777, ...opts }\n } else if (typeof opts === 'number') {\n opts = { mode: opts }\n } else if (typeof opts === 'string') {\n opts = { mode: parseInt(opts, 8) }\n } else {\n throw new TypeError('invalid options argument')\n }\n\n const resolved = opts as MkdirpOptionsResolved\n const optsFs = opts.fs || {}\n\n opts.mkdir = opts.mkdir || optsFs.mkdir || mkdir\n\n opts.mkdirAsync = opts.mkdirAsync\n ? opts.mkdirAsync\n : async (\n path: string,\n options: MakeDirectoryOptions & { recursive?: boolean }\n ): Promise<string | undefined> => {\n return new Promise<string | undefined>((res, rej) =>\n resolved.mkdir(path, options, (er, made) =>\n er ? rej(er) : res(made)\n )\n )\n }\n\n opts.stat = opts.stat || optsFs.stat || stat\n opts.statAsync = opts.statAsync\n ? opts.statAsync\n : async (path: string) =>\n new Promise((res, rej) =>\n resolved.stat(path, (err, stats) => (err ? rej(err) : res(stats)))\n )\n\n opts.statSync = opts.statSync || optsFs.statSync || statSync\n opts.mkdirSync = opts.mkdirSync || optsFs.mkdirSync || mkdirSync\n\n return resolved\n}\n", "import { dirname } from 'path'\nimport { findMade, findMadeSync } from './find-made.js'\nimport { mkdirpManual, mkdirpManualSync } from './mkdirp-manual.js'\nimport { MkdirpOptions, optsArg } from './opts-arg.js'\n\nexport const mkdirpNativeSync = (\n path: string,\n options?: MkdirpOptions\n): string | void | undefined => {\n const opts = optsArg(options)\n opts.recursive = true\n const parent = dirname(path)\n if (parent === path) {\n return opts.mkdirSync(path, opts)\n }\n\n const made = findMadeSync(opts, path)\n try {\n opts.mkdirSync(path, opts)\n return made\n } catch (er) {\n const fer = er as NodeJS.ErrnoException\n if (fer && fer.code === 'ENOENT') {\n return mkdirpManualSync(path, opts)\n } else {\n throw er\n }\n }\n}\n\nexport const mkdirpNative = Object.assign(\n async (\n path: string,\n options?: MkdirpOptions\n ): Promise<string | void | undefined> => {\n const opts = { ...optsArg(options), recursive: true }\n const parent = dirname(path)\n if (parent === path) {\n return await opts.mkdirAsync(path, opts)\n }\n\n return findMade(opts, path).then((made?: string | undefined) =>\n opts\n .mkdirAsync(path, opts)\n .then(m => made || m)\n .catch(er => {\n const fer = er as NodeJS.ErrnoException\n if (fer && fer.code === 'ENOENT') {\n return mkdirpManual(path, opts)\n } else {\n throw er\n }\n })\n )\n },\n { sync: mkdirpNativeSync }\n)\n", "import { dirname } from 'path'\nimport { MkdirpOptionsResolved } from './opts-arg.js'\n\nexport const findMade = async (\n opts: MkdirpOptionsResolved,\n parent: string,\n path?: string\n): Promise<undefined | string> => {\n // we never want the 'made' return value to be a root directory\n if (path === parent) {\n return\n }\n\n return opts.statAsync(parent).then(\n st => (st.isDirectory() ? path : undefined), // will fail later\n er => {\n const fer = er as NodeJS.ErrnoException\n return fer && fer.code === 'ENOENT'\n ? findMade(opts, dirname(parent), parent)\n : undefined\n }\n )\n}\n\nexport const findMadeSync = (\n opts: MkdirpOptionsResolved,\n parent: string,\n path?: string\n): undefined | string => {\n if (path === parent) {\n return undefined\n }\n\n try {\n return opts.statSync(parent).isDirectory() ? path : undefined\n } catch (er) {\n const fer = er as NodeJS.ErrnoException\n return fer && fer.code === 'ENOENT'\n ? findMadeSync(opts, dirname(parent), parent)\n : undefined\n }\n}\n", "const platform = process.env.__TESTING_MKDIRP_PLATFORM__ || process.platform\nimport { parse, resolve } from 'path'\nexport const pathArg = (path: string) => {\n if (/\\0/.test(path)) {\n // simulate same failure that node raises\n throw Object.assign(\n new TypeError('path must be a string without null bytes'),\n {\n path,\n code: 'ERR_INVALID_ARG_VALUE',\n }\n )\n }\n\n path = resolve(path)\n if (platform === 'win32') {\n const badWinChars = /[*|\"<>?:]/\n const { root } = parse(path)\n if (badWinChars.test(path.substring(root.length))) {\n throw Object.assign(new Error('Illegal characters in path.'), {\n path,\n code: 'EINVAL',\n })\n }\n }\n\n return path\n}\n", "import { mkdir, mkdirSync } from 'fs'\nimport { MkdirpOptions, optsArg } from './opts-arg.js'\n\nconst version = process.env.__TESTING_MKDIRP_NODE_VERSION__ || process.version\nconst versArr = version.replace(/^v/, '').split('.')\nconst hasNative = +versArr[0] > 10 || (+versArr[0] === 10 && +versArr[1] >= 12)\n\nexport const useNativeSync = !hasNative\n ? () => false\n : (opts?: MkdirpOptions) => optsArg(opts).mkdirSync === mkdirSync\n\nexport const useNative = Object.assign(\n !hasNative\n ? () => false\n : (opts?: MkdirpOptions) => optsArg(opts).mkdir === mkdir,\n {\n sync: useNativeSync,\n }\n)\n", "import { mkdirpManual, mkdirpManualSync } from './mkdirp-manual.js'\nimport { mkdirpNative, mkdirpNativeSync } from './mkdirp-native.js'\nimport { MkdirpOptions, optsArg } from './opts-arg.js'\nimport { pathArg } from './path-arg.js'\nimport { useNative, useNativeSync } from './use-native.js'\n/* c8 ignore start */\nexport { mkdirpManual, mkdirpManualSync } from './mkdirp-manual.js'\nexport { mkdirpNative, mkdirpNativeSync } from './mkdirp-native.js'\nexport { useNative, useNativeSync } from './use-native.js'\n/* c8 ignore stop */\n\nexport const mkdirpSync = (path: string, opts?: MkdirpOptions) => {\n path = pathArg(path)\n const resolved = optsArg(opts)\n return useNativeSync(resolved)\n ? mkdirpNativeSync(path, resolved)\n : mkdirpManualSync(path, resolved)\n}\n\nexport const sync = mkdirpSync\nexport const manual = mkdirpManual\nexport const manualSync = mkdirpManualSync\nexport const native = mkdirpNative\nexport const nativeSync = mkdirpNativeSync\nexport const mkdirp = Object.assign(\n async (path: string, opts?: MkdirpOptions) => {\n path = pathArg(path)\n const resolved = optsArg(opts)\n return useNative(resolved)\n ? mkdirpNative(path, resolved)\n : mkdirpManual(path, resolved)\n },\n {\n mkdirpSync,\n mkdirpNative,\n mkdirpNativeSync,\n mkdirpManual,\n mkdirpManualSync,\n\n sync: mkdirpSync,\n native: mkdirpNative,\n nativeSync: mkdirpNativeSync,\n manual: mkdirpManual,\n manualSync: mkdirpManualSync,\n useNative,\n useNativeSync,\n }\n)\n", "export class CwdError extends Error {\n path: string\n code: string\n syscall: 'chdir' = 'chdir'\n\n constructor(path: string, code: string) {\n super(`${code}: Cannot cd into '${path}'`)\n this.path = path\n this.code = code\n }\n\n get name() {\n return 'CwdError'\n }\n}\n", "export class SymlinkError extends Error {\n path: string\n symlink: string\n syscall: 'symlink' = 'symlink'\n code: 'TAR_SYMLINK_ERROR' = 'TAR_SYMLINK_ERROR'\n constructor(symlink: string, path: string) {\n super('TAR_SYMLINK_ERROR: Cannot extract through symbolic link')\n this.symlink = symlink\n this.path = path\n }\n get name() {\n return 'SymlinkError'\n }\n}\n", "// warning: extremely hot code path.\n// This has been meticulously optimized for use\n// within npm install on large package trees.\n// Do not edit without careful benchmarking.\nconst normalizeCache = Object.create(null)\nconst { hasOwnProperty } = Object.prototype\nexport const normalizeUnicode = (s: string) => {\n if (!hasOwnProperty.call(normalizeCache, s)) {\n normalizeCache[s] = s.normalize('NFD')\n }\n return normalizeCache[s]\n}\n", "// A path exclusive reservation system\n// reserve([list, of, paths], fn)\n// When the fn is first in line for all its paths, it\n// is called with a cb that clears the reservation.\n//\n// Used by async unpack to avoid clobbering paths in use,\n// while still allowing maximal safe parallelization.\n\nimport { join } from 'node:path'\nimport { normalizeUnicode } from './normalize-unicode.js'\nimport { stripTrailingSlashes } from './strip-trailing-slashes.js'\n\nconst platform =\n process.env.TESTING_TAR_FAKE_PLATFORM || process.platform\nconst isWindows = platform === 'win32'\n\nexport type Reservation = {\n paths: string[]\n dirs: Set<string>\n}\n\nexport type Handler = (clear: () => void) => void\n\n// return a set of parent dirs for a given path\n// '/a/b/c/d' -> ['/', '/a', '/a/b', '/a/b/c', '/a/b/c/d']\nconst getDirs = (path: string) => {\n const dirs = path\n .split('/')\n .slice(0, -1)\n .reduce((set: string[], path) => {\n const s = set[set.length - 1]\n if (s !== undefined) {\n path = join(s, path)\n }\n set.push(path || '/')\n return set\n }, [])\n return dirs\n}\n\nexport class PathReservations {\n // path => [function or Set]\n // A Set object means a directory reservation\n // A fn is a direct reservation on that path\n #queues = new Map<string, (Handler | Set<Handler>)[]>()\n\n // fn => {paths:[path,...], dirs:[path, ...]}\n #reservations = new Map<Handler, Reservation>()\n\n // functions currently running\n #running = new Set<Handler>()\n\n reserve(paths: string[], fn: Handler) {\n paths =\n isWindows ?\n ['win32 parallelization disabled']\n : paths.map(p => {\n // don't need normPath, because we skip this entirely for windows\n return stripTrailingSlashes(\n join(normalizeUnicode(p)),\n ).toLowerCase()\n })\n\n const dirs = new Set<string>(\n paths.map(path => getDirs(path)).reduce((a, b) => a.concat(b)),\n )\n this.#reservations.set(fn, { dirs, paths })\n for (const p of paths) {\n const q = this.#queues.get(p)\n if (!q) {\n this.#queues.set(p, [fn])\n } else {\n q.push(fn)\n }\n }\n for (const dir of dirs) {\n const q = this.#queues.get(dir)\n if (!q) {\n this.#queues.set(dir, [new Set([fn])])\n } else {\n const l = q[q.length - 1]\n if (l instanceof Set) {\n l.add(fn)\n } else {\n q.push(new Set([fn]))\n }\n }\n }\n return this.#run(fn)\n }\n\n // return the queues for each path the function cares about\n // fn => {paths, dirs}\n #getQueues(fn: Handler): {\n paths: Handler[][]\n dirs: (Handler | Set<Handler>)[][]\n } {\n const res = this.#reservations.get(fn)\n /* c8 ignore start */\n if (!res) {\n throw new Error('function does not have any path reservations')\n }\n /* c8 ignore stop */\n return {\n paths: res.paths.map((path: string) =>\n this.#queues.get(path),\n ) as Handler[][],\n dirs: [...res.dirs].map(path => this.#queues.get(path)) as (\n | Handler\n | Set<Handler>\n )[][],\n }\n }\n\n // check if fn is first in line for all its paths, and is\n // included in the first set for all its dir queues\n check(fn: Handler) {\n const { paths, dirs } = this.#getQueues(fn)\n return (\n paths.every(q => q && q[0] === fn) &&\n dirs.every(q => q && q[0] instanceof Set && q[0].has(fn))\n )\n }\n\n // run the function if it's first in line and not already running\n #run(fn: Handler) {\n if (this.#running.has(fn) || !this.check(fn)) {\n return false\n }\n this.#running.add(fn)\n fn(() => this.#clear(fn))\n return true\n }\n\n #clear(fn: Handler) {\n if (!this.#running.has(fn)) {\n return false\n }\n const res = this.#reservations.get(fn)\n /* c8 ignore start */\n if (!res) {\n throw new Error('invalid reservation')\n }\n /* c8 ignore stop */\n const { paths, dirs } = res\n\n const next = new Set<Handler>()\n for (const path of paths) {\n const q = this.#queues.get(path)\n /* c8 ignore start */\n if (!q || q?.[0] !== fn) {\n continue\n }\n /* c8 ignore stop */\n const q0 = q[1]\n if (!q0) {\n this.#queues.delete(path)\n continue\n }\n q.shift()\n if (typeof q0 === 'function') {\n next.add(q0)\n } else {\n for (const f of q0) {\n next.add(f)\n }\n }\n }\n\n for (const dir of dirs) {\n const q = this.#queues.get(dir)\n const q0 = q?.[0]\n /* c8 ignore next - type safety only */\n if (!q || !(q0 instanceof Set)) continue\n if (q0.size === 1 && q.length === 1) {\n this.#queues.delete(dir)\n continue\n } else if (q0.size === 1) {\n q.shift()\n // next one must be a function,\n // or else the Set would've been reused\n const n = q[0]\n if (typeof n === 'function') {\n next.add(n)\n }\n } else {\n q0.delete(fn)\n }\n }\n\n this.#running.delete(fn)\n next.forEach(fn => this.#run(fn))\n return true\n }\n}\n", "// tar -r\nimport { WriteStream, WriteStreamSync } from '@isaacs/fs-minipass'\nimport { Minipass } from 'minipass'\nimport fs from 'node:fs'\nimport path from 'node:path'\nimport { Header } from './header.js'\nimport { list } from './list.js'\nimport { makeCommand } from './make-command.js'\nimport {\n isFile,\n TarOptionsFile,\n TarOptionsSyncFile,\n} from './options.js'\nimport { Pack, PackSync } from './pack.js'\n\n// starting at the head of the file, read a Header\n// If the checksum is invalid, that's our position to start writing\n// If it is, jump forward by the specified size (round up to 512)\n// and try again.\n// Write the new Pack stream starting there.\n\nconst replaceSync = (opt: TarOptionsSyncFile, files: string[]) => {\n const p = new PackSync(opt)\n\n let threw = true\n let fd\n let position\n\n try {\n try {\n fd = fs.openSync(opt.file, 'r+')\n } catch (er) {\n if ((er as NodeJS.ErrnoException)?.code === 'ENOENT') {\n fd = fs.openSync(opt.file, 'w+')\n } else {\n throw er\n }\n }\n\n const st = fs.fstatSync(fd)\n const headBuf = Buffer.alloc(512)\n\n POSITION: for (\n position = 0;\n position < st.size;\n position += 512\n ) {\n for (let bufPos = 0, bytes = 0; bufPos < 512; bufPos += bytes) {\n bytes = fs.readSync(\n fd,\n headBuf,\n bufPos,\n headBuf.length - bufPos,\n position + bufPos,\n )\n\n if (\n position === 0 &&\n headBuf[0] === 0x1f &&\n headBuf[1] === 0x8b\n ) {\n throw new Error('cannot append to compressed archives')\n }\n\n if (!bytes) {\n break POSITION\n }\n }\n\n const h = new Header(headBuf)\n if (!h.cksumValid) {\n break\n }\n const entryBlockSize = 512 * Math.ceil((h.size || 0) / 512)\n if (position + entryBlockSize + 512 > st.size) {\n break\n }\n // the 512 for the header we just parsed will be added as well\n // also jump ahead all the blocks for the body\n position += entryBlockSize\n if (opt.mtimeCache && h.mtime) {\n opt.mtimeCache.set(String(h.path), h.mtime)\n }\n }\n threw = false\n\n streamSync(opt, p, position, fd, files)\n } finally {\n if (threw) {\n try {\n fs.closeSync(fd as number)\n } catch (er) {}\n }\n }\n}\n\nconst streamSync = (\n opt: TarOptionsSyncFile,\n p: Pack,\n position: number,\n fd: number,\n files: string[],\n) => {\n const stream = new WriteStreamSync(opt.file, {\n fd: fd,\n start: position,\n })\n p.pipe(stream as unknown as Minipass.Writable)\n addFilesSync(p, files)\n}\n\nconst replaceAsync = (\n opt: TarOptionsFile,\n files: string[],\n): Promise<void> => {\n files = Array.from(files)\n const p = new Pack(opt)\n\n const getPos = (\n fd: number,\n size: number,\n cb_: (er?: null | Error, pos?: number) => void,\n ) => {\n const cb = (er?: Error | null, pos?: number) => {\n if (er) {\n fs.close(fd, _ => cb_(er))\n } else {\n cb_(null, pos)\n }\n }\n\n let position = 0\n if (size === 0) {\n return cb(null, 0)\n }\n\n let bufPos = 0\n const headBuf = Buffer.alloc(512)\n const onread = (er?: null | Error, bytes?: number): void => {\n if (er || typeof bytes === 'undefined') {\n return cb(er)\n }\n bufPos += bytes\n if (bufPos < 512 && bytes) {\n return fs.read(\n fd,\n headBuf,\n bufPos,\n headBuf.length - bufPos,\n position + bufPos,\n onread,\n )\n }\n\n if (\n position === 0 &&\n headBuf[0] === 0x1f &&\n headBuf[1] === 0x8b\n ) {\n return cb(new Error('cannot append to compressed archives'))\n }\n\n // truncated header\n if (bufPos < 512) {\n return cb(null, position)\n }\n\n const h = new Header(headBuf)\n if (!h.cksumValid) {\n return cb(null, position)\n }\n\n /* c8 ignore next */\n const entryBlockSize = 512 * Math.ceil((h.size ?? 0) / 512)\n if (position + entryBlockSize + 512 > size) {\n return cb(null, position)\n }\n\n position += entryBlockSize + 512\n if (position >= size) {\n return cb(null, position)\n }\n\n if (opt.mtimeCache && h.mtime) {\n opt.mtimeCache.set(String(h.path), h.mtime)\n }\n bufPos = 0\n fs.read(fd, headBuf, 0, 512, position, onread)\n }\n fs.read(fd, headBuf, 0, 512, position, onread)\n }\n\n const promise = new Promise<void>((resolve, reject) => {\n p.on('error', reject)\n let flag = 'r+'\n const onopen = (\n er?: NodeJS.ErrnoException | null,\n fd?: number,\n ) => {\n if (er && er.code === 'ENOENT' && flag === 'r+') {\n flag = 'w+'\n return fs.open(opt.file, flag, onopen)\n }\n\n if (er || !fd) {\n return reject(er)\n }\n\n fs.fstat(fd, (er, st) => {\n if (er) {\n return fs.close(fd, () => reject(er))\n }\n\n getPos(fd, st.size, (er, position) => {\n if (er) {\n return reject(er)\n }\n const stream = new WriteStream(opt.file, {\n fd: fd,\n start: position,\n })\n p.pipe(stream as unknown as Minipass.Writable)\n stream.on('error', reject)\n stream.on('close', resolve)\n addFilesAsync(p, files)\n })\n })\n }\n fs.open(opt.file, flag, onopen)\n })\n\n return promise\n}\n\nconst addFilesSync = (p: Pack, files: string[]) => {\n files.forEach(file => {\n if (file.charAt(0) === '@') {\n list({\n file: path.resolve(p.cwd, file.slice(1)),\n sync: true,\n noResume: true,\n onReadEntry: entry => p.add(entry),\n })\n } else {\n p.add(file)\n }\n })\n p.end()\n}\n\nconst addFilesAsync = async (\n p: Pack,\n files: string[],\n): Promise<void> => {\n for (let i = 0; i < files.length; i++) {\n const file = String(files[i])\n if (file.charAt(0) === '@') {\n await list({\n file: path.resolve(String(p.cwd), file.slice(1)),\n noResume: true,\n onReadEntry: entry => p.add(entry),\n })\n } else {\n p.add(file)\n }\n }\n p.end()\n}\n\nexport const replace = makeCommand(\n replaceSync,\n replaceAsync,\n /* c8 ignore start */\n (): never => {\n throw new TypeError('file is required')\n },\n (): never => {\n throw new TypeError('file is required')\n },\n /* c8 ignore stop */\n (opt, entries) => {\n if (!isFile(opt)) {\n throw new TypeError('file is required')\n }\n\n if (\n opt.gzip ||\n opt.brotli ||\n opt.file.endsWith('.br') ||\n opt.file.endsWith('.tbr')\n ) {\n throw new TypeError('cannot append to compressed archives')\n }\n\n if (!entries?.length) {\n throw new TypeError('no paths specified to add/replace')\n }\n },\n)\n", "// tar -u\n\nimport { makeCommand } from './make-command.js'\nimport { type TarOptionsWithAliases } from './options.js'\n\nimport { replace as r } from './replace.js'\n\n// just call tar.r with the filter and mtimeCache\nexport const update = makeCommand(\n r.syncFile,\n r.asyncFile,\n r.syncNoFile,\n r.asyncNoFile,\n (opt, entries = []) => {\n r.validate?.(opt, entries)\n mtimeFilter(opt)\n },\n)\n\nconst mtimeFilter = (opt: TarOptionsWithAliases) => {\n const filter = opt.filter\n\n if (!opt.mtimeCache) {\n opt.mtimeCache = new Map()\n }\n\n opt.filter =\n filter ?\n (path, stat) =>\n filter(path, stat) &&\n !(\n /* c8 ignore start */\n (\n (opt.mtimeCache?.get(path) ?? stat.mtime ?? 0) >\n (stat.mtime ?? 0)\n )\n /* c8 ignore stop */\n )\n : (path, stat) =>\n !(\n /* c8 ignore start */\n (\n (opt.mtimeCache?.get(path) ?? stat.mtime ?? 0) >\n (stat.mtime ?? 0)\n )\n /* c8 ignore stop */\n )\n}\n", "/**\n * On posix systems, rename is atomic and will clobber anything in its way\n * However, on Windows, it can fail with the rather unhelpful EPERM error if\n * the target directory is not removed in time or is currently in use.\n *\n * While true atomic semantics is not available on Windows in this case, we can\n * at least implement the posix overwrite semantics by explicitly removing the\n * target when this error occurs.\n *\n * This is only relevant when renaming *directories*, since files will\n * generally not raise problems. When/if we rename directories outside of\n * package-info, this can be moved to its own shared module.\n * @module\n */\nconst { platform } = process\nimport type { PathLike } from 'node:fs'\nimport { rename as fsRename, rm } from 'node:fs/promises'\nexport const rename =\n platform !== 'win32' ? fsRename : (\n async function (\n oldPath: PathLike,\n newPath: PathLike,\n ): Promise<void> {\n let retries = 3\n const retry = async (er: unknown): Promise<void> => {\n if (\n retries > 0 &&\n (er as NodeJS.ErrnoException).code === 'EPERM'\n ) {\n retries--\n await rm(newPath, { recursive: true, force: true })\n return fsRename(oldPath, newPath).then(() => {}, retry)\n } else {\n throw er\n }\n }\n return fsRename(oldPath, newPath).then(() => {}, retry)\n }\n )\n", "import type { DepID } from '@vltpkg/dep-id'\nimport { error } from '@vltpkg/error-cause'\nimport type { Spec } from '@vltpkg/spec'\nimport {\n longDependencyTypes,\n shortDependencyTypes,\n dependencyTypes,\n} from '@vltpkg/types'\nimport type {\n Manifest,\n DependencyTypeLong,\n DependencyTypeShort,\n} from '@vltpkg/types'\n\nexport const isDependencyTypeShort = (\n obj: unknown,\n): obj is DependencyTypeShort =>\n shortDependencyTypes.has(obj as DependencyTypeShort)\n\nexport const asDependencyTypeShort = (\n obj: unknown,\n): DependencyTypeShort => {\n if (!isDependencyTypeShort(obj)) {\n throw error('Invalid dependency type', {\n found: obj,\n validOptions: [...shortDependencyTypes],\n })\n }\n return obj\n}\n\n/**\n * Dependency entries info as defined in a package.json file.\n */\nexport type RawDependency = {\n name: string\n bareSpec: string\n type: DependencyTypeLong\n registry?: string\n}\n\n/**\n * Parsed dependency entries info.\n */\nexport type Dependency = {\n /**\n * The parsed {@link Spec} object describing the dependency requirements.\n */\n spec: Spec\n /**\n * The {@link DependencyTypeShort}, describing the type of dependency.\n */\n type: DependencyTypeShort\n}\n\n/**\n * A `Map` in which keys are {@link DepID} linking to another `Map` in which\n * keys are the dependency names and values are {@link Dependency}. This\n * structure represents dependencies that need to be added to the importer\n * represented by {@link DepID}.\n *\n * The `modifiedDependencies` property can be used to indicate that there\n * are added dependencies to any of the importer nodes.\n */\nexport type AddImportersDependenciesMap = Map<\n DepID,\n Map<string, Dependency>\n> & { modifiedDependencies: boolean }\n\n/**\n * A `Map` object representing nodes to be removed from the ideal graph.\n * Each {@link DepID} key represents an importer node and the `Set` of\n * dependency names to be removed from its dependency list.\n *\n * The `modifiedDependencies` property can be used to indicate that there\n * are added dependencies to any of the importer nodes.\n */\nexport type RemoveImportersDependenciesMap = Map<\n DepID,\n Set<string>\n> & { modifiedDependencies: boolean }\n\nconst isObj = (o: unknown): o is Record<string, unknown> =>\n !!o && typeof o === 'object'\n\n// TODO: it would be nice to have a @vltpkg/spec.isSpec method\nexport const isDependency = (o: unknown): o is Dependency =>\n // TODO: it would be nice to have a @vltpkg/spec.isSpec method\n isObj(o) &&\n isObj(o.spec) &&\n !!o.spec.type &&\n isDependencyTypeShort(o.type)\n\nexport const asDependency = (obj: unknown): Dependency => {\n if (!isDependency(obj)) {\n throw error('Invalid dependency', { found: obj })\n }\n return obj\n}\n\n/**\n * Get the {@link DependencyTypeShort} from a {@link DependencyTypeLong}.\n */\nexport const shorten = (\n typeLong: DependencyTypeLong,\n name?: string,\n manifest?: Manifest,\n): DependencyTypeShort => {\n const shortName = dependencyTypes.get(typeLong)\n if (!shortName) {\n throw error('Invalid dependency type name', {\n found: typeLong,\n validOptions: [...longDependencyTypes],\n })\n }\n if (shortName !== 'peer') {\n return shortName\n }\n if (\n name &&\n manifest?.peerDependenciesMeta?.[name]?.optional === true\n ) {\n return 'peerOptional'\n }\n return 'peer'\n}\n", "import { getId, joinDepIDTuple } from '@vltpkg/dep-id'\nimport type { DepID } from '@vltpkg/dep-id'\nimport { error } from '@vltpkg/error-cause'\nimport { satisfies } from '@vltpkg/satisfies'\nimport { Spec } from '@vltpkg/spec'\nimport type { SpecOptions } from '@vltpkg/spec'\nimport type { Manifest, DependencyTypeShort } from '@vltpkg/types'\nimport type { Monorepo } from '@vltpkg/workspaces'\nimport { inspect } from 'util'\nimport type { InspectOptions } from 'util'\nimport type { Edge } from './edge.ts'\nimport { lockfileData } from './lockfile/save.ts'\nimport { Node } from './node.ts'\nimport type { NodeOptions } from './node.ts'\nimport type { GraphLike, NodeLike } from './types.ts'\n\nconst kCustomInspect = Symbol.for('nodejs.util.inspect.custom')\n\n// this is always the same, but we don't hard code it as a string,\n// in case the DepID module needs to change its delimiter again ever.\nconst mainDepID = joinDepIDTuple(['file', '.'])\n\nexport type ManifestInventory = Map<DepID, Manifest>\n\nconst getMap = <T extends Map<any, any>>(m?: T) =>\n m ?? (new Map() as T)\n\nexport type GraphOptions = SpecOptions & {\n /**\n * The main importer manifest info.\n */\n mainManifest: Manifest\n /**\n * An inventory of seen manifests.\n */\n manifests?: ManifestInventory\n /**\n * A {@link Monorepo} object, for managing workspaces\n */\n monorepo?: Monorepo\n /**\n * Root of the project this graph represents\n */\n projectRoot: string\n}\n\nexport class Graph implements GraphLike {\n get [Symbol.toStringTag]() {\n return '@vltpkg/graph.Graph'\n }\n\n #options: GraphOptions\n\n #nodeOptions: NodeOptions\n\n /**\n * A {@link Monorepo} instance, used for managing workspaces.\n */\n monorepo?: Monorepo\n\n /**\n * An inventory with all manifests related to an install.\n */\n manifests: ManifestInventory\n\n /**\n * A set of all edges in this graph.\n */\n edges = new Set<Edge>()\n\n /**\n * Map registered dep ids to the node that represent them in the graph.\n */\n nodes = new Map<DepID, Node>()\n\n /**\n * Map of nodes by their name\n */\n nodesByName = new Map<string, Set<Node>>()\n\n /**\n * Cached resolutions for spec lookups\n */\n resolutions = new Map<string, Node>()\n\n /**\n * Reverse map of resolutions\n */\n resolutionsReverse = new Map<Node, Set<string>>()\n\n /**\n * A set of importer nodes in this graph.\n */\n importers = new Set<Node>()\n\n /**\n * The {@link Node} that represents the project root `package.json`.\n */\n mainImporter: Node\n\n /**\n * A set of extraneous dependencies found when building the graph.\n */\n extraneousDependencies = new Set<Edge>()\n\n /**\n * The root of the project this graph represents\n */\n projectRoot: string\n\n constructor(options: GraphOptions) {\n const { mainManifest, monorepo } = options\n this.#options = options\n this.manifests = getMap(options.manifests)\n this.projectRoot = options.projectRoot\n this.#nodeOptions = {\n ...this.#options,\n graph: this,\n }\n\n // add the project root node\n const mainImporterLocation = '.'\n const mainImporterSpec = Spec.parse(\n mainManifest.name || '(root)',\n mainImporterLocation,\n )\n const mainImporter = this.addNode(\n mainDepID,\n mainManifest,\n mainImporterSpec,\n )\n mainImporter.setImporterLocation(mainImporterLocation)\n mainImporter.mainImporter = true\n this.mainImporter = mainImporter\n this.importers.add(mainImporter)\n this.manifests.set(mainImporter.id, mainManifest)\n\n // uses the monorepo instance in order to retrieve info on\n // workspaces and create importer nodes for each of them\n this.monorepo = monorepo\n if (this.monorepo) {\n for (const ws of this.monorepo) {\n const wsNode = this.addNode(\n ws.id,\n ws.manifest,\n undefined,\n ws.name,\n )\n wsNode.setImporterLocation(`./${ws.path}`)\n if (wsNode.manifest) {\n this.manifests.set(wsNode.id, wsNode.manifest)\n }\n this.importers.add(wsNode)\n }\n }\n }\n\n /**\n * Delete all nodes that are unreachable from the importers.\n * The collection of deleted nodes is returned.\n *\n * NOTE: This can be extremely slow for large graphs, and is almost always\n * unnecessary! Only call when it is known that some unreachable nodes may\n * have been created, for example when deleting the unneeded subgraph when an\n * optional node fails to resolve/install.\n */\n gc() {\n const { nodes } = this\n this.nodes = new Map()\n const marked = new Set(this.importers)\n for (const imp of marked) {\n // don't delete the importer!\n nodes.delete(imp.id)\n this.nodes.set(imp.id, imp)\n for (const { to } of imp.edgesOut.values()) {\n if (!to || marked.has(to)) continue\n marked.add(to)\n nodes.delete(to.id)\n this.nodes.set(to.id, to)\n }\n }\n for (const node of nodes.values()) {\n this.removeNode(node)\n }\n return nodes\n }\n\n /**\n * Create a new edge between two nodes of the graph in case both exist,\n * in case the destination node does not exists, then a dangling edge,\n * pointing to nothing will be created to represent that missing dependency.\n */\n addEdge(\n type: DependencyTypeShort,\n spec: Spec,\n from: NodeLike,\n to?: NodeLike,\n ) {\n // fix any nameless spec\n if (spec.name === '(unknown)') {\n if (to) {\n spec.name = to.name /* c8 ignore next */ || '(unknown)'\n spec.spec = `${to.name}@${spec.bareSpec}`\n } else {\n throw error(\n 'Impossible to place a missing, nameless dependency',\n { spec },\n )\n }\n }\n const existing = from.edgesOut.get(spec.name)\n if (existing) {\n const edge = existing as Edge\n if (\n edge.type === type &&\n edge.spec.bareSpec === spec.bareSpec\n ) {\n if (to && to !== edge.to) {\n edge.to = to as Node\n edge.to.edgesIn.add(edge)\n }\n return edge\n }\n this.edges.delete(edge)\n }\n const f = from as Node\n const edgeOut = f.addEdgesTo(type, spec, to as Node | undefined)\n this.edges.add(edgeOut)\n return edgeOut\n }\n\n /**\n * Find an existing node to satisfy a dependency\n */\n findResolution(spec: Spec, fromNode: Node) {\n const f = spec.final\n // if it's a file: dep, then the fromNode location matters\n const fromPref =\n f.type === 'file' ? fromNode.location + ' : ' : ''\n const sf = fromPref + String(f)\n const cached = this.resolutions.get(sf)\n if (cached) return cached\n const nbn = this.nodesByName.get(f.name)\n if (!nbn) return undefined\n for (const node of nbn) {\n if (\n satisfies(\n node.id,\n f,\n fromNode.location,\n this.projectRoot,\n this.monorepo,\n )\n ) {\n this.resolutions.set(sf, node)\n // always set by now, because the node was added at some point\n this.resolutionsReverse.get(node)?.add(sf)\n return node\n }\n }\n }\n\n /**\n * Create a new node in the graph.\n */\n addNode(\n id?: DepID,\n manifest?: Manifest,\n spec?: Spec,\n name?: string,\n version?: string,\n ) {\n const node = new Node(\n this.#nodeOptions,\n id,\n manifest,\n spec,\n name,\n version,\n )\n this.nodes.set(node.id, node)\n const nbn = this.nodesByName.get(node.name) ?? new Set()\n nbn.add(node)\n this.nodesByName.set(node.name, nbn)\n if (spec) {\n const f = String(spec.final)\n // if it's a file: type, then that is fromNode-specific,\n // so we can't shortcut add it here.\n if (spec.final.type !== 'file') {\n this.resolutions.set(f, node)\n const rrev = this.resolutionsReverse.get(node) ?? new Set()\n rrev.add(f)\n this.resolutionsReverse.set(node, rrev)\n }\n }\n if (manifest) {\n this.manifests.set(node.id, manifest)\n }\n return node\n }\n\n /**\n * Place a new package into the graph representation, creating the new\n * edges and possibly new nodes that are to be expected when traversing\n * the graph in a top-down direction, e.g: from importers to leafs.\n *\n * For different uses that are not a direct top-down traversal of the graph\n * consider using `addNode()` and `addEdge()` instead.\n */\n placePackage(\n fromNode: Node,\n depType: DependencyTypeShort,\n spec: Spec,\n manifest?: Manifest,\n id?: DepID,\n ) {\n // if no manifest is available, then create an edge that has no\n // reference to any other node, representing a missing dependency\n if (!manifest && !id) {\n this.addEdge(depType, spec, fromNode)\n return\n }\n\n // flags set on the node we're about to create or find.\n const flags = {\n dev: fromNode.dev || depType === 'dev',\n optional:\n fromNode.optional ||\n depType === 'optional' ||\n depType === 'peerOptional',\n }\n\n const depId = id || (manifest && getId(spec, manifest))\n\n /* c8 ignore start - should not be possible */\n if (!depId) {\n throw error('Could not find dep id when placing package', {\n spec,\n manifest,\n })\n }\n /* c8 ignore stop */\n\n // if a node for this package is already represented by a node\n // in the graph, then just creates a new edge to that node\n const toFoundNode = this.nodes.get(depId)\n if (toFoundNode) {\n this.addEdge(depType, spec, fromNode, toFoundNode)\n // the current only stays dev/optional if this dep lets it remain so\n // if it's not already, we don't make it dev or optional.\n toFoundNode.dev &&= flags.dev\n toFoundNode.optional &&= flags.optional\n return toFoundNode\n }\n\n // creates a new node and edges to its parent\n const toNode = this.addNode(depId, manifest)\n toNode.registry = spec.registry\n toNode.dev = flags.dev\n toNode.optional = flags.optional\n this.addEdge(depType, spec, fromNode, toNode)\n return toNode\n }\n\n /**\n * Removes a node and its relevant edges from the graph.\n *\n * If a replacement is provided, then any edges that were previously\n * pointing to the removed node will be directed to the replacement,\n * if it is valid to do so.\n */\n removeNode(node: Node, replacement?: Node) {\n this.nodes.delete(node.id)\n const nbn = this.nodesByName.get(node.name)\n // if it's the last one, just remove the set\n if (nbn?.size === 1) this.nodesByName.delete(node.name)\n else nbn?.delete(node)\n for (const r of this.resolutionsReverse.get(node) ?? new Set()) {\n this.resolutions.delete(r)\n }\n this.resolutionsReverse.delete(node)\n this.manifests.delete(node.id)\n for (const edge of node.edgesOut.values()) {\n this.edges.delete(edge)\n }\n for (const edge of node.edgesIn) {\n if (\n replacement &&\n satisfies(\n replacement.id,\n edge.spec,\n edge.from.location,\n this.projectRoot,\n this.monorepo,\n )\n ) {\n edge.to = replacement\n } else {\n edge.from.edgesOut.delete(edge.spec.name)\n this.edges.delete(edge)\n }\n }\n }\n\n toJSON() {\n return lockfileData({\n ...this.#options,\n graph: this,\n saveManifests: true,\n })\n }\n\n [kCustomInspect](_: number, options: InspectOptions) {\n const data = this.toJSON()\n return `${this[Symbol.toStringTag]} ${inspect(data, options)}`\n }\n}\n", "import type { DepID } from '@vltpkg/dep-id'\nimport {\n defaultRegistry,\n defaultRegistries,\n defaultGitHosts,\n defaultGitHostArchives,\n defaultScopeRegistries,\n} from '@vltpkg/spec'\nimport type { SpecOptions } from '@vltpkg/spec'\nimport { mkdirSync, writeFileSync } from 'node:fs'\nimport { dirname, resolve } from 'node:path'\nimport type { Edge } from '../edge.ts'\nimport type { Graph } from '../graph.ts'\nimport type { Node } from '../node.ts'\nimport { getFlagNumFromNode } from './types.ts'\nimport type {\n LockfileData,\n LockfileEdgeKey,\n LockfileEdges,\n LockfileEdgeValue,\n LockfileNode,\n} from './types.ts'\n\nexport type SaveOptions = SpecOptions & {\n /**\n * The graph to be stored in the lockfile.\n */\n graph: Graph\n /**\n * Should it save manifest data in the lockfile?\n */\n saveManifests?: boolean\n}\n\nconst formatNodes = (\n nodes: Iterable<Node>,\n saveManifests?: boolean,\n registry?: string,\n) => {\n // we do not store importers in the lockfile, though we do store\n // their edges. when we load, we always read workspaces/main fresh.\n const arr: Node[] = [...nodes].filter(node => !node.importer)\n // nodes are sorted in order to have a deterministic result\n const orderedNodes: Node[] = arr.sort((a, b) =>\n a.id.localeCompare(b.id, 'en'),\n )\n\n const res: Record<DepID, LockfileNode> = {}\n for (const node of orderedNodes) {\n const customRegistry =\n node.resolved && registry && !node.resolved.startsWith(registry)\n const resolved = customRegistry ? node.resolved : undefined\n // if it's in a location other than the default, stash that\n const location =\n (\n node.id.startsWith('file') ||\n node.location.endsWith(\n '/node_modules/.vlt/' +\n node.id +\n '/node_modules/' +\n node.name,\n )\n ) ?\n undefined\n : node.location\n\n const flags = getFlagNumFromNode(node)\n const lockfileNode: LockfileNode = [flags, node.name]\n\n if (node.integrity) {\n lockfileNode[2] = node.integrity\n }\n\n if (resolved) {\n lockfileNode[3] = resolved\n }\n\n if (location) {\n lockfileNode[4] = location\n }\n\n if (saveManifests) {\n lockfileNode[5] = node.manifest\n }\n\n res[node.id] = lockfileNode\n }\n return res\n}\n\nconst formatEdges = (edges: Set<Edge>): LockfileEdges =>\n Object.fromEntries(\n [...edges]\n .sort(\n (a, b) =>\n /* c8 ignore start - nondeterminstic and annoying to test */\n // sort importers to the top, then alphabetically by\n // id, type, target\n Number(b.from.importer) - Number(a.from.importer) ||\n a.from.id.localeCompare(b.from.id, 'en') ||\n a.type.localeCompare(b.type, 'en') ||\n (a.to?.id ?? '').localeCompare(b.to?.id ?? ''),\n /* c8 ignore stop */\n )\n .map((edge): [LockfileEdgeKey, LockfileEdgeValue] => [\n `${edge.from.id} ${edge.spec.name}`,\n `${edge.type} ${edge.spec.bareSpec || '*'} ${edge.to?.id ?? 'MISSING'}`,\n ]),\n )\n\nconst isRecordStringString = (\n registries: unknown,\n): registries is Record<string, string> =>\n !(!registries || typeof registries === 'string')\n\nconst removeDefaultItems = (\n defaultItems: Record<string, string>,\n items: Record<string, string>,\n) => {\n const res: Record<string, string> = {}\n for (const [key, value] of Object.entries(items)) {\n if (!defaultItems[key] || defaultItems[key] !== value) {\n res[key] = value\n }\n }\n return res\n}\n\nexport const lockfileData = ({\n graph,\n 'git-hosts': gitHosts,\n 'git-host-archives': gitHostArchives,\n registry,\n registries,\n saveManifests,\n 'scope-registries': scopeRegistries,\n}: SaveOptions): LockfileData => {\n const cleanGitHosts =\n isRecordStringString(gitHosts) ?\n removeDefaultItems(defaultGitHosts, gitHosts)\n : undefined\n const cleanGitHostArchives =\n isRecordStringString(gitHostArchives) ?\n removeDefaultItems(defaultGitHostArchives, gitHostArchives)\n : undefined\n const cleanRegistries =\n isRecordStringString(registries) ?\n removeDefaultItems(defaultRegistries, registries)\n : undefined\n const cleanScopeRegistries =\n isRecordStringString(scopeRegistries) ?\n removeDefaultItems(defaultScopeRegistries, scopeRegistries)\n : undefined\n const hasItems = (clean: Record<string, string> | undefined) =>\n clean && Object.keys(clean).length\n return {\n options: {\n ...(hasItems(cleanScopeRegistries) ?\n { 'scope-registries': cleanScopeRegistries }\n : undefined),\n ...(registry !== undefined && registry !== defaultRegistry ?\n { registry }\n : undefined),\n ...(hasItems(registries) ?\n { registries: cleanRegistries }\n : undefined),\n ...(hasItems(cleanGitHosts) ?\n { 'git-hosts': cleanGitHosts }\n : undefined),\n ...(hasItems(cleanGitHostArchives) ?\n { 'git-host-archives': cleanGitHostArchives }\n : undefined),\n },\n nodes: formatNodes(graph.nodes.values(), saveManifests, registry),\n edges: formatEdges(graph.edges),\n }\n}\n\n// renders each node / edge as a single line entry\nconst extraFormat = (jsonString: string) => {\n const str = `${jsonString}\\n`\n const [init, ...parts] = str.split(' \"nodes\": {')\n const res = [init]\n for (const part of parts) {\n res.push(\n part.replaceAll('\\n ', '').replaceAll('\\n ]', ']'),\n )\n }\n return res.join(' \"nodes\": {')\n}\n\nexport const saveData = (\n data: LockfileData,\n fileName: string,\n saveManifests = false,\n) => {\n const json = JSON.stringify(data, null, 2)\n const content = saveManifests ? json : extraFormat(json)\n writeFileSync(fileName, content)\n}\n\nexport const save = (options: SaveOptions) => {\n const { graph } = options\n const data = lockfileData({ ...options, saveManifests: false })\n const fileName = resolve(graph.projectRoot, 'vlt-lock.json')\n return saveData(data, fileName, false)\n}\n\nexport const saveHidden = (options: SaveOptions) => {\n const { graph } = options\n const data = lockfileData({ ...options, saveManifests: true })\n const fileName = resolve(\n graph.projectRoot,\n 'node_modules/.vlt-lock.json',\n )\n mkdirSync(dirname(fileName), { recursive: true })\n return saveData(data, fileName, true)\n}\n", "import type { DepID } from '@vltpkg/dep-id'\nimport type { Spec, SpecOptions } from '@vltpkg/spec'\nimport type {\n Integrity,\n Manifest,\n DependencyTypeShort,\n} from '@vltpkg/types'\nimport type { Graph } from '../graph.ts'\n\n/**\n * This is the main type definition for the contents of the\n * `vlt-lock.json` file.\n *\n * The nodes and edges information from the lockfile are used to reconstruct\n * a {@link Graph} representing a previous install.\n */\nexport type LockfileData = {\n options: SpecOptions\n nodes: Record<DepID, LockfileNode>\n edges: LockfileEdges\n}\n\nexport const getFlagNumFromNode = (node: {\n optional?: boolean\n dev?: boolean\n}) =>\n node.optional && node.dev ? LockfileNodeFlagDevOptional\n : node.optional ? LockfileNodeFlagOptional\n : node.dev ? LockfileNodeFlagDev\n : LockfileNodeFlagNone\n\nexport const getBooleanFlagsFromNum = (flags: LockfileNodeFlags) => ({\n dev: !!(flags & LockfileNodeFlagDev),\n optional: !!(flags & LockfileNodeFlagOptional),\n})\n\nexport const LockfileNodeFlagNone = 0\nexport const LockfileNodeFlagOptional = 1\nexport const LockfileNodeFlagDev = 2\nexport const LockfileNodeFlagDevOptional = 3\n\n/**\n * Bit flags indicating whether a node is optional and/or dev.\n */\nexport type LockfileNodeFlags = 0 | 1 | 2 | 3\n\n/**\n * Lockfile representation of a node from the install graph.\n */\nexport type LockfileNode = [\n flags: LockfileNodeFlags,\n name?: string | null,\n integrity?: Integrity | null,\n resolved?: string | null,\n location?: string | null,\n manifest?: Manifest | null,\n]\n\n/**\n * Lockfile edges are stored as a record object where the key\n * is `${from.id} ${spec.name}` and the value is\n * `${type} ${spec.bareSpec} ${to.id | 'MISSING'}`\n *\n * Storing them in a record like this means that we are guaranteed to\n * never end up with duplicates, and a standard `JSON.stringify()`\n * will nicely print them out one line per edge.\n */\nexport type LockfileEdges = {\n [key: LockfileEdgeKey]: LockfileEdgeValue\n}\n\n/** `${from} ${dep name}` */\nexport type LockfileEdgeKey = `${DepID} ${string}`\n\n/** `${type} ${spec} ${to}` */\nexport type LockfileEdgeValue =\n `${DependencyTypeShort} ${Spec['bareSpec']} ${DepID | 'MISSING'}`\n", "import { PackageJson } from '@vltpkg/package-json'\nimport type { Manifest } from '@vltpkg/types'\nimport { Monorepo } from '@vltpkg/workspaces'\nimport type { SpecOptions } from '@vltpkg/spec'\nimport { readFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport type { PathScurry } from 'path-scurry'\nimport { loadEdges } from './load-edges.ts'\nimport { loadNodes } from './load-nodes.ts'\nimport { Graph } from '../graph.ts'\nimport type { LockfileData } from './types.ts'\n\nexport type LoadOptions = SpecOptions & {\n /**\n * The project root dirname.\n */\n projectRoot: string\n /**\n * The project root manifest.\n */\n mainManifest: Manifest\n /**\n * A {@link Monorepo} object, for managing workspaces\n */\n monorepo?: Monorepo\n /**\n * A {@link PackageJson} object, for sharing manifest caches\n */\n packageJson?: PackageJson\n /**\n * A {@link PathScurry} object, for use in globs\n */\n scurry?: PathScurry\n}\n\nconst loadLockfile = (projectRoot: string, lockfilePath: string) =>\n JSON.parse(\n readFileSync(resolve(projectRoot, lockfilePath), {\n encoding: 'utf8',\n }),\n ) as LockfileData\n\nexport const load = (options: LoadOptions): Graph => {\n const { projectRoot } = options\n return loadObject(\n options,\n loadLockfile(projectRoot, 'vlt-lock.json'),\n )\n}\n\nexport const loadHidden = (options: LoadOptions): Graph => {\n const { projectRoot } = options\n return loadObject(\n options,\n loadLockfile(projectRoot, 'node_modules/.vlt-lock.json'),\n )\n}\n\nexport const loadObject = (\n options: LoadOptions,\n lockfileData: LockfileData,\n) => {\n const { mainManifest, scurry } = options\n const packageJson = options.packageJson ?? new PackageJson()\n const monorepo =\n options.monorepo ??\n Monorepo.maybeLoad(options.projectRoot, { packageJson, scurry })\n const {\n 'scope-registries': scopeRegistries,\n registry,\n registries,\n 'git-hosts': gitHosts,\n 'git-host-archives': gitHostArchives,\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n } = lockfileData.options || {}\n const mergedOptions = {\n ...options,\n 'scope-registries': {\n ...options['scope-registries'],\n ...scopeRegistries,\n },\n registry: registry ?? options.registry,\n registries: {\n ...options.registries,\n ...registries,\n },\n 'git-hosts': {\n ...options['git-hosts'],\n ...gitHosts,\n },\n 'git-host-archives': {\n ...options['git-host-archives'],\n ...gitHostArchives,\n },\n }\n const graph = new Graph({\n ...mergedOptions,\n mainManifest,\n monorepo,\n })\n\n loadNodes(graph, lockfileData.nodes)\n loadEdges(graph, lockfileData.edges, mergedOptions)\n\n return graph\n}\n", "import { asDepID } from '@vltpkg/dep-id/browser'\nimport { error } from '@vltpkg/error-cause'\nimport { fastSplit } from '@vltpkg/fast-split'\nimport { Spec } from '@vltpkg/spec/browser'\nimport type { SpecOptions } from '@vltpkg/spec/browser'\nimport { longDependencyTypes } from '@vltpkg/types'\nimport { isDependencyTypeShort } from '../dependencies.ts'\nimport type { GraphLike } from '../types.ts'\nimport type {\n LockfileData,\n LockfileEdgeKey,\n LockfileEdgeValue,\n} from './types.ts'\n\nexport const loadEdges = (\n graph: GraphLike,\n edges: LockfileData['edges'],\n options: SpecOptions,\n) => {\n const entries = Object.entries(edges) as [\n LockfileEdgeKey,\n LockfileEdgeValue,\n ][]\n for (const [key, value] of entries) {\n const [fromId, specName] = fastSplit(key, ' ', 2)\n const [depType, valRest] = fastSplit(value, ' ', 2)\n const vrSplit = valRest?.lastIndexOf(' ') ?? -1\n // not a valid edge record\n /* c8 ignore start */\n if (!valRest || !depType || !fromId || !specName || vrSplit < 1) {\n continue\n }\n /* c8 ignore stop */\n const spec = Spec.parse(\n specName,\n valRest.substring(0, vrSplit),\n options,\n )\n const toId = valRest.substring(vrSplit + 1)\n const from = graph.nodes.get(asDepID(fromId))\n if (!from) {\n throw error('Edge info missing its `from` node', {\n found: {\n nodes: [...graph.nodes].map(([id]) => id),\n from,\n fromId,\n edge: { [key]: value },\n },\n })\n }\n const to =\n toId === 'MISSING' ? undefined : graph.nodes.get(asDepID(toId))\n if (!isDependencyTypeShort(depType)) {\n throw error('Found unsupported dependency type in lockfile', {\n validOptions: [...longDependencyTypes],\n })\n }\n graph.addEdge(depType, spec, from, to)\n }\n}\n", "import { splitDepID } from '@vltpkg/dep-id/browser'\nimport { getBooleanFlagsFromNum } from './types.ts'\nimport type { LockfileData, LockfileNode } from './types.ts'\nimport type { DepID } from '@vltpkg/dep-id'\nimport type { GraphLike } from '../types.ts'\n\nexport const loadNodes = (\n graph: GraphLike,\n nodes: LockfileData['nodes'],\n) => {\n const entries = Object.entries(nodes) as [DepID, LockfileNode][]\n for (const [id, lockfileNode] of entries) {\n // workspace nodes and the project root node are already part of the\n // graph and it should not create new nodes if an existing one is there\n if (graph.nodes.has(id)) continue\n\n const [flags, name, integrity, resolved, location, manifest] =\n lockfileNode\n const [type, , spec] = splitDepID(id)\n\n // if the lockfile has manifest data then it should just use that\n // otherwise tries to infer name / version value from the lockfile node\n const node =\n manifest ?\n graph.addNode(id, manifest)\n : graph.addNode(\n id,\n undefined,\n undefined,\n name ?? undefined,\n type === 'registry' && spec.indexOf('@') > 0 ?\n spec.split('@').slice(-1)[0]\n : undefined,\n )\n\n const { dev, optional } = getBooleanFlagsFromNum(flags)\n node.dev = dev\n node.optional = optional\n node.integrity = integrity ?? undefined\n node.resolved = resolved ?? undefined\n if (!node.resolved) node.setResolved()\n if (location) node.location = location\n }\n}\n", "import { asDepID, hydrate, joinDepIDTuple } from '@vltpkg/dep-id'\nimport type { DepID } from '@vltpkg/dep-id'\nimport type { PackageJson } from '@vltpkg/package-json'\nimport { Spec } from '@vltpkg/spec'\nimport type { SpecOptions } from '@vltpkg/spec'\nimport { longDependencyTypes } from '@vltpkg/types'\nimport type { Manifest } from '@vltpkg/types'\nimport type { Monorepo } from '@vltpkg/workspaces'\nimport type { Path, PathScurry } from 'path-scurry'\nimport { shorten } from '../dependencies.ts'\nimport type { RawDependency } from '../dependencies.ts'\nimport { Graph } from '../graph.ts'\nimport { loadHidden } from '../lockfile/load.ts'\nimport type { Node } from '../node.ts'\nimport { graphStep } from '@vltpkg/output'\n\nexport type LoadOptions = SpecOptions & {\n /**\n * The project root dirname.\n */\n projectRoot: string\n /**\n * The project root manifest.\n */\n mainManifest?: Manifest\n /**\n * A {@link Monorepo} object, for managing workspaces\n */\n monorepo?: Monorepo\n /**\n * A {@link PackageJson} object, for sharing manifest caches\n */\n packageJson: PackageJson\n /**\n * A {@link PathScurry} object, for use in globs\n */\n scurry: PathScurry\n /**\n * If set to `false`, `actual.load` will not load any `package.json`\n * files while traversing the file system.\n *\n * The resulting {@link Graph} from loading with `loadManifests=false`\n * has no information on dependency types or the specs defined and\n * no information on missing and extraneous dependencies.\n */\n loadManifests?: boolean\n /**\n * If set to `true`, then do not shortcut the process by reading the\n * hidden lockfile at `node_modules/.vlt-lock.json`\n */\n skipHiddenLockfile?: boolean\n}\n\nexport type ReadEntry = {\n alias: string\n name: string\n realpath: Path\n}\n\nconst pathBasedType = new Set(['file', 'workspace'])\nconst isPathBasedType = (\n type: string,\n): type is 'file' | 'workspace' => pathBasedType.has(type)\nconst getPathBasedId = (\n spec: Spec,\n path: string,\n): DepID | undefined =>\n isPathBasedType(spec.type) ?\n joinDepIDTuple([spec.type, path])\n : undefined\n\n/**\n * Retrieve the {@link DepID} for a given package from its location.\n */\nconst findDepID = ({ parent, name }: Path): DepID | undefined =>\n parent?.name === '.vlt' ? asDepID(name)\n : parent?.isCWD === false ? findDepID(parent)\n : undefined\n\n/**\n * Retrieves the closest `node_modules` parent {@link Path} found.\n */\nconst findNodeModules = ({\n parent,\n name,\n isCWD,\n}: Path): Path | undefined =>\n parent?.name === 'node_modules' ? parent\n : parent && name !== '.vlt' && !isCWD ? findNodeModules(parent)\n : undefined\n\n/**\n * Retrieves the scoped-normalized package name from its {@link Path}.\n */\nconst findName = ({ parent, name }: Path): string =>\n parent?.name.startsWith('@') ? `${parent.name}/${name}` : name\n\nconst isStringArray = (a: unknown): a is string[] =>\n Array.isArray(a) && !a.some(b => typeof b !== 'string')\n\n/*\n * Retrieves a map of all dependencies, of all types, that can be iterated\n * on and consulted when parsing the directory contents of the current node.\n */\nconst getDeps = (node: Node) => {\n const dependencies = new Map<string, RawDependency>()\n const bundleDeps: unknown = node.manifest?.bundleDependencies ?? []\n // if it's an importer, bundleDeps are just normal. if it's a dep,\n // then they're ignored entirely.\n const bundled =\n (\n !node.importer &&\n !node.id.startsWith('git') &&\n isStringArray(bundleDeps)\n ) ?\n new Set(bundleDeps)\n : new Set<string>()\n for (const depType of longDependencyTypes) {\n const obj: Record<string, string> | undefined =\n node.manifest?.[depType]\n // only care about devDeps for importers and git or symlink deps\n // technically this will also include devDeps for tarball file: specs,\n // but that is likely rare enough to not worry about too much.\n if (\n depType === 'devDependencies' &&\n !node.importer &&\n !node.id.startsWith('git') &&\n !node.id.startsWith('file')\n ) {\n continue\n }\n if (obj) {\n for (const [name, bareSpec] of Object.entries(obj)) {\n // if it's a bundled dependency, we just ignore it entirely.\n if (bundled.has(name)) continue\n dependencies.set(name, {\n name,\n type: depType,\n bareSpec,\n registry: node.registry,\n })\n }\n }\n }\n return dependencies\n}\n\n/**\n * Reads the current directory defined at `currDir` and looks for folder\n * names and their realpath resolution, normalizing scoped package names\n * and removing any invalid symlinks from the list of items that should\n * be parsed through in order to build the graph.\n */\nconst readDir = (\n scurry: PathScurry,\n currDir: Path,\n fromNodeName?: string,\n) => {\n const res = new Set<ReadEntry>()\n for (const entry of scurry.readdirSync(currDir)) {\n // ignore any hidden files / folders\n if (entry.name.startsWith('.')) continue\n\n // scope folder found, it will need to be read and iterated over\n // in order to find any scoped packages inside\n if (entry.name.startsWith('@')) {\n const scopedItems = readDir(scurry, entry, fromNodeName)\n for (const scopedItem of scopedItems) {\n res.add(scopedItem)\n }\n continue\n }\n\n // skip anything that isn't a symlink, it's not an edge\n if (!entry.isSymbolicLink()) continue\n\n // we'll need to learn what is the real path for this entry in order\n // to retrieve the `location` and `id` properties for the node, if a\n // realpath is not found just move on to the next element\n const realpath = entry.realpathSync()\n if (!realpath) {\n continue\n }\n\n // infer both the alias and proper package names, including scopes\n const alias = findName(entry)\n const name = findName(realpath)\n res.add({\n alias,\n name,\n realpath,\n })\n }\n return res\n}\n\n/**\n * Parses the files located at `currDir` and place packages found inside\n * as dependencies of `fromNode`, building the instantiated `graph`.\n */\nconst parseDir = (\n options: LoadOptions,\n scurry: PathScurry,\n packageJson: PackageJson,\n depsFound: Map<Node, Path>,\n graph: Graph,\n fromNode: Node,\n currDir: Path,\n) => {\n const { loadManifests } = options\n const dependencies = getDeps(fromNode)\n const seenDeps = new Set<string>()\n const readItems: Set<ReadEntry> = readDir(\n scurry,\n currDir,\n fromNode.name,\n )\n\n for (const { alias, name, realpath } of readItems) {\n let node\n\n // tracks what dependencies have been seen\n // so that we can mark missing dependencies\n seenDeps.add(alias)\n\n // places the package in the graph reading\n // its manifest only if necessary\n if (!loadManifests) {\n const depId = findDepID(realpath)\n\n if (depId) {\n const h = hydrate(depId, alias, {\n ...options,\n registry: fromNode.registry,\n })\n\n // graphs build with no manifest have no notion of\n // dependency types and or spec definitions since those\n // would have to be parsed from a manifest\n node = graph.placePackage(\n fromNode,\n 'prod', // defaults to prod deps\n h, // uses spec from hydrated id\n {\n name,\n ...(h.registrySpec ?\n { version: h.registrySpec } // adds version if available\n : null),\n },\n depId,\n )\n }\n }\n\n // retrieve references to the current folder name found in `fromNode`\n // manifest listed dependencies, removing it from the map will leave\n // a list of missing dependencies at the end of the iteration\n const deps = dependencies.get(alias)\n\n // in case this graph is skipping manifests, this next block might\n // still need to execute, thus actually loading a manifest file, for\n // edge-cases such as loading a linked node that is not going to have\n // DepID info available in its realpath or extraneous nodes\n if (!node) {\n const mani = packageJson.read(realpath.fullpath())\n // declares fallback default values for both depType and bareSpec\n // in order to support loadManifests=false fallback for link nodes\n const type = deps?.type || 'dependencies'\n const bareSpec = deps?.bareSpec || '*'\n\n const depType = shorten(type, alias, fromNode.manifest)\n const spec = Spec.parse(alias, bareSpec, {\n ...options,\n registry: fromNode.registry,\n })\n const maybeId = getPathBasedId(spec, realpath.relativePosix())\n node = graph.placePackage(\n fromNode,\n depType,\n spec,\n mani,\n maybeId,\n )\n }\n\n if (node) {\n // If a found dependency is not declared in any of the original\n // node dependencies, then add an edge to the graph pointing to it\n // and mark it as extraneous.\n //\n // This only makes sense if full manifests are being loaded\n // so that we have reference to dependencies info.\n if (loadManifests && !deps) {\n const [edge] = node.edgesIn\n if (edge) {\n graph.extraneousDependencies.add(edge)\n }\n }\n\n // for a succesfully created node, add its location\n // property and queue up to read its dependencies\n node.location = `./${realpath.relativePosix()}`\n const node_modules = findNodeModules(realpath)\n\n // queue items up to continue parsing dirs in case a node was succesfully\n // placed in the graph and its node_modules folder was correctly found\n if (node_modules) {\n depsFound.set(node, node_modules)\n }\n }\n }\n\n // any remaining dependencies that have not been found\n // when reading the directory should be marked as missing\n for (const { name, type, bareSpec } of dependencies.values()) {\n if (!seenDeps.has(name)) {\n const depType = shorten(type, name, fromNode.manifest)\n const spec = Spec.parse(name, bareSpec, {\n ...options,\n registry: fromNode.registry,\n })\n graph.placePackage(fromNode, depType, spec)\n }\n }\n}\n\n/**\n * Read the file system looking for `node_modules` folders and\n * returns a new {@link Graph} that represents the relationship\n * between the dependencies found.\n */\nexport const load = (options: LoadOptions): Graph => {\n const done = graphStep('actual')\n // TODO: once hidden lockfile is more reliable, default to false here\n const {\n skipHiddenLockfile = true,\n projectRoot,\n packageJson,\n scurry,\n monorepo,\n } = options\n const mainManifest =\n options.mainManifest ?? packageJson.read(projectRoot)\n\n if (!skipHiddenLockfile) {\n try {\n const graph = loadHidden({\n projectRoot,\n mainManifest,\n packageJson,\n monorepo,\n scurry,\n })\n // TODO: check mtime of lockfile vs .vlt folder\n return graph\n } catch {}\n }\n\n const graph = new Graph({ ...options, mainManifest })\n const depsFound = new Map<Node, Path>()\n\n // starts the list of initial folders to parse using the importer nodes\n for (const importer of graph.importers) {\n depsFound.set(\n importer,\n scurry.cwd.resolve(`${importer.location}/node_modules`),\n )\n }\n\n // breadth-first traversal of the file system tree reading deps found\n // starting from the node_modules folder of every importer in order to\n // find the actual installed dependencies at each location\n for (const [node, path] of depsFound.entries()) {\n parseDir(\n options,\n scurry,\n packageJson,\n depsFound,\n graph,\n node,\n path,\n )\n }\n\n done()\n\n return graph\n}\n", "import { error } from '@vltpkg/error-cause'\nimport { satisfies } from '@vltpkg/satisfies'\nimport type {\n BuildIdealAddOptions,\n BuildIdealFromGraphOptions,\n} from './types.ts'\n\nexport type RemoveSatisfiedSpecsOptions = BuildIdealAddOptions &\n BuildIdealFromGraphOptions\n\n/**\n * Traverse the objects defined in `add` and removes any references to specs\n * that are already satisfied by the contents of the actual `graph`.\n */\nexport const removeSatisfiedSpecs = ({\n add,\n graph,\n}: RemoveSatisfiedSpecsOptions) => {\n for (const [depID, dependencies] of add.entries()) {\n const importer = graph.nodes.get(depID)\n if (!importer) {\n throw error('Referred importer node id could not be found', {\n found: depID,\n })\n }\n for (const [name, dependency] of dependencies) {\n const edge = importer.edgesOut.get(name)\n if (!edge) {\n // brand new edge being added\n continue\n }\n\n // If the current graph edge is already valid, then we remove that\n // dependency item from the list of items to be added to the graph\n if (\n satisfies(\n edge.to?.id,\n dependency.spec,\n edge.from.location,\n graph.projectRoot,\n graph.monorepo,\n )\n ) {\n dependencies.delete(name)\n }\n }\n }\n\n // Removes any references to an importer that no longer has specs\n for (const [depID, dependencies] of add.entries()) {\n if (dependencies.size === 0) {\n add.delete(depID)\n }\n }\n}\n", "import { error } from '@vltpkg/error-cause'\nimport { longDependencyTypes } from '@vltpkg/types'\nimport { shorten, asDependency } from '../dependencies.ts'\nimport type {\n AddImportersDependenciesMap,\n Dependency,\n RemoveImportersDependenciesMap,\n} from '../dependencies.ts'\nimport { removeSatisfiedSpecs } from './remove-satisfied-specs.ts'\nimport type {\n BuildIdealAddOptions,\n BuildIdealFromGraphOptions,\n BuildIdealRemoveOptions,\n} from './types.ts'\nimport type { Edge } from '../edge.ts'\nimport type { Node } from '../node.ts'\nimport type { Graph } from '../graph.ts'\nimport type { DepID } from '@vltpkg/dep-id'\nimport { Spec } from '@vltpkg/spec'\n\nexport type GetImporterSpecsOptions = BuildIdealAddOptions &\n BuildIdealFromGraphOptions &\n BuildIdealRemoveOptions\n\nconst hasDepName = (importer: Node, edge: Edge): boolean => {\n for (const depType of longDependencyTypes) {\n const listedDeps = importer.manifest?.[depType]\n if (listedDeps && Object.hasOwn(listedDeps, edge.name))\n return true\n }\n return false\n}\n\nclass AddImportersDependenciesMapImpl\n extends Map\n implements AddImportersDependenciesMap\n{\n modifiedDependencies = false\n}\n\nclass RemoveImportersDependenciesMapImpl\n extends Map\n implements RemoveImportersDependenciesMap\n{\n modifiedDependencies = false\n}\n\n/**\n * Given a {@link Graph} and a list of {@link Dependency}, merges the\n * dependencies info found in the graph importers and returns the add & remove\n * results as a Map in which keys are {@link DepID} of each importer node.\n */\nexport const getImporterSpecs = ({\n add,\n graph,\n remove,\n}: GetImporterSpecsOptions) => {\n const addResult: AddImportersDependenciesMap =\n new AddImportersDependenciesMapImpl()\n const removeResult: RemoveImportersDependenciesMap =\n new RemoveImportersDependenciesMapImpl()\n\n // traverse the list of importers in the starting graph\n for (const importer of graph.importers) {\n // uses a Map keying to the spec.name in order to easily make sure there's\n // only a single dependency entry for a given dependency for each importer\n const addDeps = new Map<string, Dependency>()\n const removeDeps = new Set<string>()\n // if an edge from the graph is not listed in the manifest,\n // add that edge to the list of dependencies to be removed\n for (const edge of importer.edgesOut.values()) {\n if (\n !hasDepName(importer, edge) &&\n !add.get(importer.id)?.has(edge.name)\n ) {\n removeDeps.add(edge.name)\n removeResult.modifiedDependencies = true\n }\n }\n // if a dependency is listed in the manifest but not in the graph,\n // add that dependency to the list of dependencies to be added\n for (const depType of longDependencyTypes) {\n const deps = Object.entries(importer.manifest?.[depType] ?? {})\n for (const [depName, depSpec] of deps) {\n const edge = importer.edgesOut.get(depName)\n if (!edge?.to) {\n addDeps.set(\n depName,\n asDependency({\n spec: Spec.parse(depName, depSpec),\n type: shorten(depType, depName, importer.manifest),\n }),\n )\n }\n }\n }\n addResult.set(importer.id, addDeps)\n removeResult.set(importer.id, removeDeps)\n }\n\n // merges any provided specs to add to the current found results\n for (const [id, addDeps] of add.entries()) {\n const deps = addResult.get(id)\n if (!deps) {\n throw error('Not an importer', { found: id })\n }\n for (const [name, dep] of addDeps.entries()) {\n deps.set(name, dep)\n }\n }\n\n // Merges results from user-provided `remove` option with any remove\n // results found from comparing the manifest with the loaded graph\n for (const [key, removeSet] of remove) {\n const importerRemoveItem = removeResult.get(key)\n if (importerRemoveItem) {\n for (const depName of removeSet) {\n importerRemoveItem.add(depName)\n }\n }\n }\n\n // Removes any references to an importer that no longer has specs\n for (const [key, removeItem] of removeResult) {\n if (removeItem.size === 0) {\n removeResult.delete(key)\n }\n }\n\n // removes already satisfied dependencies from the dependencies list\n removeSatisfiedSpecs({\n add: addResult,\n graph,\n })\n\n // set the modifiedDependencies flag if any\n // of the importers have modified dependencies\n for (const addDeps of addResult.values()) {\n if (addDeps.size > 0) {\n addResult.modifiedDependencies = true\n break\n }\n }\n\n return {\n add: addResult,\n remove: removeResult,\n }\n}\n", "import type { Graph } from './graph.ts'\nimport type { Node } from './node.ts'\n\n/**\n * Remove the affected optional nodes starting from a given optional node\n * that failed to resolve/install.\n *\n * Removing these dependents will frequently leave optional *dependencies*\n * behind that are made unreachable from any project importer. For performance\n * reasons, `graph.gc()` is not called automatically by this method, since\n * multiple optional subgraphs may need to be removed in a single operation,\n * and the mark-and-sweep garbage collection (a) can be excessively expensive,\n * and (b) may need to communicate the set of garbage-collected nodes\n * for cleanup (as in the case of optional node build failures during\n * reification).\n */\nexport const removeOptionalSubgraph = (\n graph: Graph,\n startingNode: Node & { optional: true },\n) => {\n const removed = new Set<Node>()\n for (const node of findOptionalSubgraph(startingNode)) {\n graph.removeNode(node)\n removed.add(node)\n }\n return removed\n}\n\n/**\n * Given a starting node, this generator will walk back from the optional node\n * to all of its optional dependents, emitting each one, and skipping any\n * cycles.\n *\n * Note that when these are removed, it may create unreachable nodes in the\n * graph! Be sure to call `graph.gc()` if these are removed.\n */\nexport function* findOptionalSubgraph(\n node: Node & { optional: true },\n seen = new Set<Node & { optional: true }>(),\n): Generator<Node & { optional: true }, void> {\n // already visited, prevent looping\n if (seen.has(node)) return\n\n // the node itself is part of the subgraph, of course\n seen.add(node)\n yield node\n\n // and any of its dependents that are also optional\n for (const { from, optional } of node.edgesIn) {\n // if it's an optional *edge*, we don't need to remove it, because it\n // doesn't need the node anyway. But if the node is optional and the\n // dep isn't, then we do need to remove it.\n if (from.isOptional() && !optional) {\n for (const dep of findOptionalSubgraph(from, seen)) yield dep\n }\n }\n}\n", "import { joinDepIDTuple } from '@vltpkg/dep-id'\nimport type { DepID } from '@vltpkg/dep-id'\nimport { error } from '@vltpkg/error-cause'\nimport type { PackageInfoClient } from '@vltpkg/package-info'\nimport { Spec } from '@vltpkg/spec'\nimport type { SpecOptions } from '@vltpkg/spec'\nimport { longDependencyTypes } from '@vltpkg/types'\nimport type { DependencyTypeLong } from '@vltpkg/types'\nimport type { PathScurry } from 'path-scurry'\nimport { asDependency, shorten } from '../dependencies.ts'\nimport type { Dependency } from '../dependencies.ts'\nimport type { Graph } from '../graph.ts'\nimport type { Node } from '../node.ts'\nimport { removeOptionalSubgraph } from '../remove-optional-subgraph.ts'\n\ntype FileTypeInfo = {\n id: DepID\n path: string\n isDirectory: boolean\n}\n\n/**\n * Only install devDeps for git dependencies and importers\n * Everything else always gets installed\n */\nconst shouldInstallDepType = (\n node: Node,\n depType: DependencyTypeLong,\n) =>\n depType !== 'devDependencies' ||\n node.importer ||\n node.id.startsWith('git')\n\n/**\n * Retrieve the {@link DepID} and location for a `file:` type {@link Node}.\n */\nconst getFileTypeInfo = (\n spec: Spec,\n fromNode: Node,\n scurry: PathScurry,\n): FileTypeInfo | undefined => {\n const f = spec.final\n if (f.type !== 'file') return\n\n /* c8 ignore start - should be impossible */\n if (!f.file) {\n throw error('no path on file specifier', { spec })\n }\n /* c8 ignore stop */\n\n // Given that both linked folders and local tarballs (both defined with\n // usage of the `file:` spec prefix) location needs to be relative to their\n // parents, build the expected path and use it for both location and id\n const target = scurry.cwd.resolve(fromNode.location).resolve(f.file)\n const path = target.relativePosix()\n const id = joinDepIDTuple(['file', path])\n\n return {\n path,\n id,\n isDirectory: !!target.lstatSync()?.isDirectory(),\n }\n}\n\nconst isStringArray = (a: unknown): a is string[] =>\n Array.isArray(a) && !a.some(b => typeof b !== 'string')\n\nexport const appendNodes = async (\n add: Map<string, Dependency>,\n packageInfo: PackageInfoClient,\n graph: Graph,\n fromNode: Node,\n deps: Dependency[],\n scurry: PathScurry,\n options: SpecOptions,\n seen: Set<DepID>,\n) => {\n /* c8 ignore next */\n if (seen.has(fromNode.id)) return\n seen.add(fromNode.id)\n\n await Promise.all(\n deps.map(async ({ spec, type }) => {\n // see if there's a satisfying node in the graph currently\n const fileTypeInfo = getFileTypeInfo(spec, fromNode, scurry)\n const existingNode = graph.findResolution(spec, fromNode)\n if (existingNode) {\n graph.addEdge(type, spec, fromNode, existingNode)\n return\n }\n const edgeOptional =\n type === 'optional' || type === 'peerOptional'\n const mani = await packageInfo\n .manifest(spec, { from: scurry.resolve(fromNode.location) })\n .catch((er: unknown) => {\n // optional deps ignored if inaccessible\n if (edgeOptional || fromNode.optional) {\n return undefined\n }\n throw er\n })\n\n // when an user is adding a nameless dependency, e.g: `github:foo/bar`,\n // `file:./foo/bar`, we need to update the `add` option value to set the\n // correct name once we have it, so that it can properly be stored in\n // the `package.json` file at the end of reify.\n if (mani?.name && spec.name === '(unknown)') {\n const s = add.get(String(spec))\n if (s) {\n // removes the previous, placeholder entry key\n add.delete(String(spec))\n // replaces spec with a version with the correct name\n spec = Spec.parse(mani.name, spec.bareSpec, options)\n // updates the add map with the fixed up spec\n const n = asDependency({\n ...s,\n spec,\n })\n add.set(mani.name, n)\n }\n }\n\n if (!mani) {\n if (!edgeOptional && fromNode.isOptional()) {\n // failed resolution of a non-optional dep of an optional node\n // have to clean up the dependents\n removeOptionalSubgraph(graph, fromNode)\n return\n } else if (edgeOptional) {\n // failed resolution of an optional dep, just ignore it,\n // nothing to prune because we never added it in the first place.\n return\n } else {\n throw error('failed to resolve dependency', {\n spec,\n from: fromNode.location,\n })\n }\n }\n\n const node = graph.placePackage(\n fromNode,\n type,\n spec,\n mani,\n fileTypeInfo?.id,\n )\n\n /* c8 ignore start - not possible, already ensured manifest */\n if (!node) {\n throw error('failed to place package', {\n from: fromNode.location,\n spec,\n })\n }\n /* c8 ignore stop */\n\n if (fileTypeInfo?.path && fileTypeInfo.isDirectory) {\n node.location = fileTypeInfo.path\n }\n node.setResolved()\n const nestedAppends: Promise<unknown>[] = []\n\n const bundleDeps = node.manifest?.bundleDependencies\n const bundled = new Set<string>(\n (\n node.id.startsWith('git') ||\n node.importer ||\n !isStringArray(bundleDeps)\n ) ?\n []\n : bundleDeps,\n )\n\n const nextDeps: Dependency[] = []\n\n for (const depTypeName of longDependencyTypes) {\n const depRecord: Record<string, string> | undefined =\n mani[depTypeName]\n\n if (depRecord && shouldInstallDepType(node, depTypeName)) {\n for (const [name, bareSpec] of Object.entries(depRecord)) {\n if (bundled.has(name)) continue\n nextDeps.push({\n type: shorten(depTypeName, name, mani),\n spec: Spec.parse(name, bareSpec, {\n ...options,\n registry: spec.registry,\n }),\n })\n }\n }\n }\n\n if (nextDeps.length) {\n nestedAppends.push(\n appendNodes(\n add,\n packageInfo,\n graph,\n node,\n nextDeps,\n scurry,\n options,\n seen,\n ),\n )\n }\n await Promise.all(nestedAppends)\n }),\n )\n}\n", "import type { DepID } from '@vltpkg/dep-id'\nimport { error } from '@vltpkg/error-cause'\nimport type { PackageInfoClient } from '@vltpkg/package-info'\nimport type { SpecOptions } from '@vltpkg/spec'\nimport type { PathScurry } from 'path-scurry'\nimport { appendNodes } from './append-nodes.ts'\nimport type {\n BuildIdealAddOptions,\n BuildIdealFromGraphOptions,\n} from './types.ts'\n\nexport type AddNodesOptions = BuildIdealAddOptions &\n BuildIdealFromGraphOptions &\n SpecOptions & {\n /**\n * A {@link PathScurry} instance based on the `projectRoot` path\n */\n scurry: PathScurry\n\n /**\n * A {@link PackageInfoClient} instance to read manifest info from.\n */\n packageInfo: PackageInfoClient\n }\n\n/**\n * Add new nodes in the given `graph` for dependencies specified at `add`.\n */\nexport const addNodes = async ({\n add,\n graph,\n packageInfo,\n scurry,\n ...specOptions\n}: AddNodesOptions) => {\n const seen = new Set<DepID>()\n // iterates on the list of dependencies per importer updating\n // the graph using metadata fetch from the registry manifest files\n for (const [depID, dependencies] of add) {\n const importer = graph.nodes.get(depID)\n if (!importer) {\n throw error('Could not find importer', { found: depID })\n }\n\n // Removes any edges and nodes that are currently part of the\n // graph but are also in the list of dependencies to be installed\n const deps = [...dependencies.values()]\n for (const { spec } of deps) {\n const node = importer.edgesOut.get(spec.name)?.to\n if (node) graph.removeNode(node)\n }\n\n // Add new nodes for packages defined in the dependencies list fetching\n // metadata from the registry manifests and updating the graph\n await appendNodes(\n dependencies,\n packageInfo,\n graph,\n importer,\n deps,\n scurry,\n specOptions,\n seen,\n )\n }\n}\n", "import type {\n BuildIdealFromGraphOptions,\n BuildIdealRemoveOptions,\n} from './types.ts'\nimport { error } from '@vltpkg/error-cause'\n\nexport type RemoveNodesOptions = BuildIdealFromGraphOptions &\n BuildIdealRemoveOptions\n\n/**\n * Remove nodes from the current `graph`.\n */\nexport const removeNodes = ({\n graph,\n remove,\n}: RemoveNodesOptions) => {\n for (const [depID, names] of remove) {\n const importer = graph.nodes.get(depID)\n if (!importer) {\n throw error('Could not find importer', { found: depID })\n }\n\n // Removes any edges / nodes pointing to the specified name\n for (const name of names) {\n const node = importer.edgesOut.get(name)?.to\n if (node) graph.removeNode(node)\n }\n }\n}\n", "import type { Graph } from '../graph.ts'\nimport { getImporterSpecs } from './get-importer-specs.ts'\nimport { addNodes } from './add-nodes.ts'\nimport type { AddNodesOptions } from './add-nodes.ts'\nimport { removeNodes } from './remove-nodes.ts'\nimport type { RemoveNodesOptions } from './remove-nodes.ts'\n\nexport type BuildIdealFromStartingGraphOptions = AddNodesOptions &\n RemoveNodesOptions & {\n projectRoot: string\n }\n\n/**\n * Builds an ideal {@link Graph} representing the dependencies that\n * should be present in order to fulfill the requirements defined\n * by the `package.json` and `vlt-lock.json` files using the `graph` set\n * in options as a starting point. Also add / remove any dependencies\n * listed in the `add` and `remove` properties.\n */\nexport const buildIdealFromStartingGraph = async (\n options: BuildIdealFromStartingGraphOptions,\n): Promise<Graph> => {\n // Gets a map of dependencies that are keyed to its importer node ids,\n // merging values already found in the graph with user specified values.\n // Any dependencies that are already satisfied in the starting `graph`\n // are going to be pruned from the resulting object.\n const importerSpecs = getImporterSpecs(options)\n\n // merge modifiedDependencies flags\n options.add.modifiedDependencies =\n options.add.modifiedDependencies ||\n importerSpecs.add.modifiedDependencies\n options.remove.modifiedDependencies =\n options.remove.modifiedDependencies ||\n importerSpecs.remove.modifiedDependencies\n\n // merge values found on importer specs with\n // user-provided values from `options.add`\n for (const [importerId, deps] of importerSpecs.add) {\n if (!options.add.has(importerId)) {\n options.add.set(importerId, deps)\n continue\n }\n\n // merge any deps found when reading the importers manifest\n // with the ones provided by the user in the `add` options,\n // user-provided deps should take precedence\n for (const [depName, dep] of deps) {\n if (!options.add.get(importerId)?.has(depName)) {\n options.add.get(importerId)?.set(depName, dep)\n }\n }\n }\n\n // add nodes, fetching remote manifests for each dependency to be added\n await addNodes(options)\n\n // move things into their default locations, if possible\n for (const node of options.graph.nodes.values()) {\n node.setDefaultLocation()\n }\n\n // removes any dependencies that are listed in the `remove` option\n removeNodes({ ...options, remove: importerSpecs.remove })\n\n options.graph.gc()\n\n return options.graph\n}\n", "import type { PackageInfoClient } from '@vltpkg/package-info'\nimport { load as loadActual } from '../actual/load.ts'\nimport type { LoadOptions as LoadActualOptions } from '../actual/load.ts'\nimport type {\n AddImportersDependenciesMap,\n RemoveImportersDependenciesMap,\n Dependency,\n} from '../dependencies.ts'\nimport type { Graph } from '../graph.ts'\nimport { load as loadVirtual } from '../lockfile/load.ts'\nimport { buildIdealFromStartingGraph } from './build-ideal-from-starting-graph.ts'\nimport type { DepID } from '@vltpkg/dep-id'\nimport { graphStep } from '@vltpkg/output'\n\nconst getMap = <T extends Map<any, any>>(m?: T) =>\n m ?? (new Map() as T)\n\nexport type BuildIdealOptions = LoadActualOptions & {\n /**\n * A `Map` in which keys are {@link DepID} linking to another `Map` in which\n * keys are the dependency names and values are {@link Dependency}. This\n * structure represents dependencies that need to be added to the importer\n * represented by {@link DepID}.\n */\n add?: AddImportersDependenciesMap\n /**\n * A `Map` object representing nodes to be removed from the ideal graph.\n * Each {@link DepID} key represents an importer node and the `Set` of\n * dependency names to be removed from its dependency list.\n */\n remove?: RemoveImportersDependenciesMap\n /**\n * A {@link PackageInfoClient} instance to read manifest info from.\n */\n packageInfo: PackageInfoClient\n}\n\n/**\n * Builds an ideal {@link Graph} representing the dependencies that\n * should be present in order to fulfill the requirements defined\n * by the `package.json` and `vlt-lock.json` files using either the\n * virtual or actual graph as a starting point. Also add / remove any\n * dependencies listed in the `add` and `remove` properties.\n */\nexport const build = async (\n options: BuildIdealOptions,\n): Promise<Graph> => {\n const done = graphStep('build')\n\n // Creates the shared instances that are going to be used\n // in both the loader methods and the build graph\n const { packageInfo, packageJson, scurry, monorepo } = options\n const mainManifest =\n options.mainManifest ?? packageJson.read(options.projectRoot)\n let graph\n try {\n graph = loadVirtual({\n ...options,\n mainManifest,\n monorepo,\n })\n } catch {\n graph = loadActual({\n ...options,\n mainManifest,\n monorepo,\n })\n }\n\n const res = await buildIdealFromStartingGraph({\n ...options,\n scurry,\n add: getMap(options.add),\n graph,\n packageInfo,\n remove: getMap(options.remove),\n })\n done()\n return res\n}\n", "import { spawn } from 'child_process'\nimport { rename } from 'fs/promises'\nimport { basename, dirname } from 'path'\nimport { rimraf } from 'rimraf'\nimport { __CODE_SPLIT_SCRIPT_NAME } from './remove.ts'\n\nexport class RollbackRemove {\n #key = String(Math.random()).substring(2)\n #paths = new Map<string, string>()\n\n async rm(path: string) {\n const target = `${dirname(path)}/.VLT.DELETE.${this.#key}.${basename(path)}`\n this.#paths.set(path, target)\n await rename(path, target).catch((e: unknown) => {\n if (e instanceof Error && 'code' in e && e.code === 'ENOENT') {\n this.#paths.delete(path)\n return\n }\n /* c8 ignore next */\n throw e\n })\n }\n\n confirm() {\n // nothing to confirm!\n if (!this.#paths.size) return\n\n const child = spawn(\n process.execPath,\n [__CODE_SPLIT_SCRIPT_NAME],\n {\n stdio: ['pipe', 'ignore', 'ignore'],\n detached: true,\n },\n )\n child.unref()\n for (const path of this.#paths.values()) {\n child.stdin.write(path + '\\u0000')\n }\n child.stdin.end()\n this.#paths.clear()\n }\n\n async rollback() {\n const promises: Promise<unknown>[] = []\n for (const [original, moved] of this.#paths) {\n promises.push(\n rimraf(original)\n /* c8 ignore next */\n .catch(() => {})\n .then(() => rename(moved, original)),\n )\n }\n await Promise.all(promises)\n this.#paths.clear()\n }\n}\n", "import {resolve} from 'node:path';\nexport const __CODE_SPLIT_SCRIPT_NAME = resolve(import.meta.dirname, 'rollback-remove-src-remove.js')", "import type { PackageInfoClient } from '@vltpkg/package-info'\nimport { RollbackRemove } from '@vltpkg/rollback-remove'\nimport { availableParallelism } from 'node:os'\nimport { callLimit } from 'promise-call-limit'\nimport { load as loadActual } from '../actual/load.ts'\nimport type { LoadOptions } from '../actual/load.ts'\nimport type {\n AddImportersDependenciesMap,\n RemoveImportersDependenciesMap,\n} from '../dependencies.ts'\nimport { Diff } from '../diff.ts'\nimport type { Graph } from '../graph.ts'\nimport { lockfile } from '../index.ts'\nimport {\n lockfileData,\n saveData,\n saveHidden,\n} from '../lockfile/save.ts'\nimport { addEdges } from './add-edges.ts'\nimport { addNodes } from './add-nodes.ts'\nimport { build } from './build.ts'\nimport { deleteEdges } from './delete-edges.ts'\nimport { deleteNodes } from './delete-nodes.ts'\nimport { rollback } from './rollback.ts'\nimport { updatePackageJson } from './update-importers-package-json.ts'\nimport { graphStep } from '@vltpkg/output'\n\nconst limit = Math.max(availableParallelism() - 1, 1) * 8\n\n// - [ ] depid's with peer resolutions\n// - [ ] depid shortening\n\nexport type ReifyOptions = LoadOptions & {\n add?: AddImportersDependenciesMap\n remove?: RemoveImportersDependenciesMap\n graph: Graph\n actual?: Graph\n packageInfo: PackageInfoClient\n}\n\n/**\n * Make the current project match the supplied graph.\n */\nexport const reify = async (options: ReifyOptions) => {\n const done = graphStep('reify')\n\n const { graph, scurry } = options\n\n const actual =\n options.actual ??\n loadActual({\n ...options,\n loadManifests: true,\n })\n\n const diff = new Diff(actual, graph)\n const remover = new RollbackRemove()\n let success = false\n try {\n await reify_(options, diff, remover)\n remover.confirm()\n success = true\n } finally {\n /* c8 ignore start */\n if (!success) {\n await rollback(remover, diff, scurry).catch(() => {})\n }\n /* c8 ignore stop */\n }\n\n done()\n\n return diff\n}\n\nconst reify_ = async (\n options: ReifyOptions,\n diff: Diff,\n remover: RollbackRemove,\n) => {\n const { add, remove, packageInfo, packageJson, scurry } = options\n const saveImportersPackageJson =\n add?.modifiedDependencies || remove?.modifiedDependencies ?\n updatePackageJson({\n add,\n remove,\n graph: options.graph,\n packageJson,\n })\n : undefined\n\n // before anything else happens, grab the ideal tree as it was resolved\n // so that we can store it in the lockfile. We do this here so that\n // any failed/removed optional deps are not reflected in the lockfile\n // data as it is saved.\n const lfData = lockfileData(options)\n const actions: (() => Promise<unknown>)[] = addNodes(\n diff,\n scurry,\n remover,\n options,\n packageInfo,\n ).concat(deleteEdges(diff, scurry, remover))\n\n // need to wait, so that the nodes exist to link to\n if (actions.length) await callLimit(actions, { limit })\n\n // create all node_modules symlinks, and link bins to nm/.bin\n const edgeActions: Promise<unknown>[] = addEdges(\n diff,\n packageJson,\n scurry,\n remover,\n )\n if (edgeActions.length) await Promise.all(edgeActions)\n\n // run lifecycles and chmod bins\n await build(diff, packageJson, scurry)\n\n // save the lockfile\n lockfile.save(options)\n\n // if we had to change the actual graph along the way,\n // make sure we do not leave behind any unreachable nodes\n if (diff.hadOptionalFailures) {\n for (const node of options.graph.gc().values()) {\n diff.nodes.add.delete(node)\n diff.nodes.delete.add(node)\n }\n }\n saveHidden(options)\n\n // delete garbage from the store.\n const rmActions: Promise<unknown>[] = deleteNodes(\n diff,\n remover,\n scurry,\n )\n if (rmActions.length) await Promise.all(rmActions)\n\n // updates package.json files if anything was added / removed\n saveImportersPackageJson?.()\n\n // write the ideal graph data to the lockfile\n saveData(lfData, scurry.resolve('vlt-lock.json'), false)\n}\n", "import * as os from 'node:os'\n// availableParallelism available only since node v19, for older versions use\n// cpus() cpus() can return an empty list if /proc is not mounted, use 1 in\n// this case\n\n/* c8 ignore start */\nconst defLimit =\n 'availableParallelism' in os ?\n Math.max(1, os.availableParallelism() - 1)\n : Math.max(1, (os as typeof import('node:os')).cpus().length - 1)\n/* c8 ignore stop */\n\nexport type Step<T> = () => Promise<T>\n\nexport type Options = {\n limit?: number\n rejectLate?: boolean\n}\n\nexport const callLimit = <T extends any>(\n queue: Step<T>[],\n { limit = defLimit, rejectLate }: Options = {},\n) =>\n new Promise((res, rej) => {\n let active = 0\n let current = 0\n const results: (T | void | Promise<void | T>)[] = []\n\n // Whether or not we rejected, distinct from the rejection just in case the rejection itself is falsey\n let rejected = false\n let rejection: unknown\n const reject = (er?: unknown) => {\n if (rejected) return\n rejected = true\n rejection ??= er\n if (!rejectLate) rej(rejection)\n }\n\n let resolved = false\n const resolve = () => {\n if (resolved || active > 0) return\n resolved = true\n res(results)\n }\n\n const run = () => {\n const c = current++\n if (c >= queue.length) return rejected ? reject() : resolve()\n\n active++\n const step = queue[c]\n /* c8 ignore start */\n if (!step) throw new Error('walked off queue')\n /* c8 ignore stop */\n\n results[c] = step()\n .then(\n result => {\n active--\n results[c] = result\n return result\n },\n er => {\n active--\n reject(er)\n },\n )\n .then(result => {\n if (rejected && active === 0) return rej(rejection)\n run()\n return result\n })\n }\n\n for (let i = 0; i < limit; i++) run()\n })\n", "import { error } from '@vltpkg/error-cause'\nimport type { InspectOptions } from 'node:util'\nimport type { Edge } from './edge.ts'\nimport type { Graph } from './graph.ts'\nimport type { Node } from './node.ts'\n\n// XXX should file deps *always* be considered changed?\n// unless the thing containing it wasn't possibly changed because it's inside\n// a dep that didn't change?\n// Same with remote deps\n\nconst kCustomInspect = Symbol.for('nodejs.util.inspect.custom')\n\n/**\n * A Diff object is a representation of a set of changes from one\n * graph to another, typically from the actual graph as it is reified\n * on disk, to an intended ideal graph.\n *\n * The naming convention can get a bit confusing here, because it's a\n * set of directed changes from one set of directed objects to another.\n *\n * Within the context the Diff object, `from` is the Graph we're coming from,\n * and `to` is the Graph we're trying to create.\n */\nexport class Diff {\n from: Graph\n to: Graph\n\n projectRoot: string\n\n /**\n * If changes need to be made later for failures of optional nodes,\n * set this flag so that we know to call graph.gc() at the appropriate time.\n */\n hadOptionalFailures = false\n\n /**\n * Collection of nodes to add and delete\n */\n nodes = {\n /** Nodes in the `to` graph that are not in the `from` graph */\n add: new Set<Node>(),\n /** Nodes in the `from` graph that are not in the `to` graph */\n delete: new Set<Node>(),\n }\n\n /**\n * Collection of nodes to add and delete\n */\n edges = {\n /** Edges in the `to` graph that are not found in the `from` graph */\n add: new Set<Edge>(),\n /** Edges in the `from` graph that are not found in the `to` graph */\n delete: new Set<Edge>(),\n }\n\n get [Symbol.toStringTag]() {\n return '@vltpkg/graph.Diff'\n }\n\n constructor(from: Graph, to: Graph) {\n this.from = from\n this.to = to\n this.projectRoot = from.projectRoot\n if (to.projectRoot !== from.projectRoot) {\n throw error('projectRoot mismatch in Graph diff', {\n wanted: from.projectRoot,\n found: to.projectRoot,\n })\n }\n\n for (const [id, node] of this.from.nodes) {\n if (!this.to.nodes.get(id)?.equals(node)) {\n this.nodes.delete.add(node)\n }\n }\n\n for (const [id, node] of this.to.nodes) {\n if (!this.from.nodes.get(id)?.equals(node)) {\n this.nodes.add.add(node)\n }\n }\n\n for (const edge of this.to.edges) {\n // the node with this dep, in the from graph\n const fromNode = this.from.nodes.get(edge.from.id)\n const fromEdge = fromNode?.edgesOut.get(edge.spec.name)\n if (fromEdge?.to?.id === edge.to?.id) continue\n if (fromEdge?.to) this.edges.delete.add(fromEdge)\n if (edge.to) this.edges.add.add(edge)\n }\n for (const edge of this.from.edges) {\n // the node with this dep, in the to graph\n const toNode = this.to.nodes.get(edge.from.id)\n const toEdge = toNode?.edgesOut.get(edge.spec.name)\n if (toEdge?.to?.id === edge.to?.id) continue\n if (edge.to) this.edges.delete.add(edge)\n if (toEdge?.to) this.edges.add.add(toEdge)\n }\n }\n\n [kCustomInspect](_: number, options?: InspectOptions): string {\n const red: [string, string] =\n options?.colors ? ['\\x1b[31m', '\\x1b[m'] : ['', '']\n const green: [string, string] =\n options?.colors ? ['\\x1b[32m', '\\x1b[m'] : ['', '']\n const lines: string[] = []\n for (const node of this.nodes.add) {\n lines.push(`+ ${node.id}`)\n }\n for (const node of this.nodes.delete) {\n lines.push(`- ${node.id}`)\n }\n for (const edge of this.edges.add) {\n /* c8 ignore next */\n const to = edge.to?.id ?? ''\n lines.push(\n `+ ${edge.from.id} ${edge.type} ${edge.spec} ${to}`.trim(),\n )\n }\n for (const edge of this.edges.delete) {\n /* c8 ignore next */\n const to = edge.to?.id ?? ''\n lines.push(\n `- ${edge.from.id} ${edge.type} ${edge.spec} ${to}`.trim(),\n )\n }\n const wrap = (s: string, c: [string, string]) => c.join(s)\n const color =\n options?.colors ?\n (s: string) => wrap(s, s.startsWith('+') ? green : red)\n : (s: string) => s\n\n return `${this[Symbol.toStringTag]} {\n${lines\n .sort((a, b) => a.substring(1).localeCompare(b.substring(1), 'en'))\n .map(s => ' ' + color(s))\n .join('\\n')}\n}`\n }\n}\n", "import type { PackageInfoClientOptions } from '@vltpkg/package-info'\nimport { PackageInfoClient } from '@vltpkg/package-info'\nimport type { PackageJson } from '@vltpkg/package-json'\nimport type { LoadOptions } from './actual/load.ts'\nimport { load as actualLoad } from './actual/load.ts'\nimport type { RemoveImportersDependenciesMap } from './dependencies.ts'\nimport { build as idealBuild } from './ideal/build.ts'\nimport { reify } from './reify/index.ts'\n\nexport type UninstallOptions = PackageInfoClientOptions &\n LoadOptions & {\n projectRoot: string\n packageJson: PackageJson\n }\n\nexport const uninstall = async (\n options: UninstallOptions,\n remove?: RemoveImportersDependenciesMap,\n) => {\n const mainManifest = options.packageJson.read(options.projectRoot)\n\n const graph = await idealBuild({\n ...options,\n packageInfo: new PackageInfoClient(options),\n remove,\n mainManifest,\n loadManifests: true,\n })\n const act = actualLoad({\n ...options,\n mainManifest,\n loadManifests: true,\n })\n const diff = await reify({\n ...options,\n packageInfo: new PackageInfoClient(options),\n remove,\n actual: act,\n graph,\n loadManifests: true,\n })\n\n return { graph, diff }\n}\n", "export * from './edge.ts'\nexport * from './graph.ts'\nexport * from './node.ts'\nexport * from './dependencies.ts'\nexport * from './lockfile/types.ts'\nexport * from './visualization/json-output.ts'\nexport * from './visualization/human-readable-output.ts'\nexport * from './visualization/mermaid-output.ts'\nexport * from './stringify-node.ts'\nexport * from './types.ts'\nexport * from './install.ts'\nexport * from './uninstall.ts'\nexport * from './diff.ts'\n\nimport { load as actualLoad } from './actual/load.ts'\nimport type { LoadOptions as ActualLoadOptions } from './actual/load.ts'\nexport const actual = { load: actualLoad }\n\nimport { load as lockfileLoad } from './lockfile/load.ts'\nimport type { LoadOptions as LockfileLoadOptions } from './lockfile/load.ts'\nimport { loadEdges } from './lockfile/load-edges.ts'\nimport { loadNodes } from './lockfile/load-nodes.ts'\nimport { save } from './lockfile/save.ts'\nexport const lockfile = {\n load: lockfileLoad,\n loadEdges,\n loadNodes,\n save,\n}\n\nexport type { ActualLoadOptions, LockfileLoadOptions }\nexport type { SaveOptions } from './lockfile/save.ts'\n\nimport { build } from './ideal/build.ts'\nimport type { BuildIdealOptions } from './ideal/build.ts'\nexport type { BuildIdealOptions }\nexport const ideal = { build }\nexport { reify } from './reify/index.ts'\nexport type { ReifyOptions } from './reify/index.ts'\n", "import type { RollbackRemove } from '@vltpkg/rollback-remove'\nimport type { Manifest } from '@vltpkg/types'\nimport { mkdir, symlink } from 'fs/promises'\nimport { dirname, relative } from 'path'\nimport type { PathScurry } from 'path-scurry'\nimport type { Edge } from '../edge.ts'\nimport { binPaths } from './bin-paths.ts'\n\nconst clobberSymlink = async (\n target: string,\n link: string,\n remover: RollbackRemove,\n type = 'file',\n) => {\n await mkdir(dirname(link), { recursive: true })\n try {\n await symlink(target, link, type)\n } catch (e) {\n const er = e as NodeJS.ErrnoException\n if (er.code === 'EEXIST') {\n return remover.rm(link).then(() => symlink(target, link))\n /* c8 ignore start */\n } else {\n throw er\n }\n }\n /* c8 ignore stop */\n}\n\n/**\n * reify an edge into a node_modules folder, with bins linked\n * this does NOT chmod the bins to 0o777, because they might not exist\n * until scripts are run, in the case of non-store deps like workspaces\n */\nexport const addEdge = async (\n edge: Edge,\n manifest: Manifest,\n scurry: PathScurry,\n remover: RollbackRemove,\n) => {\n if (!edge.to) return\n const binRoot = scurry.resolve(\n edge.from.nodeModules(scurry),\n '.bin',\n )\n const path = scurry.resolve(\n edge.from.nodeModules(scurry),\n edge.spec.name,\n )\n const promises: Promise<unknown>[] = []\n const target = relative(\n dirname(path),\n edge.to.resolvedLocation(scurry),\n )\n promises.push(clobberSymlink(target, path, remover, 'dir'))\n const bp = binPaths(manifest)\n for (const [key, val] of Object.entries(bp)) {\n const link = scurry.resolve(binRoot, key)\n const target = relative(binRoot, scurry.resolve(path, val))\n // TODO: bash/cmd/pwsh shims on Windows\n promises.push(clobberSymlink(target, link, remover))\n }\n await Promise.all(promises)\n}\n", "import type { Manifest } from '@vltpkg/types'\n\nconst parseScope = (scoped: string): [string | undefined, string] => {\n if (scoped.startsWith('@')) {\n const [scope, name, ...rest] = scoped.split('/')\n if (scope && name && rest.length === 0) return [scope, name]\n }\n return [undefined, scoped]\n}\n\n/** get the bin scripts for a package */\nexport const binPaths = (\n manifest: Manifest,\n): Record<string, string> => {\n const { name, bin } = manifest\n\n if (bin) {\n if (name && typeof bin === 'string') {\n const [_scope, pkg] = parseScope(name)\n return { [pkg]: bin }\n } else if (typeof bin === 'object') {\n return bin\n }\n }\n return {}\n}\n", "import type { PackageJson } from '@vltpkg/package-json'\nimport type { RollbackRemove } from '@vltpkg/rollback-remove'\nimport type { PathScurry } from 'path-scurry'\nimport type { Diff } from '../diff.ts'\nimport { addEdge } from './add-edge.ts'\n\nexport const addEdges = (\n diff: Diff,\n packageJson: PackageJson,\n scurry: PathScurry,\n remover: RollbackRemove,\n): Promise<unknown>[] => {\n const actions: Promise<unknown>[] = []\n for (const edge of diff.edges.add) {\n const { to } = edge\n if (!to) continue\n const mani =\n to.manifest ?? packageJson.read(to.resolvedLocation(scurry))\n actions.push(addEdge(edge, mani, scurry, remover))\n }\n return actions\n}\n", "import type { Diff } from '../diff.ts'\nimport type { Node } from '../node.ts'\nimport { removeOptionalSubgraph } from '../remove-optional-subgraph.ts'\n\n/**\n * If the node is optional, then returns an error handler that removes\n * the node and its connected optional subgraph, by moving them into the\n * \"deleted\" portion of the Diff object.\n * Otherwise, it returns `undefined` so that the promise will simply reject.\n */\nexport function optionalFail(\n diff: Diff,\n node: Node & { optional: true },\n): () => void\nexport function optionalFail(\n diff: Diff,\n node: Node & { optional: false },\n): undefined\nexport function optionalFail(\n diff: Diff,\n node: Node,\n): (() => void) | undefined\nexport function optionalFail(\n diff: Diff,\n node: Node,\n): (() => void) | undefined {\n return node.isOptional() ? () => del(diff, node) : undefined\n}\n\nconst del = (diff: Diff, node: Node & { optional: true }) => {\n diff.hadOptionalFailures = true\n for (const del of removeOptionalSubgraph(diff.to, node)) {\n // add it to the set of nodes being deleted\n diff.nodes.delete.add(del)\n // delete it from the set of nodes being added\n diff.nodes.add.delete(del)\n }\n diff.nodes.add.delete(node)\n diff.nodes.delete.add(node)\n}\n", "import { hydrate } from '@vltpkg/dep-id'\nimport type { PackageInfoClient } from '@vltpkg/package-info'\nimport { platformCheck } from '@vltpkg/pick-manifest'\nimport type { RollbackRemove } from '@vltpkg/rollback-remove'\nimport type { SpecOptions } from '@vltpkg/spec'\nimport type { PathScurry } from 'path-scurry'\nimport type { Diff } from '../diff.ts'\nimport { optionalFail } from './optional-fail.ts'\n\nexport const addNodes = (\n diff: Diff,\n scurry: PathScurry,\n remover: RollbackRemove,\n options: SpecOptions,\n packageInfo: PackageInfoClient,\n): (() => Promise<unknown>)[] => {\n const actions: (() => Promise<unknown>)[] = []\n // fetch and extract all the nodes, removing any in the way\n for (const node of diff.nodes.add) {\n /* c8 ignore next - all nodes have manifests by this point */\n const { manifest = {} } = node\n // if it's not in the store, we don't have to extract it, because\n // we're just linking to a location that already exists.\n if (!node.inVltStore()) continue\n // remove anything already there\n const target = node.resolvedLocation(scurry)\n const from = scurry.resolve('')\n const spec = hydrate(node.id, manifest.name, options)\n const onErr = optionalFail(diff, node)\n const { integrity, resolved } = node\n // if it's optional, and we know it isn't for this platform, or it's\n // deprecated, don't install it. if it's not optional, try our best.\n if (\n onErr &&\n (manifest.deprecated ||\n !platformCheck(\n manifest,\n process.version,\n process.platform,\n process.arch,\n ))\n ) {\n onErr()\n continue\n }\n actions.push(() =>\n remover.rm(target).then(() =>\n onErr ?\n packageInfo\n .extract(spec, target, { from, integrity, resolved })\n .then(x => x, onErr)\n : packageInfo.extract(spec, target, {\n from,\n integrity,\n resolved,\n }),\n ),\n )\n }\n return actions\n}\n", "// walk the graph of added nodes, building and chmoding their bins\n// at the end, we get back to the importers, and run their prepare\n// script as well as install script.\n\nimport type { PackageJson } from '@vltpkg/package-json'\nimport { run } from '@vltpkg/run'\nimport { statSync } from 'fs'\nimport { chmod } from 'fs/promises'\nimport { graphRun } from 'graph-run'\nimport type { PathScurry } from 'path-scurry'\nimport type { Diff } from '../diff.ts'\nimport type { Node } from '../node.ts'\nimport { nonEmptyList } from '../non-empty-list.ts'\nimport { binPaths } from './bin-paths.ts'\nimport { optionalFail } from './optional-fail.ts'\n\nexport const build = async (\n diff: Diff,\n packageJson: PackageJson,\n scurry: PathScurry,\n) => {\n const graph = diff.to\n const nodes = nonEmptyList([...graph.importers])\n /* c8 ignore next - all graphs have at least one importer */\n if (!nodes) return\n\n await graphRun<Node, unknown>({\n graph: nodes,\n visit: async (node: Node, signal, path) => {\n // if it's not an importer or an added node, nothing to do.\n // TODO: only build importers if it has changed deps, there's never\n // been a previous build, or it contains something newer than the\n // most recent build.\n // For now, just always build all importers, because we don't\n // track all that other stuff.\n if (!node.importer && !diff.nodes.add.has(node)) return\n\n await visit(packageJson, scurry, node, signal, path).then(\n x => x,\n optionalFail(diff, node),\n )\n },\n\n getDeps: node => {\n const deps: Node[] = []\n for (const { to } of node.edgesOut.values()) {\n /* c8 ignore next - vanishingly unlikely in practice */\n if (to) deps.push(to)\n }\n return deps\n },\n })\n}\n\nconst visit = async (\n packageJson: PackageJson,\n scurry: PathScurry,\n node: Node,\n signal: AbortSignal,\n _path: Node[],\n): Promise<void> => {\n node.manifest ??= packageJson.read(node.resolvedLocation(scurry))\n const { manifest } = node\n const { scripts = {} } = manifest\n\n const {\n install,\n preinstall,\n postinstall,\n prepare,\n preprepare,\n postprepare,\n } = scripts\n\n // if it has install script, run it\n const runInstall = !!(install || preinstall || postinstall)\n if (runInstall) {\n await run({\n signal,\n arg0: 'install',\n ignoreMissing: true,\n packageJson,\n cwd: node.resolvedLocation(scurry),\n projectRoot: node.projectRoot,\n manifest,\n })\n }\n\n // if it's an importer or git, run prepare\n const prepable =\n node.id.startsWith('git') || node.importer || !node.inVltStore()\n const runPrepare =\n !!(prepare || preprepare || postprepare) && prepable\n\n if (runPrepare) {\n await run({\n signal,\n arg0: 'prepare',\n ignoreMissing: true,\n packageJson,\n cwd: node.resolvedLocation(scurry),\n projectRoot: node.projectRoot,\n manifest,\n })\n }\n\n const chmods: Promise<unknown>[] = []\n for (const bin of Object.values(binPaths(manifest))) {\n const path = scurry.resolve(\n `${node.resolvedLocation(scurry)}/${bin}`,\n )\n chmods.push(makeExecutable(path))\n }\n await Promise.all(chmods)\n}\n\n// 0 is \"not yet set\"\n// This is defined by doing `0o111 | <mode>` so that systems\n// that create files group-writable result in 0o775 instead of 0o755\nlet execMode = 0\nconst makeExecutable = async (path: string) => {\n if (!execMode) {\n execMode = (statSync(path).mode & 0o777) | 0o111\n }\n await chmod(path, execMode)\n}\n", "export const isNonEmptyList = <T>(\n list: T[],\n): list is [first: T, ...rest: T[]] => !!list.length\n\nexport const nonEmptyList = <T>(nodes: T[]) =>\n isNonEmptyList(nodes) ? nodes : undefined\n", "import type { RollbackRemove } from '@vltpkg/rollback-remove'\nimport type { PathScurry } from 'path-scurry'\nimport type { Edge } from '../edge.ts'\nimport { binPaths } from './bin-paths.ts'\n\nconst rmBinPosix = (remover: RollbackRemove, bin: string) => {\n return [remover.rm(bin)]\n}\n\nconst rmBinWin32 = (remover: RollbackRemove, bin: string) => {\n return [\n remover.rm(bin),\n remover.rm(bin + '.cmd'),\n remover.rm(bin + '.pwsh'),\n ]\n}\n\nconst rmBin = process.platform === 'win32' ? rmBinWin32 : rmBinPosix\n\nexport const deleteEdge = async (\n edge: Edge,\n scurry: PathScurry,\n remover: RollbackRemove,\n) => {\n const {\n spec: { name },\n to,\n } = edge\n const nm = edge.from.nodeModules(scurry)\n const path = scurry.resolve(nm, name)\n const binRoot = scurry.cwd.resolve(`${nm}/.bin`)\n const promises: Promise<unknown>[] = []\n promises.push(remover.rm(path))\n const manifest = to?.manifest\n if (manifest) {\n for (const key of Object.keys(binPaths(manifest))) {\n const bin = binRoot.resolve(key).fullpath()\n promises.push(...rmBin(remover, bin))\n }\n }\n await Promise.all(promises)\n}\n", "import type { RollbackRemove } from '@vltpkg/rollback-remove'\nimport type { PathScurry } from 'path-scurry'\nimport type { Diff } from '../diff.ts'\nimport { deleteEdge } from './delete-edge.ts'\n\nexport const deleteEdges = (\n diff: Diff,\n scurry: PathScurry,\n remover: RollbackRemove,\n): (() => Promise<unknown>)[] => {\n const promises: (() => Promise<unknown>)[] = []\n for (const edge of diff.edges.delete) {\n // if the edge.from is a deleted node in the store, no need\n // the entire dir will be removed in a later step.\n if (diff.nodes.delete.has(edge.from) && edge.from.inVltStore()) {\n continue\n }\n promises.push(() => deleteEdge(edge, scurry, remover))\n }\n return promises\n}\n", "import type { RollbackRemove } from '@vltpkg/rollback-remove'\nimport type { PathScurry } from 'path-scurry'\nimport type { Diff } from '../diff.ts'\n\nexport const deleteNodes = (\n diff: Diff,\n remover: RollbackRemove,\n scurry: PathScurry,\n): Promise<unknown>[] => {\n const store = scurry.resolve('node_modules/.vlt')\n const rmActions: Promise<unknown>[] = []\n for (const node of diff.nodes.delete) {\n // do not delete workspaces or link targets\n if (!node.inVltStore()) continue\n rmActions.push(remover.rm(scurry.resolve(store, node.id)))\n }\n return rmActions\n}\n", "import { RollbackRemove } from '@vltpkg/rollback-remove'\nimport type { PathScurry } from 'path-scurry'\nimport type { Diff } from '../diff.ts'\nimport { deleteEdge } from './delete-edge.ts'\n\nexport const rollback = async (\n remover: RollbackRemove,\n diff: Diff,\n scurry: PathScurry,\n) => {\n const promises: Promise<unknown>[] = []\n const store = scurry.resolve('node_modules/.vlt')\n\n // remove everything the diff tried to add\n const backRoller = new RollbackRemove()\n for (const node of diff.nodes.add) {\n if (!node.inVltStore()) continue\n const path = scurry.resolve(store, node.id)\n /* c8 ignore next */\n promises.push(backRoller.rm(path).catch(() => {}))\n }\n for (const edge of diff.edges.add) {\n promises.push(deleteEdge(edge, scurry, backRoller))\n }\n\n /* c8 ignore next */\n await Promise.all(promises).catch(() => {})\n\n backRoller.confirm()\n\n /* c8 ignore next */\n await remover.rollback().catch(() => {})\n}\n", "import { splitDepID } from '@vltpkg/dep-id'\nimport type { DepID } from '@vltpkg/dep-id'\nimport { error } from '@vltpkg/error-cause'\nimport type { PackageJson } from '@vltpkg/package-json'\nimport { longDependencyTypes } from '@vltpkg/types'\nimport type {\n Manifest,\n DependencyTypeLong,\n DependencyTypeShort,\n} from '@vltpkg/types'\nimport type { Graph } from '../graph.ts'\nimport type {\n AddImportersDependenciesMap,\n RemoveImportersDependenciesMap,\n Dependency,\n} from '../dependencies.ts'\n\nconst SAVE_PREFIX = '^'\n\nconst depTypesMap = new Map<DependencyTypeShort, DependencyTypeLong>([\n ['prod', 'dependencies'],\n ['dev', 'devDependencies'],\n ['peer', 'peerDependencies'],\n ['peerOptional', 'peerDependencies'],\n ['optional', 'optionalDependencies'],\n])\n\nexport type UpdatePackageJsonOptions = {\n /**\n * A `Map` in which keys are {@link DepID} linking to another `Map` in which\n * keys are the dependency names and values are {@link Dependency}. This\n * structure represents dependencies that need to be added to the importer\n * represented by {@link DepID}.\n */\n add?: AddImportersDependenciesMap\n /**\n * A `Map` object representing nodes to be removed from the ideal graph.\n * Each {@link DepID} key represents an importer node and the `Set` of\n * dependency names to be removed from its dependency list.\n */\n remove?: RemoveImportersDependenciesMap\n /**\n * The {@link Graph} instance that contain the importer nodes to which\n * the manifest data (and it's corresponding `package.json` file) are\n * going to be updated.\n */\n graph: Graph\n /**\n * An instance of {@link PackageJson} to use when writing updated manifest\n * data to `package.json` files. It's necessary that this is the same\n * instance used to load these `package.json` files previously.\n */\n packageJson: PackageJson\n}\n\nconst addOrRemoveDeps = (\n importerId: DepID,\n graph: Graph,\n addOrRemove?:\n | AddImportersDependenciesMap\n | RemoveImportersDependenciesMap,\n): Manifest | undefined => {\n const importer = graph.nodes.get(importerId)\n if (!importer) {\n throw error('Failed to retrieve importer node', {\n found: importerId,\n })\n }\n const manifest = importer.manifest\n if (!manifest) {\n throw error('Could not find manifest data for node', {\n found: importerId,\n })\n }\n const deps = addOrRemove?.get(importerId)\n /* c8 ignore start -- impossible but TS doesn't know that */\n if (!deps) {\n throw error('Failed to retrieve added deps info', {\n manifest,\n })\n }\n let manifestChanged = false\n /* c8 ignore stop */\n for (const deleteNameOrAddItem of deps) {\n if (typeof deleteNameOrAddItem === 'string') {\n const name = deleteNameOrAddItem\n // TODO: needs to also remove any possible peerDependenciesMeta\n for (const depType of longDependencyTypes) {\n if (manifest[depType]?.[name]) {\n delete manifest[depType][name]\n manifestChanged = true\n }\n }\n } else {\n const [name, dep] = deleteNameOrAddItem\n // TODO: peerOptional also needs to add peerDependenciesMeta entry\n const depType = depTypesMap.get(dep.type)\n if (!depType) {\n throw error('Failed to retrieve dependency type', {\n validOptions: [...depTypesMap.keys()],\n found: dep.type,\n })\n }\n const node = importer.edgesOut.get(name)?.to\n if (!node) {\n throw error('Dependency node could not be found')\n }\n const [nodeType] = splitDepID(node.id)\n const dependencies =\n manifest[depType] ?? (manifest[depType] = {})\n dependencies[name] =\n (\n nodeType === 'registry' &&\n (!dep.spec.final.semver || !dep.spec.final.range)\n ) ?\n dep.spec.subspec && dep.spec.namedRegistry ?\n `${dep.spec.final.namedRegistry}:${dep.spec.final.name}@${SAVE_PREFIX}${node.version}`\n : `${SAVE_PREFIX}${node.version}`\n : dep.spec.bareSpec\n manifestChanged = true\n }\n }\n return manifestChanged ? manifest : undefined\n}\n\n/**\n * Updates the importers of a provided {@link Graph} accordingly to the\n * provided add or remove arguments.\n */\nexport const updatePackageJson = ({\n add,\n graph,\n packageJson,\n remove,\n}: UpdatePackageJsonOptions) => {\n const manifestsToUpdate = new Set<Manifest>()\n const operations = new Set([add, remove])\n\n for (const operation of operations) {\n if (operation) {\n for (const importerId of operation.keys()) {\n const manifest = addOrRemoveDeps(importerId, graph, operation)\n if (manifest) {\n manifestsToUpdate.add(manifest)\n }\n }\n }\n }\n\n const commit = () => {\n for (const manifest of manifestsToUpdate) {\n packageJson.save(manifest)\n }\n }\n\n return commit\n}\n", "import type { PackageInfoClientOptions } from '@vltpkg/package-info'\nimport { PackageInfoClient } from '@vltpkg/package-info'\nimport type { PackageJson } from '@vltpkg/package-json'\nimport type { LoadOptions } from './actual/load.ts'\nimport { load as actualLoad } from './actual/load.ts'\nimport type { AddImportersDependenciesMap } from './dependencies.ts'\nimport { build as idealBuild } from './ideal/build.ts'\nimport { reify } from './reify/index.ts'\n\nexport type InstallOptions = PackageInfoClientOptions &\n LoadOptions & {\n projectRoot: string\n packageJson: PackageJson\n }\n\nexport const install = async (\n options: InstallOptions,\n add?: AddImportersDependenciesMap,\n) => {\n const mainManifest = options.packageJson.read(options.projectRoot)\n\n const graph = await idealBuild({\n ...options,\n add,\n mainManifest,\n loadManifests: true,\n packageInfo: new PackageInfoClient(options),\n })\n const act = actualLoad({\n ...options,\n mainManifest,\n loadManifests: true,\n })\n const diff = await reify({\n ...options,\n packageInfo: new PackageInfoClient(options),\n add,\n actual: act,\n graph,\n loadManifests: true,\n })\n\n return { graph, diff }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["noop", "name", "resolve", "id", "name", "version", "Spec", "asDepID", "splitDepID", "id", "hydrate", "name", "hydrateTuple", "s", "version", "splitDepID", "nameVersion", "optional", "dev", "id", "name", "version", "basename", "parse", "resolve", "parse", "path", "parse", "path", "path", "parse", "tmp", "basename", "resolve", "id", "error", "id", "randomBytes", "rm", "stat", "basename", "dirname", "relative", "path", "path", "fs", "dirname", "parse", "EE", "Buffer", "realZlib", "Buffer", "realZlib", "list", "Node", "code", "EE", "code", "error", "chunk", "ret", "parse", "dirname", "stat", "fs", "pos", "resolve", "fs", "fs", "parse", "path", "encode", "s", "path", "code", "fs", "stat", "pos", "path", "path", "ENDED", "QUEUE", "PROCESS", "ONDRAIN", "stat", "fs", "code", "path", "fs", "assert", "randomBytes", "fs", "path", "fs", "platform", "fs", "path", "er", "fs", "dirname", "mkdir", "path", "made", "path", "made", "dirname", "dirname", "dirname", "path", "path", "dirname", "made", "parse", "resolve", "platform", "path", "mkdir", "mkdirSync", "mkdirSync", "mkdir", "path", "mkdirp", "path", "path", "path", "code", "symlink", "path", "fs", "mkdir", "er", "mkdirp", "made", "path", "code", "mkdirSync", "created", "platform", "isWindows", "path", "fn", "FILE", "DIRECTORY", "SYMLINK", "HARDLINK", "ENDED", "platform", "isWindows", "path", "fs", "name", "randomBytes", "code", "encode", "assert", "mkdir", "er", "checkCwd", "mkdirSync", "stat", "fs", "resolve", "fs", "path", "fs", "addFilesSync", "pos", "resolve", "er", "addFilesAsync", "path", "path", "stat", "platform", "rename", "Spec", "path", "tmp", "dirname", "basename", "randomBytes", "rename", "rm", "stat", "relative", "name", "isObj", "name", "inspect", "mkdirSync", "dirname", "resolve", "resolve", "mkdirSync", "dirname", "kCustomInspect", "Spec", "id", "name", "version", "inspect", "resolve", "asDepID", "id", "id", "name", "splitDepID", "resolve", "lockfileData", "path", "name", "Spec", "load", "graph", "name", "Spec", "id", "name", "path", "id", "isStringArray", "Spec", "name", "name", "getMap", "load", "rename", "basename", "dirname", "resolve", "path", "dirname", "basename", "rename", "availableParallelism", "os", "limit", "resolve", "run", "kCustomInspect", "id", "load", "load", "mkdir", "symlink", "dirname", "relative", "name", "mkdir", "dirname", "symlink", "path", "relative", "target", "del", "addNodes", "statSync", "list", "build", "path", "_path", "install", "statSync", "name", "path", "path", "name", "availableParallelism", "actual", "load", "addNodes", "build", "load"]
|
|
7
|
-
}
|