wxt 0.0.1 → 0.1.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.
@@ -0,0 +1,129 @@
1
+ // src/client/virtual-modules/background-entrypoint.ts
2
+ import definition from "virtual:user-background";
3
+
4
+ // src/client/utils/logger.ts
5
+ function print(method, ...args) {
6
+ if (typeof args[0] === "string") {
7
+ const message = args.shift();
8
+ method(`[wxt] ${message}`, ...args);
9
+ } else {
10
+ method("[wxt]", ...args);
11
+ }
12
+ }
13
+ var logger = {
14
+ debug: (...args) => print(console.debug, ...args),
15
+ log: (...args) => print(console.log, ...args),
16
+ warn: (...args) => print(console.warn, ...args),
17
+ error: (...args) => print(console.error, ...args)
18
+ };
19
+
20
+ // src/client/utils/setupWebSocket.ts
21
+ function setupWebSocket(onMessage) {
22
+ const serverUrl = `${__DEV_SERVER_PROTOCOL__}//${__DEV_SERVER_HOSTNAME__}:${__DEV_SERVER_PORT__}`;
23
+ logger.debug("Connecting to dev server @", serverUrl);
24
+ const ws = new WebSocket(serverUrl, "vite-hmr");
25
+ ws.addEventListener("open", () => {
26
+ logger.debug("Connected to dev server");
27
+ });
28
+ ws.addEventListener("close", () => {
29
+ logger.debug("Disconnected from dev server");
30
+ });
31
+ ws.addEventListener("error", (event) => {
32
+ logger.error("Failed to connect to dev server", event);
33
+ });
34
+ ws.addEventListener("message", (e) => {
35
+ try {
36
+ const message = JSON.parse(e.data);
37
+ if (message.type === "custom" && message.event?.startsWith?.("wxt:")) {
38
+ onMessage?.(message);
39
+ }
40
+ } catch (err) {
41
+ logger.error("Failed to handle message", err);
42
+ }
43
+ });
44
+ return ws;
45
+ }
46
+
47
+ // src/client/virtual-modules/background-entrypoint.ts
48
+ import browser3 from "webextension-polyfill";
49
+
50
+ // src/client/utils/keepServiceWorkerAlive.ts
51
+ import browser from "webextension-polyfill";
52
+ function keepServiceWorkerAlive() {
53
+ setInterval(async () => {
54
+ await browser.runtime.getPlatformInfo();
55
+ }, 5e3);
56
+ }
57
+
58
+ // src/client/utils/reloadContentScript.ts
59
+ import browser2 from "webextension-polyfill";
60
+ import { MatchPattern } from "@webext-core/match-patterns";
61
+ function reloadContentScript(contentScript) {
62
+ const manifest = browser2.runtime.getManifest();
63
+ if (manifest.manifest_version == 2) {
64
+ void reloadContentScriptMv2(contentScript);
65
+ } else {
66
+ void reloadContentScriptMv3(contentScript);
67
+ }
68
+ }
69
+ async function reloadContentScriptMv3(contentScript) {
70
+ const id = `wxt:${contentScript.js[0]}`;
71
+ logger.log("Reloading content script:", contentScript);
72
+ const registered = await browser2.scripting.getRegisteredContentScripts();
73
+ logger.debug("Existing scripts:", registered);
74
+ const existing = registered.find((cs) => cs.id === id);
75
+ if (existing) {
76
+ logger.debug("Updating content script", existing);
77
+ await browser2.scripting.updateContentScripts([{ ...contentScript, id }]);
78
+ } else {
79
+ logger.debug("Registering new content script...");
80
+ await browser2.scripting.registerContentScripts([{ ...contentScript, id }]);
81
+ }
82
+ const allTabs = await browser2.tabs.query({});
83
+ const matchPatterns = contentScript.matches.map(
84
+ (match) => new MatchPattern(match)
85
+ );
86
+ const matchingTabs = allTabs.filter((tab) => {
87
+ const url = tab.url;
88
+ if (!url)
89
+ return false;
90
+ return !!matchPatterns.find((pattern) => pattern.includes(url));
91
+ });
92
+ await Promise.all(matchingTabs.map((tab) => browser2.tabs.reload(tab.id)));
93
+ }
94
+ async function reloadContentScriptMv2(contentScript) {
95
+ throw Error("TODO: reloadContentScriptMv2");
96
+ }
97
+
98
+ // src/client/virtual-modules/background-entrypoint.ts
99
+ if (__COMMAND__ === "serve") {
100
+ try {
101
+ const ws = setupWebSocket((message) => {
102
+ if (message.event === "wxt:reload-extension")
103
+ browser3.runtime.reload();
104
+ if (message.event === "wxt:reload-content-script" && message.data != null)
105
+ reloadContentScript(message.data);
106
+ });
107
+ if (__MANIFEST_VERSION__ === 3) {
108
+ ws.addEventListener("open", () => {
109
+ const msg = { type: "custom", event: "wxt:background-initialized" };
110
+ ws.send(JSON.stringify(msg));
111
+ });
112
+ keepServiceWorkerAlive();
113
+ }
114
+ } catch (err) {
115
+ logger.error("Failed to setup web socket connection with dev server", err);
116
+ }
117
+ }
118
+ try {
119
+ const res = definition.main();
120
+ if (res instanceof Promise) {
121
+ console.warn(
122
+ "The background's main() function return a promise, but it must be synchonous"
123
+ );
124
+ }
125
+ } catch (err) {
126
+ logger.error("The background script crashed on startup!");
127
+ throw err;
128
+ }
129
+ //# sourceMappingURL=background-entrypoint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/client/virtual-modules/background-entrypoint.ts","../../src/client/utils/logger.ts","../../src/client/utils/setupWebSocket.ts","../../src/client/utils/keepServiceWorkerAlive.ts","../../src/client/utils/reloadContentScript.ts"],"sourcesContent":["import definition from 'virtual:user-background';\nimport { setupWebSocket } from '../utils/setupWebSocket';\nimport { logger } from '../utils/logger';\nimport browser from 'webextension-polyfill';\nimport { keepServiceWorkerAlive } from '../utils/keepServiceWorkerAlive';\nimport { reloadContentScript } from '../utils/reloadContentScript';\n\nif (__COMMAND__ === 'serve') {\n try {\n const ws = setupWebSocket((message) => {\n if (message.event === 'wxt:reload-extension') browser.runtime.reload();\n if (message.event === 'wxt:reload-content-script' && message.data != null)\n reloadContentScript(message.data);\n });\n\n if (__MANIFEST_VERSION__ === 3) {\n // Tell the server the background script is loaded and ready to go\n ws.addEventListener('open', () => {\n const msg = { type: 'custom', event: 'wxt:background-initialized' };\n ws.send(JSON.stringify(msg));\n });\n\n // Web Socket will disconnect if the service worker is killed\n keepServiceWorkerAlive();\n }\n } catch (err) {\n logger.error('Failed to setup web socket connection with dev server', err);\n }\n}\n\ntry {\n const res = definition.main();\n // @ts-expect-error: res shouldn't be a promise, but we're checking it anyways\n if (res instanceof Promise) {\n console.warn(\n \"The background's main() function return a promise, but it must be synchonous\",\n );\n }\n} catch (err) {\n logger.error('The background script crashed on startup!');\n throw err;\n}\n","function print(method: (...args: any[]) => void, ...args: any[]) {\n if (typeof args[0] === 'string') {\n const message = args.shift();\n method(`[wxt] ${message}`, ...args);\n } else {\n method('[wxt]', ...args);\n }\n}\n\n/**\n * Wrapper around `console` with a \"[wxt]\" prefix\n */\nexport const logger = {\n debug: (...args: any[]) => print(console.debug, ...args),\n log: (...args: any[]) => print(console.log, ...args),\n warn: (...args: any[]) => print(console.warn, ...args),\n error: (...args: any[]) => print(console.error, ...args),\n};\n","import { logger } from './logger';\n\ninterface WebSocketMessage {\n type: string;\n event: string;\n data?: any;\n}\n\n/**\n * Connect to the websocket and listen for messages.\n *\n * @param onMessage Optional callback that is called when a message is recieved and we've verified\n * it's structure is what we expect.\n */\nexport function setupWebSocket(\n onMessage?: (message: WebSocketMessage) => void,\n) {\n const serverUrl = `${__DEV_SERVER_PROTOCOL__}//${__DEV_SERVER_HOSTNAME__}:${__DEV_SERVER_PORT__}`;\n logger.debug('Connecting to dev server @', serverUrl);\n const ws = new WebSocket(serverUrl, 'vite-hmr');\n\n ws.addEventListener('open', () => {\n logger.debug('Connected to dev server');\n });\n ws.addEventListener('close', () => {\n logger.debug('Disconnected from dev server');\n });\n ws.addEventListener('error', (event) => {\n logger.error('Failed to connect to dev server', event);\n });\n\n ws.addEventListener('message', (e) => {\n try {\n const message = JSON.parse(e.data) as WebSocketMessage;\n if (message.type === 'custom' && message.event?.startsWith?.('wxt:')) {\n onMessage?.(message);\n }\n } catch (err) {\n logger.error('Failed to handle message', err);\n }\n });\n\n return ws;\n}\n","import browser from 'webextension-polyfill';\n\n/**\n * https://developer.chrome.com/blog/longer-esw-lifetimes/\n */\nexport function keepServiceWorkerAlive() {\n setInterval(async () => {\n // Calling an async browser API resets the service worker's timeout\n await browser.runtime.getPlatformInfo();\n }, 5e3);\n}\n","import browser, { Manifest } from 'webextension-polyfill';\nimport { logger } from './logger';\nimport { MatchPattern } from '@webext-core/match-patterns';\n\nexport function reloadContentScript(contentScript: Manifest.ContentScript) {\n const manifest = browser.runtime.getManifest();\n if (manifest.manifest_version == 2) {\n void reloadContentScriptMv2(contentScript);\n } else {\n void reloadContentScriptMv3(contentScript);\n }\n}\n\nexport async function reloadContentScriptMv3(\n contentScript: Manifest.ContentScript,\n) {\n const id = `wxt:${contentScript.js![0]}`;\n logger.log('Reloading content script:', contentScript);\n const registered = await browser.scripting.getRegisteredContentScripts();\n logger.debug('Existing scripts:', registered);\n\n const existing = registered.find((cs) => cs.id === id);\n\n if (existing) {\n logger.debug('Updating content script', existing);\n await browser.scripting.updateContentScripts([{ ...contentScript, id }]);\n } else {\n logger.debug('Registering new content script...');\n await browser.scripting.registerContentScripts([{ ...contentScript, id }]);\n }\n\n const allTabs = await browser.tabs.query({});\n const matchPatterns = contentScript.matches.map(\n (match) => new MatchPattern(match),\n );\n const matchingTabs = allTabs.filter((tab) => {\n const url = tab.url;\n if (!url) return false;\n return !!matchPatterns.find((pattern) => pattern.includes(url));\n });\n await Promise.all(matchingTabs.map((tab) => browser.tabs.reload(tab.id)));\n}\n\nexport async function reloadContentScriptMv2(\n contentScript: Manifest.ContentScript,\n) {\n throw Error('TODO: reloadContentScriptMv2');\n}\n"],"mappings":"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","names":["browser","browser","browser","browser"]}
@@ -0,0 +1,28 @@
1
+ // src/client/virtual-modules/content-script-entrypoint.ts
2
+ import definition from "virtual:user-content-script";
3
+
4
+ // src/client/utils/logger.ts
5
+ function print(method, ...args) {
6
+ if (typeof args[0] === "string") {
7
+ const message = args.shift();
8
+ method(`[wxt] ${message}`, ...args);
9
+ } else {
10
+ method("[wxt]", ...args);
11
+ }
12
+ }
13
+ var logger = {
14
+ debug: (...args) => print(console.debug, ...args),
15
+ log: (...args) => print(console.log, ...args),
16
+ warn: (...args) => print(console.warn, ...args),
17
+ error: (...args) => print(console.error, ...args)
18
+ };
19
+
20
+ // src/client/virtual-modules/content-script-entrypoint.ts
21
+ (async () => {
22
+ try {
23
+ await definition.main();
24
+ } catch (err) {
25
+ logger.error("The content script crashed on startup!", err);
26
+ }
27
+ })();
28
+ //# sourceMappingURL=content-script-entrypoint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/client/virtual-modules/content-script-entrypoint.ts","../../src/client/utils/logger.ts"],"sourcesContent":["import definition from 'virtual:user-content-script';\nimport { logger } from '../utils/logger';\n\n(async () => {\n try {\n await definition.main();\n } catch (err) {\n logger.error('The content script crashed on startup!', err);\n }\n})();\n","function print(method: (...args: any[]) => void, ...args: any[]) {\n if (typeof args[0] === 'string') {\n const message = args.shift();\n method(`[wxt] ${message}`, ...args);\n } else {\n method('[wxt]', ...args);\n }\n}\n\n/**\n * Wrapper around `console` with a \"[wxt]\" prefix\n */\nexport const logger = {\n debug: (...args: any[]) => print(console.debug, ...args),\n log: (...args: any[]) => print(console.log, ...args),\n warn: (...args: any[]) => print(console.warn, ...args),\n error: (...args: any[]) => print(console.error, ...args),\n};\n"],"mappings":";AAAA,OAAO,gBAAgB;;;ACAvB,SAAS,MAAM,WAAqC,MAAa;AAC/D,MAAI,OAAO,KAAK,CAAC,MAAM,UAAU;AAC/B,UAAM,UAAU,KAAK,MAAM;AAC3B,WAAO,SAAS,WAAW,GAAG,IAAI;AAAA,EACpC,OAAO;AACL,WAAO,SAAS,GAAG,IAAI;AAAA,EACzB;AACF;AAKO,IAAM,SAAS;AAAA,EACpB,OAAO,IAAI,SAAgB,MAAM,QAAQ,OAAO,GAAG,IAAI;AAAA,EACvD,KAAK,IAAI,SAAgB,MAAM,QAAQ,KAAK,GAAG,IAAI;AAAA,EACnD,MAAM,IAAI,SAAgB,MAAM,QAAQ,MAAM,GAAG,IAAI;AAAA,EACrD,OAAO,IAAI,SAAgB,MAAM,QAAQ,OAAO,GAAG,IAAI;AACzD;;;CDdC,YAAY;AACX,MAAI;AACF,UAAM,WAAW,KAAK;AAAA,EACxB,SAAS,KAAP;AACA,WAAO,MAAM,0CAA0C,GAAG;AAAA,EAC5D;AACF,GAAG;","names":[]}
@@ -0,0 +1,58 @@
1
+ // src/client/utils/logger.ts
2
+ function print(method, ...args) {
3
+ if (typeof args[0] === "string") {
4
+ const message = args.shift();
5
+ method(`[wxt] ${message}`, ...args);
6
+ } else {
7
+ method("[wxt]", ...args);
8
+ }
9
+ }
10
+ var logger = {
11
+ debug: (...args) => print(console.debug, ...args),
12
+ log: (...args) => print(console.log, ...args),
13
+ warn: (...args) => print(console.warn, ...args),
14
+ error: (...args) => print(console.error, ...args)
15
+ };
16
+
17
+ // src/client/utils/setupWebSocket.ts
18
+ function setupWebSocket(onMessage) {
19
+ const serverUrl = `${__DEV_SERVER_PROTOCOL__}//${__DEV_SERVER_HOSTNAME__}:${__DEV_SERVER_PORT__}`;
20
+ logger.debug("Connecting to dev server @", serverUrl);
21
+ const ws = new WebSocket(serverUrl, "vite-hmr");
22
+ ws.addEventListener("open", () => {
23
+ logger.debug("Connected to dev server");
24
+ });
25
+ ws.addEventListener("close", () => {
26
+ logger.debug("Disconnected from dev server");
27
+ });
28
+ ws.addEventListener("error", (event) => {
29
+ logger.error("Failed to connect to dev server", event);
30
+ });
31
+ ws.addEventListener("message", (e) => {
32
+ try {
33
+ const message = JSON.parse(e.data);
34
+ if (message.type === "custom" && message.event?.startsWith?.("wxt:")) {
35
+ onMessage?.(message);
36
+ }
37
+ } catch (err) {
38
+ logger.error("Failed to handle message", err);
39
+ }
40
+ });
41
+ return ws;
42
+ }
43
+
44
+ // src/client/virtual-modules/reload-html.ts
45
+ if (__COMMAND__ === "serve") {
46
+ try {
47
+ setupWebSocket((message) => {
48
+ if (message.event === "wxt:reload-page") {
49
+ if (message.data === location.pathname.substring(1)) {
50
+ location.reload();
51
+ }
52
+ }
53
+ });
54
+ } catch (err) {
55
+ logger.error("Failed to setup web socket connection with dev server", err);
56
+ }
57
+ }
58
+ //# sourceMappingURL=reload-html.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/client/utils/logger.ts","../../src/client/utils/setupWebSocket.ts","../../src/client/virtual-modules/reload-html.ts"],"sourcesContent":["function print(method: (...args: any[]) => void, ...args: any[]) {\n if (typeof args[0] === 'string') {\n const message = args.shift();\n method(`[wxt] ${message}`, ...args);\n } else {\n method('[wxt]', ...args);\n }\n}\n\n/**\n * Wrapper around `console` with a \"[wxt]\" prefix\n */\nexport const logger = {\n debug: (...args: any[]) => print(console.debug, ...args),\n log: (...args: any[]) => print(console.log, ...args),\n warn: (...args: any[]) => print(console.warn, ...args),\n error: (...args: any[]) => print(console.error, ...args),\n};\n","import { logger } from './logger';\n\ninterface WebSocketMessage {\n type: string;\n event: string;\n data?: any;\n}\n\n/**\n * Connect to the websocket and listen for messages.\n *\n * @param onMessage Optional callback that is called when a message is recieved and we've verified\n * it's structure is what we expect.\n */\nexport function setupWebSocket(\n onMessage?: (message: WebSocketMessage) => void,\n) {\n const serverUrl = `${__DEV_SERVER_PROTOCOL__}//${__DEV_SERVER_HOSTNAME__}:${__DEV_SERVER_PORT__}`;\n logger.debug('Connecting to dev server @', serverUrl);\n const ws = new WebSocket(serverUrl, 'vite-hmr');\n\n ws.addEventListener('open', () => {\n logger.debug('Connected to dev server');\n });\n ws.addEventListener('close', () => {\n logger.debug('Disconnected from dev server');\n });\n ws.addEventListener('error', (event) => {\n logger.error('Failed to connect to dev server', event);\n });\n\n ws.addEventListener('message', (e) => {\n try {\n const message = JSON.parse(e.data) as WebSocketMessage;\n if (message.type === 'custom' && message.event?.startsWith?.('wxt:')) {\n onMessage?.(message);\n }\n } catch (err) {\n logger.error('Failed to handle message', err);\n }\n });\n\n return ws;\n}\n","/// <reference types=\"vite/client\" />\n\nimport { logger } from '../utils/logger';\nimport { setupWebSocket } from '../utils/setupWebSocket';\n\nif (__COMMAND__ === 'serve') {\n try {\n setupWebSocket((message) => {\n if (message.event === 'wxt:reload-page') {\n // We need to remove the initial slash from the path to compare correctly\n // \"popup.html\" === \"/popup.html\".substring(1)\n if (message.data === location.pathname.substring(1)) {\n location.reload();\n }\n }\n });\n } catch (err) {\n logger.error('Failed to setup web socket connection with dev server', err);\n }\n}\n"],"mappings":";AAAA,SAAS,MAAM,WAAqC,MAAa;AAC/D,MAAI,OAAO,KAAK,CAAC,MAAM,UAAU;AAC/B,UAAM,UAAU,KAAK,MAAM;AAC3B,WAAO,SAAS,WAAW,GAAG,IAAI;AAAA,EACpC,OAAO;AACL,WAAO,SAAS,GAAG,IAAI;AAAA,EACzB;AACF;AAKO,IAAM,SAAS;AAAA,EACpB,OAAO,IAAI,SAAgB,MAAM,QAAQ,OAAO,GAAG,IAAI;AAAA,EACvD,KAAK,IAAI,SAAgB,MAAM,QAAQ,KAAK,GAAG,IAAI;AAAA,EACnD,MAAM,IAAI,SAAgB,MAAM,QAAQ,MAAM,GAAG,IAAI;AAAA,EACrD,OAAO,IAAI,SAAgB,MAAM,QAAQ,OAAO,GAAG,IAAI;AACzD;;;ACHO,SAAS,eACd,WACA;AACA,QAAM,YAAY,GAAG,4BAA4B,2BAA2B;AAC5E,SAAO,MAAM,8BAA8B,SAAS;AACpD,QAAM,KAAK,IAAI,UAAU,WAAW,UAAU;AAE9C,KAAG,iBAAiB,QAAQ,MAAM;AAChC,WAAO,MAAM,yBAAyB;AAAA,EACxC,CAAC;AACD,KAAG,iBAAiB,SAAS,MAAM;AACjC,WAAO,MAAM,8BAA8B;AAAA,EAC7C,CAAC;AACD,KAAG,iBAAiB,SAAS,CAAC,UAAU;AACtC,WAAO,MAAM,mCAAmC,KAAK;AAAA,EACvD,CAAC;AAED,KAAG,iBAAiB,WAAW,CAAC,MAAM;AACpC,QAAI;AACF,YAAM,UAAU,KAAK,MAAM,EAAE,IAAI;AACjC,UAAI,QAAQ,SAAS,YAAY,QAAQ,OAAO,aAAa,MAAM,GAAG;AACpE,oBAAY,OAAO;AAAA,MACrB;AAAA,IACF,SAAS,KAAP;AACA,aAAO,MAAM,4BAA4B,GAAG;AAAA,IAC9C;AAAA,EACF,CAAC;AAED,SAAO;AACT;;;ACtCA,IAAI,gBAAgB,SAAS;AAC3B,MAAI;AACF,mBAAe,CAAC,YAAY;AAC1B,UAAI,QAAQ,UAAU,mBAAmB;AAGvC,YAAI,QAAQ,SAAS,SAAS,SAAS,UAAU,CAAC,GAAG;AACnD,mBAAS,OAAO;AAAA,QAClB;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH,SAAS,KAAP;AACA,WAAO,MAAM,yDAAyD,GAAG;AAAA,EAC3E;AACF;","names":[]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "wxt",
3
3
  "type": "module",
