@verdaccio/config 9.0.0-next-9.2 → 9.0.0-next-9.4

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.
Files changed (73) hide show
  1. package/build/_virtual/_rolldown/runtime.js +23 -0
  2. package/build/_virtual/_rolldown/runtime.mjs +7 -0
  3. package/build/address.d.ts +1 -1
  4. package/build/address.js +80 -102
  5. package/build/address.js.map +1 -1
  6. package/build/address.mjs +86 -0
  7. package/build/address.mjs.map +1 -0
  8. package/build/agent.js +11 -16
  9. package/build/agent.js.map +1 -1
  10. package/build/agent.mjs +12 -0
  11. package/build/agent.mjs.map +1 -0
  12. package/build/builder.d.ts +2 -1
  13. package/build/builder.js +58 -58
  14. package/build/builder.js.map +1 -1
  15. package/build/builder.mjs +60 -0
  16. package/build/builder.mjs.map +1 -0
  17. package/build/conf/default.yaml +6 -0
  18. package/build/conf/docker.yaml +6 -0
  19. package/build/conf/index.d.ts +1 -1
  20. package/build/conf/index.js +9 -11
  21. package/build/conf/index.js.map +1 -1
  22. package/build/conf/index.mjs +10 -0
  23. package/build/conf/index.mjs.map +1 -0
  24. package/build/config-path.js +152 -163
  25. package/build/config-path.js.map +1 -1
  26. package/build/config-path.mjs +169 -0
  27. package/build/config-path.mjs.map +1 -0
  28. package/build/config-utils.js +37 -41
  29. package/build/config-utils.js.map +1 -1
  30. package/build/config-utils.mjs +40 -0
  31. package/build/config-utils.mjs.map +1 -0
  32. package/build/config.d.ts +1 -1
  33. package/build/config.js +170 -201
  34. package/build/config.js.map +1 -1
  35. package/build/config.mjs +171 -0
  36. package/build/config.mjs.map +1 -0
  37. package/build/index.js +52 -167
  38. package/build/index.mjs +14 -0
  39. package/build/package-access.d.ts +1 -1
  40. package/build/package-access.js +52 -68
  41. package/build/package-access.js.map +1 -1
  42. package/build/package-access.mjs +52 -0
  43. package/build/package-access.mjs.map +1 -0
  44. package/build/parse.d.ts +1 -1
  45. package/build/parse.js +80 -99
  46. package/build/parse.js.map +1 -1
  47. package/build/parse.mjs +83 -0
  48. package/build/parse.mjs.map +1 -0
  49. package/build/security.d.ts +1 -1
  50. package/build/security.js +15 -22
  51. package/build/security.js.map +1 -1
  52. package/build/security.mjs +16 -0
  53. package/build/security.mjs.map +1 -0
  54. package/build/serverSettings.js +10 -15
  55. package/build/serverSettings.js.map +1 -1
  56. package/build/serverSettings.mjs +12 -0
  57. package/build/serverSettings.mjs.map +1 -0
  58. package/build/token.js +11 -13
  59. package/build/token.js.map +1 -1
  60. package/build/token.mjs +13 -0
  61. package/build/token.mjs.map +1 -0
  62. package/build/uplinks.d.ts +1 -1
  63. package/build/uplinks.js +47 -55
  64. package/build/uplinks.js.map +1 -1
  65. package/build/uplinks.mjs +50 -0
  66. package/build/uplinks.mjs.map +1 -0
  67. package/build/user.d.ts +1 -1
  68. package/build/user.js +42 -37
  69. package/build/user.js.map +1 -1
  70. package/build/user.mjs +48 -0
  71. package/build/user.mjs.map +1 -0
  72. package/package.json +19 -8
  73. package/build/index.js.map +0 -1
@@ -0,0 +1,60 @@
1
+ import { fromJStoYAML } from "./parse.mjs";
2
+ import "./index.mjs";
3
+ import { merge } from "lodash";
4
+ //#region src/builder.ts
5
+ /**
6
+ * Helper configuration builder constructor, used to build the configuration for testing or
7
+ * programatically creating a configuration.
8
+ */
9
+ var ConfigBuilder = class ConfigBuilder {
10
+ config;
11
+ constructor(config) {
12
+ this.config = merge(config, {
13
+ uplinks: {},
14
+ packages: {},
15
+ security: {}
16
+ });
17
+ }
18
+ static build(config) {
19
+ return new ConfigBuilder(config);
20
+ }
21
+ addPackageAccess(pattern, pkgAccess) {
22
+ this.config.packages[pattern] = pkgAccess;
23
+ return this;
24
+ }
25
+ addUplink(id, uplink) {
26
+ this.config.uplinks[id] = uplink;
27
+ return this;
28
+ }
29
+ addSecurity(security) {
30
+ this.config.security = merge(this.config.security, security);
31
+ return this;
32
+ }
33
+ addAuth(auth) {
34
+ this.config.auth = merge(this.config.auth, auth);
35
+ return this;
36
+ }
37
+ addLogger(log) {
38
+ this.config.log = log;
39
+ return this;
40
+ }
41
+ addServer(server) {
42
+ this.config.server = merge(this.config.server, server);
43
+ return this;
44
+ }
45
+ addStorage(storage) {
46
+ if (typeof storage === "string") this.config.storage = storage;
47
+ else this.config.store = storage;
48
+ return this;
49
+ }
50
+ getConfig() {
51
+ return this.config;
52
+ }
53
+ getAsYaml() {
54
+ return fromJStoYAML(this.config);
55
+ }
56
+ };
57
+ //#endregion
58
+ export { ConfigBuilder as default };
59
+
60
+ //# sourceMappingURL=builder.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builder.mjs","names":[],"sources":["../src/builder.ts"],"sourcesContent":["import { merge } from 'lodash';\n\nimport type {\n AuthConf,\n ConfigYaml,\n LoggerConfigItem,\n PackageAccessYaml,\n Security,\n ServerSettingsConf,\n UpLinkConf,\n} from '@verdaccio/types';\n\nimport { fromJStoYAML } from '.';\n\n/**\n * Helper configuration builder constructor, used to build the configuration for testing or\n * programatically creating a configuration.\n */\nexport default class ConfigBuilder {\n private config: ConfigYaml;\n\n public constructor(config?: Partial<ConfigYaml>) {\n this.config = merge(config, { uplinks: {}, packages: {}, security: {} });\n }\n\n public static build(config?: Partial<ConfigYaml>): ConfigBuilder {\n return new ConfigBuilder(config);\n }\n\n public addPackageAccess(pattern: string, pkgAccess: PackageAccessYaml) {\n // @ts-ignore\n this.config.packages[pattern] = pkgAccess;\n return this;\n }\n\n public addUplink(id: string, uplink: UpLinkConf) {\n this.config.uplinks[id] = uplink;\n return this;\n }\n\n public addSecurity(security: Partial<Security>) {\n this.config.security = merge(this.config.security, security);\n return this;\n }\n\n public addAuth(auth: Partial<AuthConf>) {\n this.config.auth = merge(this.config.auth, auth);\n return this;\n }\n\n public addLogger(log: LoggerConfigItem) {\n this.config.log = log;\n return this;\n }\n\n public addServer(server: Partial<ServerSettingsConf>) {\n this.config.server = merge(this.config.server, server);\n return this;\n }\n\n public addStorage(storage: string | object) {\n if (typeof storage === 'string') {\n this.config.storage = storage;\n } else {\n this.config.store = storage;\n }\n return this;\n }\n\n public getConfig(): ConfigYaml {\n return this.config;\n }\n\n public getAsYaml(): string {\n return fromJStoYAML(this.config) as string;\n }\n}\n"],"mappings":";;;;;;;;AAkBA,IAAqB,gBAArB,MAAqB,cAAc;CACjC;CAEA,YAAmB,QAA8B;AAC/C,OAAK,SAAS,MAAM,QAAQ;GAAE,SAAS,EAAE;GAAE,UAAU,EAAE;GAAE,UAAU,EAAE;GAAE,CAAC;;CAG1E,OAAc,MAAM,QAA6C;AAC/D,SAAO,IAAI,cAAc,OAAO;;CAGlC,iBAAwB,SAAiB,WAA8B;AAErE,OAAK,OAAO,SAAS,WAAW;AAChC,SAAO;;CAGT,UAAiB,IAAY,QAAoB;AAC/C,OAAK,OAAO,QAAQ,MAAM;AAC1B,SAAO;;CAGT,YAAmB,UAA6B;AAC9C,OAAK,OAAO,WAAW,MAAM,KAAK,OAAO,UAAU,SAAS;AAC5D,SAAO;;CAGT,QAAe,MAAyB;AACtC,OAAK,OAAO,OAAO,MAAM,KAAK,OAAO,MAAM,KAAK;AAChD,SAAO;;CAGT,UAAiB,KAAuB;AACtC,OAAK,OAAO,MAAM;AAClB,SAAO;;CAGT,UAAiB,QAAqC;AACpD,OAAK,OAAO,SAAS,MAAM,KAAK,OAAO,QAAQ,OAAO;AACtD,SAAO;;CAGT,WAAkB,SAA0B;AAC1C,MAAI,OAAO,YAAY,SACrB,MAAK,OAAO,UAAU;MAEtB,MAAK,OAAO,QAAQ;AAEtB,SAAO;;CAGT,YAA+B;AAC7B,SAAO,KAAK;;CAGd,YAA2B;AACzB,SAAO,aAAa,KAAK,OAAO"}
@@ -120,6 +120,12 @@ packages:
120
120
  # WORKAROUND: Through given configuration you can workaround following issue https://github.com/verdaccio/verdaccio/issues/301. Set to 0 in case 60 is not enough.
