@verdaccio/tarball 12.0.0-next-7.13 → 12.0.0-next-7.14

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/CHANGELOG.md CHANGED
@@ -1,5 +1,15 @@
1
1
  # Change Log
2
2
 
3
+ ## 12.0.0-next-7.14
4
+
5
+ ### Patch Changes
6
+
7
+ - 253cc13: feat: add tarball details for published packages
8
+ - Updated dependencies [b0946b2]
9
+ - @verdaccio/url@12.0.0-next-7.14
10
+ - @verdaccio/core@7.0.0-next-7.14
11
+ - @verdaccio/utils@7.0.0-next-7.14
12
+
3
13
  ## 12.0.0-next-7.13
4
14
 
5
15
  ### Patch Changes
@@ -0,0 +1,7 @@
1
+ /// <reference types="node" />
2
+ import { Readable } from 'stream';
3
+ export type TarballDetails = {
4
+ fileCount: number;
5
+ unpackedSize: number;
6
+ };
7
+ export declare function getTarballDetails(readable: Readable): Promise<TarballDetails>;
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.getTarballDetails = getTarballDetails;
7
+ var _gunzipMaybe = _interopRequireDefault(require("gunzip-maybe"));
8
+ var tarStream = _interopRequireWildcard(require("tar-stream"));
9
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
10
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
11
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
12
+ async function getTarballDetails(readable) {
13
+ let fileCount = 0;
14
+ let unpackedSize = 0;
15
+ const unpack = tarStream.extract();
16
+ return new Promise((resolve, reject) => {
17
+ readable.pipe((0, _gunzipMaybe.default)()).pipe(unpack).on('entry', (header, stream, next) => {
18
+ fileCount++;
19
+ unpackedSize += Number(header.size);
20
+ stream.resume(); // important to ensure that "entry" events keep firing
21
+ next();
22
+ }).on('finish', () => {
23
+ resolve({
24
+ fileCount,
25
+ unpackedSize
26
+ });
27
+ }).on('error', reject);
28
+ });
29
+ }
30
+ //# sourceMappingURL=getTarballDetails.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getTarballDetails.js","names":["_gunzipMaybe","_interopRequireDefault","require","tarStream","_interopRequireWildcard","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","prototype","hasOwnProperty","call","i","set","obj","getTarballDetails","readable","fileCount","unpackedSize","unpack","extract","Promise","resolve","reject","pipe","gunzipMaybe","on","header","stream","next","Number","size","resume"],"sources":["../src/getTarballDetails.ts"],"sourcesContent":["import gunzipMaybe from 'gunzip-maybe';\nimport { Readable } from 'stream';\nimport * as tarStream from 'tar-stream';\n\nexport type TarballDetails = {\n fileCount: number;\n unpackedSize: number; // in bytes\n};\n\nexport async function getTarballDetails(readable: Readable): Promise<TarballDetails> {\n let fileCount = 0;\n let unpackedSize = 0;\n\n const unpack = tarStream.extract();\n\n return new Promise((resolve, reject) => {\n readable\n .pipe(gunzipMaybe())\n .pipe(unpack)\n .on('entry', (header, stream, next) => {\n fileCount++;\n unpackedSize += Number(header.size);\n stream.resume(); // important to ensure that \"entry\" events keep firing\n next();\n })\n .on('finish', () => {\n resolve({\n fileCount,\n unpackedSize,\n });\n })\n .on('error', reject);\n });\n}\n"],"mappings":";;;;;;AAAA,IAAAA,YAAA,GAAAC,sBAAA,CAAAC,OAAA;AAEA,IAAAC,SAAA,GAAAC,uBAAA,CAAAF,OAAA;AAAwC,SAAAG,yBAAAC,CAAA,6BAAAC,OAAA,mBAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAF,wBAAA,YAAAA,CAAAC,CAAA,WAAAA,CAAA,GAAAG,CAAA,GAAAD,CAAA,KAAAF,CAAA;AAAA,SAAAF,wBAAAE,CAAA,EAAAE,CAAA,SAAAA,CAAA,IAAAF,CAAA,IAAAA,CAAA,CAAAI,UAAA,SAAAJ,CAAA,eAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,WAAAK,OAAA,EAAAL,CAAA,QAAAG,CAAA,GAAAJ,wBAAA,CAAAG,CAAA,OAAAC,CAAA,IAAAA,CAAA,CAAAG,GAAA,CAAAN,CAAA,UAAAG,CAAA,CAAAI,GAAA,CAAAP,CAAA,OAAAQ,CAAA,KAAAC,SAAA,UAAAC,CAAA,GAAAC,MAAA,CAAAC,cAAA,IAAAD,MAAA,CAAAE,wBAAA,WAAAC,CAAA,IAAAd,CAAA,oBAAAc,CAAA,IAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAjB,CAAA,EAAAc,CAAA,SAAAI,CAAA,GAAAR,CAAA,GAAAC,MAAA,CAAAE,wBAAA,CAAAb,CAAA,EAAAc,CAAA,UAAAI,CAAA,KAAAA,CAAA,CAAAX,GAAA,IAAAW,CAAA,CAAAC,GAAA,IAAAR,MAAA,CAAAC,cAAA,CAAAJ,CAAA,EAAAM,CAAA,EAAAI,CAAA,IAAAV,CAAA,CAAAM,CAAA,IAAAd,CAAA,CAAAc,CAAA,YAAAN,CAAA,CAAAH,OAAA,GAAAL,CAAA,EAAAG,CAAA,IAAAA,CAAA,CAAAgB,GAAA,CAAAnB,CAAA,EAAAQ,CAAA,GAAAA,CAAA;AAAA,SAAAb,uBAAAyB,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAhB,UAAA,GAAAgB,GAAA,KAAAf,OAAA,EAAAe,GAAA;AAOjC,eAAeC,iBAAiBA,CAACC,QAAkB,EAA2B;EACnF,IAAIC,SAAS,GAAG,CAAC;EACjB,IAAIC,YAAY,GAAG,CAAC;EAEpB,MAAMC,MAAM,GAAG5B,SAAS,CAAC6B,OAAO,CAAC,CAAC;EAElC,OAAO,IAAIC,OAAO,CAAC,CAACC,OAAO,EAAEC,MAAM,KAAK;IACtCP,QAAQ,CACLQ,IAAI,CAAC,IAAAC,oBAAW,EAAC,CAAC,CAAC,CACnBD,IAAI,CAACL,MAAM,CAAC,CACZO,EAAE,CAAC,OAAO,EAAE,CAACC,MAAM,EAAEC,MAAM,EAAEC,IAAI,KAAK;MACrCZ,SAAS,EAAE;MACXC,YAAY,IAAIY,MAAM,CAACH,MAAM,CAACI,IAAI,CAAC;MACnCH,MAAM,CAACI,MAAM,CAAC,CAAC,CAAC,CAAC;MACjBH,IAAI,CAAC,CAAC;IACR,CAAC,CAAC,CACDH,EAAE,CAAC,QAAQ,EAAE,MAAM;MAClBJ,OAAO,CAAC;QACNL,SAAS;QACTC;MACF,CAAC,CAAC;IACJ,CAAC,CAAC,CACDQ,EAAE,CAAC,OAAO,EAAEH,MAAM,CAAC;EACxB,CAAC,CAAC;AACJ"}
package/build/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import { RequestOptions } from '@verdaccio/url';
2
2
  export { convertDistRemoteToLocalTarballUrls, convertDistVersionToLocalTarballsUrl, } from './convertDistRemoteToLocalTarballUrls';
