@salesforce/plugin-info 1.1.4 → 1.3.0
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/CHANGELOG.md +24 -0
- package/LICENSE.txt +1 -1
- package/README.md +1 -1
- package/lib/commands/force.d.ts +8 -0
- package/lib/commands/force.js +79 -0
- package/lib/commands/force.js.map +1 -0
- package/lib/commands/info/releasenotes/display.d.ts +6 -1
- package/lib/commands/info/releasenotes/display.js +8 -2
- package/lib/commands/info/releasenotes/display.js.map +1 -1
- package/lib/shared/getDistTagVersion.js +3 -1
- package/lib/shared/getDistTagVersion.js.map +1 -1
- package/lib/shared/getReleaseNotes.js +3 -0
- package/lib/shared/getReleaseNotes.js.map +1 -1
- package/lib/shared/parseReleaseNotes.js +33 -17
- package/lib/shared/parseReleaseNotes.js.map +1 -1
- package/oclif.manifest.json +1 -1
- package/package.json +12 -8
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,30 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
|
|
4
4
|
|
|
5
|
+
## [1.3.0](https://github.com/salesforcecli/plugin-info/compare/v1.2.1...v1.3.0) (2022-02-28)
|
|
6
|
+
|
|
7
|
+
### Features
|
|
8
|
+
|
|
9
|
+
- json output ([edd0b99](https://github.com/salesforcecli/plugin-info/commit/edd0b991edc0383dc6d6fb20a9e4daa15eb82a55))
|
|
10
|
+
- migrate force command from toolbelt ([68ecc16](https://github.com/salesforcecli/plugin-info/commit/68ecc1643a672e72fd34ea9e224e30a917aa840b))
|
|
11
|
+
- support api from config ([25ac49d](https://github.com/salesforcecli/plugin-info/commit/25ac49d8d4f0ff10dcdf740f4e6cdd4eb1c3d8db))
|
|
12
|
+
|
|
13
|
+
### [1.2.1](https://github.com/salesforcecli/plugin-info/compare/v1.2.0...v1.2.1) (2022-02-10)
|
|
14
|
+
|
|
15
|
+
### Bug Fixes
|
|
16
|
+
|
|
17
|
+
- proxy support for got ([#75](https://github.com/salesforcecli/plugin-info/issues/75)) ([2d9abef](https://github.com/salesforcecli/plugin-info/commit/2d9abefe045d9fcfde9c79df416e5b809b5461d6))
|
|
18
|
+
|
|
19
|
+
## [1.2.0](https://github.com/salesforcecli/plugin-info/compare/v1.1.4...v1.2.0) (2022-01-05)
|
|
20
|
+
|
|
21
|
+
### Features
|
|
22
|
+
|
|
23
|
+
- find close version fallback ([f1b2edc](https://github.com/salesforcecli/plugin-info/commit/f1b2edcb26057b1eef10656a8c7fb255f1e4dd08))
|
|
24
|
+
|
|
25
|
+
### Bug Fixes
|
|
26
|
+
|
|
27
|
+
- type and typos ([75d46c6](https://github.com/salesforcecli/plugin-info/commit/75d46c66b1b22c74b1d8dfeb56da727c1e51ea51))
|
|
28
|
+
|
|
5
29
|
### [1.1.4](https://github.com/salesforcecli/plugin-info/compare/v1.1.3...v1.1.4) (2021-12-07)
|
|
6
30
|
|
|
7
31
|
### Bug Fixes
|
package/LICENSE.txt
CHANGED
package/README.md
CHANGED
|
@@ -108,6 +108,6 @@ EXAMPLES
|
|
|
108
108
|
sfdx info:releasenotes:display --version latest
|
|
109
109
|
```
|
|
110
110
|
|
|
111
|
-
_See code: [src/commands/info/releasenotes/display.ts](https://github.com/salesforcecli/plugin-info/blob/v1.1
|
|
111
|
+
_See code: [src/commands/info/releasenotes/display.ts](https://github.com/salesforcecli/plugin-info/blob/v1.2.1/src/commands/info/releasenotes/display.ts)_
|
|
112
112
|
|
|
113
113
|
<!-- commandsstop -->
|
|
@@ -0,0 +1,79 @@
|
|
|
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.ForceCommand = void 0;
|
|
10
|
+
// This is a doc command
|
|
11
|
+
/* istanbul ignore file */
|
|
12
|
+
const command_1 = require("@salesforce/command");
|
|
13
|
+
const got_1 = require("got");
|
|
14
|
+
const plugin_help_1 = require("@oclif/plugin-help");
|
|
15
|
+
const ProxyAgent = require("proxy-agent");
|
|
16
|
+
const proxy_from_env_1 = require("proxy-from-env");
|
|
17
|
+
const core_1 = require("@salesforce/core");
|
|
18
|
+
const getAsciiSignature = (apiVersion) => `
|
|
19
|
+
DX DX DX
|
|
20
|
+
DX DX DX DX DX DX DX DX DX
|
|
21
|
+
DX DX DX DX DX DX DX DX DX DX DX DX
|
|
22
|
+
DX DX DX DX DX DX DX DX DX DX
|
|
23
|
+
DX DX DX DX DX DX DX DX DX DX
|
|
24
|
+
DX DX DX DX DX DX DX DX DX DX DX
|
|
25
|
+
DX DX DX DX DX DX DX DX
|
|
26
|
+
DX DX DX DX DX DX
|
|
27
|
+
DX DX DX DX
|
|
28
|
+
DX DX DX DX
|
|
29
|
+
DX DX DX DX
|
|
30
|
+
DX DX DX DX
|
|
31
|
+
DX DX DX DX
|
|
32
|
+
DX DX DX DX
|
|
33
|
+
DX DX DX DX
|
|
34
|
+
DX DX DX DX
|
|
35
|
+
DX DX DX DX
|
|
36
|
+
DX DX DX DX DX
|
|
37
|
+
DX DX DX DX DX DX DX DX
|
|
38
|
+
DX DX DX DX DX DX DX
|
|
39
|
+
DX DX DX DX DX DX DX DX
|
|
40
|
+
DX DX DX DX DX DX DX DX DX DX DX
|
|
41
|
+
DX DX DX DX DX DX DX DX DX
|
|
42
|
+
DX DX DX DX
|
|
43
|
+
DX DX DX DX DX DX
|
|
44
|
+
DX DX DX DX DX DX v${apiVersion}
|
|
45
|
+
DX DX DX
|
|
46
|
+
|
|
47
|
+
* Salesforce CLI Release Notes: https://github.com/forcedotcom/cli/tree/main/releasenotes
|
|
48
|
+
* Salesforce DX Setup Guide: https://sfdc.co/sfdx_setup_guide
|
|
49
|
+
* Salesforce DX Developer Guide: https://sfdc.co/sfdx_dev_guide
|
|
50
|
+
* Salesforce CLI Command Reference: https://sfdc.co/sfdx_cli_reference
|
|
51
|
+
* Salesforce Extensions for VS Code: https://marketplace.visualstudio.com/items?itemName=salesforce.salesforcedx-vscode
|
|
52
|
+
`;
|
|
53
|
+
const getCurrentApiVersion = async () => {
|
|
54
|
+
const apiFromConfig = core_1.ConfigAggregator.getValue('apiVersion').value;
|
|
55
|
+
if (apiFromConfig) {
|
|
56
|
+
return apiFromConfig;
|
|
57
|
+
}
|
|
58
|
+
const url = 'https://mdcoverage.secure.force.com/services/apexrest/report';
|
|
59
|
+
return `${JSON.parse((await (0, got_1.default)(url, {
|
|
60
|
+
agent: { https: ProxyAgent((0, proxy_from_env_1.getProxyForUrl)(url)) },
|
|
61
|
+
})).body).versions.selected.toString()}.0`;
|
|
62
|
+
};
|
|
63
|
+
class ForceCommand extends command_1.SfdxCommand {
|
|
64
|
+
async run() {
|
|
65
|
+
const apiVersion = await getCurrentApiVersion();
|
|
66
|
+
this.ux.log(getAsciiSignature(apiVersion));
|
|
67
|
+
return { apiVersion };
|
|
68
|
+
}
|
|
69
|
+
// overrides the help so that it shows the help for the `force` topic and not "help" for this command
|
|
70
|
+
_help() {
|
|
71
|
+
const help = new plugin_help_1.Help(this.config);
|
|
72
|
+
// We need to include force in the args for topics to be shown
|
|
73
|
+
help.showHelp(process.argv.slice(2));
|
|
74
|
+
return this.exit(0);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
exports.ForceCommand = ForceCommand;
|
|
78
|
+
ForceCommand.hidden = true;
|
|
79
|
+
//# sourceMappingURL=force.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"force.js","sourceRoot":"","sources":["../../src/commands/force.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEH,wBAAwB;AACxB,0BAA0B;AAE1B,iDAAkD;AAClD,6BAAsB;AACtB,oDAA0C;AAC1C,0CAA0C;AAC1C,mDAAgD;AAChD,2CAAoD;AAEpD,MAAM,iBAAiB,GAAG,CAAC,UAAkB,EAAU,EAAE,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;+DA0BK,UAAU;;;;;;;;CAQxE,CAAC;AAEF,MAAM,oBAAoB,GAAG,KAAK,IAAqB,EAAE;IACvD,MAAM,aAAa,GAAG,uBAAgB,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,KAAe,CAAC;IAC9E,IAAI,aAAa,EAAE;QACjB,OAAO,aAAa,CAAC;KACtB;IACD,MAAM,GAAG,GAAG,8DAA8D,CAAC;IAC3E,OAAO,GACL,IAAI,CAAC,KAAK,CACR,CACE,MAAM,IAAA,aAAG,EAAC,GAAG,EAAE;QACb,KAAK,EAAE,EAAE,KAAK,EAAE,UAAU,CAAC,IAAA,+BAAc,EAAC,GAAG,CAAC,CAAC,EAAE;KAClD,CAAC,CACH,CAAC,IAAI,CAIT,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC;AACrC,CAAC,CAAC;AAEF,MAAa,YAAa,SAAQ,qBAAW;IAGpC,KAAK,CAAC,GAAG;QACd,MAAM,UAAU,GAAG,MAAM,oBAAoB,EAAE,CAAC;QAChD,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC,CAAC;QAC3C,OAAO,EAAE,UAAU,EAAE,CAAC;IACxB,CAAC;IAED,qGAAqG;IAC3F,KAAK;QACb,MAAM,IAAI,GAAG,IAAI,kBAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnC,8DAA8D;QAC9D,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACrC,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACtB,CAAC;;AAfH,oCAgBC;AAfwB,mBAAM,GAAG,IAAI,CAAC"}
|
|
@@ -8,5 +8,10 @@ export default class Display extends SfdxCommand {
|
|
|
8
8
|
version: flags.Discriminated<flags.String>;
|
|
9
9
|
hook: flags.Discriminated<flags.Boolean<boolean>>;
|
|
10
10
|
};
|
|
11
|
-
run(): Promise<
|
|
11
|
+
run(): Promise<DisplayOutput>;
|
|
12
12
|
}
|
|
13
|
+
interface DisplayOutput {
|
|
14
|
+
body: string;
|
|
15
|
+
url: string;
|
|
16
|
+
}
|
|
17
|
+
export {};
|
|
@@ -51,8 +51,14 @@ class Display extends command_1.SfdxCommand {
|
|
|
51
51
|
marked_1.marked.setOptions({
|
|
52
52
|
renderer: new TerminalRenderer({ emoji: false }),
|
|
53
53
|
});
|
|
54
|
-
|
|
55
|
-
this.
|
|
54
|
+
tokens.unshift(marked_1.marked.lexer(`# Release notes for '${this.config.bin}':`)[0]);
|
|
55
|
+
if (this.flags.json) {
|
|
56
|
+
const body = tokens.map((token) => token.raw).join(os.EOL);
|
|
57
|
+
return { body, url: releaseNotesPath };
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
this.ux.log(marked_1.marked.parser(tokens));
|
|
61
|
+
}
|
|
56
62
|
if (isHook) {
|
|
57
63
|
if (env.getBoolean(HIDE_FOOTER)) {
|
|
58
64
|
await core_1.Lifecycle.getInstance().emitTelemetry({ eventName: 'FOOTER_HIDDEN' });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"display.js","sourceRoot":"","sources":["../../../../src/commands/info/releasenotes/display.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAEH,4EAA4E;AAC5E,uDAAuD;AAEvD,yBAAyB;AACzB,mCAAgC;AAChC,oDAAoD;AACpD,yCAAsC;AACtC,iDAAyD;AACzD,2CAAuD;AAEvD,iEAA8D;AAC9D,qEAAkE;AAClE,yEAAsE;AACtE,yEAAsE;AAEtE,wDAAwD;AACxD,eAAQ,CAAC,uBAAuB,CAAC,SAAS,CAAC,CAAC;AAE5C,MAAM,UAAU,GAAG,yBAAyB,CAAC;AAC7C,MAAM,WAAW,GAAG,gCAAgC,CAAC;AAErD,iGAAiG;AACjG,mFAAmF;AACnF,MAAM,QAAQ,GAAG,eAAQ,CAAC,YAAY,CAAC,yBAAyB,EAAE,SAAS,CAAC,CAAC;AAE7E,MAAqB,OAAQ,SAAQ,qBAAW;IAoBvC,KAAK,CAAC,GAAG;;QACd,MAAM,GAAG,GAAG,IAAI,SAAG,EAAE,CAAC;QAEtB,MAAM,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;QAEjC,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,MAAM,EAAE;YACxC,kFAAkF;YAClF,qHAAqH;YACrH,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,uCAAuC,UAAU,EAAE,CAAC,CAAC;YACvE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YAC7B,MAAM,gBAAS,CAAC,WAAW,EAAE,CAAC,aAAa,CAAC,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC,CAAC;YAE3E,OAAO;SACR;QAED,IAAI;YACF,MAAM,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC;YAEnD,MAAM,UAAU,GAAG,MAAM,IAAA,6BAAa,EAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAEzD,MAAM,EAAE,UAAU,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,GAAG,UAAU,CAAC,YAAY,CAAC;YAEvF,IAAI,OAAO,GAAG,MAAC,IAAI,CAAC,KAAK,CAAC,OAAkB,mCAAI,gBAAgB,CAAC;YAEjE,IAAI,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;gBACrC,OAAO,GAAG,MAAM,IAAA,qCAAiB,EAAC,UAAU,EAAE,OAAO,CAAC,CAAC;aACxD;YAED,MAAM,YAAY,GAAG,MAAM,IAAA,iCAAe,EAAC,gBAAgB,EAAE,oBAAoB,EAAE,OAAO,CAAC,CAAC;YAE5F,MAAM,MAAM,GAAG,IAAA,qCAAiB,EAAC,YAAY,EAAE,OAAO,EAAE,gBAAgB,CAAC,CAAC;YAE1E,eAAM,CAAC,UAAU,CAAC;gBAChB,QAAQ,EAAE,IAAI,gBAAgB,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;aACjD,CAAC,CAAC;YAEH,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"display.js","sourceRoot":"","sources":["../../../../src/commands/info/releasenotes/display.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAEH,4EAA4E;AAC5E,uDAAuD;AAEvD,yBAAyB;AACzB,mCAAgC;AAChC,oDAAoD;AACpD,yCAAsC;AACtC,iDAAyD;AACzD,2CAAuD;AAEvD,iEAA8D;AAC9D,qEAAkE;AAClE,yEAAsE;AACtE,yEAAsE;AAEtE,wDAAwD;AACxD,eAAQ,CAAC,uBAAuB,CAAC,SAAS,CAAC,CAAC;AAE5C,MAAM,UAAU,GAAG,yBAAyB,CAAC;AAC7C,MAAM,WAAW,GAAG,gCAAgC,CAAC;AAErD,iGAAiG;AACjG,mFAAmF;AACnF,MAAM,QAAQ,GAAG,eAAQ,CAAC,YAAY,CAAC,yBAAyB,EAAE,SAAS,CAAC,CAAC;AAE7E,MAAqB,OAAQ,SAAQ,qBAAW;IAoBvC,KAAK,CAAC,GAAG;;QACd,MAAM,GAAG,GAAG,IAAI,SAAG,EAAE,CAAC;QAEtB,MAAM,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;QAEjC,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,MAAM,EAAE;YACxC,kFAAkF;YAClF,qHAAqH;YACrH,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,uCAAuC,UAAU,EAAE,CAAC,CAAC;YACvE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YAC7B,MAAM,gBAAS,CAAC,WAAW,EAAE,CAAC,aAAa,CAAC,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC,CAAC;YAE3E,OAAO;SACR;QAED,IAAI;YACF,MAAM,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC;YAEnD,MAAM,UAAU,GAAG,MAAM,IAAA,6BAAa,EAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAEzD,MAAM,EAAE,UAAU,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,GAAG,UAAU,CAAC,YAAY,CAAC;YAEvF,IAAI,OAAO,GAAG,MAAC,IAAI,CAAC,KAAK,CAAC,OAAkB,mCAAI,gBAAgB,CAAC;YAEjE,IAAI,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;gBACrC,OAAO,GAAG,MAAM,IAAA,qCAAiB,EAAC,UAAU,EAAE,OAAO,CAAC,CAAC;aACxD;YAED,MAAM,YAAY,GAAG,MAAM,IAAA,iCAAe,EAAC,gBAAgB,EAAE,oBAAoB,EAAE,OAAO,CAAC,CAAC;YAE5F,MAAM,MAAM,GAAG,IAAA,qCAAiB,EAAC,YAAY,EAAE,OAAO,EAAE,gBAAgB,CAAC,CAAC;YAE1E,eAAM,CAAC,UAAU,CAAC;gBAChB,QAAQ,EAAE,IAAI,gBAAgB,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;aACjD,CAAC,CAAC;YAEH,MAAM,CAAC,OAAO,CAAC,eAAM,CAAC,KAAK,CAAC,wBAAwB,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAE7E,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;gBACnB,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;gBAE3D,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,gBAAgB,EAAE,CAAC;aACxC;iBAAM;gBACL,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,eAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;aACpC;YAED,IAAI,MAAM,EAAE;gBACV,IAAI,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE;oBAC/B,MAAM,gBAAS,CAAC,WAAW,EAAE,CAAC,aAAa,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC,CAAC;iBAC7E;qBAAM;oBACL,MAAM,MAAM,GAAG,QAAQ,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,gBAAgB,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC;oBAC3G,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,eAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;iBACnC;aACF;SACF;QAAC,OAAO,GAAG,EAAE;YACZ,IAAI,MAAM,EAAE;gBACV,oFAAoF;gBACpF,sDAAsD;gBACtD,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,GAAY,CAAC;gBAE9C,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE,YAAY,OAAO,EAAE,CAAC,CAAC;gBAE9C,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBACzB,MAAM,gBAAS,CAAC,WAAW,EAAE,CAAC,aAAa,CAAC;oBAC1C,SAAS,EAAE,eAAe;oBAC1B,IAAI,EAAE,WAAW;oBACjB,SAAS,EAAE,IAAI;oBACf,YAAY,EAAE,OAAO;oBACrB,KAAK,EAAE,MAAM,CAAC,MAAM,CAClB;wBACE,IAAI;wBACJ,OAAO;wBACP,KAAK;qBACK,EACZ,GAAG,CACO;iBACb,CAAC,CAAC;gBAEH,OAAO;aACR;YAED,MAAM,GAAG,CAAC;SACX;IACH,CAAC;;AAvGH,0BAwGC;AAvGgB,eAAO,GAAG,CAAC,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC;AAEhE,mBAAW,GAAG,QAAQ,CAAC,UAAU,CAAC,oBAAoB,CAAC,CAAC;AAExD,eAAO,GAAG,CAAC,UAAU,CAAC,CAAC;AAEvB,gBAAQ,GAAG,QAAQ,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;AAEpF,mBAAW,GAAG;IAC7B,OAAO,EAAE,eAAK,CAAC,MAAM,CAAC;QACpB,IAAI,EAAE,GAAG;QACT,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC,eAAe,CAAC;KAClD,CAAC;IACF,IAAI,EAAE,eAAK,CAAC,OAAO,CAAC;QAClB,MAAM,EAAE,IAAI;QACZ,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC,YAAY,CAAC;KAC/C,CAAC;CACH,CAAC"}
|
|
@@ -8,11 +8,13 @@
|
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
9
|
exports.getDistTagVersion = void 0;
|
|
10
10
|
const got_1 = require("got");
|
|
11
|
+
const ProxyAgent = require("proxy-agent");
|
|
12
|
+
const proxy_from_env_1 = require("proxy-from-env");
|
|
11
13
|
const constants_1 = require("../constants");
|
|
12
14
|
const getDistTagVersion = async (url, distTag) => {
|
|
13
15
|
// TODO: Could use npm instead here. That way private cli repos could auth with .npmrc
|
|
14
16
|
// -- could utilize this: https://github.com/salesforcecli/plugin-trust/blob/0393b906a30e8858816625517eda5db69377c178/src/lib/npmCommand.ts
|
|
15
|
-
const options = { timeout: constants_1.SFDX_RELEASE_NOTES_TIMEOUT };
|
|
17
|
+
const options = { timeout: constants_1.SFDX_RELEASE_NOTES_TIMEOUT, agent: { https: ProxyAgent((0, proxy_from_env_1.getProxyForUrl)(url)) } };
|
|
16
18
|
const body = await (0, got_1.default)(url, options).json();
|
|
17
19
|
// We are only interested in latest and latest-rc, could update this if other tags are desired
|
|
18
20
|
return distTag.includes('rc') ? body['latest-rc'] : body['latest'];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getDistTagVersion.js","sourceRoot":"","sources":["../../src/shared/getDistTagVersion.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEH,6BAAsB;AACtB,4CAA0D;AAO1D,MAAM,iBAAiB,GAAG,KAAK,EAAE,GAAW,EAAE,OAAe,EAAmB,EAAE;IAChF,sFAAsF;IACtF,2IAA2I;IAC3I,MAAM,OAAO,GAAG,EAAE,OAAO,EAAE,sCAA0B,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"getDistTagVersion.js","sourceRoot":"","sources":["../../src/shared/getDistTagVersion.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEH,6BAAsB;AACtB,0CAA0C;AAC1C,mDAAgD;AAChD,4CAA0D;AAO1D,MAAM,iBAAiB,GAAG,KAAK,EAAE,GAAW,EAAE,OAAe,EAAmB,EAAE;IAChF,sFAAsF;IACtF,2IAA2I;IAC3I,MAAM,OAAO,GAAG,EAAE,OAAO,EAAE,sCAA0B,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,UAAU,CAAC,IAAA,+BAAc,EAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC;IAE3G,MAAM,IAAI,GAAG,MAAM,IAAA,aAAG,EAAC,GAAG,EAAE,OAAO,CAAC,CAAC,IAAI,EAAe,CAAC;IAEzD,8FAA8F;IAC9F,OAAO,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AACrE,CAAC,CAAC;AAEO,8CAAiB"}
|
|
@@ -9,6 +9,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
9
9
|
exports.getReleaseNotes = void 0;
|
|
10
10
|
const got_1 = require("got");
|
|
11
11
|
const semver_1 = require("semver");
|
|
12
|
+
const proxy_from_env_1 = require("proxy-from-env");
|
|
13
|
+
const ProxyAgent = require("proxy-agent");
|
|
12
14
|
const constants_1 = require("../constants");
|
|
13
15
|
const getReleaseNotes = async (base, filename, version) => {
|
|
14
16
|
const majorVersion = (0, semver_1.major)(version);
|
|
@@ -16,6 +18,7 @@ const getReleaseNotes = async (base, filename, version) => {
|
|
|
16
18
|
const options = {
|
|
17
19
|
timeout: constants_1.SFDX_RELEASE_NOTES_TIMEOUT,
|
|
18
20
|
throwHttpErrors: false,
|
|
21
|
+
agent: { https: ProxyAgent((0, proxy_from_env_1.getProxyForUrl)(rawBase)) },
|
|
19
22
|
};
|
|
20
23
|
const getPromises = [
|
|
21
24
|
(0, got_1.default)(`${rawBase}/v${majorVersion}.md`, options),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getReleaseNotes.js","sourceRoot":"","sources":["../../src/shared/getReleaseNotes.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEH,6BAAsB;AACtB,mCAA+B;AAC/B,4CAA0D;AAE1D,MAAM,eAAe,GAAG,KAAK,EAAE,IAAY,EAAE,QAAgB,EAAE,OAAe,EAAmB,EAAE;IACjG,MAAM,YAAY,GAAG,IAAA,cAAK,EAAC,OAAO,CAAC,CAAC;IAEpC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,2BAA2B,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAEtH,MAAM,OAAO,GAAG;QACd,OAAO,EAAE,sCAA0B;QACnC,eAAe,EAAE,KAAK;
|
|
1
|
+
{"version":3,"file":"getReleaseNotes.js","sourceRoot":"","sources":["../../src/shared/getReleaseNotes.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEH,6BAAsB;AACtB,mCAA+B;AAC/B,mDAAgD;AAChD,0CAA0C;AAC1C,4CAA0D;AAE1D,MAAM,eAAe,GAAG,KAAK,EAAE,IAAY,EAAE,QAAgB,EAAE,OAAe,EAAmB,EAAE;IACjG,MAAM,YAAY,GAAG,IAAA,cAAK,EAAC,OAAO,CAAC,CAAC;IAEpC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,2BAA2B,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAEtH,MAAM,OAAO,GAAG;QACd,OAAO,EAAE,sCAA0B;QACnC,eAAe,EAAE,KAAK;QACtB,KAAK,EAAE,EAAE,KAAK,EAAE,UAAU,CAAC,IAAA,+BAAc,EAAC,OAAO,CAAC,CAAC,EAAE;KACtD,CAAC;IAEF,MAAM,WAAW,GAAG;QAClB,IAAA,aAAG,EAAC,GAAG,OAAO,KAAK,YAAY,KAAK,EAAE,OAAO,CAAC;QAC9C,IAAA,aAAG,EAAC,GAAG,OAAO,IAAI,QAAQ,EAAE,EAAE,EAAE,GAAG,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC;KACrE,CAAC;IAEF,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAE3D,MAAM,EAAE,IAAI,EAAE,GAAG,SAAS,CAAC,UAAU,KAAK,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;IAEnE,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEO,0CAAe"}
|
|
@@ -8,29 +8,41 @@
|
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
9
|
exports.parseReleaseNotes = void 0;
|
|
10
10
|
const marked_1 = require("marked");
|
|
11
|
+
const semver = require("semver");
|
|
11
12
|
const parseReleaseNotes = (notes, version, baseUrl) => {
|
|
12
13
|
let found = false;
|
|
14
|
+
let closestVersion;
|
|
15
|
+
let versions;
|
|
13
16
|
const parsed = marked_1.marked.lexer(notes);
|
|
14
|
-
|
|
15
|
-
const
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
17
|
+
let tokens;
|
|
18
|
+
const findVersion = (desiredVersion) => {
|
|
19
|
+
versions = [];
|
|
20
|
+
tokens = parsed.filter((token) => {
|
|
21
|
+
// TODO: Could make header depth (2) a setting in oclif.info.releasenotes
|
|
22
|
+
if (token.type === 'heading' && token.depth === 2) {
|
|
23
|
+
const coercedVersion = semver.coerce(token.text).version;
|
|
24
|
+
// We will use this to find the closest patch if passed version is not found
|
|
25
|
+
versions.push(coercedVersion);
|
|
26
|
+
if (coercedVersion === desiredVersion) {
|
|
27
|
+
found = true;
|
|
28
|
+
return token;
|
|
29
|
+
}
|
|
30
|
+
found = false;
|
|
31
|
+
}
|
|
32
|
+
else if (found === true) {
|
|
24
33
|
return token;
|
|
25
34
|
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
return token;
|
|
30
|
-
}
|
|
31
|
-
});
|
|
35
|
+
});
|
|
36
|
+
};
|
|
37
|
+
findVersion(version);
|
|
32
38
|
if (!tokens.length) {
|
|
33
|
-
|
|
39
|
+
// If version was not found, try again with the closest patch version
|
|
40
|
+
const semverRange = `${semver.major(version)}.${semver.minor(version)}.x`;
|
|
41
|
+
closestVersion = semver.maxSatisfying(versions, semverRange);
|
|
42
|
+
findVersion(closestVersion);
|
|
43
|
+
if (!tokens.length) {
|
|
44
|
+
throw new Error(`Didn't find version '${version}'. View release notes online at: ${baseUrl}`);
|
|
45
|
+
}
|
|
34
46
|
}
|
|
35
47
|
const fixRelativeLinks = (token) => {
|
|
36
48
|
// If link is relative, add the baseurl. https://regex101.com/r/h802kJ/1
|
|
@@ -40,6 +52,10 @@ const parseReleaseNotes = (notes, version, baseUrl) => {
|
|
|
40
52
|
}
|
|
41
53
|
};
|
|
42
54
|
marked_1.marked.walkTokens(tokens, fixRelativeLinks);
|
|
55
|
+
if (closestVersion !== undefined) {
|
|
56
|
+
const warning = marked_1.marked.lexer(`# ATTENTION: Version ${version} was not found. Showing notes for closest patch version ${closestVersion}.`)[0];
|
|
57
|
+
tokens.unshift(warning);
|
|
58
|
+
}
|
|
43
59
|
return tokens;
|
|
44
60
|
};
|
|
45
61
|
exports.parseReleaseNotes = parseReleaseNotes;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parseReleaseNotes.js","sourceRoot":"","sources":["../../src/shared/parseReleaseNotes.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEH,mCAAgC;
|
|
1
|
+
{"version":3,"file":"parseReleaseNotes.js","sourceRoot":"","sources":["../../src/shared/parseReleaseNotes.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEH,mCAAgC;AAChC,iCAAiC;AAEjC,MAAM,iBAAiB,GAAG,CAAC,KAAa,EAAE,OAAe,EAAE,OAAe,EAAkB,EAAE;IAC5F,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,IAAI,cAAsB,CAAC;IAC3B,IAAI,QAAkB,CAAC;IAEvB,MAAM,MAAM,GAAG,eAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAEnC,IAAI,MAAsB,CAAC;IAE3B,MAAM,WAAW,GAAG,CAAC,cAAsB,EAAQ,EAAE;QACnD,QAAQ,GAAG,EAAE,CAAC;QAEd,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;YAC/B,yEAAyE;YACzE,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,KAAK,KAAK,CAAC,EAAE;gBACjD,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC;gBAEzD,4EAA4E;gBAC5E,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;gBAE9B,IAAI,cAAc,KAAK,cAAc,EAAE;oBACrC,KAAK,GAAG,IAAI,CAAC;oBAEb,OAAO,KAAK,CAAC;iBACd;gBAED,KAAK,GAAG,KAAK,CAAC;aACf;iBAAM,IAAI,KAAK,KAAK,IAAI,EAAE;gBACzB,OAAO,KAAK,CAAC;aACd;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,WAAW,CAAC,OAAO,CAAC,CAAC;IAErB,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;QAClB,qEAAqE;QACrE,MAAM,WAAW,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QAE1E,cAAc,GAAG,MAAM,CAAC,aAAa,CAAS,QAAQ,EAAE,WAAW,CAAC,CAAC;QAErE,WAAW,CAAC,cAAc,CAAC,CAAC;QAE5B,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;YAClB,MAAM,IAAI,KAAK,CAAC,wBAAwB,OAAO,oCAAoC,OAAO,EAAE,CAAC,CAAC;SAC/F;KACF;IAED,MAAM,gBAAgB,GAAG,CAAC,KAAmB,EAAQ,EAAE;QACrD,wEAAwE;QACxE,oGAAoG;QACpG,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,+BAA+B,CAAC,EAAE;YAC/E,KAAK,CAAC,IAAI,GAAG,GAAG,OAAO,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;SACzC;IACH,CAAC,CAAC;IAEF,eAAM,CAAC,UAAU,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAE5C,IAAI,cAAc,KAAK,SAAS,EAAE;QAChC,MAAM,OAAO,GAAG,eAAM,CAAC,KAAK,CAC1B,wBAAwB,OAAO,2DAA2D,cAAc,GAAG,CAC5G,CAAC,CAAC,CAAC,CAAC;QAEL,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;KACzB;IAED,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAEO,8CAAiB"}
|
package/oclif.manifest.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":"1.
|
|
1
|
+
{"version":"1.3.0","commands":{"force":{"id":"force","usage":"<%= command.id %> [--json] [--loglevel trace|debug|info|warn|error|fatal|TRACE|DEBUG|INFO|WARN|ERROR|FATAL]","pluginName":"@salesforce/plugin-info","pluginType":"core","hidden":true,"aliases":[],"flags":{"json":{"name":"json","type":"boolean","description":"format output as json","allowNo":false},"loglevel":{"name":"loglevel","type":"option","description":"logging level for this command invocation","required":false,"helpValue":"(trace|debug|info|warn|error|fatal|TRACE|DEBUG|INFO|WARN|ERROR|FATAL)","options":["trace","debug","info","warn","error","fatal","TRACE","DEBUG","INFO","WARN","ERROR","FATAL"],"default":"warn"}},"args":[]},"info:releasenotes:display":{"id":"info:releasenotes:display","description":"Display Salesforce CLI release notes on the command line.","usage":"<%= command.id %> [-v <string>] [--json] [--loglevel trace|debug|info|warn|error|fatal|TRACE|DEBUG|INFO|WARN|ERROR|FATAL]","pluginName":"@salesforce/plugin-info","pluginType":"core","aliases":["whatsnew"],"examples":["Display release notes for the currently installed CLI version:"," <%= config.bin %> <%= command.id %>","Display release notes for CLI version 7.120.0:"," <%= config.bin %> <%= command.id %> --version 7.120.0","Display release notes for the CLI version that corresponds to a tag (stable, stable-rc, latest, latest-rc, rc):"," <%= config.bin %> <%= command.id %> --version latest"," "],"flags":{"json":{"name":"json","type":"boolean","description":"format output as json","allowNo":false},"loglevel":{"name":"loglevel","type":"option","description":"logging level for this command invocation","required":false,"helpValue":"(trace|debug|info|warn|error|fatal|TRACE|DEBUG|INFO|WARN|ERROR|FATAL)","options":["trace","debug","info","warn","error","fatal","TRACE","DEBUG","INFO","WARN","ERROR","FATAL"],"default":"warn"},"version":{"name":"version","type":"option","char":"v","description":"CLI version or tag for which to display release notes."},"hook":{"name":"hook","type":"boolean","description":"This hidden parameter is used in post install or update hooks.","hidden":true,"allowNo":false}},"args":[]}}}
|
package/package.json
CHANGED
|
@@ -1,33 +1,36 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@salesforce/plugin-info",
|
|
3
3
|
"description": "Plugin for accessing cli info from the command line",
|
|
4
|
-
"version": "1.
|
|
4
|
+
"version": "1.3.0",
|
|
5
5
|
"author": "Salesforce",
|
|
6
6
|
"bugs": "https://github.com/forcedotcom/cli/issues",
|
|
7
7
|
"dependencies": {
|
|
8
8
|
"@oclif/config": "^1",
|
|
9
|
+
"@oclif/plugin-help": "^3.3.1",
|
|
9
10
|
"@salesforce/command": "^4.1.5",
|
|
10
11
|
"@salesforce/core": "^2.29.0",
|
|
11
12
|
"@salesforce/kit": "^1.5.17",
|
|
12
13
|
"got": "^11.8.2",
|
|
13
14
|
"marked": "^4.0.1",
|
|
14
15
|
"marked-terminal": "^4.2.0",
|
|
16
|
+
"proxy-agent": "^5.0.0",
|
|
17
|
+
"proxy-from-env": "^1.1.0",
|
|
15
18
|
"semver": "^7.3.5",
|
|
16
|
-
"sinon-chai": "^3.7.0",
|
|
17
19
|
"tslib": "^2"
|
|
18
20
|
},
|
|
19
21
|
"devDependencies": {
|
|
20
22
|
"@oclif/dev-cli": "^1",
|
|
21
23
|
"@oclif/plugin-command-snapshot": "^2.2.2",
|
|
22
24
|
"@salesforce/cli-plugins-testkit": "^1.4.17",
|
|
23
|
-
"@salesforce/dev-config": "^
|
|
24
|
-
"@salesforce/dev-scripts": "^
|
|
25
|
+
"@salesforce/dev-config": "^3.0.0",
|
|
26
|
+
"@salesforce/dev-scripts": "^2.0.0",
|
|
25
27
|
"@salesforce/plugin-command-reference": "^1.3.17",
|
|
26
28
|
"@salesforce/prettier-config": "^0.0.2",
|
|
27
29
|
"@salesforce/ts-sinon": "1.3.21",
|
|
28
30
|
"@types/fs-extra": "^9.0.13",
|
|
29
31
|
"@types/marked": "^4.0.0",
|
|
30
32
|
"@types/marked-terminal": "^3.1.3",
|
|
33
|
+
"@types/proxy-from-env": "^1.0.1",
|
|
31
34
|
"@types/semver": "^7.3.8",
|
|
32
35
|
"@typescript-eslint/eslint-plugin": "^4.33.0",
|
|
33
36
|
"@typescript-eslint/parser": "^4.33.0",
|
|
@@ -44,12 +47,13 @@
|
|
|
44
47
|
"eslint-plugin-prettier": "^3.4.1",
|
|
45
48
|
"husky": "^7.0.4",
|
|
46
49
|
"lint-staged": "^11.2.6",
|
|
47
|
-
"mocha": "^
|
|
50
|
+
"mocha": "^9.1.3",
|
|
48
51
|
"nyc": "^15.1.0",
|
|
49
52
|
"prettier": "^2.4.1",
|
|
50
53
|
"pretty-quick": "^3.1.0",
|
|
51
|
-
"shx": "0.3.
|
|
54
|
+
"shx": "0.3.4",
|
|
52
55
|
"sinon": "^11.1.1",
|
|
56
|
+
"sinon-chai": "^3.7.0",
|
|
53
57
|
"ts-node": "^10.4.0",
|
|
54
58
|
"typescript": "^4.5.2"
|
|
55
59
|
},
|
|
@@ -119,7 +123,7 @@
|
|
|
119
123
|
"access": "public"
|
|
120
124
|
},
|
|
121
125
|
"sfdx": {
|
|
122
|
-
"publicKeyUrl": "https://developer.salesforce.com/media/salesforce-cli/security/@salesforce/plugin-info/1.
|
|
123
|
-
"signatureUrl": "https://developer.salesforce.com/media/salesforce-cli/security/@salesforce/plugin-info/1.
|
|
126
|
+
"publicKeyUrl": "https://developer.salesforce.com/media/salesforce-cli/security/@salesforce/plugin-info/1.3.0.crt",
|
|
127
|
+
"signatureUrl": "https://developer.salesforce.com/media/salesforce-cli/security/@salesforce/plugin-info/1.3.0.sig"
|
|
124
128
|
}
|
|
125
129
|
}
|