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.
Files changed (132) hide show
  1. package/README.md +73 -1
  2. package/lib/check-license.d.ts.map +1 -1
  3. package/lib/check-license.js +3 -2
  4. package/lib/check-license.js.map +1 -1
  5. package/lib/get.js +6 -6
  6. package/lib/get.js.map +1 -1
  7. package/lib/http.d.ts +32 -0
  8. package/lib/http.d.ts.map +1 -0
  9. package/lib/http.js +170 -0
  10. package/lib/http.js.map +1 -0
  11. package/lib/index.d.ts +4 -0
  12. package/lib/index.d.ts.map +1 -1
  13. package/lib/index.js +4 -0
  14. package/lib/index.js.map +1 -1
  15. package/lib/list-options.d.ts +24 -0
  16. package/lib/list-options.d.ts.map +1 -0
  17. package/lib/list-options.js +15 -0
  18. package/lib/list-options.js.map +1 -0
  19. package/lib/list.d.ts +18 -0
  20. package/lib/list.d.ts.map +1 -0
  21. package/lib/list.js +46 -0
  22. package/lib/list.js.map +1 -0
  23. package/lib/main.js +111 -32
  24. package/lib/main.js.map +1 -1
  25. package/lib/oidc.d.ts +22 -0
  26. package/lib/oidc.d.ts.map +1 -0
  27. package/lib/oidc.js +59 -0
  28. package/lib/oidc.js.map +1 -0
  29. package/lib/publish-options.d.ts +8 -1
  30. package/lib/publish-options.d.ts.map +1 -1
  31. package/lib/publish.d.ts.map +1 -1
  32. package/lib/publish.js +150 -13
  33. package/lib/publish.js.map +1 -1
  34. package/lib/registry-options.d.ts +8 -0
  35. package/lib/registry-options.d.ts.map +1 -1
  36. package/lib/registry.d.ts +161 -5
  37. package/lib/registry.d.ts.map +1 -1
  38. package/lib/registry.js +259 -100
  39. package/lib/registry.js.map +1 -1
  40. package/lib/search-options.d.ts +48 -0
  41. package/lib/search-options.d.ts.map +1 -0
  42. package/lib/search-options.js +15 -0
  43. package/lib/search-options.js.map +1 -0
  44. package/lib/search.d.ts +22 -0
  45. package/lib/search.d.ts.map +1 -0
  46. package/lib/search.js +86 -0
  47. package/lib/search.js.map +1 -0
  48. package/lib/show-options.d.ts +33 -0
  49. package/lib/show-options.d.ts.map +1 -0
  50. package/lib/show-options.js +15 -0
  51. package/lib/show-options.js.map +1 -0
  52. package/lib/show.d.ts +18 -0
  53. package/lib/show.d.ts.map +1 -0
  54. package/lib/show.js +289 -0
  55. package/lib/show.js.map +1 -0
  56. package/lib/table.d.ts +27 -0
  57. package/lib/table.d.ts.map +1 -0
  58. package/lib/table.js +56 -0
  59. package/lib/table.js.map +1 -0
  60. package/lib/trusted-publishing-options.d.ts +30 -0
  61. package/lib/trusted-publishing-options.d.ts.map +1 -0
  62. package/lib/trusted-publishing-options.js +15 -0
  63. package/lib/trusted-publishing-options.js.map +1 -0
  64. package/lib/trusted-publishing.d.ts +35 -0
  65. package/lib/trusted-publishing.d.ts.map +1 -0
  66. package/lib/trusted-publishing.js +112 -0
  67. package/lib/trusted-publishing.js.map +1 -0
  68. package/lib/unpublish-options.d.ts +34 -0
  69. package/lib/unpublish-options.d.ts.map +1 -0
  70. package/lib/unpublish-options.js +15 -0
  71. package/lib/unpublish-options.js.map +1 -0
  72. package/lib/unpublish.d.ts +22 -0
  73. package/lib/unpublish.d.ts.map +1 -0
  74. package/lib/unpublish.js +137 -0
  75. package/lib/unpublish.js.map +1 -0
  76. package/lib/util.d.ts +51 -9
  77. package/lib/util.d.ts.map +1 -1
  78. package/lib/util.js +130 -67
  79. package/lib/util.js.map +1 -1
  80. package/lib/verify-options.d.ts +24 -0
  81. package/lib/verify-options.d.ts.map +1 -0
  82. package/lib/verify-options.js +15 -0
  83. package/lib/verify-options.js.map +1 -0
  84. package/lib/verify-signature-options.d.ts +32 -0
  85. package/lib/verify-signature-options.d.ts.map +1 -0
  86. package/lib/verify-signature-options.js +15 -0
  87. package/lib/verify-signature-options.js.map +1 -0
  88. package/lib/verify-signature.d.ts +28 -0
  89. package/lib/verify-signature.d.ts.map +1 -0
  90. package/lib/verify-signature.js +105 -0
  91. package/lib/verify-signature.js.map +1 -0
  92. package/lib/verify.d.ts +21 -0
  93. package/lib/verify.d.ts.map +1 -0
  94. package/lib/verify.js +97 -0
  95. package/lib/verify.js.map +1 -0
  96. package/lib/zip.d.ts +10 -0
  97. package/lib/zip.d.ts.map +1 -1
  98. package/lib/zip.js +33 -10
  99. package/lib/zip.js.map +1 -1
  100. package/package.json +21 -14
  101. package/src/check-license.ts +4 -3
  102. package/src/get.ts +7 -7
  103. package/src/http.ts +176 -0
  104. package/src/index.ts +4 -0
  105. package/src/list-options.ts +25 -0
  106. package/src/list.ts +48 -0
  107. package/src/main.ts +125 -34
  108. package/src/oidc.ts +65 -0
  109. package/src/publish-options.ts +8 -1
  110. package/src/publish.ts +208 -14
  111. package/src/registry-options.ts +8 -0
  112. package/src/registry.ts +379 -98
  113. package/src/search-options.ts +49 -0
  114. package/src/search.ts +95 -0
  115. package/src/show-options.ts +34 -0
  116. package/src/show.ts +328 -0
  117. package/src/table.ts +53 -0
  118. package/src/trusted-publishing-options.ts +30 -0
  119. package/src/trusted-publishing.ts +148 -0
  120. package/src/unpublish-options.ts +35 -0
  121. package/src/unpublish.ts +160 -0
  122. package/src/util.ts +138 -70
  123. package/src/verify-options.ts +25 -0
  124. package/src/verify-signature-options.ts +32 -0
  125. package/src/verify-signature.ts +124 -0
  126. package/src/verify.ts +107 -0
  127. package/src/zip.ts +33 -13
  128. package/lib/version.d.ts +0 -2
  129. package/lib/version.d.ts.map +0 -1
  130. package/lib/version.js +0 -5
  131. package/lib/version.js.map +0 -1
  132. 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 leven = require("leven");
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
- const version_1 = require("./version");
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(version_1.LIB_VERSION, '-V, --version', 'Print the Eclipse Open VSX CLI 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)(program.debug));
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)(program.debug));
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
- .action((extensionFile, { target, packagePath, baseContentUrl, baseImagesUrl, yarn, preRelease, allowMissingRepository, dependencies, skipDuplicate, packageVersion }) => {
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)(program.debug, message, false);
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)(program.debug));
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)(program.debug));
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
- (0, logout_1.default)(namespace).catch((0, util_1.handleError)(program.debug));
190
+ const { debug } = program.opts();
191
+ (0, logout_1.default)(namespace).catch((0, util_1.handleError)(debug));
111
192
  });