3
3
  export { extractTarballFromUrl, getLocalRegistryTarballUri } from './getLocalRegistryTarballUri';
4
+ export { TarballDetails, getTarballDetails } from './getTarballDetails';
4
5
  export { RequestOptions };
package/build/index.js CHANGED
@@ -9,6 +9,12 @@ Object.defineProperty(exports, "RequestOptions", {
9
9
  return _url.RequestOptions;
10
10
  }
11
11
  });
12
+ Object.defineProperty(exports, "TarballDetails", {
13
+ enumerable: true,
14
+ get: function () {
15
+ return _getTarballDetails.TarballDetails;
16
+ }
17
+ });
12
18
  Object.defineProperty(exports, "convertDistRemoteToLocalTarballUrls", {
13
19
  enumerable: true,
14
20
  get: function () {
@@ -33,7 +39,14 @@ Object.defineProperty(exports, "getLocalRegistryTarballUri", {
33
39
  return _getLocalRegistryTarballUri.getLocalRegistryTarballUri;
34
40
  }
35
41
  });
42
+ Object.defineProperty(exports, "getTarballDetails", {
43
+ enumerable: true,
44
+ get: function () {
45
+ return _getTarballDetails.getTarballDetails;
46
+ }
47
+ });
36
48
  var _url = require("@verdaccio/url");
37
49
  var _convertDistRemoteToLocalTarballUrls = require("./convertDistRemoteToLocalTarballUrls");
38
50
  var _getLocalRegistryTarballUri = require("./getLocalRegistryTarballUri");
51
+ var _getTarballDetails = require("./getTarballDetails");
39
52
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["_url","require","_convertDistRemoteToLocalTarballUrls","_getLocalRegistryTarballUri"],"sources":["../src/index.ts"],"sourcesContent":["import { RequestOptions } from '@verdaccio/url';\n\nexport {\n convertDistRemoteToLocalTarballUrls,\n convertDistVersionToLocalTarballsUrl,\n} from './convertDistRemoteToLocalTarballUrls';\nexport { extractTarballFromUrl, getLocalRegistryTarballUri } from './getLocalRegistryTarballUri';\n\nexport { RequestOptions };\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,IAAA,GAAAC,OAAA;AAEA,IAAAC,oCAAA,GAAAD,OAAA;AAIA,IAAAE,2BAAA,GAAAF,OAAA"}
1
+ {"version":3,"file":"index.js","names":["_url","require","_convertDistRemoteToLocalTarballUrls","_getLocalRegistryTarballUri","_getTarballDetails"],"sources":["../src/index.ts"],"sourcesContent":["import { RequestOptions } from '@verdaccio/url';\n\nexport {\n convertDistRemoteToLocalTarballUrls,\n convertDistVersionToLocalTarballsUrl,\n} from './convertDistRemoteToLocalTarballUrls';\nexport { extractTarballFromUrl, getLocalRegistryTarballUri } from './getLocalRegistryTarballUri';\nexport { TarballDetails, getTarballDetails } from './getTarballDetails';\n\nexport { RequestOptions };\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,IAAA,GAAAC,OAAA;AAEA,IAAAC,oCAAA,GAAAD,OAAA;AAIA,IAAAE,2BAAA,GAAAF,OAAA;AACA,IAAAG,kBAAA,GAAAH,OAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@verdaccio/tarball",
3
- "version": "12.0.0-next-7.13",
3
+ "version": "12.0.0-next-7.14",
4
4
  "description": "tarball utilities resolver",
5
5
  "keywords": [
6
6
  "private",
@@ -24,7 +24,7 @@
24
24
  "repository": {
25
25
  "type": "https",
26
26
  "url": "https://github.com/verdaccio/verdaccio",
27
- "directory": "packages/core/url-resolver"
27
+ "directory": "packages/core/tarball"
28
28
  },
29
29
  "bugs": {
30
30
  "url": "https://github.com/verdaccio/verdaccio/issues"
@@ -33,11 +33,13 @@
33
33
  "access": "public"
34
34
  },
35
35
  "dependencies": {
36
+ "@verdaccio/core": "7.0.0-next-7.14",
37
+ "@verdaccio/url": "12.0.0-next-7.14",
38
+ "@verdaccio/utils": "7.0.0-next-7.14",
36
39
  "debug": "4.3.4",
37
- "@verdaccio/core": "7.0.0-next-7.13",
38
- "@verdaccio/url": "12.0.0-next-7.13",
39
- "@verdaccio/utils": "7.0.0-next-7.13",
40
- "lodash": "4.17.21"
40
+ "gunzip-maybe": "^1.4.2",
41
+ "lodash": "4.17.21",
42
+ "tar-stream": "^3.1.7"
41
43
  },
42
44
  "devDependencies": {
43
45
  "@verdaccio/types": "12.0.0-next.2",
@@ -0,0 +1,34 @@
1
+ import gunzipMaybe from 'gunzip-maybe';
2
+ import { Readable } from 'stream';
3
+ import * as tarStream from 'tar-stream';
4
+
5
+ export type TarballDetails = {
6
+ fileCount: number;
7
+ unpackedSize: number; // in bytes
8
+ };
9
+
10
+ export async function getTarballDetails(readable: Readable): Promise<TarballDetails> {
11
+ let fileCount = 0;
12
+ let unpackedSize = 0;
13
+
14
+ const unpack = tarStream.extract();
15
+
16
+ return new Promise((resolve, reject) => {
17
+ readable
18
+ .pipe(gunzipMaybe())
19
+ .pipe(unpack)
20
+ .on('entry', (header, stream, next) => {
21
+ fileCount++;
22
+ unpackedSize += Number(header.size);
23
+ stream.resume(); // important to ensure that "entry" events keep firing
24
+ next();
25
+ })
26
+ .on('finish', () => {
27
+ resolve({
28
+ fileCount,
29
+ unpackedSize,
30
+ });
31
+ })
32
+ .on('error', reject);
33
+ });
34
+ }
package/src/index.ts CHANGED
@@ -5,5 +5,6 @@ export {
5
5
  convertDistVersionToLocalTarballsUrl,
6
6
  } from './convertDistRemoteToLocalTarballUrls';
7
7
  export { extractTarballFromUrl, getLocalRegistryTarballUri } from './getLocalRegistryTarballUri';
8
+ export { TarballDetails, getTarballDetails } from './getTarballDetails';
8
9
 
9
10
  export { RequestOptions };
Binary file
Binary file
@@ -0,0 +1,37 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import { Readable } from 'stream';
4
+
5
+ import { getTarballDetails } from '../src/getTarballDetails.ts';
6
+
7
+ const getFilePath = (filename: string): string => {
8
+ return path.resolve(__dirname, `assets/${filename}`);
9
+ };
10
+
11
+ const getFileBuffer = async (filename: string): Promise<Buffer> => {
12
+ return fs.promises.readFile(getFilePath(filename));
13
+ };
14
+
15
+ describe('getTarballDetails', () => {
16
+ test('should return stats of tarball (gzipped)', async () => {
17
+ const buffer = await getFileBuffer('tarball.tgz');
18
+ const readable = Readable.from(buffer);
19
+ const details = await getTarballDetails(readable);
20
+ expect(details.fileCount).toBe(2);
21
+ expect(details.unpackedSize).toBe(1280);
22
+ });
23
+
24
+ test('should return stats of tarball (uncompressed)', async () => {
25
+ const buffer = await getFileBuffer('tarball.tar');
26
+ const readable = Readable.from(buffer);
27
+ const details = await getTarballDetails(readable);
28
+ expect(details.fileCount).toBe(2);
29
+ expect(details.unpackedSize).toBe(1280);
30
+ });
31
+
32
+ test('should throw an error if the buffer is corrupt', async () => {
33
+ const corruptBuffer = Buffer.from('this is not a tarball');
34
+ const readable = Readable.from(corruptBuffer);
35
+ await expect(getTarballDetails(readable)).rejects.toThrow();
36
+ });
37
+ });