extension-install 4.0.16 → 4.0.17

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.
@@ -0,0 +1,180 @@
1
+ export type Channel = 'info' | 'success' | 'warn' | 'error' | 'debug';
2
+ export declare function isDebug(): boolean;
3
+ export declare function prefix(type: Channel): string;
4
+ export declare const fmt: {
5
+ heading: (title: string) => string;
6
+ label: (key: string) => string;
7
+ val: (value: string) => string;
8
+ code: (value: string) => string;
9
+ bullet: (value: string) => string;
10
+ block(title: string, rows: Array<[string, string]>): string;
11
+ truncate(input: unknown, max?: number): string;
12
+ };
13
+ export interface CardRow {
14
+ label: string;
15
+ value?: string;
16
+ }
17
+ export interface CardInput {
18
+ version?: string;
19
+ suffix?: string;
20
+ rows?: CardRow[];
21
+ }
22
+ export declare function card(input?: CardInput): string;
23
+ export declare function isCardKeyClaimed(key: string): boolean;
24
+ export declare function claimCardKey(key: string): boolean;
25
+ export declare function artifactNoun(browser: string): 'Add-on' | 'Extension';
26
+ export declare const ENVELOPE_SCHEMA = 1;
27
+ export declare const CODES: {
28
+ readonly E_ARGS: 'E_ARGS';
29
+ readonly E_PROJECT_NOT_FOUND: 'E_PROJECT_NOT_FOUND';
30
+ readonly E_MANIFEST_NOT_FOUND: 'E_MANIFEST_NOT_FOUND';
31
+ readonly E_MANIFEST_INVALID: 'E_MANIFEST_INVALID';
32
+ readonly E_FIRST_COMPILE: 'E_FIRST_COMPILE';
33
+ readonly E_COMPILE: 'E_COMPILE';
34
+ readonly E_BROWSER_NOT_FOUND: 'E_BROWSER_NOT_FOUND';
35
+ readonly E_BROWSER_LAUNCH: 'E_BROWSER_LAUNCH';
36
+ readonly E_PROFILE_LOCKED: 'E_PROFILE_LOCKED';
37
+ readonly E_READY_TIMEOUT: 'E_READY_TIMEOUT';
38
+ readonly E_SESSION_EXISTS: 'E_SESSION_EXISTS';
39
+ readonly E_CONTROL_DENIED: 'E_CONTROL_DENIED';
40
+ readonly E_CONTROL_UNAVAILABLE: 'E_CONTROL_UNAVAILABLE';
41
+ readonly E_TOKEN_MISSING: 'E_TOKEN_MISSING';
42
+ readonly E_NETWORK: 'E_NETWORK';
43
+ readonly E_INTERRUPTED: 'E_INTERRUPTED';
44
+ readonly E_NOT_IMPLEMENTED: 'E_NOT_IMPLEMENTED';
45
+ readonly E_INTERNAL: 'E_INTERNAL';
46
+ readonly E_UNSUPPORTED_BROWSER: 'E_UNSUPPORTED_BROWSER';
47
+ readonly E_INVALID_OPTION: 'E_INVALID_OPTION';
48
+ readonly E_PORT_UNAVAILABLE: 'E_PORT_UNAVAILABLE';
49
+ readonly E_DEPENDENCY_INSTALL: 'E_DEPENDENCY_INSTALL';
50
+ readonly E_TEMPLATE_NOT_FOUND: 'E_TEMPLATE_NOT_FOUND';
51
+ readonly E_DESTINATION_NOT_EMPTY: 'E_DESTINATION_NOT_EMPTY';
52
+ readonly E_DESTINATION_NOT_WRITABLE: 'E_DESTINATION_NOT_WRITABLE';
53
+ readonly E_BROWSER_DOWNLOAD: 'E_BROWSER_DOWNLOAD';
54
+ readonly E_SESSION_NOT_FOUND: 'E_SESSION_NOT_FOUND';
55
+ readonly E_EVAL_REFUSED: 'E_EVAL_REFUSED';
56
+ readonly E_TARGET_NOT_FOUND: 'E_TARGET_NOT_FOUND';
57
+ readonly E_TIMEOUT: 'E_TIMEOUT';
58
+ readonly E_PUBLISH_REJECTED: 'E_PUBLISH_REJECTED';
59
+ readonly E_AUTH_REQUIRED: 'E_AUTH_REQUIRED';
60
+ readonly E_SAFARI_TOOLCHAIN: 'E_SAFARI_TOOLCHAIN';
61
+ readonly E_EVAL: 'E_EVAL';
62
+ readonly E_INSPECT: 'E_INSPECT';
63
+ readonly E_STORAGE: 'E_STORAGE';
64
+ readonly E_LOGS_NOT_FOUND: 'E_LOGS_NOT_FOUND';
65
+ readonly E_READY_ERROR_STATUS: 'E_READY_ERROR_STATUS';
66
+ readonly E_COMMAND_UNSUPPORTED_FOR_TARGET: 'E_COMMAND_UNSUPPORTED_FOR_TARGET';
67
+ readonly E_FLAG_VALUE_INVALID: 'E_FLAG_VALUE_INVALID';
68
+ readonly E_FLAG_NOT_SUPPORTED_HERE: 'E_FLAG_NOT_SUPPORTED_HERE';
69
+ readonly E_DEV_SERVER_START: 'E_DEV_SERVER_START';
70
+ readonly E_DOCTOR_CHECKS_FAILED: 'E_DOCTOR_CHECKS_FAILED';
71
+ readonly E_TELEMETRY_WRITE: 'E_TELEMETRY_WRITE';
72
+ readonly E_PREVIEW_NO_DIST: 'E_PREVIEW_NO_DIST';
73
+ readonly E_BROWSER_UNINSTALL: 'E_BROWSER_UNINSTALL';
74
+ readonly E_NODE_VERSION: 'E_NODE_VERSION';
75
+ readonly E_UNKNOWN_COMMAND: 'E_UNKNOWN_COMMAND';
76
+ readonly E_REMOVED_FLAG: 'E_REMOVED_FLAG';
77
+ readonly E_BROWSER_NOT_INSTALLABLE: 'E_BROWSER_NOT_INSTALLABLE';
78
+ readonly E_PARENT_GONE: 'E_PARENT_GONE';
79
+ readonly E_REMOTE_URL_UNSUPPORTED: 'E_REMOTE_URL_UNSUPPORTED';
80
+ readonly E_CONFIG_LOAD: 'E_CONFIG_LOAD';
81
+ readonly E_MANAGED_DEP_CONFLICT: 'E_MANAGED_DEP_CONFLICT';
82
+ readonly E_TYPES_EMIT: 'E_TYPES_EMIT';
83
+ readonly E_TSCONFIG_MISSING: 'E_TSCONFIG_MISSING';
84
+ readonly E_OPTIONAL_DEP_UNRESOLVED: 'E_OPTIONAL_DEP_UNRESOLVED';
85
+ readonly E_OPTIONAL_DEP_LOAD: 'E_OPTIONAL_DEP_LOAD';
86
+ readonly E_OPTIONAL_DEP_UNKNOWN: 'E_OPTIONAL_DEP_UNKNOWN';
87
+ readonly E_COMPANION_EXTENSION_PATH: 'E_COMPANION_EXTENSION_PATH';
88
+ readonly E_MANIFEST_IN_PUBLIC: 'E_MANIFEST_IN_PUBLIC';
89
+ readonly E_RUNTIME_NOT_FOUND: 'E_RUNTIME_NOT_FOUND';
90
+ readonly E_MANIFEST_SHAPE: 'E_MANIFEST_SHAPE';
91
+ readonly E_MANIFEST_PAGE_MISSING: 'E_MANIFEST_PAGE_MISSING';
92
+ readonly E_MANIFEST_VERSION_UNSUPPORTED: 'E_MANIFEST_VERSION_UNSUPPORTED';
93
+ readonly E_MANIFEST_LOAD_BLOCKERS: 'E_MANIFEST_LOAD_BLOCKERS';
94
+ readonly E_MANIFEST_PERMISSION_MISSING: 'E_MANIFEST_PERMISSION_MISSING';
95
+ readonly E_MANIFEST_MSG_KEY_MISSING: 'E_MANIFEST_MSG_KEY_MISSING';
96
+ readonly E_MANIFEST_EMIT: 'E_MANIFEST_EMIT';
97
+ readonly E_RESTART_REQUIRED: 'E_RESTART_REQUIRED';
98
+ readonly E_COMPILE_FATAL: 'E_COMPILE_FATAL';
99
+ readonly E_MODULE_NOT_FOUND: 'E_MODULE_NOT_FOUND';
100
+ readonly E_ENTRY_NOT_FOUND: 'E_ENTRY_NOT_FOUND';
101
+ readonly E_ASSET_MISSING: 'E_ASSET_MISSING';
102
+ readonly E_SCRIPT_DEP_MISSING: 'E_SCRIPT_DEP_MISSING';
103
+ readonly E_RESERVED_FOLDER: 'E_RESERVED_FOLDER';
104
+ readonly E_CSS_PARSE: 'E_CSS_PARSE';
105
+ readonly E_CSS_PREPROCESSOR_MISSING: 'E_CSS_PREPROCESSOR_MISSING';
106
+ readonly E_CSS_DEAD_REF: 'E_CSS_DEAD_REF';
107
+ readonly E_INTEGRATION_INSTALL: 'E_INTEGRATION_INSTALL';
108
+ readonly E_POLYFILL_NOT_FOUND: 'E_POLYFILL_NOT_FOUND';
109
+ readonly E_LOCALES_LAYOUT: 'E_LOCALES_LAYOUT';
110
+ readonly E_WAR_INVALID: 'E_WAR_INVALID';
111
+ readonly E_MATCH_PATTERN_INVALID: 'E_MATCH_PATTERN_INVALID';
112
+ readonly E_BACKGROUND_REQUIRED: 'E_BACKGROUND_REQUIRED';
113
+ readonly E_CONTENT_SCRIPT_SYNTAX: 'E_CONTENT_SCRIPT_SYNTAX';
114
+ readonly E_NO_ENTRYPOINTS: 'E_NO_ENTRYPOINTS';
115
+ readonly E_REMOTE_RESOURCE_BLOCKED: 'E_REMOTE_RESOURCE_BLOCKED';
116
+ readonly E_PERF_BUDGET: 'E_PERF_BUDGET';
117
+ readonly E_ZIP_SKIPPED: 'E_ZIP_SKIPPED';
118
+ readonly E_ENV_NO_MATCH: 'E_ENV_NO_MATCH';
119
+ readonly E_REMOTE_FETCH_TIMEOUT: 'E_REMOTE_FETCH_TIMEOUT';
120
+ readonly E_REMOTE_DOWNLOAD: 'E_REMOTE_DOWNLOAD';
121
+ readonly E_REMOTE_ZIP_INVALID: 'E_REMOTE_ZIP_INVALID';
122
+ readonly E_LOCAL_ZIP_NOT_FOUND: 'E_LOCAL_ZIP_NOT_FOUND';
123
+ readonly E_PROJECT_DOWNLOAD_EMPTY: 'E_PROJECT_DOWNLOAD_EMPTY';
124
+ readonly E_BROWSER_BINARY_REQUIRED: 'E_BROWSER_BINARY_REQUIRED';
125
+ readonly E_BROWSER_BINARY_INVALID: 'E_BROWSER_BINARY_INVALID';
126
+ readonly E_BROWSER_EXITED: 'E_BROWSER_EXITED';
127
+ readonly E_BROWSER_START_TIMEOUT: 'E_BROWSER_START_TIMEOUT';
128
+ readonly E_LAUNCH_SKIPPED_COMPILE_ERRORS: 'E_LAUNCH_SKIPPED_COMPILE_ERRORS';
129
+ readonly E_INSTANCE_AMBIGUOUS: 'E_INSTANCE_AMBIGUOUS';
130
+ readonly E_WSL_INTEROP: 'E_WSL_INTEROP';
131
+ readonly E_EXTENSION_LOAD_REFUSED: 'E_EXTENSION_LOAD_REFUSED';
132
+ readonly E_ADDON_INSTALL: 'E_ADDON_INSTALL';
133
+ readonly E_BROWSER_CONNECT: 'E_BROWSER_CONNECT';
134
+ readonly E_BROWSER_CONNECTION_CLOSED: 'E_BROWSER_CONNECTION_CLOSED';
135
+ readonly E_CDP_NOT_CONNECTED: 'E_CDP_NOT_CONNECTED';
136
+ readonly E_CDP_TIMEOUT: 'E_CDP_TIMEOUT';
137
+ readonly E_CDP_OP_FAILED: 'E_CDP_OP_FAILED';
138
+ readonly E_EXTENSION_ID_UNKNOWN: 'E_EXTENSION_ID_UNKNOWN';
139
+ readonly E_RDP_PROTOCOL: 'E_RDP_PROTOCOL';
140
+ readonly E_DEV_SERVER_TIMEOUT: 'E_DEV_SERVER_TIMEOUT';
141
+ readonly E_PORT_IN_USE: 'E_PORT_IN_USE';
142
+ readonly E_SESSION_STOPPED: 'E_SESSION_STOPPED';
143
+ readonly E_LOGS_STREAM_GAP: 'E_LOGS_STREAM_GAP';
144
+ readonly E_CREATE_DIR: 'E_CREATE_DIR';
145
+ readonly E_CREATE_WRITE: 'E_CREATE_WRITE';
146
+ readonly E_CREATE_TESTS_SETUP: 'E_CREATE_TESTS_SETUP';
147
+ readonly E_GIT_SKIPPED: 'E_GIT_SKIPPED';
148
+ readonly E_BROWSER_INSTALL_PRIVILEGE: 'E_BROWSER_INSTALL_PRIVILEGE';
149
+ readonly E_UNINSTALL_NOOP: 'E_UNINSTALL_NOOP';
150
+ };
151
+ export type ErrorCode = (typeof CODES)[keyof typeof CODES];
152
+ export interface EnvelopeError {
153
+ code: ErrorCode;
154
+ message: string;
155
+ name?: string;
156
+ engine?: string;
157
+ hint?: string;
158
+ }
159
+ export interface Envelope<T = unknown> {
160
+ schema: typeof ENVELOPE_SCHEMA;
161
+ ok: boolean;
162
+ command: string;
163
+ status: string;
164
+ value: T | null;
165
+ error: EnvelopeError | null;
166
+ truncated?: boolean;
167
+ hint?: string;
168
+ warnings: string[];
169
+ }
170
+ export interface EnvelopeExtras {
171
+ hint?: string;
172
+ warnings?: string[];
173
+ truncated?: boolean;
174
+ value?: unknown;
175
+ }
176
+ export declare const ENVELOPE: {
177
+ schema: number;
178
+ ok<T>(command: string, status: string, value: T, extras?: EnvelopeExtras): Envelope<T>;
179
+ fail(command: string, status: string, error: EnvelopeError, extras?: EnvelopeExtras): Envelope;
180
+ };
package/dist/module.cjs CHANGED
@@ -105,38 +105,84 @@ function removeBrowserDir(browser) {
105
105
  }