112
- program
113
- .command('*', '', { noHelp: true })
114
- .action((cmd) => {
115
- const availableCommands = program.commands.map((c) => c._name);
116
- const actualCommand = cmd.args[0];
117
- if (actualCommand) {
118
- const suggestion = availableCommands.find(c => leven(c, actualCommand) < c.length * 0.4);
119
- if (suggestion)
120
- console.error(`Unknown command '${actualCommand}', did you mean '${suggestion}'?\n`);
121
- else
122
- console.error(`Unknown command '${actualCommand}'.\n`);
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":"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"}
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
@@ -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"}
@@ -8,7 +8,8 @@
8
8
  * SPDX-License-Identifier: EPL-2.0
9
9
  ********************************************************************************/
10
10
  import { RegistryOptions } from './registry-options';
11
- export interface PublishCommonOptions extends RegistryOptions {
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;AAErD,MAAM,WAAW,oBAAqB,SAAQ,eAAe;IACzD;;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;;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"}
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"}
@@ -1 +1 @@
1
- {"version":3,"file":"publish.d.ts","sourceRoot":"","sources":["../src/publish.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,cAAc,EAAwB,MAAM,mBAAmB,CAAC;AAEzE;;GAEG;AACH,wBAAsB,OAAO,CAAC,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC,CAYjG"}
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
- async function doPublish(options = {}) {
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
- const registry = new registry_1.Registry(options);
42
- if (!options.extensionFile) {
43
- await packageExtension(options, registry);
44
- console.log(); // new line
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
- else if (options.preRelease) {
47
- console.warn("Ignoring option '--pre-release' for prepackaged extension.");
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
- const namespace = (await (0, zip_1.readVSIXPackage)(options.extensionFile)).publisher;
51
- options.pat = await (0, pat_1.getPAT)(namespace, options);
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.publish(options.extensionFile, options.pat);
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 = await (0, util_1.createTempFile)({ postfix: '.vsix' });
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,