@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 +2 -2
- package/dist/index.d.ts +6 -0
- package/dist/index.js +1 -1
- package/dist/{init-CL9ikrQH.js → init-CB96xhAw.js} +61 -49
- package/package.json +2 -1
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-
|
|
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.
|
|
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-
|
|
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
|
|
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.
|
|
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.
|
|
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
|
-
|
|
4116
|
-
|
|
4117
|
-
|
|
4118
|
-
|
|
4119
|
-
|
|
4120
|
-
|
|
4121
|
-
|
|
4122
|
-
|
|
4123
|
-
|
|
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
|
-
|
|
4129
|
-
|
|
4130
|
-
|
|
4131
|
-
|
|
4132
|
-
|
|
4133
|
-
|
|
4134
|
-
|
|
4135
|
-
|
|
4136
|
-
|
|
4137
|
-
|
|
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
|
-
|
|
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
|
-
|
|
4144
|
-
|
|
4145
|
-
|
|
4146
|
-
|
|
4147
|
-
|
|
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.
|
|
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"
|