@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.
@@ -1 +1 @@
1
- {"version":3,"file":"local-fs.js","names":["_fs","_interopRequireDefault","require","_path","_debug","_lodash","_mkdirp","_streams","_fileLocking","_core","e","__esModule","default","_defineProperty","r","t","_toPropertyKey","Object","defineProperty","value","enumerable","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","fileExist","exports","noSuchFile","resourceNotAvailable","pkgFileName","debug","buildDebug","fSError","message","code","err","errorUtils","getCode","tempFile","str","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","_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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","ignoreList":[]}
1
+ {"version":3,"file":"local-fs.js","names":[],"sources":["../src/local-fs.ts"],"sourcesContent":["import buildDebug from 'debug';\nimport fs from 'fs';\nimport _ from 'lodash';\nimport mkdirp from 'mkdirp';\nimport path from 'path';\n\nimport type { VerdaccioError } from '@verdaccio/core';\nimport { errorUtils } from '@verdaccio/core';\nimport { readFile, unlockFile } from '@verdaccio/file-locking';\nimport { ReadTarball, UploadTarball } from '@verdaccio/streams';\nimport type { Callback, Logger, Package } from '@verdaccio/types';\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(\n packageName: string,\n callback: (err: NodeJS.ErrnoException | null) => void\n ): 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(\n this.path,\n `${name}.tmp-${String(Math.random()).replace(/^0\\./, '')}`\n );\n debug('write a temporal name %o', temporalName);\n const file = fs.createWriteStream(temporalName);\n const removeTempFile = (): void => fs.unlink(temporalName, () => {});\n let opened = false;\n uploadStream.pipe(file);\n\n uploadStream.done = function (): void {\n const onend = function (): void {\n file.on('close', function () {\n renameTmp(temporalName, pathName, function (err) {\n if (err) {\n uploadStream.emit('error', err);\n } else {\n uploadStream.emit('success');\n }\n });\n });\n file.end();\n };\n if (_ended) {\n onend();\n } else {\n uploadStream.on('end', onend);\n }\n };\n\n uploadStream.abort = function (): void {\n if (opened) {\n opened = false;\n file.on('close', function () {\n removeTempFile();\n });\n } else {\n // if the file does not recieve any byte never is opened and has to be removed anyway.\n removeTempFile();\n }\n file.end();\n };\n\n file.on('open', function () {\n opened = true;\n // re-emitting open because it's handled in storage.js\n uploadStream.emit('open');\n });\n\n file.on('error', function (err) {\n uploadStream.emit('error', err);\n });\n }\n });\n\n return uploadStream;\n }\n\n public readTarball(name: string): ReadTarball {\n const pathName: string = this._getStorage(name);\n debug('read a a tarball %o on path %o', name, pathName);\n\n const readTarballStream = new ReadTarball({});\n\n const readStream = fs.createReadStream(pathName);\n\n readStream.on('error', function (err) {\n debug('error on read a tarball %o with error %o', name, err);\n readTarballStream.emit('error', err);\n });\n\n readStream.on('open', function (fd) {\n fs.fstat(fd, function (err, stats) {\n if (_.isNil(err) === false) {\n debug('error on read a tarball %o with error %o', name, err);\n return readTarballStream.emit('error', err);\n }\n readTarballStream.emit('content-length', stats.size);\n readTarballStream.emit('open');\n debug('open on read a tarball %o', name);\n readStream.pipe(readTarballStream);\n });\n });\n\n readTarballStream.abort = function (): void {\n debug('abort on read a tarball %o', name);\n readStream.close();\n };\n\n return readTarballStream;\n }\n\n private _createFile(name: string, contents: any, callback: Function): void {\n debug(' create a new file: %o', name);\n\n fs.open(name, 'wx', (err) => {\n if (err) {\n // native EEXIST used here to check exception on fs.open\n if (err.code === 'EEXIST') {\n debug('file %o cannot be created, it already exists: %o', name);\n return callback(fSError(fileExist));\n }\n }\n\n this._writeFile(name, contents, callback);\n });\n }\n\n private _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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"}
package/lib/pkg-utils.js CHANGED
@@ -1,38 +1,30 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.loadPrivatePackages = loadPrivatePackages;
7
- var _fs = _interopRequireDefault(require("fs"));
8
- var _lodash = _interopRequireDefault(require("lodash"));
9
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
1
+ const require_runtime = require("./_virtual/_rolldown/runtime.js");
2
+ let fs = require("fs");
3
+ fs = require_runtime.__toESM(fs);
4
+ let lodash = require("lodash");
5
+ lodash = require_runtime.__toESM(lodash);
6
+ //#region src/pkg-utils.ts
10
7
  function loadPrivatePackages(path, logger) {
11
- const list = [];
12
- const emptyDatabase = {
13
- list,
14
- secret: ''
15
- };
16
- const data = _fs.default.readFileSync(path, 'utf8');
17
- if (_lodash.default.isNil(data)) {
18
- // readFileSync is platform specific, FreeBSD might return null
19
- return emptyDatabase;
20
- }
21
- let db;
22
- try {
23
- db = JSON.parse(data);
24
- } catch (err) {
25
- logger.error({
26
- err: err.mesage,
27
- path
28
- },
29
- // eslint-disable-next-line max-len
30
- `Package database file corrupted (invalid JSON), please check the error @{err}.\nFile Path: @{path}`);
31
- throw Error('Package database file corrupted (invalid JSON)');
32
- }
33
- if (_lodash.default.isEmpty(db)) {
34
- return emptyDatabase;
35
- }
36
- return db;
8
+ const emptyDatabase = {
9
+ list: [],
10
+ secret: ""
11
+ };
12
+ const data = fs.default.readFileSync(path, "utf8");
13
+ if (lodash.default.isNil(data)) return emptyDatabase;
14
+ let db;
15
+ try {
16
+ db = JSON.parse(data);
17
+ } catch (err) {
18
+ logger.error({
19
+ err: err.mesage,
20
+ path
21
+ }, `Package database file corrupted (invalid JSON), please check the error @{err}.\nFile Path: @{path}`);
22
+ throw Error("Package database file corrupted (invalid JSON)");
23
+ }
24
+ if (lodash.default.isEmpty(db)) return emptyDatabase;
25
+ return db;
37
26
  }
27
+ //#endregion
28
+ exports.loadPrivatePackages = loadPrivatePackages;
29
+
38
30
  //# sourceMappingURL=pkg-utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"pkg-utils.js","names":["_fs","_interopRequireDefault","require","_lodash","e","__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,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;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;IACH,oGACF,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","ignoreList":[]}
1
+ {"version":3,"file":"pkg-utils.js","names":[],"sources":["../src/pkg-utils.ts"],"sourcesContent":["import fs from 'fs';\nimport _ from 'lodash';\n\nimport type { Logger, StorageList } from '@verdaccio/types';\n\nimport type { 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 },\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":";;;;;;AAOA,SAAgB,oBAAoB,MAAc,QAA8B;CAE9E,MAAM,gBAAgB;EAAE,MADE,EAAE;EACE,QAAQ;EAAI;CAC1C,MAAM,OAAO,GAAA,QAAG,aAAa,MAAM,OAAO;AAE1C,KAAI,OAAA,QAAE,MAAM,KAAK,CAEf,QAAO;CAGT,IAAI;AACJ,KAAI;AACF,OAAK,KAAK,MAAM,KAAK;UACd,KAAU;AACjB,SAAO,MACL;GACE,KAAK,IAAI;GACT;GACD,EACD,qGACD;AACD,QAAM,MAAM,iDAAiD;;AAG/D,KAAI,OAAA,QAAE,QAAQ,GAAG,CACf,QAAO;AAGT,QAAO"}
package/lib/token.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import low from 'lowdb';
2
- import { ITokenActions, Config, Token, TokenFilter } from '@verdaccio/types';
1
+ import { default as low } from 'lowdb';
2
+ import { Config, ITokenActions, Token, TokenFilter } from '@verdaccio/types';
3
3
  export default class TokenActions implements ITokenActions {
4
4
  config: Config;
5
5
  tokenDb: low.LowdbAsync<any> | null;
package/lib/token.js CHANGED
@@ -1,95 +1,77 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
- var _path = _interopRequireDefault(require("path"));
8
- var _lodash = _interopRequireDefault(require("lodash"));
9
- var _lowdb = _interopRequireDefault(require("lowdb"));
10
- var _FileAsync = _interopRequireDefault(require("lowdb/adapters/FileAsync"));
11
- var _Memory = _interopRequireDefault(require("lowdb/adapters/Memory"));
12
- var _debug = _interopRequireDefault(require("debug"));
13
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
14
- 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; }
15
- function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
16
- 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); }
17
- const debug = (0, _debug.default)('verdaccio:plugin:local-storage:token');
18
- const TOKEN_DB_NAME = '.token-db.json';
19
- class TokenActions {
20
- constructor(config) {
21
- _defineProperty(this, "config", void 0);
22
- _defineProperty(this, "tokenDb", void 0);
23
- this.config = config;
24
- this.tokenDb = null;
25
- }
26
- _dbGenPath(dbName, config) {
27
- var _config$configPath;
28
- // TODO: self_path is a legacy property and is deprecated
29
- // TODO: display deprecation warning for self_path
30
- const selfPath = (_config$configPath = config.configPath) !== null && _config$configPath !== void 0 ? _config$configPath : config.self_path;
31
- return _path.default.join(_path.default.resolve(_path.default.dirname(selfPath || ''), config.storage, dbName));
32
- }
33
- async getTokenDb() {
34
- if (!this.tokenDb) {
35
- debug('token database is not defined');
36
- let adapter;
37
- if (process.env.NODE_ENV === 'test') {
38
- debug('token memory adapter');
39
- adapter = new _Memory.default('');
40
- } else {
41
- debug('token async adapter');
42
- const pathDb = this._dbGenPath(TOKEN_DB_NAME, this.config);
43
- adapter = new _FileAsync.default(pathDb);
44
- }
45
- debug('token bd generated');
46
- this.tokenDb = await (0, _lowdb.default)(adapter);
47
- }
48
- return this.tokenDb;
49
- }
50
- async saveToken(token) {
51
- debug('token key %o', token.key);
52
- const db = await this.getTokenDb();
53
- const userData = await db.get(token.user).value();
54
- debug('user data %o', userData);
55
- if (_lodash.default.isNil(userData)) {
56
- await db.set(token.user, [token]).write();
57
- debug('token user %o new database', token.user);
58
- } else {
59
- // types does not match with valid implementation
60
- // @ts-ignore
61
- await db.get(token.user)
62
- // @ts-ignore
63
- .push(token).write();
64
- }
65
- debug('data %o', await db.getState());
66
- debug('token saved %o', token.user);
67
- }
68
- async deleteToken(user, tokenKey) {
69
- const db = await this.getTokenDb();
70
- const userTokens = await db.get(user).value();
71
- if (_lodash.default.isNil(userTokens)) {
72
- throw new Error('user not found');
73
- }
74
- debug('tokens %o - %o', userTokens, userTokens.length);
75
- const remainingTokens = userTokens.filter(({
76
- key
77
- }) => {
78
- debug('key %o', key);
79
- return key !== tokenKey;
80
- });
81
- await db.set(user, remainingTokens).write();
82
- debug('removed tokens key %o', tokenKey);
83
- }
84
- async readTokens(filter) {
85
- const {
86
- user
87
- } = filter;
88
- debug('read tokens with %o', user);
89
- const db = await this.getTokenDb();
90
- const tokens = await db.get(user).value();
91
- return tokens || [];
92
- }
93
- }
1
+ const require_runtime = require("./_virtual/_rolldown/runtime.js");
2
+ let debug = require("debug");
3
+ debug = require_runtime.__toESM(debug);
4
+ let lodash = require("lodash");
5
+ lodash = require_runtime.__toESM(lodash);
6
+ let path = require("path");
7
+ path = require_runtime.__toESM(path);
8
+ let lowdb = require("lowdb");
9
+ lowdb = require_runtime.__toESM(lowdb);
10
+ let lowdb_adapters_FileAsync = require("lowdb/adapters/FileAsync");
11
+ lowdb_adapters_FileAsync = require_runtime.__toESM(lowdb_adapters_FileAsync);
12
+ let lowdb_adapters_Memory = require("lowdb/adapters/Memory");
13
+ lowdb_adapters_Memory = require_runtime.__toESM(lowdb_adapters_Memory);
14
+ //#region src/token.ts
15
+ var debug$1 = (0, debug.default)("verdaccio:plugin:local-storage:token");
16
+ var TOKEN_DB_NAME = ".token-db.json";
17
+ var TokenActions = class {
18
+ config;
19
+ tokenDb;
20
+ constructor(config) {
21
+ this.config = config;
22
+ this.tokenDb = null;
23
+ }
24
+ _dbGenPath(dbName, config) {
25
+ const selfPath = config.configPath ?? config.self_path;
26
+ return path.default.join(path.default.resolve(path.default.dirname(selfPath || ""), config.storage, dbName));
27
+ }
28
+ async getTokenDb() {
29
+ if (!this.tokenDb) {
30
+ debug$1("token database is not defined");
31
+ let adapter;
32
+ if (process.env.NODE_ENV === "test") {
33
+ debug$1("token memory adapter");
34
+ adapter = new lowdb_adapters_Memory.default("");
35
+ } else {
36
+ debug$1("token async adapter");
37
+ adapter = new lowdb_adapters_FileAsync.default(this._dbGenPath(TOKEN_DB_NAME, this.config));
38
+ }
39
+ debug$1("token bd generated");
40
+ this.tokenDb = await (0, lowdb.default)(adapter);
41
+ }
42
+ return this.tokenDb;
43
+ }
44
+ async saveToken(token) {
45
+ debug$1("token key %o", token.key);
46
+ const db = await this.getTokenDb();
47
+ const userData = await db.get(token.user).value();
48
+ debug$1("user data %o", userData);
49
+ if (lodash.default.isNil(userData)) {
50
+ await db.set(token.user, [token]).write();
51
+ debug$1("token user %o new database", token.user);
52
+ } else await db.get(token.user).push(token).write();
53
+ debug$1("data %o", await db.getState());
54
+ debug$1("token saved %o", token.user);
55
+ }
56
+ async deleteToken(user, tokenKey) {
57
+ const db = await this.getTokenDb();
58
+ const userTokens = await db.get(user).value();
59
+ if (lodash.default.isNil(userTokens)) throw new Error("user not found");
60
+ debug$1("tokens %o - %o", userTokens, userTokens.length);
61
+ const remainingTokens = userTokens.filter(({ key }) => {
62
+ debug$1("key %o", key);
63
+ return key !== tokenKey;
64
+ });
65
+ await db.set(user, remainingTokens).write();
66
+ debug$1("removed tokens key %o", tokenKey);
67
+ }
68
+ async readTokens(filter) {
69
+ const { user } = filter;
70
+ debug$1("read tokens with %o", user);
71
+ return await (await this.getTokenDb()).get(user).value() || [];
72
+ }
73
+ };
74
+ //#endregion
94
75
  exports.default = TokenActions;
76
+
95
77
  //# sourceMappingURL=token.js.map
package/lib/token.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"token.js","names":["_path","_interopRequireDefault","require","_lodash","_lowdb","_FileAsync","_Memory","_debug","e","__esModule","default","_defineProperty","r","t","_toPropertyKey","Object","defineProperty","value","enumerable","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","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","_","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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","ignoreList":[]}
1
+ {"version":3,"file":"token.js","names":[],"sources":["../src/token.ts"],"sourcesContent":["import buildDebug from 'debug';\nimport _ from 'lodash';\nimport low from 'lowdb';\nimport FileAsync from 'lowdb/adapters/FileAsync';\nimport FileMemory from 'lowdb/adapters/Memory';\nimport Path from 'path';\n\nimport type { Config, ITokenActions, 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(Path.resolve(Path.dirname(selfPath || ''), config.storage as string, dbName));\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":";;;;;;;;;;;;;;AASA,IAAM,WAAA,GAAA,MAAA,SAAmB,uCAAuC;AAEhE,IAAM,gBAAgB;AAEtB,IAAqB,eAArB,MAA2D;CACzD;CACA;CAEA,YAAmB,QAAgB;AACjC,OAAK,SAAS;AACd,OAAK,UAAU;;CAGjB,WAAkB,QAAgB,QAAwB;EAGxD,MAAM,WAAW,OAAO,cAAc,OAAO;AAC7C,SAAO,KAAA,QAAK,KAAK,KAAA,QAAK,QAAQ,KAAA,QAAK,QAAQ,YAAY,GAAG,EAAE,OAAO,SAAmB,OAAO,CAAC;;CAGhG,MAAc,aAA2C;AACvD,MAAI,CAAC,KAAK,SAAS;AACjB,WAAM,gCAAgC;GACtC,IAAI;AACJ,OAAA,QAAA,IAAA,aAA6B,QAAQ;AACnC,YAAM,uBAAuB;AAC7B,cAAU,IAAI,sBAAA,QAAW,GAAG;UACvB;AACL,YAAM,sBAAsB;AAE5B,cAAU,IAAI,yBAAA,QADC,KAAK,WAAW,eAAe,KAAK,OAAO,CAC3B;;AAEjC,WAAM,qBAAqB;AAC3B,QAAK,UAAU,OAAA,GAAA,MAAA,SAAU,QAAQ;;AAGnC,SAAO,KAAK;;CAGd,MAAa,UAAU,OAA6B;AAClD,UAAM,gBAAgB,MAAM,IAAI;EAChC,MAAM,KAAK,MAAM,KAAK,YAAY;EAClC,MAAM,WAAW,MAAM,GAAG,IAAI,MAAM,KAAK,CAAC,OAAO;AACjD,UAAM,gBAAgB,SAAS;AAC/B,MAAI,OAAA,QAAE,MAAM,SAAS,EAAE;AACrB,SAAM,GAAG,IAAI,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO;AACzC,WAAM,8BAA8B,MAAM,KAAK;QAI/C,OAAM,GACH,IAAI,MAAM,KAAK,CAEf,KAAK,MAAM,CACX,OAAO;AAEZ,UAAM,WAAW,MAAM,GAAG,UAAU,CAAC;AACrC,UAAM,kBAAkB,MAAM,KAAK;;CAGrC,MAAa,YAAY,MAAc,UAAiC;EACtE,MAAM,KAAK,MAAM,KAAK,YAAY;EAClC,MAAM,aAAa,MAAM,GAAG,IAAI,KAAK,CAAC,OAAO;AAC7C,MAAI,OAAA,QAAE,MAAM,WAAW,CACrB,OAAM,IAAI,MAAM,iBAAiB;AAEnC,UAAM,kBAAkB,YAAY,WAAW,OAAO;EACtD,MAAM,kBAAkB,WAAW,QAAQ,EAAE,UAAU;AACrD,WAAM,UAAU,IAAI;AACpB,UAAO,QAAQ;IACf;AACF,QAAM,GAAG,IAAI,MAAM,gBAAgB,CAAC,OAAO;AAC3C,UAAM,yBAAyB,SAAS;;CAG1C,MAAa,WAAW,QAAuC;EAC7D,MAAM,EAAE,SAAS;AACjB,UAAM,uBAAuB,KAAK;AAGlC,SADe,OADJ,MAAM,KAAK,YAAY,EACV,IAAI,KAAK,CAAC,OAAO,IACxB,EAAE"}
package/lib/utils.d.ts CHANGED
@@ -1,6 +1,5 @@
1
- /// <reference types="node" />
2
- import fs from 'fs';
3
- export declare type LocalStorage = {
1
+ import { default as fs } from 'fs';
2
+ export type LocalStorage = {
4
3
  list: any;
5
4
  secret: string;
6
5
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@verdaccio/local-storage",
3
- "version": "10.4.0",
3
+ "version": "10.5.1",
4
4
  "description": "Local storage implementation",
5
5
  "keywords": [
6
6
  "plugin",
@@ -28,37 +28,37 @@
28
28
  "lib/"
29
29
  ],
30
30
  "engines": {
31
- "node": ">=8"
31
+ "node": ">=18"
32
32
  },
33
33
  "dependencies": {
34
34
  "@verdaccio/core": "7.0.0-next-8.21",
35
- "@verdaccio/file-locking": "10.3.1",
36
- "@verdaccio/streams": "10.2.1",
37
- "debug": "4.4.1",
35
+ "@verdaccio/file-locking": "10.3.2",
36
+ "@verdaccio/streams": "10.2.2",
37
+ "debug": "4.4.3",
38
38
  "globby": "11.1.0",
39
- "lodash": "4.17.21",
39
+ "lodash": "4.18.1",
40
40
  "lowdb": "1.0.0",
41
41
  "mkdirp": "1.0.4"
42
42
  },
43
43
  "devDependencies": {
44
- "@types/express": "^4.17.17",
45
- "@types/minimatch": "^3.0.3",
46
- "@types/node": "^20.5.8",
47
- "@verdaccio/config": "8.0.0-next-8.19",
44
+ "@types/express": "4.17.17",
45
+ "@types/minimatch": "3.0.5",
46
+ "@types/node": "20.5.8",
47
+ "@verdaccio/config": "8.0.0-next-8.29",
48
48
  "@verdaccio/types": "12.0.0-next-7.5",
49
- "minimatch": "^4.0.0",
50
- "rmdir-sync": "^1.0.1"
49
+ "minimatch": "4.2.5",
50
+ "rmdir-sync": "1.0.1",
51
+ "vite": "8.0.8",
52
+ "vite-plugin-dts": "4.5.4",
53
+ "vitest": "4.1.4"
51
54
  },
52
55
  "funding": {
53
56
  "type": "opencollective",
54
57
  "url": "https://opencollective.com/verdaccio"
55
58
  },
56
59
  "scripts": {
57
- "clean": "rimraf ./build",
58
- "test": "cross-env NODE_ENV=test BABEL_ENV=test jest",
59
- "type-check": "tsc --noEmit -p tsconfig.build.json",
60
- "build:types": "tsc --emitDeclarationOnly -p tsconfig.build.json",
61
- "build:js": "babel src/ --out-dir lib/ --copy-files --extensions \".ts,.tsx\" --source-maps",
62
- "build": "pnpm run build:js && pnpm run build:types"
60
+ "clean": "rimraf ./lib",
61
+ "test": "vitest run",
62
+ "build": "vite build"
63
63
  }
64
64
  }
package/lib/utils.js DELETED
@@ -1,79 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.findPackages = findPackages;
7
- exports.getFileStats = getFileStats;
8
- exports.readDirectory = readDirectory;
9
- var _fs = _interopRequireDefault(require("fs"));
10
- var _path = _interopRequireDefault(require("path"));
11
- var _lodash = _interopRequireDefault(require("lodash"));
12
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
13
- function getFileStats(packagePath) {
14
- return new Promise((resolve, reject) => {
15
- _fs.default.stat(packagePath, (err, stats) => {
16
- if (_lodash.default.isNil(err) === false) {
17
- return reject(err);
18
- }
19
- resolve(stats);
20
- });
21
- });
22
- }
23
- function readDirectory(packagePath) {
24
- return new Promise((resolve, reject) => {
25
- _fs.default.readdir(packagePath, (err, scopedPackages) => {
26
- if (_lodash.default.isNil(err) === false) {
27
- return reject(err);
28
- }
29
- resolve(scopedPackages);
30
- });
31
- });
32
- }
33
- function hasScope(file) {
34
- return file.match(/^@/) !== null;
35
- }
36
-
37
- /* eslint-disable no-async-promise-executor */
38
- async function findPackages(storagePath, validationHandler) {
39
- const listPackages = [];
40
- return new Promise(async (resolve, reject) => {
41
- try {
42
- const scopePath = _path.default.resolve(storagePath);
43
- const storageDirs = await readDirectory(scopePath);
44
- for (const directory of storageDirs) {
45
- // we check whether has 2nd level
46
- if (hasScope(directory)) {
47
- // we read directory multiple
48
- const scopeDirectory = _path.default.resolve(storagePath, directory);
49
- const scopedPackages = await readDirectory(scopeDirectory);
50
- for (const scopedDirName of scopedPackages) {
51
- if (validationHandler(scopedDirName)) {
52
- // we build the complete scope path
53
- const scopePath = _path.default.resolve(storagePath, directory, scopedDirName);
54
- // list content of such directory
55
- listPackages.push({
56
- name: `${directory}/${scopedDirName}`,
57
- path: scopePath
58
- });
59
- }
60
- }
61
- } else {
62
- // otherwise we read as single level
63
- if (validationHandler(directory)) {
64
- const scopePath = _path.default.resolve(storagePath, directory);
65
- listPackages.push({
66
- name: directory,
67
- path: scopePath
68
- });
69
- }
70
- }
71
- }
72
- } catch (error) {
73
- reject(error);
74
- }
75
- resolve(listPackages);
76
- });
77
- }
78
- /* eslint-enable no-async-promise-executor */
79
- //# sourceMappingURL=utils.js.map
package/lib/utils.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils.js","names":["_fs","_interopRequireDefault","require","_path","_lodash","e","__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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","ignoreList":[]}