4
- "version": "0.0.1",
4
+ "version": "0.1.0",
5
5
  "description": "Next gen framework for developing web extensions",
6
6
  "repository": {
7
7
  "type": "git",
@@ -22,10 +22,9 @@
22
22
  },
23
23
  "license": "MIT",
24
24
  "files": [
25
- "dist",
26
- "templates"
25
+ "dist"
27
26
  ],
28
- "bin": "dist/cli/index.cjs",
27
+ "bin": "dist/cli.cjs",
29
28
  "main": "./dist/index.cjs",
30
29
  "module": "./dist/index.js",
31
30
  "types": "./dist/index.d.ts",
@@ -36,12 +35,14 @@
36
35
  "types": "./dist/index.d.ts"
37
36
  },
38
37
  "./client": {
39
- "require": "./dist/client/index.cjs",
40
- "import": "./dist/client/index.js",
41
- "types": "./dist/client/index.d.ts"
38
+ "require": "./dist/client.cjs",
39
+ "import": "./dist/client.js",
40
+ "types": "./dist/client.d.ts"
42
41
  }
43
42
  },
44
43
  "dependencies": {
44
+ "@webext-core/match-patterns": "^1.0.1",
45
+ "async-mutex": "^0.4.0",
45
46
  "c12": "^1.4.2",
46
47
  "cac": "^6.7.14",
47
48
  "consola": "^3.1.0",
@@ -59,19 +60,23 @@
59
60
  "webextension-polyfill": "^0.10.0"
60
61
  },
