@equicord/publish-browser-extension 4.0.1 → 4.0.3

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/dist/cli.js CHANGED
@@ -1,10 +1,10 @@
1
- import { d as chromeStatus, n as submit, t as init, u as chromeSetDeployPercentage } from "./init-CL9ikrQH.js";
1
+ import { d as chromeStatus, n as submit, t as init, u as chromeSetDeployPercentage } from "./init-CB96xhAw.js";
2
2
  import { cac } from "cac";
3
3
  import { consola as consola$1 } from "consola";
4
4
  import { config } from "dotenv";
5
5
 
6
6
  //#region package.json
7
- var version = "4.0.1";
7
+ var version = "4.0.3";
8
8
 
9
9
  //#endregion
10
10
  //#region src/cli.ts
package/dist/index.d.ts CHANGED
@@ -203,6 +203,12 @@ declare class FirefoxAddonStore implements Store {
203
203
  ensureZipsExist(): Promise<void>;
204
204
  submit(dryRun?: boolean): Promise<void>;
205
205
  private uploadAndPollValidation;
206
+ /**
207
+ * Ensure the extension id is wrapped in curly braces, that's what the addon store API is expecting
208
+ * @example
209
+ * "test" -> "{test}"
210
+ */
211
+ private get wrappedExtensionId();
206
212
  }
207
213
  //#endregion
208
214
  //#region src/edge/edge-api.d.ts
package/dist/index.js CHANGED
@@ -1,3 +1,3 @@
1
- import { a as FirefoxAddonStoreOptions, c as EdgeAddonStoreOptions, d as chromeStatus, f as ChromeWebStore, i as FirefoxAddonStore, l as EdgeApi, m as CwsApi, n as submit, o as AddonsApi, p as ChromeWebStoreOptions, r as InlineConfig, s as EdgeAddonStore, t as init, u as chromeSetDeployPercentage } from "./init-CL9ikrQH.js";
1
+ import { a as FirefoxAddonStoreOptions, c as EdgeAddonStoreOptions, d as chromeStatus, f as ChromeWebStore, i as FirefoxAddonStore, l as EdgeApi, m as CwsApi, n as submit, o as AddonsApi, p as ChromeWebStoreOptions, r as InlineConfig, s as EdgeAddonStore, t as init, u as chromeSetDeployPercentage } from "./init-CB96xhAw.js";
2
2
 
3
3
  export { AddonsApi, ChromeWebStore, ChromeWebStoreOptions, CwsApi, EdgeAddonStore, EdgeAddonStoreOptions, EdgeApi, FirefoxAddonStore, FirefoxAddonStoreOptions, InlineConfig, chromeSetDeployPercentage, chromeStatus, init, submit };
@@ -1,6 +1,6 @@
1
1
  import { createRequire } from "node:module";
2
2
  import { Listr } from "listr2";
3
- import { createFetch, ofetch } from "ofetch";
3
+ import { createFetch } from "ofetch";
4
4
  import { z } from "zod/v4";
5
5
  import fs, { copyFile, readFile, writeFile } from "node:fs/promises";
6
6
  import consola, { consola as consola$1 } from "consola";
@@ -9,6 +9,7 @@ import { FormData } from "formdata-node";
9
9
  import { fileFromPath } from "formdata-node/file-from-path";
10
10
  import { FormDataEncoder } from "form-data-encoder";
11
11
  import { Readable } from "node:stream";
12
+ import http from "http";
12
13
 
13
14
  //#region rolldown:runtime
14
15
  var __create = Object.create;
@@ -38,7 +39,7 @@ var __require = /* @__PURE__ */ createRequire(import.meta.url);
38
39
 
39
40
  //#endregion
40
41
  //#region src/utils/fetch.ts