106
106
  const external_pintor_namespaceObject = require("pintor");
107
107
  var external_pintor_default = /*#__PURE__*/ __webpack_require__.n(external_pintor_namespaceObject);
108
- const statusPrefix = external_pintor_default().brightBlue('⏵⏵⏵');
108
+ const GLYPH = '⏵⏵⏵';
109
+ const DEBUG_GLYPH = '···';
110
+ new Set([
111
+ '1',
112
+ 'true',
113
+ 'yes',
114
+ 'on',
115
+ 'debug',
116
+ 'dev',
117
+ 'development'
118
+ ]);
119
+ function prefix(type) {
120
+ if ('error' === type) return external_pintor_default().red(GLYPH);
121
+ if ('warn' === type) return external_pintor_default().brightYellow(GLYPH);
122
+ if ('success' === type) return external_pintor_default().green(GLYPH);
123
+ if ('debug' === type) return external_pintor_default().dim(external_pintor_default().gray(DEBUG_GLYPH));
124
+ return external_pintor_default().gray(GLYPH);
125
+ }
126
+ const fmt = {
127
+ heading: (title)=>external_pintor_default().underline(external_pintor_default().blue(title)),
128
+ label: (key)=>external_pintor_default().gray(key.toUpperCase()),
129
+ val: (value)=>external_pintor_default().underline(value),
130
+ code: (value)=>external_pintor_default().blue(value),
131
+ bullet: (value)=>`- ${value}`,
132
+ block (title, rows) {
133
+ const head = fmt.heading(title);
134
+ const body = rows.map(([key, value])=>`${fmt.label(key)} ${value}`).join('\n');
135
+ return `${head}\n${body}`;
136
+ },
137
+ truncate (input, max = 800) {
138
+ const s = (()=>{
139
+ try {
140
+ return 'string' == typeof input ? input : JSON.stringify(input);
141
+ } catch {
142
+ return String(input);
143
+ }
144
+ })();
145
+ return s.length > max ? `${s.slice(0, max)}…` : s;
146
+ }
147
+ };
148
+ new Set([
149
+ 'firefox',
150
+ 'firefox-based',
151
+ 'gecko-based',
152
+ 'librewolf',
153
+ 'waterfox'
154
+ ]);
109
155
  function titleCase(value) {
110
156
  return value.length ? value[0].toUpperCase() + value.slice(1) : value;
111
157
  }