121
121
  server:
122
122
  keepAliveTimeout: 60
123
+ # Controls how requests with dotfile path segments (e.g. /.env, /.well-known/) are handled.
124
+ # 'deny' returns 403, 'ignore' returns 404 (default), 'allow' passes through.
125
+ dotfiles: ignore
126
+ # Hide static file requests (/-/static/*) from pino logs.
127
+ # They remain visible via DEBUG=verdaccio:middleware:log.
128
+ # hideStaticLogs: true
123
129
  # The pluginPrefix replaces the default plugins prefix which is `verdaccio`. Please don't include `-`. If `something` is provided
124
130
  # the resolved package will be `something-xxxx`.
125
131
  # pluginPrefix: something
@@ -116,6 +116,12 @@ packages:
116
116
  # WORKAROUND: Through given configuration you can workaround following issue https://github.com/verdaccio/verdaccio/issues/301. Set to 0 in case 60 is not enough.
117
117
  server:
118
118
  keepAliveTimeout: 60
119
+ # Controls how requests with dotfile path segments (e.g. /.env, /.well-known/) are handled.
120
+ # 'deny' returns 403, 'ignore' returns 404 (default), 'allow' passes through.
121
+ dotfiles: ignore
122
+ # Hide static file requests (/-/static/*) from pino logs.
123
+ # They remain visible via DEBUG=verdaccio:middleware:log.
124
+ # hideStaticLogs: true
119
125
  # The pluginPrefix replaces the default plugins prefix which is `verdaccio`. Please don't include `-`. If `something` is provided
120
126
  # the resolved package will be `something-xxxx`.
121
127
  # pluginPrefix: something
@@ -1,4 +1,4 @@
1
- export declare function getDefaultConfig(fileName?: string): import("@verdaccio/types").ConfigYaml & {
1
+ export declare function getDefaultConfig(fileName?: string): import('@verdaccio/types').ConfigYaml & {
2
2
  config_path: string;
3
3
  configPath: string;
4
4
  };
@@ -1,13 +1,11 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.getDefaultConfig = getDefaultConfig;
7
- var _nodePath = require("node:path");
8
- var _parse = require("../parse");
9
- function getDefaultConfig(fileName = 'default.yaml') {
10
- const file = (0, _nodePath.join)(__dirname, `./${fileName}`);
11
- return (0, _parse.parseConfigFile)(file);
1
+ require("../_virtual/_rolldown/runtime.js");
2
+ const require_parse = require("../parse.js");
3
+ let node_path = require("node:path");
4
+ //#region src/conf/index.ts
5
+ function getDefaultConfig(fileName = "default.yaml") {
6
+ return require_parse.parseConfigFile((0, node_path.join)(__dirname, `./${fileName}`));
12
7
  }
8
+ //#endregion
9
+ exports.getDefaultConfig = getDefaultConfig;
10
+
13
11
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["_nodePath","require","_parse","getDefaultConfig","fileName","file","join","__dirname","parseConfigFile"],"sources":["../../src/conf/index.ts"],"sourcesContent":["import { join } from 'node:path';\n\nimport { parseConfigFile } from '../parse';\n\nexport function getDefaultConfig(fileName: string = 'default.yaml') {\n const file = join(__dirname, `./${fileName}`);\n return parseConfigFile(file);\n}\n"],"mappings":";;;;;;AAAA,IAAAA,SAAA,GAAAC,OAAA;AAEA,IAAAC,MAAA,GAAAD,OAAA;AAEO,SAASE,gBAAgBA,CAACC,QAAgB,GAAG,cAAc,EAAE;EAClE,MAAMC,IAAI,GAAG,IAAAC,cAAI,EAACC,SAAS,EAAE,KAAKH,QAAQ,EAAE,CAAC;EAC7C,OAAO,IAAAI,sBAAe,EAACH,IAAI,CAAC;AAC9B","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/conf/index.ts"],"sourcesContent":["import { join } from 'node:path';\n\nimport { parseConfigFile } from '../parse';\n\nexport function getDefaultConfig(fileName: string = 'default.yaml') {\n const file = join(__dirname, `./${fileName}`);\n return parseConfigFile(file);\n}\n"],"mappings":";;;;AAIA,SAAgB,iBAAiB,WAAmB,gBAAgB;AAElE,QAAO,cAAA,iBAAA,GAAA,UAAA,MADW,WAAW,KAAK,WAAW,CACjB"}
@@ -0,0 +1,10 @@
1
+ import { parseConfigFile } from "../parse.mjs";
2
+ import { join } from "node:path";
3
+ //#region src/conf/index.ts
4
+ function getDefaultConfig(fileName = "default.yaml") {
5
+ return parseConfigFile(join(__dirname, `./${fileName}`));
6
+ }
7
+ //#endregion
8
+ export { getDefaultConfig };
9
+
10
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../src/conf/index.ts"],"sourcesContent":["import { join } from 'node:path';\n\nimport { parseConfigFile } from '../parse';\n\nexport function getDefaultConfig(fileName: string = 'default.yaml') {\n const file = join(__dirname, `./${fileName}`);\n return parseConfigFile(file);\n}\n"],"mappings":";;;AAIA,SAAgB,iBAAiB,WAAmB,gBAAgB;AAElE,QAAO,gBADM,KAAK,WAAW,KAAK,WAAW,CACjB"}
@@ -1,187 +1,176 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.findConfigFile = findConfigFile;
7
- exports.readDefaultConfig = readDefaultConfig;
8
- var _debug = _interopRequireDefault(require("debug"));
9
- var _lodash = _interopRequireDefault(require("lodash"));
10
- var _nodeFs = _interopRequireDefault(require("node:fs"));
11
- var _nodeOs = _interopRequireDefault(require("node:os"));
12
- var _nodePath = _interopRequireDefault(require("node:path"));
13
- var _configUtils = require("./config-utils");
14
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
15
- const CONFIG_FILE = 'config.yaml';
16
- const XDG = 'xdg';
17
- const pkgJSON = {
18
- name: 'verdaccio'
19
- };
20
- const debug = (0, _debug.default)('verdaccio:config:config-path');
21
-
1
+ const require_runtime = require("./_virtual/_rolldown/runtime.js");
2
+ const require_config_utils = require("./config-utils.js");
3
+ let debug = require("debug");
4
+ debug = require_runtime.__toESM(debug);
5
+ let lodash = require("lodash");
6
+ lodash = require_runtime.__toESM(lodash);
7
+ let node_fs = require("node:fs");
8
+ node_fs = require_runtime.__toESM(node_fs);
9
+ let node_os = require("node:os");
10
+ node_os = require_runtime.__toESM(node_os);
11
+ let node_path = require("node:path");
12
+ node_path = require_runtime.__toESM(node_path);
13
+ //#region src/config-path.ts
14
+ var CONFIG_FILE = "config.yaml";
15
+ var XDG = "xdg";
16
+ var pkgJSON = { name: "verdaccio" };
17
+ var debug$1 = (0, debug.default)("verdaccio:config:config-path");
22
18
  /**
23
- * Find and get the first config file that match.
24
- * @return {String} the config file path
25
- */
19
+ * Find and get the first config file that match.
20
+ * @return {String} the config file path
21
+ */
26
22
  function findConfigFile(configPath) {
27
- debug('searching for config file %o', configPath);
28
- if (typeof configPath !== 'undefined') {
29
- const configLocation = _nodePath.default.resolve(configPath);
30
- debug('custom location %s', configLocation);
31
- return configLocation;
32
- }
33
- const configPaths = getConfigPaths();
34
- debug('%o posible locations found', configPaths.length);
35
- if (configPaths.length === 0) {
36
- debug('no configuration files can be processed');
37
- // this should never happens
38
- throw new Error('no configuration files can be processed');
39
- }
40
-
41
- // find the first location that already exist
42
- const primaryConf = _lodash.default.find(configPaths, configLocation => (0, _configUtils.fileExists)(configLocation.path));
43
- if (typeof primaryConf !== 'undefined') {
44
- debug('at least one primary location detected at %s', primaryConf?.path);
45
- return primaryConf.path;
46
- }
47
- debug('no previous location found, creating a new one');
48
- debug('generating the first match path location %s', configPaths[0].path);
49
- return createConfigFile(configPaths[0]).path;
23
+ debug$1("searching for config file %o", configPath);
24
+ if (typeof configPath !== "undefined") {
25
+ const configLocation = node_path.default.resolve(configPath);
26
+ debug$1("custom location %s", configLocation);
27
+ return configLocation;
28
+ }
29
+ const configPaths = getConfigPaths();
30
+ debug$1("%o posible locations found", configPaths.length);
31
+ if (configPaths.length === 0) {
32
+ debug$1("no configuration files can be processed");
33
+ throw new Error("no configuration files can be processed");
34
+ }
35
+ const primaryConf = lodash.default.find(configPaths, (configLocation) => require_config_utils.fileExists(configLocation.path));
36
+ if (typeof primaryConf !== "undefined") {
37
+ debug$1("at least one primary location detected at %s", primaryConf?.path);
38
+ return primaryConf.path;
39
+ }
40
+ debug$1("no previous location found, creating a new one");
41
+ debug$1("generating the first match path location %s", configPaths[0].path);
42
+ return createConfigFile(configPaths[0]).path;
50
43
  }
