@verdaccio/local-storage 11.0.0-6-next.9 → 11.0.0-6-next.12
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 +89 -0
- package/build/dir-utils.js +2 -2
- package/build/dir-utils.js.map +1 -1
- package/build/fs.d.ts +9 -8
- package/build/fs.js +11 -12
- package/build/fs.js.map +1 -1
- package/build/local-database.d.ts +4 -4
- package/build/local-database.js +19 -58
- package/build/local-database.js.map +1 -1
- package/build/local-fs.d.ts +30 -2
- package/build/local-fs.js +181 -18
- package/build/local-fs.js.map +1 -1
- package/build/pkg-utils.js.map +1 -1
- package/build/token.d.ts +1 -1
- package/build/token.js +2 -8
- package/build/token.js.map +1 -1
- package/build/utils.js +4 -4
- package/build/utils.js.map +1 -1
- package/package.json +11 -10
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,94 @@
|
|
|
1
1
|
# Change Log
|
|
2
2
|
|
|
3
|
+
## 11.0.0-6-next.12
|
|
4
|
+
|
|
5
|
+
### Major Changes
|
|
6
|
+
|
|
7
|
+
- 82cb0f2b: feat!: config.logs throw an error, logging config not longer accept array or logs property
|
|
8
|
+
|
|
9
|
+
### 💥 Breaking change
|
|
10
|
+
|
|
11
|
+
This is valid
|
|
12
|
+
|
|
13
|
+
```yaml
|
|
14
|
+
log: { type: stdout, format: pretty, level: http }
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
This is invalid
|
|
18
|
+
|
|
19
|
+
```yaml
|
|
20
|
+
logs: { type: stdout, format: pretty, level: http }
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
or
|
|
24
|
+
|
|
25
|
+
```yaml
|
|
26
|
+
logs:
|
|
27
|
+
- [{ type: stdout, format: pretty, level: http }]
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### Minor Changes
|
|
31
|
+
|
|
32
|
+
- 5167bb52: feat: ui search support for remote, local and private packages
|
|
33
|
+
|
|
34
|
+
The command `npm search` search globally and return all matches, with this improvement the user interface
|
|
35
|
+
is powered with the same capabilities.
|
|
36
|
+
|
|
37
|
+
The UI also tag where is the origin the package with a tag, also provide the latest version and description of the package.
|
|
38
|
+
|
|
39
|
+
### Patch Changes
|
|
40
|
+
|
|
41
|
+
- Updated dependencies [82cb0f2b]
|
|
42
|
+
- Updated dependencies [5167bb52]
|
|
43
|
+
- @verdaccio/core@6.0.0-6-next.5
|
|
44
|
+
- @verdaccio/file-locking@11.0.0-6-next.4
|
|
45
|
+
- @verdaccio/streams@11.0.0-6-next.5
|
|
46
|
+
|
|
47
|
+
## 11.0.0-6-next.11
|
|
48
|
+
|
|
49
|
+
### Major Changes
|
|
50
|
+
|
|
51
|
+
- a828271d: refactor: download manifest endpoint and integrate fastify
|
|
52
|
+
|
|
53
|
+
Much simpler API for fetching a package
|
|
54
|
+
|
|
55
|
+
```
|
|
56
|
+
const manifest = await storage.getPackageNext({
|
|
57
|
+
name,
|
|
58
|
+
uplinksLook: true,
|
|
59
|
+
req,
|
|
60
|
+
version: queryVersion,
|
|
61
|
+
requestOptions,
|
|
62
|
+
});
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
> not perfect, the `req` still is being passed to the proxy (this has to be refactored at proxy package) and then removed from here, in proxy we pass the request instance to the `request` library.
|
|
66
|
+
|
|
67
|
+
### Details
|
|
68
|
+
|
|
69
|
+
- `async/await` sugar for getPackage()
|
|
70
|
+
- Improve and reuse code between current implementation and new fastify endpoint (add scaffolding for request manifest)
|
|
71
|
+
- Improve performance
|
|
72
|
+
- Add new tests
|
|
73
|
+
|
|
74
|
+
### Breaking changes
|
|
75
|
+
|
|
76
|
+
All storage plugins will stop to work since the storage uses `getPackageNext` method which is Promise based, I won't replace this now because will force me to update all plugins, I'll follow up in another PR. Currently will throw http 500
|
|
77
|
+
|
|
78
|
+
### Patch Changes
|
|
79
|
+
|
|
80
|
+
- Updated dependencies [24b9be02]
|
|
81
|
+
- @verdaccio/core@6.0.0-6-next.4
|
|
82
|
+
- @verdaccio/file-locking@11.0.0-6-next.4
|
|
83
|
+
- @verdaccio/streams@11.0.0-6-next.5
|
|
84
|
+
|
|
85
|
+
## 11.0.0-6-next.10
|
|
86
|
+
|
|
87
|
+
### Patch Changes
|
|
88
|
+
|
|
89
|
+
- Updated dependencies [6c1eb021]
|
|
90
|
+
- @verdaccio/core@6.0.0-6-next.3
|
|
91
|
+
|
|
3
92
|
## 11.0.0-6-next.9
|
|
4
93
|
|
|
5
94
|
### Minor Changes
|
package/build/dir-utils.js
CHANGED
|
@@ -6,11 +6,11 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
exports.getFolders = getFolders;
|
|
7
7
|
exports.searchOnStorage = searchOnStorage;
|
|
8
8
|
|
|
9
|
-
var
|
|
9
|
+
var _debug = _interopRequireDefault(require("debug"));
|
|
10
10
|
|
|
11
11
|
var _globby = _interopRequireDefault(require("globby"));
|
|
12
12
|
|
|
13
|
-
var
|
|
13
|
+
var _path = require("path");
|
|
14
14
|
|
|
15
15
|
var _core = require("@verdaccio/core");
|
|
16
16
|
|
package/build/dir-utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/dir-utils.ts"],"names":["debug","getFolders","storagePath","pattern","files","cwd","expandDirectories","onlyDirectories","onlyFiles","deep","dot","followSymbolicLinks","caseSensitiveMatch","unique","searchOnStorage","storages","matchedStorages","Array","from","storageFolders","keys","length","results","basePathFolders","filter","storageFolder","includes","store","validatioUtils","isPackageNameScoped","scopedPackages","listScoped","map","scoped","name","push","foldersOnStorage","pkgName"],"mappings":";;;;;;;;AAAA;;AACA;;AACA;;
|
|
1
|
+
{"version":3,"sources":["../src/dir-utils.ts"],"names":["debug","getFolders","storagePath","pattern","files","cwd","expandDirectories","onlyDirectories","onlyFiles","deep","dot","followSymbolicLinks","caseSensitiveMatch","unique","searchOnStorage","storages","matchedStorages","Array","from","storageFolders","keys","length","results","basePathFolders","filter","storageFolder","includes","store","validatioUtils","isPackageNameScoped","scopedPackages","listScoped","map","scoped","name","push","foldersOnStorage","pkgName"],"mappings":"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","sourcesContent":["import buildDebug from 'debug';\nimport globby from 'globby';\nimport { join } from 'path';\n\nimport { searchUtils, validatioUtils } from '@verdaccio/core';\n\nconst debug = buildDebug('verdaccio:plugin:local-storage:utils');\n\n/**\n * Retrieve a list of absolute paths to all folders in the given storage path\n * @param storagePath the base path of the storage\n * @return a promise that resolves to an array of absolute paths\n */\nexport async function getFolders(storagePath: string, pattern = '*'): Promise<string[]> {\n // @ts-ignore - check why this fails, types are correct\n const files = await globby(pattern, {\n // @ts-ignore\n cwd: storagePath,\n expandDirectories: true,\n onlyDirectories: true,\n onlyFiles: false,\n // should not go deeper than the storage path (10 is reseaon for the storage))\n deep: 10,\n dot: false,\n followSymbolicLinks: true,\n caseSensitiveMatch: true,\n unique: true,\n // FIXME: add here list of forbiden patterns\n // don't include scoped folders.\n // ignore: [`@*`],\n });\n return files;\n}\n\n/**\n * Search packages on the the storage. The storage could be\n * - storage\n * - pkg1\n * - @company\n * - pkg2 -> @scompany/pkg2\n * - storage1\n * - pkg2\n * - pkg3\n * - storage2\n * - @scope\n * - pkg4 > @scope/pkg4\n * The search return a data structure like:\n * [\n * {\n * name: 'pkg1', // package name could be @scope/pkg1\n * path: absolute/path/package/name\n * }\n * ]\n * @param {string} storagePath is the base path of the storage folder,\n * inside could be packages, storages and @scope packages.\n * @param {Set<string>} storages storages are defined peer package access pattern via `storage` property\n * @param query is the search query from the user via npm search command.\n * and are intended to organize packages in a tree structure.\n * @returns {Promise<searchUtils.SearchItemPkg[]>}\n */\nexport async function searchOnStorage(\n storagePath: string,\n storages: Map<string, string>\n): Promise<searchUtils.SearchItemPkg[]> {\n const matchedStorages = Array.from(storages);\n const storageFolders = Array.from(storages.keys());\n // const getScopedFolders = async (pkgName) => {\n // const scopedPackages = await getFolders(join(storagePath, pkgName), '*');\n // const listScoped = scopedPackages.map((scoped) => ({\n // name: `${pkgName}/${scoped}`,\n // }));\n // };\n debug('search on %o', storagePath);\n debug('storage folders %o', matchedStorages.length);\n let results: searchUtils.SearchItemPkg[] = [];\n // watch base path and ignore storage folders\n const basePathFolders = (await getFolders(storagePath, '*')).filter(\n (storageFolder) => !storageFolders.includes(storageFolder)\n );\n\n for (let store of basePathFolders) {\n if (validatioUtils.isPackageNameScoped(store)) {\n const scopedPackages = await getFolders(join(storagePath, store), '*');\n const listScoped = scopedPackages.map((scoped) => ({\n name: `${store}/${scoped}`,\n scoped: store,\n }));\n results.push(...listScoped);\n } else {\n results.push({\n name: store,\n });\n }\n }\n\n // iterate each storage folder\n for (const store of storageFolders) {\n const foldersOnStorage = await getFolders(join(storagePath, store), '*');\n for (let pkgName of foldersOnStorage) {\n if (validatioUtils.isPackageNameScoped(pkgName)) {\n const scopedPackages = await getFolders(join(storagePath, store, pkgName), '*');\n const listScoped = scopedPackages.map((scoped) => ({\n name: `${pkgName}/${scoped}`,\n scoped: pkgName,\n }));\n results.push(...listScoped);\n } else {\n results.push({\n name: pkgName,\n });\n }\n }\n }\n\n return results;\n}\n"],"file":"dir-utils.js"}
|
package/build/fs.d.ts
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
|
-
import fs from 'fs';
|
|
3
|
-
declare const mkdirPromise: typeof fs.mkdir
|
|
4
|
-
declare const writeFilePromise: typeof fs.writeFile
|
|
5
|
-
declare const readdirPromise: typeof fs.readdir
|
|
6
|
-
declare const statPromise: typeof fs.stat
|
|
7
|
-
declare const unlinkPromise: typeof fs.unlink
|
|
8
|
-
declare const rmdirPromise: typeof fs.rmdir
|
|
2
|
+
import fs from 'fs/promises';
|
|
3
|
+
declare const mkdirPromise: typeof fs.mkdir;
|
|
4
|
+
declare const writeFilePromise: typeof fs.writeFile;
|
|
5
|
+
declare const readdirPromise: typeof fs.readdir;
|
|
6
|
+
declare const statPromise: typeof fs.stat;
|
|
7
|
+
declare const unlinkPromise: typeof fs.unlink;
|
|
8
|
+
declare const rmdirPromise: typeof fs.rmdir;
|
|
9
|
+
declare const renamePromise: typeof fs.rename;
|
|
9
10
|
export declare const readFilePromise: (path: any) => Promise<string>;
|
|
10
|
-
export { mkdirPromise, writeFilePromise, readdirPromise, statPromise, unlinkPromise, rmdirPromise };
|
|
11
|
+
export { renamePromise, mkdirPromise, writeFilePromise, readdirPromise, statPromise, unlinkPromise, rmdirPromise, };
|
package/build/fs.js
CHANGED
|
@@ -3,28 +3,27 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.
|
|
6
|
+
exports.writeFilePromise = exports.unlinkPromise = exports.statPromise = exports.rmdirPromise = exports.renamePromise = exports.readdirPromise = exports.readFilePromise = exports.mkdirPromise = void 0;
|
|
7
7
|
|
|
8
|
-
var
|
|
9
|
-
|
|
10
|
-
var _fs = _interopRequireDefault(require("fs"));
|
|
8
|
+
var _promises = _interopRequireDefault(require("fs/promises"));
|
|
11
9
|
|
|
12
10
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
13
11
|
|
|
14
|
-
|
|
15
|
-
const
|
|
16
|
-
const mkdirPromise = (0, _util.promisify)(_fs.default.mkdir);
|
|
12
|
+
const readFile = _promises.default.readFile;
|
|
13
|
+
const mkdirPromise = _promises.default.mkdir;
|
|
17
14
|
exports.mkdirPromise = mkdirPromise;
|
|
18
|
-
const writeFilePromise =
|
|
15
|
+
const writeFilePromise = _promises.default.writeFile;
|
|
19
16
|
exports.writeFilePromise = writeFilePromise;
|
|
20
|
-
const readdirPromise =
|
|
17
|
+
const readdirPromise = _promises.default.readdir;
|
|
21
18
|
exports.readdirPromise = readdirPromise;
|
|
22
|
-
const statPromise =
|
|
19
|
+
const statPromise = _promises.default.stat;
|
|
23
20
|
exports.statPromise = statPromise;
|
|
24
|
-
const unlinkPromise =
|
|
21
|
+
const unlinkPromise = _promises.default.unlink;
|
|
25
22
|
exports.unlinkPromise = unlinkPromise;
|
|
26
|
-
const rmdirPromise =
|
|
23
|
+
const rmdirPromise = _promises.default.rmdir;
|
|
27
24
|
exports.rmdirPromise = rmdirPromise;
|
|
25
|
+
const renamePromise = _promises.default.rename;
|
|
26
|
+
exports.renamePromise = renamePromise;
|
|
28
27
|
|
|
29
28
|
const readFilePromise = async path => {
|
|
30
29
|
return await readFile(path, 'utf8');
|
package/build/fs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/fs.ts"],"names":["readFile","fs","mkdirPromise","mkdir","writeFilePromise","writeFile","readdirPromise","readdir","statPromise","stat","unlinkPromise","unlink","rmdirPromise","rmdir","readFilePromise","path"],"mappings":";;;;;;;AAAA
|
|
1
|
+
{"version":3,"sources":["../src/fs.ts"],"names":["readFile","fs","mkdirPromise","mkdir","writeFilePromise","writeFile","readdirPromise","readdir","statPromise","stat","unlinkPromise","unlink","rmdirPromise","rmdir","renamePromise","rename","readFilePromise","path"],"mappings":";;;;;;;AAAA;;;;AAEA,MAAMA,QAAQ,GAAGC,kBAAGD,QAApB;AACA,MAAME,YAAY,GAAGD,kBAAGE,KAAxB;;AACA,MAAMC,gBAAgB,GAAGH,kBAAGI,SAA5B;;AACA,MAAMC,cAAc,GAAGL,kBAAGM,OAA1B;;AACA,MAAMC,WAAW,GAAGP,kBAAGQ,IAAvB;;AACA,MAAMC,aAAa,GAAGT,kBAAGU,MAAzB;;AACA,MAAMC,YAAY,GAAGX,kBAAGY,KAAxB;;AACA,MAAMC,aAAa,GAAGb,kBAAGc,MAAzB;;;AAEO,MAAMC,eAAe,GAAG,MAAOC,IAAP,IAAgB;AAC7C,SAAO,MAAMjB,QAAQ,CAACiB,IAAD,EAAO,MAAP,CAArB;AACD,CAFM","sourcesContent":["import fs from 'fs/promises';\n\nconst readFile = fs.readFile;\nconst mkdirPromise = fs.mkdir;\nconst writeFilePromise = fs.writeFile;\nconst readdirPromise = fs.readdir;\nconst statPromise = fs.stat;\nconst unlinkPromise = fs.unlink;\nconst rmdirPromise = fs.rmdir;\nconst renamePromise = fs.rename;\n\nexport const readFilePromise = async (path) => {\n return await readFile(path, 'utf8');\n};\n\nexport {\n renamePromise,\n mkdirPromise,\n writeFilePromise,\n readdirPromise,\n statPromise,\n unlinkPromise,\n rmdirPromise,\n};\n"],"file":"fs.js"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
+
import { pluginUtils, searchUtils } from '@verdaccio/core';
|
|
1
2
|
import { Config, IPackageStorage, LocalStorage, Logger } from '@verdaccio/types';
|
|
2
|
-
import { searchUtils, pluginUtils } from '@verdaccio/core';
|
|
3
3
|
import TokenActions from './token';
|
|
4
4
|
export declare const ERROR_DB_LOCKED = "Database is locked, please check error message printed during startup to prevent data loss";
|
|
5
5
|
declare type IPluginStorage = pluginUtils.IPluginStorage<{}>;
|
|
@@ -8,7 +8,7 @@ declare class LocalDatabase extends TokenActions implements IPluginStorage {
|
|
|
8
8
|
private readonly logger;
|
|
9
9
|
readonly config: Config;
|
|
10
10
|
readonly storages: Map<string, string>;
|
|
11
|
-
data: LocalStorage |
|
|
11
|
+
data: LocalStorage | undefined;
|
|
12
12
|
locked: boolean;
|
|
13
13
|
constructor(config: Config, logger: Logger);
|
|
14
14
|
init(): Promise<void>;
|
|
@@ -23,7 +23,7 @@ declare class LocalDatabase extends TokenActions implements IPluginStorage {
|
|
|
23
23
|
private getStoragePath;
|
|
24
24
|
private getBaseConfigPath;
|
|
25
25
|
/**
|
|
26
|
-
* Filter
|
|
26
|
+
* Filter and only match those values that the query define.
|
|
27
27
|
**/
|
|
28
28
|
filterByQuery(results: searchUtils.SearchItemPkg[], query: searchUtils.SearchQuery): Promise<searchUtils.SearchItemPkg[]>;
|
|
29
29
|
getScore(_pkg: searchUtils.SearchItemPkg): Promise<searchUtils.Score>;
|
|
@@ -35,6 +35,6 @@ declare class LocalDatabase extends TokenActions implements IPluginStorage {
|
|
|
35
35
|
private _getCustomPackageLocalStorages;
|
|
36
36
|
private _sync;
|
|
37
37
|
private _getLocalStoragePath;
|
|
38
|
-
private
|
|
38
|
+
private fetchLocalPackages;
|
|
39
39
|
}
|
|
40
40
|
export default LocalDatabase;
|
package/build/local-database.js
CHANGED
|
@@ -1,71 +1,40 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
require("core-js/modules/esnext.weak-map.delete-all.js");
|
|
4
|
-
|
|
5
3
|
Object.defineProperty(exports, "__esModule", {
|
|
6
4
|
value: true
|
|
7
5
|
});
|
|
8
6
|
exports.default = exports.ERROR_DB_LOCKED = void 0;
|
|
9
7
|
|
|
10
|
-
require("core-js/modules/esnext.map.delete-all.js");
|
|
11
|
-
|
|
12
|
-
require("core-js/modules/esnext.map.every.js");
|
|
13
|
-
|
|
14
|
-
require("core-js/modules/esnext.map.filter.js");
|
|
15
|
-
|
|
16
|
-
require("core-js/modules/esnext.map.find.js");
|
|
17
|
-
|
|
18
|
-
require("core-js/modules/esnext.map.find-key.js");
|
|
19
|
-
|
|
20
|
-
require("core-js/modules/esnext.map.includes.js");
|
|
21
|
-
|
|
22
|
-
require("core-js/modules/esnext.map.key-of.js");
|
|
23
|
-
|
|
24
|
-
require("core-js/modules/esnext.map.map-keys.js");
|
|
25
|
-
|
|
26
|
-
require("core-js/modules/esnext.map.map-values.js");
|
|
27
|
-
|
|
28
|
-
require("core-js/modules/esnext.map.merge.js");
|
|
29
|
-
|
|
30
|
-
require("core-js/modules/esnext.map.reduce.js");
|
|
31
|
-
|
|
32
|
-
require("core-js/modules/esnext.map.some.js");
|
|
33
|
-
|
|
34
|
-
require("core-js/modules/esnext.map.update.js");
|
|
35
|
-
|
|
36
|
-
var _path = _interopRequireDefault(require("path"));
|
|
37
|
-
|
|
38
8
|
var _debug = _interopRequireDefault(require("debug"));
|
|
39
9
|
|
|
40
10
|
var _lodash = _interopRequireDefault(require("lodash"));
|
|
41
11
|
|
|
12
|
+
var _path = _interopRequireDefault(require("path"));
|
|
13
|
+
|
|
42
14
|
var _core = require("@verdaccio/core");
|
|
43
15
|
|
|
44
16
|
var _utils = require("@verdaccio/utils");
|
|
45
17
|
|
|
18
|
+
var _dirUtils = require("./dir-utils");
|
|
19
|
+
|
|
20
|
+
var _fs = require("./fs");
|
|
21
|
+
|
|
46
22
|
var _localFs = _interopRequireWildcard(require("./local-fs"));
|
|
47
23
|
|
|
48
24
|
var _pkgUtils = require("./pkg-utils");
|
|
49
25
|
|
|
50
26
|
var _token = _interopRequireDefault(require("./token"));
|
|
51
27
|
|
|
52
|
-
var _fs = require("./fs");
|
|
53
|
-
|
|
54
|
-
var _dirUtils = require("./dir-utils");
|
|
55
|
-
|
|
56
28
|
var _utils2 = require("./utils");
|
|
57
29
|
|
|
58
|
-
var _process$env$VERDACCI;
|
|
59
|
-
|
|
60
30
|
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
61
31
|
|
|
62
32
|
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
63
33
|
|
|
64
34
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
65
35
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
const DB_NAME = (_process$env$VERDACCI = process.env.VERDACCIO_STORAGE_NAME) !== null && _process$env$VERDACCI !== void 0 ? _process$env$VERDACCI : _core.fileUtils.Files.DatabaseName;
|
|
36
|
+
// import LRU from 'lru-cache';
|
|
37
|
+
const DB_NAME = process.env.VERDACCIO_STORAGE_NAME ?? _core.fileUtils.Files.DatabaseName;
|
|
69
38
|
const debug = (0, _debug.default)('verdaccio:plugin:local-storage:experimental');
|
|
70
39
|
const ERROR_DB_LOCKED = 'Database is locked, please check error message printed during startup to prevent data loss';
|
|
71
40
|
exports.ERROR_DB_LOCKED = ERROR_DB_LOCKED;
|
|
@@ -73,19 +42,6 @@ exports.ERROR_DB_LOCKED = ERROR_DB_LOCKED;
|
|
|
73
42
|
class LocalDatabase extends _token.default {
|
|
74
43
|
constructor(config, logger) {
|
|
75
44
|
super(config);
|
|
76
|
-
|
|
77
|
-
_defineProperty(this, "path", void 0);
|
|
78
|
-
|
|
79
|
-
_defineProperty(this, "logger", void 0);
|
|
80
|
-
|
|
81
|
-
_defineProperty(this, "config", void 0);
|
|
82
|
-
|
|
83
|
-
_defineProperty(this, "storages", void 0);
|
|
84
|
-
|
|
85
|
-
_defineProperty(this, "data", void 0);
|
|
86
|
-
|
|
87
|
-
_defineProperty(this, "locked", void 0);
|
|
88
|
-
|
|
89
45
|
this.config = config;
|
|
90
46
|
this.logger = logger;
|
|
91
47
|
this.locked = false;
|
|
@@ -97,7 +53,7 @@ class LocalDatabase extends _token.default {
|
|
|
97
53
|
|
|
98
54
|
async init() {
|
|
99
55
|
debug('plugin init');
|
|
100
|
-
this.data = await this.
|
|
56
|
+
this.data = await this.fetchLocalPackages();
|
|
101
57
|
debug('local packages loaded');
|
|
102
58
|
await this._sync();
|
|
103
59
|
}
|
|
@@ -159,7 +115,7 @@ class LocalDatabase extends _token.default {
|
|
|
159
115
|
return _path.default.dirname(this.config.config_path);
|
|
160
116
|
}
|
|
161
117
|
/**
|
|
162
|
-
* Filter
|
|
118
|
+
* Filter and only match those values that the query define.
|
|
163
119
|
**/
|
|
164
120
|
|
|
165
121
|
|
|
@@ -174,6 +130,8 @@ class LocalDatabase extends _token.default {
|
|
|
174
130
|
|
|
175
131
|
|
|
176
132
|
async getScore(_pkg) {
|
|
133
|
+
// TODO: there is no particular reason to predefined scores
|
|
134
|
+
// could be improved by using
|
|
177
135
|
return Promise.resolve({
|
|
178
136
|
final: 1,
|
|
179
137
|
detail: {
|
|
@@ -191,11 +149,13 @@ class LocalDatabase extends _token.default {
|
|
|
191
149
|
debug('packages found %o', packagesOnStorage.length);
|
|
192
150
|
|
|
193
151
|
for (let storage of packagesOnStorage) {
|
|
152
|
+
// check if package is listed on the cache private database
|
|
153
|
+
const isPrivate = this.data.list.includes(storage.name);
|
|
194
154
|
const score = await this.getScore(storage);
|
|
195
155
|
results.push({
|
|
196
156
|
package: storage,
|
|
197
|
-
|
|
198
|
-
|
|
157
|
+
verdaccioPrivate: isPrivate,
|
|
158
|
+
verdaccioPkgCached: !isPrivate,
|
|
199
159
|
score
|
|
200
160
|
});
|
|
201
161
|
}
|
|
@@ -337,7 +297,7 @@ class LocalDatabase extends _token.default {
|
|
|
337
297
|
}
|
|
338
298
|
}
|
|
339
299
|
|
|
340
|
-
async
|
|
300
|
+
async fetchLocalPackages() {
|
|
341
301
|
try {
|
|
342
302
|
return await (0, _pkgUtils.loadPrivatePackages)(this.path, this.logger);
|
|
343
303
|
} catch (err) {
|
|
@@ -350,7 +310,8 @@ class LocalDatabase extends _token.default {
|
|
|
350
310
|
if (err.code !== _localFs.noSuchFile) {
|
|
351
311
|
this.locked = true;
|
|
352
312
|
this.logger.error('Failed to read package database file, please check the error printed below:\n', `File Path: ${this.path}\n\n ${err.message}`);
|
|
353
|
-
}
|
|
313
|
+
} // if no database is found we set empty placeholders
|
|
314
|
+
|
|
354
315
|
|
|
355
316
|
return {
|
|
356
317
|
list: [],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/local-database.ts"],"names":["DB_NAME","process","env","VERDACCIO_STORAGE_NAME","fileUtils","Files","DatabaseName","debug","ERROR_DB_LOCKED","LocalDatabase","TokenActions","constructor","config","logger","locked","data","undefined","path","storages","_getCustomPackageLocalStorages","init","_fetchLocalPackages","_sync","getSecret","Error","Promise","resolve","secret","setSecret","add","name","list","indexOf","push","getStoragePath","storage","TypeError","storagePath","isAbsolute","normalize","join","getBaseConfigPath","dirname","config_path","filterByQuery","results","query","filter","item","match","text","getScore","_pkg","final","detail","maintenance","popularity","quality","search","packagesOnStorage","length","score","package","remove","get","pkgName","splice","err","error","errorUtils","getInternalError","totalItems","getPackageStorage","packageName","packageAccess","packages","packagePath","_getLocalStoragePath","_","isString","packageStoragePath","LocalDriver","clean","Map","Object","keys","map","pkg","set","folderName","recursive","JSON","stringify","globalConfigStorage","isNil","warn","code","noSuchFile","message"],"mappings":"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","sourcesContent":["import path from 'path';\n// import LRU from 'lru-cache';\nimport buildDebug from 'debug';\nimport _ from 'lodash';\nimport { Config, IPackageStorage, LocalStorage, Logger } from '@verdaccio/types';\nimport { errorUtils, searchUtils, pluginUtils, fileUtils } from '@verdaccio/core';\nimport { getMatchedPackagesSpec } from '@verdaccio/utils';\n\nimport LocalDriver, { noSuchFile } from './local-fs';\nimport { loadPrivatePackages } from './pkg-utils';\nimport TokenActions from './token';\nimport { mkdirPromise, writeFilePromise } from './fs';\nimport { searchOnStorage } from './dir-utils';\nimport { _dbGenPath } from './utils';\n\nconst DB_NAME = process.env.VERDACCIO_STORAGE_NAME ?? fileUtils.Files.DatabaseName;\n\nconst debug = buildDebug('verdaccio:plugin:local-storage:experimental');\n\nexport const ERROR_DB_LOCKED =\n 'Database is locked, please check error message printed during startup to prevent data loss';\n\ntype IPluginStorage = pluginUtils.IPluginStorage<{}>;\n\nclass LocalDatabase extends TokenActions implements IPluginStorage {\n private readonly path: string;\n private readonly logger: Logger;\n public readonly config: Config;\n public readonly storages: Map<string, string>;\n public data: LocalStorage | void;\n public locked: boolean;\n\n public constructor(config: Config, logger: Logger) {\n super(config);\n this.config = config;\n this.logger = logger;\n this.locked = false;\n this.data = undefined;\n this.path = _dbGenPath(DB_NAME, config);\n this.storages = this._getCustomPackageLocalStorages();\n debug('plugin storage path %o', this.path);\n }\n\n public async init(): Promise<void> {\n debug('plugin init');\n this.data = await this._fetchLocalPackages();\n debug('local packages loaded');\n await this._sync();\n }\n\n public async getSecret(): Promise<string> {\n if (typeof this.data === 'undefined') {\n throw Error('no data secret available');\n }\n\n return Promise.resolve(this.data.secret);\n }\n\n public async setSecret(secret: string): Promise<void> {\n if (typeof this.data === 'undefined') {\n throw Error('no data secret available');\n } else {\n this.data.secret = secret;\n }\n\n await this._sync();\n }\n\n public async add(name: string): Promise<void> {\n if (typeof this.data === 'undefined') {\n throw Error('no data secret available');\n }\n\n if (this.data.list.indexOf(name) === -1) {\n this.data.list.push(name);\n debug('the private package %s has been added', name);\n await this._sync();\n } else {\n debug('the private package %s already exist on database', name);\n return Promise.resolve();\n }\n }\n\n /**\n * The field storage could be absolute or relative.\n * If relative, it will be resolved against the config path.\n * If absolute, it will be returned as is.\n **/\n private getStoragePath() {\n const { storage } = this.config;\n if (typeof storage !== 'string') {\n throw new TypeError('storage field is mandatory');\n }\n\n const storagePath = path.isAbsolute(storage)\n ? storage\n : path.normalize(path.join(this.getBaseConfigPath(), storage));\n debug('storage path %o', storagePath);\n return storagePath;\n }\n\n private getBaseConfigPath(): string {\n return path.dirname(this.config.config_path);\n }\n\n /**\n * Filter by query.\n **/\n public async filterByQuery(results: searchUtils.SearchItemPkg[], query: searchUtils.SearchQuery) {\n // FUTURE: apply new filters, keyword, version, ...\n return results.filter((item: searchUtils.SearchItemPkg) => {\n return item?.name?.match(query.text) !== null;\n }) as searchUtils.SearchItemPkg[];\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n public async getScore(_pkg: searchUtils.SearchItemPkg): Promise<searchUtils.Score> {\n return Promise.resolve({\n final: 1,\n detail: {\n maintenance: 0,\n popularity: 1,\n quality: 1,\n },\n });\n }\n\n public async search(query: searchUtils.SearchQuery): Promise<searchUtils.SearchItem[]> {\n const results: searchUtils.SearchItem[] = [];\n const storagePath = this.getStoragePath();\n const packagesOnStorage = await this.filterByQuery(\n await searchOnStorage(storagePath, this.storages),\n query\n );\n debug('packages found %o', packagesOnStorage.length);\n for (let storage of packagesOnStorage) {\n const score = await this.getScore(storage);\n results.push({\n package: storage,\n // there is no particular reason to predefined scores\n // could be improved by using\n score,\n });\n }\n return results;\n }\n\n public async remove(name: string): Promise<void> {\n try {\n if (typeof this.data === 'undefined') {\n throw Error('no data secret available');\n }\n\n const data = await this.get();\n\n const pkgName = data.indexOf(name);\n if (pkgName !== -1) {\n this.data.list.splice(pkgName, 1);\n debug('remove package %o has been removed', name);\n }\n await this._sync();\n } catch (err) {\n this.logger.error({ err }, 'remove the private package has failed @{err}');\n throw errorUtils.getInternalError('error remove private package');\n }\n }\n\n public async get(): Promise<any> {\n if (typeof this.data === 'undefined') {\n throw Error('no data secret available');\n }\n\n const { list } = this.data;\n const totalItems = list?.length;\n debug('get full list of packages (%o) has been fetched', totalItems);\n return Promise.resolve(list);\n }\n\n public getPackageStorage(packageName: string): IPackageStorage {\n const packageAccess = getMatchedPackagesSpec(packageName, this.config.packages);\n\n const packagePath: string = this._getLocalStoragePath(\n packageAccess ? packageAccess.storage : undefined\n );\n debug('storage path selected: ', packagePath);\n if (_.isString(packagePath) === false) {\n debug('the package %o has no storage defined ', packageName);\n return;\n }\n\n const packageStoragePath: string = path.join(\n // FIXME: use getBaseStoragePath instead\n path.resolve(path.dirname(this.config.config_path || ''), packagePath),\n packageName\n );\n\n debug('storage absolute path: ', packageStoragePath);\n\n return new LocalDriver(packageStoragePath, this.logger);\n }\n\n public async clean(): Promise<void> {\n await this._sync();\n }\n\n private _getCustomPackageLocalStorages(): Map<string, string> {\n const storages = new Map<string, string>();\n const { packages } = this.config;\n\n if (packages) {\n Object.keys(packages || {}).map((pkg) => {\n const { storage } = packages[pkg];\n if (typeof storage === 'string') {\n const storagePath = path.join(this.getStoragePath(), storage);\n debug('add custom storage for %s on %s', storage, storagePath);\n storages.set(storage, storagePath);\n }\n });\n }\n\n return storages;\n }\n\n private async _sync(): Promise<null> {\n debug('sync database started');\n\n if (this.locked) {\n this.logger.error(ERROR_DB_LOCKED);\n throw new Error(ERROR_DB_LOCKED);\n }\n // Uses sync to prevent ugly race condition\n try {\n const folderName = path.dirname(this.path);\n debug('creating folder %o', folderName);\n await mkdirPromise(folderName, { recursive: true });\n debug('creating folder %o created succeed', folderName);\n } catch (err) {\n this.logger.error({ err }, 'sync create folder has failed with error: @{err}');\n throw err;\n }\n\n try {\n await writeFilePromise(this.path, JSON.stringify(this.data));\n debug('sync write succeed');\n\n return null;\n } catch (err: any) {\n this.logger.error({ err }, 'sync database file failed: @{err}');\n throw err;\n }\n }\n\n private _getLocalStoragePath(storage: string | void): string {\n const globalConfigStorage = this.getStoragePath();\n if (_.isNil(globalConfigStorage)) {\n this.logger.error('property storage in config.yaml is required for using this plugin');\n throw new Error('property storage in config.yaml is required for using this plugin');\n } else {\n if (typeof storage === 'string') {\n return path.join(globalConfigStorage as string, storage as string);\n }\n\n return globalConfigStorage as string;\n }\n }\n\n private async _fetchLocalPackages(): Promise<LocalStorage> {\n try {\n return await loadPrivatePackages(this.path, this.logger);\n } catch (err: any) {\n // readFileSync is platform specific, macOS, Linux and Windows thrown an error\n // Only recreate if file not found to prevent data loss\n this.logger.warn(\n { path: this.path },\n 'no private database found, recreating new one on @{path}'\n );\n if (err.code !== noSuchFile) {\n this.locked = true;\n this.logger.error(\n 'Failed to read package database file, please check the error printed below:\\n',\n `File Path: ${this.path}\\n\\n ${err.message}`\n );\n }\n\n return { list: [], secret: '' };\n }\n }\n}\n\nexport default LocalDatabase;\n"],"file":"local-database.js"}
|
|
1
|
+
{"version":3,"sources":["../src/local-database.ts"],"names":["DB_NAME","process","env","VERDACCIO_STORAGE_NAME","fileUtils","Files","DatabaseName","debug","ERROR_DB_LOCKED","LocalDatabase","TokenActions","constructor","config","logger","locked","data","undefined","path","storages","_getCustomPackageLocalStorages","init","fetchLocalPackages","_sync","getSecret","Error","Promise","resolve","secret","setSecret","add","name","list","indexOf","push","getStoragePath","storage","TypeError","storagePath","isAbsolute","normalize","join","getBaseConfigPath","dirname","config_path","filterByQuery","results","query","filter","item","match","text","getScore","_pkg","final","detail","maintenance","popularity","quality","search","packagesOnStorage","length","isPrivate","includes","score","package","verdaccioPrivate","verdaccioPkgCached","remove","get","pkgName","splice","err","error","errorUtils","getInternalError","totalItems","getPackageStorage","packageName","packageAccess","packages","packagePath","_getLocalStoragePath","_","isString","packageStoragePath","LocalDriver","clean","Map","Object","keys","map","pkg","set","folderName","recursive","JSON","stringify","globalConfigStorage","isNil","warn","code","noSuchFile","message"],"mappings":"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","sourcesContent":["// import LRU from 'lru-cache';\nimport buildDebug from 'debug';\nimport _ from 'lodash';\nimport path from 'path';\n\nimport { errorUtils, fileUtils, pluginUtils, searchUtils } from '@verdaccio/core';\nimport { Config, IPackageStorage, LocalStorage, Logger } from '@verdaccio/types';\nimport { getMatchedPackagesSpec } from '@verdaccio/utils';\n\nimport { searchOnStorage } from './dir-utils';\nimport { mkdirPromise, writeFilePromise } from './fs';\nimport LocalDriver, { noSuchFile } from './local-fs';\nimport { loadPrivatePackages } from './pkg-utils';\nimport TokenActions from './token';\nimport { _dbGenPath } from './utils';\n\nconst DB_NAME = process.env.VERDACCIO_STORAGE_NAME ?? fileUtils.Files.DatabaseName;\n\nconst debug = buildDebug('verdaccio:plugin:local-storage:experimental');\n\nexport const ERROR_DB_LOCKED =\n 'Database is locked, please check error message printed during startup to prevent data loss';\n\ntype IPluginStorage = pluginUtils.IPluginStorage<{}>;\n\nclass LocalDatabase extends TokenActions implements IPluginStorage {\n private readonly path: string;\n private readonly logger: Logger;\n public readonly config: Config;\n public readonly storages: Map<string, string>;\n public data: LocalStorage | undefined;\n public locked: boolean;\n\n public constructor(config: Config, logger: Logger) {\n super(config);\n this.config = config;\n this.logger = logger;\n this.locked = false;\n this.data = undefined;\n this.path = _dbGenPath(DB_NAME, config);\n this.storages = this._getCustomPackageLocalStorages();\n debug('plugin storage path %o', this.path);\n }\n\n public async init(): Promise<void> {\n debug('plugin init');\n this.data = await this.fetchLocalPackages();\n debug('local packages loaded');\n await this._sync();\n }\n\n public async getSecret(): Promise<string> {\n if (typeof this.data === 'undefined') {\n throw Error('no data secret available');\n }\n\n return Promise.resolve(this.data.secret);\n }\n\n public async setSecret(secret: string): Promise<void> {\n if (typeof this.data === 'undefined') {\n throw Error('no data secret available');\n } else {\n this.data.secret = secret;\n }\n\n await this._sync();\n }\n\n public async add(name: string): Promise<void> {\n if (typeof this.data === 'undefined') {\n throw Error('no data secret available');\n }\n\n if (this.data.list.indexOf(name) === -1) {\n this.data.list.push(name);\n debug('the private package %s has been added', name);\n await this._sync();\n } else {\n debug('the private package %s already exist on database', name);\n return Promise.resolve();\n }\n }\n\n /**\n * The field storage could be absolute or relative.\n * If relative, it will be resolved against the config path.\n * If absolute, it will be returned as is.\n **/\n private getStoragePath() {\n const { storage } = this.config;\n if (typeof storage !== 'string') {\n throw new TypeError('storage field is mandatory');\n }\n\n const storagePath = path.isAbsolute(storage)\n ? storage\n : path.normalize(path.join(this.getBaseConfigPath(), storage));\n debug('storage path %o', storagePath);\n return storagePath;\n }\n\n private getBaseConfigPath(): string {\n return path.dirname(this.config.config_path);\n }\n\n /**\n * Filter and only match those values that the query define.\n **/\n public async filterByQuery(results: searchUtils.SearchItemPkg[], query: searchUtils.SearchQuery) {\n // FUTURE: apply new filters, keyword, version, ...\n return results.filter((item: searchUtils.SearchItemPkg) => {\n return item?.name?.match(query.text) !== null;\n }) as searchUtils.SearchItemPkg[];\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n public async getScore(_pkg: searchUtils.SearchItemPkg): Promise<searchUtils.Score> {\n // TODO: there is no particular reason to predefined scores\n // could be improved by using\n return Promise.resolve({\n final: 1,\n detail: {\n maintenance: 0,\n popularity: 1,\n quality: 1,\n },\n });\n }\n\n public async search(query: searchUtils.SearchQuery): Promise<searchUtils.SearchItem[]> {\n const results: searchUtils.SearchItem[] = [];\n const storagePath = this.getStoragePath();\n const packagesOnStorage = await this.filterByQuery(\n await searchOnStorage(storagePath, this.storages),\n query\n );\n debug('packages found %o', packagesOnStorage.length);\n for (let storage of packagesOnStorage) {\n // check if package is listed on the cache private database\n const isPrivate = (this.data as LocalStorage).list.includes(storage.name);\n const score = await this.getScore(storage);\n results.push({\n package: storage,\n verdaccioPrivate: isPrivate,\n verdaccioPkgCached: !isPrivate,\n score,\n });\n }\n return results;\n }\n\n public async remove(name: string): Promise<void> {\n try {\n if (typeof this.data === 'undefined') {\n throw Error('no data secret available');\n }\n\n const data = await this.get();\n\n const pkgName = data.indexOf(name);\n if (pkgName !== -1) {\n this.data.list.splice(pkgName, 1);\n debug('remove package %o has been removed', name);\n }\n await this._sync();\n } catch (err) {\n this.logger.error({ err }, 'remove the private package has failed @{err}');\n throw errorUtils.getInternalError('error remove private package');\n }\n }\n\n public async get(): Promise<any> {\n if (typeof this.data === 'undefined') {\n throw Error('no data secret available');\n }\n\n const { list } = this.data;\n const totalItems = list?.length;\n debug('get full list of packages (%o) has been fetched', totalItems);\n return Promise.resolve(list);\n }\n\n public getPackageStorage(packageName: string): IPackageStorage {\n const packageAccess = getMatchedPackagesSpec(packageName, this.config.packages);\n\n const packagePath: string = this._getLocalStoragePath(\n packageAccess ? packageAccess.storage : undefined\n );\n debug('storage path selected: ', packagePath);\n if (_.isString(packagePath) === false) {\n debug('the package %o has no storage defined ', packageName);\n return;\n }\n\n const packageStoragePath: string = path.join(\n // FIXME: use getBaseStoragePath instead\n path.resolve(path.dirname(this.config.config_path || ''), packagePath),\n packageName\n );\n\n debug('storage absolute path: ', packageStoragePath);\n\n return new LocalDriver(packageStoragePath, this.logger);\n }\n\n public async clean(): Promise<void> {\n await this._sync();\n }\n\n private _getCustomPackageLocalStorages(): Map<string, string> {\n const storages = new Map<string, string>();\n const { packages } = this.config;\n\n if (packages) {\n Object.keys(packages || {}).map((pkg) => {\n const { storage } = packages[pkg];\n if (typeof storage === 'string') {\n const storagePath = path.join(this.getStoragePath(), storage);\n debug('add custom storage for %s on %s', storage, storagePath);\n storages.set(storage, storagePath);\n }\n });\n }\n\n return storages;\n }\n\n private async _sync(): Promise<null> {\n debug('sync database started');\n\n if (this.locked) {\n this.logger.error(ERROR_DB_LOCKED);\n throw new Error(ERROR_DB_LOCKED);\n }\n // Uses sync to prevent ugly race condition\n try {\n const folderName = path.dirname(this.path);\n debug('creating folder %o', folderName);\n await mkdirPromise(folderName, { recursive: true });\n debug('creating folder %o created succeed', folderName);\n } catch (err) {\n this.logger.error({ err }, 'sync create folder has failed with error: @{err}');\n throw err;\n }\n\n try {\n await writeFilePromise(this.path, JSON.stringify(this.data));\n debug('sync write succeed');\n\n return null;\n } catch (err: any) {\n this.logger.error({ err }, 'sync database file failed: @{err}');\n throw err;\n }\n }\n\n private _getLocalStoragePath(storage: string | void): string {\n const globalConfigStorage = this.getStoragePath();\n if (_.isNil(globalConfigStorage)) {\n this.logger.error('property storage in config.yaml is required for using this plugin');\n throw new Error('property storage in config.yaml is required for using this plugin');\n } else {\n if (typeof storage === 'string') {\n return path.join(globalConfigStorage as string, storage as string);\n }\n\n return globalConfigStorage as string;\n }\n }\n\n private async fetchLocalPackages(): Promise<LocalStorage> {\n try {\n return await loadPrivatePackages(this.path, this.logger);\n } catch (err: any) {\n // readFileSync is platform specific, macOS, Linux and Windows thrown an error\n // Only recreate if file not found to prevent data loss\n this.logger.warn(\n { path: this.path },\n 'no private database found, recreating new one on @{path}'\n );\n if (err.code !== noSuchFile) {\n this.locked = true;\n this.logger.error(\n 'Failed to read package database file, please check the error printed below:\\n',\n `File Path: ${this.path}\\n\\n ${err.message}`\n );\n }\n // if no database is found we set empty placeholders\n return { list: [], secret: '' };\n }\n }\n}\n\nexport default LocalDatabase;\n"],"file":"local-database.js"}
|
package/build/local-fs.d.ts
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
import { ReadTarball } from '@verdaccio/streams';
|
|
2
|
-
import { Callback, Logger, Package, ILocalPackageManager, IUploadTarball } from '@verdaccio/types';
|
|
3
1
|
import { VerdaccioError } from '@verdaccio/core';
|
|
2
|
+
import { ReadTarball } from '@verdaccio/streams';
|
|
3
|
+
import { Callback, ILocalPackageManager, IUploadTarball, Logger, Package } from '@verdaccio/types';
|
|
4
4
|
export declare const fileExist = "EEXISTS";
|
|
5
5
|
export declare const noSuchFile = "ENOENT";
|
|
6
6
|
export declare const resourceNotAvailable = "EAGAIN";
|
|
7
7
|
export declare const packageJSONFileName = "package.json";
|
|
8
8
|
export declare const fSError: (message: string, code?: number) => VerdaccioError;
|
|
9
|
+
export declare function renameTmpNext(src: string, dst: string): Promise<void>;
|
|
9
10
|
export declare type ILocalFSPackageManager = ILocalPackageManager & {
|
|
10
11
|
path: string;
|
|
11
12
|
};
|
|
@@ -29,10 +30,33 @@ export default class LocalFS implements ILocalFSPackageManager {
|
|
|
29
30
|
* @param {*} onEnd
|
|
30
31
|
*/
|
|
31
32
|
updatePackage(name: string, updateHandler: Callback, onWrite: Callback, transformPackage: Function, onEnd: Callback): void;
|
|
33
|
+
/**
|
|
34
|
+
* This function allows to update the package
|
|
35
|
+
* This function handle the update package logic, for this plugin
|
|
36
|
+
* we need to lock/unlock handlers for thread-safely and then apply
|
|
37
|
+
* the `handleUpdate` and return the result.
|
|
38
|
+
*
|
|
39
|
+
* The lock could fail on several steps so we need to ensure the
|
|
40
|
+
* file does not get locked if the whole process fails.
|
|
41
|
+
*
|
|
42
|
+
Algorithm:
|
|
43
|
+
1. lock package.json for writing
|
|
44
|
+
2. read package.json
|
|
45
|
+
3. apply external update package handler
|
|
46
|
+
4. return manifest (write is being hanlded into the core)
|
|
47
|
+
5. rename package.json.tmp package.json
|
|
48
|
+
* @param {*} packageName
|
|
49
|
+
* The update package handler could be different based
|
|
50
|
+
* on the action and handled into the core.
|
|
51
|
+
* @param {*} handleUpdate
|
|
52
|
+
*/
|
|
53
|
+
updatePackageNext(packageName: string, handleUpdate: (manifest: Package) => Promise<Package>): Promise<Package>;
|
|
32
54
|
deletePackage(packageName: string): Promise<void>;
|
|
33
55
|
removePackage(): Promise<void>;
|
|
34
56
|
createPackage(name: string, value: Package, cb: Callback): void;
|
|
35
57
|
savePackage(name: string, value: Package, cb: Callback): void;
|
|
58
|
+
savePackageNext(name: string, value: Package): Promise<void>;
|
|
59
|
+
readPackageNext(name: string): Promise<Package>;
|
|
36
60
|
readPackage(name: string, cb: Callback): void;
|
|
37
61
|
writeTarball(name: string): IUploadTarball;
|
|
38
62
|
readTarball(name: string): ReadTarball;
|
|
@@ -41,6 +65,10 @@ export default class LocalFS implements ILocalFSPackageManager {
|
|
|
41
65
|
private _convertToString;
|
|
42
66
|
private _getStorage;
|
|
43
67
|
private _writeFile;
|
|
68
|
+
private writeTempFileAndRename;
|
|
69
|
+
private writeFileNext;
|
|
44
70
|
private _lockAndReadJSON;
|
|
45
71
|
private _unlockJSON;
|
|
72
|
+
private _lockAndReadJSONNext;
|
|
73
|
+
private _unlockJSONNext;
|
|
46
74
|
}
|
package/build/local-fs.js
CHANGED
|
@@ -3,28 +3,29 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
var _path = _interopRequireDefault(require("path"));
|
|
6
|
+
exports.packageJSONFileName = exports.noSuchFile = exports.fileExist = exports.fSError = exports.default = void 0;
|
|
7
|
+
exports.renameTmpNext = renameTmpNext;
|
|
8
|
+
exports.resourceNotAvailable = void 0;
|
|
11
9
|
|
|
12
10
|
var _debug = _interopRequireDefault(require("debug"));
|
|
13
11
|
|
|
12
|
+
var _fs = _interopRequireDefault(require("fs"));
|
|
13
|
+
|
|
14
14
|
var _lodash = _interopRequireDefault(require("lodash"));
|
|
15
15
|
|
|
16
|
-
var
|
|
16
|
+
var _path = _interopRequireDefault(require("path"));
|
|
17
|
+
|
|
18
|
+
var _core = require("@verdaccio/core");
|
|
17
19
|
|
|
18
20
|
var _fileLocking = require("@verdaccio/file-locking");
|
|
19
21
|
|
|
20
|
-
var
|
|
22
|
+
var _streams = require("@verdaccio/streams");
|
|
21
23
|
|
|
22
24
|
var _fs2 = require("./fs");
|
|
23
25
|
|
|
24
26
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
25
27
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
+
/* eslint-disable no-undef */
|
|
28
29
|
const fileExist = 'EEXISTS';
|
|
29
30
|
exports.fileExist = fileExist;
|
|
30
31
|
const noSuchFile = 'ENOENT';
|
|
@@ -47,7 +48,7 @@ const fSError = function (message, code = 409) {
|
|
|
47
48
|
exports.fSError = fSError;
|
|
48
49
|
|
|
49
50
|
const tempFile = function (str) {
|
|
50
|
-
return `${str}.tmp${String(Math.random()).
|
|
51
|
+
return `${str}.tmp${String(Math.random()).slice(2)}`;
|
|
51
52
|
};
|
|
52
53
|
|
|
53
54
|
const renameTmp = function (src, dst, _cb) {
|
|
@@ -76,12 +77,23 @@ const renameTmp = function (src, dst, _cb) {
|
|
|
76
77
|
});
|
|
77
78
|
};
|
|
78
79
|
|
|
80
|
+
async function renameTmpNext(src, dst) {
|
|
81
|
+
if (process.platform !== 'win32') {
|
|
82
|
+
await (0, _fs2.renamePromise)(src, dst);
|
|
83
|
+
await (0, _fs2.unlinkPromise)(src);
|
|
84
|
+
} else {
|
|
85
|
+
// TODO: review if this still the cases
|
|
86
|
+
// windows can't remove opened file,
|
|
87
|
+
// but it seem to be able to rename it
|
|
88
|
+
const tmp = tempFile(dst);
|
|
89
|
+
await (0, _fs2.renamePromise)(dst, tmp);
|
|
90
|
+
await (0, _fs2.renamePromise)(src, dst);
|
|
91
|
+
await (0, _fs2.unlinkPromise)(tmp);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
79
95
|
class LocalFS {
|
|
80
96
|
constructor(path, logger) {
|
|
81
|
-
_defineProperty(this, "path", void 0);
|
|
82
|
-
|
|
83
|
-
_defineProperty(this, "logger", void 0);
|
|
84
|
-
|
|
85
97
|
this.path = path;
|
|
86
98
|
this.logger = logger;
|
|
87
99
|
}
|
|
@@ -126,7 +138,8 @@ class LocalFS {
|
|
|
126
138
|
debug('file: %o has been updated', name);
|
|
127
139
|
onEnd(..._args);
|
|
128
140
|
}
|
|
129
|
-
};
|
|
141
|
+
}; // //////////////////////////////////////
|
|
142
|
+
|
|
130
143
|
|
|
131
144
|
if (!err) {
|
|
132
145
|
locked = true;
|
|
@@ -152,6 +165,79 @@ class LocalFS {
|
|
|
152
165
|
});
|
|
153
166
|
});
|
|
154
167
|
}
|
|
168
|
+
/**
|
|
169
|
+
* This function allows to update the package
|
|
170
|
+
* This function handle the update package logic, for this plugin
|
|
171
|
+
* we need to lock/unlock handlers for thread-safely and then apply
|
|
172
|
+
* the `handleUpdate` and return the result.
|
|
173
|
+
*
|
|
174
|
+
* The lock could fail on several steps so we need to ensure the
|
|
175
|
+
* file does not get locked if the whole process fails.
|
|
176
|
+
*
|
|
177
|
+
Algorithm:
|
|
178
|
+
1. lock package.json for writing
|
|
179
|
+
2. read package.json
|
|
180
|
+
3. apply external update package handler
|
|
181
|
+
4. return manifest (write is being hanlded into the core)
|
|
182
|
+
5. rename package.json.tmp package.json
|
|
183
|
+
* @param {*} packageName
|
|
184
|
+
* The update package handler could be different based
|
|
185
|
+
* on the action and handled into the core.
|
|
186
|
+
* @param {*} handleUpdate
|
|
187
|
+
*/
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
async updatePackageNext(packageName, handleUpdate) {
|
|
191
|
+
// this plugin lock files on write, we handle all possible scenarios
|
|
192
|
+
let locked = false;
|
|
193
|
+
let manifestUpdated;
|
|
194
|
+
|
|
195
|
+
try {
|
|
196
|
+
const manifest = await this._lockAndReadJSONNext(packageJSONFileName);
|
|
197
|
+
locked = true;
|
|
198
|
+
manifestUpdated = await handleUpdate(manifest);
|
|
199
|
+
|
|
200
|
+
if (locked) {
|
|
201
|
+
debug('unlock %s', packageJSONFileName);
|
|
202
|
+
await this._unlockJSONNext(packageJSONFileName);
|
|
203
|
+
this.logger.debug({
|
|
204
|
+
packageName
|
|
205
|
+
}, 'the package @{packageName} has been updated');
|
|
206
|
+
return manifestUpdated;
|
|
207
|
+
} else {
|
|
208
|
+
this.logger.debug({
|
|
209
|
+
packageName
|
|
210
|
+
}, 'the package @{packageName} has been updated');
|
|
211
|
+
return manifestUpdated;
|
|
212
|
+
}
|
|
213
|
+
} catch (err) {
|
|
214
|
+
// we ensure lock the file
|
|
215
|
+
this.logger.error({
|
|
216
|
+
err,
|
|
217
|
+
packageName
|
|
218
|
+
}, 'error @{err.message} on update package @{packageName}');
|
|
219
|
+
|
|
220
|
+
if (locked) {
|
|
221
|
+
// eslint-disable-next-line no-useless-catch
|
|
222
|
+
try {
|
|
223
|
+
await this._unlockJSONNext(packageJSONFileName); // after unlock bubble up error.
|
|
224
|
+
|
|
225
|
+
throw err;
|
|
226
|
+
} catch (err) {
|
|
227
|
+
// unlock could fail, we bubble up error
|
|
228
|
+
throw _core.errorUtils.getInternalError('resource temporarily unavailable');
|
|
229
|
+
}
|
|
230
|
+
} else {
|
|
231
|
+
if (err.code === resourceNotAvailable) {
|
|
232
|
+
throw _core.errorUtils.getInternalError('resource temporarily unavailable');
|
|
233
|
+
} else if (err.code === noSuchFile) {
|
|
234
|
+
throw _core.errorUtils.getNotFound();
|
|
235
|
+
} else {
|
|
236
|
+
throw err;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
155
241
|
|
|
156
242
|
async deletePackage(packageName) {
|
|
157
243
|
debug('delete a file/package %o', packageName);
|
|
@@ -175,6 +261,29 @@ class LocalFS {
|
|
|
175
261
|
this._writeFile(this._getStorage(packageJSONFileName), this._convertToString(value), cb);
|
|
176
262
|
}
|
|
177
263
|
|
|
264
|
+
async savePackageNext(name, value) {
|
|
265
|
+
debug('save a package %o', name);
|
|
266
|
+
await this.writeFileNext(this._getStorage(packageJSONFileName), this._convertToString(value));
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
async readPackageNext(name) {
|
|
270
|
+
debug('read a package %o', name);
|
|
271
|
+
|
|
272
|
+
try {
|
|
273
|
+
const res = await this._readStorageFile(this._getStorage(packageJSONFileName));
|
|
274
|
+
const data = JSON.parse(res.toString('utf8'));
|
|
275
|
+
debug('read storage file %o has succeed', name);
|
|
276
|
+
return data;
|
|
277
|
+
} catch (err) {
|
|
278
|
+
debug('parse error');
|
|
279
|
+
this.logger.error({
|
|
280
|
+
err,
|
|
281
|
+
name
|
|
282
|
+
}, 'error @{err.message} on parse @{name}');
|
|
283
|
+
throw err;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
|
|
178
287
|
readPackage(name, cb) {
|
|
179
288
|
debug('read a package %o', name);
|
|
180
289
|
|
|
@@ -192,9 +301,7 @@ class LocalFS {
|
|
|
192
301
|
throw err;
|
|
193
302
|
}
|
|
194
303
|
}).catch(err => {
|
|
195
|
-
|
|
196
|
-
err
|
|
197
|
-
}, 'error on read storage file @{err.message}');
|
|
304
|
+
debug('error on read storage file %o', err.message);
|
|
198
305
|
return cb(err);
|
|
199
306
|
});
|
|
200
307
|
}
|
|
@@ -379,6 +486,38 @@ class LocalFS {
|
|
|
379
486
|
});
|
|
380
487
|
}
|
|
381
488
|
|
|
489
|
+
async writeTempFileAndRename(dest, fileContent) {
|
|
490
|
+
const tempFilePath = tempFile(dest);
|
|
491
|
+
|
|
492
|
+
try {
|
|
493
|
+
// write file on temp location
|
|
494
|
+
await (0, _fs2.writeFilePromise)(tempFilePath, fileContent);
|
|
495
|
+
debug('creating a new file:: %o', dest); // rename tmp file to original
|
|
496
|
+
|
|
497
|
+
await renameTmpNext(tempFilePath, dest);
|
|
498
|
+
} catch (err) {
|
|
499
|
+
debug('error on write the file: %o', dest);
|
|
500
|
+
throw err;
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
async writeFileNext(destiny, fileContent) {
|
|
505
|
+
try {
|
|
506
|
+
await this.writeTempFileAndRename(destiny, fileContent);
|
|
507
|
+
} catch (err) {
|
|
508
|
+
if (err && err.code === noSuchFile) {
|
|
509
|
+
// if fails, we create the folder for the package
|
|
510
|
+
await (0, _fs2.mkdirPromise)(_path.default.dirname(destiny), {
|
|
511
|
+
recursive: true
|
|
512
|
+
}); // we try again create the temp file
|
|
513
|
+
|
|
514
|
+
await this.writeTempFileAndRename(destiny, fileContent);
|
|
515
|
+
} else {
|
|
516
|
+
throw err;
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
|
|
382
521
|
_lockAndReadJSON(name, cb) {
|
|
383
522
|
const fileName = this._getStorage(name);
|
|
384
523
|
|
|
@@ -404,6 +543,30 @@ class LocalFS {
|
|
|
404
543
|
(0, _fileLocking.unlockFile)(this._getStorage(name), cb);
|
|
405
544
|
}
|
|
406
545
|
|
|
546
|
+
async _lockAndReadJSONNext(name) {
|
|
547
|
+
const fileName = this._getStorage(name);
|
|
548
|
+
|
|
549
|
+
debug('lock and read a file %o', fileName);
|
|
550
|
+
|
|
551
|
+
try {
|
|
552
|
+
const data = await (0, _fileLocking.readFileNext)(fileName, {
|
|
553
|
+
lock: true,
|
|
554
|
+
parse: true
|
|
555
|
+
});
|
|
556
|
+
return data;
|
|
557
|
+
} catch (err) {
|
|
558
|
+
this.logger.error({
|
|
559
|
+
err
|
|
560
|
+
}, 'error on lock file @{err.message}');
|
|
561
|
+
debug('error on lock and read json for file: %o', name);
|
|
562
|
+
throw err;
|
|
563
|
+
}
|
|
564
|
+
}
|
|
565
|
+
|
|
566
|
+
async _unlockJSONNext(name) {
|
|
567
|
+
await (0, _fileLocking.unlockFileNext)(this._getStorage(name));
|
|
568
|
+
}
|
|
569
|
+
|
|
407
570
|
}
|
|
408
571
|
|
|
409
572
|
exports.default = LocalFS;
|
package/build/local-fs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/local-fs.ts"],"names":["fileExist","noSuchFile","resourceNotAvailable","packageJSONFileName","debug","fSError","message","code","err","errorUtils","getCode","tempFile","str","String","Math","random","substr","renameTmp","src","dst","_cb","cb","fs","unlink","process","platform","rename","tmp","LocalFS","constructor","path","logger","updatePackage","name","updateHandler","onWrite","transformPackage","onEnd","_lockAndReadJSON","json","locked","self","unLockCallback","lockError","_args","arguments","_unlockJSON","apply","_","isNil","getInternalError","getNotFound","deletePackage","packageName","_getStorage","removePackage","createPackage","value","_createFile","_convertToString","savePackage","_writeFile","readPackage","_readStorageFile","then","res","data","JSON","parse","toString","error","catch","writeTarball","uploadStream","UploadTarball","_ended","on","pathName","access","fileNotFound","exists","emit","temporalName","join","replace","file","createWriteStream","removeTempFile","opened","pipe","done","onend","end","abort","readTarball","readTarballStream","ReadTarball","readStream","createReadStream","fd","fstat","stats","size","close","contents","callback","open","stringify","fileName","storagePath","dest","createTempFile","tempFilePath","writeFile","mkdir","dirname","recursive","lock"],"mappings":"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","sourcesContent":["/* eslint-disable no-undef */\n\nimport fs from 'fs';\nimport path from 'path';\nimport buildDebug from 'debug';\n\nimport _ from 'lodash';\nimport { UploadTarball, ReadTarball } from '@verdaccio/streams';\nimport { unlockFile, readFile } from '@verdaccio/file-locking';\nimport { Callback, Logger, Package, ILocalPackageManager, IUploadTarball } from '@verdaccio/types';\nimport { VerdaccioError, errorUtils } from '@verdaccio/core';\nimport { unlinkPromise, rmdirPromise, readFilePromise } from './fs';\n\nexport const fileExist = 'EEXISTS';\nexport const noSuchFile = 'ENOENT';\nexport const resourceNotAvailable = 'EAGAIN';\nexport const packageJSONFileName = 'package.json';\n\nconst debug = buildDebug('verdaccio:plugin:local-storage:local-fs');\n\nexport const fSError = function (message: string, code = 409): VerdaccioError {\n const err: VerdaccioError = errorUtils.getCode(code, message);\n // FIXME: we should return http-status codes here instead, future improvement\n // @ts-ignore\n err.code = message;\n\n return err;\n};\n\nconst tempFile = function (str): string {\n return `${str}.tmp${String(Math.random()).substr(2)}`;\n};\n\nconst renameTmp = function (src, dst, _cb): void {\n const cb = (err): void => {\n if (err) {\n fs.unlink(src, () => {});\n }\n _cb(err);\n };\n\n if (process.platform !== 'win32') {\n return fs.rename(src, dst, cb);\n }\n\n // windows can't remove opened file,\n // but it seem to be able to rename it\n const tmp = tempFile(dst);\n fs.rename(dst, tmp, function (err) {\n fs.rename(src, dst, cb);\n if (!err) {\n fs.unlink(tmp, () => {});\n }\n });\n};\n\nexport type ILocalFSPackageManager = ILocalPackageManager & { path: string };\n\nexport default class LocalFS implements ILocalFSPackageManager {\n public path: string;\n public logger: Logger;\n\n public constructor(path: string, logger: Logger) {\n this.path = path;\n this.logger = logger;\n }\n\n /**\n * This function allows to update the package thread-safely\n Algorithm:\n 1. lock package.json for writing\n 2. read package.json\n 3. updateFn(pkg, cb), and wait for cb\n 4. write package.json.tmp\n 5. move package.json.tmp package.json\n 6. callback(err?)\n * @param {*} name\n * @param {*} updateHandler\n * @param {*} onWrite\n * @param {*} transformPackage\n * @param {*} onEnd\n */\n public updatePackage(\n name: string,\n updateHandler: Callback,\n onWrite: Callback,\n transformPackage: Function,\n onEnd: Callback\n ): void {\n this._lockAndReadJSON(packageJSONFileName, (err, json) => {\n let locked = false;\n const self = this;\n // callback that cleans up lock first\n const unLockCallback = function (lockError: Error): void {\n // eslint-disable-next-line prefer-rest-params\n const _args = arguments;\n\n if (locked) {\n debug('unlock %s', packageJSONFileName);\n self._unlockJSON(packageJSONFileName, () => {\n // ignore any error from the unlock\n if (lockError !== null) {\n debug('lock file: %o has failed with error %o', name, lockError);\n }\n\n onEnd.apply(lockError, _args);\n });\n } else {\n debug('file: %o has been updated', name);\n onEnd(..._args);\n }\n };\n\n if (!err) {\n locked = true;\n debug('file: %o has been locked', name);\n }\n\n if (_.isNil(err) === false) {\n if (err.code === resourceNotAvailable) {\n return unLockCallback(errorUtils.getInternalError('resource temporarily unavailable'));\n } else if (err.code === noSuchFile) {\n return unLockCallback(errorUtils.getNotFound());\n } else {\n return unLockCallback(err);\n }\n }\n\n updateHandler(json, (err) => {\n if (err) {\n return unLockCallback(err);\n }\n\n onWrite(name, transformPackage(json), unLockCallback);\n });\n });\n }\n\n public async deletePackage(packageName: string): Promise<void> {\n debug('delete a file/package %o', packageName);\n\n return await unlinkPromise(this._getStorage(packageName));\n }\n\n public async removePackage(): Promise<void> {\n debug('remove a package folder %o', this.path);\n\n await rmdirPromise(this._getStorage('.'));\n }\n\n public createPackage(name: string, value: Package, cb: Callback): void {\n debug('create a package %o', name);\n\n this._createFile(this._getStorage(packageJSONFileName), this._convertToString(value), cb);\n }\n\n public savePackage(name: string, value: Package, cb: Callback): void {\n debug('save a package %o', name);\n\n this._writeFile(this._getStorage(packageJSONFileName), this._convertToString(value), cb);\n }\n\n public readPackage(name: string, cb: Callback): void {\n debug('read a package %o', name);\n\n this._readStorageFile(this._getStorage(packageJSONFileName))\n .then((res) => {\n try {\n const data: any = JSON.parse(res.toString('utf8'));\n\n debug('read storage file %o has succeed', name);\n cb(null, data);\n } catch (err: any) {\n debug('parse error');\n this.logger.error({ err, name }, 'error @{err.message} on parse @{name}');\n throw err;\n }\n })\n .catch((err) => {\n this.logger.error({ err }, 'error on read storage file @{err.message}');\n return cb(err);\n });\n }\n\n public writeTarball(name: string): IUploadTarball {\n const uploadStream = new UploadTarball({});\n debug('write a tarball for a package %o', name);\n\n let _ended = 0;\n uploadStream.on('end', function () {\n _ended = 1;\n });\n\n const pathName: string = this._getStorage(name);\n\n fs.access(pathName, (fileNotFound) => {\n const exists = !fileNotFound;\n if (exists) {\n uploadStream.emit('error', fSError(fileExist));\n } else {\n const temporalName = path.join(\n this.path,\n `${name}.tmp-${String(Math.random()).replace(/^0\\./, '')}`\n );\n debug('write a temporal name %o', temporalName);\n const file = fs.createWriteStream(temporalName);\n const removeTempFile = (): void => fs.unlink(temporalName, () => {});\n let opened = false;\n uploadStream.pipe(file);\n\n uploadStream.done = function (): void {\n const onend = function (): void {\n file.on('close', function () {\n renameTmp(temporalName, pathName, function (err) {\n if (err) {\n uploadStream.emit('error', err);\n } else {\n uploadStream.emit('success');\n }\n });\n });\n file.end();\n };\n if (_ended) {\n onend();\n } else {\n uploadStream.on('end', onend);\n }\n };\n\n uploadStream.abort = function (): void {\n if (opened) {\n opened = false;\n file.on('close', function () {\n removeTempFile();\n });\n } else {\n // if the file does not recieve any byte never is opened and has to be removed anyway.\n removeTempFile();\n }\n file.end();\n };\n\n file.on('open', function () {\n opened = true;\n // re-emitting open because it's handled in storage.js\n uploadStream.emit('open');\n });\n\n file.on('error', function (err) {\n uploadStream.emit('error', err);\n });\n }\n });\n\n return uploadStream;\n }\n\n public readTarball(name: string): ReadTarball {\n const pathName: string = this._getStorage(name);\n debug('read a a tarball %o on path %o', name, pathName);\n\n const readTarballStream = new ReadTarball({});\n\n const readStream = fs.createReadStream(pathName);\n\n readStream.on('error', function (err) {\n debug('error on read a tarball %o with error %o', name, err);\n readTarballStream.emit('error', err);\n });\n\n readStream.on('open', function (fd) {\n fs.fstat(fd, function (err, stats) {\n if (_.isNil(err) === false) {\n debug('error on read a tarball %o with error %o', name, err);\n return readTarballStream.emit('error', err);\n }\n readTarballStream.emit('content-length', stats.size);\n readTarballStream.emit('open');\n debug('open on read a tarball %o', name);\n readStream.pipe(readTarballStream);\n });\n });\n\n readTarballStream.abort = function (): void {\n debug('abort on read a tarball %o', name);\n readStream.close();\n };\n\n return readTarballStream;\n }\n\n private _createFile(name: string, contents: any, callback: Function): void {\n debug(' create a new file: %o', name);\n\n fs.open(name, 'wx', (err) => {\n if (err) {\n // native EEXIST used here to check exception on fs.open\n if (err.code === 'EEXIST') {\n debug('file %o cannot be created, it already exists: %o', name);\n return callback(fSError(fileExist));\n }\n }\n\n this._writeFile(name, contents, callback);\n });\n }\n\n private async _readStorageFile(name: string): Promise<any> {\n debug('reading the file: %o', name);\n try {\n debug('reading the file: %o', name);\n return await readFilePromise(name);\n } catch (err: any) {\n debug('error reading the file: %o with error %o', name, err.message);\n throw err;\n }\n }\n\n private _convertToString(value: Package): string {\n return JSON.stringify(value, null, '\\t');\n }\n\n private _getStorage(fileName = ''): string {\n const storagePath: string = path.join(this.path, fileName);\n\n return storagePath;\n }\n\n private _writeFile(dest: string, data: string, cb: Callback): void {\n const createTempFile = (cb): void => {\n const tempFilePath = tempFile(dest);\n\n fs.writeFile(tempFilePath, data, (err) => {\n if (err) {\n debug('error on write the file: %o', dest);\n return cb(err);\n }\n\n debug('creating a new file:: %o', dest);\n renameTmp(tempFilePath, dest, cb);\n });\n };\n\n createTempFile((err) => {\n if (err && err.code === noSuchFile) {\n fs.mkdir(path.dirname(dest), { recursive: true }, function (err) {\n if (err) {\n return cb(err);\n }\n createTempFile(cb);\n });\n } else {\n cb(err);\n }\n });\n }\n\n private _lockAndReadJSON(name: string, cb: Function): void {\n const fileName: string = this._getStorage(name);\n debug('lock and read a file %o', fileName);\n readFile(\n fileName,\n {\n lock: true,\n parse: true,\n },\n (err, res) => {\n if (err) {\n this.logger.error({ err }, 'error on lock file @{err.message}');\n debug('error on lock and read json for file: %o', name);\n\n return cb(err);\n }\n debug('lock and read json for file: %o', name);\n\n return cb(null, res);\n }\n );\n }\n\n private _unlockJSON(name: string, cb: Function): void {\n unlockFile(this._getStorage(name), cb);\n }\n}\n"],"file":"local-fs.js"}
|
|
1
|
+
{"version":3,"sources":["../src/local-fs.ts"],"names":["fileExist","noSuchFile","resourceNotAvailable","packageJSONFileName","debug","fSError","message","code","err","errorUtils","getCode","tempFile","str","String","Math","random","slice","renameTmp","src","dst","_cb","cb","fs","unlink","process","platform","rename","tmp","renameTmpNext","LocalFS","constructor","path","logger","updatePackage","name","updateHandler","onWrite","transformPackage","onEnd","_lockAndReadJSON","json","locked","self","unLockCallback","lockError","_args","arguments","_unlockJSON","apply","_","isNil","getInternalError","getNotFound","updatePackageNext","packageName","handleUpdate","manifestUpdated","manifest","_lockAndReadJSONNext","_unlockJSONNext","error","deletePackage","_getStorage","removePackage","createPackage","value","_createFile","_convertToString","savePackage","_writeFile","savePackageNext","writeFileNext","readPackageNext","res","_readStorageFile","data","JSON","parse","toString","readPackage","then","catch","writeTarball","uploadStream","UploadTarball","_ended","on","pathName","access","fileNotFound","exists","emit","temporalName","join","replace","file","createWriteStream","removeTempFile","opened","pipe","done","onend","end","abort","readTarball","readTarballStream","ReadTarball","readStream","createReadStream","fd","fstat","stats","size","close","contents","callback","open","stringify","fileName","storagePath","dest","createTempFile","tempFilePath","writeFile","mkdir","dirname","recursive","writeTempFileAndRename","fileContent","destiny","lock"],"mappings":"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","sourcesContent":["/* eslint-disable no-undef */\nimport buildDebug from 'debug';\nimport fs from 'fs';\nimport _ from 'lodash';\nimport path from 'path';\n\nimport { VerdaccioError, errorUtils } from '@verdaccio/core';\nimport { readFile, readFileNext, unlockFile, unlockFileNext } from '@verdaccio/file-locking';\nimport { ReadTarball, UploadTarball } from '@verdaccio/streams';\nimport { Callback, ILocalPackageManager, IUploadTarball, Logger, Package } from '@verdaccio/types';\n\nimport {\n mkdirPromise,\n readFilePromise,\n renamePromise,\n rmdirPromise,\n unlinkPromise,\n writeFilePromise,\n} from './fs';\n\nexport const fileExist = 'EEXISTS';\nexport const noSuchFile = 'ENOENT';\nexport const resourceNotAvailable = 'EAGAIN';\nexport const packageJSONFileName = 'package.json';\n\nconst debug = buildDebug('verdaccio:plugin:local-storage:local-fs');\n\nexport const fSError = function (message: string, code = 409): VerdaccioError {\n const err: VerdaccioError = errorUtils.getCode(code, message);\n // FIXME: we should return http-status codes here instead, future improvement\n // @ts-ignore\n err.code = message;\n\n return err;\n};\n\nconst tempFile = function (str): string {\n return `${str}.tmp${String(Math.random()).slice(2)}`;\n};\n\nconst renameTmp = function (src, dst, _cb): void {\n const cb = (err): void => {\n if (err) {\n fs.unlink(src, () => {});\n }\n _cb(err);\n };\n\n if (process.platform !== 'win32') {\n return fs.rename(src, dst, cb);\n }\n\n // windows can't remove opened file,\n // but it seem to be able to rename it\n const tmp = tempFile(dst);\n fs.rename(dst, tmp, function (err) {\n fs.rename(src, dst, cb);\n if (!err) {\n fs.unlink(tmp, () => {});\n }\n });\n};\n\nexport async function renameTmpNext(src: string, dst: string): Promise<void> {\n if (process.platform !== 'win32') {\n await renamePromise(src, dst);\n await unlinkPromise(src);\n } else {\n // TODO: review if this still the cases\n // windows can't remove opened file,\n // but it seem to be able to rename it\n const tmp = tempFile(dst);\n await renamePromise(dst, tmp);\n await renamePromise(src, dst);\n await unlinkPromise(tmp);\n }\n}\n\nexport type ILocalFSPackageManager = ILocalPackageManager & { path: string };\n\nexport default class LocalFS implements ILocalFSPackageManager {\n public path: string;\n public logger: Logger;\n\n public constructor(path: string, logger: Logger) {\n this.path = path;\n this.logger = logger;\n }\n\n /**\n * This function allows to update the package thread-safely\n Algorithm:\n 1. lock package.json for writing\n 2. read package.json\n 3. updateFn(pkg, cb), and wait for cb\n 4. write package.json.tmp\n 5. move package.json.tmp package.json\n 6. callback(err?)\n * @param {*} name\n * @param {*} updateHandler\n * @param {*} onWrite\n * @param {*} transformPackage\n * @param {*} onEnd\n */\n public updatePackage(\n name: string,\n updateHandler: Callback,\n onWrite: Callback,\n transformPackage: Function,\n onEnd: Callback\n ): void {\n this._lockAndReadJSON(packageJSONFileName, (err, json) => {\n let locked = false;\n const self = this;\n // callback that cleans up lock first\n const unLockCallback = function (lockError: Error): void {\n // eslint-disable-next-line prefer-rest-params\n const _args = arguments;\n\n if (locked) {\n debug('unlock %s', packageJSONFileName);\n self._unlockJSON(packageJSONFileName, () => {\n // ignore any error from the unlock\n if (lockError !== null) {\n debug('lock file: %o has failed with error %o', name, lockError);\n }\n\n onEnd.apply(lockError, _args);\n });\n } else {\n debug('file: %o has been updated', name);\n onEnd(..._args);\n }\n };\n // //////////////////////////////////////\n\n if (!err) {\n locked = true;\n debug('file: %o has been locked', name);\n }\n\n if (_.isNil(err) === false) {\n if (err.code === resourceNotAvailable) {\n return unLockCallback(errorUtils.getInternalError('resource temporarily unavailable'));\n } else if (err.code === noSuchFile) {\n return unLockCallback(errorUtils.getNotFound());\n } else {\n return unLockCallback(err);\n }\n }\n\n updateHandler(json, (err) => {\n if (err) {\n return unLockCallback(err);\n }\n\n onWrite(name, transformPackage(json), unLockCallback);\n });\n });\n }\n\n /**\n * This function allows to update the package\n * This function handle the update package logic, for this plugin\n * we need to lock/unlock handlers for thread-safely and then apply\n * the `handleUpdate` and return the result.\n *\n * The lock could fail on several steps so we need to ensure the\n * file does not get locked if the whole process fails.\n *\n Algorithm:\n 1. lock package.json for writing\n 2. read package.json\n 3. apply external update package handler\n 4. return manifest (write is being hanlded into the core)\n 5. rename package.json.tmp package.json\n * @param {*} packageName\n * The update package handler could be different based\n * on the action and handled into the core.\n * @param {*} handleUpdate\n */\n public async updatePackageNext(\n packageName: string,\n handleUpdate: (manifest: Package) => Promise<Package>\n ): Promise<Package> {\n // this plugin lock files on write, we handle all possible scenarios\n let locked = false;\n let manifestUpdated: Package;\n try {\n const manifest = await this._lockAndReadJSONNext(packageJSONFileName);\n locked = true;\n manifestUpdated = await handleUpdate(manifest);\n if (locked) {\n debug('unlock %s', packageJSONFileName);\n await this._unlockJSONNext(packageJSONFileName);\n this.logger.debug({ packageName }, 'the package @{packageName} has been updated');\n return manifestUpdated;\n } else {\n this.logger.debug({ packageName }, 'the package @{packageName} has been updated');\n return manifestUpdated;\n }\n } catch (err: any) {\n // we ensure lock the file\n this.logger.error(\n { err, packageName },\n 'error @{err.message} on update package @{packageName}'\n );\n if (locked) {\n // eslint-disable-next-line no-useless-catch\n try {\n await this._unlockJSONNext(packageJSONFileName);\n // after unlock bubble up error.\n throw err;\n } catch (err: any) {\n // unlock could fail, we bubble up error\n throw errorUtils.getInternalError('resource temporarily unavailable');\n }\n } else {\n if (err.code === resourceNotAvailable) {\n throw errorUtils.getInternalError('resource temporarily unavailable');\n } else if (err.code === noSuchFile) {\n throw errorUtils.getNotFound();\n } else {\n throw err;\n }\n }\n }\n }\n\n public async deletePackage(packageName: string): Promise<void> {\n debug('delete a file/package %o', packageName);\n\n return await unlinkPromise(this._getStorage(packageName));\n }\n\n public async removePackage(): Promise<void> {\n debug('remove a package folder %o', this.path);\n\n await rmdirPromise(this._getStorage('.'));\n }\n\n public createPackage(name: string, value: Package, cb: Callback): void {\n debug('create a package %o', name);\n\n this._createFile(this._getStorage(packageJSONFileName), this._convertToString(value), cb);\n }\n\n public savePackage(name: string, value: Package, cb: Callback): void {\n debug('save a package %o', name);\n\n this._writeFile(this._getStorage(packageJSONFileName), this._convertToString(value), cb);\n }\n\n public async savePackageNext(name: string, value: Package): Promise<void> {\n debug('save a package %o', name);\n\n await this.writeFileNext(this._getStorage(packageJSONFileName), this._convertToString(value));\n }\n\n public async readPackageNext(name: string): Promise<Package> {\n debug('read a package %o', name);\n try {\n const res = await this._readStorageFile(this._getStorage(packageJSONFileName));\n const data: any = JSON.parse(res.toString('utf8'));\n\n debug('read storage file %o has succeed', name);\n return data;\n } catch (err: any) {\n debug('parse error');\n this.logger.error({ err, name }, 'error @{err.message} on parse @{name}');\n throw err;\n }\n }\n\n public readPackage(name: string, cb: Callback): void {\n debug('read a package %o', name);\n\n this._readStorageFile(this._getStorage(packageJSONFileName))\n .then((res) => {\n try {\n const data: any = JSON.parse(res.toString('utf8'));\n\n debug('read storage file %o has succeed', name);\n cb(null, data);\n } catch (err: any) {\n debug('parse error');\n this.logger.error({ err, name }, 'error @{err.message} on parse @{name}');\n throw err;\n }\n })\n .catch((err) => {\n debug('error on read storage file %o', err.message);\n return cb(err);\n });\n }\n\n public writeTarball(name: string): IUploadTarball {\n const uploadStream = new UploadTarball({});\n debug('write a tarball for a package %o', name);\n\n let _ended = 0;\n uploadStream.on('end', function () {\n _ended = 1;\n });\n\n const pathName: string = this._getStorage(name);\n\n fs.access(pathName, (fileNotFound) => {\n const exists = !fileNotFound;\n if (exists) {\n uploadStream.emit('error', fSError(fileExist));\n } else {\n const temporalName = path.join(\n this.path,\n `${name}.tmp-${String(Math.random()).replace(/^0\\./, '')}`\n );\n debug('write a temporal name %o', temporalName);\n const file = fs.createWriteStream(temporalName);\n const removeTempFile = (): void => fs.unlink(temporalName, () => {});\n let opened = false;\n uploadStream.pipe(file);\n\n uploadStream.done = function (): void {\n const onend = function (): void {\n file.on('close', function () {\n renameTmp(temporalName, pathName, function (err) {\n if (err) {\n uploadStream.emit('error', err);\n } else {\n uploadStream.emit('success');\n }\n });\n });\n file.end();\n };\n if (_ended) {\n onend();\n } else {\n uploadStream.on('end', onend);\n }\n };\n\n uploadStream.abort = function (): void {\n if (opened) {\n opened = false;\n file.on('close', function () {\n removeTempFile();\n });\n } else {\n // if the file does not recieve any byte never is opened and has to be removed anyway.\n removeTempFile();\n }\n file.end();\n };\n\n file.on('open', function () {\n opened = true;\n // re-emitting open because it's handled in storage.js\n uploadStream.emit('open');\n });\n\n file.on('error', function (err) {\n uploadStream.emit('error', err);\n });\n }\n });\n\n return uploadStream;\n }\n\n public readTarball(name: string): ReadTarball {\n const pathName: string = this._getStorage(name);\n debug('read a a tarball %o on path %o', name, pathName);\n\n const readTarballStream = new ReadTarball({});\n\n const readStream = fs.createReadStream(pathName);\n\n readStream.on('error', function (err) {\n debug('error on read a tarball %o with error %o', name, err);\n readTarballStream.emit('error', err);\n });\n\n readStream.on('open', function (fd) {\n fs.fstat(fd, function (err, stats) {\n if (_.isNil(err) === false) {\n debug('error on read a tarball %o with error %o', name, err);\n return readTarballStream.emit('error', err);\n }\n readTarballStream.emit('content-length', stats.size);\n readTarballStream.emit('open');\n debug('open on read a tarball %o', name);\n readStream.pipe(readTarballStream);\n });\n });\n\n readTarballStream.abort = function (): void {\n debug('abort on read a tarball %o', name);\n readStream.close();\n };\n\n return readTarballStream;\n }\n\n private _createFile(name: string, contents: any, callback: Function): void {\n debug(' create a new file: %o', name);\n\n fs.open(name, 'wx', (err) => {\n if (err) {\n // native EEXIST used here to check exception on fs.open\n if (err.code === 'EEXIST') {\n debug('file %o cannot be created, it already exists: %o', name);\n return callback(fSError(fileExist));\n }\n }\n\n this._writeFile(name, contents, callback);\n });\n }\n\n private async _readStorageFile(name: string): Promise<any> {\n debug('reading the file: %o', name);\n try {\n debug('reading the file: %o', name);\n return await readFilePromise(name);\n } catch (err: any) {\n debug('error reading the file: %o with error %o', name, err.message);\n throw err;\n }\n }\n\n private _convertToString(value: Package): string {\n return JSON.stringify(value, null, '\\t');\n }\n\n private _getStorage(fileName = ''): string {\n const storagePath: string = path.join(this.path, fileName);\n\n return storagePath;\n }\n\n private _writeFile(dest: string, data: string, cb: Callback): void {\n const createTempFile = (cb): void => {\n const tempFilePath = tempFile(dest);\n\n fs.writeFile(tempFilePath, data, (err) => {\n if (err) {\n debug('error on write the file: %o', dest);\n return cb(err);\n }\n\n debug('creating a new file:: %o', dest);\n renameTmp(tempFilePath, dest, cb);\n });\n };\n\n createTempFile((err) => {\n if (err && err.code === noSuchFile) {\n fs.mkdir(path.dirname(dest), { recursive: true }, function (err) {\n if (err) {\n return cb(err);\n }\n createTempFile(cb);\n });\n } else {\n cb(err);\n }\n });\n }\n\n private async writeTempFileAndRename(dest: string, fileContent: string): Promise<any> {\n const tempFilePath = tempFile(dest);\n try {\n // write file on temp location\n await writeFilePromise(tempFilePath, fileContent);\n debug('creating a new file:: %o', dest);\n // rename tmp file to original\n await renameTmpNext(tempFilePath, dest);\n } catch (err: any) {\n debug('error on write the file: %o', dest);\n throw err;\n }\n }\n\n private async writeFileNext(destiny: string, fileContent: string): Promise<void> {\n try {\n await this.writeTempFileAndRename(destiny, fileContent);\n } catch (err: any) {\n if (err && err.code === noSuchFile) {\n // if fails, we create the folder for the package\n await mkdirPromise(path.dirname(destiny), { recursive: true });\n // we try again create the temp file\n await this.writeTempFileAndRename(destiny, fileContent);\n } else {\n throw err;\n }\n }\n }\n\n private _lockAndReadJSON(name: string, cb: Function): void {\n const fileName: string = this._getStorage(name);\n debug('lock and read a file %o', fileName);\n readFile(\n fileName,\n {\n lock: true,\n parse: true,\n },\n (err, res) => {\n if (err) {\n this.logger.error({ err }, 'error on lock file @{err.message}');\n debug('error on lock and read json for file: %o', name);\n\n return cb(err);\n }\n debug('lock and read json for file: %o', name);\n\n return cb(null, res);\n }\n );\n }\n\n private _unlockJSON(name: string, cb: Function): void {\n unlockFile(this._getStorage(name), cb);\n }\n\n private async _lockAndReadJSONNext(name: string): Promise<Package> {\n const fileName: string = this._getStorage(name);\n debug('lock and read a file %o', fileName);\n try {\n const data = await readFileNext<Package>(fileName, {\n lock: true,\n parse: true,\n });\n return data;\n } catch (err) {\n this.logger.error({ err }, 'error on lock file @{err.message}');\n debug('error on lock and read json for file: %o', name);\n\n throw err;\n }\n }\n\n private async _unlockJSONNext(name: string): Promise<void> {\n await unlockFileNext(this._getStorage(name));\n }\n}\n"],"file":"local-fs.js"}
|
package/build/pkg-utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/pkg-utils.ts"],"names":["loadPrivatePackages","path","logger","list","emptyDatabase","secret","data","_","isNil","db","JSON","parse","err","error","Error","isEmpty"],"mappings":";;;;;;;AAAA;;
|
|
1
|
+
{"version":3,"sources":["../src/pkg-utils.ts"],"names":["loadPrivatePackages","path","logger","list","emptyDatabase","secret","data","_","isNil","db","JSON","parse","err","error","Error","isEmpty"],"mappings":";;;;;;;AAAA;;AAIA;;;;AAEO,eAAeA,mBAAf,CAAmCC,IAAnC,EAAiDC,MAAjD,EAAwF;AAC7F,QAAMC,IAAiB,GAAG,EAA1B;AACA,QAAMC,aAAa,GAAG;AAAED,IAAAA,IAAF;AAAQE,IAAAA,MAAM,EAAE;AAAhB,GAAtB;AACA,QAAMC,IAAI,GAAG,MAAM,yBAAgBL,IAAhB,CAAnB;;AACA,MAAIM,gBAAEC,KAAF,CAAQF,IAAR,CAAJ,EAAmB;AACjB;AACA,WAAOF,aAAP;AACD;;AAED,MAAIK,EAAJ;;AACA,MAAI;AACFA,IAAAA,EAAE,GAAGC,IAAI,CAACC,KAAL,CAAWL,IAAX,CAAL;AACD,GAFD,CAEE,OAAOM,GAAP,EAAiB;AACjBV,IAAAA,MAAM,CAACW,KAAP,CACE;AACED,MAAAA,GADF;AAEEX,MAAAA;AAFF,KADF,EAKG,wHALH;AAOA,UAAMa,KAAK,CAAC,gDAAD,CAAX;AACD;;AAED,MAAIP,gBAAEQ,OAAF,CAAUN,EAAV,CAAJ,EAAmB;AACjB,WAAOL,aAAP;AACD;;AAED,SAAOK,EAAP;AACD","sourcesContent":["import _ from 'lodash';\n\nimport { LocalStorage, Logger, StorageList } from '@verdaccio/types';\n\nimport { readFilePromise } from './fs';\n\nexport async function loadPrivatePackages(path: string, logger: Logger): Promise<LocalStorage> {\n const list: StorageList = [];\n const emptyDatabase = { list, secret: '' };\n const data = await readFilePromise(path);\n if (_.isNil(data)) {\n // readFilePromise is platform specific, FreeBSD might return null\n return emptyDatabase;\n }\n\n let db;\n try {\n db = JSON.parse(data);\n } catch (err: any) {\n logger.error(\n {\n err,\n path,\n },\n `Package database file corrupted (invalid JSON) @{err.message}, please check the error printed below.File Path: @{path}`\n );\n throw Error('Package database file corrupted (invalid JSON)');\n }\n\n if (_.isEmpty(db)) {\n return emptyDatabase;\n }\n\n return db;\n}\n"],"file":"pkg-utils.js"}
|
package/build/token.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import low from 'lowdb';
|
|
2
|
-
import {
|
|
2
|
+
import { Config, ITokenActions, Token, TokenFilter } from '@verdaccio/types';
|
|
3
3
|
export default class TokenActions implements ITokenActions {
|
|
4
4
|
config: Config;
|
|
5
5
|
tokenDb: low.LowdbAsync<any> | null;
|
package/build/token.js
CHANGED
|
@@ -5,6 +5,8 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
7
|
|
|
8
|
+
var _debug = _interopRequireDefault(require("debug"));
|
|
9
|
+
|
|
8
10
|
var _lodash = _interopRequireDefault(require("lodash"));
|
|
9
11
|
|
|
10
12
|
var _lowdb = _interopRequireDefault(require("lowdb"));
|
|
@@ -13,23 +15,15 @@ var _FileAsync = _interopRequireDefault(require("lowdb/adapters/FileAsync"));
|
|
|
13
15
|
|
|
14
16
|
var _Memory = _interopRequireDefault(require("lowdb/adapters/Memory"));
|
|
15
17
|
|
|
16
|
-
var _debug = _interopRequireDefault(require("debug"));
|
|
17
|
-
|
|
18
18
|
var _utils = require("./utils");
|
|
19
19
|
|
|
20
20
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
21
21
|
|
|
22
|
-
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
23
|
-
|
|
24
22
|
const debug = (0, _debug.default)('verdaccio:plugin:local-storage:token');
|
|
25
23
|
const TOKEN_DB_NAME = '.token-db.json';
|
|
26
24
|
|
|
27
25
|
class TokenActions {
|
|
28
26
|
constructor(config) {
|
|
29
|
-
_defineProperty(this, "config", void 0);
|
|
30
|
-
|
|
31
|
-
_defineProperty(this, "tokenDb", void 0);
|
|
32
|
-
|
|
33
27
|
this.config = config;
|
|
34
28
|
this.tokenDb = null;
|
|
35
29
|
}
|
package/build/token.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/token.ts"],"names":["debug","TOKEN_DB_NAME","TokenActions","constructor","config","tokenDb","getTokenDb","adapter","process","env","NODE_ENV","FileMemory","pathDb","FileAsync","saveToken","token","key","db","userData","get","user","value","_","isNil","set","write","push","getState","deleteToken","tokenKey","userTokens","Error","length","remainingTokens","filter","readTokens","tokens"],"mappings":";;;;;;;AAAA;;AACA;;AACA;;AACA;;AACA;;
|
|
1
|
+
{"version":3,"sources":["../src/token.ts"],"names":["debug","TOKEN_DB_NAME","TokenActions","constructor","config","tokenDb","getTokenDb","adapter","process","env","NODE_ENV","FileMemory","pathDb","FileAsync","saveToken","token","key","db","userData","get","user","value","_","isNil","set","write","push","getState","deleteToken","tokenKey","userTokens","Error","length","remainingTokens","filter","readTokens","tokens"],"mappings":"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","sourcesContent":["import buildDebug from 'debug';\nimport _ from 'lodash';\nimport low from 'lowdb';\nimport FileAsync from 'lowdb/adapters/FileAsync';\nimport FileMemory from 'lowdb/adapters/Memory';\n\nimport { Config, ITokenActions, Token, TokenFilter } from '@verdaccio/types';\n\nimport { _dbGenPath } from './utils';\n\nconst debug = buildDebug('verdaccio:plugin:local-storage:token');\n\nconst TOKEN_DB_NAME = '.token-db.json';\n\nexport default class TokenActions implements ITokenActions {\n public config: Config;\n public tokenDb: low.LowdbAsync<any> | null;\n\n public constructor(config: Config) {\n this.config = config;\n this.tokenDb = null;\n }\n\n private async getTokenDb(): Promise<low.LowdbAsync<any>> {\n if (!this.tokenDb) {\n debug('token database is not defined');\n let adapter;\n if (process.env.NODE_ENV === 'test') {\n debug('token memory adapter');\n adapter = new FileMemory('');\n } else {\n debug('token async adapter');\n const pathDb = _dbGenPath(TOKEN_DB_NAME, this.config);\n adapter = new FileAsync(pathDb);\n }\n debug('token bd generated');\n this.tokenDb = await low(adapter);\n }\n\n return this.tokenDb;\n }\n\n public async saveToken(token: Token): Promise<void> {\n debug('token key %o', token.key);\n const db = await this.getTokenDb();\n const userData = await db.get(token.user).value();\n debug('user data %o', userData);\n if (_.isNil(userData)) {\n await db.set(token.user, [token]).write();\n debug('token user %o new database', token.user);\n } else {\n // types does not match with valid implementation\n // @ts-ignore\n await db.get(token.user).push(token).write();\n }\n debug('data %o', await db.getState());\n debug('token saved %o', token.user);\n }\n\n public async deleteToken(user: string, tokenKey: string): Promise<void> {\n const db = await this.getTokenDb();\n const userTokens = await db.get(user).value();\n if (_.isNil(userTokens)) {\n throw new Error('user not found');\n }\n debug('tokens %o - %o', userTokens, userTokens.length);\n const remainingTokens = userTokens.filter(({ key }) => {\n debug('key %o', key);\n return key !== tokenKey;\n });\n await db.set(user, remainingTokens).write();\n debug('removed tokens key %o', tokenKey);\n }\n\n public async readTokens(filter: TokenFilter): Promise<Token[]> {\n const { user } = filter;\n debug('read tokens with %o', user);\n const db = await this.getTokenDb();\n const tokens = await db.get(user).value();\n return tokens || [];\n }\n}\n"],"file":"token.js"}
|
package/build/utils.js
CHANGED
|
@@ -3,17 +3,17 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
+
exports._dbGenPath = _dbGenPath;
|
|
7
|
+
exports.findPackages = findPackages;
|
|
6
8
|
exports.getFileStats = getFileStats;
|
|
7
9
|
exports.readDirectory = readDirectory;
|
|
8
|
-
exports.findPackages = findPackages;
|
|
9
|
-
exports._dbGenPath = _dbGenPath;
|
|
10
10
|
|
|
11
11
|
var _fs = _interopRequireDefault(require("fs"));
|
|
12
12
|
|
|
13
|
-
var _path = _interopRequireDefault(require("path"));
|
|
14
|
-
|
|
15
13
|
var _lodash = _interopRequireDefault(require("lodash"));
|
|
16
14
|
|
|
15
|
+
var _path = _interopRequireDefault(require("path"));
|
|
16
|
+
|
|
17
17
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
18
18
|
|
|
19
19
|
function getFileStats(packagePath) {
|
package/build/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils.ts"],"names":["getFileStats","packagePath","Promise","resolve","reject","fs","stat","err","stats","_","isNil","readDirectory","readdir","scopedPackages","hasScope","file","match","findPackages","storagePath","validationHandler","listPackages","scopePath","path","storageDirs","directory","scopeDirectory","scopedDirName","push","name","error","_dbGenPath","dbName","config","join","dirname","config_path","storage"],"mappings":";;;;;;;;;;AAAA;;AACA;;AACA;;;;
|
|
1
|
+
{"version":3,"sources":["../src/utils.ts"],"names":["getFileStats","packagePath","Promise","resolve","reject","fs","stat","err","stats","_","isNil","readDirectory","readdir","scopedPackages","hasScope","file","match","findPackages","storagePath","validationHandler","listPackages","scopePath","path","storageDirs","directory","scopeDirectory","scopedDirName","push","name","error","_dbGenPath","dbName","config","join","dirname","config_path","storage"],"mappings":"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","sourcesContent":["import fs from 'fs';\nimport _ from 'lodash';\nimport path from 'path';\n\nimport { Config } from '@verdaccio/types';\n\nexport function getFileStats(packagePath: string): Promise<fs.Stats> {\n return new Promise((resolve, reject): void => {\n fs.stat(packagePath, (err, stats) => {\n if (_.isNil(err) === false) {\n return reject(err);\n }\n resolve(stats);\n });\n });\n}\n\nexport function readDirectory(packagePath: string): Promise<string[]> {\n return new Promise((resolve, reject): void => {\n fs.readdir(packagePath, (err, scopedPackages) => {\n if (_.isNil(err) === false) {\n return reject(err);\n }\n\n resolve(scopedPackages);\n });\n });\n}\n\nfunction hasScope(file: string): boolean {\n return file.match(/^@/) !== null;\n}\n\n/* eslint-disable no-async-promise-executor */\nexport async function findPackages(\n storagePath: string,\n validationHandler: Function\n): Promise<{ name: string; path: string }[]> {\n const listPackages: { name: string; path: string }[] = [];\n return new Promise(async (resolve, reject) => {\n try {\n const scopePath = path.resolve(storagePath);\n const storageDirs = await readDirectory(scopePath);\n for (const directory of storageDirs) {\n // we check whether has 2nd level\n if (hasScope(directory)) {\n // we read directory multiple\n const scopeDirectory = path.resolve(storagePath, directory);\n const scopedPackages = await readDirectory(scopeDirectory);\n for (const scopedDirName of scopedPackages) {\n if (validationHandler(scopedDirName)) {\n // we build the complete scope path\n const scopePath = path.resolve(storagePath, directory, scopedDirName);\n // list content of such directory\n listPackages.push({\n name: `${directory}/${scopedDirName}`,\n path: scopePath,\n });\n }\n }\n } else {\n // otherwise we read as single level\n if (validationHandler(directory)) {\n const scopePath = path.resolve(storagePath, directory);\n listPackages.push({\n name: directory,\n path: scopePath,\n });\n }\n }\n }\n } catch (error: any) {\n reject(error);\n }\n\n resolve(listPackages);\n });\n}\n\nexport function _dbGenPath(\n dbName: string,\n config: Pick<Config, 'config_path' | 'storage'>\n): string {\n return path.join(\n path.resolve(path.dirname(config.config_path || ''), config.storage as string, dbName)\n );\n}\n"],"file":"utils.js"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@verdaccio/local-storage",
|
|
3
|
-
"version": "11.0.0-6-next.
|
|
3
|
+
"version": "11.0.0-6-next.12",
|
|
4
4
|
"description": "Local storage implementation",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"private",
|
|
@@ -37,25 +37,26 @@
|
|
|
37
37
|
"npm": ">=7"
|
|
38
38
|
},
|
|
39
39
|
"dependencies": {
|
|
40
|
-
"@verdaccio/core": "6.0.0-6-next.
|
|
40
|
+
"@verdaccio/core": "6.0.0-6-next.5",
|
|
41
41
|
"@verdaccio/file-locking": "11.0.0-6-next.4",
|
|
42
42
|
"@verdaccio/streams": "11.0.0-6-next.5",
|
|
43
|
-
"async": "3.2.
|
|
44
|
-
"core-js": "3.
|
|
45
|
-
"debug": "4.3.
|
|
46
|
-
"globby": "11.0
|
|
43
|
+
"async": "3.2.3",
|
|
44
|
+
"core-js": "3.20.3",
|
|
45
|
+
"debug": "4.3.3",
|
|
46
|
+
"globby": "11.1.0",
|
|
47
47
|
"lockfile": "1.0.4",
|
|
48
|
+
"sanitize-filename": "1.6.3",
|
|
48
49
|
"lodash": "4.17.21",
|
|
49
50
|
"lowdb": "1.0.0",
|
|
50
51
|
"lru-cache": "6.0.0"
|
|
51
52
|
},
|
|
52
53
|
"devDependencies": {
|
|
53
54
|
"@types/minimatch": "3.0.5",
|
|
54
|
-
"@verdaccio/types": "11.0.0-6-next.
|
|
55
|
-
"@verdaccio/config": "6.0.0-6-next.
|
|
56
|
-
"@verdaccio/utils": "6.0.0-6-next.
|
|
55
|
+
"@verdaccio/types": "11.0.0-6-next.11",
|
|
56
|
+
"@verdaccio/config": "6.0.0-6-next.13",
|
|
57
|
+
"@verdaccio/utils": "6.0.0-6-next.11",
|
|
57
58
|
"minimatch": "3.0.4",
|
|
58
|
-
"tmp-promise": "3.0.
|
|
59
|
+
"tmp-promise": "3.0.3"
|
|
59
60
|
},
|
|
60
61
|
"funding": {
|
|
61
62
|
"type": "opencollective",
|