MCPcopy Index your code
hub / github.com/nodejs/corepack / installFromTarball

Method installFromTarball

sources/commands/InstallGlobal.ts:76–122  ·  view source on GitHub ↗
(p: string)

Source from the content-addressed store, hash-verified

74 }
75
76 async installFromTarball(p: string) {
77 const installFolder = folderUtils.getInstallFolder();
78
79 const archiveEntries = new Map<string, Set<string>>();
80 const {list: tarT} = await import(`tar/list`);
81
82 let hasShortEntries = false;
83
84 await tarT({file: p, onentry: entry => {
85 const segments = entry.path.split(/\//g);
86 if (segments.length > 0 && segments[segments.length - 1] !== `.corepack`)
87 return;
88
89 if (segments.length < 3) {
90 hasShortEntries = true;
91 } else {
92 let references = archiveEntries.get(segments[0]);
93 if (typeof references === `undefined`)
94 archiveEntries.set(segments[0], references = new Set());
95
96 references.add(segments[1]);
97 }
98 }});
99
100 if (hasShortEntries || archiveEntries.size < 1)
101 throw new UsageError(`Invalid archive format; did it get generated by 'corepack pack'?`);
102
103 const {extract: tarX} = await import(`tar/extract`);
104
105 for (const [name, references] of archiveEntries) {
106 for (const reference of references) {
107 if (!isSupportedPackageManager(name))
108 throw new UsageError(`Unsupported package manager '${name}'`);
109
110 this.log({name, reference});
111
112 // Recreate the folder in case it was deleted somewhere else:
113 await fs.promises.mkdir(installFolder, {recursive: true});
114
115 await tarX({file: p, cwd: installFolder}, [`${name}/${reference}`]);
116
117 if (!this.cacheOnly) {
118 await this.context.engine.activatePackageManager({name, reference});
119 }
120 }
121 }
122 }
123}

Callers 1

executeMethod · 0.95

Calls 3

logMethod · 0.95

Tested by

no test coverage detected