41
- const fetch = createFetch({ defaults: { onResponseError: (ctx) => {
42
+ const fetch$1 = createFetch({ defaults: { onResponseError: (ctx) => {
42
43
  console.log("Request:", ctx.request);
43
44
  console.log("Response:", JSON.stringify(ctx.response, null, 2));
44
45
  } } });
@@ -70,7 +71,7 @@ var CwsApi = class {
70
71
  }
71
72
  async uploadZip(params) {
72
73
  const Authorization = this.getAuthHeader(params.token);
73
- return fetch(this.uploadEndpoint(params.extensionId), {
74
+ return fetch$1(this.uploadEndpoint(params.extensionId), {
74
75
  method: "POST",
75
76
  body: Bun.file(params.zipFile),
76
77
  headers: {
@@ -85,7 +86,7 @@ var CwsApi = class {
85
86
  if (params.publishType) body.publishType = params.publishType;
86
87
  if (params.deployPercentage != null) body.deployInfos = [{ deployPercentage: params.deployPercentage }];
87
88
  if (params.skipReview != null) body.skipReview = params.skipReview;
88
- return fetch(this.publishEndpoint(params.extensionId), {
89
+ return fetch$1(this.publishEndpoint(params.extensionId), {
89
90
  method: "POST",
90
91
  headers: {
91
92
  Authorization,
@@ -96,21 +97,21 @@ var CwsApi = class {
96
97
  }
97
98
  async fetchStatus(params) {
98
99
  const Authorization = this.getAuthHeader(params.token);
99
- return fetch(this.fetchStatusEndpoint(params.extensionId), {
100
+ return fetch$1(this.fetchStatusEndpoint(params.extensionId), {
100
101
  method: "GET",
101
102
  headers: { Authorization }
102
103
  });
103
104
  }
104
105
  async cancelSubmission(params) {
105
106
  const Authorization = this.getAuthHeader(params.token);
106
- await fetch(this.cancelSubmissionEndpoint(params.extensionId), {
107
+ await fetch$1(this.cancelSubmissionEndpoint(params.extensionId), {
107
108
  method: "POST",
108
109
  headers: { Authorization }
109
110
  });
110
111
  }
111
112
  async setPublishedDeployPercentage(params) {
112
113
  const Authorization = this.getAuthHeader(params.token);
113
- await fetch(this.setDeployPercentageEndpoint(params.extensionId), {
114
+ await fetch$1(this.setDeployPercentageEndpoint(params.extensionId), {
114
115
  method: "POST",
115
116
  headers: {
116
117
  Authorization,
@@ -120,7 +121,7 @@ var CwsApi = class {
120
121
  });
121
122
  }
122
123
  getToken() {
123
- return fetch(this.tokenEndpoint(), {
124
+ return fetch$1(this.tokenEndpoint(), {
124
125
  method: "POST",
125
126
  body: JSON.stringify({
126
127
  client_id: this.options.clientId,
@@ -255,7 +256,7 @@ var EdgeApi = class {
255
256
  async uploadDraft(params) {
256
257
  const endpoint = `https://api.addons.microsoftedge.microsoft.com/v1/products/${params.productId}/submissions/draft/package`;
257
258
  const file = fs$1.createReadStream(params.zipFile);
258
- const operationId = (await fetch.raw(endpoint, {
259
+ const operationId = (await fetch$1.raw(endpoint, {
259
260
  method: "POST",
260
261
  body: file,
261
262
  headers: {
@@ -270,14 +271,14 @@ var EdgeApi = class {
270
271
  * Docs: https://learn.microsoft.com/en-us/microsoft-edge/extensions-chromium/publish/api/using-addons-api#checking-the-status-of-a-package-upload
271
272
  */
272
273
  uploadDraftOperation(params) {
273
- return fetch(`https://api.addons.microsoftedge.microsoft.com/v1/products/${params.productId}/submissions/draft/package/operations/${params.operationId}`, { headers: this.getAuthHeaders(params.token) });
274
+ return fetch$1(`https://api.addons.microsoftedge.microsoft.com/v1/products/${params.productId}/submissions/draft/package/operations/${params.operationId}`, { headers: this.getAuthHeaders(params.token) });
274
275
  }
275
276
  /**
276
277
  * Docs: https://learn.microsoft.com/en-us/microsoft-edge/extensions-chromium/publish/api/using-addons-api#publishing-the-submission
277
278
  */
278
279
  async publish(params) {
279
280
  const endpoint = `https://api.addons.microsoftedge.microsoft.com/v1/products/${params.productId}/submissions`;
280
- const res = await fetch.raw(endpoint, {
281
+ const res = await fetch$1.raw(endpoint, {
281
282
  method: "POST",
282
283
  body: JSON.stringify({}),
283
284
  headers: this.getAuthHeaders(params.token)
@@ -3835,7 +3836,7 @@ var AddonsApi = class {
3835
3836
  * Docs: https://addons-server.readthedocs.io/en/latest/topics/api/addons.html#detail
3836
3837
  */
3837
3838
  details(params) {
3838
- return fetch(this.addonDetailEndpoint(params.extensionId).href, { headers: { Authorization: this.getAuthHeader() } });
3839
+ return fetch$1(this.addonDetailEndpoint(params.extensionId).href, { headers: { Authorization: this.getAuthHeader() } });
3839
3840
  }
3840
3841
  /**
3841
3842
  * Docs: https://addons-server.readthedocs.io/en/latest/topics/api/addons.html#upload-create
@@ -3846,7 +3847,7 @@ var AddonsApi = class {
3846
3847
  form.set("channel", params.channel);
3847
3848
  form.set("upload", await fileFromPath(params.file));
3848
3849
  const encoder = new FormDataEncoder(form);
3849
- return await fetch(endpoint.href, {
3850
+ return await fetch$1(endpoint.href, {
3850
3851
  method: "POST",
3851
3852
  body: Readable.from(encoder),
3852
3853
  headers: {
@@ -3859,7 +3860,7 @@ var AddonsApi = class {
3859
3860
  * Docs: https://addons-server.readthedocs.io/en/latest/topics/api/addons.html#upload-detail
3860
3861
  */
3861
3862
  uploadDetail(params) {
3862
- return fetch(this.addonsUploadDetailsEndpoint(params.uuid).href, { headers: { Authorization: this.getAuthHeader() } });
3863
+ return fetch$1(this.addonsUploadDetailsEndpoint(params.uuid).href, { headers: { Authorization: this.getAuthHeader() } });
3863
3864
  }
3864
3865
  async versionCreate(params) {
3865
3866
  const endpoint = this.addonVersionCreateEndpoint(params.extensionId);
@@ -3868,7 +3869,7 @@ var AddonsApi = class {
3868
3869
  if (params.sourceFile) form.set("source", await fileFromPath(params.sourceFile));
3869
3870
  else form.set("source", "");
3870
3871
  const encoder = new FormDataEncoder(form);
3871
- return await fetch(endpoint.href, {
3872
+ return await fetch$1(endpoint.href, {
3872
3873
  method: "POST",
3873
3874
  body: Readable.from(encoder),
3874
3875
  headers: {
@@ -3926,7 +3927,7 @@ var FirefoxAddonStore = class {
3926
3927
  }
3927
3928
  async submit(dryRun) {
3928
3929
  this.setStatus("Getting addon details");
3929
- const addon = await this.api.details({ extensionId: this.options.extensionId });
3930
+ const addon = await this.api.details({ extensionId: this.wrappedExtensionId });
3930
3931
  if (dryRun) {
3931
3932
  this.setStatus("DRY RUN: Skipped upload and publishing");
3932
3933
  return;
@@ -3934,7 +3935,7 @@ var FirefoxAddonStore = class {
3934
3935
  const upload = await withTimeout(this.uploadAndPollValidation(5e3), 10 * 6e4);
3935
3936
  this.setStatus("Submitting new version");
3936
3937
  const version = await this.api.versionCreate({
3937
- extensionId: this.options.extensionId,
3938
+ extensionId: this.wrappedExtensionId,
3938
3939
  sourceFile: this.options.sourcesZip,
3939
3940
  uploadUuid: upload.uuid
3940
3941
  });
@@ -3957,6 +3958,18 @@ var FirefoxAddonStore = class {
3957
3958
  }
3958
3959
  return details;
3959
3960
  }
3961
+ /**
3962
+ * Ensure the extension id is wrapped in curly braces, that's what the addon store API is expecting
3963
+ * @example
3964
+ * "test" -> "{test}"
3965
+ */
3966
+ get wrappedExtensionId() {
3967
+ let id = this.options.extensionId;
3968
+ if (id.includes("@")) return id;
3969
+ if (!id.startsWith("{")) id = "{" + id;
3970
+ if (!id.endsWith("}")) id += "}";
3971
+ return id;
3972
+ }
3960
3973
  };
3961
3974
 
3962
3975
  //#endregion
@@ -4111,42 +4124,41 @@ async function submit(config) {
4111
4124
  const envFile = ".env.submit";
4112
4125
  async function generateRefreshTokenViaOAuth(clientId, clientSecret) {
4113
4126
  let resolveCode;
4114
- const codePromise = new Promise((resolve) => {
4115
- resolveCode = resolve;
4116
- });
4117
- const server = Bun.serve({
4118
- port: 0,
4119
- fetch(req) {
4120
- const code$1 = new URL(req.url).searchParams.get("code");
4121
- if (code$1) {
4122
- resolveCode(code$1);
4123
- return new Response("Success! You can close this tab. <script>window.close()<\/script>", { headers: { "Content-Type": "text/html" } });
4124
- }
4125
- return new Response("No code found", { status: 400 });
4127
+ const codePromise = new Promise((resolve) => resolveCode = resolve);
4128
+ const server = http.createServer((req, res) => {
4129
+ const code$1 = new URL(req.url || "", `http://localhost`).searchParams.get("code");
4130
+ if (code$1) {
4131
+ resolveCode(code$1);
4132
+ res.writeHead(200, { "Content-Type": "text/html" });
4133
+ res.end("Success! You can close this tab. <script>window.close()<\/script>");
4134
+ server.close();
4135
+ } else {
4136
+ res.writeHead(400);
4137
+ res.end("No code found");
4126
4138
  }
4127
4139
  });
4128
- const serverUrl = `http://127.0.0.1:${server.port}`;
4129
- const authUrl = new URL("https://accounts.google.com/o/oauth2/auth");
4130
- authUrl.searchParams.set("response_type", "code");
4131
- authUrl.searchParams.set("access_type", "offline");
4132
- authUrl.searchParams.set("client_id", clientId);
4133
- authUrl.searchParams.set("scope", "https://www.googleapis.com/auth/chromewebstore");
4134
- authUrl.searchParams.set("redirect_uri", serverUrl);
4135
- consola$1.info("Open this URL in your browser to authorize:");
4136
- consola$1.log(authUrl.href);
4137
- consola$1.info("Waiting for authorization...");
4140
+ server.listen(0, () => {
4141
+ const redirectUri = `http://127.0.0.1:${server.address().port}`;
4142
+ const authUrl = new URL("https://accounts.google.com/o/oauth2/auth");
4143
+ authUrl.searchParams.set("response_type", "code");
4144
+ authUrl.searchParams.set("access_type", "offline");
4145
+ authUrl.searchParams.set("client_id", clientId);
4146
+ authUrl.searchParams.set("scope", "https://www.googleapis.com/auth/chromewebstore");
4147
+ authUrl.searchParams.set("redirect_uri", redirectUri);
4148
+ console.log("Open this URL in your browser to authorize:");
4149
+ console.log(authUrl.href);
4150
+ });
4138
4151
  const code = await codePromise;
4139
- server.stop();
4140
- return (await ofetch("https://accounts.google.com/o/oauth2/token", {
4152
+ return (await (await fetch("https://accounts.google.com/o/oauth2/token", {
4141
4153
  method: "POST",
4142
- body: new URLSearchParams([
4143
- ["client_id", clientId],
4144
- ["client_secret", clientSecret],
4145
- ["code", code],
4146
- ["grant_type", "authorization_code"],
4147
- ["redirect_uri", serverUrl]
4148
- ])
4149
- })).refresh_token;
4154
+ body: new URLSearchParams({
4155
+ client_id: clientId,
4156
+ client_secret: clientSecret,
4157
+ code,
4158
+ grant_type: "authorization_code",
4159
+ redirect_uri: `http://127.0.0.1:${server.address().port}`
4160
+ })
4161
+ })).json()).refresh_token;
4150
4162
  }
4151
4163
  async function init(config) {
4152
4164
  consola$1.info(`Initialize or update an existing \`${envFile}\` file.`);
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@equicord/publish-browser-extension",
3
3
  "description": "Easily publish web extensions to their stores",
4
- "version": "4.0.1",
4
+ "version": "4.0.3",
5
5
  "packageManager": "bun@1.3.4",
6
6
  "type": "module",
7
7
  "scripts": {
@@ -24,6 +24,7 @@
24
24
  "dotenv": "^17.2.3",
25
25
  "form-data-encoder": "^4.1.0",
26
26
  "formdata-node": "^6.0.3",
27
+ "http": "^0.0.1-security",
27
28
  "listr2": "^8.3.3",
28
29
  "ofetch": "^1.4.1",
29
30
  "zod": "^3.25.76 || ^4.0.0"