112
158
  function installingBrowser(browser, destination) {
113
- return `${statusPrefix} Installing ${external_pintor_default().blue(titleCase(browser))} into ${external_pintor_default().underline(destination)}...`;
159
+ return `${prefix('info')} Install ${external_pintor_default().blue(titleCase(browser))}.\n${fmt.label('PATH')} ${fmt.val(destination)}`;
114
160
  }
115
161
  function installSucceeded(browser, destination) {
116
- return `${statusPrefix} ${external_pintor_default().green('Installed')} ${external_pintor_default().blue(titleCase(browser))} in ${external_pintor_default().underline(destination)}`;
162
+ return `${prefix('success')} ${external_pintor_default().blue(titleCase(browser))} is installed.\n${fmt.label('PATH')} ${fmt.val(destination)}`;
117
163
  }
118
164
  function installFailed(browser, command, args, code, stderr) {
119
165
  const details = String(stderr || '').trim();
120
166
  const detailSuffix = details ? `\n${external_pintor_default().red(details)}` : '';
121
- return `${external_pintor_default().red('Error')} Failed to install ${external_pintor_default().blue(titleCase(browser))}.\nCommand: ${external_pintor_default().yellow(command)} ${external_pintor_default().yellow(args.join(' '))}\nExit code: ${external_pintor_default().yellow(String(code))}` + detailSuffix;
167
+ return `${prefix('error')} Couldn't install ${external_pintor_default().blue(titleCase(browser))}.\n${external_pintor_default().red('The command')} ${external_pintor_default().yellow(command)} ${external_pintor_default().yellow(args.join(' '))} ${external_pintor_default().red(`failed with exit code ${external_pintor_default().yellow(String(code))}`)}${external_pintor_default().red('.')}\n${external_pintor_default().red('Run it yourself to see the full error.')}` + detailSuffix;
122
168
  }
