@verdaccio/local-storage 10.3.3 → 10.3.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,34 @@
1
+ import { searchUtils } from '@verdaccio/core';
2
+ /**
3
+ * Retrieve a list of absolute paths to all folders in the given storage path
4
+ * @param storagePath the base path of the storage
5
+ * @return a promise that resolves to an array of absolute paths
6
+ */
7
+ export declare function getFolders(storagePath: string, pattern?: string): Promise<string[]>;
8
+ /**
9
+ * Search packages on the the storage. The storage could be
10
+ * - storage
11
+ * - pkg1
12
+ * - @company
13
+ * - pkg2 -> @scompany/pkg2
14
+ * - storage1
15
+ * - pkg2
16
+ * - pkg3
17
+ * - storage2
18
+ * - @scope
19
+ * - pkg4 > @scope/pkg4
20
+ * The search return a data structure like:
21
+ * [
22
+ * {
23
+ * name: 'pkg1', // package name could be @scope/pkg1
24
+ * path: absolute/path/package/name
25
+ * }
26
+ * ]
27
+ * @param {string} storagePath is the base path of the storage folder,
28
+ * inside could be packages, storages and @scope packages.
29
+ * @param {Set<string>} storages storages are defined peer package access pattern via `storage` property
30
+ * @param query is the search query from the user via npm search command.
31
+ * and are intended to organize packages in a tree structure.
32
+ * @returns {Promise<searchUtils.SearchItemPkg[]>}
33
+ */
34
+ export declare function searchOnStorage(storagePath: string, storages: Map<string, string>): Promise<searchUtils.SearchItemPkg[]>;
@@ -0,0 +1,111 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.getFolders = getFolders;
7
+ exports.searchOnStorage = searchOnStorage;
8
+ var _debug = _interopRequireDefault(require("debug"));
9
+ var _globby = _interopRequireDefault(require("globby"));
10
+ var _path = require("path");
11
+ var _core = require("@verdaccio/core");
12
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
13
+ const debug = (0, _debug.default)('verdaccio:plugin:local-storage:dir-utils');
14
+
15
+ /**
16
+ * Retrieve a list of absolute paths to all folders in the given storage path
17
+ * @param storagePath the base path of the storage
18
+ * @return a promise that resolves to an array of absolute paths
19
+ */
20
+ async function getFolders(storagePath, pattern = '*') {
21
+ // @ts-ignore - check why this fails, types are correct
22
+ const files = await (0, _globby.default)(pattern, {
23
+ // @ts-ignore
24
+ cwd: storagePath,
25
+ expandDirectories: true,
26
+ onlyDirectories: true,
27
+ onlyFiles: false,
28
+ // should not go deeper than the storage path (10 is reseaon for the storage))
29
+ deep: 10,
30
+ dot: false,
31
+ followSymbolicLinks: true,
32
+ caseSensitiveMatch: true,
33
+ unique: true
34
+ // FIXME: add here list of forbidden patterns
35
+ // don't include scoped folders.
36
+ // ignore: [`@*`],
37
+ });
38
+
39
+ return files;
40
+ }
41
+
42
+ /**
43
+ * Search packages on the the storage. The storage could be
44
+ * - storage
45
+ * - pkg1
46
+ * - @company
47
+ * - pkg2 -> @scompany/pkg2
48
+ * - storage1
49
+ * - pkg2
50
+ * - pkg3
51
+ * - storage2
52
+ * - @scope
53
+ * - pkg4 > @scope/pkg4
54
+ * The search return a data structure like:
55
+ * [
56
+ * {
57
+ * name: 'pkg1', // package name could be @scope/pkg1
58
+ * path: absolute/path/package/name
59
+ * }
60
+ * ]
61
+ * @param {string} storagePath is the base path of the storage folder,
62
+ * inside could be packages, storages and @scope packages.
63
+ * @param {Set<string>} storages storages are defined peer package access pattern via `storage` property
64
+ * @param query is the search query from the user via npm search command.
65
+ * and are intended to organize packages in a tree structure.
66
+ * @returns {Promise<searchUtils.SearchItemPkg[]>}
67
+ */
68
+ async function searchOnStorage(storagePath, storages) {
69
+ const matchedStorages = Array.from(storages);
70
+ const storageFolders = Array.from(storages.keys());
71
+ debug('search on %o', storagePath);
72
+ debug('storage folders %o', matchedStorages.length);
73
+ let results = [];
74
+ // watch base path and ignore storage folders
75
+ const basePathFolders = (await getFolders(storagePath, '*')).filter(storageFolder => !storageFolders.includes(storageFolder));
76
+ for (let store of basePathFolders) {
77
+ if (_core.validatioUtils.isPackageNameScoped(store)) {
78
+ const scopedPackages = await getFolders((0, _path.join)(storagePath, store), '*');
79
+ const listScoped = scopedPackages.map(scoped => ({
80
+ name: `${store}/${scoped}`,
81
+ scoped: store
82
+ }));
83
+ results.push(...listScoped);
84
+ } else {
85
+ results.push({
86
+ name: store
87
+ });
88
+ }
89
+ }
90
+
91
+ // iterate each storage folder
92
+ for (const store of storageFolders) {
93
+ const foldersOnStorage = await getFolders((0, _path.join)(storagePath, store), '*');
94
+ for (let pkgName of foldersOnStorage) {
95
+ if (_core.validatioUtils.isPackageNameScoped(pkgName)) {
96
+ const scopedPackages = await getFolders((0, _path.join)(storagePath, store, pkgName), '*');
97
+ const listScoped = scopedPackages.map(scoped => ({
98
+ name: `${pkgName}/${scoped}`,
99
+ scoped: pkgName
100
+ }));
101
+ results.push(...listScoped);
102
+ } else {
103
+ results.push({
104
+ name: pkgName
105
+ });
106
+ }
107
+ }
108
+ }
109
+ return results;
110
+ }
111
+ //# sourceMappingURL=dir-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dir-utils.js","names":["_debug","_interopRequireDefault","require","_globby","_path","_core","obj","__esModule","default","debug","buildDebug","getFolders","storagePath","pattern","files","globby","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","join","listScoped","map","scoped","name","push","foldersOnStorage","pkgName"],"sources":["../src/dir-utils.ts"],"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:dir-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 forbidden 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 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"],"mappings":"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"}
@@ -1,6 +1,9 @@
1
- import { Callback, Config, IPackageStorage, IPluginStorage, LocalStorage, Logger } from '@verdaccio/legacy-types';
1
+ import { Callback, Config, Logger } from '@verdaccio/types';
2
+ import { searchUtils } from '@verdaccio/core';
3
+ import { LocalStorage } from './utils';
4
+ import LocalDriver from './local-fs';
2
5
  import TokenActions from './token';