51
44
  function createConfigFile(configLocation) {
52
- createConfigFolder(configLocation);
53
- const defaultConfig = updateStorageLinks(configLocation, readDefaultConfig());
54
- _nodeFs.default.writeFileSync(configLocation.path, defaultConfig);
55
- return configLocation;
45
+ createConfigFolder(configLocation);
46
+ const defaultConfig = updateStorageLinks(configLocation, readDefaultConfig());
47
+ node_fs.default.writeFileSync(configLocation.path, defaultConfig);
48
+ return configLocation;
56
49
  }
57
50
  function readDefaultConfig() {
58
- const pathDefaultConf = _nodePath.default.resolve(__dirname, 'conf/default.yaml');
59
- try {
60
- debug('the path of default config used from %s', pathDefaultConf);
61
- _nodeFs.default.accessSync(pathDefaultConf, _nodeFs.default.constants.R_OK);
62
- debug('configuration file has enough permissions for reading');
63
- } catch {
64
- debug('configuration file does not have enough permissions for reading');
65
- throw new TypeError('configuration file does not have enough permissions for reading');
66
- }
67
- return _nodeFs.default.readFileSync(pathDefaultConf, 'utf8');
51
+ const pathDefaultConf = node_path.default.resolve(__dirname, "conf/default.yaml");
52
+ try {
53
+ debug$1("the path of default config used from %s", pathDefaultConf);
54
+ node_fs.default.accessSync(pathDefaultConf, node_fs.default.constants.R_OK);
55
+ debug$1("configuration file has enough permissions for reading");
56
+ } catch {
57
+ debug$1("configuration file does not have enough permissions for reading");
58
+ throw new TypeError("configuration file does not have enough permissions for reading");
59
+ }
60
+ return node_fs.default.readFileSync(pathDefaultConf, "utf8");
68
61
  }
69
62
  function createConfigFolder(configLocation) {
70
- const folder = _nodePath.default.dirname(configLocation.path);
71
- debug(`creating default config file folder at %o`, folder);
72
- _nodeFs.default.mkdirSync(folder, {
73
- recursive: true
74
- });
75
- debug(`folder %o created`, folder);
63
+ const folder = node_path.default.dirname(configLocation.path);
64
+ debug$1(`creating default config file folder at %o`, folder);
65
+ node_fs.default.mkdirSync(folder, { recursive: true });
66
+ debug$1(`folder %o created`, folder);
76
67
  }
77
-
78
68
  /**
79
- * Update the storage links to the new location if it is necessary.
80
- * @param configLocation
81
- * @param defaultConfig
82
- * @returns
83
- */
69
+ * Update the storage links to the new location if it is necessary.
70
+ * @param configLocation
71
+ * @param defaultConfig
72
+ * @returns
73
+ */
84
74
  function updateStorageLinks(configLocation, defaultConfig) {
85
- debug('checking storage links for %s and type %s', configLocation.path, configLocation.type);
86
- if (configLocation.type !== XDG) {
87
- debug(`skip storage override for %s`, configLocation.type);
88
- return defaultConfig;
89
- }
90
-
91
- // $XDG_DATA_HOME defines the base directory relative to which user specific data
92
- // files should be stored, If $XDG_DATA_HOME is either not set or empty, a default
93
- // equal to $HOME/.local/share should be used.
94
- let dataDir = process.env.XDG_DATA_HOME || _nodePath.default.join(process.env.HOME, '.local', 'share');
95
- if ((0, _configUtils.folderExists)(dataDir)) {
96
- debug(`previous storage located`);
97
- debug(`update storage links to %s`, dataDir);
98
- dataDir = _nodePath.default.resolve(_nodePath.default.join(dataDir, pkgJSON.name, 'storage'));
99
- return defaultConfig.replace(/^storage: .\/storage$/m, `storage: ${dataDir}`);
100
- }
101
- debug(`could not find a previous storage location, skip override`);
102
- return defaultConfig;
75
+ debug$1("checking storage links for %s and type %s", configLocation.path, configLocation.type);
76
+ if (configLocation.type !== XDG) {
77
+ debug$1(`skip storage override for %s`, configLocation.type);
78
+ return defaultConfig;
79
+ }
80
+ let dataDir = process.env.XDG_DATA_HOME || node_path.default.join(process.env.HOME, ".local", "share");
81
+ if (require_config_utils.folderExists(dataDir)) {
82
+ debug$1(`previous storage located`);
83
+ debug$1(`update storage links to %s`, dataDir);
84
+ dataDir = node_path.default.resolve(node_path.default.join(dataDir, pkgJSON.name, "storage"));
85
+ return defaultConfig.replace(/^storage: .\/storage$/m, `storage: ${dataDir}`);
86
+ }
87
+ debug$1(`could not find a previous storage location, skip override`);
88
+ return defaultConfig;
103
89
  }
