@verdaccio/store 9.0.0-next-9.4 → 9.0.0-next-9.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -29,16 +29,16 @@ If you want to report a security vulnerability, please follow the steps which we
29
29
 
30
30
  Support this project by becoming a sponsor. Your logo will show up here with a link to your website. [[Become a sponsor](https://opencollective.com/verdaccio/contribute)]
31
31
 
32
- [![sponsor](https://opencollective.com/verdaccio/sponsor/0/avatar.svg)](https://opencollective.com/verdaccio/sponsor/0/website)
33
- [![sponsor](https://opencollective.com/verdaccio/sponsor/1/avatar.svg)](https://opencollective.com/verdaccio/sponsor/1/website)
34
- [![sponsor](https://opencollective.com/verdaccio/sponsor/2/avatar.svg)](https://opencollective.com/verdaccio/sponsor/2/website)
35
- [![sponsor](https://opencollective.com/verdaccio/sponsor/3/avatar.svg)](https://opencollective.com/verdaccio/sponsor/3/website)
36
- [![sponsor](https://opencollective.com/verdaccio/sponsor/4/avatar.svg)](https://opencollective.com/verdaccio/sponsor/4/website)
37
- [![sponsor](https://opencollective.com/verdaccio/sponsor/5/avatar.svg)](https://opencollective.com/verdaccio/sponsor/5/website)
38
- [![sponsor](https://opencollective.com/verdaccio/sponsor/6/avatar.svg)](https://opencollective.com/verdaccio/sponsor/6/website)
39
- [![sponsor](https://opencollective.com/verdaccio/sponsor/7/avatar.svg)](https://opencollective.com/verdaccio/sponsor/7/website)
40
- [![sponsor](https://opencollective.com/verdaccio/sponsor/8/avatar.svg)](https://opencollective.com/verdaccio/sponsor/8/website)
41
- [![sponsor](https://opencollective.com/verdaccio/sponsor/9/avatar.svg)](https://opencollective.com/verdaccio/sponsor/9/website)
32
+ [![sponsor](https://opencollective.com/verdaccio/sponsor/0/avatar.png)](https://opencollective.com/verdaccio/sponsor/0/website)
33
+ [![sponsor](https://opencollective.com/verdaccio/sponsor/1/avatar.png)](https://opencollective.com/verdaccio/sponsor/1/website)
34
+ [![sponsor](https://opencollective.com/verdaccio/sponsor/2/avatar.png)](https://opencollective.com/verdaccio/sponsor/2/website)
35
+ [![sponsor](https://opencollective.com/verdaccio/sponsor/3/avatar.png)](https://opencollective.com/verdaccio/sponsor/3/website)
36
+ [![sponsor](https://opencollective.com/verdaccio/sponsor/4/avatar.png)](https://opencollective.com/verdaccio/sponsor/4/website)
37
+ [![sponsor](https://opencollective.com/verdaccio/sponsor/5/avatar.png)](https://opencollective.com/verdaccio/sponsor/5/website)
38
+ [![sponsor](https://opencollective.com/verdaccio/sponsor/6/avatar.png)](https://opencollective.com/verdaccio/sponsor/6/website)
39
+ [![sponsor](https://opencollective.com/verdaccio/sponsor/7/avatar.png)](https://opencollective.com/verdaccio/sponsor/7/website)
40
+ [![sponsor](https://opencollective.com/verdaccio/sponsor/8/avatar.png)](https://opencollective.com/verdaccio/sponsor/8/website)
41
+ [![sponsor](https://opencollective.com/verdaccio/sponsor/9/avatar.png)](https://opencollective.com/verdaccio/sponsor/9/website)
42
42
 
43
43
  ## Open Collective Backers
44
44
 
@@ -0,0 +1,12 @@
1
+ import { pluginUtils } from '@verdaccio/core';
2
+ import { Config, Logger, Manifest } from '@verdaccio/types';
3
+ export type Filters = pluginUtils.ManifestFilter<Config>[];
4
+ /**
5
+ * Apply all loaded filter plugins to a manifest in sequence.
6
+ * Each filter receives the output of the previous one.
7
+ */
8
+ export declare function applyManifestFilters(manifest: Manifest, filters: pluginUtils.ManifestFilter<unknown>[], logger: Logger): Promise<[Manifest, any[]]>;
9
+ /**
10
+ * Load filter plugins using the same loader Verdaccio uses at startup.
11
+ */
12
+ export declare function loadFilterPlugins(config: Config, logger: Logger): Promise<Filters>;
@@ -0,0 +1,39 @@
1
+ const require_runtime = require("./_virtual/_rolldown/runtime.js");
2
+ let debug = require("debug");
3
+ debug = require_runtime.__toESM(debug);
4
+ let _verdaccio_core = require("@verdaccio/core");
5
+ let _verdaccio_loaders = require("@verdaccio/loaders");
6
+ //#region src/filter-pipeline.ts
7
+ var debug$1 = (0, debug.default)("verdaccio:filter-pipeline");
8
+ /**
9
+ * Apply all loaded filter plugins to a manifest in sequence.
10
+ * Each filter receives the output of the previous one.
11
+ */
12
+ async function applyManifestFilters(manifest, filters, logger) {
13
+ if (!filters || filters.length === 0) return [manifest, []];
14
+ const filterPluginErrors = [];
15
+ let filteredManifest = { ...manifest };
16
+ for (const filter of filters) try {
17
+ filteredManifest = await filter.filter_metadata(filteredManifest);
18
+ } catch (err) {
19
+ logger.error({ err }, "filter has failed: @{err.message}");
20
+ filterPluginErrors.push(err);
21
+ }
22
+ return [filteredManifest, filterPluginErrors];
23
+ }
24
+ /**
25
+ * Load filter plugins using the same loader Verdaccio uses at startup.
26
+ */
27
+ async function loadFilterPlugins(config, logger) {
28
+ const filters = await (0, _verdaccio_loaders.asyncLoadPlugin)(config.filters, {
29
+ config,
30
+ logger
31
+ }, _verdaccio_core.pluginUtils.filterSanityCheck, false, config.server?.pluginPrefix ?? _verdaccio_core.PLUGIN_PREFIX, _verdaccio_core.PLUGIN_CATEGORY.FILTER);
32
+ debug$1("filters available %o", filters.length);
33
+ return filters;
34
+ }
35
+ //#endregion
36
+ exports.applyManifestFilters = applyManifestFilters;
37
+ exports.loadFilterPlugins = loadFilterPlugins;
38
+
39
+ //# sourceMappingURL=filter-pipeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filter-pipeline.js","names":[],"sources":["../src/filter-pipeline.ts"],"sourcesContent":["import buildDebug from 'debug';\n\nimport type { pluginUtils } from '@verdaccio/core';\nimport { PLUGIN_CATEGORY, PLUGIN_PREFIX, pluginUtils as pluginSanity } from '@verdaccio/core';\nimport { asyncLoadPlugin } from '@verdaccio/loaders';\nimport type { Config, Logger, Manifest } from '@verdaccio/types';\n\nconst debug = buildDebug('verdaccio:filter-pipeline');\n\nexport type Filters = pluginUtils.ManifestFilter<Config>[];\n\n/**\n * Apply all loaded filter plugins to a manifest in sequence.\n * Each filter receives the output of the previous one.\n */\nexport async function applyManifestFilters(\n manifest: Manifest,\n filters: pluginUtils.ManifestFilter<unknown>[],\n logger: Logger\n): Promise<[Manifest, any[]]> {\n if (!filters || filters.length === 0) {\n return [manifest, []];\n }\n\n const filterPluginErrors: any[] = [];\n let filteredManifest = { ...manifest };\n for (const filter of filters) {\n try {\n filteredManifest = await filter.filter_metadata(filteredManifest);\n } catch (err: any) {\n logger.error({ err }, 'filter has failed: @{err.message}');\n filterPluginErrors.push(err);\n }\n }\n return [filteredManifest, filterPluginErrors];\n}\n\n/**\n * Load filter plugins using the same loader Verdaccio uses at startup.\n */\nexport async function loadFilterPlugins(config: Config, logger: Logger): Promise<Filters> {\n const filters = await asyncLoadPlugin<pluginUtils.ManifestFilter<unknown>>(\n config.filters,\n {\n config,\n logger,\n },\n pluginSanity.filterSanityCheck,\n false,\n config.server?.pluginPrefix ?? PLUGIN_PREFIX,\n PLUGIN_CATEGORY.FILTER\n );\n debug('filters available %o', filters.length);\n return filters;\n}\n"],"mappings":";;;;;;AAOA,IAAM,WAAA,GAAA,MAAA,SAAmB,4BAA4B;;;;;AAQrD,eAAsB,qBACpB,UACA,SACA,QAC4B;AAC5B,KAAI,CAAC,WAAW,QAAQ,WAAW,EACjC,QAAO,CAAC,UAAU,EAAE,CAAC;CAGvB,MAAM,qBAA4B,EAAE;CACpC,IAAI,mBAAmB,EAAE,GAAG,UAAU;AACtC,MAAK,MAAM,UAAU,QACnB,KAAI;AACF,qBAAmB,MAAM,OAAO,gBAAgB,iBAAiB;UAC1D,KAAU;AACjB,SAAO,MAAM,EAAE,KAAK,EAAE,oCAAoC;AAC1D,qBAAmB,KAAK,IAAI;;AAGhC,QAAO,CAAC,kBAAkB,mBAAmB;;;;;AAM/C,eAAsB,kBAAkB,QAAgB,QAAkC;CACxF,MAAM,UAAU,OAAA,GAAA,mBAAA,iBACd,OAAO,SACP;EACE;EACA;EACD,EACD,gBAAA,YAAa,mBACb,OACA,OAAO,QAAQ,gBAAgB,gBAAA,eAC/B,gBAAA,gBAAgB,OACjB;AACD,SAAM,wBAAwB,QAAQ,OAAO;AAC7C,QAAO"}
@@ -0,0 +1,36 @@
1
+ import buildDebug from "debug";
2
+ import { PLUGIN_CATEGORY, PLUGIN_PREFIX, pluginUtils } from "@verdaccio/core";
3
+ import { asyncLoadPlugin } from "@verdaccio/loaders";
4
+ //#region src/filter-pipeline.ts
5
+ var debug = buildDebug("verdaccio:filter-pipeline");
6
+ /**
7
+ * Apply all loaded filter plugins to a manifest in sequence.
8
+ * Each filter receives the output of the previous one.
9
+ */
10
+ async function applyManifestFilters(manifest, filters, logger) {
11
+ if (!filters || filters.length === 0) return [manifest, []];
12
+ const filterPluginErrors = [];
13
+ let filteredManifest = { ...manifest };
14
+ for (const filter of filters) try {
15
+ filteredManifest = await filter.filter_metadata(filteredManifest);
16
+ } catch (err) {
17
+ logger.error({ err }, "filter has failed: @{err.message}");
18
+ filterPluginErrors.push(err);
19
+ }
20
+ return [filteredManifest, filterPluginErrors];
21
+ }
22
+ /**
23
+ * Load filter plugins using the same loader Verdaccio uses at startup.
24
+ */
25
+ async function loadFilterPlugins(config, logger) {
26
+ const filters = await asyncLoadPlugin(config.filters, {
27
+ config,
28
+ logger
29
+ }, pluginUtils.filterSanityCheck, false, config.server?.pluginPrefix ?? PLUGIN_PREFIX, PLUGIN_CATEGORY.FILTER);
30
+ debug("filters available %o", filters.length);
31
+ return filters;
32
+ }
33
+ //#endregion
34
+ export { applyManifestFilters, loadFilterPlugins };
35
+
36
+ //# sourceMappingURL=filter-pipeline.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filter-pipeline.mjs","names":[],"sources":["../src/filter-pipeline.ts"],"sourcesContent":["import buildDebug from 'debug';\n\nimport type { pluginUtils } from '@verdaccio/core';\nimport { PLUGIN_CATEGORY, PLUGIN_PREFIX, pluginUtils as pluginSanity } from '@verdaccio/core';\nimport { asyncLoadPlugin } from '@verdaccio/loaders';\nimport type { Config, Logger, Manifest } from '@verdaccio/types';\n\nconst debug = buildDebug('verdaccio:filter-pipeline');\n\nexport type Filters = pluginUtils.ManifestFilter<Config>[];\n\n/**\n * Apply all loaded filter plugins to a manifest in sequence.\n * Each filter receives the output of the previous one.\n */\nexport async function applyManifestFilters(\n manifest: Manifest,\n filters: pluginUtils.ManifestFilter<unknown>[],\n logger: Logger\n): Promise<[Manifest, any[]]> {\n if (!filters || filters.length === 0) {\n return [manifest, []];\n }\n\n const filterPluginErrors: any[] = [];\n let filteredManifest = { ...manifest };\n for (const filter of filters) {\n try {\n filteredManifest = await filter.filter_metadata(filteredManifest);\n } catch (err: any) {\n logger.error({ err }, 'filter has failed: @{err.message}');\n filterPluginErrors.push(err);\n }\n }\n return [filteredManifest, filterPluginErrors];\n}\n\n/**\n * Load filter plugins using the same loader Verdaccio uses at startup.\n */\nexport async function loadFilterPlugins(config: Config, logger: Logger): Promise<Filters> {\n const filters = await asyncLoadPlugin<pluginUtils.ManifestFilter<unknown>>(\n config.filters,\n {\n config,\n logger,\n },\n pluginSanity.filterSanityCheck,\n false,\n config.server?.pluginPrefix ?? PLUGIN_PREFIX,\n PLUGIN_CATEGORY.FILTER\n );\n debug('filters available %o', filters.length);\n return filters;\n}\n"],"mappings":";;;;AAOA,IAAM,QAAQ,WAAW,4BAA4B;;;;;AAQrD,eAAsB,qBACpB,UACA,SACA,QAC4B;AAC5B,KAAI,CAAC,WAAW,QAAQ,WAAW,EACjC,QAAO,CAAC,UAAU,EAAE,CAAC;CAGvB,MAAM,qBAA4B,EAAE;CACpC,IAAI,mBAAmB,EAAE,GAAG,UAAU;AACtC,MAAK,MAAM,UAAU,QACnB,KAAI;AACF,qBAAmB,MAAM,OAAO,gBAAgB,iBAAiB;UAC1D,KAAU;AACjB,SAAO,MAAM,EAAE,KAAK,EAAE,oCAAoC;AAC1D,qBAAmB,KAAK,IAAI;;AAGhC,QAAO,CAAC,kBAAkB,mBAAmB;;;;;AAM/C,eAAsB,kBAAkB,QAAgB,QAAkC;CACxF,MAAM,UAAU,MAAM,gBACpB,OAAO,SACP;EACE;EACA;EACD,EACD,YAAa,mBACb,OACA,OAAO,QAAQ,gBAAgB,eAC/B,gBAAgB,OACjB;AACD,OAAM,wBAAwB,QAAQ,OAAO;AAC7C,QAAO"}
package/build/index.d.ts CHANGED
@@ -1,4 +1,6 @@
1
1
  export { Storage } from './storage';
2
+ export { applyManifestFilters, loadFilterPlugins } from './filter-pipeline';
3
+ export type { Filters } from './filter-pipeline';
2
4
  export * from './lib/storage-utils';
3
5
  export * from './lib/versions-utils';
4
6
  export * from './lib/star-utils';
package/build/index.js CHANGED
@@ -2,6 +2,7 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
+ const require_filter_pipeline = require("./filter-pipeline.js");
5
6
  const require_star_utils = require("./lib/star-utils.js");
6
7
  const require_versions_utils = require("./lib/versions-utils.js");
7
8
  const require_storage_utils = require("./lib/storage-utils.js");
@@ -9,6 +10,7 @@ const require_storage = require("./storage.js");
9
10
  exports.STORAGE = require_storage_utils.STORAGE;
10
11
  exports.Storage = require_storage.Storage;
11
12
  exports.WHITELIST = require_storage_utils.WHITELIST;
13
+ exports.applyManifestFilters = require_filter_pipeline.applyManifestFilters;
12
14
  exports.checkPackageRemote = require_storage_utils.checkPackageRemote;
13
15
  exports.cleanUpLinksRef = require_storage_utils.cleanUpLinksRef;
14
16
  exports.cleanUpReadme = require_storage_utils.cleanUpReadme;
@@ -22,6 +24,7 @@ exports.isExecutingStarCommand = require_star_utils.isExecutingStarCommand;
22
24
  exports.isNewerVersion = require_versions_utils.isNewerVersion;
23
25
  exports.isPublishablePackage = require_star_utils.isPublishablePackage;
24
26
  exports.isStarManifest = require_star_utils.isStarManifest;
27
+ exports.loadFilterPlugins = require_filter_pipeline.loadFilterPlugins;
25
28
  exports.mapManifestToSearchPackageBody = require_storage_utils.mapManifestToSearchPackageBody;
26
29
  exports.mergeUplinkTimeIntoLocal = require_storage_utils.mergeUplinkTimeIntoLocal;
27
30
  exports.mergeUplinkTimeIntoLocalNext = require_storage_utils.mergeUplinkTimeIntoLocalNext;
package/build/index.mjs CHANGED
@@ -1,5 +1,6 @@
1
+ import { applyManifestFilters, loadFilterPlugins } from "./filter-pipeline.mjs";
1
2
  import { isExecutingStarCommand, isPublishablePackage, isStarManifest } from "./lib/star-utils.mjs";
2
3
  import { getVersion, isNewerVersion, removeLowerVersions, sortVersionsAndFilterInvalid, tagVersion, tagVersionNext } from "./lib/versions-utils.mjs";
3
4
  import { STORAGE, WHITELIST, checkPackageRemote, cleanUpLinksRef, cleanUpReadme, generatePackageTemplate, generateRevision, getLatestReadme, hasDeprecatedVersions, isDeprecatedManifest, mapManifestToSearchPackageBody, mergeUplinkTimeIntoLocal, mergeUplinkTimeIntoLocalNext, mergeVersions, normalizeContributors, normalizeDistTags, normalizePackage, prepareSearchPackage, updateUpLinkMetadata } from "./lib/storage-utils.mjs";
4
5
  import { Storage } from "./storage.mjs";
5
- export { STORAGE, Storage, WHITELIST, checkPackageRemote, cleanUpLinksRef, cleanUpReadme, generatePackageTemplate, generateRevision, getLatestReadme, getVersion, hasDeprecatedVersions, isDeprecatedManifest, isExecutingStarCommand, isNewerVersion, isPublishablePackage, isStarManifest, mapManifestToSearchPackageBody, mergeUplinkTimeIntoLocal, mergeUplinkTimeIntoLocalNext, mergeVersions, normalizeContributors, normalizeDistTags, normalizePackage, prepareSearchPackage, removeLowerVersions, sortVersionsAndFilterInvalid, tagVersion, tagVersionNext, updateUpLinkMetadata };
6
+ export { STORAGE, Storage, WHITELIST, applyManifestFilters, checkPackageRemote, cleanUpLinksRef, cleanUpReadme, generatePackageTemplate, generateRevision, getLatestReadme, getVersion, hasDeprecatedVersions, isDeprecatedManifest, isExecutingStarCommand, isNewerVersion, isPublishablePackage, isStarManifest, loadFilterPlugins, mapManifestToSearchPackageBody, mergeUplinkTimeIntoLocal, mergeUplinkTimeIntoLocalNext, mergeVersions, normalizeContributors, normalizeDistTags, normalizePackage, prepareSearchPackage, removeLowerVersions, sortVersionsAndFilterInvalid, tagVersion, tagVersionNext, updateUpLinkMetadata };
@@ -58,9 +58,7 @@ var LocalStorage = class {
58
58
  const plugins = await (0, _verdaccio_loaders.asyncLoadPlugin)(this.config.store, {
59
59
  config: this.config,
60
60
  logger: this.logger
61
- }, (plugin) => {
62
- return typeof plugin.getPackageStorage !== "undefined";
63
- }, false, this.config.server?.pluginPrefix ?? _verdaccio_core.PLUGIN_PREFIX, _verdaccio_core.PLUGIN_CATEGORY.STORAGE);
61
+ }, _verdaccio_core.pluginUtils.storageSanityCheck, false, this.config.server?.pluginPrefix ?? _verdaccio_core.PLUGIN_PREFIX, _verdaccio_core.PLUGIN_CATEGORY.STORAGE);
64
62
  if (plugins.length > 1) this.logger.warn("more than one storage plugins has been detected, multiple storage are not supported, one will be selected automatically");
65
63
  return lodash.default.head(plugins);
66
64
  }
@@ -1 +1 @@
1
- {"version":3,"file":"local-storage.js","names":[],"sources":["../src/local-storage.ts"],"sourcesContent":["import buildDebug from 'debug';\nimport _ from 'lodash';\nimport assert from 'node:assert';\n\nimport type { pluginUtils } from '@verdaccio/core';\nimport { PLUGIN_CATEGORY, PLUGIN_PREFIX, errorUtils } from '@verdaccio/core';\nimport { asyncLoadPlugin } from '@verdaccio/loaders';\nimport LocalDatabase from '@verdaccio/local-storage';\nimport type { Config, Logger } from '@verdaccio/types';\n\nconst debug = buildDebug('verdaccio:storage:local');\n\nexport const noSuchFile = 'ENOENT';\nexport const resourceNotAvailable = 'EAGAIN';\nexport type PluginStorage = pluginUtils.Storage<Config>;\n\n/**\n * Implements Storage interface (same for storage.js, local-storage.js, up-storage.js).\n */\nclass LocalStorage {\n public config: Config;\n public storagePlugin: PluginStorage;\n public logger: Logger;\n\n public constructor(config: Config, logger: Logger) {\n debug('local storage created');\n this.logger = logger.child({ sub: 'fs' });\n this.config = config;\n // @ts-expect-error\n this.storagePlugin = null;\n }\n\n public async init() {\n if (this.storagePlugin === null) {\n this.storagePlugin = await this.loadStorage(this.config, this.logger);\n debug('storage plugin init');\n await this.storagePlugin.init();\n debug('storage plugin initialized');\n } else {\n this.logger.warn('storage plugin has been already initialized');\n }\n return;\n }\n\n public getStoragePlugin(): PluginStorage {\n if (this.storagePlugin === null) {\n throw errorUtils.getInternalError('storage plugin is not initialized');\n }\n\n return this.storagePlugin;\n }\n\n public async getSecret(config: Config): Promise<void> {\n const secretKey = await this.storagePlugin.getSecret();\n\n return this.storagePlugin.setSecret(config.checkSecretKey(secretKey));\n }\n\n private async loadStorage(config: Config, logger: Logger): Promise<PluginStorage> {\n const Storage = await this.loadStorePlugin();\n if (_.isNil(Storage)) {\n assert(this.config.storage, 'CONFIG: storage path not defined');\n debug('no custom storage found, loading default storage @verdaccio/local-storage');\n const localStorage = new LocalDatabase(config, logger);\n logger.info(\n { name: '@verdaccio/local-storage', pluginCategory: PLUGIN_CATEGORY.STORAGE },\n 'plugin @{name} successfully loaded (@{pluginCategory})'\n );\n return localStorage;\n }\n return Storage as PluginStorage;\n }\n\n private async loadStorePlugin(): Promise<PluginStorage | undefined> {\n const plugins: PluginStorage[] = await asyncLoadPlugin<pluginUtils.Storage<unknown>>(\n this.config.store,\n {\n config: this.config,\n logger: this.logger,\n },\n (plugin) => {\n return typeof plugin.getPackageStorage !== 'undefined';\n },\n false,\n this.config.server?.pluginPrefix ?? PLUGIN_PREFIX,\n PLUGIN_CATEGORY.STORAGE\n );\n\n if (plugins.length > 1) {\n this.logger.warn(\n 'more than one storage plugins has been detected, multiple storage are not supported, one will be selected automatically'\n );\n }\n\n return _.head(plugins);\n }\n}\n\nexport { LocalStorage };\n"],"mappings":";;;;;;;;;;;;AAUA,IAAM,WAAA,GAAA,MAAA,SAAmB,0BAA0B;;;;AASnD,IAAM,eAAN,MAAmB;CACjB;CACA;CACA;CAEA,YAAmB,QAAgB,QAAgB;AACjD,UAAM,wBAAwB;AAC9B,OAAK,SAAS,OAAO,MAAM,EAAE,KAAK,MAAM,CAAC;AACzC,OAAK,SAAS;AAEd,OAAK,gBAAgB;;CAGvB,MAAa,OAAO;AAClB,MAAI,KAAK,kBAAkB,MAAM;AAC/B,QAAK,gBAAgB,MAAM,KAAK,YAAY,KAAK,QAAQ,KAAK,OAAO;AACrE,WAAM,sBAAsB;AAC5B,SAAM,KAAK,cAAc,MAAM;AAC/B,WAAM,6BAA6B;QAEnC,MAAK,OAAO,KAAK,8CAA8C;;CAKnE,mBAAyC;AACvC,MAAI,KAAK,kBAAkB,KACzB,OAAM,gBAAA,WAAW,iBAAiB,oCAAoC;AAGxE,SAAO,KAAK;;CAGd,MAAa,UAAU,QAA+B;EACpD,MAAM,YAAY,MAAM,KAAK,cAAc,WAAW;AAEtD,SAAO,KAAK,cAAc,UAAU,OAAO,eAAe,UAAU,CAAC;;CAGvE,MAAc,YAAY,QAAgB,QAAwC;EAChF,MAAM,UAAU,MAAM,KAAK,iBAAiB;AAC5C,MAAI,OAAA,QAAE,MAAM,QAAQ,EAAE;AACpB,IAAA,GAAA,YAAA,SAAO,KAAK,OAAO,SAAS,mCAAmC;AAC/D,WAAM,4EAA4E;GAClF,MAAM,eAAe,IAAI,yBAAA,QAAc,QAAQ,OAAO;AACtD,UAAO,KACL;IAAE,MAAM;IAA4B,gBAAgB,gBAAA,gBAAgB;IAAS,EAC7E,yDACD;AACD,UAAO;;AAET,SAAO;;CAGT,MAAc,kBAAsD;EAClE,MAAM,UAA2B,OAAA,GAAA,mBAAA,iBAC/B,KAAK,OAAO,OACZ;GACE,QAAQ,KAAK;GACb,QAAQ,KAAK;GACd,GACA,WAAW;AACV,UAAO,OAAO,OAAO,sBAAsB;KAE7C,OACA,KAAK,OAAO,QAAQ,gBAAgB,gBAAA,eACpC,gBAAA,gBAAgB,QACjB;AAED,MAAI,QAAQ,SAAS,EACnB,MAAK,OAAO,KACV,0HACD;AAGH,SAAO,OAAA,QAAE,KAAK,QAAQ"}
1
+ {"version":3,"file":"local-storage.js","names":[],"sources":["../src/local-storage.ts"],"sourcesContent":["import buildDebug from 'debug';\nimport _ from 'lodash';\nimport assert from 'node:assert';\n\nimport type { pluginUtils } from '@verdaccio/core';\nimport {\n PLUGIN_CATEGORY,\n PLUGIN_PREFIX,\n errorUtils,\n pluginUtils as pluginSanity,\n} from '@verdaccio/core';\nimport { asyncLoadPlugin } from '@verdaccio/loaders';\nimport LocalDatabase from '@verdaccio/local-storage';\nimport type { Config, Logger } from '@verdaccio/types';\n\nconst debug = buildDebug('verdaccio:storage:local');\n\nexport const noSuchFile = 'ENOENT';\nexport const resourceNotAvailable = 'EAGAIN';\nexport type PluginStorage = pluginUtils.Storage<Config>;\n\n/**\n * Implements Storage interface (same for storage.js, local-storage.js, up-storage.js).\n */\nclass LocalStorage {\n public config: Config;\n public storagePlugin: PluginStorage;\n public logger: Logger;\n\n public constructor(config: Config, logger: Logger) {\n debug('local storage created');\n this.logger = logger.child({ sub: 'fs' });\n this.config = config;\n // @ts-expect-error\n this.storagePlugin = null;\n }\n\n public async init() {\n if (this.storagePlugin === null) {\n this.storagePlugin = await this.loadStorage(this.config, this.logger);\n debug('storage plugin init');\n await this.storagePlugin.init();\n debug('storage plugin initialized');\n } else {\n this.logger.warn('storage plugin has been already initialized');\n }\n return;\n }\n\n public getStoragePlugin(): PluginStorage {\n if (this.storagePlugin === null) {\n throw errorUtils.getInternalError('storage plugin is not initialized');\n }\n\n return this.storagePlugin;\n }\n\n public async getSecret(config: Config): Promise<void> {\n const secretKey = await this.storagePlugin.getSecret();\n\n return this.storagePlugin.setSecret(config.checkSecretKey(secretKey));\n }\n\n private async loadStorage(config: Config, logger: Logger): Promise<PluginStorage> {\n const Storage = await this.loadStorePlugin();\n if (_.isNil(Storage)) {\n assert(this.config.storage, 'CONFIG: storage path not defined');\n debug('no custom storage found, loading default storage @verdaccio/local-storage');\n const localStorage = new LocalDatabase(config, logger);\n logger.info(\n { name: '@verdaccio/local-storage', pluginCategory: PLUGIN_CATEGORY.STORAGE },\n 'plugin @{name} successfully loaded (@{pluginCategory})'\n );\n return localStorage;\n }\n return Storage as PluginStorage;\n }\n\n private async loadStorePlugin(): Promise<PluginStorage | undefined> {\n const plugins: PluginStorage[] = await asyncLoadPlugin<pluginUtils.Storage<unknown>>(\n this.config.store,\n {\n config: this.config,\n logger: this.logger,\n },\n pluginSanity.storageSanityCheck,\n false,\n this.config.server?.pluginPrefix ?? PLUGIN_PREFIX,\n PLUGIN_CATEGORY.STORAGE\n );\n\n if (plugins.length > 1) {\n this.logger.warn(\n 'more than one storage plugins has been detected, multiple storage are not supported, one will be selected automatically'\n );\n }\n\n return _.head(plugins);\n }\n}\n\nexport { LocalStorage };\n"],"mappings":";;;;;;;;;;;;AAeA,IAAM,WAAA,GAAA,MAAA,SAAmB,0BAA0B;;;;AASnD,IAAM,eAAN,MAAmB;CACjB;CACA;CACA;CAEA,YAAmB,QAAgB,QAAgB;AACjD,UAAM,wBAAwB;AAC9B,OAAK,SAAS,OAAO,MAAM,EAAE,KAAK,MAAM,CAAC;AACzC,OAAK,SAAS;AAEd,OAAK,gBAAgB;;CAGvB,MAAa,OAAO;AAClB,MAAI,KAAK,kBAAkB,MAAM;AAC/B,QAAK,gBAAgB,MAAM,KAAK,YAAY,KAAK,QAAQ,KAAK,OAAO;AACrE,WAAM,sBAAsB;AAC5B,SAAM,KAAK,cAAc,MAAM;AAC/B,WAAM,6BAA6B;QAEnC,MAAK,OAAO,KAAK,8CAA8C;;CAKnE,mBAAyC;AACvC,MAAI,KAAK,kBAAkB,KACzB,OAAM,gBAAA,WAAW,iBAAiB,oCAAoC;AAGxE,SAAO,KAAK;;CAGd,MAAa,UAAU,QAA+B;EACpD,MAAM,YAAY,MAAM,KAAK,cAAc,WAAW;AAEtD,SAAO,KAAK,cAAc,UAAU,OAAO,eAAe,UAAU,CAAC;;CAGvE,MAAc,YAAY,QAAgB,QAAwC;EAChF,MAAM,UAAU,MAAM,KAAK,iBAAiB;AAC5C,MAAI,OAAA,QAAE,MAAM,QAAQ,EAAE;AACpB,IAAA,GAAA,YAAA,SAAO,KAAK,OAAO,SAAS,mCAAmC;AAC/D,WAAM,4EAA4E;GAClF,MAAM,eAAe,IAAI,yBAAA,QAAc,QAAQ,OAAO;AACtD,UAAO,KACL;IAAE,MAAM;IAA4B,gBAAgB,gBAAA,gBAAgB;IAAS,EAC7E,yDACD;AACD,UAAO;;AAET,SAAO;;CAGT,MAAc,kBAAsD;EAClE,MAAM,UAA2B,OAAA,GAAA,mBAAA,iBAC/B,KAAK,OAAO,OACZ;GACE,QAAQ,KAAK;GACb,QAAQ,KAAK;GACd,EACD,gBAAA,YAAa,oBACb,OACA,KAAK,OAAO,QAAQ,gBAAgB,gBAAA,eACpC,gBAAA,gBAAgB,QACjB;AAED,MAAI,QAAQ,SAAS,EACnB,MAAK,OAAO,KACV,0HACD;AAGH,SAAO,OAAA,QAAE,KAAK,QAAQ"}
@@ -1,7 +1,7 @@
1
1
  import buildDebug from "debug";
2
2
  import _ from "lodash";
3
3
  import assert from "node:assert";
4
- import { PLUGIN_CATEGORY, PLUGIN_PREFIX, errorUtils } from "@verdaccio/core";
4
+ import { PLUGIN_CATEGORY, PLUGIN_PREFIX, errorUtils, pluginUtils } from "@verdaccio/core";
5
5
  import { asyncLoadPlugin } from "@verdaccio/loaders";
6
6
  import LocalDatabase from "@verdaccio/local-storage";
7
7
  //#region src/local-storage.ts
@@ -53,9 +53,7 @@ var LocalStorage = class {
53
53
  const plugins = await asyncLoadPlugin(this.config.store, {
54
54
  config: this.config,
55
55
  logger: this.logger
56
- }, (plugin) => {
57
- return typeof plugin.getPackageStorage !== "undefined";
58
- }, false, this.config.server?.pluginPrefix ?? PLUGIN_PREFIX, PLUGIN_CATEGORY.STORAGE);
56
+ }, pluginUtils.storageSanityCheck, false, this.config.server?.pluginPrefix ?? PLUGIN_PREFIX, PLUGIN_CATEGORY.STORAGE);
59
57
  if (plugins.length > 1) this.logger.warn("more than one storage plugins has been detected, multiple storage are not supported, one will be selected automatically");
60
58
  return _.head(plugins);
61
59
  }
@@ -1 +1 @@
1
- {"version":3,"file":"local-storage.mjs","names":[],"sources":["../src/local-storage.ts"],"sourcesContent":["import buildDebug from 'debug';\nimport _ from 'lodash';\nimport assert from 'node:assert';\n\nimport type { pluginUtils } from '@verdaccio/core';\nimport { PLUGIN_CATEGORY, PLUGIN_PREFIX, errorUtils } from '@verdaccio/core';\nimport { asyncLoadPlugin } from '@verdaccio/loaders';\nimport LocalDatabase from '@verdaccio/local-storage';\nimport type { Config, Logger } from '@verdaccio/types';\n\nconst debug = buildDebug('verdaccio:storage:local');\n\nexport const noSuchFile = 'ENOENT';\nexport const resourceNotAvailable = 'EAGAIN';\nexport type PluginStorage = pluginUtils.Storage<Config>;\n\n/**\n * Implements Storage interface (same for storage.js, local-storage.js, up-storage.js).\n */\nclass LocalStorage {\n public config: Config;\n public storagePlugin: PluginStorage;\n public logger: Logger;\n\n public constructor(config: Config, logger: Logger) {\n debug('local storage created');\n this.logger = logger.child({ sub: 'fs' });\n this.config = config;\n // @ts-expect-error\n this.storagePlugin = null;\n }\n\n public async init() {\n if (this.storagePlugin === null) {\n this.storagePlugin = await this.loadStorage(this.config, this.logger);\n debug('storage plugin init');\n await this.storagePlugin.init();\n debug('storage plugin initialized');\n } else {\n this.logger.warn('storage plugin has been already initialized');\n }\n return;\n }\n\n public getStoragePlugin(): PluginStorage {\n if (this.storagePlugin === null) {\n throw errorUtils.getInternalError('storage plugin is not initialized');\n }\n\n return this.storagePlugin;\n }\n\n public async getSecret(config: Config): Promise<void> {\n const secretKey = await this.storagePlugin.getSecret();\n\n return this.storagePlugin.setSecret(config.checkSecretKey(secretKey));\n }\n\n private async loadStorage(config: Config, logger: Logger): Promise<PluginStorage> {\n const Storage = await this.loadStorePlugin();\n if (_.isNil(Storage)) {\n assert(this.config.storage, 'CONFIG: storage path not defined');\n debug('no custom storage found, loading default storage @verdaccio/local-storage');\n const localStorage = new LocalDatabase(config, logger);\n logger.info(\n { name: '@verdaccio/local-storage', pluginCategory: PLUGIN_CATEGORY.STORAGE },\n 'plugin @{name} successfully loaded (@{pluginCategory})'\n );\n return localStorage;\n }\n return Storage as PluginStorage;\n }\n\n private async loadStorePlugin(): Promise<PluginStorage | undefined> {\n const plugins: PluginStorage[] = await asyncLoadPlugin<pluginUtils.Storage<unknown>>(\n this.config.store,\n {\n config: this.config,\n logger: this.logger,\n },\n (plugin) => {\n return typeof plugin.getPackageStorage !== 'undefined';\n },\n false,\n this.config.server?.pluginPrefix ?? PLUGIN_PREFIX,\n PLUGIN_CATEGORY.STORAGE\n );\n\n if (plugins.length > 1) {\n this.logger.warn(\n 'more than one storage plugins has been detected, multiple storage are not supported, one will be selected automatically'\n );\n }\n\n return _.head(plugins);\n }\n}\n\nexport { LocalStorage };\n"],"mappings":";;;;;;;AAUA,IAAM,QAAQ,WAAW,0BAA0B;;;;AASnD,IAAM,eAAN,MAAmB;CACjB;CACA;CACA;CAEA,YAAmB,QAAgB,QAAgB;AACjD,QAAM,wBAAwB;AAC9B,OAAK,SAAS,OAAO,MAAM,EAAE,KAAK,MAAM,CAAC;AACzC,OAAK,SAAS;AAEd,OAAK,gBAAgB;;CAGvB,MAAa,OAAO;AAClB,MAAI,KAAK,kBAAkB,MAAM;AAC/B,QAAK,gBAAgB,MAAM,KAAK,YAAY,KAAK,QAAQ,KAAK,OAAO;AACrE,SAAM,sBAAsB;AAC5B,SAAM,KAAK,cAAc,MAAM;AAC/B,SAAM,6BAA6B;QAEnC,MAAK,OAAO,KAAK,8CAA8C;;CAKnE,mBAAyC;AACvC,MAAI,KAAK,kBAAkB,KACzB,OAAM,WAAW,iBAAiB,oCAAoC;AAGxE,SAAO,KAAK;;CAGd,MAAa,UAAU,QAA+B;EACpD,MAAM,YAAY,MAAM,KAAK,cAAc,WAAW;AAEtD,SAAO,KAAK,cAAc,UAAU,OAAO,eAAe,UAAU,CAAC;;CAGvE,MAAc,YAAY,QAAgB,QAAwC;EAChF,MAAM,UAAU,MAAM,KAAK,iBAAiB;AAC5C,MAAI,EAAE,MAAM,QAAQ,EAAE;AACpB,UAAO,KAAK,OAAO,SAAS,mCAAmC;AAC/D,SAAM,4EAA4E;GAClF,MAAM,eAAe,IAAI,cAAc,QAAQ,OAAO;AACtD,UAAO,KACL;IAAE,MAAM;IAA4B,gBAAgB,gBAAgB;IAAS,EAC7E,yDACD;AACD,UAAO;;AAET,SAAO;;CAGT,MAAc,kBAAsD;EAClE,MAAM,UAA2B,MAAM,gBACrC,KAAK,OAAO,OACZ;GACE,QAAQ,KAAK;GACb,QAAQ,KAAK;GACd,GACA,WAAW;AACV,UAAO,OAAO,OAAO,sBAAsB;KAE7C,OACA,KAAK,OAAO,QAAQ,gBAAgB,eACpC,gBAAgB,QACjB;AAED,MAAI,QAAQ,SAAS,EACnB,MAAK,OAAO,KACV,0HACD;AAGH,SAAO,EAAE,KAAK,QAAQ"}
1
+ {"version":3,"file":"local-storage.mjs","names":[],"sources":["../src/local-storage.ts"],"sourcesContent":["import buildDebug from 'debug';\nimport _ from 'lodash';\nimport assert from 'node:assert';\n\nimport type { pluginUtils } from '@verdaccio/core';\nimport {\n PLUGIN_CATEGORY,\n PLUGIN_PREFIX,\n errorUtils,\n pluginUtils as pluginSanity,\n} from '@verdaccio/core';\nimport { asyncLoadPlugin } from '@verdaccio/loaders';\nimport LocalDatabase from '@verdaccio/local-storage';\nimport type { Config, Logger } from '@verdaccio/types';\n\nconst debug = buildDebug('verdaccio:storage:local');\n\nexport const noSuchFile = 'ENOENT';\nexport const resourceNotAvailable = 'EAGAIN';\nexport type PluginStorage = pluginUtils.Storage<Config>;\n\n/**\n * Implements Storage interface (same for storage.js, local-storage.js, up-storage.js).\n */\nclass LocalStorage {\n public config: Config;\n public storagePlugin: PluginStorage;\n public logger: Logger;\n\n public constructor(config: Config, logger: Logger) {\n debug('local storage created');\n this.logger = logger.child({ sub: 'fs' });\n this.config = config;\n // @ts-expect-error\n this.storagePlugin = null;\n }\n\n public async init() {\n if (this.storagePlugin === null) {\n this.storagePlugin = await this.loadStorage(this.config, this.logger);\n debug('storage plugin init');\n await this.storagePlugin.init();\n debug('storage plugin initialized');\n } else {\n this.logger.warn('storage plugin has been already initialized');\n }\n return;\n }\n\n public getStoragePlugin(): PluginStorage {\n if (this.storagePlugin === null) {\n throw errorUtils.getInternalError('storage plugin is not initialized');\n }\n\n return this.storagePlugin;\n }\n\n public async getSecret(config: Config): Promise<void> {\n const secretKey = await this.storagePlugin.getSecret();\n\n return this.storagePlugin.setSecret(config.checkSecretKey(secretKey));\n }\n\n private async loadStorage(config: Config, logger: Logger): Promise<PluginStorage> {\n const Storage = await this.loadStorePlugin();\n if (_.isNil(Storage)) {\n assert(this.config.storage, 'CONFIG: storage path not defined');\n debug('no custom storage found, loading default storage @verdaccio/local-storage');\n const localStorage = new LocalDatabase(config, logger);\n logger.info(\n { name: '@verdaccio/local-storage', pluginCategory: PLUGIN_CATEGORY.STORAGE },\n 'plugin @{name} successfully loaded (@{pluginCategory})'\n );\n return localStorage;\n }\n return Storage as PluginStorage;\n }\n\n private async loadStorePlugin(): Promise<PluginStorage | undefined> {\n const plugins: PluginStorage[] = await asyncLoadPlugin<pluginUtils.Storage<unknown>>(\n this.config.store,\n {\n config: this.config,\n logger: this.logger,\n },\n pluginSanity.storageSanityCheck,\n false,\n this.config.server?.pluginPrefix ?? PLUGIN_PREFIX,\n PLUGIN_CATEGORY.STORAGE\n );\n\n if (plugins.length > 1) {\n this.logger.warn(\n 'more than one storage plugins has been detected, multiple storage are not supported, one will be selected automatically'\n );\n }\n\n return _.head(plugins);\n }\n}\n\nexport { LocalStorage };\n"],"mappings":";;;;;;;AAeA,IAAM,QAAQ,WAAW,0BAA0B;;;;AASnD,IAAM,eAAN,MAAmB;CACjB;CACA;CACA;CAEA,YAAmB,QAAgB,QAAgB;AACjD,QAAM,wBAAwB;AAC9B,OAAK,SAAS,OAAO,MAAM,EAAE,KAAK,MAAM,CAAC;AACzC,OAAK,SAAS;AAEd,OAAK,gBAAgB;;CAGvB,MAAa,OAAO;AAClB,MAAI,KAAK,kBAAkB,MAAM;AAC/B,QAAK,gBAAgB,MAAM,KAAK,YAAY,KAAK,QAAQ,KAAK,OAAO;AACrE,SAAM,sBAAsB;AAC5B,SAAM,KAAK,cAAc,MAAM;AAC/B,SAAM,6BAA6B;QAEnC,MAAK,OAAO,KAAK,8CAA8C;;CAKnE,mBAAyC;AACvC,MAAI,KAAK,kBAAkB,KACzB,OAAM,WAAW,iBAAiB,oCAAoC;AAGxE,SAAO,KAAK;;CAGd,MAAa,UAAU,QAA+B;EACpD,MAAM,YAAY,MAAM,KAAK,cAAc,WAAW;AAEtD,SAAO,KAAK,cAAc,UAAU,OAAO,eAAe,UAAU,CAAC;;CAGvE,MAAc,YAAY,QAAgB,QAAwC;EAChF,MAAM,UAAU,MAAM,KAAK,iBAAiB;AAC5C,MAAI,EAAE,MAAM,QAAQ,EAAE;AACpB,UAAO,KAAK,OAAO,SAAS,mCAAmC;AAC/D,SAAM,4EAA4E;GAClF,MAAM,eAAe,IAAI,cAAc,QAAQ,OAAO;AACtD,UAAO,KACL;IAAE,MAAM;IAA4B,gBAAgB,gBAAgB;IAAS,EAC7E,yDACD;AACD,UAAO;;AAET,SAAO;;CAGT,MAAc,kBAAsD;EAClE,MAAM,UAA2B,MAAM,gBACrC,KAAK,OAAO,OACZ;GACE,QAAQ,KAAK;GACb,QAAQ,KAAK;GACd,EACD,YAAa,oBACb,OACA,KAAK,OAAO,QAAQ,gBAAgB,eACpC,gBAAgB,QACjB;AAED,MAAI,QAAQ,SAAS,EACnB,MAAK,OAAO,KACV,0HACD;AAGH,SAAO,EAAE,KAAK,QAAQ"}
@@ -1,11 +1,11 @@
1
1
  import { PassThrough, Readable } from 'node:stream';
2
- import { pluginUtils, searchUtils } from '@verdaccio/core';
2
+ import { searchUtils } from '@verdaccio/core';
3
3
  import { ISyncUplinksOptions, ProxyInstanceList, ProxySearchParams } from '@verdaccio/proxy';
4
4
  import { AbbreviatedManifest, Config, Logger, Manifest, MergeTags, Token, TokenFilter, UnPublishManifest, Version } from '@verdaccio/types';
5
5
  import { UpdateManifestOptions } from '.';
6
+ import { Filters } from './filter-pipeline';
6
7
  import { LocalStorage } from './local-storage';
7
8
  import { IGetPackageOptionsNext, OwnerManifestBody, StarManifestBody } from './type';
8
- export type Filters = pluginUtils.ManifestFilter<Config>[];
9
9
  export declare const noSuchFile = "ENOENT";
10
10
  export declare const resourceNotAvailable = "EAGAIN";
11
11
  export declare const PROTO_NAME = "__proto__";
package/build/storage.js CHANGED
@@ -1,4 +1,5 @@
1
1
  const require_runtime = require("./_virtual/_rolldown/runtime.js");
2
+ const require_filter_pipeline = require("./filter-pipeline.js");
2
3
  const require_star_utils = require("./lib/star-utils.js");
3
4
  const require_versions_utils = require("./lib/versions-utils.js");
4
5
  const require_storage_utils = require("./lib/storage-utils.js");
@@ -17,7 +18,6 @@ let node_url = require("node:url");
17
18
  node_url = require_runtime.__toESM(node_url);
18
19
  let _verdaccio_config = require("@verdaccio/config");
19
20
  let _verdaccio_core = require("@verdaccio/core");
20
- let _verdaccio_loaders = require("@verdaccio/loaders");
21
21
  let _verdaccio_proxy = require("@verdaccio/proxy");
22
22
  let _verdaccio_search = require("@verdaccio/search");
23
23
  _verdaccio_search = require_runtime.__toESM(_verdaccio_search);
@@ -163,6 +163,7 @@ var Storage = class {
163
163
  let cachedManifest = null;
164
164
  try {
165
165
  cachedManifest = await this.getPackageLocalMetadata(name);
166
+ [cachedManifest] = await this.applyFilters(cachedManifest);
166
167
  } catch (err) {
167
168
  debug$1("error on get package local metadata %o", err);
168
169
  }
@@ -382,12 +383,12 @@ var Storage = class {
382
383
  for (const pkg of database) {
383
384
  debug$1("get local database %o", pkg);
384
385
  const manifest = await this.getPackageLocalMetadata(pkg);
385
- const latest = manifest[_verdaccio_core.DIST_TAGS].latest;
386
- if (latest && manifest.versions[latest]) {
387
- const version = manifest.versions[latest];
388
- version.time = manifest.time[latest];
389
- version.users = manifest.users;
390
- version.readme = "";
386
+ const [filteredManifest] = await this.applyFilters(manifest);
387
+ const latest = filteredManifest[_verdaccio_core.DIST_TAGS].latest;
388
+ if (latest && filteredManifest.versions[latest]) {
389
+ const version = filteredManifest.versions[latest];
390
+ version.time = filteredManifest.time[latest];
391
+ version.users = filteredManifest.users;
391
392
  packages.push(version);
392
393
  } else this.logger.warn({ package: pkg }, "package @{package} does not have a \"latest\" tag?");
393
394
  }
@@ -419,15 +420,7 @@ var Storage = class {
419
420
  await this.localStorage.getSecret(config);
420
421
  debug$1("local storage secret initialized");
421
422
  } else debug$1("storage has been already initialized");
422
- if (!this.filters) {
423
- this.filters = await (0, _verdaccio_loaders.asyncLoadPlugin)(this.config.filters, {
424
- config: this.config,
425
- logger: this.logger
426
- }, (plugin) => {
427
- return typeof plugin.filter_metadata !== "undefined";
428
- }, false, this.config.server?.pluginPrefix ?? _verdaccio_core.PLUGIN_PREFIX, _verdaccio_core.PLUGIN_CATEGORY.FILTER);
429
- debug$1("filters available %o", this.filters.length);
430
- }
423
+ if (!this.filters) this.filters = await require_filter_pipeline.loadFilterPlugins(this.config, this.logger);
431
424
  }
432
425
  /**
433
426
  * Retrieve a wrapper that provide access to the package location.
@@ -472,8 +465,9 @@ var Storage = class {
472
465
  try {
473
466
  for (const searchItem of items) {
474
467
  const manifest = await this.getPackageLocalMetadata(searchItem.package.name);
475
- if (lodash.default.isEmpty(manifest?.versions) === false) {
476
- const searchPackage = require_storage_utils.mapManifestToSearchPackageBody(manifest, searchItem);
468
+ const [filteredManifest] = await this.applyFilters(manifest);
469
+ if (lodash.default.isEmpty(filteredManifest?.versions) === false) {
470
+ const searchPackage = require_storage_utils.mapManifestToSearchPackageBody(filteredManifest, searchItem);
477
471
  debug$1("search local stream found %o", searchPackage.name);
478
472
  const searchPackageItem = {
479
473
  package: searchPackage,
@@ -1084,7 +1078,10 @@ var Storage = class {
1084
1078
  remoteAddress: options.requestOptions.remoteAddress
1085
1079
  });
1086
1080
  if (!remoteManifest && lodash.default.isNull(data)) throw _verdaccio_core.errorUtils.getNotFound(`${_verdaccio_core.API_ERROR.NOT_PACKAGE_UPLINK}: ${name}`);
1087
- else if (!remoteManifest && !lodash.default.isNull(data)) return [data, upLinksErrors];
1081
+ else if (!remoteManifest && !lodash.default.isNull(data)) {
1082
+ const [filteredData, filtersErrors] = await this.applyFilters(data);
1083
+ return [filteredData, [...upLinksErrors, ...filtersErrors]];
1084
+ }
1088
1085
  const normalizedPkg = Object.assign({}, remoteManifest, {
1089
1086
  ...require_storage_utils.normalizeDistTags(require_storage_utils.cleanUpLinksRef(remoteManifest, options.keepUpLinkData)),
1090
1087
  _attachments: {}
@@ -1128,7 +1125,8 @@ var Storage = class {
1128
1125
  }
1129
1126
  if (upLinks.length === 0) {
1130
1127
  debug$1("no uplinks found for %o, upstream update aborted", name);
1131
- return [localManifest, []];
1128
+ if (lodash.default.isNil(localManifest)) return [null, []];
1129
+ return await this.applyFilters(localManifest);
1132
1130
  }
1133
1131
  const uplinksErrors = [];
1134
1132
  for (const uplink of upLinks) try {
@@ -1147,16 +1145,10 @@ var Storage = class {
1147
1145
  if (found && syncManifest !== null) {
1148
1146
  const updatedCacheManifest = await this.updateVersionsNext(name, syncManifest);
1149
1147
  const [filteredManifest, filtersErrors] = await this.applyFilters(updatedCacheManifest);
1150
- return [{
1151
- ...updatedCacheManifest,
1152
- ...filteredManifest
1153
- }, [...uplinksErrors, ...filtersErrors]];
1148
+ return [filteredManifest, [...uplinksErrors, ...filtersErrors]];
1154
1149
  } else if (found && lodash.default.isNil(localManifest) === false) {
1155
1150
  const [filteredManifest, filtersErrors] = await this.applyFilters(localManifest);
1156
- return [{
1157
- ...localManifest,
1158
- ...filteredManifest
1159
- }, [...uplinksErrors, ...filtersErrors]];
1151
+ return [filteredManifest, [...uplinksErrors, ...filtersErrors]];
1160
1152
  } else {
1161
1153
  debug$1("uplinks sync failed with %o errors", uplinksErrors.length);
1162
1154
  for (const err of uplinksErrors) {
@@ -1221,16 +1213,7 @@ var Storage = class {
1221
1213
  * @returns
1222
1214
  */
1223
1215
  async applyFilters(manifest) {
1224
- if (this.filters === null || this.filters.length === 0) return [manifest, []];
1225
- const filterPluginErrors = [];
1226
- let filteredManifest = { ...manifest };
1227
- for (const filter of this.filters) try {
1228
- filteredManifest = await filter.filter_metadata(manifest);
1229
- } catch (err) {
1230
- this.logger.error({ err }, "filter has failed: @{err.message}");
1231
- filterPluginErrors.push(err);
1232
- }
1233
- return [filteredManifest, filterPluginErrors];
1216
+ return require_filter_pipeline.applyManifestFilters(manifest, this.filters ?? [], this.logger);
1234
1217
  }
1235
1218
  _createNewPackage(name) {
1236
1219
  return require_storage_utils.normalizePackage(require_storage_utils.generatePackageTemplate(name));