@verdaccio/local-storage 10.4.0 → 10.5.1
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/README.md +4 -6
- package/lib/_virtual/_rolldown/runtime.js +23 -0
- package/lib/dir-utils.js +77 -104
- package/lib/dir-utils.js.map +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.js +10 -14
- package/lib/index.js.map +1 -1
- package/lib/local-database.d.ts +9 -9
- package/lib/local-database.js +223 -258
- package/lib/local-database.js.map +1 -1
- package/lib/local-fs.d.ts +2 -3
- package/lib/local-fs.js +268 -314
- package/lib/local-fs.js.map +1 -1
- package/lib/pkg-utils.js +27 -35
- package/lib/pkg-utils.js.map +1 -1
- package/lib/token.d.ts +2 -2
- package/lib/token.js +75 -93
- package/lib/token.js.map +1 -1
- package/lib/utils.d.ts +2 -3
- package/package.json +18 -18
- package/lib/utils.js +0 -79
- package/lib/utils.js.map +0 -1
package/lib/local-database.js
CHANGED
|
@@ -1,260 +1,225 @@
|
|
|
1
|
-
|
|
1
|
+
const require_runtime = require("./_virtual/_rolldown/runtime.js");
|
|
2
|
+
const require_dir_utils = require("./dir-utils.js");
|
|
3
|
+
const require_local_fs = require("./local-fs.js");
|
|
4
|
+
const require_pkg_utils = require("./pkg-utils.js");
|
|
5
|
+
const require_token = require("./token.js");
|
|
6
|
+
let debug = require("debug");
|
|
7
|
+
debug = require_runtime.__toESM(debug);
|
|
8
|
+
let fs = require("fs");
|
|
9
|
+
fs = require_runtime.__toESM(fs);
|
|
10
|
+
let lodash = require("lodash");
|
|
11
|
+
lodash = require_runtime.__toESM(lodash);
|
|
12
|
+
let mkdirp = require("mkdirp");
|
|
13
|
+
mkdirp = require_runtime.__toESM(mkdirp);
|
|
14
|
+
let path = require("path");
|
|
15
|
+
path = require_runtime.__toESM(path);
|
|
16
|
+
let _verdaccio_core = require("@verdaccio/core");
|
|
17
|
+
//#region src/local-database.ts
|
|
18
|
+
var debug$1 = (0, debug.default)("verdaccio:plugin:local-storage:database");
|
|
19
|
+
var LocalDatabase = class extends require_token.default {
|
|
20
|
+
path;
|
|
21
|
+
logger;
|
|
22
|
+
data;
|
|
23
|
+
config;
|
|
24
|
+
locked;
|
|
25
|
+
constructor(config, logger) {
|
|
26
|
+
super(config);
|
|
27
|
+
this.config = config;
|
|
28
|
+
this.path = this._dbGenPath(_verdaccio_core.fileUtils.Files.DatabaseName, config);
|
|
29
|
+
this.logger = logger;
|
|
30
|
+
this.locked = false;
|
|
31
|
+
this.data = this._fetchLocalPackages();
|
|
32
|
+
this._sync();
|
|
33
|
+
}
|
|
34
|
+
getSecret() {
|
|
35
|
+
return Promise.resolve(this.data.secret);
|
|
36
|
+
}
|
|
37
|
+
setSecret(secret) {
|
|
38
|
+
return new Promise((resolve) => {
|
|
39
|
+
this.data.secret = secret;
|
|
40
|
+
resolve(this._sync());
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
add(name, cb) {
|
|
44
|
+
if (this.data.list.indexOf(name) === -1) {
|
|
45
|
+
this.data.list.push(name);
|
|
46
|
+
debug$1("the private package %o has been added", name);
|
|
47
|
+
cb(this._sync());
|
|
48
|
+
} else {
|
|
49
|
+
debug$1("the private package %o was not added", name);
|
|
50
|
+
cb(null);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Filter and only match those values that the query define.
|
|
55
|
+
**/
|
|
56
|
+
async filterByQuery(results, query) {
|
|
57
|
+
return results.filter((item) => {
|
|
58
|
+
return item?.name?.match(query.text) !== null;
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
async getScore(_pkg) {
|
|
62
|
+
return Promise.resolve({
|
|
63
|
+
final: 1,
|
|
64
|
+
detail: {
|
|
65
|
+
maintenance: 0,
|
|
66
|
+
popularity: 1,
|
|
67
|
+
quality: 1
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
_getCustomPackageLocalStorages() {
|
|
72
|
+
const storages = /* @__PURE__ */ new Map();
|
|
73
|
+
const { packages } = this.config;
|
|
74
|
+
if (packages) Object.keys(packages || {}).map((pkg) => {
|
|
75
|
+
const { storage } = packages[pkg];
|
|
76
|
+
if (typeof storage === "string") {
|
|
77
|
+
const storagePath = path.default.join(this.getStoragePath(), storage);
|
|
78
|
+
debug$1("add custom storage for %s on %s", storage, storagePath);
|
|
79
|
+
storages.set(storage, storagePath);
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
return storages;
|
|
83
|
+
}
|
|
84
|
+
async search(query) {
|
|
85
|
+
const results = [];
|
|
86
|
+
const storagePath = this.getStoragePath();
|
|
87
|
+
const storages = this._getCustomPackageLocalStorages();
|
|
88
|
+
const packagesOnStorage = await this.filterByQuery(await require_dir_utils.searchOnStorage(storagePath, storages), query);
|
|
89
|
+
debug$1("packages found %o", packagesOnStorage.length);
|
|
90
|
+
for (const storage of packagesOnStorage) {
|
|
91
|
+
const isPrivate = this.data.list.includes(storage.name);
|
|
92
|
+
const score = await this.getScore(storage);
|
|
93
|
+
results.push({
|
|
94
|
+
package: storage,
|
|
95
|
+
verdaccioPrivate: isPrivate,
|
|
96
|
+
verdaccioPkgCached: !isPrivate,
|
|
97
|
+
score
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
return results;
|
|
101
|
+
}
|
|
102
|
+
remove(name, cb) {
|
|
103
|
+
this.get((err, data) => {
|
|
104
|
+
if (err) {
|
|
105
|
+
cb(_verdaccio_core.errorUtils.getInternalError("error remove private package"));
|
|
106
|
+
this.logger.error({ err }, "remove the private package has failed @{err}");
|
|
107
|
+
debug$1("error on remove package %o", name);
|
|
108
|
+
}
|
|
109
|
+
const pkgName = data.indexOf(name);
|
|
110
|
+
if (pkgName !== -1) {
|
|
111
|
+
this.data.list.splice(pkgName, 1);
|
|
112
|
+
debug$1("remove package %o has been removed", name);
|
|
113
|
+
}
|
|
114
|
+
cb(this._sync());
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Return all database elements.
|
|
119
|
+
* @return {Array}
|
|
120
|
+
*/
|
|
121
|
+
get(cb) {
|
|
122
|
+
const list = this.data.list;
|
|
123
|
+
const totalItems = this.data.list.length;
|
|
124
|
+
cb(null, list);
|
|
125
|
+
debug$1("get full list of packages (%o) has been fetched", totalItems);
|
|
126
|
+
}
|
|
127
|
+
getPackageStorage(packageName) {
|
|
128
|
+
const packageAccess = this.config.getMatchedPackagesSpec(packageName);
|
|
129
|
+
const packagePath = this._getLocalStoragePath(packageAccess ? packageAccess.storage : void 0);
|
|
130
|
+
debug$1("storage path selected: ", packagePath);
|
|
131
|
+
if (lodash.default.isString(packagePath) === false) {
|
|
132
|
+
debug$1("the package %o has no storage defined ", packageName);
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
const packageStoragePath = path.default.join(path.default.resolve(path.default.dirname(this.config.self_path || ""), packagePath), packageName);
|
|
136
|
+
debug$1("storage absolute path: ", packageStoragePath);
|
|
137
|
+
return new require_local_fs.default(packageStoragePath, this.logger);
|
|
138
|
+
}
|
|
139
|
+
clean() {
|
|
140
|
+
this._sync();
|
|
141
|
+
}
|
|
142
|
+
getTime(time, mtime) {
|
|
143
|
+
return time ? time : mtime;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Syncronize {create} database whether does not exist.
|
|
147
|
+
* @return {Error|*}
|
|
148
|
+
*/
|
|
149
|
+
_sync() {
|
|
150
|
+
debug$1("sync database started");
|
|
151
|
+
if (this.locked) {
|
|
152
|
+
this.logger.error("Database is locked, please check error message printed during startup to prevent data loss.");
|
|
153
|
+
return /* @__PURE__ */ new Error("Verdaccio database is locked, please contact your administrator to checkout logs during verdaccio startup.");
|
|
154
|
+
}
|
|
155
|
+
try {
|
|
156
|
+
const folderName = path.default.dirname(this.path);
|
|
157
|
+
mkdirp.default.sync(folderName);
|
|
158
|
+
debug$1("sync folder %o created succeed", folderName);
|
|
159
|
+
} catch (err) {
|
|
160
|
+
debug$1("sync create folder has failed with error: %o", err);
|
|
161
|
+
return null;
|
|
162
|
+
}
|
|
163
|
+
try {
|
|
164
|
+
fs.default.writeFileSync(this.path, JSON.stringify(this.data));
|
|
165
|
+
debug$1("sync write succeed");
|
|
166
|
+
return null;
|
|
167
|
+
} catch (err) {
|
|
168
|
+
debug$1("sync failed %o", err);
|
|
169
|
+
return err;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
getBaseConfigPath() {
|
|
173
|
+
return path.default.dirname(this.config.configPath);
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* The field storage could be absolute or relative.
|
|
177
|
+
* If relative, it will be resolved against the config path.
|
|
178
|
+
* If absolute, it will be returned as is.
|
|
179
|
+
**/
|
|
180
|
+
getStoragePath() {
|
|
181
|
+
const { storage } = this.config;
|
|
182
|
+
if (typeof storage !== "string") throw new TypeError("storage field is mandatory");
|
|
183
|
+
const storagePath = path.default.isAbsolute(storage) ? storage : path.default.normalize(path.default.join(this.getBaseConfigPath(), storage));
|
|
184
|
+
debug$1("storage path %o", storagePath);
|
|
185
|
+
return storagePath;
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Verify the right local storage location.
|
|
189
|
+
* @param {String} path
|
|
190
|
+
* @return {String}
|
|
191
|
+
* @private
|
|
192
|
+
*/
|
|
193
|
+
_getLocalStoragePath(storage) {
|
|
194
|
+
const globalConfigStorage = this.config ? this.config.storage : void 0;
|
|
195
|
+
if (lodash.default.isNil(globalConfigStorage)) throw new Error("global storage is required for this plugin");
|
|
196
|
+
else {
|
|
197
|
+
if (lodash.default.isNil(storage) === false && lodash.default.isString(storage)) return path.default.join(globalConfigStorage, storage);
|
|
198
|
+
return globalConfigStorage;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Fetch local packages.
|
|
203
|
+
* @private
|
|
204
|
+
* @return {Object}
|
|
205
|
+
*/
|
|
206
|
+
_fetchLocalPackages() {
|
|
207
|
+
const emptyDatabase = {
|
|
208
|
+
list: [],
|
|
209
|
+
secret: ""
|
|
210
|
+
};
|
|
211
|
+
try {
|
|
212
|
+
return require_pkg_utils.loadPrivatePackages(this.path, this.logger);
|
|
213
|
+
} catch (err) {
|
|
214
|
+
if (err.code !== "ENOENT") {
|
|
215
|
+
this.locked = true;
|
|
216
|
+
this.logger.error("Failed to read package database file, please check the error printed below:\n", `File Path: ${this.path}\n\n ${err.message}`);
|
|
217
|
+
}
|
|
218
|
+
return emptyDatabase;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
};
|
|
222
|
+
//#endregion
|
|
223
|
+
exports.default = LocalDatabase;
|
|
2
224
|
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
var _fs = _interopRequireDefault(require("fs"));
|
|
8
|
-
var _path = _interopRequireDefault(require("path"));
|
|
9
|
-
var _debug = _interopRequireDefault(require("debug"));
|
|
10
|
-
var _lodash = _interopRequireDefault(require("lodash"));
|
|
11
|
-
var _mkdirp = _interopRequireDefault(require("mkdirp"));
|
|
12
|
-
var _dirUtils = require("./dir-utils");
|
|
13
|
-
var _core = require("@verdaccio/core");
|
|
14
|
-
var _localFs = _interopRequireWildcard(require("./local-fs"));
|
|
15
|
-
var _pkgUtils = require("./pkg-utils");
|
|
16
|
-
var _token = _interopRequireDefault(require("./token"));
|
|
17
|
-
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
18
|
-
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
19
|
-
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
|
20
|
-
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
|
|
21
|
-
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
22
|
-
const debug = (0, _debug.default)('verdaccio:plugin:local-storage:database');
|
|
23
|
-
class LocalDatabase extends _token.default {
|
|
24
|
-
constructor(config, logger) {
|
|
25
|
-
super(config);
|
|
26
|
-
_defineProperty(this, "path", void 0);
|
|
27
|
-
_defineProperty(this, "logger", void 0);
|
|
28
|
-
_defineProperty(this, "data", void 0);
|
|
29
|
-
_defineProperty(this, "config", void 0);
|
|
30
|
-
_defineProperty(this, "locked", void 0);
|
|
31
|
-
this.config = config;
|
|
32
|
-
this.path = this._dbGenPath(_core.fileUtils.Files.DatabaseName, config);
|
|
33
|
-
this.logger = logger;
|
|
34
|
-
this.locked = false;
|
|
35
|
-
this.data = this._fetchLocalPackages();
|
|
36
|
-
this._sync();
|
|
37
|
-
}
|
|
38
|
-
getSecret() {
|
|
39
|
-
return Promise.resolve(this.data.secret);
|
|
40
|
-
}
|
|
41
|
-
setSecret(secret) {
|
|
42
|
-
return new Promise(resolve => {
|
|
43
|
-
this.data.secret = secret;
|
|
44
|
-
resolve(this._sync());
|
|
45
|
-
});
|
|
46
|
-
}
|
|
47
|
-
add(name, cb) {
|
|
48
|
-
if (this.data.list.indexOf(name) === -1) {
|
|
49
|
-
this.data.list.push(name);
|
|
50
|
-
debug('the private package %o has been added', name);
|
|
51
|
-
cb(this._sync());
|
|
52
|
-
} else {
|
|
53
|
-
debug('the private package %o was not added', name);
|
|
54
|
-
cb(null);
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* Filter and only match those values that the query define.
|
|
60
|
-
**/
|
|
61
|
-
async filterByQuery(results, query) {
|
|
62
|
-
// FUTURE: apply new filters, keyword, version, ...
|
|
63
|
-
return results.filter(item => {
|
|
64
|
-
var _item$name;
|
|
65
|
-
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;
|
|
66
|
-
});
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
70
|
-
async getScore(_pkg) {
|
|
71
|
-
// TODO: there is no particular reason to predefined scores
|
|
72
|
-
// could be improved by using
|
|
73
|
-
return Promise.resolve({
|
|
74
|
-
final: 1,
|
|
75
|
-
detail: {
|
|
76
|
-
maintenance: 0,
|
|
77
|
-
popularity: 1,
|
|
78
|
-
quality: 1
|
|
79
|
-
}
|
|
80
|
-
});
|
|
81
|
-
}
|
|
82
|
-
_getCustomPackageLocalStorages() {
|
|
83
|
-
const storages = new Map();
|
|
84
|
-
const {
|
|
85
|
-
packages
|
|
86
|
-
} = this.config;
|
|
87
|
-
if (packages) {
|
|
88
|
-
Object.keys(packages || {}).map(pkg => {
|
|
89
|
-
const {
|
|
90
|
-
storage
|
|
91
|
-
} = packages[pkg];
|
|
92
|
-
if (typeof storage === 'string') {
|
|
93
|
-
const storagePath = _path.default.join(this.getStoragePath(), storage);
|
|
94
|
-
debug('add custom storage for %s on %s', storage, storagePath);
|
|
95
|
-
storages.set(storage, storagePath);
|
|
96
|
-
}
|
|
97
|
-
});
|
|
98
|
-
}
|
|
99
|
-
return storages;
|
|
100
|
-
}
|
|
101
|
-
async search(query) {
|
|
102
|
-
const results = [];
|
|
103
|
-
const storagePath = this.getStoragePath();
|
|
104
|
-
const storages = this._getCustomPackageLocalStorages();
|
|
105
|
-
const packagesOnStorage = await this.filterByQuery(await (0, _dirUtils.searchOnStorage)(storagePath, storages), query);
|
|
106
|
-
debug('packages found %o', packagesOnStorage.length);
|
|
107
|
-
for (let storage of packagesOnStorage) {
|
|
108
|
-
// check if package is listed on the cache private database
|
|
109
|
-
const isPrivate = this.data.list.includes(storage.name);
|
|
110
|
-
const score = await this.getScore(storage);
|
|
111
|
-
results.push({
|
|
112
|
-
package: storage,
|
|
113
|
-
verdaccioPrivate: isPrivate,
|
|
114
|
-
verdaccioPkgCached: !isPrivate,
|
|
115
|
-
score
|
|
116
|
-
});
|
|
117
|
-
}
|
|
118
|
-
return results;
|
|
119
|
-
}
|
|
120
|
-
remove(name, cb) {
|
|
121
|
-
this.get((err, data) => {
|
|
122
|
-
if (err) {
|
|
123
|
-
cb(_core.errorUtils.getInternalError('error remove private package'));
|
|
124
|
-
this.logger.error({
|
|
125
|
-
err
|
|
126
|
-
}, 'remove the private package has failed @{err}');
|
|
127
|
-
debug('error on remove package %o', name);
|
|
128
|
-
}
|
|
129
|
-
const pkgName = data.indexOf(name);
|
|
130
|
-
if (pkgName !== -1) {
|
|
131
|
-
this.data.list.splice(pkgName, 1);
|
|
132
|
-
debug('remove package %o has been removed', name);
|
|
133
|
-
}
|
|
134
|
-
cb(this._sync());
|
|
135
|
-
});
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
/**
|
|
139
|
-
* Return all database elements.
|
|
140
|
-
* @return {Array}
|
|
141
|
-
*/
|
|
142
|
-
get(cb) {
|
|
143
|
-
const list = this.data.list;
|
|
144
|
-
const totalItems = this.data.list.length;
|
|
145
|
-
cb(null, list);
|
|
146
|
-
debug('get full list of packages (%o) has been fetched', totalItems);
|
|
147
|
-
}
|
|
148
|
-
getPackageStorage(packageName) {
|
|
149
|
-
const packageAccess = this.config.getMatchedPackagesSpec(packageName);
|
|
150
|
-
const packagePath = this._getLocalStoragePath(packageAccess ? packageAccess.storage : undefined);
|
|
151
|
-
debug('storage path selected: ', packagePath);
|
|
152
|
-
if (_lodash.default.isString(packagePath) === false) {
|
|
153
|
-
debug('the package %o has no storage defined ', packageName);
|
|
154
|
-
return;
|
|
155
|
-
}
|
|
156
|
-
const packageStoragePath = _path.default.join(_path.default.resolve(_path.default.dirname(this.config.self_path || ''), packagePath), packageName);
|
|
157
|
-
debug('storage absolute path: ', packageStoragePath);
|
|
158
|
-
return new _localFs.default(packageStoragePath, this.logger);
|
|
159
|
-
}
|
|
160
|
-
clean() {
|
|
161
|
-
this._sync();
|
|
162
|
-
}
|
|
163
|
-
getTime(time, mtime) {
|
|
164
|
-
return time ? time : mtime;
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
/**
|
|
168
|
-
* Syncronize {create} database whether does not exist.
|
|
169
|
-
* @return {Error|*}
|
|
170
|
-
*/
|
|
171
|
-
_sync() {
|
|
172
|
-
debug('sync database started');
|
|
173
|
-
if (this.locked) {
|
|
174
|
-
this.logger.error('Database is locked, please check error message printed during startup to ' + 'prevent data loss.');
|
|
175
|
-
return new Error('Verdaccio database is locked, please contact your administrator to checkout ' + 'logs during verdaccio startup.');
|
|
176
|
-
}
|
|
177
|
-
// Uses sync to prevent ugly race condition
|
|
178
|
-
try {
|
|
179
|
-
// https://www.npmjs.com/package/mkdirp#mkdirpsyncdir-opts
|
|
180
|
-
const folderName = _path.default.dirname(this.path);
|
|
181
|
-
_mkdirp.default.sync(folderName);
|
|
182
|
-
debug('sync folder %o created succeed', folderName);
|
|
183
|
-
} catch (err) {
|
|
184
|
-
debug('sync create folder has failed with error: %o', err);
|
|
185
|
-
return null;
|
|
186
|
-
}
|
|
187
|
-
try {
|
|
188
|
-
_fs.default.writeFileSync(this.path, JSON.stringify(this.data));
|
|
189
|
-
debug('sync write succeed');
|
|
190
|
-
return null;
|
|
191
|
-
} catch (err) {
|
|
192
|
-
debug('sync failed %o', err);
|
|
193
|
-
return err;
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
getBaseConfigPath() {
|
|
197
|
-
return _path.default.dirname(this.config.configPath);
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
/**
|
|
201
|
-
* The field storage could be absolute or relative.
|
|
202
|
-
* If relative, it will be resolved against the config path.
|
|
203
|
-
* If absolute, it will be returned as is.
|
|
204
|
-
**/
|
|
205
|
-
getStoragePath() {
|
|
206
|
-
const {
|
|
207
|
-
storage
|
|
208
|
-
} = this.config;
|
|
209
|
-
if (typeof storage !== 'string') {
|
|
210
|
-
throw new TypeError('storage field is mandatory');
|
|
211
|
-
}
|
|
212
|
-
const storagePath = _path.default.isAbsolute(storage) ? storage : _path.default.normalize(_path.default.join(this.getBaseConfigPath(), storage));
|
|
213
|
-
debug('storage path %o', storagePath);
|
|
214
|
-
return storagePath;
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
/**
|
|
218
|
-
* Verify the right local storage location.
|
|
219
|
-
* @param {String} path
|
|
220
|
-
* @return {String}
|
|
221
|
-
* @private
|
|
222
|
-
*/
|
|
223
|
-
_getLocalStoragePath(storage) {
|
|
224
|
-
const globalConfigStorage = this.config ? this.config.storage : undefined;
|
|
225
|
-
if (_lodash.default.isNil(globalConfigStorage)) {
|
|
226
|
-
throw new Error('global storage is required for this plugin');
|
|
227
|
-
} else {
|
|
228
|
-
if (_lodash.default.isNil(storage) === false && _lodash.default.isString(storage)) {
|
|
229
|
-
return _path.default.join(globalConfigStorage, storage);
|
|
230
|
-
}
|
|
231
|
-
return globalConfigStorage;
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
/**
|
|
236
|
-
* Fetch local packages.
|
|
237
|
-
* @private
|
|
238
|
-
* @return {Object}
|
|
239
|
-
*/
|
|
240
|
-
_fetchLocalPackages() {
|
|
241
|
-
const list = [];
|
|
242
|
-
const emptyDatabase = {
|
|
243
|
-
list,
|
|
244
|
-
secret: ''
|
|
245
|
-
};
|
|
246
|
-
try {
|
|
247
|
-
return (0, _pkgUtils.loadPrivatePackages)(this.path, this.logger);
|
|
248
|
-
} catch (err) {
|
|
249
|
-
// readFileSync is platform specific, macOS, Linux and Windows thrown an error
|
|
250
|
-
// Only recreate if file not found to prevent data loss
|
|
251
|
-
if (err.code !== _localFs.noSuchFile) {
|
|
252
|
-
this.locked = true;
|
|
253
|
-
this.logger.error('Failed to read package database file, please check the error printed below:\n', `File Path: ${this.path}\n\n ${err.message}`);
|
|
254
|
-
}
|
|
255
|
-
return emptyDatabase;
|
|
256
|
-
}
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
var _default = exports.default = LocalDatabase;
|
|
260
225
|
//# sourceMappingURL=local-database.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-database.js","names":["_fs","_interopRequireDefault","require","_path","_debug","_lodash","_mkdirp","_dirUtils","_core","_localFs","_interopRequireWildcard","_pkgUtils","_token","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","_defineProperty","_toPropertyKey","value","enumerable","configurable","writable","_toPrimitive","Symbol","toPrimitive","TypeError","String","Number","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","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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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"local-database.js","names":[],"sources":["../src/local-database.ts"],"sourcesContent":["import buildDebug from 'debug';\nimport fs from 'fs';\nimport _ from 'lodash';\nimport mkdirp from 'mkdirp';\nimport Path from 'path';\n\nimport type { searchUtils } from '@verdaccio/core';\nimport { errorUtils, fileUtils } from '@verdaccio/core';\nimport type { Callback, Config, Logger, StorageList } from '@verdaccio/types';\n\nimport { searchOnStorage } from './dir-utils';\nimport LocalDriver, { noSuchFile } from './local-fs';\nimport { loadPrivatePackages } from './pkg-utils';\nimport TokenActions from './token';\nimport type { LocalStorage } from './utils';\n\nconst debug = buildDebug('verdaccio:plugin:local-storage:database');\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 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 (const 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({ err }, 'remove the private package has failed @{err}');\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 * 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,7 +1,6 @@
|
|
|
1
|
-
/// <reference types="node" />
|
|
2
|
-
import { UploadTarball, ReadTarball } from '@verdaccio/streams';
|
|
3
|
-
import { Callback, Logger, Package } from '@verdaccio/types';
|
|
4
1
|
import { VerdaccioError } from '@verdaccio/core';
|
|
2
|
+
import { ReadTarball, UploadTarball } from '@verdaccio/streams';
|
|
3
|
+
import { Callback, Logger, Package } from '@verdaccio/types';
|
|
5
4
|
export declare const fileExist = "EEXISTS";
|
|
6
5
|
export declare const noSuchFile = "ENOENT";
|
|
7
6
|
export declare const resourceNotAvailable = "EAGAIN";
|