104
-
105
90
  /**
106
- * Return a list of configuration locations by platform.
107
- * @returns
108
- */
91
+ * Return a list of configuration locations by platform.
92
+ * @returns
93
+ */
109
94
  function getConfigPaths() {
110
- const listPaths = [getXDGDirectory(), getWindowsDirectory(), getRelativeDefaultDirectory(), getOldDirectory()];
111
- return listPaths.reduce(function (acc, currentValue) {
112
- if (typeof currentValue !== 'undefined') {
113
- debug('posible directory path generated %s for type %s', currentValue?.path, currentValue.type);
114
- acc.push(currentValue);
115
- }
116
- return acc;
117
- }, []);
95
+ return [
96
+ getXDGDirectory(),
97
+ getWindowsDirectory(),
98
+ getRelativeDefaultDirectory(),
99
+ getOldDirectory()
100
+ ].reduce(function(acc, currentValue) {
101
+ if (typeof currentValue !== "undefined") {
102
+ debug$1("posible directory path generated %s for type %s", currentValue?.path, currentValue.type);
103
+ acc.push(currentValue);
104
+ }
105
+ return acc;
106
+ }, []);
118
107
  }
119
-
120
108
  /**
121
- * Get XDG_CONFIG_HOME or HOME location (usually unix)
122
- *
123
- * The XDG_CONFIG_HOME environment variable is also part of the XDG Base Directory Specification,
124
- * which aims to standardize the locations where applications store configuration files and other
125
- * user-specific data on Unix-like operating systems.
126
- *
127
- *
128
- *
129
- * https://specifications.freedesktop.org/basedir-spec/latest/
130
- *
131
- *
132
- * @returns
133
- */
134
- const getXDGDirectory = () => {
135
- const xDGConfigPath = process.env.XDG_CONFIG_HOME || process.env.HOME && _nodePath.default.join(process.env.HOME, '.config');
136
- debug('XDGConfig folder path %s', xDGConfigPath);
137
- if (xDGConfigPath && (0, _configUtils.folderExists)(xDGConfigPath)) {
138
- debug('XDGConfig folder path %s', xDGConfigPath);
139
- return {
140
- path: _nodePath.default.join(xDGConfigPath, pkgJSON.name, CONFIG_FILE),
141
- type: XDG
142
- };
143
- }
109
+ * Get XDG_CONFIG_HOME or HOME location (usually unix)
110
+ *
111
+ * The XDG_CONFIG_HOME environment variable is also part of the XDG Base Directory Specification,
112
+ * which aims to standardize the locations where applications store configuration files and other
113
+ * user-specific data on Unix-like operating systems.
114
+ *
115
+ *
116
+ *
117
+ * https://specifications.freedesktop.org/basedir-spec/latest/
118
+ *
119
+ *
120
+ * @returns
121
+ */
122
+ var getXDGDirectory = () => {
123
+ const xDGConfigPath = process.env.XDG_CONFIG_HOME || process.env.HOME && node_path.default.join(process.env.HOME, ".config");
124
+ debug$1("XDGConfig folder path %s", xDGConfigPath);
125
+ if (xDGConfigPath && require_config_utils.folderExists(xDGConfigPath)) {
126
+ debug$1("XDGConfig folder path %s", xDGConfigPath);
127
+ return {
128
+ path: node_path.default.join(xDGConfigPath, pkgJSON.name, CONFIG_FILE),
129
+ type: XDG
130
+ };
131
+ }
144
132
  };
145
-
146
133
  /**
147
- * Detect windows location, APPDATA
148
- * usually something like C:\User\<Build User>\AppData\Local
149
- * @returns
150
- */
151
- const getWindowsDirectory = () => {
152
- if (_nodeOs.default.platform() === 'win32' && process.env.APPDATA && (0, _configUtils.folderExists)(process.env.APPDATA)) {
153
- debug('windows appdata folder path %s', process.env.APPDATA);
154
- return {
155
- path: _nodePath.default.resolve(_nodePath.default.join(process.env.APPDATA, pkgJSON.name, CONFIG_FILE)),
156
- type: 'win'
157
- };
158
- }
134
+ * Detect windows location, APPDATA
135
+ * usually something like C:\User\<Build User>\AppData\Local
136
+ * @returns
137
+ */
138
+ var getWindowsDirectory = () => {
139
+ if (node_os.default.platform() === "win32" && process.env.APPDATA && require_config_utils.folderExists(process.env.APPDATA)) {
140
+ debug$1("windows appdata folder path %s", process.env.APPDATA);
141
+ return {
142
+ path: node_path.default.resolve(node_path.default.join(process.env.APPDATA, pkgJSON.name, CONFIG_FILE)),
143
+ type: "win"
144
+ };
145
+ }
159
146
  };
160
-
161
147
  /**
162
- * Return relative directory, this is the default.
163
- * It will cretate config in your {currentLocation/verdaccio/config.yaml}
164
- * @returns
165
- */
166
- const getRelativeDefaultDirectory = () => {
167
- const relativePath = _nodePath.default.resolve(_nodePath.default.join('.', pkgJSON.name, CONFIG_FILE));
168
- debug('relative folder path %s', relativePath);
169
- return {
170
- path: relativePath,
171
- type: 'def'
172
- };
148
+ * Return relative directory, this is the default.
149
+ * It will cretate config in your {currentLocation/verdaccio/config.yaml}
150
+ * @returns
151
+ */
152
+ var getRelativeDefaultDirectory = () => {
153
+ const relativePath = node_path.default.resolve(node_path.default.join(".", pkgJSON.name, CONFIG_FILE));
154
+ debug$1("relative folder path %s", relativePath);
155
+ return {
156
+ path: relativePath,
157
+ type: "def"
158
+ };
173
159
  };
174
-
175
160
  /**
176
- * This should never happens, consider it DEPRECATED
177
- * @returns
178
- */
179
- const getOldDirectory = () => {
180
- const oldPath = _nodePath.default.resolve(_nodePath.default.join('.', CONFIG_FILE));
181
- debug('old folder path %s', oldPath);
182
- return {
183
- path: oldPath,
184
- type: 'old'
185
- };
161
+ * This should never happens, consider it DEPRECATED
162
+ * @returns
163
+ */
164
+ var getOldDirectory = () => {
165
+ const oldPath = node_path.default.resolve(node_path.default.join(".", CONFIG_FILE));
166
+ debug$1("old folder path %s", oldPath);
167
+ return {
168
+ path: oldPath,
169
+ type: "old"
170
+ };
186
171
  };
172
+ //#endregion
173
+ exports.findConfigFile = findConfigFile;
174
+ exports.readDefaultConfig = readDefaultConfig;
175
+
187
176
  //# sourceMappingURL=config-path.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config-path.js","names":["_debug","_interopRequireDefault","require","_lodash","_nodeFs","_nodeOs","_nodePath","_configUtils","e","__esModule","default","CONFIG_FILE","XDG","pkgJSON","name","debug","buildDebug","findConfigFile","configPath","configLocation","path","resolve","configPaths","getConfigPaths","length","Error","primaryConf","_","find","fileExists","createConfigFile","createConfigFolder","defaultConfig","updateStorageLinks","readDefaultConfig","fs","writeFileSync","pathDefaultConf","__dirname","accessSync","constants","R_OK","TypeError","readFileSync","folder","dirname","mkdirSync","recursive","type","dataDir","process","env","XDG_DATA_HOME","join","HOME","folderExists","replace","listPaths","getXDGDirectory","getWindowsDirectory","getRelativeDefaultDirectory","getOldDirectory","reduce","acc","currentValue","push","xDGConfigPath","XDG_CONFIG_HOME","os","platform","APPDATA","relativePath","oldPath"],"sources":["../src/config-path.ts"],"sourcesContent":["import buildDebug from 'debug';\nimport _ from 'lodash';\nimport fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\n\nimport { fileExists, folderExists } from './config-utils';\n\nconst CONFIG_FILE = 'config.yaml';\nconst XDG = 'xdg';\n\nconst pkgJSON = {\n name: 'verdaccio',\n};\n\nexport type SetupDirectory = {\n path: string;\n type: 'xdg' | 'win' | 'win32' | 'def' | 'old';\n};\n\nconst debug = buildDebug('verdaccio:config:config-path');\n\n/**\n * Find and get the first config file that match.\n * @return {String} the config file path\n */\nfunction findConfigFile(configPath?: string): string {\n debug('searching for config file %o', configPath);\n if (typeof configPath !== 'undefined') {\n const configLocation = path.resolve(configPath);\n debug('custom location %s', configLocation);\n return configLocation;\n }\n\n const configPaths: SetupDirectory[] = getConfigPaths();\n debug('%o posible locations found', configPaths.length);\n if (configPaths.length === 0) {\n debug('no configuration files can be processed');\n // this should never happens\n throw new Error('no configuration files can be processed');\n }\n\n // find the first location that already exist\n const primaryConf: SetupDirectory | void = _.find(configPaths, (configLocation: SetupDirectory) =>\n fileExists(configLocation.path)\n );\n\n if (typeof primaryConf !== 'undefined') {\n debug('at least one primary location detected at %s', primaryConf?.path);\n return primaryConf.path;\n }\n debug('no previous location found, creating a new one');\n debug('generating the first match path location %s', configPaths[0].path);\n return createConfigFile(configPaths[0]).path;\n}\n\nfunction createConfigFile(configLocation: SetupDirectory): SetupDirectory {\n createConfigFolder(configLocation);\n\n const defaultConfig = updateStorageLinks(configLocation, readDefaultConfig());\n\n fs.writeFileSync(configLocation.path, defaultConfig);\n\n return configLocation;\n}\n\nexport function readDefaultConfig(): string {\n const pathDefaultConf: string = path.resolve(__dirname, 'conf/default.yaml');\n try {\n debug('the path of default config used from %s', pathDefaultConf);\n fs.accessSync(pathDefaultConf, fs.constants.R_OK);\n debug('configuration file has enough permissions for reading');\n } catch {\n debug('configuration file does not have enough permissions for reading');\n throw new TypeError('configuration file does not have enough permissions for reading');\n }\n\n return fs.readFileSync(pathDefaultConf, 'utf8');\n}\n\nfunction createConfigFolder(configLocation: SetupDirectory): void {\n const folder = path.dirname(configLocation.path);\n debug(`creating default config file folder at %o`, folder);\n fs.mkdirSync(folder, { recursive: true });\n debug(`folder %o created`, folder);\n}\n\n/**\n * Update the storage links to the new location if it is necessary.\n * @param configLocation\n * @param defaultConfig\n * @returns\n */\nfunction updateStorageLinks(configLocation: SetupDirectory, defaultConfig: string): string {\n debug('checking storage links for %s and type %s', configLocation.path, configLocation.type);\n if (configLocation.type !== XDG) {\n debug(`skip storage override for %s`, configLocation.type);\n return defaultConfig;\n }\n\n // $XDG_DATA_HOME defines the base directory relative to which user specific data\n // files should be stored, If $XDG_DATA_HOME is either not set or empty, a default\n // equal to $HOME/.local/share should be used.\n let dataDir =\n process.env.XDG_DATA_HOME || path.join(process.env.HOME as string, '.local', 'share');\n if (folderExists(dataDir)) {\n debug(`previous storage located`);\n debug(`update storage links to %s`, dataDir);\n dataDir = path.resolve(path.join(dataDir, pkgJSON.name, 'storage'));\n return defaultConfig.replace(/^storage: .\\/storage$/m, `storage: ${dataDir}`);\n }\n debug(`could not find a previous storage location, skip override`);\n return defaultConfig;\n}\n\n/**\n * Return a list of configuration locations by platform.\n * @returns\n */\nfunction getConfigPaths(): SetupDirectory[] {\n const listPaths: (SetupDirectory | void)[] = [\n getXDGDirectory(),\n getWindowsDirectory(),\n getRelativeDefaultDirectory(),\n getOldDirectory(),\n ];\n\n return listPaths.reduce(function (acc, currentValue: SetupDirectory | void): SetupDirectory[] {\n if (typeof currentValue !== 'undefined') {\n debug(\n 'posible directory path generated %s for type %s',\n currentValue?.path,\n currentValue.type\n );\n acc.push(currentValue);\n }\n return acc;\n }, [] as SetupDirectory[]);\n}\n\n/**\n * Get XDG_CONFIG_HOME or HOME location (usually unix)\n *\n * The XDG_CONFIG_HOME environment variable is also part of the XDG Base Directory Specification,\n * which aims to standardize the locations where applications store configuration files and other\n * user-specific data on Unix-like operating systems.\n *\n *\n *\n * https://specifications.freedesktop.org/basedir-spec/latest/\n *\n *\n * @returns\n */\nconst getXDGDirectory = (): SetupDirectory | void => {\n const xDGConfigPath =\n process.env.XDG_CONFIG_HOME || (process.env.HOME && path.join(process.env.HOME, '.config'));\n debug('XDGConfig folder path %s', xDGConfigPath);\n if (xDGConfigPath && folderExists(xDGConfigPath)) {\n debug('XDGConfig folder path %s', xDGConfigPath);\n return {\n path: path.join(xDGConfigPath, pkgJSON.name, CONFIG_FILE),\n type: XDG,\n };\n }\n};\n\n/**\n * Detect windows location, APPDATA\n * usually something like C:\\User\\<Build User>\\AppData\\Local\n * @returns\n */\nconst getWindowsDirectory = (): SetupDirectory | void => {\n if (os.platform() === 'win32' && process.env.APPDATA && folderExists(process.env.APPDATA)) {\n debug('windows appdata folder path %s', process.env.APPDATA);\n return {\n path: path.resolve(path.join(process.env.APPDATA, pkgJSON.name, CONFIG_FILE)),\n type: 'win',\n };\n }\n};\n\n/**\n * Return relative directory, this is the default.\n * It will cretate config in your {currentLocation/verdaccio/config.yaml}\n * @returns\n */\nconst getRelativeDefaultDirectory = (): SetupDirectory => {\n const relativePath = path.resolve(path.join('.', pkgJSON.name, CONFIG_FILE));\n debug('relative folder path %s', relativePath);\n return {\n path: relativePath,\n type: 'def',\n };\n};\n\n/**\n * This should never happens, consider it DEPRECATED\n * @returns\n */\nconst getOldDirectory = (): SetupDirectory => {\n const oldPath = path.resolve(path.join('.', CONFIG_FILE));\n debug('old folder path %s', oldPath);\n return {\n path: oldPath,\n type: 'old',\n };\n};\n\nexport { findConfigFile };\n"],"mappings":";;;;;;;AAAA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,OAAA,GAAAF,sBAAA,CAAAC,OAAA;AACA,IAAAE,OAAA,GAAAH,sBAAA,CAAAC,OAAA;AACA,IAAAG,OAAA,GAAAJ,sBAAA,CAAAC,OAAA;AACA,IAAAI,SAAA,GAAAL,sBAAA,CAAAC,OAAA;AAEA,IAAAK,YAAA,GAAAL,OAAA;AAA0D,SAAAD,uBAAAO,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAE1D,MAAMG,WAAW,GAAG,aAAa;AACjC,MAAMC,GAAG,GAAG,KAAK;AAEjB,MAAMC,OAAO,GAAG;EACdC,IAAI,EAAE;AACR,CAAC;AAOD,MAAMC,KAAK,GAAG,IAAAC,cAAU,EAAC,8BAA8B,CAAC;;AAExD;AACA;AACA;AACA;AACA,SAASC,cAAcA,CAACC,UAAmB,EAAU;EACnDH,KAAK,CAAC,8BAA8B,EAAEG,UAAU,CAAC;EACjD,IAAI,OAAOA,UAAU,KAAK,WAAW,EAAE;IACrC,MAAMC,cAAc,GAAGC,iBAAI,CAACC,OAAO,CAACH,UAAU,CAAC;IAC/CH,KAAK,CAAC,oBAAoB,EAAEI,cAAc,CAAC;IAC3C,OAAOA,cAAc;EACvB;EAEA,MAAMG,WAA6B,GAAGC,cAAc,CAAC,CAAC;EACtDR,KAAK,CAAC,4BAA4B,EAAEO,WAAW,CAACE,MAAM,CAAC;EACvD,IAAIF,WAAW,CAACE,MAAM,KAAK,CAAC,EAAE;IAC5BT,KAAK,CAAC,yCAAyC,CAAC;IAChD;IACA,MAAM,IAAIU,KAAK,CAAC,yCAAyC,CAAC;EAC5D;;EAEA;EACA,MAAMC,WAAkC,GAAGC,eAAC,CAACC,IAAI,CAACN,WAAW,EAAGH,cAA8B,IAC5F,IAAAU,uBAAU,EAACV,cAAc,CAACC,IAAI,CAChC,CAAC;EAED,IAAI,OAAOM,WAAW,KAAK,WAAW,EAAE;IACtCX,KAAK,CAAC,8CAA8C,EAAEW,WAAW,EAAEN,IAAI,CAAC;IACxE,OAAOM,WAAW,CAACN,IAAI;EACzB;EACAL,KAAK,CAAC,gDAAgD,CAAC;EACvDA,KAAK,CAAC,8CAA8C,EAAEO,WAAW,CAAC,CAAC,CAAC,CAACF,IAAI,CAAC;EAC1E,OAAOU,gBAAgB,CAACR,WAAW,CAAC,CAAC,CAAC,CAAC,CAACF,IAAI;AAC9C;AAEA,SAASU,gBAAgBA,CAACX,cAA8B,EAAkB;EACxEY,kBAAkB,CAACZ,cAAc,CAAC;EAElC,MAAMa,aAAa,GAAGC,kBAAkB,CAACd,cAAc,EAAEe,iBAAiB,CAAC,CAAC,CAAC;EAE7EC,eAAE,CAACC,aAAa,CAACjB,cAAc,CAACC,IAAI,EAAEY,aAAa,CAAC;EAEpD,OAAOb,cAAc;AACvB;AAEO,SAASe,iBAAiBA,CAAA,EAAW;EAC1C,MAAMG,eAAuB,GAAGjB,iBAAI,CAACC,OAAO,CAACiB,SAAS,EAAE,mBAAmB,CAAC;EAC5E,IAAI;IACFvB,KAAK,CAAC,yCAAyC,EAAEsB,eAAe,CAAC;IACjEF,eAAE,CAACI,UAAU,CAACF,eAAe,EAAEF,eAAE,CAACK,SAAS,CAACC,IAAI,CAAC;IACjD1B,KAAK,CAAC,uDAAuD,CAAC;EAChE,CAAC,CAAC,MAAM;IACNA,KAAK,CAAC,iEAAiE,CAAC;IACxE,MAAM,IAAI2B,SAAS,CAAC,iEAAiE,CAAC;EACxF;EAEA,OAAOP,eAAE,CAACQ,YAAY,CAACN,eAAe,EAAE,MAAM,CAAC;AACjD;AAEA,SAASN,kBAAkBA,CAACZ,cAA8B,EAAQ;EAChE,MAAMyB,MAAM,GAAGxB,iBAAI,CAACyB,OAAO,CAAC1B,cAAc,CAACC,IAAI,CAAC;EAChDL,KAAK,CAAC,2CAA2C,EAAE6B,MAAM,CAAC;EAC1DT,eAAE,CAACW,SAAS,CAACF,MAAM,EAAE;IAAEG,SAAS,EAAE;EAAK,CAAC,CAAC;EACzChC,KAAK,CAAC,mBAAmB,EAAE6B,MAAM,CAAC;AACpC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAASX,kBAAkBA,CAACd,cAA8B,EAAEa,aAAqB,EAAU;EACzFjB,KAAK,CAAC,2CAA2C,EAAEI,cAAc,CAACC,IAAI,EAAED,cAAc,CAAC6B,IAAI,CAAC;EAC5F,IAAI7B,cAAc,CAAC6B,IAAI,KAAKpC,GAAG,EAAE;IAC/BG,KAAK,CAAC,8BAA8B,EAAEI,cAAc,CAAC6B,IAAI,CAAC;IAC1D,OAAOhB,aAAa;EACtB;;EAEA;EACA;EACA;EACA,IAAIiB,OAAO,GACTC,OAAO,CAACC,GAAG,CAACC,aAAa,IAAIhC,iBAAI,CAACiC,IAAI,CAACH,OAAO,CAACC,GAAG,CAACG,IAAI,EAAY,QAAQ,EAAE,OAAO,CAAC;EACvF,IAAI,IAAAC,yBAAY,EAACN,OAAO,CAAC,EAAE;IACzBlC,KAAK,CAAC,0BAA0B,CAAC;IACjCA,KAAK,CAAC,4BAA4B,EAAEkC,OAAO,CAAC;IAC5CA,OAAO,GAAG7B,iBAAI,CAACC,OAAO,CAACD,iBAAI,CAACiC,IAAI,CAACJ,OAAO,EAAEpC,OAAO,CAACC,IAAI,EAAE,SAAS,CAAC,CAAC;IACnE,OAAOkB,aAAa,CAACwB,OAAO,CAAC,wBAAwB,EAAE,YAAYP,OAAO,EAAE,CAAC;EAC/E;EACAlC,KAAK,CAAC,2DAA2D,CAAC;EAClE,OAAOiB,aAAa;AACtB;;AAEA;AACA;AACA;AACA;AACA,SAAST,cAAcA,CAAA,EAAqB;EAC1C,MAAMkC,SAAoC,GAAG,CAC3CC,eAAe,CAAC,CAAC,EACjBC,mBAAmB,CAAC,CAAC,EACrBC,2BAA2B,CAAC,CAAC,EAC7BC,eAAe,CAAC,CAAC,CAClB;EAED,OAAOJ,SAAS,CAACK,MAAM,CAAC,UAAUC,GAAG,EAAEC,YAAmC,EAAoB;IAC5F,IAAI,OAAOA,YAAY,KAAK,WAAW,EAAE;MACvCjD,KAAK,CACH,iDAAiD,EACjDiD,YAAY,EAAE5C,IAAI,EAClB4C,YAAY,CAAChB,IACf,CAAC;MACDe,GAAG,CAACE,IAAI,CAACD,YAAY,CAAC;IACxB;IACA,OAAOD,GAAG;EACZ,CAAC,EAAE,EAAsB,CAAC;AAC5B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAML,eAAe,GAAGA,CAAA,KAA6B;EACnD,MAAMQ,aAAa,GACjBhB,OAAO,CAACC,GAAG,CAACgB,eAAe,IAAKjB,OAAO,CAACC,GAAG,CAACG,IAAI,IAAIlC,iBAAI,CAACiC,IAAI,CAACH,OAAO,CAACC,GAAG,CAACG,IAAI,EAAE,SAAS,CAAE;EAC7FvC,KAAK,CAAC,0BAA0B,EAAEmD,aAAa,CAAC;EAChD,IAAIA,aAAa,IAAI,IAAAX,yBAAY,EAACW,aAAa,CAAC,EAAE;IAChDnD,KAAK,CAAC,0BAA0B,EAAEmD,aAAa,CAAC;IAChD,OAAO;MACL9C,IAAI,EAAEA,iBAAI,CAACiC,IAAI,CAACa,aAAa,EAAErD,OAAO,CAACC,IAAI,EAAEH,WAAW,CAAC;MACzDqC,IAAI,EAAEpC;IACR,CAAC;EACH;AACF,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,MAAM+C,mBAAmB,GAAGA,CAAA,KAA6B;EACvD,IAAIS,eAAE,CAACC,QAAQ,CAAC,CAAC,KAAK,OAAO,IAAInB,OAAO,CAACC,GAAG,CAACmB,OAAO,IAAI,IAAAf,yBAAY,EAACL,OAAO,CAACC,GAAG,CAACmB,OAAO,CAAC,EAAE;IACzFvD,KAAK,CAAC,gCAAgC,EAAEmC,OAAO,CAACC,GAAG,CAACmB,OAAO,CAAC;IAC5D,OAAO;MACLlD,IAAI,EAAEA,iBAAI,CAACC,OAAO,CAACD,iBAAI,CAACiC,IAAI,CAACH,OAAO,CAACC,GAAG,CAACmB,OAAO,EAAEzD,OAAO,CAACC,IAAI,EAAEH,WAAW,CAAC,CAAC;MAC7EqC,IAAI,EAAE;IACR,CAAC;EACH;AACF,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,MAAMY,2BAA2B,GAAGA,CAAA,KAAsB;EACxD,MAAMW,YAAY,GAAGnD,iBAAI,CAACC,OAAO,CAACD,iBAAI,CAACiC,IAAI,CAAC,GAAG,EAAExC,OAAO,CAACC,IAAI,EAAEH,WAAW,CAAC,CAAC;EAC5EI,KAAK,CAAC,yBAAyB,EAAEwD,YAAY,CAAC;EAC9C,OAAO;IACLnD,IAAI,EAAEmD,YAAY;IAClBvB,IAAI,EAAE;EACR,CAAC;AACH,CAAC;;AAED;AACA;AACA;AACA;AACA,MAAMa,eAAe,GAAGA,CAAA,KAAsB;EAC5C,MAAMW,OAAO,GAAGpD,iBAAI,CAACC,OAAO,CAACD,iBAAI,CAACiC,IAAI,CAAC,GAAG,EAAE1C,WAAW,CAAC,CAAC;EACzDI,KAAK,CAAC,oBAAoB,EAAEyD,OAAO,CAAC;EACpC,OAAO;IACLpD,IAAI,EAAEoD,OAAO;IACbxB,IAAI,EAAE;EACR,CAAC;AACH,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"config-path.js","names":[],"sources":["../src/config-path.ts"],"sourcesContent":["import buildDebug from 'debug';\nimport _ from 'lodash';\nimport fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\n\nimport { fileExists, folderExists } from './config-utils';\n\nconst CONFIG_FILE = 'config.yaml';\nconst XDG = 'xdg';\n\nconst pkgJSON = {\n name: 'verdaccio',\n};\n\nexport type SetupDirectory = {\n path: string;\n type: 'xdg' | 'win' | 'win32' | 'def' | 'old';\n};\n\nconst debug = buildDebug('verdaccio:config:config-path');\n\n/**\n * Find and get the first config file that match.\n * @return {String} the config file path\n */\nfunction findConfigFile(configPath?: string): string {\n debug('searching for config file %o', configPath);\n if (typeof configPath !== 'undefined') {\n const configLocation = path.resolve(configPath);\n debug('custom location %s', configLocation);\n return configLocation;\n }\n\n const configPaths: SetupDirectory[] = getConfigPaths();\n debug('%o posible locations found', configPaths.length);\n if (configPaths.length === 0) {\n debug('no configuration files can be processed');\n // this should never happens\n throw new Error('no configuration files can be processed');\n }\n\n // find the first location that already exist\n const primaryConf: SetupDirectory | void = _.find(configPaths, (configLocation: SetupDirectory) =>\n fileExists(configLocation.path)\n );\n\n if (typeof primaryConf !== 'undefined') {\n debug('at least one primary location detected at %s', primaryConf?.path);\n return primaryConf.path;\n }\n debug('no previous location found, creating a new one');\n debug('generating the first match path location %s', configPaths[0].path);\n return createConfigFile(configPaths[0]).path;\n}\n\nfunction createConfigFile(configLocation: SetupDirectory): SetupDirectory {\n createConfigFolder(configLocation);\n\n const defaultConfig = updateStorageLinks(configLocation, readDefaultConfig());\n\n fs.writeFileSync(configLocation.path, defaultConfig);\n\n return configLocation;\n}\n\nexport function readDefaultConfig(): string {\n const pathDefaultConf: string = path.resolve(__dirname, 'conf/default.yaml');\n try {\n debug('the path of default config used from %s', pathDefaultConf);\n fs.accessSync(pathDefaultConf, fs.constants.R_OK);\n debug('configuration file has enough permissions for reading');\n } catch {\n debug('configuration file does not have enough permissions for reading');\n throw new TypeError('configuration file does not have enough permissions for reading');\n }\n\n return fs.readFileSync(pathDefaultConf, 'utf8');\n}\n\nfunction createConfigFolder(configLocation: SetupDirectory): void {\n const folder = path.dirname(configLocation.path);\n debug(`creating default config file folder at %o`, folder);\n fs.mkdirSync(folder, { recursive: true });\n debug(`folder %o created`, folder);\n}\n\n/**\n * Update the storage links to the new location if it is necessary.\n * @param configLocation\n * @param defaultConfig\n * @returns\n */\nfunction updateStorageLinks(configLocation: SetupDirectory, defaultConfig: string): string {\n debug('checking storage links for %s and type %s', configLocation.path, configLocation.type);\n if (configLocation.type !== XDG) {\n debug(`skip storage override for %s`, configLocation.type);\n return defaultConfig;\n }\n\n // $XDG_DATA_HOME defines the base directory relative to which user specific data\n // files should be stored, If $XDG_DATA_HOME is either not set or empty, a default\n // equal to $HOME/.local/share should be used.\n let dataDir =\n process.env.XDG_DATA_HOME || path.join(process.env.HOME as string, '.local', 'share');\n if (folderExists(dataDir)) {\n debug(`previous storage located`);\n debug(`update storage links to %s`, dataDir);\n dataDir = path.resolve(path.join(dataDir, pkgJSON.name, 'storage'));\n return defaultConfig.replace(/^storage: .\\/storage$/m, `storage: ${dataDir}`);\n }\n debug(`could not find a previous storage location, skip override`);\n return defaultConfig;\n}\n\n/**\n * Return a list of configuration locations by platform.\n * @returns\n */\nfunction getConfigPaths(): SetupDirectory[] {\n const listPaths: (SetupDirectory | void)[] = [\n getXDGDirectory(),\n getWindowsDirectory(),\n getRelativeDefaultDirectory(),\n getOldDirectory(),\n ];\n\n return listPaths.reduce(function (acc, currentValue: SetupDirectory | void): SetupDirectory[] {\n if (typeof currentValue !== 'undefined') {\n debug(\n 'posible directory path generated %s for type %s',\n currentValue?.path,\n currentValue.type\n );\n acc.push(currentValue);\n }\n return acc;\n }, [] as SetupDirectory[]);\n}\n\n/**\n * Get XDG_CONFIG_HOME or HOME location (usually unix)\n *\n * The XDG_CONFIG_HOME environment variable is also part of the XDG Base Directory Specification,\n * which aims to standardize the locations where applications store configuration files and other\n * user-specific data on Unix-like operating systems.\n *\n *\n *\n * https://specifications.freedesktop.org/basedir-spec/latest/\n *\n *\n * @returns\n */\nconst getXDGDirectory = (): SetupDirectory | void => {\n const xDGConfigPath =\n process.env.XDG_CONFIG_HOME || (process.env.HOME && path.join(process.env.HOME, '.config'));\n debug('XDGConfig folder path %s', xDGConfigPath);\n if (xDGConfigPath && folderExists(xDGConfigPath)) {\n debug('XDGConfig folder path %s', xDGConfigPath);\n return {\n path: path.join(xDGConfigPath, pkgJSON.name, CONFIG_FILE),\n type: XDG,\n };\n }\n};\n\n/**\n * Detect windows location, APPDATA\n * usually something like C:\\User\\<Build User>\\AppData\\Local\n * @returns\n */\nconst getWindowsDirectory = (): SetupDirectory | void => {\n if (os.platform() === 'win32' && process.env.APPDATA && folderExists(process.env.APPDATA)) {\n debug('windows appdata folder path %s', process.env.APPDATA);\n return {\n path: path.resolve(path.join(process.env.APPDATA, pkgJSON.name, CONFIG_FILE)),\n type: 'win',\n };\n }\n};\n\n/**\n * Return relative directory, this is the default.\n * It will cretate config in your {currentLocation/verdaccio/config.yaml}\n * @returns\n */\nconst getRelativeDefaultDirectory = (): SetupDirectory => {\n const relativePath = path.resolve(path.join('.', pkgJSON.name, CONFIG_FILE));\n debug('relative folder path %s', relativePath);\n return {\n path: relativePath,\n type: 'def',\n };\n};\n\n/**\n * This should never happens, consider it DEPRECATED\n * @returns\n */\nconst getOldDirectory = (): SetupDirectory => {\n const oldPath = path.resolve(path.join('.', CONFIG_FILE));\n debug('old folder path %s', oldPath);\n return {\n path: oldPath,\n type: 'old',\n };\n};\n\nexport { findConfigFile };\n"],"mappings":";;;;;;;;;;;;;AAQA,IAAM,cAAc;AACpB,IAAM,MAAM;AAEZ,IAAM,UAAU,EACd,MAAM,aACP;AAOD,IAAM,WAAA,GAAA,MAAA,SAAmB,+BAA+B;;;;;AAMxD,SAAS,eAAe,YAA6B;AACnD,SAAM,gCAAgC,WAAW;AACjD,KAAI,OAAO,eAAe,aAAa;EACrC,MAAM,iBAAiB,UAAA,QAAK,QAAQ,WAAW;AAC/C,UAAM,sBAAsB,eAAe;AAC3C,SAAO;;CAGT,MAAM,cAAgC,gBAAgB;AACtD,SAAM,8BAA8B,YAAY,OAAO;AACvD,KAAI,YAAY,WAAW,GAAG;AAC5B,UAAM,0CAA0C;AAEhD,QAAM,IAAI,MAAM,0CAA0C;;CAI5D,MAAM,cAAqC,OAAA,QAAE,KAAK,cAAc,mBAC9D,qBAAA,WAAW,eAAe,KAAK,CAChC;AAED,KAAI,OAAO,gBAAgB,aAAa;AACtC,UAAM,gDAAgD,aAAa,KAAK;AACxE,SAAO,YAAY;;AAErB,SAAM,iDAAiD;AACvD,SAAM,gDAAgD,YAAY,GAAG,KAAK;AAC1E,QAAO,iBAAiB,YAAY,GAAG,CAAC;;AAG1C,SAAS,iBAAiB,gBAAgD;AACxE,oBAAmB,eAAe;CAElC,MAAM,gBAAgB,mBAAmB,gBAAgB,mBAAmB,CAAC;AAE7E,SAAA,QAAG,cAAc,eAAe,MAAM,cAAc;AAEpD,QAAO;;AAGT,SAAgB,oBAA4B;CAC1C,MAAM,kBAA0B,UAAA,QAAK,QAAQ,WAAW,oBAAoB;AAC5E,KAAI;AACF,UAAM,2CAA2C,gBAAgB;AACjE,UAAA,QAAG,WAAW,iBAAiB,QAAA,QAAG,UAAU,KAAK;AACjD,UAAM,wDAAwD;SACxD;AACN,UAAM,kEAAkE;AACxE,QAAM,IAAI,UAAU,kEAAkE;;AAGxF,QAAO,QAAA,QAAG,aAAa,iBAAiB,OAAO;;AAGjD,SAAS,mBAAmB,gBAAsC;CAChE,MAAM,SAAS,UAAA,QAAK,QAAQ,eAAe,KAAK;AAChD,SAAM,6CAA6C,OAAO;AAC1D,SAAA,QAAG,UAAU,QAAQ,EAAE,WAAW,MAAM,CAAC;AACzC,SAAM,qBAAqB,OAAO;;;;;;;;AASpC,SAAS,mBAAmB,gBAAgC,eAA+B;AACzF,SAAM,6CAA6C,eAAe,MAAM,eAAe,KAAK;AAC5F,KAAI,eAAe,SAAS,KAAK;AAC/B,UAAM,gCAAgC,eAAe,KAAK;AAC1D,SAAO;;CAMT,IAAI,UACF,QAAQ,IAAI,iBAAiB,UAAA,QAAK,KAAK,QAAQ,IAAI,MAAgB,UAAU,QAAQ;AACvF,KAAI,qBAAA,aAAa,QAAQ,EAAE;AACzB,UAAM,2BAA2B;AACjC,UAAM,8BAA8B,QAAQ;AAC5C,YAAU,UAAA,QAAK,QAAQ,UAAA,QAAK,KAAK,SAAS,QAAQ,MAAM,UAAU,CAAC;AACnE,SAAO,cAAc,QAAQ,0BAA0B,YAAY,UAAU;;AAE/E,SAAM,4DAA4D;AAClE,QAAO;;;;;;AAOT,SAAS,iBAAmC;AAQ1C,QAP6C;EAC3C,iBAAiB;EACjB,qBAAqB;EACrB,6BAA6B;EAC7B,iBAAiB;EAClB,CAEgB,OAAO,SAAU,KAAK,cAAuD;AAC5F,MAAI,OAAO,iBAAiB,aAAa;AACvC,WACE,mDACA,cAAc,MACd,aAAa,KACd;AACD,OAAI,KAAK,aAAa;;AAExB,SAAO;IACN,EAAE,CAAqB;;;;;;;;;;;;;;;;AAiB5B,IAAM,wBAA+C;CACnD,MAAM,gBACJ,QAAQ,IAAI,mBAAoB,QAAQ,IAAI,QAAQ,UAAA,QAAK,KAAK,QAAQ,IAAI,MAAM,UAAU;AAC5F,SAAM,4BAA4B,cAAc;AAChD,KAAI,iBAAiB,qBAAA,aAAa,cAAc,EAAE;AAChD,UAAM,4BAA4B,cAAc;AAChD,SAAO;GACL,MAAM,UAAA,QAAK,KAAK,eAAe,QAAQ,MAAM,YAAY;GACzD,MAAM;GACP;;;;;;;;AASL,IAAM,4BAAmD;AACvD,KAAI,QAAA,QAAG,UAAU,KAAK,WAAW,QAAQ,IAAI,WAAW,qBAAA,aAAa,QAAQ,IAAI,QAAQ,EAAE;AACzF,UAAM,kCAAkC,QAAQ,IAAI,QAAQ;AAC5D,SAAO;GACL,MAAM,UAAA,QAAK,QAAQ,UAAA,QAAK,KAAK,QAAQ,IAAI,SAAS,QAAQ,MAAM,YAAY,CAAC;GAC7E,MAAM;GACP;;;;;;;;AASL,IAAM,oCAAoD;CACxD,MAAM,eAAe,UAAA,QAAK,QAAQ,UAAA,QAAK,KAAK,KAAK,QAAQ,MAAM,YAAY,CAAC;AAC5E,SAAM,2BAA2B,aAAa;AAC9C,QAAO;EACL,MAAM;EACN,MAAM;EACP;;;;;;AAOH,IAAM,wBAAwC;CAC5C,MAAM,UAAU,UAAA,QAAK,QAAQ,UAAA,QAAK,KAAK,KAAK,YAAY,CAAC;AACzD,SAAM,sBAAsB,QAAQ;AACpC,QAAO;EACL,MAAM;EACN,MAAM;EACP"}