123
169
  function edgeInstallNeedsInteractivePrivilegedSession() {
124
- return `${external_pintor_default().red('Error')} Edge installation on Linux requires a privileged interactive session.\nRun this command in a terminal session where sudo can prompt for credentials, or install Edge system-wide with your package manager.\nExamples:\n- Ubuntu/Debian: ${external_pintor_default().blue('sudo apt install microsoft-edge-stable')}\n- Fedora: ${external_pintor_default().blue('sudo dnf install microsoft-edge-stable')}\nThen run Extension.js with ${external_pintor_default().blue('--browser=edge')} (or use ${external_pintor_default().blue('chromium')} when privileged install is unavailable).`;
170
+ return `${prefix('error')} Edge needs a privileged interactive session on Linux.\n${external_pintor_default().red('Run this command in a terminal where sudo can prompt for credentials.')}\n${external_pintor_default().red('Or install Edge system-wide with your package manager.')}\n ${external_pintor_default().gray('-')} Ubuntu/Debian: ${external_pintor_default().blue('sudo apt install microsoft-edge-stable')}\n ${external_pintor_default().gray('-')} Fedora: ${external_pintor_default().blue('sudo dnf install microsoft-edge-stable')}\n${external_pintor_default().red('Then run Extension.js with')} ${external_pintor_default().blue('--browser=edge')}${external_pintor_default().red('.')}\n${external_pintor_default().red('Use')} ${external_pintor_default().blue('--browser=chromium')} ${external_pintor_default().red('when a privileged install is unavailable.')}`;
125
171
  }
