@extension.dev/deploy 0.1.0 → 0.1.1
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/module.js +221 -2
- package/dist/module.mjs +215 -1
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/package.json +2 -2
package/dist/module.js
CHANGED
|
@@ -33,7 +33,8 @@ var __webpack_require__ = {};
|
|
|
33
33
|
var __webpack_exports__ = {};
|
|
34
34
|
__webpack_require__.r(__webpack_exports__);
|
|
35
35
|
__webpack_require__.d(__webpack_exports__, {
|
|
36
|
-
|
|
36
|
+
watchChromeSubmission: ()=>watchChromeSubmission,
|
|
37
|
+
main: ()=>main,
|
|
37
38
|
resolveConfig: ()=>resolveConfig,
|
|
38
39
|
chromeOptionsSchema: ()=>chromeOptionsSchema,
|
|
39
40
|
getFirefoxSubmissionEvent: ()=>getFirefoxSubmissionEvent,
|
|
@@ -48,8 +49,12 @@ __webpack_require__.d(__webpack_exports__, {
|
|
|
48
49
|
verifyFirefoxCredentials: ()=>verifyFirefoxCredentials,
|
|
49
50
|
verifyEdgeCredentials: ()=>verifyEdgeCredentials,
|
|
50
51
|
verifyChromeCredentials: ()=>verifyChromeCredentials,
|
|
51
|
-
|
|
52
|
+
getEdgeSubmissionEvent: ()=>getEdgeSubmissionEvent
|
|
52
53
|
});
|
|
54
|
+
const external_node_fs_namespaceObject = require("node:fs");
|
|
55
|
+
var external_node_fs_default = /*#__PURE__*/ __webpack_require__.n(external_node_fs_namespaceObject);
|
|
56
|
+
const external_node_path_namespaceObject = require("node:path");
|
|
57
|
+
var external_node_path_default = /*#__PURE__*/ __webpack_require__.n(external_node_path_namespaceObject);
|
|
53
58
|
const external_zod_namespaceObject = require("zod");
|
|
54
59
|
const chromeOptionsSchema = external_zod_namespaceObject.z.object({
|
|
55
60
|
zip: external_zod_namespaceObject.z.string().min(1),
|
|
@@ -937,6 +942,218 @@ async function runWatchLoop(_store, probe, options) {
|
|
|
937
942
|
await delay(pollInterval);
|
|
938
943
|
}
|
|
939
944
|
}
|
|
945
|
+
function usage() {
|
|
946
|
+
return `
|
|
947
|
+
extension-deploy \u{2014} Deploy browser extensions to Chrome, Firefox, and Edge.
|
|
948
|
+
|
|
949
|
+
USAGE
|
|
950
|
+
extension-deploy [options] submit to one or more stores
|
|
951
|
+
extension-deploy watch --chrome [options] poll an in-flight submission
|
|
952
|
+
extension-deploy watch --firefox [options]
|
|
953
|
+
extension-deploy watch --edge [options]
|
|
954
|
+
|
|
955
|
+
GLOBAL
|
|
956
|
+
--dry-run Verify auth without uploading or publishing
|
|
957
|
+
--output-json <path> Write the DeployResult / WatchEvent as JSON to <path>
|
|
958
|
+
--help Show this help message
|
|
959
|
+
|
|
960
|
+
CHROME
|
|
961
|
+
--chrome-zip <path> Path to Chrome extension ZIP
|
|
962
|
+
--chrome-extension-id <id> Chrome extension ID
|
|
963
|
+
--chrome-client-id <id> OAuth2 client ID
|
|
964
|
+
--chrome-client-secret <secret> OAuth2 client secret
|
|
965
|
+
--chrome-refresh-token <token> OAuth2 refresh token
|
|
966
|
+
--chrome-publish-target <target> "default" or "trustedTesters"
|
|
967
|
+
--chrome-deploy-percentage <n> Staged rollout percentage (1-100)
|
|
968
|
+
--chrome-review-exemption Request expedited review
|
|
969
|
+
--chrome-skip-submit-review Upload only, skip publish
|
|
970
|
+
|
|
971
|
+
FIREFOX
|
|
972
|
+
--firefox-zip <path> Path to Firefox extension ZIP
|
|
973
|
+
--firefox-sources-zip <path> Path to sources ZIP (optional)
|
|
974
|
+
--firefox-extension-id <id> Addon GUID or email-style ID
|
|
975
|
+
--firefox-jwt-issuer <issuer> AMO JWT issuer
|
|
976
|
+
--firefox-jwt-secret <secret> AMO JWT secret
|
|
977
|
+
--firefox-channel <channel> "listed" or "unlisted"
|
|
978
|
+
|
|
979
|
+
EDGE
|
|
980
|
+
--edge-zip <path> Path to Edge extension ZIP
|
|
981
|
+
--edge-product-id <id> Partner Center product ID
|
|
982
|
+
--edge-client-id <id> Partner Center client ID
|
|
983
|
+
--edge-api-key <key> Partner Center API key (v1.1)
|
|
984
|
+
--edge-skip-submit-review Upload only, skip publish
|
|
985
|
+
|
|
986
|
+
WATCH
|
|
987
|
+
--watch-submission-id <id> Required for firefox/edge (version id / operation id)
|
|
988
|
+
--watch-interval <seconds> Poll interval (default 60)
|
|
989
|
+
--watch-timeout <seconds> Max time to wait for a terminal state (default 3600)
|
|
990
|
+
|
|
991
|
+
ENVIRONMENT VARIABLES
|
|
992
|
+
All flags can be set via SCREAMING_SNAKE_CASE env vars (e.g. CHROME_ZIP,
|
|
993
|
+
FIREFOX_JWT_SECRET, EDGE_API_KEY). Flags take precedence over env vars.
|
|
994
|
+
A .env.submit file in the current directory is loaded automatically.
|
|
995
|
+
`.trim();
|
|
996
|
+
}
|
|
997
|
+
const BOOLEAN_FLAGS = new Set([
|
|
998
|
+
"help",
|
|
999
|
+
"dryRun",
|
|
1000
|
+
"chromeReviewExemption",
|
|
1001
|
+
"chromeSkipSubmitReview",
|
|
1002
|
+
"edgeSkipSubmitReview"
|
|
1003
|
+
]);
|
|
1004
|
+
const INT_FLAGS = new Set([
|
|
1005
|
+
"chromeDeployPercentage",
|
|
1006
|
+
"watchInterval",
|
|
1007
|
+
"watchTimeout"
|
|
1008
|
+
]);
|
|
1009
|
+
function parseArgs(argv) {
|
|
1010
|
+
const flags = {};
|
|
1011
|
+
let i = 0;
|
|
1012
|
+
if ("watch" === argv[0]) {
|
|
1013
|
+
flags.command = "watch";
|
|
1014
|
+
i = 1;
|
|
1015
|
+
}
|
|
1016
|
+
while(i < argv.length){
|
|
1017
|
+
const arg = argv[i];
|
|
1018
|
+
if ("--help" === arg || "-h" === arg) {
|
|
1019
|
+
flags.help = true;
|
|
1020
|
+
i++;
|
|
1021
|
+
continue;
|
|
1022
|
+
}
|
|
1023
|
+
if ("--chrome" === arg) {
|
|
1024
|
+
flags.watchStore = "chrome";
|
|
1025
|
+
i++;
|
|
1026
|
+
continue;
|
|
1027
|
+
}
|
|
1028
|
+
if ("--firefox" === arg) {
|
|
1029
|
+
flags.watchStore = "firefox";
|
|
1030
|
+
i++;
|
|
1031
|
+
continue;
|
|
1032
|
+
}
|
|
1033
|
+
if ("--edge" === arg) {
|
|
1034
|
+
flags.watchStore = "edge";
|
|
1035
|
+
i++;
|
|
1036
|
+
continue;
|
|
1037
|
+
}
|
|
1038
|
+
if (!(null == arg ? void 0 : arg.startsWith("--"))) {
|
|
1039
|
+
i++;
|
|
1040
|
+
continue;
|
|
1041
|
+
}
|
|
1042
|
+
const key = arg.slice(2).replace(/-([a-z])/g, (_, c)=>c.toUpperCase());
|
|
1043
|
+
if (BOOLEAN_FLAGS.has(key)) {
|
|
1044
|
+
flags[key] = true;
|
|
1045
|
+
i++;
|
|
1046
|
+
continue;
|
|
1047
|
+
}
|
|
1048
|
+
const next = argv[i + 1];
|
|
1049
|
+
if (null == next || next.startsWith("--")) {
|
|
1050
|
+
flags[key] = true;
|
|
1051
|
+
i++;
|
|
1052
|
+
continue;
|
|
1053
|
+
}
|
|
1054
|
+
flags[key] = INT_FLAGS.has(key) ? parseInt(next, 10) : next;
|
|
1055
|
+
i += 2;
|
|
1056
|
+
}
|
|
1057
|
+
return flags;
|
|
1058
|
+
}
|
|
1059
|
+
function loadDotEnv() {
|
|
1060
|
+
try {
|
|
1061
|
+
const envPath = external_node_path_default().resolve(process.cwd(), ".env.submit");
|
|
1062
|
+
const content = external_node_fs_default().readFileSync(envPath, "utf-8");
|
|
1063
|
+
for (const line of content.split("\n")){
|
|
1064
|
+
const trimmed = line.trim();
|
|
1065
|
+
if (!trimmed || trimmed.startsWith("#")) continue;
|
|
1066
|
+
const eqIdx = trimmed.indexOf("=");
|
|
1067
|
+
if (-1 === eqIdx) continue;
|
|
1068
|
+
const key = trimmed.slice(0, eqIdx).trim();
|
|
1069
|
+
let value = trimmed.slice(eqIdx + 1).trim();
|
|
1070
|
+
if (value.startsWith('"') && value.endsWith('"') || value.startsWith("'") && value.endsWith("'")) value = value.slice(1, -1);
|
|
1071
|
+
if (!(key in process.env)) process.env[key] = value;
|
|
1072
|
+
}
|
|
1073
|
+
} catch {}
|
|
1074
|
+
}
|
|
1075
|
+
function writeJsonOutput(filePath, payload) {
|
|
1076
|
+
external_node_fs_default().mkdirSync(external_node_path_default().dirname(external_node_path_default().resolve(filePath)), {
|
|
1077
|
+
recursive: true
|
|
1078
|
+
});
|
|
1079
|
+
external_node_fs_default().writeFileSync(filePath, JSON.stringify(payload, null, 2) + "\n", "utf-8");
|
|
1080
|
+
}
|
|
1081
|
+
async function main() {
|
|
1082
|
+
loadDotEnv();
|
|
1083
|
+
const flags = parseArgs(process.argv.slice(2));
|
|
1084
|
+
if (flags.help) {
|
|
1085
|
+
console.log(usage());
|
|
1086
|
+
process.exit(0);
|
|
1087
|
+
}
|
|
1088
|
+
if ("watch" === flags.command) return void await runWatch(flags);
|
|
1089
|
+
const config = resolveConfig(flags);
|
|
1090
|
+
try {
|
|
1091
|
+
const result = await deploy(config);
|
|
1092
|
+
if (flags.outputJson) writeJsonOutput(flags.outputJson, result);
|
|
1093
|
+
if (!result.success) process.exit(1);
|
|
1094
|
+
} catch (err) {
|
|
1095
|
+
console.error(err instanceof Error ? err.message : err);
|
|
1096
|
+
process.exit(1);
|
|
1097
|
+
}
|
|
1098
|
+
}
|
|
1099
|
+
async function runWatch(flags) {
|
|
1100
|
+
const store = flags.watchStore;
|
|
1101
|
+
if (!store) {
|
|
1102
|
+
console.error("watch: one of --chrome, --firefox, or --edge must be provided.");
|
|
1103
|
+
process.exit(2);
|
|
1104
|
+
}
|
|
1105
|
+
const onEvent = (event)=>{
|
|
1106
|
+
const line = `[watch:${event.store}] ${event.status}${event.nativeStatus ? ` (${event.nativeStatus})` : ""}${event.message ? ` \u{2014} ${event.message}` : ""}`;
|
|
1107
|
+
console.log(line);
|
|
1108
|
+
};
|
|
1109
|
+
const pollIntervalMs = (flags.watchInterval ?? 60) * 1000;
|
|
1110
|
+
const timeoutMs = (flags.watchTimeout ?? 3600) * 1000;
|
|
1111
|
+
let terminal;
|
|
1112
|
+
try {
|
|
1113
|
+
terminal = "chrome" === store ? await watchChromeSubmission({
|
|
1114
|
+
clientId: mustEnv("CHROME_CLIENT_ID", flags.chromeClientId),
|
|
1115
|
+
clientSecret: mustEnv("CHROME_CLIENT_SECRET", flags.chromeClientSecret),
|
|
1116
|
+
refreshToken: mustEnv("CHROME_REFRESH_TOKEN", flags.chromeRefreshToken),
|
|
1117
|
+
extensionId: mustEnv("CHROME_EXTENSION_ID", flags.chromeExtensionId)
|
|
1118
|
+
}, {
|
|
1119
|
+
pollIntervalMs,
|
|
1120
|
+
timeoutMs,
|
|
1121
|
+
onEvent
|
|
1122
|
+
}) : "firefox" === store ? await watchFirefoxSubmission({
|
|
1123
|
+
jwtIssuer: mustEnv("FIREFOX_JWT_ISSUER", flags.firefoxJwtIssuer),
|
|
1124
|
+
jwtSecret: mustEnv("FIREFOX_JWT_SECRET", flags.firefoxJwtSecret),
|
|
1125
|
+
extensionId: mustEnv("FIREFOX_EXTENSION_ID", flags.firefoxExtensionId),
|
|
1126
|
+
versionId: mustValue("--watch-submission-id", flags.watchSubmissionId)
|
|
1127
|
+
}, {
|
|
1128
|
+
pollIntervalMs,
|
|
1129
|
+
timeoutMs,
|
|
1130
|
+
onEvent
|
|
1131
|
+
}) : await watchEdgeSubmission({
|
|
1132
|
+
clientId: mustEnv("EDGE_CLIENT_ID", flags.edgeClientId),
|
|
1133
|
+
apiKey: mustEnv("EDGE_API_KEY", flags.edgeApiKey),
|
|
1134
|
+
productId: mustEnv("EDGE_PRODUCT_ID", flags.edgeProductId),
|
|
1135
|
+
operationId: mustValue("--watch-submission-id", flags.watchSubmissionId)
|
|
1136
|
+
}, {
|
|
1137
|
+
pollIntervalMs,
|
|
1138
|
+
timeoutMs,
|
|
1139
|
+
onEvent
|
|
1140
|
+
});
|
|
1141
|
+
} catch (err) {
|
|
1142
|
+
console.error(err instanceof Error ? err.message : err);
|
|
1143
|
+
process.exit(1);
|
|
1144
|
+
}
|
|
1145
|
+
if (flags.outputJson) writeJsonOutput(flags.outputJson, terminal);
|
|
1146
|
+
if ("failed" === terminal.status || "rejected" === terminal.status) process.exit(1);
|
|
1147
|
+
}
|
|
1148
|
+
function mustEnv(envName, flagValue) {
|
|
1149
|
+
const v = flagValue ?? process.env[envName];
|
|
1150
|
+
if (!v) throw new Error(`Missing required credential: ${envName}. Set the env var or pass the matching flag.`);
|
|
1151
|
+
return v;
|
|
1152
|
+
}
|
|
1153
|
+
function mustValue(flagName, value) {
|
|
1154
|
+
if (!value) throw new Error(`Missing required flag: ${flagName}`);
|
|
1155
|
+
return value;
|
|
1156
|
+
}
|
|
940
1157
|
exports.chromeOptionsSchema = __webpack_exports__.chromeOptionsSchema;
|
|
941
1158
|
exports.deploy = __webpack_exports__.deploy;
|
|
942
1159
|
exports.deployConfigSchema = __webpack_exports__.deployConfigSchema;
|
|
@@ -945,6 +1162,7 @@ exports.firefoxOptionsSchema = __webpack_exports__.firefoxOptionsSchema;
|
|
|
945
1162
|
exports.getChromeSubmissionEvent = __webpack_exports__.getChromeSubmissionEvent;
|
|
946
1163
|
exports.getEdgeSubmissionEvent = __webpack_exports__.getEdgeSubmissionEvent;
|
|
947
1164
|
exports.getFirefoxSubmissionEvent = __webpack_exports__.getFirefoxSubmissionEvent;
|
|
1165
|
+
exports.main = __webpack_exports__.main;
|
|
948
1166
|
exports.resolveConfig = __webpack_exports__.resolveConfig;
|
|
949
1167
|
exports.validateConfig = __webpack_exports__.validateConfig;
|
|
950
1168
|
exports.verifyChromeCredentials = __webpack_exports__.verifyChromeCredentials;
|
|
@@ -962,6 +1180,7 @@ for(var __webpack_i__ in __webpack_exports__)if (-1 === [
|
|
|
962
1180
|
"getChromeSubmissionEvent",
|
|
963
1181
|
"getEdgeSubmissionEvent",
|
|
964
1182
|
"getFirefoxSubmissionEvent",
|
|
1183
|
+
"main",
|
|
965
1184
|
"resolveConfig",
|
|
966
1185
|
"validateConfig",
|
|
967
1186
|
"verifyChromeCredentials",
|
package/dist/module.mjs
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import external_node_fs_default from "node:fs";
|
|
2
|
+
import external_node_path_default from "node:path";
|
|
1
3
|
import { z } from "zod";
|
|
2
4
|
import promises_default from "node:fs/promises";
|
|
3
5
|
import external_node_crypto_default from "node:crypto";
|
|
@@ -883,4 +885,216 @@ async function runWatchLoop(_store, probe, options) {
|
|
|
883
885
|
await delay(pollInterval);
|
|
884
886
|
}
|
|
885
887
|
}
|
|
886
|
-
|
|
888
|
+
function usage() {
|
|
889
|
+
return `
|
|
890
|
+
extension-deploy \u{2014} Deploy browser extensions to Chrome, Firefox, and Edge.
|
|
891
|
+
|
|
892
|
+
USAGE
|
|
893
|
+
extension-deploy [options] submit to one or more stores
|
|
894
|
+
extension-deploy watch --chrome [options] poll an in-flight submission
|
|
895
|
+
extension-deploy watch --firefox [options]
|
|
896
|
+
extension-deploy watch --edge [options]
|
|
897
|
+
|
|
898
|
+
GLOBAL
|
|
899
|
+
--dry-run Verify auth without uploading or publishing
|
|
900
|
+
--output-json <path> Write the DeployResult / WatchEvent as JSON to <path>
|
|
901
|
+
--help Show this help message
|
|
902
|
+
|
|
903
|
+
CHROME
|
|
904
|
+
--chrome-zip <path> Path to Chrome extension ZIP
|
|
905
|
+
--chrome-extension-id <id> Chrome extension ID
|
|
906
|
+
--chrome-client-id <id> OAuth2 client ID
|
|
907
|
+
--chrome-client-secret <secret> OAuth2 client secret
|
|
908
|
+
--chrome-refresh-token <token> OAuth2 refresh token
|
|
909
|
+
--chrome-publish-target <target> "default" or "trustedTesters"
|
|
910
|
+
--chrome-deploy-percentage <n> Staged rollout percentage (1-100)
|
|
911
|
+
--chrome-review-exemption Request expedited review
|
|
912
|
+
--chrome-skip-submit-review Upload only, skip publish
|
|
913
|
+
|
|
914
|
+
FIREFOX
|
|
915
|
+
--firefox-zip <path> Path to Firefox extension ZIP
|
|
916
|
+
--firefox-sources-zip <path> Path to sources ZIP (optional)
|
|
917
|
+
--firefox-extension-id <id> Addon GUID or email-style ID
|
|
918
|
+
--firefox-jwt-issuer <issuer> AMO JWT issuer
|
|
919
|
+
--firefox-jwt-secret <secret> AMO JWT secret
|
|
920
|
+
--firefox-channel <channel> "listed" or "unlisted"
|
|
921
|
+
|
|
922
|
+
EDGE
|
|
923
|
+
--edge-zip <path> Path to Edge extension ZIP
|
|
924
|
+
--edge-product-id <id> Partner Center product ID
|
|
925
|
+
--edge-client-id <id> Partner Center client ID
|
|
926
|
+
--edge-api-key <key> Partner Center API key (v1.1)
|
|
927
|
+
--edge-skip-submit-review Upload only, skip publish
|
|
928
|
+
|
|
929
|
+
WATCH
|
|
930
|
+
--watch-submission-id <id> Required for firefox/edge (version id / operation id)
|
|
931
|
+
--watch-interval <seconds> Poll interval (default 60)
|
|
932
|
+
--watch-timeout <seconds> Max time to wait for a terminal state (default 3600)
|
|
933
|
+
|
|
934
|
+
ENVIRONMENT VARIABLES
|
|
935
|
+
All flags can be set via SCREAMING_SNAKE_CASE env vars (e.g. CHROME_ZIP,
|
|
936
|
+
FIREFOX_JWT_SECRET, EDGE_API_KEY). Flags take precedence over env vars.
|
|
937
|
+
A .env.submit file in the current directory is loaded automatically.
|
|
938
|
+
`.trim();
|
|
939
|
+
}
|
|
940
|
+
const BOOLEAN_FLAGS = new Set([
|
|
941
|
+
"help",
|
|
942
|
+
"dryRun",
|
|
943
|
+
"chromeReviewExemption",
|
|
944
|
+
"chromeSkipSubmitReview",
|
|
945
|
+
"edgeSkipSubmitReview"
|
|
946
|
+
]);
|
|
947
|
+
const INT_FLAGS = new Set([
|
|
948
|
+
"chromeDeployPercentage",
|
|
949
|
+
"watchInterval",
|
|
950
|
+
"watchTimeout"
|
|
951
|
+
]);
|
|
952
|
+
function parseArgs(argv) {
|
|
953
|
+
const flags = {};
|
|
954
|
+
let i = 0;
|
|
955
|
+
if ("watch" === argv[0]) {
|
|
956
|
+
flags.command = "watch";
|
|
957
|
+
i = 1;
|
|
958
|
+
}
|
|
959
|
+
while(i < argv.length){
|
|
960
|
+
const arg = argv[i];
|
|
961
|
+
if ("--help" === arg || "-h" === arg) {
|
|
962
|
+
flags.help = true;
|
|
963
|
+
i++;
|
|
964
|
+
continue;
|
|
965
|
+
}
|
|
966
|
+
if ("--chrome" === arg) {
|
|
967
|
+
flags.watchStore = "chrome";
|
|
968
|
+
i++;
|
|
969
|
+
continue;
|
|
970
|
+
}
|
|
971
|
+
if ("--firefox" === arg) {
|
|
972
|
+
flags.watchStore = "firefox";
|
|
973
|
+
i++;
|
|
974
|
+
continue;
|
|
975
|
+
}
|
|
976
|
+
if ("--edge" === arg) {
|
|
977
|
+
flags.watchStore = "edge";
|
|
978
|
+
i++;
|
|
979
|
+
continue;
|
|
980
|
+
}
|
|
981
|
+
if (!(null == arg ? void 0 : arg.startsWith("--"))) {
|
|
982
|
+
i++;
|
|
983
|
+
continue;
|
|
984
|
+
}
|
|
985
|
+
const key = arg.slice(2).replace(/-([a-z])/g, (_, c)=>c.toUpperCase());
|
|
986
|
+
if (BOOLEAN_FLAGS.has(key)) {
|
|
987
|
+
flags[key] = true;
|
|
988
|
+
i++;
|
|
989
|
+
continue;
|
|
990
|
+
}
|
|
991
|
+
const next = argv[i + 1];
|
|
992
|
+
if (null == next || next.startsWith("--")) {
|
|
993
|
+
flags[key] = true;
|
|
994
|
+
i++;
|
|
995
|
+
continue;
|
|
996
|
+
}
|
|
997
|
+
flags[key] = INT_FLAGS.has(key) ? parseInt(next, 10) : next;
|
|
998
|
+
i += 2;
|
|
999
|
+
}
|
|
1000
|
+
return flags;
|
|
1001
|
+
}
|
|
1002
|
+
function loadDotEnv() {
|
|
1003
|
+
try {
|
|
1004
|
+
const envPath = external_node_path_default.resolve(process.cwd(), ".env.submit");
|
|
1005
|
+
const content = external_node_fs_default.readFileSync(envPath, "utf-8");
|
|
1006
|
+
for (const line of content.split("\n")){
|
|
1007
|
+
const trimmed = line.trim();
|
|
1008
|
+
if (!trimmed || trimmed.startsWith("#")) continue;
|
|
1009
|
+
const eqIdx = trimmed.indexOf("=");
|
|
1010
|
+
if (-1 === eqIdx) continue;
|
|
1011
|
+
const key = trimmed.slice(0, eqIdx).trim();
|
|
1012
|
+
let value = trimmed.slice(eqIdx + 1).trim();
|
|
1013
|
+
if (value.startsWith('"') && value.endsWith('"') || value.startsWith("'") && value.endsWith("'")) value = value.slice(1, -1);
|
|
1014
|
+
if (!(key in process.env)) process.env[key] = value;
|
|
1015
|
+
}
|
|
1016
|
+
} catch {}
|
|
1017
|
+
}
|
|
1018
|
+
function writeJsonOutput(filePath, payload) {
|
|
1019
|
+
external_node_fs_default.mkdirSync(external_node_path_default.dirname(external_node_path_default.resolve(filePath)), {
|
|
1020
|
+
recursive: true
|
|
1021
|
+
});
|
|
1022
|
+
external_node_fs_default.writeFileSync(filePath, JSON.stringify(payload, null, 2) + "\n", "utf-8");
|
|
1023
|
+
}
|
|
1024
|
+
async function main() {
|
|
1025
|
+
loadDotEnv();
|
|
1026
|
+
const flags = parseArgs(process.argv.slice(2));
|
|
1027
|
+
if (flags.help) {
|
|
1028
|
+
console.log(usage());
|
|
1029
|
+
process.exit(0);
|
|
1030
|
+
}
|
|
1031
|
+
if ("watch" === flags.command) return void await runWatch(flags);
|
|
1032
|
+
const config = resolveConfig(flags);
|
|
1033
|
+
try {
|
|
1034
|
+
const result = await deploy(config);
|
|
1035
|
+
if (flags.outputJson) writeJsonOutput(flags.outputJson, result);
|
|
1036
|
+
if (!result.success) process.exit(1);
|
|
1037
|
+
} catch (err) {
|
|
1038
|
+
console.error(err instanceof Error ? err.message : err);
|
|
1039
|
+
process.exit(1);
|
|
1040
|
+
}
|
|
1041
|
+
}
|
|
1042
|
+
async function runWatch(flags) {
|
|
1043
|
+
const store = flags.watchStore;
|
|
1044
|
+
if (!store) {
|
|
1045
|
+
console.error("watch: one of --chrome, --firefox, or --edge must be provided.");
|
|
1046
|
+
process.exit(2);
|
|
1047
|
+
}
|
|
1048
|
+
const onEvent = (event)=>{
|
|
1049
|
+
const line = `[watch:${event.store}] ${event.status}${event.nativeStatus ? ` (${event.nativeStatus})` : ""}${event.message ? ` \u{2014} ${event.message}` : ""}`;
|
|
1050
|
+
console.log(line);
|
|
1051
|
+
};
|
|
1052
|
+
const pollIntervalMs = (flags.watchInterval ?? 60) * 1000;
|
|
1053
|
+
const timeoutMs = (flags.watchTimeout ?? 3600) * 1000;
|
|
1054
|
+
let terminal;
|
|
1055
|
+
try {
|
|
1056
|
+
terminal = "chrome" === store ? await watchChromeSubmission({
|
|
1057
|
+
clientId: mustEnv("CHROME_CLIENT_ID", flags.chromeClientId),
|
|
1058
|
+
clientSecret: mustEnv("CHROME_CLIENT_SECRET", flags.chromeClientSecret),
|
|
1059
|
+
refreshToken: mustEnv("CHROME_REFRESH_TOKEN", flags.chromeRefreshToken),
|
|
1060
|
+
extensionId: mustEnv("CHROME_EXTENSION_ID", flags.chromeExtensionId)
|
|
1061
|
+
}, {
|
|
1062
|
+
pollIntervalMs,
|
|
1063
|
+
timeoutMs,
|
|
1064
|
+
onEvent
|
|
1065
|
+
}) : "firefox" === store ? await watchFirefoxSubmission({
|
|
1066
|
+
jwtIssuer: mustEnv("FIREFOX_JWT_ISSUER", flags.firefoxJwtIssuer),
|
|
1067
|
+
jwtSecret: mustEnv("FIREFOX_JWT_SECRET", flags.firefoxJwtSecret),
|
|
1068
|
+
extensionId: mustEnv("FIREFOX_EXTENSION_ID", flags.firefoxExtensionId),
|
|
1069
|
+
versionId: mustValue("--watch-submission-id", flags.watchSubmissionId)
|
|
1070
|
+
}, {
|
|
1071
|
+
pollIntervalMs,
|
|
1072
|
+
timeoutMs,
|
|
1073
|
+
onEvent
|
|
1074
|
+
}) : await watchEdgeSubmission({
|
|
1075
|
+
clientId: mustEnv("EDGE_CLIENT_ID", flags.edgeClientId),
|
|
1076
|
+
apiKey: mustEnv("EDGE_API_KEY", flags.edgeApiKey),
|
|
1077
|
+
productId: mustEnv("EDGE_PRODUCT_ID", flags.edgeProductId),
|
|
1078
|
+
operationId: mustValue("--watch-submission-id", flags.watchSubmissionId)
|
|
1079
|
+
}, {
|
|
1080
|
+
pollIntervalMs,
|
|
1081
|
+
timeoutMs,
|
|
1082
|
+
onEvent
|
|
1083
|
+
});
|
|
1084
|
+
} catch (err) {
|
|
1085
|
+
console.error(err instanceof Error ? err.message : err);
|
|
1086
|
+
process.exit(1);
|
|
1087
|
+
}
|
|
1088
|
+
if (flags.outputJson) writeJsonOutput(flags.outputJson, terminal);
|
|
1089
|
+
if ("failed" === terminal.status || "rejected" === terminal.status) process.exit(1);
|
|
1090
|
+
}
|
|
1091
|
+
function mustEnv(envName, flagValue) {
|
|
1092
|
+
const v = flagValue ?? process.env[envName];
|
|
1093
|
+
if (!v) throw new Error(`Missing required credential: ${envName}. Set the env var or pass the matching flag.`);
|
|
1094
|
+
return v;
|
|
1095
|
+
}
|
|
1096
|
+
function mustValue(flagName, value) {
|
|
1097
|
+
if (!value) throw new Error(`Missing required flag: ${flagName}`);
|
|
1098
|
+
return value;
|
|
1099
|
+
}
|
|
1100
|
+
export { chromeOptionsSchema, deploy, deployConfigSchema, edgeOptionsSchema, firefoxOptionsSchema, getChromeSubmissionEvent, getEdgeSubmissionEvent, getFirefoxSubmissionEvent, main, resolveConfig, validateConfig, verifyChromeCredentials, verifyEdgeCredentials, verifyFirefoxCredentials, watchChromeSubmission, watchEdgeSubmission, watchFirefoxSubmission };
|
package/dist/src/index.d.ts
CHANGED
package/dist/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AACzD,YAAY,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACzC,YAAY,EACV,QAAQ,EACR,aAAa,EACb,cAAc,EACd,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,WAAW,EACX,UAAU,GACX,MAAM,SAAS,CAAC;AACjB,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAC;AACnD,YAAY,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AACnD,OAAO,EAAE,wBAAwB,EAAE,MAAM,WAAW,CAAC;AACrD,YAAY,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,QAAQ,CAAC;AAC/C,YAAY,EAAE,gBAAgB,EAAE,MAAM,QAAQ,CAAC;AAC/C,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,sBAAsB,EACtB,wBAAwB,EACxB,sBAAsB,EACtB,yBAAyB,GAC1B,MAAM,SAAS,CAAC;AACjB,YAAY,EACV,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,iBAAiB,GAClB,MAAM,SAAS,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC;AAC7B,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AACzD,YAAY,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACzC,YAAY,EACV,QAAQ,EACR,aAAa,EACb,cAAc,EACd,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,WAAW,EACX,UAAU,GACX,MAAM,SAAS,CAAC;AACjB,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAC;AACnD,YAAY,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AACnD,OAAO,EAAE,wBAAwB,EAAE,MAAM,WAAW,CAAC;AACrD,YAAY,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,QAAQ,CAAC;AAC/C,YAAY,EAAE,gBAAgB,EAAE,MAAM,QAAQ,CAAC;AAC/C,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,sBAAsB,EACtB,wBAAwB,EACxB,sBAAsB,EACtB,yBAAyB,GAC1B,MAAM,SAAS,CAAC;AACjB,YAAY,EACV,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,iBAAiB,GAClB,MAAM,SAAS,CAAC"}
|
package/package.json
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"ci",
|
|
14
14
|
"automation"
|
|
15
15
|
],
|
|
16
|
-
"version": "0.1.
|
|
16
|
+
"version": "0.1.1",
|
|
17
17
|
"repository": {
|
|
18
18
|
"type": "git",
|
|
19
19
|
"url": "git+https://github.com/extensiondev/deploy.git"
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
}
|
|
36
36
|
},
|
|
37
37
|
"bin": {
|
|
38
|
-
"extension-deploy": "
|
|
38
|
+
"extension-deploy": "bin/extension-deploy.cjs"
|
|
39
39
|
},
|
|
40
40
|
"main": "./dist/module.js",
|
|
41
41
|
"types": "./dist/module.d.ts",
|