ovsx 1.1.1 → 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/README.md +73 -1
- package/lib/check-license.d.ts.map +1 -1
- package/lib/check-license.js +3 -2
- package/lib/check-license.js.map +1 -1
- package/lib/get.js +6 -6
- package/lib/get.js.map +1 -1
- package/lib/http.d.ts +32 -0
- package/lib/http.d.ts.map +1 -0
- package/lib/http.js +170 -0
- package/lib/http.js.map +1 -0
- package/lib/index.d.ts +4 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +4 -0
- package/lib/index.js.map +1 -1
- package/lib/list-options.d.ts +24 -0
- package/lib/list-options.d.ts.map +1 -0
- package/lib/list-options.js +15 -0
- package/lib/list-options.js.map +1 -0
- package/lib/list.d.ts +18 -0
- package/lib/list.d.ts.map +1 -0
- package/lib/list.js +46 -0
- package/lib/list.js.map +1 -0
- package/lib/main.js +111 -32
- package/lib/main.js.map +1 -1
- package/lib/oidc.d.ts +22 -0
- package/lib/oidc.d.ts.map +1 -0
- package/lib/oidc.js +59 -0
- package/lib/oidc.js.map +1 -0
- package/lib/publish-options.d.ts +8 -1
- package/lib/publish-options.d.ts.map +1 -1
- package/lib/publish.d.ts.map +1 -1
- package/lib/publish.js +150 -13
- package/lib/publish.js.map +1 -1
- package/lib/registry-options.d.ts +8 -0
- package/lib/registry-options.d.ts.map +1 -1
- package/lib/registry.d.ts +161 -5
- package/lib/registry.d.ts.map +1 -1
- package/lib/registry.js +259 -100
- package/lib/registry.js.map +1 -1
- package/lib/search-options.d.ts +48 -0
- package/lib/search-options.d.ts.map +1 -0
- package/lib/search-options.js +15 -0
- package/lib/search-options.js.map +1 -0
- package/lib/search.d.ts +22 -0
- package/lib/search.d.ts.map +1 -0
- package/lib/search.js +86 -0
- package/lib/search.js.map +1 -0
- package/lib/show-options.d.ts +33 -0
- package/lib/show-options.d.ts.map +1 -0
- package/lib/show-options.js +15 -0
- package/lib/show-options.js.map +1 -0
- package/lib/show.d.ts +18 -0
- package/lib/show.d.ts.map +1 -0
- package/lib/show.js +289 -0
- package/lib/show.js.map +1 -0
- package/lib/table.d.ts +27 -0
- package/lib/table.d.ts.map +1 -0
- package/lib/table.js +56 -0
- package/lib/table.js.map +1 -0
- package/lib/trusted-publishing-options.d.ts +30 -0
- package/lib/trusted-publishing-options.d.ts.map +1 -0
- package/lib/trusted-publishing-options.js +15 -0
- package/lib/trusted-publishing-options.js.map +1 -0
- package/lib/trusted-publishing.d.ts +35 -0
- package/lib/trusted-publishing.d.ts.map +1 -0
- package/lib/trusted-publishing.js +112 -0
- package/lib/trusted-publishing.js.map +1 -0
- package/lib/unpublish-options.d.ts +34 -0
- package/lib/unpublish-options.d.ts.map +1 -0
- package/lib/unpublish-options.js +15 -0
- package/lib/unpublish-options.js.map +1 -0
- package/lib/unpublish.d.ts +22 -0
- package/lib/unpublish.d.ts.map +1 -0
- package/lib/unpublish.js +137 -0
- package/lib/unpublish.js.map +1 -0
- package/lib/util.d.ts +51 -9
- package/lib/util.d.ts.map +1 -1
- package/lib/util.js +130 -67
- package/lib/util.js.map +1 -1
- package/lib/verify-options.d.ts +24 -0
- package/lib/verify-options.d.ts.map +1 -0
- package/lib/verify-options.js +15 -0
- package/lib/verify-options.js.map +1 -0
- package/lib/verify-signature-options.d.ts +32 -0
- package/lib/verify-signature-options.d.ts.map +1 -0
- package/lib/verify-signature-options.js +15 -0
- package/lib/verify-signature-options.js.map +1 -0
- package/lib/verify-signature.d.ts +28 -0
- package/lib/verify-signature.d.ts.map +1 -0
- package/lib/verify-signature.js +105 -0
- package/lib/verify-signature.js.map +1 -0
- package/lib/verify.d.ts +21 -0
- package/lib/verify.d.ts.map +1 -0
- package/lib/verify.js +97 -0
- package/lib/verify.js.map +1 -0
- package/lib/zip.d.ts +10 -0
- package/lib/zip.d.ts.map +1 -1
- package/lib/zip.js +33 -10
- package/lib/zip.js.map +1 -1
- package/package.json +21 -14
- package/src/check-license.ts +4 -3
- package/src/get.ts +7 -7
- package/src/http.ts +176 -0
- package/src/index.ts +4 -0
- package/src/list-options.ts +25 -0
- package/src/list.ts +48 -0
- package/src/main.ts +125 -34
- package/src/oidc.ts +65 -0
- package/src/publish-options.ts +8 -1
- package/src/publish.ts +208 -14
- package/src/registry-options.ts +8 -0
- package/src/registry.ts +379 -98
- package/src/search-options.ts +49 -0
- package/src/search.ts +95 -0
- package/src/show-options.ts +34 -0
- package/src/show.ts +328 -0
- package/src/table.ts +53 -0
- package/src/trusted-publishing-options.ts +30 -0
- package/src/trusted-publishing.ts +148 -0
- package/src/unpublish-options.ts +35 -0
- package/src/unpublish.ts +160 -0
- package/src/util.ts +138 -70
- package/src/verify-options.ts +25 -0
- package/src/verify-signature-options.ts +32 -0
- package/src/verify-signature.ts +124 -0
- package/src/verify.ts +107 -0
- package/src/zip.ts +33 -13
- package/lib/version.d.ts +0 -2
- package/lib/version.d.ts.map +0 -1
- package/lib/version.js +0 -5
- package/lib/version.js.map +0 -1
- package/src/version.ts +0 -1
package/lib/main.js
CHANGED
|
@@ -10,35 +10,44 @@
|
|
|
10
10
|
********************************************************************************/
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
const commander = require("commander");
|
|
13
|
-
const
|
|
13
|
+
const fs_1 = require("fs");
|
|
14
|
+
const path_1 = require("path");
|
|
14
15
|
const create_namespace_1 = require("./create-namespace");
|
|
15
16
|
const verify_pat_1 = require("./verify-pat");
|
|
16
17
|
const publish_1 = require("./publish");
|
|
18
|
+
const unpublish_1 = require("./unpublish");
|
|
17
19
|
const util_1 = require("./util");
|
|
18
20
|
const get_1 = require("./get");
|
|
21
|
+
const list_1 = require("./list");
|
|
22
|
+
const search_1 = require("./search");
|
|
23
|
+
const show_1 = require("./show");
|
|
24
|
+
const verify_1 = require("./verify");
|
|
25
|
+
const verify_signature_1 = require("./verify-signature");
|
|
19
26
|
const login_1 = require("./login");
|
|
20
27
|
const logout_1 = require("./logout");
|
|
21
|
-
|
|
28
|
+
// Resolves from both src/ (tests) and lib/ (published build); npm always ships package.json.
|
|
29
|
+
const LIB_VERSION = JSON.parse((0, fs_1.readFileSync)((0, path_1.join)(__dirname, '..', 'package.json'), 'utf8')).version;
|
|
22
30
|
module.exports = function (argv) {
|
|
23
31
|
const program = new commander.Command();
|
|
32
|
+
program.nameFromFilename(argv[1]);
|
|
24
33
|
program.usage('<command> [options]')
|
|
25
34
|
.option('-r, --registryUrl <url>', 'Use the registry API at this base URL.')
|
|
26
35
|
.option('-p, --pat <token>', 'Personal access token.')
|
|
27
36
|
.option('--debug', 'Include debug information on error')
|
|
28
|
-
.version(
|
|
37
|
+
.version(LIB_VERSION, '-V, --version', 'Print the Eclipse Open VSX CLI version');
|
|
29
38
|
const createNamespaceCmd = program.command('create-namespace <name>');
|
|
30
39
|
createNamespaceCmd.description('Create a new namespace')
|
|
31
40
|
.action((name) => {
|
|
32
|
-
const { registryUrl, pat } = program.opts();
|
|
41
|
+
const { registryUrl, pat, debug } = program.opts();
|
|
33
42
|
(0, create_namespace_1.createNamespace)({ name, registryUrl, pat })
|
|
34
|
-
.catch((0, util_1.handleError)(
|
|
43
|
+
.catch((0, util_1.handleError)(debug));
|
|
35
44
|
});
|
|
36
45
|
const verifyTokenCmd = program.command('verify-pat [namespace]');
|
|
37
46
|
verifyTokenCmd.description('Verify that a personal access token can publish to a namespace')
|
|
38
47
|
.action((namespace) => {
|
|
39
|
-
const { registryUrl, pat } = program.opts();
|
|
48
|
+
const { registryUrl, pat, debug } = program.opts();
|
|
40
49
|
(0, verify_pat_1.verifyPat)({ namespace, registryUrl, pat })
|
|
41
|
-
.catch((0, util_1.handleError)(
|
|
50
|
+
.catch((0, util_1.handleError)(debug));
|
|
42
51
|
});
|
|
43
52
|
const publishCmd = program.command('publish [extension.vsix]');
|
|
44
53
|
publishCmd.description('Publish an extension, packaging it first if necessary.')
|
|
@@ -47,12 +56,16 @@ module.exports = function (argv) {
|
|
|
47
56
|
.option('--baseContentUrl <url>', 'Prepend all relative links in README.md with this URL.')
|
|
48
57
|
.option('--baseImagesUrl <url>', 'Prepend all relative image links in README.md with this URL.')
|
|
49
58
|
.option('--yarn', 'Use yarn instead of npm while packing extension files.')
|
|
59
|
+
.option('--follow-symlinks', 'Recurse into symlinked directories instead of packing each symlink as a file.')
|
|
50
60
|
.option('--pre-release', 'Mark this package as a pre-release')
|
|
51
61
|
.option('--allow-missing-repository', 'Allow packaging an extension whose package.json has no repository field')
|
|
52
62
|
.option('--no-dependencies', 'Disable dependency detection via npm or yarn')
|
|
53
63
|
.option('--skip-duplicate', 'Fail silently if version already exists on the marketplace')
|
|
54
64
|
.option('--packageVersion <version>', 'Version of the provided VSIX packages.')
|
|
55
|
-
.
|
|
65
|
+
.option('--trusted-publishing', 'Exchange an OIDC ID token for a short-lived publishing token. Enabled automatically when a CI system provides an ID token and no access token is given.')
|
|
66
|
+
.option('--idToken <token>', 'The OIDC ID token to exchange. Only needed on CI systems that provide the token directly, e.g. GitLab CI.')
|
|
67
|
+
.option('--oidcAudience <audience>', 'Audience to request for the OIDC ID token. Defaults to the registry URL.')
|
|
68
|
+
.action((extensionFile, { target, packagePath, baseContentUrl, baseImagesUrl, yarn, followSymlinks, preRelease, allowMissingRepository, dependencies, skipDuplicate, packageVersion, trustedPublishing, idToken, oidcAudience }) => {
|
|
56
69
|
if (extensionFile !== undefined && packagePath !== undefined) {
|
|
57
70
|
console.error('\u274c Please specify either a package file or a package path, but not both.\n');
|
|
58
71
|
publishCmd.help();
|
|
@@ -67,19 +80,21 @@ module.exports = function (argv) {
|
|
|
67
80
|
console.warn("Ignoring option '--baseImagesUrl' for prepackaged extension.");
|
|
68
81
|
if (extensionFile !== undefined && yarn !== undefined)
|
|
69
82
|
console.warn("Ignoring option '--yarn' for prepackaged extension.");
|
|
83
|
+
if (extensionFile !== undefined && followSymlinks !== undefined)
|
|
84
|
+
console.warn("Ignoring option '--follow-symlinks' for prepackaged extension.");
|
|
70
85
|
if (extensionFile !== undefined && packageVersion !== undefined)
|
|
71
86
|
console.warn("Ignoring option '--packageVersion' for prepackaged extension.");
|
|
72
87
|
if (extensionFile !== undefined && allowMissingRepository !== undefined)
|
|
73
88
|
console.warn("Ignoring option '--allow-missing-repository' for prepackaged extension.");
|
|
74
|
-
const { registryUrl, pat } = program.opts();
|
|
75
|
-
(0, publish_1.publish)({ extensionFile, registryUrl, pat, targets: typeof target === 'string' ? [target] : target, packagePath: typeof packagePath === 'string' ? [packagePath] : packagePath, baseContentUrl, baseImagesUrl, yarn, preRelease, allowMissingRepository, dependencies, skipDuplicate, packageVersion })
|
|
89
|
+
const { registryUrl, pat, debug } = program.opts();
|
|
90
|
+
(0, publish_1.publish)({ extensionFile, registryUrl, pat, targets: typeof target === 'string' ? [target] : target, packagePath: typeof packagePath === 'string' ? [packagePath] : packagePath, baseContentUrl, baseImagesUrl, yarn, followSymlinks, preRelease, allowMissingRepository, dependencies, skipDuplicate, packageVersion, trustedPublishing, idToken, oidcAudience })
|
|
76
91
|
.then(results => {
|
|
77
92
|
const reasons = results.filter(result => result.status === 'rejected')
|
|
78
93
|
.map(rejectedResult => rejectedResult.reason);
|
|
79
94
|
if (reasons.length > 0) {
|
|
80
95
|
const message = 'See the documentation for more information:\n'
|
|
81
96
|
+ 'https://github.com/eclipse/openvsx/wiki/Publishing-Extensions';
|
|
82
|
-
const errorHandler = (0, util_1.handleError)(
|
|
97
|
+
const errorHandler = (0, util_1.handleError)(debug, message, false);
|
|
83
98
|
for (const reason of reasons) {
|
|
84
99
|
errorHandler(reason);
|
|
85
100
|
}
|
|
@@ -87,6 +102,52 @@ module.exports = function (argv) {
|
|
|
87
102
|
}
|
|
88
103
|
});
|
|
89
104
|
});
|
|
105
|
+
const unpublishCmd = program.command('unpublish [namespace.extension]');
|
|
106
|
+
unpublishCmd.description('Delete an extension or some of its versions from the registry.')
|
|
107
|
+
.option('-v, --versions <versions...>', 'Only delete the given versions.')
|
|
108
|
+
.option('-t, --target <targets...>', 'Only delete the given target architectures of the given versions.')
|
|
109
|
+
.option('-f, --force', 'Skip the confirmation prompt.')
|
|
110
|
+
.action((extensionId, { versions, target, force }) => {
|
|
111
|
+
const { registryUrl, pat, debug } = program.opts();
|
|
112
|
+
(0, unpublish_1.unpublish)({
|
|
113
|
+
extensionId,
|
|
114
|
+
versions: typeof versions === 'string' ? [versions] : versions,
|
|
115
|
+
targets: typeof target === 'string' ? [target] : target,
|
|
116
|
+
force,
|
|
117
|
+
registryUrl,
|
|
118
|
+
pat
|
|
119
|
+
}).catch((0, util_1.handleError)(debug));
|
|
120
|
+
});
|
|
121
|
+
const searchCmd = program.command('search [text]');
|
|
122
|
+
searchCmd.description('Search the registry for extensions.')
|
|
123
|
+
.option('-c, --category <category>', 'Only return extensions in this category.')
|
|
124
|
+
.option('-t, --target <target>', 'Only return extensions built for this target architecture.')
|
|
125
|
+
.option('-s, --size <size>', `Number of results to return (default ${search_1.DEFAULT_SEARCH_SIZE}).`, util_1.parseNonNegativeInt)
|
|
126
|
+
.option('-o, --offset <offset>', 'Index of the first result, for paging.', util_1.parseNonNegativeInt)
|
|
127
|
+
.option('--sort-by <key>', `Sort key: ${search_1.SORT_KEYS.join(', ')}.`)
|
|
128
|
+
.option('--sort-order <order>', `Sort order: ${search_1.SORT_ORDERS.join(', ')}.`)
|
|
129
|
+
.option('--json', 'Print the raw results as JSON.')
|
|
130
|
+
.action((text, { category, target, size, offset, sortBy, sortOrder, json }) => {
|
|
131
|
+
const { registryUrl, debug } = program.opts();
|
|
132
|
+
(0, search_1.search)({ text, category, target, size, offset, sortBy, sortOrder, json, registryUrl })
|
|
133
|
+
.catch((0, util_1.handleError)(debug));
|
|
134
|
+
});
|
|
135
|
+
const listCmd = program.command('list <namespace>');
|
|
136
|
+
listCmd.description('List the extensions published in a namespace.')
|
|
137
|
+
.option('--json', 'Print the raw namespace metadata as JSON.')
|
|
138
|
+
.action((namespace, { json }) => {
|
|
139
|
+
const { registryUrl, debug } = program.opts();
|
|
140
|
+
(0, list_1.list)({ namespace, json, registryUrl }).catch((0, util_1.handleError)(debug));
|
|
141
|
+
});
|
|
142
|
+
const showCmd = program.command('show <namespace.extension[@version]>');
|
|
143
|
+
showCmd.description('Show an extension\'s metadata.')
|
|
144
|
+
.option('-t, --target <target>', 'Only report on the given target architecture.')
|
|
145
|
+
.option('--all-versions', 'List every published version instead of the most recent few.')
|
|
146
|
+
.option('--json', 'Print the raw metadata as JSON.')
|
|
147
|
+
.action((extensionId, { target, allVersions, json }) => {
|
|
148
|
+
const { registryUrl, debug } = program.opts();
|
|
149
|
+
(0, show_1.show)({ extensionId, target, allVersions, json, registryUrl }).catch((0, util_1.handleError)(debug));
|
|
150
|
+
});
|
|
90
151
|
const getCmd = program.command('get <namespace.extension>');
|
|
91
152
|
getCmd.description('Download an extension or its metadata.')
|
|
92
153
|
.option('-t, --target <target>', 'Target architecture')
|
|
@@ -94,41 +155,59 @@ module.exports = function (argv) {
|
|
|
94
155
|
.option('-o, --output <path>', 'Save the output in the specified file or directory.')
|
|
95
156
|
.option('--metadata', 'Print the extension\'s metadata instead of downloading it.')
|
|
96
157
|
.action((extensionId, { target, versionRange, output, metadata }) => {
|
|
97
|
-
const { registryUrl } = program.opts();
|
|
158
|
+
const { registryUrl, debug } = program.opts();
|
|
98
159
|
(0, get_1.getExtension)({ extensionId, target: target, version: versionRange, registryUrl, output, metadata })
|
|
99
|
-
.catch((0, util_1.handleError)(
|
|
160
|
+
.catch((0, util_1.handleError)(debug));
|
|
161
|
+
});
|
|
162
|
+
const verifyCmd = program.command('verify <extension.vsix>');
|
|
163
|
+
verifyCmd.description('Verify a downloaded package\'s signature against the registry\'s public key.')
|
|
164
|
+
.option('-t, --target <target>', 'Target architecture')
|
|
165
|
+
.action((packagePath, { target }) => {
|
|
166
|
+
const { registryUrl, debug } = program.opts();
|
|
167
|
+
(0, verify_1.verify)({ packagePath, target, registryUrl })
|
|
168
|
+
.catch((0, util_1.handleError)(debug));
|
|
169
|
+
});
|
|
170
|
+
const verifySignatureCmd = program.command('verify-signature');
|
|
171
|
+
verifySignatureCmd.description('Verify a signature file against a package and manifest, entirely offline - like `vsce verify-signature`.')
|
|
172
|
+
.requiredOption('-i, --packagePath <path>', 'Path to the .vsix package.')
|
|
173
|
+
.requiredOption('-m, --manifestPath <path>', 'Path to the signature manifest file.')
|
|
174
|
+
.requiredOption('-s, --signaturePath <path>', 'Path to the signature file.')
|
|
175
|
+
.requiredOption('-k, --publicKeyPath <path>', 'Path to the registry\'s public key file.')
|
|
176
|
+
.action(({ packagePath, manifestPath, signaturePath, publicKeyPath }) => {
|
|
177
|
+
const { debug } = program.opts();
|
|
178
|
+
(0, verify_signature_1.verifySignature)({ packagePath, manifestPath, signaturePath, publicKeyPath })
|
|
179
|
+
.catch((0, util_1.handleError)(debug));
|
|
100
180
|
});
|
|
101
181
|
const loginCmd = program.command('login <namespace>');
|
|
102
182
|
loginCmd.description('Adds a namespace to the list of known namespaces')
|
|
103
183
|
.action((namespace) => {
|
|
104
|
-
const { registryUrl, pat } = program.opts();
|
|
105
|
-
(0, login_1.default)({ namespace, registryUrl, pat }).catch((0, util_1.handleError)(
|
|
184
|
+
const { registryUrl, pat, debug } = program.opts();
|
|
185
|
+
(0, login_1.default)({ namespace, registryUrl, pat }).catch((0, util_1.handleError)(debug));
|
|
106
186
|
});
|
|
107
187
|
const logoutCmd = program.command('logout <namespace>');
|
|
108
188
|
logoutCmd.description('Removes a namespace from the list of known namespaces')
|
|
109
189
|
.action((namespace) => {
|
|
110
|
-
|
|
190
|
+
const { debug } = program.opts();
|
|
191
|
+
(0, logout_1.default)(namespace).catch((0, util_1.handleError)(debug));
|
|
111
192
|
});
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
const
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
else {
|
|
125
|
-
console.error('Unknown command.');
|
|
126
|
-
}
|
|
193
|
+
// 'command:*' is deprecated in favor of catching the commander.unknownCommand error, but that
|
|
194
|
+
// error is reported (message written, process exited) by commander itself before a catch runs,
|
|
195
|
+
// so it can't reproduce this suggestion wording. Still supported for backwards compatibility.
|
|
196
|
+
program.on('command:*', (operands) => {
|
|
197
|
+
const availableCommands = program.commands.map(c => c.name());
|
|
198
|
+
const actualCommand = operands[0];
|
|
199
|
+
const suggestion = availableCommands.find(c => (0, util_1.levenshtein)(c, actualCommand) < c.length * 0.4);
|
|
200
|
+
if (suggestion)
|
|
201
|
+
console.error(`Unknown command '${actualCommand}', did you mean '${suggestion}'?\n`);
|
|
202
|
+
else
|
|
203
|
+
console.error(`Unknown command '${actualCommand}'.\n`);
|
|
204
|
+
process.exitCode = 1;
|
|
127
205
|
program.help();
|
|
128
206
|
});
|
|
129
|
-
program.parse(argv);
|
|
130
207
|
if (process.argv.length <= 2) {
|
|
208
|
+
// Commander 14 would otherwise print this to stderr and exit 1 during program.parse(argv) below.
|
|
131
209
|
program.help();
|
|
132
210
|
}
|
|
211
|
+
program.parse(argv);
|
|
133
212
|
};
|
|
134
213
|
//# sourceMappingURL=main.js.map
|
package/lib/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":";AAAA;;;;;;;;kFAQkF;;AAElF,uCAAuC;AACvC,+
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
|
package/lib/oidc.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/******************************************************************************
|
|
2
|
+
* Copyright (c) 2026 Contributors to the Eclipse Foundation.
|
|
3
|
+
*
|
|
4
|
+
* See the NOTICE file(s) distributed with this work for additional
|
|
5
|
+
* information regarding copyright ownership.
|
|
6
|
+
*
|
|
7
|
+
* This program and the accompanying materials are made available under the
|
|
8
|
+
* terms of the Eclipse Public License 2.0 which is available at
|
|
9
|
+
* https://www.eclipse.org/legal/epl-2.0.
|
|
10
|
+
*
|
|
11
|
+
* SPDX-License-Identifier: EPL-2.0
|
|
12
|
+
*****************************************************************************/
|
|
13
|
+
import { TrustedPublishingOptions } from './trusted-publishing-options';
|
|
14
|
+
/**
|
|
15
|
+
* Whether an OIDC ID token can be obtained without user interaction.
|
|
16
|
+
*/
|
|
17
|
+
export declare function hasIdTokenSource(options: TrustedPublishingOptions): boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Obtains an OIDC ID token for the given audience from the surrounding CI system.
|
|
20
|
+
*/
|
|
21
|
+
export declare function getIdToken(audience: string, options: TrustedPublishingOptions): Promise<string>;
|
|
22
|
+
//# sourceMappingURL=oidc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oidc.d.ts","sourceRoot":"","sources":["../src/oidc.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;+EAW+E;AAG/E,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AAGxE;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,wBAAwB,GAAG,OAAO,CAE3E;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,wBAAwB,GAAG,OAAO,CAAC,MAAM,CAAC,CAYrG"}
|
package/lib/oidc.js
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/******************************************************************************
|
|
3
|
+
* Copyright (c) 2026 Contributors to the Eclipse Foundation.
|
|
4
|
+
*
|
|
5
|
+
* See the NOTICE file(s) distributed with this work for additional
|
|
6
|
+
* information regarding copyright ownership.
|
|
7
|
+
*
|
|
8
|
+
* This program and the accompanying materials are made available under the
|
|
9
|
+
* terms of the Eclipse Public License 2.0 which is available at
|
|
10
|
+
* https://www.eclipse.org/legal/epl-2.0.
|
|
11
|
+
*
|
|
12
|
+
* SPDX-License-Identifier: EPL-2.0
|
|
13
|
+
*****************************************************************************/
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.hasIdTokenSource = hasIdTokenSource;
|
|
16
|
+
exports.getIdToken = getIdToken;
|
|
17
|
+
const http_1 = require("./http");
|
|
18
|
+
const util_1 = require("./util");
|
|
19
|
+
/**
|
|
20
|
+
* Whether an OIDC ID token can be obtained without user interaction.
|
|
21
|
+
*/
|
|
22
|
+
function hasIdTokenSource(options) {
|
|
23
|
+
return Boolean(options.idToken) || isGitHubActionsIdTokenAvailable();
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Obtains an OIDC ID token for the given audience from the surrounding CI system.
|
|
27
|
+
*/
|
|
28
|
+
async function getIdToken(audience, options) {
|
|
29
|
+
// CI systems such as GitLab CI provide the ID token directly as an environment variable
|
|
30
|
+
if (options.idToken) {
|
|
31
|
+
return options.idToken;
|
|
32
|
+
}
|
|
33
|
+
if (isGitHubActionsIdTokenAvailable()) {
|
|
34
|
+
return getGitHubActionsIdToken(audience);
|
|
35
|
+
}
|
|
36
|
+
throw new Error('No OIDC ID token available for trusted publishing.\n'
|
|
37
|
+
+ "On GitHub Actions, grant the job the 'id-token: write' permission.\n"
|
|
38
|
+
+ 'On other CI systems, pass the ID token via the --idToken argument '
|
|
39
|
+
+ 'or the OVSX_ID_TOKEN environment variable.');
|
|
40
|
+
}
|
|
41
|
+
function isGitHubActionsIdTokenAvailable() {
|
|
42
|
+
return Boolean(process.env.ACTIONS_ID_TOKEN_REQUEST_URL && process.env.ACTIONS_ID_TOKEN_REQUEST_TOKEN);
|
|
43
|
+
}
|
|
44
|
+
async function getGitHubActionsIdToken(audience) {
|
|
45
|
+
// the request URL already carries an api-version query parameter, so keep its query intact
|
|
46
|
+
const url = new URL(process.env.ACTIONS_ID_TOKEN_REQUEST_URL);
|
|
47
|
+
url.searchParams.set('audience', audience);
|
|
48
|
+
// Sent with only these headers, so none of the registry's credentials reach the CI system's
|
|
49
|
+
// token service. OVSX_TIMEOUT still applies, as there are no registry options to read it from.
|
|
50
|
+
const response = await (0, http_1.getJson)(url, {
|
|
51
|
+
'Authorization': `Bearer ${process.env.ACTIONS_ID_TOKEN_REQUEST_TOKEN}`,
|
|
52
|
+
'Accept': 'application/json'
|
|
53
|
+
}, (0, util_1.configuredTimeout)());
|
|
54
|
+
if (!response.value) {
|
|
55
|
+
throw new Error('GitHub Actions did not return an OIDC ID token.');
|
|
56
|
+
}
|
|
57
|
+
return response.value;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=oidc.js.map
|
package/lib/oidc.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oidc.js","sourceRoot":"","sources":["../src/oidc.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;+EAW+E;;AAS/E,4CAEC;AAKD,gCAYC;AA1BD,iCAAiC;AAEjC,iCAA2C;AAE3C;;GAEG;AACH,SAAgB,gBAAgB,CAAC,OAAiC;IAC9D,OAAO,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,+BAA+B,EAAE,CAAC;AACzE,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,UAAU,CAAC,QAAgB,EAAE,OAAiC;IAChF,wFAAwF;IACxF,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QAClB,OAAO,OAAO,CAAC,OAAO,CAAC;IAC3B,CAAC;IACD,IAAI,+BAA+B,EAAE,EAAE,CAAC;QACpC,OAAO,uBAAuB,CAAC,QAAQ,CAAC,CAAC;IAC7C,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,sDAAsD;UAChE,sEAAsE;UACtE,oEAAoE;UACpE,4CAA4C,CAAC,CAAC;AACxD,CAAC;AAED,SAAS,+BAA+B;IACpC,OAAO,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,4BAA4B,IAAI,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;AAC3G,CAAC;AAED,KAAK,UAAU,uBAAuB,CAAC,QAAgB;IACnD,2FAA2F;IAC3F,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,4BAA6B,CAAC,CAAC;IAC/D,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAC3C,4FAA4F;IAC5F,+FAA+F;IAC/F,MAAM,QAAQ,GAAG,MAAM,IAAA,cAAO,EAAwB,GAAG,EAAE;QACvD,eAAe,EAAE,UAAU,OAAO,CAAC,GAAG,CAAC,8BAA8B,EAAE;QACvE,QAAQ,EAAE,kBAAkB;KAC/B,EAAE,IAAA,wBAAiB,GAAE,CAAC,CAAC;IACxB,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACvE,CAAC;IACD,OAAO,QAAQ,CAAC,KAAK,CAAC;AAC1B,CAAC"}
|
package/lib/publish-options.d.ts
CHANGED
|
@@ -8,7 +8,8 @@
|
|
|
8
8
|
* SPDX-License-Identifier: EPL-2.0
|
|
9
9
|
********************************************************************************/
|
|
10
10
|
import { RegistryOptions } from './registry-options';
|
|
11
|
-
|
|
11
|
+
import { TrustedPublishingOptions } from './trusted-publishing-options';
|
|
12
|
+
export interface PublishCommonOptions extends RegistryOptions, TrustedPublishingOptions {
|
|
12
13
|
/**
|
|
13
14
|
* Path to the vsix file to be published. Cannot be used together with `packagePath`.
|
|
14
15
|
*/
|
|
@@ -25,6 +26,12 @@ export interface PublishCommonOptions extends RegistryOptions {
|
|
|
25
26
|
* Should use `yarn` instead of `npm`. Only valid with `packagePath`.
|
|
26
27
|
*/
|
|
27
28
|
yarn?: boolean;
|
|
29
|
+
/**
|
|
30
|
+
* Recurse into symlinked directories when collecting the files to pack, instead of packing each
|
|
31
|
+
* symlink as a file. Needed for a `node_modules` built out of symlinks, as pnpm's is. Only valid
|
|
32
|
+
* with `packagePath`.
|
|
33
|
+
*/
|
|
34
|
+
followSymlinks?: boolean;
|
|
28
35
|
/**
|
|
29
36
|
* Mark this package as a pre-release. Only valid with `packagePath`.
|
|
30
37
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"publish-options.d.ts","sourceRoot":"","sources":["../src/publish-options.ts"],"names":[],"mappings":"AAAA;;;;;;;;kFAQkF;AAClF,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"publish-options.d.ts","sourceRoot":"","sources":["../src/publish-options.ts"],"names":[],"mappings":"AAAA;;;;;;;;kFAQkF;AAClF,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AAExE,MAAM,WAAW,oBAAqB,SAAQ,eAAe,EAAE,wBAAwB;IACnF;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;OAEG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IACf;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;OAGG;IACH,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC;;OAEG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CAC3B;AAGD,MAAM,WAAW,cAAe,SAAQ,oBAAoB;IAExD;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IAEnB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IAEvB;;OAEG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CAC1B"}
|
package/lib/publish.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"publish.d.ts","sourceRoot":"","sources":["../src/publish.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"publish.d.ts","sourceRoot":"","sources":["../src/publish.ts"],"names":[],"mappings":"AAwBA,OAAO,EAAE,cAAc,EAAwB,MAAM,mBAAmB,CAAC;AAMzE;;GAEG;AACH,wBAAsB,OAAO,CAAC,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC,CAoBjG"}
|
package/lib/publish.js
CHANGED
|
@@ -10,49 +10,104 @@ exports.publish = publish;
|
|
|
10
10
|
*
|
|
11
11
|
* SPDX-License-Identifier: EPL-2.0
|
|
12
12
|
********************************************************************************/
|
|
13
|
+
const fs = require("fs");
|
|
14
|
+
const semver = require("semver");
|
|
13
15
|
const vsce_1 = require("@vscode/vsce");
|
|
14
16
|
const pat_1 = require("./pat");
|
|
15
17
|
const util_1 = require("./util");
|
|
16
18
|
const registry_1 = require("./registry");
|
|
17
19
|
const check_license_1 = require("./check-license");
|
|
18
20
|
const zip_1 = require("./zip");
|
|
21
|
+
const trusted_publishing_1 = require("./trusted-publishing");
|
|
22
|
+
/** Registries older than this cannot report the limit that applies to a namespace. */
|
|
23
|
+
const MIN_SIZE_LIMIT_REGISTRY_VERSION = '1.3.0';
|
|
19
24
|
/**
|
|
20
25
|
* Publishes an extension.
|
|
21
26
|
*/
|
|
22
27
|
async function publish(options = {}) {
|
|
23
28
|
(0, util_1.addEnvOptions)(options);
|
|
29
|
+
(0, util_1.addTrustedPublishingEnvOptions)(options);
|
|
30
|
+
// Shared by every target/package below, rather than one per artifact: besides saving the extra
|
|
31
|
+
// `/api/version` round trips, it's also where the registry's reported version is cached (see
|
|
32
|
+
// Registry.tokenQuery), so a wide fan-out doesn't repeat that lookup once per target either.
|
|
33
|
+
const registry = new registry_1.Registry(options);
|
|
34
|
+
const maxExtensionSize = await getMaxExtensionSize(registry);
|
|
24
35
|
const internalPublishOptions = [];
|
|
25
36
|
const packagePaths = options.packagePath || [undefined];
|
|
26
37
|
const targets = options.targets || [undefined];
|
|
27
38
|
for (const packagePath of packagePaths) {
|
|
28
39
|
for (const target of targets) {
|
|
29
|
-
internalPublishOptions.push({ ...options, packagePath: packagePath, target: target });
|
|
40
|
+
internalPublishOptions.push({ ...options, packagePath: packagePath, target: target, maxExtensionSize });
|
|
30
41
|
}
|
|
31
42
|
}
|
|
32
|
-
return Promise.allSettled(internalPublishOptions.map(publishOptions => doPublish(publishOptions)));
|
|
43
|
+
return Promise.allSettled(internalPublishOptions.map(publishOptions => doPublish(registry, publishOptions)));
|
|
33
44
|
}
|
|
34
|
-
|
|
45
|
+
/**
|
|
46
|
+
* Looks up the registry's default extension size limit, so an oversized package can be flagged
|
|
47
|
+
* before the upload instead of after transferring the whole payload.
|
|
48
|
+
*
|
|
49
|
+
* Best-effort: registries that don't expose `/api/version`, or don't report a limit, return
|
|
50
|
+
* `undefined` here, and nothing is said about the size.
|
|
51
|
+
*/
|
|
52
|
+
async function getMaxExtensionSize(registry) {
|
|
53
|
+
try {
|
|
54
|
+
return (await registry.getRegistryVersion()).maxExtensionSize || undefined;
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
return undefined;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
async function doPublish(registry, options = {}) {
|
|
35
61
|
// if the packagePath is a link to a vsix, don't need to package it
|
|
36
62
|
if (options.packagePath?.endsWith('.vsix')) {
|
|
37
63
|
options.extensionFile = options.packagePath;
|
|
38
64
|
delete options.packagePath;
|
|
39
65
|
delete options.target;
|
|
40
66
|
}
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
67
|
+
// Only a package created here is a temp file; one the user supplied must never be deleted.
|
|
68
|
+
const packaged = !options.extensionFile;
|
|
69
|
+
try {
|
|
70
|
+
if (packaged) {
|
|
71
|
+
await packageExtension(options, registry);
|
|
72
|
+
console.log(); // new line
|
|
73
|
+
}
|
|
74
|
+
else if (options.preRelease) {
|
|
75
|
+
console.warn("Ignoring option '--pre-release' for prepackaged extension.");
|
|
76
|
+
}
|
|
77
|
+
await publishExtensionFile(registry, options);
|
|
45
78
|
}
|
|
46
|
-
|
|
47
|
-
|
|
79
|
+
finally {
|
|
80
|
+
if (packaged && options.extensionFile) {
|
|
81
|
+
// Caught rather than awaited plainly: a failure here (e.g. the temp dir is locked or
|
|
82
|
+
// read-only) must not replace whatever error publishExtensionFile already threw above.
|
|
83
|
+
await fs.promises.rm(options.extensionFile, { force: true }).catch(err => {
|
|
84
|
+
console.warn(`Could not delete temporary file ${options.extensionFile}: ${err.message}`);
|
|
85
|
+
});
|
|
86
|
+
}
|
|
48
87
|
}
|
|
88
|
+
}
|
|
89
|
+
async function publishExtensionFile(registry, options) {
|
|
90
|
+
// Read up front rather than only when a token has to be obtained: the size limit is looked up per
|
|
91
|
+
// namespace, and the namespace lives in the manifest.
|
|
92
|
+
const manifest = await (0, zip_1.readVSIXPackage)(options.extensionFile);
|
|
93
|
+
// Set only when this publish obtained the token itself through trusted publishing, which is the one
|
|
94
|
+
// case where a refusal can be answered by asking for a new token.
|
|
95
|
+
let exchanged;
|
|
49
96
|
if (!options.pat) {
|
|
50
|
-
|
|
51
|
-
|
|
97
|
+
if ((0, trusted_publishing_1.useTrustedPublishing)(options)) {
|
|
98
|
+
exchanged = { namespace: manifest.publisher, extension: manifest.name };
|
|
99
|
+
options.pat = await (0, trusted_publishing_1.getTrustedPublishingToken)(registry, manifest.publisher, manifest.name, options);
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
options.pat = await (0, pat_1.getPAT)(manifest.publisher, options);
|
|
103
|
+
}
|
|
52
104
|
}
|
|
105
|
+
// After the token is resolved, because the lookup is authenticated - and by here a token always
|
|
106
|
+
// exists, whether supplied, fetched, or exchanged through trusted publishing.
|
|
107
|
+
const sizeLimit = await ensureWithinSizeLimit(registry, options, manifest);
|
|
53
108
|
let extension;
|
|
54
109
|
try {
|
|
55
|
-
extension = await registry
|
|
110
|
+
extension = await doRegistryPublish(registry, options, exchanged, sizeLimit);
|
|
56
111
|
}
|
|
57
112
|
catch (err) {
|
|
58
113
|
if (options.skipDuplicate && err.message.endsWith('is already published.')) {
|
|
@@ -76,11 +131,92 @@ async function doPublish(options = {}) {
|
|
|
76
131
|
console.log(`\n!! ${extension.warning}`);
|
|
77
132
|
}
|
|
78
133
|
}
|
|
134
|
+
/**
|
|
135
|
+
* Publishes the package, exchanging the ID token again if the registry refuses the trusted publishing
|
|
136
|
+
* token this was using. The issued token is short-lived and shared by every target platform of a
|
|
137
|
+
* release, so publishing a wide fan-out of large packages can outlive it and be refused partway
|
|
138
|
+
* through - having authorised the release and then failing it over an expiry would be the wrong call.
|
|
139
|
+
*
|
|
140
|
+
* Only ever retried once, and only for a token obtained here: nothing this can do makes a token the
|
|
141
|
+
* user supplied valid, and a second refusal means the token is not the problem.
|
|
142
|
+
*/
|
|
143
|
+
async function doRegistryPublish(registry, options, exchanged, sizeLimit) {
|
|
144
|
+
try {
|
|
145
|
+
return await registry.publish(options.extensionFile, options.pat, sizeLimit);
|
|
146
|
+
}
|
|
147
|
+
catch (err) {
|
|
148
|
+
if (!exchanged || err?.status !== 401) {
|
|
149
|
+
throw err;
|
|
150
|
+
}
|
|
151
|
+
console.log('The registry refused the publishing token, requesting a new one');
|
|
152
|
+
options.pat = await (0, trusted_publishing_1.refreshTrustedPublishingToken)(registry, exchanged.namespace, exchanged.extension, options, options.pat);
|
|
153
|
+
return registry.publish(options.extensionFile, options.pat, sizeLimit);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Refuses a package the registry would reject anyway, before uploading it, and reports how many
|
|
158
|
+
* bytes it has concluded may be sent - the caller raises the transport cap to that, so nothing we
|
|
159
|
+
* decided to upload is then refused locally.
|
|
160
|
+
*
|
|
161
|
+
* The limit is the one that applies to this package's namespace and extension, which a size override
|
|
162
|
+
* can raise above the registry default. Registries older than
|
|
163
|
+
* {@link MIN_SIZE_LIMIT_REGISTRY_VERSION} cannot report it, so there the check stays advisory: it
|
|
164
|
+
* warns against the default and publishes, rather than refusing an upload those registries would
|
|
165
|
+
* have accepted.
|
|
166
|
+
*/
|
|
167
|
+
async function ensureWithinSizeLimit(registry, options, manifest) {
|
|
168
|
+
const { size } = await fs.promises.stat(options.extensionFile);
|
|
169
|
+
const limit = await resolveSizeLimit(registry, options, manifest);
|
|
170
|
+
if (limit.kind === 'failed') {
|
|
171
|
+
// Always said, however small the package: a size override can lower a limit as well as raise
|
|
172
|
+
// it, so there is no size from which it follows that this upload is fine. Staying quiet here
|
|
173
|
+
// left a registry whose /api/-/* routes never arrive indistinguishable from a working one.
|
|
174
|
+
console.warn(`Could not check the size limit for ${manifest.publisher}.${manifest.name} at ${registry.url} `
|
|
175
|
+
+ `(${limit.reason}). Publishing anyway: the registry enforces its own limit, so an oversized `
|
|
176
|
+
+ `package is refused after the upload rather than before it.`);
|
|
177
|
+
}
|
|
178
|
+
else if (limit.kind === 'unsupported') {
|
|
179
|
+
const fallback = options.maxExtensionSize;
|
|
180
|
+
if (fallback && size > fallback) {
|
|
181
|
+
console.warn(`The extension package (${(0, util_1.formatBytes)(size)}) exceeds the default size limit of ${(0, util_1.formatBytes)(fallback)} `
|
|
182
|
+
+ `reported by the registry at ${registry.url}, which is too old to report the limit for a `
|
|
183
|
+
+ `single namespace. Publishing anyway: the namespace may have a different limit configured, `
|
|
184
|
+
+ `and the registry decides.`);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
if (limit.kind !== 'resolved') {
|
|
188
|
+
// The allowance is this package, not the built-in publish size: having decided to send it and
|
|
189
|
+
// let the registry answer, the transport cap must not be what refuses it instead. An older
|
|
190
|
+
// registry whose default is above 512 MiB would otherwise reject a package it would accept.
|
|
191
|
+
return size;
|
|
192
|
+
}
|
|
193
|
+
if (size > limit.limit) {
|
|
194
|
+
throw new Error(`The extension package (${(0, util_1.formatBytes)(size)}) exceeds the size limit of ${(0, util_1.formatBytes)(limit.limit)} `
|
|
195
|
+
+ `for ${manifest.publisher}.${manifest.name} at ${registry.url}.`);
|
|
196
|
+
}
|
|
197
|
+
return limit.limit;
|
|
198
|
+
}
|
|
199
|
+
async function resolveSizeLimit(registry, options, manifest) {
|
|
200
|
+
const reported = await registry.getRegistryVersion().catch(() => undefined);
|
|
201
|
+
const version = reported?.version ? semver.coerce(reported.version) : undefined;
|
|
202
|
+
if (!version || semver.lt(version, MIN_SIZE_LIMIT_REGISTRY_VERSION)) {
|
|
203
|
+
return { kind: 'unsupported' };
|
|
204
|
+
}
|
|
205
|
+
try {
|
|
206
|
+
const { maxSize } = await registry.getSizeLimit(manifest.publisher, manifest.name, options.pat);
|
|
207
|
+
return { kind: 'resolved', limit: maxSize };
|
|
208
|
+
}
|
|
209
|
+
catch (err) {
|
|
210
|
+
// The registry claims to be new enough but could not answer. It enforces the limit itself
|
|
211
|
+
// regardless, so publish rather than refusing on a failed lookup.
|
|
212
|
+
return { kind: 'failed', reason: err instanceof Error ? err.message : String(err) };
|
|
213
|
+
}
|
|
214
|
+
}
|
|
79
215
|
async function packageExtension(options, registry) {
|
|
80
216
|
if (registry.requiresLicense) {
|
|
81
217
|
await (0, check_license_1.checkLicense)(options.packagePath);
|
|
82
218
|
}
|
|
83
|
-
options.extensionFile =
|
|
219
|
+
options.extensionFile = (0, util_1.getTempFilePath)('.vsix');
|
|
84
220
|
const packageOptions = {
|
|
85
221
|
packagePath: options.extensionFile,
|
|
86
222
|
target: options.target,
|
|
@@ -88,6 +224,7 @@ async function packageExtension(options, registry) {
|
|
|
88
224
|
baseContentUrl: options.baseContentUrl,
|
|
89
225
|
baseImagesUrl: options.baseImagesUrl,
|
|
90
226
|
useYarn: options.yarn,
|
|
227
|
+
followSymlinks: options.followSymlinks,
|
|
91
228
|
dependencies: options.dependencies,
|
|
92
229
|
preRelease: options.preRelease,
|
|
93
230
|
allowMissingRepository: options.allowMissingRepository,
|