Socket
Socket
Sign inDemoInstall

@verdaccio/local-storage

Package Overview
Dependencies
Maintainers
4
Versions
154
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@verdaccio/local-storage - npm Package Compare versions

Comparing version 10.3.1 to 10.3.2

3

lib/index.js

@@ -13,9 +13,6 @@ "use strict";

exports.default = void 0;
var _localDatabase = _interopRequireDefault(require("./local-database"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var _default = _localDatabase.default;
exports.default = _default;
//# sourceMappingURL=index.js.map

@@ -7,49 +7,21 @@ "use strict";

exports.default = void 0;
var _fs = _interopRequireDefault(require("fs"));
var _path = _interopRequireDefault(require("path"));
var _debug = _interopRequireDefault(require("debug"));
var _lodash = _interopRequireDefault(require("lodash"));
var _async = _interopRequireDefault(require("async"));
var _mkdirp = _interopRequireDefault(require("mkdirp"));
var _commonsApi = require("@verdaccio/commons-api");
var _localFs = _interopRequireWildcard(require("./local-fs"));
var _pkgUtils = require("./pkg-utils");
var _token = _interopRequireDefault(require("./token"));
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); }
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; }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
const DEPRECATED_DB_NAME = '.sinopia-db.json';
const DB_NAME = '.verdaccio-db.json';
const debug = (0, _debug.default)('verdaccio:plugin:local-storage');
class LocalDatabase extends _token.default {
constructor(config, logger) {
super(config);
_defineProperty(this, "path", void 0);
_defineProperty(this, "logger", void 0);
_defineProperty(this, "data", void 0);
_defineProperty(this, "config", void 0);
_defineProperty(this, "locked", void 0);
this.config = config;

@@ -60,10 +32,7 @@ this.path = this._buildStoragePath(config);

this.data = this._fetchLocalPackages();
this._sync();
}
getSecret() {
return Promise.resolve(this.data.secret);
}
setSecret(secret) {

@@ -75,3 +44,2 @@ return new Promise(resolve => {

}
add(name, cb) {

@@ -87,23 +55,14 @@ if (this.data.list.indexOf(name) === -1) {

}
search(onPackage, onEnd, validateName) {
const storages = this._getCustomPackageLocalStorages();
debug(`search custom local packages: %o`, JSON.stringify(storages));
const base = _path.default.dirname(this.config.self_path);
const self = this;
const storageKeys = Object.keys(storages);
debug(`search base: %o keys: %o`, base, storageKeys);
_async.default.eachSeries(storageKeys, function (storage, cb) {
const position = storageKeys.indexOf(storage);
const base2 = _path.default.join(position !== 0 ? storageKeys[0] : '');
const storagePath = _path.default.resolve(base, base2, storage);
debug('search path: %o : %o', storagePath, storage);
_fs.default.readdir(storagePath, (err, files) => {

@@ -113,16 +72,11 @@ if (err) {

}
_async.default.eachSeries(files, function (file, cb) {
debug('local-storage: [search] search file path: %o', file);
if (storageKeys.includes(file)) {
return cb();
}
if (file.match(/^@/)) {
// scoped
const fileLocation = _path.default.resolve(base, storage, file);
debug('search scoped file location: %o', fileLocation);
_fs.default.readdir(fileLocation, function (err, files) {

@@ -132,7 +86,5 @@ if (err) {

}
_async.default.eachSeries(files, (file2, cb) => {
if (validateName(file2)) {
const packagePath = _path.default.resolve(base, storage, file, file2);
_fs.default.stat(packagePath, (err, stats) => {

@@ -142,3 +94,2 @@ if (_lodash.default.isNil(err) === false) {

}
const item = {

@@ -158,7 +109,4 @@ name: `${file}/${file2}`,

const base2 = _path.default.join(position !== 0 ? storageKeys[0] : '');
const packagePath = _path.default.resolve(base, base2, storage, file);
debug('search file location: %o', packagePath);
_fs.default.stat(packagePath, (err, stats) => {

@@ -168,3 +116,2 @@ if (_lodash.default.isNil(err) === false) {

}
onPackage({

@@ -181,6 +128,6 @@ name: file,

});
}, // @ts-ignore
},
// @ts-ignore
onEnd);
}
remove(name, cb) {

@@ -195,5 +142,3 @@ this.get((err, data) => {

}
const pkgName = data.indexOf(name);
if (pkgName !== -1) {

@@ -203,6 +148,6 @@ this.data.list.splice(pkgName, 1);

}
cb(this._sync());
});
}
/**

@@ -212,4 +157,2 @@ * Return all database elements.

*/
get(cb) {

@@ -221,10 +164,6 @@ const list = this.data.list;

}
getPackageStorage(packageName) {
const packageAccess = this.config.getMatchedPackagesSpec(packageName);
const packagePath = this._getLocalStoragePath(packageAccess ? packageAccess.storage : undefined);
debug('storage path selected: ', packagePath);
if (_lodash.default.isString(packagePath) === false) {

@@ -234,28 +173,22 @@ debug('the package %o has no storage defined ', packageName);

}
const packageStoragePath = _path.default.join(_path.default.resolve(_path.default.dirname(this.config.self_path || ''), packagePath), packageName);
debug('storage absolute path: ', packageStoragePath);
return new _localFs.default(packageStoragePath, this.logger);
}
clean() {
this._sync();
}
getTime(time, mtime) {
return time ? time : mtime;
}
_getCustomPackageLocalStorages() {
const storages = {}; // add custom storage if exist
const storages = {};
// add custom storage if exist
if (this.config.storage) {
storages[this.config.storage] = true;
}
const {
packages
} = this.config;
if (packages) {

@@ -265,3 +198,2 @@ const listPackagesConf = Object.keys(packages || {});

const storage = packages[pkg].storage;
if (storage) {

@@ -272,5 +204,5 @@ storages[storage] = false;

}
return storages;
}
/**

@@ -280,19 +212,13 @@ * Syncronize {create} database whether does not exist.

*/
_sync() {
debug('sync database started');
if (this.locked) {
this.logger.error('Database is locked, please check error message printed during startup to ' + 'prevent data loss.');
return new Error('Verdaccio database is locked, please contact your administrator to checkout ' + 'logs during verdaccio startup.');
} // Uses sync to prevent ugly race condition
}
// Uses sync to prevent ugly race condition
try {
// https://www.npmjs.com/package/mkdirp#mkdirpsyncdir-opts
const folderName = _path.default.dirname(this.path);
_mkdirp.default.sync(folderName);
debug('sync folder %o created succeed', folderName);

@@ -303,6 +229,4 @@ } catch (err) {

}
try {
_fs.default.writeFileSync(this.path, JSON.stringify(this.data));
debug('sync write succeed');

@@ -315,2 +239,3 @@ return null;

}
/**

@@ -322,7 +247,4 @@ * Verify the right local storage location.

*/
_getLocalStoragePath(storage) {
const globalConfigStorage = this.config ? this.config.storage : undefined;
if (_lodash.default.isNil(globalConfigStorage)) {

@@ -334,6 +256,6 @@ throw new Error('global storage is required for this plugin');

}
return globalConfigStorage;
}
}
/**

@@ -345,11 +267,7 @@ * Build the local database path.

*/
_buildStoragePath(config) {
const sinopiadbPath = this._dbGenPath(DEPRECATED_DB_NAME, config);
try {
_fs.default.accessSync(sinopiadbPath, _fs.default.constants.F_OK); // @ts-ignore
_fs.default.accessSync(sinopiadbPath, _fs.default.constants.F_OK);
// @ts-ignore
process.emitWarning('Database name deprecated!', {

@@ -364,6 +282,6 @@ code: 'VERCODE01',

}
throw err;
}
}
/**

@@ -374,4 +292,2 @@ * Fetch local packages.

*/
_fetchLocalPackages() {

@@ -383,3 +299,2 @@ const list = [];

};
try {

@@ -394,11 +309,8 @@ return (0, _pkgUtils.loadPrivatePackages)(this.path, this.logger);

}
return emptyDatabase;
}
}
}
var _default = LocalDatabase;
exports.default = _default;
//# sourceMappingURL=local-database.js.map

@@ -7,23 +7,13 @@ "use strict";

exports.resourceNotAvailable = exports.pkgFileName = exports.noSuchFile = exports.fileExist = exports.fSError = exports.default = void 0;
var _fs = _interopRequireDefault(require("fs"));
var _path = _interopRequireDefault(require("path"));
var _debug = _interopRequireDefault(require("debug"));
var _lodash = _interopRequireDefault(require("lodash"));
var _mkdirp = _interopRequireDefault(require("mkdirp"));
var _streams = require("@verdaccio/streams");
var _fileLocking = require("@verdaccio/file-locking");
var _commonsApi = require("@verdaccio/commons-api");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/* eslint-disable no-undef */
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
const fileExist = 'EEXISTS';

@@ -38,17 +28,13 @@ exports.fileExist = fileExist;

const debug = (0, _debug.default)('verdaccio:plugin:local-storage:fs');
const fSError = function (message, code = 409) {
const err = (0, _commonsApi.getCode)(code, message); // FIXME: we should return http-status codes here instead, future improvement
const err = (0, _commonsApi.getCode)(code, message);
// FIXME: we should return http-status codes here instead, future improvement
// @ts-ignore
err.code = message;
return err;
};
exports.fSError = fSError;
const tempFile = function (str) {
return `${str}.tmp${String(Math.random()).substr(2)}`;
};
const renameTmp = function (src, dst, _cb) {

@@ -59,17 +45,13 @@ const cb = err => {

}
_cb(err);
};
if (process.platform !== 'win32') {
return _fs.default.rename(src, dst, cb);
} // windows can't remove opened file,
}
// windows can't remove opened file,
// but it seem to be able to rename it
const tmp = tempFile(dst);
_fs.default.rename(dst, tmp, function (err) {
_fs.default.rename(src, dst, cb);
if (!err) {

@@ -80,12 +62,8 @@ _fs.default.unlink(tmp, () => {});

};
class LocalFS {
constructor(path, logger) {
_defineProperty(this, "path", void 0);
_defineProperty(this, "logger", void 0);
this.path = path;
this.logger = logger;
}
/**

@@ -106,13 +84,10 @@ * This function allows to update the package thread-safely

*/
updatePackage(name, updateHandler, onWrite, transformPackage, onEnd) {
this._lockAndReadJSON(pkgFileName, (err, json) => {
let locked = false;
const self = this; // callback that cleans up lock first
const self = this;
// callback that cleans up lock first
const unLockCallback = function (lockError) {
// eslint-disable-next-line prefer-rest-params
const _args = arguments;
if (locked) {

@@ -124,3 +99,2 @@ self._unlockJSON(pkgFileName, () => {

}
onEnd.apply(lockError, _args);

@@ -133,3 +107,2 @@ });

};
if (!err) {

@@ -139,3 +112,2 @@ locked = true;

}
if (_lodash.default.isNil(err) === false) {

@@ -150,3 +122,2 @@ if (err.code === resourceNotAvailable) {

}
updateHandler(json, err => {

@@ -156,3 +127,2 @@ if (err) {

}
onWrite(name, transformPackage(json), unLockCallback);

@@ -162,3 +132,2 @@ });

}
deletePackage(packageName, callback) {

@@ -168,24 +137,16 @@ debug('delete a package %o', packageName);

}
removePackage(callback) {
debug('remove a package %o', this.path);
_fs.default.rmdir(this._getStorage('.'), callback);
}
createPackage(name, value, cb) {
debug('create a package %o', name);
this._createFile(this._getStorage(pkgFileName), this._convertToString(value), cb);
}
savePackage(name, value, cb) {
debug('save a package %o', name);
this._writeFile(this._getStorage(pkgFileName), this._convertToString(value), cb);
}
readPackage(name, cb) {
debug('read a package %o', name);
this._readStorageFile(this._getStorage(pkgFileName)).then(res => {

@@ -205,3 +166,2 @@ try {

}
writeTarball(name) {

@@ -214,8 +174,5 @@ const uploadStream = new _streams.UploadTarball({});

});
const pathName = this._getStorage(name);
_fs.default.access(pathName, fileNotFound => {
const exists = !fileNotFound;
if (exists) {

@@ -225,12 +182,7 @@ uploadStream.emit('error', fSError(fileExist));

const temporalName = _path.default.join(this.path, `${name}.tmp-${String(Math.random()).replace(/^0\./, '')}`);
debug('write a temporal name %o', temporalName);
const file = _fs.default.createWriteStream(temporalName);
const removeTempFile = () => _fs.default.unlink(temporalName, () => {});
let opened = false;
uploadStream.pipe(file);
uploadStream.done = function () {

@@ -249,3 +201,2 @@ const onend = function () {

};
if (_ended) {

@@ -257,3 +208,2 @@ onend();

};
uploadStream.abort = function () {

@@ -269,9 +219,7 @@ if (opened) {

}
file.end();
};
file.on('open', function () {
opened = true; // re-emitting open because it's handled in storage.js
opened = true;
// re-emitting open because it's handled in storage.js
uploadStream.emit('open');

@@ -284,14 +232,9 @@ });

});
return uploadStream;
}
readTarball(name) {
const pathName = this._getStorage(name);
debug('read a a tarball %o on path %o', name, pathName);
const readTarballStream = new _streams.ReadTarball({});
const readStream = _fs.default.createReadStream(pathName);
readStream.on('error', function (err) {

@@ -307,3 +250,2 @@ debug('error on read a tarball %o with error %o', name, err);

}
readTarballStream.emit('content-length', stats.size);

@@ -315,3 +257,2 @@ readTarballStream.emit('open');

});
readTarballStream.abort = function () {

@@ -321,9 +262,6 @@ debug('abort on read a tarball %o', name);

};
return readTarballStream;
}
_createFile(name, contents, callback) {
debug(' create a new file: %o', name);
_fs.default.open(name, 'wx', err => {

@@ -337,11 +275,8 @@ if (err) {

}
this._writeFile(name, contents, callback);
});
}
_readStorageFile(name) {
return new Promise((resolve, reject) => {
debug('reading the file: %o', name);
_fs.default.readFile(name, (err, data) => {

@@ -358,17 +293,12 @@ if (err) {

}
_convertToString(value) {
return JSON.stringify(value, null, '\t');
}
_getStorage(fileName = '') {
const storagePath = _path.default.join(this.path, fileName);
return storagePath;
}
_writeFile(dest, data, cb) {
const createTempFile = cb => {
const tempFilePath = tempFile(dest);
_fs.default.writeFile(tempFilePath, data, err => {

@@ -379,3 +309,2 @@ if (err) {

}
debug('creating a new file:: %o', dest);

@@ -385,3 +314,2 @@ renameTmp(tempFilePath, dest, cb);

};
createTempFile(err => {

@@ -399,6 +327,4 @@ if (err && err.code === noSuchFile) {

}
_lockAndReadJSON(name, cb) {
const fileName = this._getStorage(name);
(0, _fileLocking.readFile)(fileName, {

@@ -412,3 +338,2 @@ lock: true,

}
debug('lock and read json for file: %o', name);

@@ -418,10 +343,7 @@ return cb(null, res);

}
_unlockJSON(name, cb) {
(0, _fileLocking.unlockFile)(this._getStorage(name), cb);
}
}
exports.default = LocalFS;
//# sourceMappingURL=local-fs.js.map

@@ -7,9 +7,5 @@ "use strict";

exports.loadPrivatePackages = loadPrivatePackages;
var _fs = _interopRequireDefault(require("fs"));
var _lodash = _interopRequireDefault(require("lodash"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function loadPrivatePackages(path, logger) {

@@ -21,5 +17,3 @@ const list = [];

};
const data = _fs.default.readFileSync(path, 'utf8');
if (_lodash.default.isNil(data)) {

@@ -29,5 +23,3 @@ // readFileSync is platform specific, FreeBSD might return null

}
let db;
try {

@@ -39,13 +31,12 @@ db = JSON.parse(data);

path
}, // eslint-disable-next-line max-len
},
// eslint-disable-next-line max-len
`Package database file corrupted (invalid JSON), please check the error @{err}.\nFile Path: @{path}`);
throw Error('Package database file corrupted (invalid JSON)');
}
if (_lodash.default.isEmpty(db)) {
return emptyDatabase;
}
return db;
}
//# sourceMappingURL=pkg-utils.js.map

@@ -7,36 +7,19 @@ "use strict";

exports.default = void 0;
var _path = _interopRequireDefault(require("path"));
var _lodash = _interopRequireDefault(require("lodash"));
var _lowdb = _interopRequireDefault(require("lowdb"));
var _FileAsync = _interopRequireDefault(require("lowdb/adapters/FileAsync"));
var _Memory = _interopRequireDefault(require("lowdb/adapters/Memory"));
var _debug = _interopRequireDefault(require("debug"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
const debug = (0, _debug.default)('verdaccio:plugin:local-storage:token');
const TOKEN_DB_NAME = '.token-db.json';
class TokenActions {
constructor(config) {
_defineProperty(this, "config", void 0);
_defineProperty(this, "tokenDb", void 0);
this.config = config;
this.tokenDb = null;
}
_dbGenPath(dbName, config) {
return _path.default.join(_path.default.resolve(_path.default.dirname(config.self_path || ''), config.storage, dbName));
}
async getTokenDb() {

@@ -46,3 +29,2 @@ if (!this.tokenDb) {

let adapter;
if (process.env.NODE_ENV === 'test') {

@@ -53,15 +35,10 @@ debug('token memory adapter');

debug('token async adapter');
const pathDb = this._dbGenPath(TOKEN_DB_NAME, this.config);
adapter = new _FileAsync.default(pathDb);
}
debug('token bd generated');
this.tokenDb = await (0, _lowdb.default)(adapter);
}
return this.tokenDb;
}
async saveToken(token) {

@@ -72,3 +49,2 @@ debug('token key %o', token.key);

debug('user data %o', userData);
if (_lodash.default.isNil(userData)) {

@@ -80,18 +56,15 @@ await db.set(token.user, [token]).write();

// @ts-ignore
await db.get(token.user) // @ts-ignore
await db.get(token.user)
// @ts-ignore
.push(token).write();
}
debug('data %o', await db.getState());
debug('token saved %o', token.user);
}
async deleteToken(user, tokenKey) {
const db = await this.getTokenDb();
const userTokens = await db.get(user).value();
if (_lodash.default.isNil(userTokens)) {
throw new Error('user not found');
}
debug('tokens %o - %o', userTokens, userTokens.length);

@@ -107,3 +80,2 @@ const remainingTokens = userTokens.filter(({

}
async readTokens(filter) {

@@ -118,6 +90,4 @@ const {

}
}
exports.default = TokenActions;
//# sourceMappingURL=token.js.map

@@ -9,11 +9,6 @@ "use strict";

exports.readDirectory = readDirectory;
var _fs = _interopRequireDefault(require("fs"));
var _path = _interopRequireDefault(require("path"));
var _lodash = _interopRequireDefault(require("lodash"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function getFileStats(packagePath) {

@@ -25,3 +20,2 @@ return new Promise((resolve, reject) => {

}
resolve(stats);

@@ -31,3 +25,2 @@ });

}
function readDirectory(packagePath) {

@@ -39,3 +32,2 @@ return new Promise((resolve, reject) => {

}
resolve(scopedPackages);

@@ -45,9 +37,7 @@ });

}
function hasScope(file) {
return file.match(/^@/) !== null;
}
/* eslint-disable no-async-promise-executor */
async function findPackages(storagePath, validationHandler) {

@@ -58,5 +48,3 @@ const listPackages = [];

const scopePath = _path.default.resolve(storagePath);
const storageDirs = await readDirectory(scopePath);
for (const directory of storageDirs) {

@@ -67,11 +55,8 @@ // we check whether has 2nd level

const scopeDirectory = _path.default.resolve(storagePath, directory);
const scopedPackages = await readDirectory(scopeDirectory);
for (const scopedDirName of scopedPackages) {
if (validationHandler(scopedDirName)) {
// we build the complete scope path
const scopePath = _path.default.resolve(storagePath, directory, scopedDirName); // list content of such directory
const scopePath = _path.default.resolve(storagePath, directory, scopedDirName);
// list content of such directory
listPackages.push({

@@ -87,3 +72,2 @@ name: `${directory}/${scopedDirName}`,

const scopePath = _path.default.resolve(storagePath, directory);
listPackages.push({

@@ -99,3 +83,2 @@ name: directory,

}
resolve(listPackages);

@@ -102,0 +85,0 @@ });

10

package.json
{
"name": "@verdaccio/local-storage",
"version": "10.3.1",
"version": "10.3.2",
"description": "Local storage implementation",

@@ -46,3 +46,3 @@ "keywords": [

"@types/node": "^14.0.0",
"@verdaccio/types": "10.5.1",
"@verdaccio/legacy-types": "1.0.1",
"minimatch": "^4.0.0",

@@ -59,8 +59,6 @@ "rmdir-sync": "^1.0.1"

"type-check": "tsc --noEmit -p tsconfig.build.json",
"build:types": "tsc --emitDeclarationOnly -p tsconfig.build.json",
"build:js": "babel src/ --out-dir lib/ --copy-files --extensions \".ts,.tsx\" --source-maps",
"watch": "pnpm build:js -- --watch",
"build": "pnpm run build:js && pnpm run build:types"
},
"readme": "# @verdaccio/local-storage\n\n📦 File system storage plugin for verdaccio \n\n[![verdaccio (latest)](https://img.shields.io/npm/v/@verdaccio/local-storage/latest.svg)](https://www.npmjs.com/package/@verdaccio/local-storage)\n[![CircleCI](https://circleci.com/gh/verdaccio/local-storage/tree/master.svg?style=svg)](https://circleci.com/gh/verdaccio/local-storage/tree/master)\n[![Known Vulnerabilities](https://snyk.io/test/github/verdaccio/local-storage/badge.svg?targetFile=package.json)](https://snyk.io/test/github/verdaccio/local-storage?targetFile=package.json)\n[![codecov](https://codecov.io/gh/verdaccio/local-storage/branch/master/graph/badge.svg)](https://codecov.io/gh/verdaccio/local-storage)\n[![backers](https://opencollective.com/verdaccio/tiers/backer/badge.svg?label=Backer&color=brightgreen)](https://opencollective.com/verdaccio)\n[![discord](https://img.shields.io/discord/388674437219745793.svg)](http://chat.verdaccio.org/)\n![MIT](https://img.shields.io/github/license/mashape/apistatus.svg)\n[![node](https://img.shields.io/node/v/@verdaccio/local-storage/latest.svg)](https://www.npmjs.com/package/@verdaccio/local-storage)\n\n> This package is already built-in in verdaccio\n\n```\nnpm install @verdaccio/local-storage\n```\n\n### API\n\n### LocalDatabase\n\nThe main object that handle a JSON database the private packages.\n\n#### Constructor\n\n```\nnew LocalDatabase(config, logger);\n```\n\n* **config**: A verdaccio configuration instance.\n* **logger**: A logger instance\n\n### LocalFS\n\nA class that handle an package instance in the File System\n\n```\nnew LocalFS(packageStoragePath, logger);\n```\n\n\n\n## License\nVerdaccio is [MIT licensed](https://github.com/verdaccio/local-storage/blob/master/LICENSE).\n\n\n[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fverdaccio%2Flocal-storage.svg?type=large)](https://app.fossa.io/projects/git%2Bgithub.com%2Fverdaccio%2Flocal-storage?ref=badge_large)\n"
"build": "pnpm run build:js"
}
}

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc