Skip to content

Commit 2d9bf2e

Browse files
committed
feat: use integrity field from yarn.lock as sha512 for nix derivation
Based off canva-public#11
1 parent 0ebc118 commit 2d9bf2e

File tree

1 file changed

+22
-14
lines changed

1 file changed

+22
-14
lines changed

lib/print.js

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ class Package {
157157
* src: {
158158
* type: 'url',
159159
* url: string,
160-
* sha1?: string,
160+
* hash?: string,
161161
* } | {
162162
* type: 'local',
163163
* },
@@ -200,25 +200,36 @@ class Package {
200200
*/
201201
static create(
202202
pkgInfo,
203-
// @ts-ignore because there is no optionalDependencies in the type
204-
{ version, resolved, dependencies = {}, optionalDependencies = {} }
203+
// @ts-ignore because type lacks: integrity, optionalDependencies
204+
{ version, integrity, resolved, dependencies = {}, optionalDependencies = {} }
205205
) {
206206
const { scope = '', name } = Id.parse(pkgInfo.name);
207207

208208
/** @type {Package['src']} */
209209
let src;
210210
if (resolved && resolved.startsWith('https')) {
211211
const parsedUrl = new URL(resolved);
212+
let hash = integrity;
213+
let sha1;
214+
212215
// prettier-ignore
213-
if (['registry.yarnpkg.com', 'registry.npmjs.org'].includes(parsedUrl.host)) {
216+
if (!hash && ['registry.yarnpkg.com', 'registry.npmjs.org'].includes(parsedUrl.host)) {
217+
const urlSha1 = parsedUrl.hash.slice(1);
218+
if (urlSha1) {
219+
sha1 = `sha1-${urlSha1}`;
220+
}
221+
}
222+
223+
if (hash || sha1) {
214224
src = {
215-
sha1: parsedUrl.hash.slice(1), // cut off the first ('#') character
225+
hash,
226+
sha1,
216227
url: parsedUrl.origin + parsedUrl.pathname,
217228
type: 'url',
218229
};
219230
} else {
220231
src = {
221-
sha1: undefined, // We don't provide sha in order to force to override it manually
232+
hash: undefined, // We don't provide hash in order to force to override it manually
222233
url: parsedUrl.origin + parsedUrl.pathname,
223234
type: 'url',
224235
};
@@ -306,7 +317,9 @@ class Package {
306317
renderSrc() {
307318
switch (this.src.type) {
308319
case 'url':
309-
const { url, sha1 } = this.src;
320+
const { url, hash } = this.src;
321+
const hashKey = hash ? "hash" : "sha1";
322+
const hashValue = this.src[hashKey];
310323
// Some of the urls can look like "https://codeload.github.com/xolvio/cucumber-js/tar.gz/cf953cb5b5de30dbcc279f59e4ebff3aa040071c",
311324
// i.e. no extention given. That's why Nix unable to recognize the type of archive so we need to have
312325
// name specified explicitly to all Nix to infer the archive type.
@@ -339,13 +352,8 @@ class Package {
339352
: ''
340353
}
341354
url = "${url}";
342-
${
343-
sha1
344-
? `sha1 = "${sha1}"`
345-
: `sha256 = abort ''
346-
347-
348-
Failed to infer \`sha256\` hash of the \`${this.renderKey()}\` package source from
355+
${hashKey} = ${hashValue ? `"${hashValue}"` : `abort ''
356+
Failed to infer hash of the \`${this.renderKey()}\` package source from
349357
\`${url}\`.
350358
351359
Override \`"${this.renderKey()}".src.sha256\` attribute in order to provide this missing piece to Nix.

0 commit comments

Comments
 (0)