@verdaccio/local-storage 10.5.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/lib/local-fs.js CHANGED
@@ -1,319 +1,273 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.resourceNotAvailable = exports.pkgFileName = exports.noSuchFile = exports.fileExist = exports.fSError = 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 _streams = require("@verdaccio/streams");
13
- var _fileLocking = require("@verdaccio/file-locking");
14
- var _core = require("@verdaccio/core");
15
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
16
- 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; }
17
- function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
18
- 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); } /* eslint-disable no-undef */
19
- const fileExist = exports.fileExist = 'EEXISTS';
20
- const noSuchFile = exports.noSuchFile = 'ENOENT';
21
- const resourceNotAvailable = exports.resourceNotAvailable = 'EAGAIN';
22
- const pkgFileName = exports.pkgFileName = 'package.json';
23
- const debug = (0, _debug.default)('verdaccio:plugin:local-storage:fs');
24
- const fSError = function (message, code = 409) {
25
- const err = _core.errorUtils.getCode(code, message);
26
- // FIXME: we should return http-status codes here instead, future improvement
27
- // @ts-ignore
28
- err.code = message;
29
- return err;
1
+ const require_runtime = require("./_virtual/_rolldown/runtime.js");
2
+ let debug = require("debug");
3
+ debug = require_runtime.__toESM(debug);
4
+ let fs = require("fs");
5
+ fs = require_runtime.__toESM(fs);
6
+ let lodash = require("lodash");
7
+ lodash = require_runtime.__toESM(lodash);
8
+ let mkdirp = require("mkdirp");
9
+ mkdirp = require_runtime.__toESM(mkdirp);
10
+ let path = require("path");
11
+ path = require_runtime.__toESM(path);
12
+ let _verdaccio_core = require("@verdaccio/core");
13
+ let _verdaccio_file_locking = require("@verdaccio/file-locking");
14
+ let _verdaccio_streams = require("@verdaccio/streams");
15
+ //#region src/local-fs.ts
16
+ var fileExist = "EEXISTS";
17
+ var noSuchFile = "ENOENT";
18
+ var pkgFileName = "package.json";
19
+ var debug$1 = (0, debug.default)("verdaccio:plugin:local-storage:fs");
20
+ var fSError = function(message, code = 409) {
21
+ const err = _verdaccio_core.errorUtils.getCode(code, message);
22
+ err.code = message;
23
+ return err;
30
24
  };
31
- exports.fSError = fSError;
32
- const tempFile = function (str) {
33
- return `${str}.tmp${String(Math.random()).substr(2)}`;
25
+ var tempFile = function(str) {
26
+ return `${str}.tmp${String(Math.random()).substr(2)}`;
34
27
  };
35
- const renameTmp = function (src, dst, _cb) {
36
- const cb = err => {
37
- if (err) {
38
- _fs.default.unlink(src, () => {});
39
- }
40
- _cb(err);
41
- };
42
- if (process.platform !== 'win32') {
43
- return _fs.default.rename(src, dst, cb);
44
- }
45
-
46
- // windows can't remove opened file,
47
- // but it seem to be able to rename it
48
- const tmp = tempFile(dst);
49
- _fs.default.rename(dst, tmp, function (err) {
50
- _fs.default.rename(src, dst, cb);
51
- if (!err) {
52
- _fs.default.unlink(tmp, () => {});
53
- }
54
- });
28
+ var renameTmp = function(src, dst, _cb) {
29
+ const cb = (err) => {
30
+ if (err) fs.default.unlink(src, () => {});
31
+ _cb(err);
32
+ };
33
+ if (process.platform !== "win32") return fs.default.rename(src, dst, cb);
34
+ const tmp = tempFile(dst);
35
+ fs.default.rename(dst, tmp, function(err) {
36
+ fs.default.rename(src, dst, cb);
37
+ if (!err) fs.default.unlink(tmp, () => {});
38
+ });
55
39
  };
56
- class LocalFS {
57
- constructor(path, logger) {
58
- _defineProperty(this, "path", void 0);
59
- _defineProperty(this, "logger", void 0);
60
- this.path = path;
61
- this.logger = logger;
62
- }
63
-
64
- /**
65
- * This function allows to update the package thread-safely
66
- Algorithm:
67
- 1. lock package.json for writing
68
- 2. read package.json
69
- 3. updateFn(pkg, cb), and wait for cb
70
- 4. write package.json.tmp
71
- 5. move package.json.tmp package.json
72
- 6. callback(err?)
73
- * @param {*} name
74
- * @param {*} updateHandler
75
- * @param {*} onWrite
76
- * @param {*} transformPackage
77
- * @param {*} onEnd
78
- */
79
- updatePackage(name, updateHandler, onWrite, transformPackage, onEnd) {
80
- this._lockAndReadJSON(pkgFileName, (err, json) => {
81
- let locked = false;
82
- const self = this;
83
- // callback that cleans up lock first
84
- const unLockCallback = function (lockError) {
85
- // eslint-disable-next-line prefer-rest-params
86
- const _args = arguments;
87
- if (locked) {
88
- self._unlockJSON(pkgFileName, () => {
89
- // ignore any error from the unlock
90
- if (lockError !== null) {
91
- debug('lock file: %o has failed with error %o', name, lockError);
92
- }
93
- onEnd.apply(lockError, _args);
94
- });
95
- } else {
96
- debug('file: %o has been updated', name);
97
- onEnd(..._args);
98
- }
99
- };
100
- if (!err) {
101
- locked = true;
102
- debug('file: %o has been locked', name);
103
- }
104
- if (_lodash.default.isNil(err) === false) {
105
- if (err.code === resourceNotAvailable) {
106
- return unLockCallback(_core.errorUtils.getInternalError('resource temporarily unavailable'));
107
- } else if (err.code === noSuchFile) {
108
- return unLockCallback(_core.errorUtils.getNotFound());
109
- } else {
110
- return unLockCallback(err);
111
- }
112
- }
113
- updateHandler(json, err => {
114
- if (err) {
115
- return unLockCallback(err);
116
- }
117
- onWrite(name, transformPackage(json), unLockCallback);
118
- });
119
- });
120
- }
121
- deletePackage(packageName, callback) {
122
- debug('delete a package %o', packageName);
123
- return _fs.default.unlink(this._getStorage(packageName), callback);
124
- }
125
- removePackage(callback) {
126
- debug('remove a package %o', this.path);
127
- _fs.default.rmdir(this._getStorage('.'), callback);
128
- }
129
- createPackage(name, value, cb) {
130
- debug('create a package %o', name);
131
- this._createFile(this._getStorage(pkgFileName), this._convertToString(value), cb);
132
- }
133
- savePackage(name, value, cb) {
134
- debug('save a package %o', name);
135
- this._writeFile(this._getStorage(pkgFileName), this._convertToString(value), cb);
136
- }
137
- readPackage(name, cb) {
138
- debug('read a package %o', name);
139
- this._readStorageFile(this._getStorage(pkgFileName)).then(res => {
140
- try {
141
- const data = JSON.parse(res.toString('utf8'));
142
- debug('read storage file %o has succeed', name);
143
- cb(null, data);
144
- } catch (err) {
145
- debug('parse storage file %o has failed with error %o', name, err);
146
- cb(err);
147
- }
148
- }, err => {
149
- debug('read storage file %o has failed with error %o', name, err);
150
- return cb(err);
151
- });
152
- }
153
- writeTarball(name) {
154
- const uploadStream = new _streams.UploadTarball({});
155
- debug('write a tarball for a package %o', name);
156
- let _ended = 0;
157
- uploadStream.on('end', function () {
158
- _ended = 1;
159
- });
160
- const pathName = this._getStorage(name);
161
- _fs.default.access(pathName, fileNotFound => {
162
- const exists = !fileNotFound;
163
- if (exists) {
164
- uploadStream.emit('error', fSError(fileExist));
165
- } else {
166
- const temporalName = _path.default.join(this.path, `${name}.tmp-${String(Math.random()).replace(/^0\./, '')}`);
167
- debug('write a temporal name %o', temporalName);
168
- const file = _fs.default.createWriteStream(temporalName);
169
- const removeTempFile = () => _fs.default.unlink(temporalName, () => {});
170
- let opened = false;
171
- uploadStream.pipe(file);
172
- uploadStream.done = function () {
173
- const onend = function () {
174
- file.on('close', function () {
175
- renameTmp(temporalName, pathName, function (err) {
176
- if (err) {
177
- uploadStream.emit('error', err);
178
- } else {
179
- uploadStream.emit('success');
180
- }
181
- });
182
- });
183
- file.end();
184
- };
185
- if (_ended) {
186
- onend();
187
- } else {
188
- uploadStream.on('end', onend);
189
- }
190
- };
191
- uploadStream.abort = function () {
192
- if (opened) {
193
- opened = false;
194
- file.on('close', function () {
195
- removeTempFile();
196
- });
197
- } else {
198
- // if the file does not recieve any byte never is opened and has to be removed anyway.
199
- removeTempFile();
200
- }
201
- file.end();
202
- };
203
- file.on('open', function () {
204
- opened = true;
205
- // re-emitting open because it's handled in storage.js
206
- uploadStream.emit('open');
207
- });
208
- file.on('error', function (err) {
209
- uploadStream.emit('error', err);
210
- });
211
- }
212
- });
213
- return uploadStream;
214
- }
215
- readTarball(name) {
216
- const pathName = this._getStorage(name);
217
- debug('read a a tarball %o on path %o', name, pathName);
218
- const readTarballStream = new _streams.ReadTarball({});
219
- const readStream = _fs.default.createReadStream(pathName);
220
- readStream.on('error', function (err) {
221
- debug('error on read a tarball %o with error %o', name, err);
222
- readTarballStream.emit('error', err);
223
- });
224
- readStream.on('open', function (fd) {
225
- _fs.default.fstat(fd, function (err, stats) {
226
- if (_lodash.default.isNil(err) === false) {
227
- debug('error on read a tarball %o with error %o', name, err);
228
- return readTarballStream.emit('error', err);
229
- }
230
- readTarballStream.emit('content-length', stats.size);
231
- readTarballStream.emit('open');
232
- debug('open on read a tarball %o', name);
233
- readStream.pipe(readTarballStream);
234
- });
235
- });
236
- readTarballStream.abort = function () {
237
- debug('abort on read a tarball %o', name);
238
- readStream.close();
239
- };
240
- return readTarballStream;
241
- }
242
- _createFile(name, contents, callback) {
243
- debug(' create a new file: %o', name);
244
- _fs.default.open(name, 'wx', err => {
245
- if (err) {
246
- // native EEXIST used here to check exception on fs.open
247
- if (err.code === 'EEXIST') {
248
- debug('file %o cannot be created, it already exists: %o', name);
249
- return callback(fSError(fileExist));
250
- }
251
- }
252
- this._writeFile(name, contents, callback);
253
- });
254
- }
255
- _readStorageFile(name) {
256
- return new Promise((resolve, reject) => {
257
- debug('reading the file: %o', name);
258
- _fs.default.readFile(name, (err, data) => {
259
- if (err) {
260
- debug('error reading the file: %o with error %o', name, err);
261
- reject(err);
262
- } else {
263
- debug('read file %o succeed', name);
264
- resolve(data);
265
- }
266
- });
267
- });
268
- }
269
- _convertToString(value) {
270
- return JSON.stringify(value, null, '\t');
271
- }
272
- _getStorage(fileName = '') {
273
- const storagePath = _path.default.join(this.path, fileName);
274
- return storagePath;
275
- }
276
- _writeFile(dest, data, cb) {
277
- const createTempFile = cb => {
278
- const tempFilePath = tempFile(dest);
279
- _fs.default.writeFile(tempFilePath, data, err => {
280
- if (err) {
281
- debug('error on write the file: %o', dest);
282
- return cb(err);
283
- }
284
- debug('creating a new file:: %o', dest);
285
- renameTmp(tempFilePath, dest, cb);
286
- });
287
- };
288
- createTempFile(err => {
289
- if (err && err.code === noSuchFile) {
290
- (0, _mkdirp.default)(_path.default.dirname(dest)).then(() => {
291
- createTempFile(cb);
292
- }).catch(err => {
293
- return cb(err);
294
- });
295
- } else {
296
- cb(err);
297
- }
298
- });
299
- }
300
- _lockAndReadJSON(name, cb) {
301
- const fileName = this._getStorage(name);
302
- (0, _fileLocking.readFile)(fileName, {
303
- lock: true,
304
- parse: true
305
- }, (err, res) => {
306
- if (err) {
307
- debug('error on lock and read json for file: %o', name);
308
- return cb(err);
309
- }
310
- debug('lock and read json for file: %o', name);
311
- return cb(null, res);
312
- });
313
- }
314
- _unlockJSON(name, cb) {
315
- (0, _fileLocking.unlockFile)(this._getStorage(name), cb);
316
- }
317
- }
40
+ var LocalFS = class {
41
+ path;
42
+ logger;
43
+ constructor(path$2, logger) {
44
+ this.path = path$2;
45
+ this.logger = logger;
46
+ }
47
+ /**
48
+ * This function allows to update the package thread-safely
49
+ Algorithm:
50
+ 1. lock package.json for writing
51
+ 2. read package.json
52
+ 3. updateFn(pkg, cb), and wait for cb
53
+ 4. write package.json.tmp
54
+ 5. move package.json.tmp package.json
55
+ 6. callback(err?)
56
+ * @param {*} name
57
+ * @param {*} updateHandler
58
+ * @param {*} onWrite
59
+ * @param {*} transformPackage
60
+ * @param {*} onEnd
61
+ */
62
+ updatePackage(name, updateHandler, onWrite, transformPackage, onEnd) {
63
+ this._lockAndReadJSON(pkgFileName, (err, json) => {
64
+ let locked = false;
65
+ const self = this;
66
+ const unLockCallback = function(lockError) {
67
+ const _args = arguments;
68
+ if (locked) self._unlockJSON(pkgFileName, () => {
69
+ if (lockError !== null) debug$1("lock file: %o has failed with error %o", name, lockError);
70
+ onEnd.apply(lockError, _args);
71
+ });
72
+ else {
73
+ debug$1("file: %o has been updated", name);
74
+ onEnd(..._args);
75
+ }
76
+ };
77
+ if (!err) {
78
+ locked = true;
79
+ debug$1("file: %o has been locked", name);
80
+ }
81
+ if (lodash.default.isNil(err) === false) if (err.code === "EAGAIN") return unLockCallback(_verdaccio_core.errorUtils.getInternalError("resource temporarily unavailable"));
82
+ else if (err.code === "ENOENT") return unLockCallback(_verdaccio_core.errorUtils.getNotFound());
83
+ else return unLockCallback(err);
84
+ updateHandler(json, (err) => {
85
+ if (err) return unLockCallback(err);
86
+ onWrite(name, transformPackage(json), unLockCallback);
87
+ });
88
+ });
89
+ }
90
+ deletePackage(packageName, callback) {
91
+ debug$1("delete a package %o", packageName);
92
+ return fs.default.unlink(this._getStorage(packageName), callback);
93
+ }
94
+ removePackage(callback) {
95
+ debug$1("remove a package %o", this.path);
96
+ fs.default.rmdir(this._getStorage("."), callback);
97
+ }
98
+ createPackage(name, value, cb) {
99
+ debug$1("create a package %o", name);
100
+ this._createFile(this._getStorage(pkgFileName), this._convertToString(value), cb);
101
+ }
102
+ savePackage(name, value, cb) {
103
+ debug$1("save a package %o", name);
104
+ this._writeFile(this._getStorage(pkgFileName), this._convertToString(value), cb);
105
+ }
106
+ readPackage(name, cb) {
107
+ debug$1("read a package %o", name);
108
+ this._readStorageFile(this._getStorage(pkgFileName)).then((res) => {
109
+ try {
110
+ const data = JSON.parse(res.toString("utf8"));
111
+ debug$1("read storage file %o has succeed", name);
112
+ cb(null, data);
113
+ } catch (err) {
114
+ debug$1("parse storage file %o has failed with error %o", name, err);
115
+ cb(err);
116
+ }
117
+ }, (err) => {
118
+ debug$1("read storage file %o has failed with error %o", name, err);
119
+ return cb(err);
120
+ });
121
+ }
122
+ writeTarball(name) {
123
+ const uploadStream = new _verdaccio_streams.UploadTarball({});
124
+ debug$1("write a tarball for a package %o", name);
125
+ let _ended = 0;
126
+ uploadStream.on("end", function() {
127
+ _ended = 1;
128
+ });
129
+ const pathName = this._getStorage(name);
130
+ fs.default.access(pathName, (fileNotFound) => {
131
+ if (!fileNotFound) uploadStream.emit("error", fSError(fileExist));
132
+ else {
133
+ const temporalName = path.default.join(this.path, `${name}.tmp-${String(Math.random()).replace(/^0\./, "")}`);
134
+ debug$1("write a temporal name %o", temporalName);
135
+ const file = fs.default.createWriteStream(temporalName);
136
+ const removeTempFile = () => fs.default.unlink(temporalName, () => {});
137
+ let opened = false;
138
+ uploadStream.pipe(file);
139
+ uploadStream.done = function() {
140
+ const onend = function() {
141
+ file.on("close", function() {
142
+ renameTmp(temporalName, pathName, function(err) {
143
+ if (err) uploadStream.emit("error", err);
144
+ else uploadStream.emit("success");
145
+ });
146
+ });
147
+ file.end();
148
+ };
149
+ if (_ended) onend();
150
+ else uploadStream.on("end", onend);
151
+ };
152
+ uploadStream.abort = function() {
153
+ if (opened) {
154
+ opened = false;
155
+ file.on("close", function() {
156
+ removeTempFile();
157
+ });
158
+ } else removeTempFile();
159
+ file.end();
160
+ };
161
+ file.on("open", function() {
162
+ opened = true;
163
+ uploadStream.emit("open");
164
+ });
165
+ file.on("error", function(err) {
166
+ uploadStream.emit("error", err);
167
+ });
168
+ }
169
+ });
170
+ return uploadStream;
171
+ }
172
+ readTarball(name) {
173
+ const pathName = this._getStorage(name);
174
+ debug$1("read a a tarball %o on path %o", name, pathName);
175
+ const readTarballStream = new _verdaccio_streams.ReadTarball({});
176
+ const readStream = fs.default.createReadStream(pathName);
177
+ readStream.on("error", function(err) {
178
+ debug$1("error on read a tarball %o with error %o", name, err);
179
+ readTarballStream.emit("error", err);
180
+ });
181
+ readStream.on("open", function(fd) {
182
+ fs.default.fstat(fd, function(err, stats) {
183
+ if (lodash.default.isNil(err) === false) {
184
+ debug$1("error on read a tarball %o with error %o", name, err);
185
+ return readTarballStream.emit("error", err);
186
+ }
187
+ readTarballStream.emit("content-length", stats.size);
188
+ readTarballStream.emit("open");
189
+ debug$1("open on read a tarball %o", name);
190
+ readStream.pipe(readTarballStream);
191
+ });
192
+ });
193
+ readTarballStream.abort = function() {
194
+ debug$1("abort on read a tarball %o", name);
195
+ readStream.close();
196
+ };
197
+ return readTarballStream;
198
+ }
199
+ _createFile(name, contents, callback) {
200
+ debug$1(" create a new file: %o", name);
201
+ fs.default.open(name, "wx", (err) => {
202
+ if (err) {
203
+ if (err.code === "EEXIST") {
204
+ debug$1("file %o cannot be created, it already exists: %o", name);
205
+ return callback(fSError(fileExist));
206
+ }
207
+ }
208
+ this._writeFile(name, contents, callback);
209
+ });
210
+ }
211
+ _readStorageFile(name) {
212
+ return new Promise((resolve, reject) => {
213
+ debug$1("reading the file: %o", name);
214
+ fs.default.readFile(name, (err, data) => {
215
+ if (err) {
216
+ debug$1("error reading the file: %o with error %o", name, err);
217
+ reject(err);
218
+ } else {
219
+ debug$1("read file %o succeed", name);
220
+ resolve(data);
221
+ }
222
+ });
223
+ });
224
+ }
225
+ _convertToString(value) {
226
+ return JSON.stringify(value, null, " ");
227
+ }
228
+ _getStorage(fileName = "") {
229
+ return path.default.join(this.path, fileName);
230
+ }
231
+ _writeFile(dest, data, cb) {
232
+ const createTempFile = (cb) => {
233
+ const tempFilePath = tempFile(dest);
234
+ fs.default.writeFile(tempFilePath, data, (err) => {
235
+ if (err) {
236
+ debug$1("error on write the file: %o", dest);
237
+ return cb(err);
238
+ }
239
+ debug$1("creating a new file:: %o", dest);
240
+ renameTmp(tempFilePath, dest, cb);
241
+ });
242
+ };
243
+ createTempFile((err) => {
244
+ if (err && err.code === "ENOENT") (0, mkdirp.default)(path.default.dirname(dest)).then(() => {
245
+ createTempFile(cb);
246
+ }).catch((err) => {
247
+ return cb(err);
248
+ });
249
+ else cb(err);
250
+ });
251
+ }
252
+ _lockAndReadJSON(name, cb) {
253
+ (0, _verdaccio_file_locking.readFile)(this._getStorage(name), {
254
+ lock: true,
255
+ parse: true
256
+ }, (err, res) => {
257
+ if (err) {
258
+ debug$1("error on lock and read json for file: %o", name);
259
+ return cb(err);
260
+ }
261
+ debug$1("lock and read json for file: %o", name);
262
+ return cb(null, res);
263
+ });
264
+ }
265
+ _unlockJSON(name, cb) {
266
+ (0, _verdaccio_file_locking.unlockFile)(this._getStorage(name), cb);
267
+ }
268
+ };
269
+ //#endregion
318
270
  exports.default = LocalFS;
271
+ exports.noSuchFile = noSuchFile;
272
+
319
273
  //# sourceMappingURL=local-fs.js.map