126
172
  function edgeInstallUsingSystemBinary(path) {
127
- return `${statusPrefix} ${external_pintor_default().yellow('Edge channel install was skipped due privilege requirements.')}\n${statusPrefix} Using existing system Edge binary at ${external_pintor_default().underline(path)}.`;
173
+ return `${prefix('warn')} Skip the Edge channel install because it needs elevated privileges.\n${external_pintor_default().yellow('Use the Edge binary already on this system instead.')}\n${fmt.label('PATH')} ${fmt.val(path)}`;
128
174
  }
129
175
  function uninstallRequiresTarget() {
130
- return `${external_pintor_default().red('Error')} Missing browser target. Use --browser <name> or --all.`;
176
+ return `${prefix('error')} A browser target is required.\n${external_pintor_default().red('Pass')} ${external_pintor_default().blue('--browser <name>')}${external_pintor_default().red(', or')} ${external_pintor_default().blue('--all')} ${external_pintor_default().red('to remove every browser.')}`;
131
177
  }
132
178
  function uninstallingBrowsers(cacheRoot, browsers) {
133
- return `${statusPrefix} Removing browser binaries (${browsers.join(', ')}) from ${external_pintor_default().underline(cacheRoot)}...`;
179
+ return `${prefix('info')} Remove the browser binaries for ${external_pintor_default().blue(browsers.join(', '))}.\n${fmt.label('PATH')} ${fmt.val(cacheRoot)}`;
134
180
  }
