@salesforce/core 3.31.4 → 3.31.7

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 (153) hide show
  1. package/LICENSE.txt +11 -11
  2. package/README.md +222 -222
  3. package/lib/config/aliasesConfig.d.ts +12 -12
  4. package/lib/config/aliasesConfig.js +27 -27
  5. package/lib/config/authInfoConfig.d.ts +19 -19
  6. package/lib/config/authInfoConfig.js +34 -34
  7. package/lib/config/config.d.ts +311 -311
  8. package/lib/config/config.js +574 -574
  9. package/lib/config/configAggregator.d.ts +232 -232
  10. package/lib/config/configAggregator.js +379 -379
  11. package/lib/config/configFile.d.ts +199 -199
  12. package/lib/config/configFile.js +340 -340
  13. package/lib/config/configGroup.d.ts +141 -141
  14. package/lib/config/configGroup.js +224 -224
  15. package/lib/config/configStore.d.ts +241 -241
  16. package/lib/config/configStore.js +352 -352
  17. package/lib/config/envVars.d.ts +101 -101
  18. package/lib/config/envVars.js +456 -456
  19. package/lib/config/orgUsersConfig.d.ts +31 -31
  20. package/lib/config/orgUsersConfig.js +41 -41
  21. package/lib/config/sandboxOrgConfig.d.ts +37 -37
  22. package/lib/config/sandboxOrgConfig.js +50 -50
  23. package/lib/config/sandboxProcessCache.d.ts +16 -16
  24. package/lib/config/sandboxProcessCache.js +37 -37
  25. package/lib/config/tokensConfig.d.ts +10 -10
  26. package/lib/config/tokensConfig.js +28 -28
  27. package/lib/config/ttlConfig.d.ts +34 -34
  28. package/lib/config/ttlConfig.js +54 -54
  29. package/lib/crypto/crypto.d.ts +54 -54
  30. package/lib/crypto/crypto.js +220 -220
  31. package/lib/crypto/keyChain.d.ts +8 -8
  32. package/lib/crypto/keyChain.js +61 -61
  33. package/lib/crypto/keyChainImpl.d.ts +116 -116
  34. package/lib/crypto/keyChainImpl.js +486 -486
  35. package/lib/crypto/secureBuffer.d.ts +46 -46
  36. package/lib/crypto/secureBuffer.js +82 -82
  37. package/lib/deviceOauthService.d.ts +71 -71
  38. package/lib/deviceOauthService.js +191 -191
  39. package/lib/exported.d.ts +38 -38
  40. package/lib/exported.js +118 -118
  41. package/lib/global.d.ts +70 -70
  42. package/lib/global.js +109 -109
  43. package/lib/lifecycleEvents.d.ts +93 -93
  44. package/lib/lifecycleEvents.js +188 -188
  45. package/lib/logger.d.ts +381 -381
  46. package/lib/logger.js +734 -734
  47. package/lib/messages.d.ts +291 -291
  48. package/lib/messages.js +543 -543
  49. package/lib/org/authInfo.d.ts +344 -344
  50. package/lib/org/authInfo.js +892 -892
  51. package/lib/org/authRemover.d.ts +88 -88
  52. package/lib/org/authRemover.js +182 -182
  53. package/lib/org/connection.d.ts +197 -197
  54. package/lib/org/connection.js +395 -395
  55. package/lib/org/index.d.ts +6 -6
  56. package/lib/org/index.js +28 -28
  57. package/lib/org/org.d.ts +558 -558
  58. package/lib/org/org.js +1267 -1267
  59. package/lib/org/orgConfigProperties.d.ts +69 -69
  60. package/lib/org/orgConfigProperties.js +136 -136
  61. package/lib/org/permissionSetAssignment.d.ts +35 -35
  62. package/lib/org/permissionSetAssignment.js +125 -125
  63. package/lib/org/scratchOrgCache.d.ts +20 -20
  64. package/lib/org/scratchOrgCache.js +32 -32
  65. package/lib/org/scratchOrgCreate.d.ts +54 -54
  66. package/lib/org/scratchOrgCreate.js +216 -216
  67. package/lib/org/scratchOrgErrorCodes.d.ts +10 -10
  68. package/lib/org/scratchOrgErrorCodes.js +88 -88
  69. package/lib/org/scratchOrgFeatureDeprecation.d.ts +26 -26
  70. package/lib/org/scratchOrgFeatureDeprecation.js +109 -109
  71. package/lib/org/scratchOrgInfoApi.d.ts +68 -68
  72. package/lib/org/scratchOrgInfoApi.js +413 -413
  73. package/lib/org/scratchOrgInfoGenerator.d.ts +64 -64
  74. package/lib/org/scratchOrgInfoGenerator.js +241 -241
  75. package/lib/org/scratchOrgLifecycleEvents.d.ts +10 -10
  76. package/lib/org/scratchOrgLifecycleEvents.js +40 -40
  77. package/lib/org/scratchOrgSettingsGenerator.d.ts +78 -78
  78. package/lib/org/scratchOrgSettingsGenerator.js +276 -276
  79. package/lib/org/scratchOrgTypes.d.ts +43 -43
  80. package/lib/org/scratchOrgTypes.js +8 -8
  81. package/lib/org/user.d.ts +187 -187
  82. package/lib/org/user.js +448 -448
  83. package/lib/schema/printer.d.ts +79 -79
  84. package/lib/schema/printer.js +260 -260
  85. package/lib/schema/validator.d.ts +70 -70
  86. package/lib/schema/validator.js +169 -169
  87. package/lib/sfError.d.ts +73 -73
  88. package/lib/sfError.js +136 -136
  89. package/lib/sfProject.d.ts +357 -357
  90. package/lib/sfProject.js +671 -671
  91. package/lib/stateAggregator/accessors/aliasAccessor.d.ts +98 -98
  92. package/lib/stateAggregator/accessors/aliasAccessor.js +145 -145
  93. package/lib/stateAggregator/accessors/orgAccessor.d.ts +101 -101
  94. package/lib/stateAggregator/accessors/orgAccessor.js +240 -240
  95. package/lib/stateAggregator/accessors/sandboxAccessor.d.ts +8 -8
  96. package/lib/stateAggregator/accessors/sandboxAccessor.js +27 -27
  97. package/lib/stateAggregator/accessors/tokenAccessor.d.ts +63 -63
  98. package/lib/stateAggregator/accessors/tokenAccessor.js +79 -79
  99. package/lib/stateAggregator/index.d.ts +4 -4
  100. package/lib/stateAggregator/index.js +26 -26
  101. package/lib/stateAggregator/stateAggregator.d.ts +25 -25
  102. package/lib/stateAggregator/stateAggregator.js +45 -45
  103. package/lib/status/myDomainResolver.d.ts +66 -66
  104. package/lib/status/myDomainResolver.js +124 -124
  105. package/lib/status/pollingClient.d.ts +85 -85
  106. package/lib/status/pollingClient.js +115 -115
  107. package/lib/status/streamingClient.d.ts +244 -244
  108. package/lib/status/streamingClient.js +436 -436
  109. package/lib/status/types.d.ts +89 -89
  110. package/lib/status/types.js +17 -17
  111. package/lib/testSetup.d.ts +553 -553
  112. package/lib/testSetup.js +871 -871
  113. package/lib/util/cache.d.ts +11 -11
  114. package/lib/util/cache.js +69 -69
  115. package/lib/util/checkLightningDomain.d.ts +1 -1
  116. package/lib/util/checkLightningDomain.js +28 -28
  117. package/lib/util/directoryWriter.d.ts +12 -12
  118. package/lib/util/directoryWriter.js +53 -53
  119. package/lib/util/getJwtAudienceUrl.d.ts +4 -4
  120. package/lib/util/getJwtAudienceUrl.js +18 -18
  121. package/lib/util/internal.d.ts +58 -58
  122. package/lib/util/internal.js +118 -118
  123. package/lib/util/jsonXmlTools.d.ts +14 -14
  124. package/lib/util/jsonXmlTools.js +38 -38
  125. package/lib/util/mapKeys.d.ts +14 -14
  126. package/lib/util/mapKeys.js +51 -51
  127. package/lib/util/sfdc.d.ts +52 -52
  128. package/lib/util/sfdc.js +85 -85
  129. package/lib/util/sfdcUrl.d.ts +72 -72
  130. package/lib/util/sfdcUrl.js +215 -215
  131. package/lib/util/structuredWriter.d.ts +9 -9
  132. package/lib/util/structuredWriter.js +2 -2
  133. package/lib/util/zipWriter.d.ts +16 -16
  134. package/lib/util/zipWriter.js +67 -67
  135. package/lib/webOAuthServer.d.ts +156 -156
  136. package/lib/webOAuthServer.js +388 -388
  137. package/messages/auth.md +37 -37
  138. package/messages/config.md +156 -156
  139. package/messages/connection.md +30 -30
  140. package/messages/core.json +20 -20
  141. package/messages/core.md +67 -67
  142. package/messages/encryption.md +85 -85
  143. package/messages/envVars.md +303 -303
  144. package/messages/org.md +63 -63
  145. package/messages/permissionSetAssignment.md +31 -31
  146. package/messages/scratchOrgCreate.md +23 -23
  147. package/messages/scratchOrgErrorCodes.md +115 -115
  148. package/messages/scratchOrgFeatureDeprecation.md +11 -11
  149. package/messages/scratchOrgInfoApi.md +15 -15
  150. package/messages/scratchOrgInfoGenerator.md +23 -23
  151. package/messages/streaming.md +23 -23
  152. package/messages/user.md +35 -35
  153. package/package.json +97 -97