61
62
  "devDependencies": {
63
+ "@faker-js/faker": "^8.0.2",
62
64
  "@types/fs-extra": "^11.0.1",
65
+ "@types/lodash.merge": "^4.6.7",
63
66
  "@types/node": "^20.3.1",
64
67
  "@types/picomatch": "^2.3.0",
65
68
  "@types/webextension-polyfill": "^0.10.0",
66
69
  "@vitest/coverage-v8": "^0.32.2",
70
+ "lodash.merge": "^4.6.2",
67
71
  "npm-run-all": "^4.1.5",
72
+ "ora": "^6.3.1",
68
73
  "prettier": "^2.8.8",
69
74
  "pretty-quick": "^3.1.3",
70
75
  "simple-git-hooks": "^2.8.1",
71
76
  "tsup": "^7.0.0",
72
77
  "tsx": "^3.12.7",
73
78
  "typescript": "^5.1.3",
74
- "vitest": "^0.32.2",
79
+ "vitest": "^0.32.4",
75
80
  "webextension-polyfill": "^0.10.0"
76
81
  },
77
82
  "peerDependencies": {
@@ -83,10 +88,7 @@
83
88
  },
84
89
  "scripts": {
85
90
  "wxt": "tsx src/cli/index.ts",
86
- "build": "run-s -s build:*",
87
- "build:js": "tsup src/index.ts --sourcemap --dts --format esm,cjs",
88
- "build:cli": "tsup src/cli/index.ts -d dist/cli --sourcemap",
89
- "build:client": "tsup src/client/index.ts -d dist/client --sourcemap --dts --format esm,cjs",
91
+ "build": "tsx scripts/build.ts",
90
92
  "format": "prettier --write .",
91
93
  "format:check": "prettier --write .",
92
94
  "compile": "tsc --noEmit",