135
181
  function uninstallSucceeded(browser, removedPath) {
136
- return `${statusPrefix} ${external_pintor_default().green('Removed')} ${external_pintor_default().blue(titleCase(browser))} from ${external_pintor_default().underline(removedPath)}`;
182
+ return `${prefix('success')} ${external_pintor_default().blue(titleCase(browser))} is removed.\n${fmt.label('PATH')} ${fmt.val(removedPath)}`;
137
183
  }
138
184
  function uninstallNoop(browser, checkedPath) {
139
- return `${statusPrefix} ${external_pintor_default().gray(`${titleCase(browser)} is already absent`)} (${external_pintor_default().underline(checkedPath)})`;
185
+ return `${prefix('info')} ${external_pintor_default().blue(titleCase(browser))} is already absent.\n${fmt.label('PATH')} ${fmt.val(checkedPath)}`;
140
186
  }
141
187
  const external_node_child_process_namespaceObject = require("node:child_process");
142
188
  const external_cross_spawn_namespaceObject = require("cross-spawn");
package/package.json CHANGED
@@ -23,7 +23,7 @@
23
23
  "dist"
24
24
  ],
25
25
  "name": "extension-install",
26
- "version": "4.0.16",
26
+ "version": "4.0.17",
27
27
  "description": "Managed browser installer/uninstaller for Extension.js",
28
28
  "author": {
29
29
  "name": "Cezar Augusto",