@@ -1,380 +1,380 @@
1
- "use strict";
2
- /*
3
- * Copyright (c) 2020, salesforce.com, inc.
4
- * All rights reserved.
5
- * Licensed under the BSD 3-Clause license.
6
- * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause
7
- */
8
- Object.defineProperty(exports, "__esModule", { value: true });
9
- exports.SfdxConfigAggregator = exports.ConfigAggregator = void 0;
10
- const kit_1 = require("@salesforce/kit");
11
- const ts_types_1 = require("@salesforce/ts-types");
12
- const messages_1 = require("../messages");
13
- const envVars_1 = require("./envVars");
14
- const config_1 = require("./config");
15
- messages_1.Messages.importMessagesDirectory(__dirname);
16
- const messages = messages_1.Messages.load('@salesforce/core', 'config', ['unknownConfigKey', 'deprecatedConfigKey']);
17
- /**
18
- * Aggregate global and local project config files, as well as environment variables for
19
- * `config.json`. The resolution happens in the following bottom-up order:
20
- *
21
- * 1. Environment variables (`SF_LOG_LEVEL`)
22
- * 1. Workspace settings (`<workspace-root>/.sf/config.json`)
23
- * 1. Global settings (`$HOME/.sf/config.json`)
24
- *
25
- * Use {@link ConfigAggregator.create} to instantiate the aggregator.
26
- *
27
- * ```
28
- * const aggregator = await ConfigAggregator.create();
29
- * console.log(aggregator.getPropertyValue('target-org'));
30
- * ```
31
- */
32
- class ConfigAggregator extends kit_1.AsyncOptionalCreatable {
33
- /**
34
- * **Do not directly construct instances of this class -- use {@link ConfigAggregator.create} instead.**
35
- *
36
- * @ignore
37
- */
38
- constructor(options) {
39
- super(options ?? {});
40
- this.envVars = {};
41
- // Don't throw an project error with the aggregator, since it should resolve to global if
42
- // there is no project.
43
- try {
44
- this.localConfig = new config_1.Config(config_1.Config.getDefaultOptions(false));
45
- }
46
- catch (err) {
47
- if (err.name !== 'InvalidProjectWorkspaceError') {
48
- throw err;
49
- }
50
- }
51
- this.globalConfig = new config_1.Config(config_1.Config.getDefaultOptions(true));
52
- this.setAllowedProperties(config_1.Config.getAllowedProperties());
53
- }
54
- get config() {
55
- return this.resolveProperties(this.globalConfig.getContents(), this.localConfig?.getContents());
56
- }
57
- // Use typing from AsyncOptionalCreatable to support extending ConfigAggregator.
58
- // We really don't want ConfigAggregator extended but typescript doesn't support a final.
59
- static async create(options) {
60
- let config = ConfigAggregator.instance;
61
- if (!config) {
62
- config = ConfigAggregator.instance = new this(options);
63
- await config.init();
64
- }
65
- if (ConfigAggregator.encrypted) {
66
- await config.loadProperties();
67
- }
68
- if (options?.customConfigMeta) {
69
- config_1.Config.addAllowedProperties(options.customConfigMeta);
70
- }
71
- return ConfigAggregator.instance;
72
- }
73
- /**
74
- * Get the info for a given key. If the ConfigAggregator was not asynchronously created OR
75
- * the {@link ConfigAggregator.reload} was not called, the config value may be encrypted.
76
- *
77
- * @param key The config key.
78
- */
79
- static getValue(key) {
80
- return this.getInstance().getInfo(key);
81
- }
82
- /**
83
- * Get the static ConfigAggregator instance. If one doesn't exist, one will be created with
84
- * the **encrypted** config values. Encrypted config values need to be resolved
85
- * asynchronously by calling {@link ConfigAggregator.reload}
86
- */
87
- // Use typing from AsyncOptionalCreatable to support extending ConfigAggregator.
88
- // We really don't want ConfigAggregator extended but typescript doesn't support a final.
89
- static getInstance() {
90
- if (!ConfigAggregator.instance) {
91
- ConfigAggregator.instance = new this();
92
- ConfigAggregator.instance.loadPropertiesSync();
93
- }
94
- return ConfigAggregator.instance;
95
- }
96
- /**
97
- * Initialize this instances async dependencies.
98
- */
99
- async init() {
100
- await this.loadProperties();
101
- }
102
- /**
103
- * Get a resolved config property.
104
- *
105
- * **Throws** *{@link SfError}{ name: 'UnknownConfigKeyError' }* An attempt to get a property that's not supported.
106
- *
107
- * @param key The key of the property.
108
- */
109
- getPropertyValue(key) {
110
- if (this.getAllowedProperties().some((element) => key === element.key)) {
111
- return this.getConfig()[key];
112
- }
113
- else {
114
- throw messages.createError('unknownConfigKey', [key]);
115
- }
116
- }
117
- /**
118
- * Get a resolved config property meta.
119
- *
120
- * **Throws** *{@link SfError}{ name: 'UnknownConfigKeyError' }* An attempt to get a property that's not supported.
121
- *
122
- * @param key The key of the property.
123
- */
124
- getPropertyMeta(key) {
125
- const match = this.getAllowedProperties().find((element) => key === element.key);
126
- if (match) {
127
- return match;
128
- }
129
- else {
130
- throw messages.createError('unknownConfigKey', [key]);
131
- }
132
- }
133
- /**
134
- * Get a resolved config property.
135
- *
136
- * @param key The key of the property.
137
- * @param throwOnDeprecation True, if you want an error throw when reading a deprecated config
138
- */
139
- getInfo(key, throwOnDeprecation = false) {
140
- const meta = this.getPropertyMeta(key);
141
- if (throwOnDeprecation && meta.deprecated && meta.newKey) {
142
- throw messages.createError('deprecatedConfigKey', [key, meta.newKey]);
143
- }
144
- const location = this.getLocation(key);
145
- return {
146
- key,
147
- location,
148
- value: this.getPropertyValue(key),
149
- path: this.getPath(key),
150
- isLocal: () => location === "Local" /* ConfigAggregator.Location.LOCAL */,
151
- isGlobal: () => location === "Global" /* ConfigAggregator.Location.GLOBAL */,
152
- isEnvVar: () => location === "Environment" /* ConfigAggregator.Location.ENVIRONMENT */,
153
- deprecated: meta.deprecated ?? false,
154
- };
155
- }
156
- /**
157
- * Gets a resolved config property location.
158
- *
159
- * For example, `getLocation('logLevel')` will return:
160
- * 1. `Location.GLOBAL` if resolved to an environment variable.
161
- * 1. `Location.LOCAL` if resolved to local project config.
162
- * 1. `Location.ENVIRONMENT` if resolved to the global config.
163
- *
164
- * @param key The key of the property.
165
- */
166
- getLocation(key) {
167
- if (this.envVars[key] != null) {
168
- return "Environment" /* ConfigAggregator.Location.ENVIRONMENT */;
169
- }
170
- if (this.localConfig?.get(key)) {
171
- return "Local" /* ConfigAggregator.Location.LOCAL */;
172
- }
173
- if (this.globalConfig?.get(key)) {
174
- return "Global" /* ConfigAggregator.Location.GLOBAL */;
175
- }
176
- }
177
- /**
178
- * Get a resolved file path or environment variable name of the property.
179
- *
180
- * For example, `getPath('logLevel')` will return:
181
- * 1. `$SF_LOG_LEVEL` if resolved to an environment variable.
182
- * 1. `./.sf/config.json` if resolved to the local config.
183
- * 1. `~/.sf/config.json` if resolved to the global config.
184
- * 1. `undefined`, if not resolved.
185
- *
186
- * **Note:** that the path returned may be the absolute path instead of
187
- * relative paths such as `./` and `~/`.
188
- *
189
- * @param key The key of the property.
190
- */
191
- getPath(key) {
192
- if (this.envVars[key] != null) {
193
- return `$${envVars_1.EnvVars.propertyToEnvName(key)}`;
194
- }
195
- if (this.localConfig?.getContents()[key] != null) {
196
- return this.localConfig.getPath();
197
- }
198
- if (this.globalConfig.getContents()[key] != null) {
199
- return this.globalConfig.getPath();
200
- }
201
- }
202
- /**
203
- * Get all resolved config property keys, values, locations, and paths.
204
- *
205
- * ```
206
- * > console.log(aggregator.getConfigInfo());
207
- * [
208
- * { key: 'logLevel', val: 'INFO', location: 'Environment', path: '$SF_LOG_LEVEL'}
209
- * { key: 'target-org', val: '<username>', location: 'Local', path: './.sf/config.json'}
210
- * ]
211
- * ```
212
- */
213
- getConfigInfo() {
214
- const infos = Object.keys(this.getConfig())
215
- .filter((key) => this.getAllowedProperties().some((element) => key === element.key))
216
- .map((key) => this.getInfo(key))
217
- .filter((info) => !!info);
218
- return (0, kit_1.sortBy)(infos, 'key');
219
- }
220
- /**
221
- * Get the local project config instance.
222
- */
223
- getLocalConfig() {
224
- return this.localConfig;
225
- }
226
- /**
227
- * Get the global config instance.
228
- */
229
- getGlobalConfig() {
230
- return this.globalConfig;
231
- }
232
- /**
233
- * Get the resolved config object from the local, global and environment config instances.
234
- */
235
- getConfig() {
236
- return this.config;
237
- }
238
- /**
239
- * Get the config properties that are environment variables.
240
- */
241
- getEnvVars() {
242
- return this.envVars;
243
- }
244
- /**
245
- * Re-read all property configurations from disk.
246
- */
247
- async reload() {
248
- await this.loadProperties();
249
- return this;
250
- }
251
- /**
252
- * Add an allowed config property.
253
- */
254
- addAllowedProperties(configMetas) {
255
- if ((0, ts_types_1.isArray)(configMetas)) {
256
- this.allowedProperties.push(...configMetas);
257
- }
258
- else {
259
- this.allowedProperties.push(configMetas);
260
- }
261
- }
262
- /**
263
- * Set the allowed properties.
264
- *
265
- * @param properties The properties to set.
266
- */
267
- setAllowedProperties(properties) {
268
- this.allowedProperties = properties;
269
- }
270
- /**
271
- * Get the allowed properties.
272
- */
273
- getAllowedProperties() {
274
- return this.allowedProperties;
275
- }
276
- /**
277
- * Loads all the properties and aggregates them according to location.
278
- */
279
- async loadProperties() {
280
- this.resolveProperties(await this.globalConfig.read(), this.localConfig && (await this.localConfig.read()));
281
- ConfigAggregator.encrypted = false;
282
- }
283
- /**
284
- * Loads all the properties and aggregates them according to location.
285
- */
286
- loadPropertiesSync() {
287
- this.resolveProperties(this.globalConfig.readSync(), this.localConfig?.readSync());
288
- }
289
- resolveProperties(globalConfig, localConfig) {
290
- const envVars = new envVars_1.EnvVars();
291
- for (const property of this.getAllowedProperties()) {
292
- const key = property.newKey ? property.newKey : property.key;
293
- const value = envVars.getPropertyFromEnv(property.key);
294
- if (value)
295
- this.envVars[key] = value;
296
- }
297
- // Global config must be read first so it is on the left hand of the
298
- // object assign and is overwritten by the local config.
299
- const configs = [globalConfig];
300
- // We might not be in a project workspace
301
- if (localConfig) {
302
- configs.push(localConfig);
303
- }
304
- configs.push(this.envVars);
305
- const json = {};
306
- const reduced = configs.filter(ts_types_1.isJsonMap).reduce((acc, el) => (0, kit_1.merge)(acc, el), json);
307
- return reduced;
308
- }
309
- }
310
- exports.ConfigAggregator = ConfigAggregator;
311
- ConfigAggregator.encrypted = true;
312
- /**
313
- * A ConfigAggregator that will work with deprecated config vars (e.g. defaultusername, apiVersion).
314
- * We do NOT recommend using this class unless you absolutely have to.
315
- *
316
- * @deprecated
317
- */
318
- class SfdxConfigAggregator extends ConfigAggregator {
319
- static async create(options = {}) {
320
- const customConfigMeta = options.customConfigMeta ?? [];
321
- // org-metadata-rest-deploy has been moved to plugin-deploy-retrieve but we need to have a placeholder
322
- // for it here since sfdx needs to know how to set the deprecated restDeploy config var.
323
- const restDeploy = config_1.SFDX_ALLOWED_PROPERTIES.find((p) => p.key === config_1.SfdxPropertyKeys.REST_DEPLOY);
324
- const orgRestDeploy = Object.assign({}, restDeploy, { key: 'org-metadata-rest-deploy', deprecated: false });
325
- options.customConfigMeta = [...customConfigMeta, orgRestDeploy];
326
- let config = SfdxConfigAggregator.instance;
327
- if (!config) {
328
- config = SfdxConfigAggregator.instance = new this(options);
329
- await config.init();
330
- }
331
- if (SfdxConfigAggregator.encrypted) {
332
- await config.loadProperties();
333
- }
334
- if (options?.customConfigMeta) {
335
- config_1.Config.addAllowedProperties(options.customConfigMeta);
336
- }
337
- return SfdxConfigAggregator.instance;
338
- }
339
- getPropertyMeta(key) {
340
- const match = this.getAllowedProperties().find((element) => key === element.key);
341
- if (match?.deprecated && match?.newKey) {
342
- return this.getPropertyMeta(match.newKey);
343
- }
344
- else if (match) {
345
- return match;
346
- }
347
- else {
348
- throw messages.createError('unknownConfigKey', [key]);
349
- }
350
- }
351
- getPropertyValue(key) {
352
- return super.getPropertyValue(this.translate(key));
353
- }
354
- getInfo(key) {
355
- const info = super.getInfo(this.translate(key));
356
- info.key = this.translate(info.key, 'toOld');
357
- return info;
358
- }
359
- getLocation(key) {
360
- return super.getLocation(this.translate(key));
361
- }
362
- getPath(key) {
363
- return super.getPath(this.translate(key));
364
- }
365
- getConfigInfo() {
366
- return super.getConfigInfo().map((c) => {
367
- c.key = this.translate(c.key, 'toOld');
368
- return c;
369
- });
370
- }
371
- translate(key, direction = 'toNew') {
372
- const propConfig = direction === 'toNew'
373
- ? this.getPropertyMeta(key)
374
- : config_1.Config.getAllowedProperties().find((c) => c.newKey === key) ?? {};
375
- return propConfig.key || key;
376
- }
377
- }
378
- exports.SfdxConfigAggregator = SfdxConfigAggregator;
379
- SfdxConfigAggregator.encrypted = true;
1
+ "use strict";
2
+ /*
3
+ * Copyright (c) 2020, salesforce.com, inc.
4
+ * All rights reserved.
5
+ * Licensed under the BSD 3-Clause license.
6
+ * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.SfdxConfigAggregator = exports.ConfigAggregator = void 0;
10
+ const kit_1 = require("@salesforce/kit");
11
+ const ts_types_1 = require("@salesforce/ts-types");
12
+ const messages_1 = require("../messages");
13
+ const envVars_1 = require("./envVars");
14
+ const config_1 = require("./config");
15
+ messages_1.Messages.importMessagesDirectory(__dirname);
16
+ const messages = messages_1.Messages.load('@salesforce/core', 'config', ['unknownConfigKey', 'deprecatedConfigKey']);
17
+ /**
18
+ * Aggregate global and local project config files, as well as environment variables for
19
+ * `config.json`. The resolution happens in the following bottom-up order:
20
+ *
21
+ * 1. Environment variables (`SF_LOG_LEVEL`)
22
+ * 1. Workspace settings (`<workspace-root>/.sf/config.json`)
23
+ * 1. Global settings (`$HOME/.sf/config.json`)
24
+ *
25
+ * Use {@link ConfigAggregator.create} to instantiate the aggregator.
26
+ *
27
+ * ```
28
+ * const aggregator = await ConfigAggregator.create();
29
+ * console.log(aggregator.getPropertyValue('target-org'));
30
+ * ```
31
+ */
32
+ class ConfigAggregator extends kit_1.AsyncOptionalCreatable {
33
+ /**
34
+ * **Do not directly construct instances of this class -- use {@link ConfigAggregator.create} instead.**
35
+ *
36
+ * @ignore
37
+ */
38
+ constructor(options) {
39
+ super(options ?? {});
40
+ this.envVars = {};
41
+ // Don't throw an project error with the aggregator, since it should resolve to global if
42
+ // there is no project.
43
+ try {
44
+ this.localConfig = new config_1.Config(config_1.Config.getDefaultOptions(false));
45
+ }
46
+ catch (err) {
47
+ if (err.name !== 'InvalidProjectWorkspaceError') {
48
+ throw err;
49
+ }
50
+ }
51
+ this.globalConfig = new config_1.Config(config_1.Config.getDefaultOptions(true));
52
+ this.setAllowedProperties(config_1.Config.getAllowedProperties());
53
+ }
54
+ get config() {
55
+ return this.resolveProperties(this.globalConfig.getContents(), this.localConfig?.getContents());
56
+ }
57
+ // Use typing from AsyncOptionalCreatable to support extending ConfigAggregator.
58
+ // We really don't want ConfigAggregator extended but typescript doesn't support a final.
59
+ static async create(options) {
60
+ let config = ConfigAggregator.instance;
61
+ if (!config) {
62
+ config = ConfigAggregator.instance = new this(options);
63
+ await config.init();
64
+ }
65
+ if (ConfigAggregator.encrypted) {
66
+ await config.loadProperties();
67
+ }
68
+ if (options?.customConfigMeta) {
69
+ config_1.Config.addAllowedProperties(options.customConfigMeta);
70
+ }
71
+ return ConfigAggregator.instance;
72
+ }
73
+ /**
74
+ * Get the info for a given key. If the ConfigAggregator was not asynchronously created OR
75
+ * the {@link ConfigAggregator.reload} was not called, the config value may be encrypted.
76
+ *
77
+ * @param key The config key.
78
+ */
79
+ static getValue(key) {
80
+ return this.getInstance().getInfo(key);
81
+ }
82
+ /**
83
+ * Get the static ConfigAggregator instance. If one doesn't exist, one will be created with
84
+ * the **encrypted** config values. Encrypted config values need to be resolved
85
+ * asynchronously by calling {@link ConfigAggregator.reload}
86
+ */
87
+ // Use typing from AsyncOptionalCreatable to support extending ConfigAggregator.
88
+ // We really don't want ConfigAggregator extended but typescript doesn't support a final.
89
+ static getInstance() {
90
+ if (!ConfigAggregator.instance) {
91
+ ConfigAggregator.instance = new this();
92
+ ConfigAggregator.instance.loadPropertiesSync();
93
+ }
94
+ return ConfigAggregator.instance;
95
+ }
96
+ /**
97
+ * Initialize this instances async dependencies.
98
+ */
99
+ async init() {
100
+ await this.loadProperties();
101
+ }
102
+ /**
103
+ * Get a resolved config property.
104
+ *
105
+ * **Throws** *{@link SfError}{ name: 'UnknownConfigKeyError' }* An attempt to get a property that's not supported.
106
+ *
107
+ * @param key The key of the property.
108
+ */
109
+ getPropertyValue(key) {
110
+ if (this.getAllowedProperties().some((element) => key === element.key)) {
111
+ return this.getConfig()[key];
112
+ }
113
+ else {
114
+ throw messages.createError('unknownConfigKey', [key]);
115
+ }
116
+ }
117
+ /**
118
+ * Get a resolved config property meta.
119
+ *
120
+ * **Throws** *{@link SfError}{ name: 'UnknownConfigKeyError' }* An attempt to get a property that's not supported.
121
+ *
122
+ * @param key The key of the property.
123
+ */
124
+ getPropertyMeta(key) {
125
+ const match = this.getAllowedProperties().find((element) => key === element.key);
126
+ if (match) {
127
+ return match;
128
+ }
129
+ else {
130
+ throw messages.createError('unknownConfigKey', [key]);
131
+ }
132
+ }
133
+ /**
134
+ * Get a resolved config property.
135
+ *
136
+ * @param key The key of the property.
137
+ * @param throwOnDeprecation True, if you want an error throw when reading a deprecated config
138
+ */
139
+ getInfo(key, throwOnDeprecation = false) {
140
+ const meta = this.getPropertyMeta(key);
141
+ if (throwOnDeprecation && meta.deprecated && meta.newKey) {
142
+ throw messages.createError('deprecatedConfigKey', [key, meta.newKey]);
143
+ }
144
+ const location = this.getLocation(key);
145
+ return {
146
+ key,
147
+ location,
148
+ value: this.getPropertyValue(key),
149
+ path: this.getPath(key),
150
+ isLocal: () => location === "Local" /* ConfigAggregator.Location.LOCAL */,
151
+ isGlobal: () => location === "Global" /* ConfigAggregator.Location.GLOBAL */,
152
+ isEnvVar: () => location === "Environment" /* ConfigAggregator.Location.ENVIRONMENT */,
153
+ deprecated: meta.deprecated ?? false,
154
+ };
155
+ }
156
+ /**
157
+ * Gets a resolved config property location.
158
+ *
159
+ * For example, `getLocation('logLevel')` will return:
160
+ * 1. `Location.GLOBAL` if resolved to an environment variable.
161
+ * 1. `Location.LOCAL` if resolved to local project config.
162
+ * 1. `Location.ENVIRONMENT` if resolved to the global config.
163
+ *
164
+ * @param key The key of the property.
165
+ */
166
+ getLocation(key) {
167
+ if (this.envVars[key] != null) {
168
+ return "Environment" /* ConfigAggregator.Location.ENVIRONMENT */;
169
+ }
170
+ if (this.localConfig?.get(key)) {
171
+ return "Local" /* ConfigAggregator.Location.LOCAL */;
172
+ }
173
+ if (this.globalConfig?.get(key)) {
174
+ return "Global" /* ConfigAggregator.Location.GLOBAL */;
175
+ }
176
+ }
177
+ /**
178
+ * Get a resolved file path or environment variable name of the property.
179
+ *
180
+ * For example, `getPath('logLevel')` will return:
181
+ * 1. `$SF_LOG_LEVEL` if resolved to an environment variable.
182
+ * 1. `./.sf/config.json` if resolved to the local config.
183
+ * 1. `~/.sf/config.json` if resolved to the global config.
184
+ * 1. `undefined`, if not resolved.
185
+ *
186
+ * **Note:** that the path returned may be the absolute path instead of
187
+ * relative paths such as `./` and `~/`.
188
+ *
189
+ * @param key The key of the property.
190
+ */
191
+ getPath(key) {
192
+ if (this.envVars[key] != null) {
193
+ return `$${envVars_1.EnvVars.propertyToEnvName(key)}`;
194
+ }
195
+ if (this.localConfig?.getContents()[key] != null) {
196
+ return this.localConfig.getPath();
197
+ }
198
+ if (this.globalConfig.getContents()[key] != null) {
199
+ return this.globalConfig.getPath();
200
+ }
201
+ }
202
+ /**
203
+ * Get all resolved config property keys, values, locations, and paths.
204
+ *
205
+ * ```
206
+ * > console.log(aggregator.getConfigInfo());
207
+ * [
208
+ * { key: 'logLevel', val: 'INFO', location: 'Environment', path: '$SF_LOG_LEVEL'}
209
+ * { key: 'target-org', val: '<username>', location: 'Local', path: './.sf/config.json'}
210
+ * ]
211
+ * ```
212
+ */
213
+ getConfigInfo() {
214
+ const infos = Object.keys(this.getConfig())
215
+ .filter((key) => this.getAllowedProperties().some((element) => key === element.key))
216
+ .map((key) => this.getInfo(key))
217
+ .filter((info) => !!info);
218
+ return (0, kit_1.sortBy)(infos, 'key');
219
+ }
220
+ /**
221
+ * Get the local project config instance.
222
+ */
223
+ getLocalConfig() {
224
+ return this.localConfig;
225
+ }
226
+ /**
227
+ * Get the global config instance.
228
+ */
229
+ getGlobalConfig() {
230
+ return this.globalConfig;
231
+ }
232
+ /**
233
+ * Get the resolved config object from the local, global and environment config instances.
234
+ */
235
+ getConfig() {
236
+ return this.config;
237
+ }
238
+ /**
239
+ * Get the config properties that are environment variables.
240
+ */
241
+ getEnvVars() {
242
+ return this.envVars;
243
+ }
244
+ /**
245
+ * Re-read all property configurations from disk.
246
+ */
247
+ async reload() {
248
+ await this.loadProperties();
249
+ return this;
250
+ }
251
+ /**
252
+ * Add an allowed config property.
253
+ */
254
+ addAllowedProperties(configMetas) {
255
+ if ((0, ts_types_1.isArray)(configMetas)) {
256
+ this.allowedProperties.push(...configMetas);
257
+ }
258
+ else {
259
+ this.allowedProperties.push(configMetas);
260
+ }
261
+ }
262
+ /**
263
+ * Set the allowed properties.
264
+ *
265
+ * @param properties The properties to set.
266
+ */
267
+ setAllowedProperties(properties) {
268
+ this.allowedProperties = properties;
269
+ }
270
+ /**
271
+ * Get the allowed properties.
272
+ */
273
+ getAllowedProperties() {
274
+ return this.allowedProperties;
275
+ }
276
+ /**
277
+ * Loads all the properties and aggregates them according to location.
278
+ */
279
+ async loadProperties() {
280
+ this.resolveProperties(await this.globalConfig.read(), this.localConfig && (await this.localConfig.read()));
281
+ ConfigAggregator.encrypted = false;
282
+ }
283
+ /**
284
+ * Loads all the properties and aggregates them according to location.
285
+ */
286
+ loadPropertiesSync() {
287
+ this.resolveProperties(this.globalConfig.readSync(), this.localConfig?.readSync());
288
+ }
289
+ resolveProperties(globalConfig, localConfig) {
290
+ const envVars = new envVars_1.EnvVars();
291
+ for (const property of this.getAllowedProperties()) {
292
+ const key = property.newKey ? property.newKey : property.key;
293
+ const value = envVars.getPropertyFromEnv(property.key);
294
+ if (value)
295
+ this.envVars[key] = value;
296
+ }
297
+ // Global config must be read first so it is on the left hand of the
298
+ // object assign and is overwritten by the local config.
299
+ const configs = [globalConfig];
300
+ // We might not be in a project workspace
301
+ if (localConfig) {
302
+ configs.push(localConfig);
303
+ }
304
+ configs.push(this.envVars);
305
+ const json = {};
306
+ const reduced = configs.filter(ts_types_1.isJsonMap).reduce((acc, el) => (0, kit_1.merge)(acc, el), json);
307
+ return reduced;
308
+ }
309
+ }
310
+ exports.ConfigAggregator = ConfigAggregator;
311
+ ConfigAggregator.encrypted = true;
312
+ /**
313
+ * A ConfigAggregator that will work with deprecated config vars (e.g. defaultusername, apiVersion).
314
+ * We do NOT recommend using this class unless you absolutely have to.
315
+ *
316
+ * @deprecated
317
+ */
318
+ class SfdxConfigAggregator extends ConfigAggregator {
319
+ static async create(options = {}) {
320
+ const customConfigMeta = options.customConfigMeta ?? [];
321
+ // org-metadata-rest-deploy has been moved to plugin-deploy-retrieve but we need to have a placeholder
322
+ // for it here since sfdx needs to know how to set the deprecated restDeploy config var.
323
+ const restDeploy = config_1.SFDX_ALLOWED_PROPERTIES.find((p) => p.key === config_1.SfdxPropertyKeys.REST_DEPLOY);
324
+ const orgRestDeploy = Object.assign({}, restDeploy, { key: 'org-metadata-rest-deploy', deprecated: false });
325
+ options.customConfigMeta = [...customConfigMeta, orgRestDeploy];
326
+ let config = SfdxConfigAggregator.instance;
327
+ if (!config) {
328
+ config = SfdxConfigAggregator.instance = new this(options);
329
+ await config.init();
330
+ }
331
+ if (SfdxConfigAggregator.encrypted) {
332
+ await config.loadProperties();
333
+ }
334
+ if (options?.customConfigMeta) {
335
+ config_1.Config.addAllowedProperties(options.customConfigMeta);
336
+ }
337
+ return SfdxConfigAggregator.instance;
338
+ }
339
+ getPropertyMeta(key) {
340
+ const match = this.getAllowedProperties().find((element) => key === element.key);
341
+ if (match?.deprecated && match?.newKey) {
342
+ return this.getPropertyMeta(match.newKey);
343
+ }
344
+ else if (match) {
345
+ return match;
346
+ }
347
+ else {
348
+ throw messages.createError('unknownConfigKey', [key]);
349
+ }
350
+ }
351
+ getPropertyValue(key) {
352
+ return super.getPropertyValue(this.translate(key));
353
+ }
354
+ getInfo(key) {
355
+ const info = super.getInfo(this.translate(key));
356
+ info.key = this.translate(info.key, 'toOld');
357
+ return info;
358
+ }
359
+ getLocation(key) {
360
+ return super.getLocation(this.translate(key));
361
+ }
362
+ getPath(key) {
363
+ return super.getPath(this.translate(key));
364
+ }
365
+ getConfigInfo() {
366
+ return super.getConfigInfo().map((c) => {
367
+ c.key = this.translate(c.key, 'toOld');
368
+ return c;
369
+ });
370
+ }
371
+ translate(key, direction = 'toNew') {
372
+ const propConfig = direction === 'toNew'
373
+ ? this.getPropertyMeta(key)
374
+ : config_1.Config.getAllowedProperties().find((c) => c.newKey === key) ?? {};
375
+ return propConfig.key || key;
376
+ }
377
+ }
378
+ exports.SfdxConfigAggregator = SfdxConfigAggregator;
379
+ SfdxConfigAggregator.encrypted = true;
380
380
  //# sourceMappingURL=configAggregator.js.map