3
- declare class LocalDatabase extends TokenActions implements IPluginStorage<{}> {
6
+ declare class LocalDatabase extends TokenActions {
4
7
  path: string;
5
8
  logger: Logger;
6
9
  data: LocalStorage;
@@ -10,22 +13,34 @@ declare class LocalDatabase extends TokenActions implements IPluginStorage<{}> {
10
13
  getSecret(): Promise<string>;
11
14
  setSecret(secret: string): Promise<Error | null>;
12
15
  add(name: string, cb: Callback): void;
13
- search(onPackage: Callback, onEnd: Callback, validateName: (name: string) => boolean): void;
16
+ /**
17
+ * Filter and only match those values that the query define.
18
+ **/
19
+ filterByQuery(results: searchUtils.SearchItemPkg[], query: searchUtils.SearchQuery): Promise<searchUtils.SearchItemPkg[]>;
20
+ getScore(_pkg: searchUtils.SearchItemPkg): Promise<searchUtils.Score>;
21
+ private _getCustomPackageLocalStorages;
22
+ search(query: searchUtils.SearchQuery): Promise<searchUtils.SearchItem[]>;
14
23
  remove(name: string, cb: Callback): void;
15
24
  /**
16
25
  * Return all database elements.
17
26
  * @return {Array}
18
27
  */
19
28
  get(cb: Callback): void;
20
- getPackageStorage(packageName: string): IPackageStorage;
29
+ getPackageStorage(packageName: string): LocalDriver | undefined;
21
30
  clean(): void;
22
31
  private getTime;
23
- private _getCustomPackageLocalStorages;
24
32
  /**
25
33
  * Syncronize {create} database whether does not exist.
26
34
  * @return {Error|*}
27
35
  */
28
36
  private _sync;
37
+ private getBaseConfigPath;
38
+ /**
39
+ * The field storage could be absolute or relative.
40
+ * If relative, it will be resolved against the config path.
41
+ * If absolute, it will be returned as is.
42
+ **/
43
+ private getStoragePath;
29
44
  /**
30
45
  * Verify the right local storage location.
31
46
  * @param {String} path
@@ -33,13 +48,6 @@ declare class LocalDatabase extends TokenActions implements IPluginStorage<{}> {
33
48
  * @private
34
49
  */
35
50
  private _getLocalStoragePath;
36
- /**
37
- * Build the local database path.
38
- * @param {Object} config
39
- * @return {string|String|*}
40
- * @private
41
- */
42
- private _buildStoragePath;
43
51
  /**
44
52
  * Fetch local packages.
45
53
  * @private
@@ -8,23 +8,21 @@ var _fs = _interopRequireDefault(require("fs"));
8
8
  var _path = _interopRequireDefault(require("path"));
9
9
  var _debug = _interopRequireDefault(require("debug"));
10
10
  var _lodash = _interopRequireDefault(require("lodash"));
11
- var _async = _interopRequireDefault(require("async"));
12
11
  var _mkdirp = _interopRequireDefault(require("mkdirp"));
13
- var _commonsApi = require("@verdaccio/commons-api");
12
+ var _dirUtils = require("./dir-utils");
13
+ var _core = require("@verdaccio/core");
14
14
  var _localFs = _interopRequireWildcard(require("./local-fs"));
15
15
  var _pkgUtils = require("./pkg-utils");
16
16
  var _token = _interopRequireDefault(require("./token"));
17
17
  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); }
18
18
  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; }
19
19
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
20
- const DEPRECATED_DB_NAME = '.sinopia-db.json';
21
- const DB_NAME = '.verdaccio-db.json';
22
- const debug = (0, _debug.default)('verdaccio:plugin:local-storage');
20
+ const debug = (0, _debug.default)('verdaccio:plugin:local-storage:database');
23
21
  class LocalDatabase extends _token.default {
24
22
  constructor(config, logger) {
25
23
  super(config);
26
24
  this.config = config;
27
- this.path = this._buildStoragePath(config);
25
+ this.path = this._dbGenPath(_core.fileUtils.Files.DatabaseName, config);
28
26
  this.logger = logger;
29
27
  this.locked = false;
30
28
  this.data = this._fetchLocalPackages();
@@ -49,84 +47,76 @@ class LocalDatabase extends _token.default {
49
47
  cb(null);
50
48
  }
51
49
  }
52
- search(onPackage, onEnd, validateName) {
53
- const storages = this._getCustomPackageLocalStorages();
54
- debug(`search custom local packages: %o`, JSON.stringify(storages));
55
- const base = _path.default.dirname(this.config.self_path);
56
- const self = this;
57
- const storageKeys = Object.keys(storages);
58
- debug(`search base: %o keys: %o`, base, storageKeys);
59
- _async.default.eachSeries(storageKeys, function (storage, cb) {
60
- const position = storageKeys.indexOf(storage);
61
- const base2 = _path.default.join(position !== 0 ? storageKeys[0] : '');
62
- const storagePath = _path.default.resolve(base, base2, storage);
63
- debug('search path: %o : %o', storagePath, storage);
64
- _fs.default.readdir(storagePath, (err, files) => {
65
- if (err) {
66
- return cb(err);
50
+
51
+ /**
52
+ * Filter and only match those values that the query define.
53
+ **/
54
+ async filterByQuery(results, query) {
55
+ // FUTURE: apply new filters, keyword, version, ...
56
+ return results.filter(item => {
57
+ var _item$name;
58
+ return (item === null || item === void 0 ? void 0 : (_item$name = item.name) === null || _item$name === void 0 ? void 0 : _item$name.match(query.text)) !== null;
59
+ });
60
+ }
61
+
62
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
63
+ async getScore(_pkg) {
64
+ // TODO: there is no particular reason to predefined scores
65
+ // could be improved by using
66
+ return Promise.resolve({
67
+ final: 1,
68
+ detail: {
69
+ maintenance: 0,
70
+ popularity: 1,
71
+ quality: 1
72
+ }
73
+ });
74
+ }
75
+ _getCustomPackageLocalStorages() {
76
+ const storages = new Map();
77
+ const {
78
+ packages
79
+ } = this.config;
80
+ if (packages) {
81
+ Object.keys(packages || {}).map(pkg => {
82
+ const {
83
+ storage
84
+ } = packages[pkg];
85
+ if (typeof storage === 'string') {
86
+ const storagePath = _path.default.join(this.getStoragePath(), storage);
87
+ debug('add custom storage for %s on %s', storage, storagePath);
88
+ storages.set(storage, storagePath);
67
89
  }
68
- _async.default.eachSeries(files, function (file, cb) {
69
- debug('local-storage: [search] search file path: %o', file);
70
- if (storageKeys.includes(file)) {
71
- return cb();
72
- }
73
- if (file.match(/^@/)) {
74
- // scoped
75
- const fileLocation = _path.default.resolve(base, storage, file);
76
- debug('search scoped file location: %o', fileLocation);
77
- _fs.default.readdir(fileLocation, function (err, files) {
78
- if (err) {
79
- return cb(err);
80
- }
81
- _async.default.eachSeries(files, (file2, cb) => {
82
- if (validateName(file2)) {
83
- const packagePath = _path.default.resolve(base, storage, file, file2);
84
- _fs.default.stat(packagePath, (err, stats) => {
85
- if (_lodash.default.isNil(err) === false) {
86
- return cb(err);
87
- }
88
- const item = {
89
- name: `${file}/${file2}`,
90
- path: packagePath,
91
- time: stats.mtime.getTime()
92
- };
93
- onPackage(item, cb);
94
- });
95
- } else {
96
- cb();
97
- }
98
- }, cb);
99
- });
100
- } else if (validateName(file)) {
101
- const base2 = _path.default.join(position !== 0 ? storageKeys[0] : '');
102
- const packagePath = _path.default.resolve(base, base2, storage, file);
103
- debug('search file location: %o', packagePath);
104
- _fs.default.stat(packagePath, (err, stats) => {
105
- if (_lodash.default.isNil(err) === false) {
106
- return cb(err);
107
- }
108
- onPackage({
109
- name: file,
110
- path: packagePath,
111
- time: self.getTime(stats.mtime.getTime(), stats.mtime)
112
- }, cb);
113
- });
114
- } else {
115
- cb();
116
- }
117
- }, cb);
118
90
  });
119
- },
120
- // @ts-ignore
121
- onEnd);
91
+ }
92
+ return storages;
93
+ }
94
+ async search(query) {
95
+ const results = [];
96
+ const storagePath = this.getStoragePath();
97
+ const storages = this._getCustomPackageLocalStorages();
98
+ const packagesOnStorage = await this.filterByQuery(await (0, _dirUtils.searchOnStorage)(storagePath, storages), query);
99
+ debug('packages found %o', packagesOnStorage.length);
100
+ for (let storage of packagesOnStorage) {
101
+ // check if package is listed on the cache private database
102
+ const isPrivate = this.data.list.includes(storage.name);
103
+ const score = await this.getScore(storage);
104
+ results.push({
105
+ package: storage,
106
+ verdaccioPrivate: isPrivate,
107
+ verdaccioPkgCached: !isPrivate,
108
+ score
109
+ });
110
+ }
111
+ return results;
122
112
  }
123
113
  remove(name, cb) {
124
114
  this.get((err, data) => {
125
115
  if (err) {
126
- cb((0, _commonsApi.getInternalError)('error remove private package'));
116
+ cb(_core.errorUtils.getInternalError('error remove private package'));
127
117
  this.logger.error({
128
118
  err
129
- }, '[local-storage/remove]: remove the private package has failed @{err}');
119
+ }, 'remove the private package has failed @{err}');
130
120
  debug('error on remove package %o', name);
131
121
  }
132
122
  const pkgName = data.indexOf(name);
@@ -166,27 +156,6 @@ class LocalDatabase extends _token.default {
166
156
  getTime(time, mtime) {
167
157
  return time ? time : mtime;
168
158
  }
169
- _getCustomPackageLocalStorages() {
170
- const storages = {};
171
-
172
- // add custom storage if exist
173
- if (this.config.storage) {
174
- storages[this.config.storage] = true;
175
- }
176
- const {
177
- packages
178
- } = this.config;
179
- if (packages) {
180
- const listPackagesConf = Object.keys(packages || {});
181
- listPackagesConf.map(pkg => {
182
- const storage = packages[pkg].storage;
183
- if (storage) {
184
- storages[storage] = false;
185
- }
186
- });
187
- }
188
- return storages;
189
- }
190
159
 
191
160
  /**
192
161
  * Syncronize {create} database whether does not exist.
@@ -217,6 +186,26 @@ class LocalDatabase extends _token.default {
217
186
  return err;
218
187
  }
219
188
  }
189
+ getBaseConfigPath() {
190
+ return _path.default.dirname(this.config.configPath);
191
+ }
192
+
193
+ /**
194
+ * The field storage could be absolute or relative.
195
+ * If relative, it will be resolved against the config path.
196
+ * If absolute, it will be returned as is.
197
+ **/
198
+ getStoragePath() {
199
+ const {
200
+ storage
201
+ } = this.config;
202
+ if (typeof storage !== 'string') {
203
+ throw new TypeError('storage field is mandatory');
204
+ }
205
+ const storagePath = _path.default.isAbsolute(storage) ? storage : _path.default.normalize(_path.default.join(this.getBaseConfigPath(), storage));
206
+ debug('storage path %o', storagePath);
207
+ return storagePath;
208
+ }
220
209
 
221
210
  /**
222
211
  * Verify the right local storage location.
@@ -236,30 +225,6 @@ class LocalDatabase extends _token.default {
236
225
  }
237
226
  }
238
227
 
239
- /**
240
- * Build the local database path.
241
- * @param {Object} config
242
- * @return {string|String|*}
243
- * @private
244
- */
245
- _buildStoragePath(config) {
246
- const sinopiadbPath = this._dbGenPath(DEPRECATED_DB_NAME, config);
247
- try {
248
- _fs.default.accessSync(sinopiadbPath, _fs.default.constants.F_OK);
249
- // @ts-ignore
250
- process.emitWarning('Database name deprecated!', {
251
- code: 'VERCODE01',
252
- detail: `Please rename database name from ${DEPRECATED_DB_NAME} to ${DB_NAME}`
253
- });
254
- return sinopiadbPath;
255
- } catch (err) {
256
- if (err.code === _localFs.noSuchFile) {
257
- return this._dbGenPath(DB_NAME, config);
258
- }
259
- throw err;
260
- }
261
- }
262
-
263
228
  /**
264
229
  * Fetch local packages.
265
230
  * @private
@@ -1 +1 @@
1
- {"version":3,"file":"local-database.js","names":["_fs","_interopRequireDefault","require","_path","_debug","_lodash","_async","_mkdirp","_commonsApi","_localFs","_interopRequireWildcard","_pkgUtils","_token","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","obj","__esModule","default","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","DEPRECATED_DB_NAME","DB_NAME","debug","buildDebug","LocalDatabase","TokenActions","constructor","config","logger","path","_buildStoragePath","locked","data","_fetchLocalPackages","_sync","getSecret","Promise","resolve","secret","setSecret","add","name","cb","list","indexOf","push","search","onPackage","onEnd","validateName","storages","_getCustomPackageLocalStorages","JSON","stringify","base","Path","dirname","self_path","self","storageKeys","keys","async","eachSeries","storage","position","base2","join","storagePath","fs","readdir","err","files","file","includes","match","fileLocation","file2","packagePath","stat","stats","_","isNil","item","time","mtime","getTime","remove","getInternalError","error","pkgName","splice","totalItems","length","getPackageStorage","packageName","packageAccess","getMatchedPackagesSpec","_getLocalStoragePath","undefined","isString","packageStoragePath","LocalDriver","clean","packages","listPackagesConf","map","pkg","Error","folderName","mkdirp","sync","writeFileSync","globalConfigStorage","sinopiadbPath","_dbGenPath","accessSync","constants","F_OK","process","emitWarning","code","detail","noSuchFile","emptyDatabase","loadPrivatePackages","message","_default","exports"],"sources":["../src/local-database.ts"],"sourcesContent":["import fs from 'fs';\nimport Path from 'path';\n\nimport buildDebug from 'debug';\nimport _ from 'lodash';\nimport async from 'async';\nimport mkdirp from 'mkdirp';\nimport {\n Callback,\n Config,\n IPackageStorage,\n IPluginStorage,\n LocalStorage,\n Logger,\n StorageList,\n} from '@verdaccio/legacy-types';\nimport { getInternalError } from '@verdaccio/commons-api';\n\nimport LocalDriver, { noSuchFile } from './local-fs';\nimport { loadPrivatePackages } from './pkg-utils';\nimport TokenActions from './token';\n\nconst DEPRECATED_DB_NAME = '.sinopia-db.json';\nconst DB_NAME = '.verdaccio-db.json';\n\nconst debug = buildDebug('verdaccio:plugin:local-storage');\n\nclass LocalDatabase extends TokenActions implements IPluginStorage<{}> {\n public path: string;\n public logger: Logger;\n public data: LocalStorage;\n public config: Config;\n public locked: boolean;\n\n public constructor(config: Config, logger: Logger) {\n super(config);\n this.config = config;\n this.path = this._buildStoragePath(config);\n this.logger = logger;\n this.locked = false;\n this.data = this._fetchLocalPackages();\n this._sync();\n }\n\n public getSecret(): Promise<string> {\n return Promise.resolve(this.data.secret);\n }\n\n public setSecret(secret: string): Promise<Error | null> {\n return new Promise((resolve): void => {\n this.data.secret = secret;\n\n resolve(this._sync());\n });\n }\n\n public add(name: string, cb: Callback): void {\n if (this.data.list.indexOf(name) === -1) {\n this.data.list.push(name);\n\n debug('the private package %o has been added', name);\n cb(this._sync());\n } else {\n debug('the private package %o was not added', name);\n cb(null);\n }\n }\n\n public search(\n onPackage: Callback,\n onEnd: Callback,\n validateName: (name: string) => boolean\n ): void {\n const storages = this._getCustomPackageLocalStorages();\n debug(`search custom local packages: %o`, JSON.stringify(storages));\n const base = Path.dirname(this.config.self_path);\n const self = this;\n const storageKeys = Object.keys(storages);\n debug(`search base: %o keys: %o`, base, storageKeys);\n\n async.eachSeries(\n storageKeys,\n function (storage, cb) {\n const position = storageKeys.indexOf(storage);\n const base2 = Path.join(position !== 0 ? storageKeys[0] : '');\n const storagePath: string = Path.resolve(base, base2, storage);\n debug('search path: %o : %o', storagePath, storage);\n fs.readdir(storagePath, (err, files) => {\n if (err) {\n return cb(err);\n }\n\n async.eachSeries(\n files,\n function (file, cb) {\n debug('local-storage: [search] search file path: %o', file);\n if (storageKeys.includes(file)) {\n return cb();\n }\n\n if (file.match(/^@/)) {\n // scoped\n const fileLocation = Path.resolve(base, storage, file);\n debug('search scoped file location: %o', fileLocation);\n fs.readdir(fileLocation, function (err, files) {\n if (err) {\n return cb(err);\n }\n\n async.eachSeries(\n files,\n (file2, cb) => {\n if (validateName(file2)) {\n const packagePath = Path.resolve(base, storage, file, file2);\n\n fs.stat(packagePath, (err, stats) => {\n if (_.isNil(err) === false) {\n return cb(err);\n }\n const item = {\n name: `${file}/${file2}`,\n path: packagePath,\n time: stats.mtime.getTime(),\n };\n onPackage(item, cb);\n });\n } else {\n cb();\n }\n },\n cb\n );\n });\n } else if (validateName(file)) {\n const base2 = Path.join(position !== 0 ? storageKeys[0] : '');\n const packagePath = Path.resolve(base, base2, storage, file);\n debug('search file location: %o', packagePath);\n fs.stat(packagePath, (err, stats) => {\n if (_.isNil(err) === false) {\n return cb(err);\n }\n onPackage(\n {\n name: file,\n path: packagePath,\n time: self.getTime(stats.mtime.getTime(), stats.mtime),\n },\n cb\n );\n });\n } else {\n cb();\n }\n },\n cb\n );\n });\n },\n // @ts-ignore\n onEnd\n );\n }\n\n public remove(name: string, cb: Callback): void {\n this.get((err, data) => {\n if (err) {\n cb(getInternalError('error remove private package'));\n this.logger.error(\n { err },\n '[local-storage/remove]: remove the private package has failed @{err}'\n );\n debug('error on remove package %o', name);\n }\n\n const pkgName = data.indexOf(name);\n if (pkgName !== -1) {\n this.data.list.splice(pkgName, 1);\n\n debug('remove package %o has been removed', name);\n }\n\n cb(this._sync());\n });\n }\n\n /**\n * Return all database elements.\n * @return {Array}\n */\n public get(cb: Callback): void {\n const list = this.data.list;\n const totalItems = this.data.list.length;\n\n cb(null, list);\n\n debug('get full list of packages (%o) has been fetched', totalItems);\n }\n\n public getPackageStorage(packageName: string): IPackageStorage {\n const packageAccess = this.config.getMatchedPackagesSpec(packageName);\n\n const packagePath: string = this._getLocalStoragePath(\n packageAccess ? packageAccess.storage : undefined\n );\n debug('storage path selected: ', packagePath);\n\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 Path.resolve(Path.dirname(this.config.self_path || ''), packagePath),\n packageName\n );\n\n debug('storage absolute path: ', packageStoragePath);\n\n return new LocalDriver(packageStoragePath, this.logger);\n }\n\n public clean(): void {\n this._sync();\n }\n\n private getTime(time: number, mtime: Date): number | Date {\n return time ? time : mtime;\n }\n\n private _getCustomPackageLocalStorages(): object {\n const storages = {};\n\n // add custom storage if exist\n if (this.config.storage) {\n storages[this.config.storage] = true;\n }\n\n const { packages } = this.config;\n\n if (packages) {\n const listPackagesConf = Object.keys(packages || {});\n\n listPackagesConf.map((pkg) => {\n const storage = packages[pkg].storage;\n if (storage) {\n storages[storage] = false;\n }\n });\n }\n\n return storages;\n }\n\n /**\n * Syncronize {create} database whether does not exist.\n * @return {Error|*}\n */\n private _sync(): Error | null {\n debug('sync database started');\n\n if (this.locked) {\n this.logger.error(\n 'Database is locked, please check error message printed during startup to ' +\n 'prevent data loss.'\n );\n return new Error(\n 'Verdaccio database is locked, please contact your administrator to checkout ' +\n 'logs during verdaccio startup.'\n );\n }\n // Uses sync to prevent ugly race condition\n try {\n // https://www.npmjs.com/package/mkdirp#mkdirpsyncdir-opts\n const folderName = Path.dirname(this.path);\n mkdirp.sync(folderName);\n debug('sync folder %o created succeed', folderName);\n } catch (err) {\n debug('sync create folder has failed with error: %o', err);\n return null;\n }\n\n try {\n fs.writeFileSync(this.path, JSON.stringify(this.data));\n debug('sync write succeed');\n\n return null;\n } catch (err: any) {\n debug('sync failed %o', err);\n\n return err;\n }\n }\n\n /**\n * Verify the right local storage location.\n * @param {String} path\n * @return {String}\n * @private\n */\n private _getLocalStoragePath(storage: string | void): string {\n const globalConfigStorage = this.config ? this.config.storage : undefined;\n if (_.isNil(globalConfigStorage)) {\n throw new Error('global storage is required for this plugin');\n } else {\n if (_.isNil(storage) === false && _.isString(storage)) {\n return Path.join(globalConfigStorage as string, storage as string);\n }\n\n return globalConfigStorage as string;\n }\n }\n\n /**\n * Build the local database path.\n * @param {Object} config\n * @return {string|String|*}\n * @private\n */\n private _buildStoragePath(config: Config): string {\n const sinopiadbPath: string = this._dbGenPath(DEPRECATED_DB_NAME, config);\n try {\n fs.accessSync(sinopiadbPath, fs.constants.F_OK);\n // @ts-ignore\n process.emitWarning('Database name deprecated!', {\n code: 'VERCODE01',\n detail: `Please rename database name from ${DEPRECATED_DB_NAME} to ${DB_NAME}`,\n });\n return sinopiadbPath;\n } catch (err: any) {\n if (err.code === noSuchFile) {\n return this._dbGenPath(DB_NAME, config);\n }\n\n throw err;\n }\n }\n\n /**\n * Fetch local packages.\n * @private\n * @return {Object}\n */\n private _fetchLocalPackages(): LocalStorage {\n const list: StorageList = [];\n const emptyDatabase = { list, secret: '' };\n\n try {\n return 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 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 emptyDatabase;\n }\n }\n}\n\nexport default LocalDatabase;\n"],"mappings":"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"}
1
+ {"version":3,"file":"local-database.js","names":["_fs","_interopRequireDefault","require","_path","_debug","_lodash","_mkdirp","_dirUtils","_core","_localFs","_interopRequireWildcard","_pkgUtils","_token","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","obj","__esModule","default","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","debug","buildDebug","LocalDatabase","TokenActions","constructor","config","logger","path","_dbGenPath","fileUtils","Files","DatabaseName","locked","data","_fetchLocalPackages","_sync","getSecret","Promise","resolve","secret","setSecret","add","name","cb","list","indexOf","push","filterByQuery","results","query","filter","item","_item$name","match","text","getScore","_pkg","final","detail","maintenance","popularity","quality","_getCustomPackageLocalStorages","storages","Map","packages","keys","map","pkg","storage","storagePath","Path","join","getStoragePath","search","packagesOnStorage","searchOnStorage","length","isPrivate","includes","score","package","verdaccioPrivate","verdaccioPkgCached","remove","err","errorUtils","getInternalError","error","pkgName","splice","totalItems","getPackageStorage","packageName","packageAccess","getMatchedPackagesSpec","packagePath","_getLocalStoragePath","undefined","_","isString","packageStoragePath","dirname","self_path","LocalDriver","clean","getTime","time","mtime","Error","folderName","mkdirp","sync","fs","writeFileSync","JSON","stringify","getBaseConfigPath","configPath","TypeError","isAbsolute","normalize","globalConfigStorage","isNil","emptyDatabase","loadPrivatePackages","code","noSuchFile","message","_default","exports"],"sources":["../src/local-database.ts"],"sourcesContent":["import fs from 'fs';\nimport Path from 'path';\n\nimport buildDebug from 'debug';\nimport _ from 'lodash';\nimport mkdirp from 'mkdirp';\nimport {\n Callback,\n Config,\n Logger,\n StorageList,\n} from '@verdaccio/types';\nimport { searchOnStorage } from './dir-utils';\nimport { errorUtils, searchUtils, fileUtils } from '@verdaccio/core';\nimport {LocalStorage} from './utils';\nimport LocalDriver, { noSuchFile } from './local-fs';\nimport { loadPrivatePackages } from './pkg-utils';\nimport TokenActions from './token';\n\nconst debug = buildDebug('verdaccio:plugin:local-storage:database');\n\n\nclass LocalDatabase extends TokenActions {\n public path: string;\n public logger: Logger;\n public data: LocalStorage;\n public config: Config;\n public locked: boolean;\n\n public constructor(config: Config, logger: Logger) {\n super(config);\n this.config = config;\n this.path = this._dbGenPath(fileUtils.Files.DatabaseName, config);\n this.logger = logger;\n this.locked = false;\n this.data = this._fetchLocalPackages();\n this._sync();\n }\n\n public getSecret(): Promise<string> {\n return Promise.resolve(this.data.secret);\n }\n\n public setSecret(secret: string): Promise<Error | null> {\n return new Promise((resolve): void => {\n this.data.secret = secret;\n\n resolve(this._sync());\n });\n }\n\n public add(name: string, cb: Callback): void {\n if (this.data.list.indexOf(name) === -1) {\n this.data.list.push(name);\n\n debug('the private package %o has been added', name);\n cb(this._sync());\n } else {\n debug('the private package %o was not added', name);\n cb(null);\n }\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 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 public async search(query: searchUtils.SearchQuery): Promise<searchUtils.SearchItem[]> {\n const results: searchUtils.SearchItem[] = [];\n const storagePath = this.getStoragePath();\n const storages = this._getCustomPackageLocalStorages();\n const packagesOnStorage = await this.filterByQuery(\n await searchOnStorage(storagePath, 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 remove(name: string, cb: Callback): void {\n this.get((err, data) => {\n if (err) {\n cb(errorUtils.getInternalError('error remove private package'));\n this.logger.error(\n { err },\n 'remove the private package has failed @{err}'\n );\n debug('error on remove package %o', name);\n }\n\n const pkgName = data.indexOf(name);\n if (pkgName !== -1) {\n this.data.list.splice(pkgName, 1);\n\n debug('remove package %o has been removed', name);\n }\n\n cb(this._sync());\n });\n }\n\n /**\n * Return all database elements.\n * @return {Array}\n */\n public get(cb: Callback): void {\n const list = this.data.list;\n const totalItems = this.data.list.length;\n\n cb(null, list);\n\n debug('get full list of packages (%o) has been fetched', totalItems);\n }\n\n public getPackageStorage(packageName: string) {\n const packageAccess = this.config.getMatchedPackagesSpec(packageName);\n\n const packagePath: string = this._getLocalStoragePath(\n packageAccess ? packageAccess.storage : undefined\n );\n debug('storage path selected: ', packagePath);\n\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 Path.resolve(Path.dirname(this.config.self_path || ''), packagePath),\n packageName\n );\n\n debug('storage absolute path: ', packageStoragePath);\n\n return new LocalDriver(packageStoragePath, this.logger);\n }\n\n public clean(): void {\n this._sync();\n }\n\n private getTime(time: number, mtime: Date): number | Date {\n return time ? time : mtime;\n }\n\n\n /**\n * Syncronize {create} database whether does not exist.\n * @return {Error|*}\n */\n private _sync(): Error | null {\n debug('sync database started');\n\n if (this.locked) {\n this.logger.error(\n 'Database is locked, please check error message printed during startup to ' +\n 'prevent data loss.'\n );\n return new Error(\n 'Verdaccio database is locked, please contact your administrator to checkout ' +\n 'logs during verdaccio startup.'\n );\n }\n // Uses sync to prevent ugly race condition\n try {\n // https://www.npmjs.com/package/mkdirp#mkdirpsyncdir-opts\n const folderName = Path.dirname(this.path);\n mkdirp.sync(folderName);\n debug('sync folder %o created succeed', folderName);\n } catch (err) {\n debug('sync create folder has failed with error: %o', err);\n return null;\n }\n\n try {\n fs.writeFileSync(this.path, JSON.stringify(this.data));\n debug('sync write succeed');\n\n return null;\n } catch (err: any) {\n debug('sync failed %o', err);\n\n return err;\n }\n }\n\n private getBaseConfigPath(): string {\n return Path.dirname(this.config.configPath);\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 /**\n * Verify the right local storage location.\n * @param {String} path\n * @return {String}\n * @private\n */\n private _getLocalStoragePath(storage: string | void): string {\n const globalConfigStorage = this.config ? this.config.storage : undefined;\n if (_.isNil(globalConfigStorage)) {\n throw new Error('global storage is required for this plugin');\n } else {\n if (_.isNil(storage) === false && _.isString(storage)) {\n return Path.join(globalConfigStorage as string, storage as string);\n }\n\n return globalConfigStorage as string;\n }\n }\n\n /**\n * Fetch local packages.\n * @private\n * @return {Object}\n */\n private _fetchLocalPackages(): LocalStorage {\n const list: StorageList = [];\n const emptyDatabase = { list, secret: '' };\n\n try {\n return 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 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 emptyDatabase;\n }\n }\n}\n\nexport default LocalDatabase;\n"],"mappings":"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"}
package/lib/local-fs.d.ts CHANGED
@@ -1,16 +1,13 @@
1
1
  /// <reference types="node" />
2
- import { ReadTarball } from '@verdaccio/streams';
3
- import { Callback, Logger, Package, ILocalPackageManager, IUploadTarball } from '@verdaccio/legacy-types';
4
- import { VerdaccioError } from '@verdaccio/commons-api';
2
+ import { UploadTarball, ReadTarball } from '@verdaccio/streams';
3
+ import { Callback, Logger, Package } from '@verdaccio/types';
4
+ import { VerdaccioError } from '@verdaccio/core';
5
5
  export declare const fileExist = "EEXISTS";
6
6
  export declare const noSuchFile = "ENOENT";
7
7
  export declare const resourceNotAvailable = "EAGAIN";
8
8
  export declare const pkgFileName = "package.json";
9
9
  export declare const fSError: (message: string, code?: number) => VerdaccioError;
10
- export declare type ILocalFSPackageManager = ILocalPackageManager & {
11
- path: string;
12
- };
13
- export default class LocalFS implements ILocalFSPackageManager {
10
+ export default class LocalFS {
14
11
  path: string;
15
12
  logger: Logger;
16
13
  constructor(path: string, logger: Logger);
@@ -35,7 +32,7 @@ export default class LocalFS implements ILocalFSPackageManager {
35
32
  createPackage(name: string, value: Package, cb: Callback): void;
36
33
  savePackage(name: string, value: Package, cb: Callback): void;
37
34
  readPackage(name: string, cb: Callback): void;
38
- writeTarball(name: string): IUploadTarball;
35
+ writeTarball(name: string): UploadTarball;
39
36
  readTarball(name: string): ReadTarball;
40
37
  private _createFile;
41
38
  private _readStorageFile;
package/lib/local-fs.js CHANGED
@@ -11,7 +11,7 @@ var _lodash = _interopRequireDefault(require("lodash"));
11
11
  var _mkdirp = _interopRequireDefault(require("mkdirp"));
12
12
  var _streams = require("@verdaccio/streams");
13
13
  var _fileLocking = require("@verdaccio/file-locking");
14
- var _commonsApi = require("@verdaccio/commons-api");
14
+ var _core = require("@verdaccio/core");
15
15
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
16
16
  /* eslint-disable no-undef */
17
17
 
@@ -25,7 +25,7 @@ const pkgFileName = 'package.json';
25
25
  exports.pkgFileName = pkgFileName;
26
26
  const debug = (0, _debug.default)('verdaccio:plugin:local-storage:fs');
27
27
  const fSError = function (message, code = 409) {
28
- const err = (0, _commonsApi.getCode)(code, message);
28
+ const err = _core.errorUtils.getCode(code, message);
29
29
  // FIXME: we should return http-status codes here instead, future improvement
30
30
  // @ts-ignore
31
31
  err.code = message;
@@ -104,9 +104,9 @@ class LocalFS {
104
104
  }
105
105
  if (_lodash.default.isNil(err) === false) {
106
106
  if (err.code === resourceNotAvailable) {
107
- return unLockCallback((0, _commonsApi.getInternalError)('resource temporarily unavailable'));
107
+ return unLockCallback(_core.errorUtils.getInternalError('resource temporarily unavailable'));
108
108
  } else if (err.code === noSuchFile) {
109
- return unLockCallback((0, _commonsApi.getNotFound)());
109
+ return unLockCallback(_core.errorUtils.getNotFound());
110
110
  } else {
111
111
  return unLockCallback(err);
112
112
  }
@@ -1 +1 @@
1
- {"version":3,"file":"local-fs.js","names":["_fs","_interopRequireDefault","require","_path","_debug","_lodash","_mkdirp","_streams","_fileLocking","_commonsApi","obj","__esModule","default","fileExist","exports","noSuchFile","resourceNotAvailable","pkgFileName","debug","buildDebug","fSError","message","code","err","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","callback","_getStorage","removePackage","rmdir","createPackage","value","_createFile","_convertToString","savePackage","_writeFile","readPackage","_readStorageFile","then","res","data","JSON","parse","toString","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","open","Promise","resolve","reject","readFile","stringify","fileName","storagePath","dest","createTempFile","tempFilePath","writeFile","mkdirp","dirname","catch","lock","unlockFile"],"sources":["../src/local-fs.ts"],"sourcesContent":["/* eslint-disable no-undef */\n\nimport fs from 'fs';\nimport path from 'path';\n\nimport buildDebug from 'debug';\nimport _ from 'lodash';\nimport mkdirp from 'mkdirp';\nimport { UploadTarball, ReadTarball } from '@verdaccio/streams';\nimport { unlockFile, readFile } from '@verdaccio/file-locking';\nimport { Callback, Logger, Package, ILocalPackageManager, IUploadTarball } from '@verdaccio/legacy-types';\nimport { getCode, getInternalError, getNotFound, VerdaccioError } from '@verdaccio/commons-api';\n\nexport const fileExist = 'EEXISTS';\nexport const noSuchFile = 'ENOENT';\nexport const resourceNotAvailable = 'EAGAIN';\nexport const pkgFileName = 'package.json';\n\nconst debug = buildDebug('verdaccio:plugin:local-storage:fs');\n\nexport const fSError = function(message: string, code = 409): VerdaccioError {\n const err: VerdaccioError = 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(pkgFileName, (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 self._unlockJSON(pkgFileName, () => {\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(getInternalError('resource temporarily unavailable'));\n } else if (err.code === noSuchFile) {\n return unLockCallback(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 deletePackage(packageName: string, callback: (err: NodeJS.ErrnoException | null) => void): void {\n debug('delete a package %o', packageName);\n\n return fs.unlink(this._getStorage(packageName), callback);\n }\n\n public removePackage(callback: (err: NodeJS.ErrnoException | null) => void): void {\n debug('remove a package %o', this.path);\n\n fs.rmdir(this._getStorage('.'), callback);\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(pkgFileName), 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(pkgFileName), 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(pkgFileName)).then(\n 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) {\n debug('parse storage file %o has failed with error %o', name, err);\n cb(err);\n }\n },\n err => {\n debug('read storage file %o has failed with error %o', name, err);\n\n return cb(err);\n }\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(this.path, `${name}.tmp-${String(Math.random()).replace(/^0\\./, '')}`);\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 _readStorageFile(name: string): Promise<any> {\n return new Promise((resolve, reject): void => {\n debug('reading the file: %o', name);\n\n fs.readFile(name, (err, data) => {\n if (err) {\n debug('error reading the file: %o with error %o', name, err);\n reject(err);\n } else {\n debug('read file %o succeed', name);\n\n resolve(data);\n }\n });\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 mkdirp(path.dirname(dest))\n .then(() => {\n createTempFile(cb);\n })\n .catch(err => {\n return cb(err);\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\n readFile(\n fileName,\n {\n lock: true,\n parse: true,\n },\n (err, res) => {\n if (err) {\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"],"mappings":"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"}
1
+ {"version":3,"file":"local-fs.js","names":["_fs","_interopRequireDefault","require","_path","_debug","_lodash","_mkdirp","_streams","_fileLocking","_core","obj","__esModule","default","fileExist","exports","noSuchFile","resourceNotAvailable","pkgFileName","debug","buildDebug","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","callback","_getStorage","removePackage","rmdir","createPackage","value","_createFile","_convertToString","savePackage","_writeFile","readPackage","_readStorageFile","then","res","data","JSON","parse","toString","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","open","Promise","resolve","reject","readFile","stringify","fileName","storagePath","dest","createTempFile","tempFilePath","writeFile","mkdirp","dirname","catch","lock","unlockFile"],"sources":["../src/local-fs.ts"],"sourcesContent":["/* eslint-disable no-undef */\n\nimport fs from 'fs';\nimport path from 'path';\n\nimport buildDebug from 'debug';\nimport _ from 'lodash';\nimport mkdirp from 'mkdirp';\nimport { UploadTarball, ReadTarball } from '@verdaccio/streams';\nimport { unlockFile, readFile } from '@verdaccio/file-locking';\nimport { Callback, Logger, Package } from '@verdaccio/types';\nimport { errorUtils, VerdaccioError } from '@verdaccio/core';\n\nexport const fileExist = 'EEXISTS';\nexport const noSuchFile = 'ENOENT';\nexport const resourceNotAvailable = 'EAGAIN';\nexport const pkgFileName = 'package.json';\n\nconst debug = buildDebug('verdaccio:plugin:local-storage: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 default class LocalFS {\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(pkgFileName, (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 self._unlockJSON(pkgFileName, () => {\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 deletePackage(packageName: string, callback: (err: NodeJS.ErrnoException | null) => void): void {\n debug('delete a package %o', packageName);\n\n return fs.unlink(this._getStorage(packageName), callback);\n }\n\n public removePackage(callback: (err: NodeJS.ErrnoException | null) => void): void {\n debug('remove a package %o', this.path);\n\n fs.rmdir(this._getStorage('.'), callback);\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(pkgFileName), 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(pkgFileName), 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(pkgFileName)).then(\n 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) {\n debug('parse storage file %o has failed with error %o', name, err);\n cb(err);\n }\n },\n err => {\n debug('read storage file %o has failed with error %o', name, err);\n\n return cb(err);\n }\n );\n }\n\n public writeTarball(name: string) {\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(this.path, `${name}.tmp-${String(Math.random()).replace(/^0\\./, '')}`);\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 _readStorageFile(name: string): Promise<any> {\n return new Promise((resolve, reject): void => {\n debug('reading the file: %o', name);\n\n fs.readFile(name, (err, data) => {\n if (err) {\n debug('error reading the file: %o with error %o', name, err);\n reject(err);\n } else {\n debug('read file %o succeed', name);\n\n resolve(data);\n }\n });\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 mkdirp(path.dirname(dest))\n .then(() => {\n createTempFile(cb);\n })\n .catch(err => {\n return cb(err);\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\n readFile(\n fileName,\n {\n lock: true,\n parse: true,\n },\n (err, res) => {\n if (err) {\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"],"mappings":"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"}
@@ -1,2 +1,3 @@
1
- import { LocalStorage, Logger } from '@verdaccio/legacy-types';
1
+ import { Logger } from '@verdaccio/types';
2
+ import { LocalStorage } from './utils';
2
3
  export declare function loadPrivatePackages(path: string, logger: Logger): LocalStorage;
@@ -1 +1 @@
1
- {"version":3,"file":"pkg-utils.js","names":["_fs","_interopRequireDefault","require","_lodash","obj","__esModule","default","loadPrivatePackages","path","logger","list","emptyDatabase","secret","data","fs","readFileSync","_","isNil","db","JSON","parse","err","error","mesage","Error","isEmpty"],"sources":["../src/pkg-utils.ts"],"sourcesContent":["import fs from 'fs';\n\nimport _ from 'lodash';\nimport { LocalStorage, StorageList, Logger } from '@verdaccio/legacy-types';\n\nexport function loadPrivatePackages(path: string, logger: Logger): LocalStorage {\n const list: StorageList = [];\n const emptyDatabase = { list, secret: '' };\n const data = fs.readFileSync(path, 'utf8');\n\n if (_.isNil(data)) {\n // readFileSync 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: err.mesage,\n path,\n }, // eslint-disable-next-line max-len\n `Package database file corrupted (invalid JSON), please check the error @{err}.\\nFile 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"],"mappings":";;;;;;AAAA,IAAAA,GAAA,GAAAC,sBAAA,CAAAC,OAAA;AAEA,IAAAC,OAAA,GAAAF,sBAAA,CAAAC,OAAA;AAAuB,SAAAD,uBAAAG,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAGhB,SAASG,mBAAmBA,CAACC,IAAY,EAAEC,MAAc,EAAgB;EAC9E,MAAMC,IAAiB,GAAG,EAAE;EAC5B,MAAMC,aAAa,GAAG;IAAED,IAAI;IAAEE,MAAM,EAAE;EAAG,CAAC;EAC1C,MAAMC,IAAI,GAAGC,WAAE,CAACC,YAAY,CAACP,IAAI,EAAE,MAAM,CAAC;EAE1C,IAAIQ,eAAC,CAACC,KAAK,CAACJ,IAAI,CAAC,EAAE;IACjB;IACA,OAAOF,aAAa;EACtB;EAEA,IAAIO,EAAE;EACN,IAAI;IACFA,EAAE,GAAGC,IAAI,CAACC,KAAK,CAACP,IAAI,CAAC;EACvB,CAAC,CAAC,OAAOQ,GAAQ,EAAE;IACjBZ,MAAM,CAACa,KAAK,CACV;MACED,GAAG,EAAEA,GAAG,CAACE,MAAM;MACff;IACF,CAAC;IAAE;IACF,oGAAmG,CACrG;IACD,MAAMgB,KAAK,CAAC,gDAAgD,CAAC;EAC/D;EAEA,IAAIR,eAAC,CAACS,OAAO,CAACP,EAAE,CAAC,EAAE;IACjB,OAAOP,aAAa;EACtB;EAEA,OAAOO,EAAE;AACX"}
1
+ {"version":3,"file":"pkg-utils.js","names":["_fs","_interopRequireDefault","require","_lodash","obj","__esModule","default","loadPrivatePackages","path","logger","list","emptyDatabase","secret","data","fs","readFileSync","_","isNil","db","JSON","parse","err","error","mesage","Error","isEmpty"],"sources":["../src/pkg-utils.ts"],"sourcesContent":["import fs from 'fs';\n\nimport _ from 'lodash';\nimport { StorageList, Logger } from '@verdaccio/types';\nimport {LocalStorage} from './utils';\n\nexport function loadPrivatePackages(path: string, logger: Logger): LocalStorage {\n const list: StorageList = [];\n const emptyDatabase = { list, secret: '' };\n const data = fs.readFileSync(path, 'utf8');\n\n if (_.isNil(data)) {\n // readFileSync 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: err.mesage,\n path,\n }, // eslint-disable-next-line max-len\n `Package database file corrupted (invalid JSON), please check the error @{err}.\\nFile 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"],"mappings":";;;;;;AAAA,IAAAA,GAAA,GAAAC,sBAAA,CAAAC,OAAA;AAEA,IAAAC,OAAA,GAAAF,sBAAA,CAAAC,OAAA;AAAuB,SAAAD,uBAAAG,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAIhB,SAASG,mBAAmBA,CAACC,IAAY,EAAEC,MAAc,EAAgB;EAC9E,MAAMC,IAAiB,GAAG,EAAE;EAC5B,MAAMC,aAAa,GAAG;IAAED,IAAI;IAAEE,MAAM,EAAE;EAAG,CAAC;EAC1C,MAAMC,IAAI,GAAGC,WAAE,CAACC,YAAY,CAACP,IAAI,EAAE,MAAM,CAAC;EAE1C,IAAIQ,eAAC,CAACC,KAAK,CAACJ,IAAI,CAAC,EAAE;IACjB;IACA,OAAOF,aAAa;EACtB;EAEA,IAAIO,EAAE;EACN,IAAI;IACFA,EAAE,GAAGC,IAAI,CAACC,KAAK,CAACP,IAAI,CAAC;EACvB,CAAC,CAAC,OAAOQ,GAAQ,EAAE;IACjBZ,MAAM,CAACa,KAAK,CACV;MACED,GAAG,EAAEA,GAAG,CAACE,MAAM;MACff;IACF,CAAC;IAAE;IACF,oGACH,CAAC;IACD,MAAMgB,KAAK,CAAC,gDAAgD,CAAC;EAC/D;EAEA,IAAIR,eAAC,CAACS,OAAO,CAACP,EAAE,CAAC,EAAE;IACjB,OAAOP,aAAa;EACtB;EAEA,OAAOO,EAAE;AACX"}
package/lib/token.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import low from 'lowdb';
2
- import { ITokenActions, Config, Token, TokenFilter } from '@verdaccio/legacy-types';
2
+ import { ITokenActions, Config, 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/lib/token.js CHANGED
@@ -19,7 +19,11 @@ class TokenActions {
19
19
  this.tokenDb = null;
20
20
  }
21
21
  _dbGenPath(dbName, config) {
22
- return _path.default.join(_path.default.resolve(_path.default.dirname(config.self_path || ''), config.storage, dbName));
22
+ var _config$configPath;
23
+ // TODO: self_path is a legacy property and is deprecated
24
+ // TODO: display deprecation warning for self_path
25
+ const selfPath = (_config$configPath = config.configPath) !== null && _config$configPath !== void 0 ? _config$configPath : config.self_path;
26
+ return _path.default.join(_path.default.resolve(_path.default.dirname(selfPath || ''), config.storage, dbName));
23
27
  }
24
28
  async getTokenDb() {
25
29
  if (!this.tokenDb) {
package/lib/token.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"token.js","names":["_path","_interopRequireDefault","require","_lodash","_lowdb","_FileAsync","_Memory","_debug","obj","__esModule","default","debug","buildDebug","TOKEN_DB_NAME","TokenActions","constructor","config","tokenDb","_dbGenPath","dbName","Path","join","resolve","dirname","self_path","storage","getTokenDb","adapter","process","env","NODE_ENV","FileMemory","pathDb","FileAsync","low","saveToken","token","key","db","userData","get","user","value","_","isNil","set","write","push","getState","deleteToken","tokenKey","userTokens","Error","length","remainingTokens","filter","readTokens","tokens","exports"],"sources":["../src/token.ts"],"sourcesContent":["import Path from 'path';\n\nimport _ from 'lodash';\nimport low from 'lowdb';\nimport FileAsync from 'lowdb/adapters/FileAsync';\nimport FileMemory from 'lowdb/adapters/Memory';\nimport buildDebug from 'debug';\nimport { ITokenActions, Config, Token, TokenFilter } from '@verdaccio/legacy-types';\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 public _dbGenPath(dbName: string, config: Config): string {\n return Path.join(\n Path.resolve(Path.dirname(config.self_path || ''), config.storage as string, dbName)\n );\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 = this._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\n .get(token.user)\n // @ts-ignore\n .push(token)\n .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"],"mappings":"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"}
1
+ {"version":3,"file":"token.js","names":["_path","_interopRequireDefault","require","_lodash","_lowdb","_FileAsync","_Memory","_debug","obj","__esModule","default","debug","buildDebug","TOKEN_DB_NAME","TokenActions","constructor","config","tokenDb","_dbGenPath","dbName","_config$configPath","selfPath","configPath","self_path","Path","join","resolve","dirname","storage","getTokenDb","adapter","process","env","NODE_ENV","FileMemory","pathDb","FileAsync","low","saveToken","token","key","db","userData","get","user","value","_","isNil","set","write","push","getState","deleteToken","tokenKey","userTokens","Error","length","remainingTokens","filter","readTokens","tokens","exports"],"sources":["../src/token.ts"],"sourcesContent":["import Path from 'path';\n\nimport _ from 'lodash';\nimport low from 'lowdb';\nimport FileAsync from 'lowdb/adapters/FileAsync';\nimport FileMemory from 'lowdb/adapters/Memory';\nimport buildDebug from 'debug';\nimport { ITokenActions, Config, Token, TokenFilter } from '@verdaccio/types';\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 public _dbGenPath(dbName: string, config: Config): string {\n // TODO: self_path is a legacy property and is deprecated\n // TODO: display deprecation warning for self_path\n const selfPath = config.configPath ?? config.self_path;\n return Path.join(\n Path.resolve(Path.dirname(selfPath || ''), config.storage as string, dbName)\n );\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 = this._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\n .get(token.user)\n // @ts-ignore\n .push(token)\n .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"],"mappings":"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"}
package/lib/utils.d.ts CHANGED
@@ -1,5 +1,9 @@
1
1
  /// <reference types="node" />
2
2
  import fs from 'fs';
3
+ export declare type LocalStorage = {
4
+ list: any;
5
+ secret: string;
6
+ };
3
7
  export declare function getFileStats(packagePath: string): Promise<fs.Stats>;
4
8
  export declare function readDirectory(packagePath: string): Promise<string[]>;
5
9
  export declare function findPackages(storagePath: string, validationHandler: Function): Promise<{
package/lib/utils.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","names":["_fs","_interopRequireDefault","require","_path","_lodash","obj","__esModule","default","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"],"sources":["../src/utils.ts"],"sourcesContent":["import fs from 'fs';\nimport path from 'path';\n\nimport _ from 'lodash';\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) {\n reject(error);\n }\n\n resolve(listPackages);\n });\n}\n/* eslint-enable no-async-promise-executor */\n"],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","names":["_fs","_interopRequireDefault","require","_path","_lodash","obj","__esModule","default","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"],"sources":["../src/utils.ts"],"sourcesContent":["import fs from 'fs';\nimport path from 'path';\n\nimport _ from 'lodash';\n\nexport type LocalStorage = {\n list: any;\n secret: string;\n};\n\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) {\n reject(error);\n }\n\n resolve(listPackages);\n });\n}\n/* eslint-enable no-async-promise-executor */\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@verdaccio/local-storage",
3
- "version": "10.3.3",
3
+ "version": "10.3.4",
4
4
  "description": "Local storage implementation",
5
5
  "keywords": [
6
6
  "plugin",
@@ -31,19 +31,21 @@
31
31
  "node": ">=8"
32
32
  },
33
33
  "dependencies": {
34
- "@verdaccio/commons-api": "10.2.0",
34
+ "@verdaccio/core": "7.0.0-next.1",
35
35
  "@verdaccio/file-locking": "10.3.1",
36
36
  "@verdaccio/streams": "10.2.1",
37
- "async": "3.2.4",
38
37
  "debug": "4.3.4",
38
+ "globby": "11.1.0",
39
39
  "lodash": "4.17.21",
40
40
  "lowdb": "1.0.0",
41
41
  "mkdirp": "1.0.4"
42
42
  },
43
43
  "devDependencies": {
44
+ "@types/express": "^4.17.17",
44
45
  "@types/minimatch": "^3.0.3",
45
- "@types/node": "^14.0.0",
46
- "@verdaccio/legacy-types": "1.0.1",
46
+ "@types/node": "^20.5.8",
47
+ "@verdaccio/config": "7.0.0-next.1",
48
+ "@verdaccio/types": "12.0.0-next.0",
47
49
  "minimatch": "^4.0.0",
48
50
  "rmdir-sync": "^1.0.1"
49
51
  },