tollkit-wallet 0.2.1 → 0.2.2
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/README.md +49 -2
- package/THIRD_PARTY_NOTICES.md +4 -0
- package/dist/actions.d.ts +34 -33
- package/dist/actions.js +5 -1
- package/dist/actions.js.map +1 -1
- package/dist/bridge.d.ts +148 -0
- package/dist/bridge.js +460 -0
- package/dist/bridge.js.map +1 -0
- package/dist/buy.d.ts +17 -0
- package/dist/buy.js +23 -0
- package/dist/buy.js.map +1 -0
- package/dist/cli.js +68 -2
- package/dist/cli.js.map +1 -1
- package/dist/dapp.d.ts +89 -0
- package/dist/dapp.js +505 -0
- package/dist/dapp.js.map +1 -0
- package/dist/dashboard.d.ts +2 -0
- package/dist/dashboard.js +145 -2
- package/dist/dashboard.js.map +1 -1
- package/dist/holdings.d.ts +92 -0
- package/dist/holdings.js +200 -0
- package/dist/holdings.js.map +1 -0
- package/dist/keystore.d.ts +58 -11
- package/dist/keystore.js +87 -11
- package/dist/keystore.js.map +1 -1
- package/dist/ledger.d.ts +1 -1
- package/dist/mcp.d.ts +1 -1
- package/dist/mcp.js +1 -1
- package/dist/netguard.d.ts +8 -0
- package/dist/netguard.js +44 -0
- package/dist/netguard.js.map +1 -0
- package/dist/paths.d.ts +1 -0
- package/dist/paths.js +1 -0
- package/dist/paths.js.map +1 -1
- package/dist/policy.d.ts +4 -4
- package/dist/rules.d.ts +4 -4
- package/dist/sell.d.ts +60 -0
- package/dist/sell.js +71 -0
- package/dist/sell.js.map +1 -0
- package/dist/stake.d.ts +84 -0
- package/dist/stake.js +158 -0
- package/dist/stake.js.map +1 -0
- package/dist/ui.js +306 -32
- package/dist/ui.js.map +1 -1
- package/dist/wallet.d.ts +57 -2
- package/dist/wallet.js +185 -4
- package/dist/wallet.js.map +1 -1
- package/extension/PRIVACY.md +19 -0
- package/extension/README.md +16 -0
- package/extension/background.js +88 -0
- package/extension/content.js +34 -0
- package/extension/icons/icon.svg +1 -0
- package/extension/icons/icon128.png +0 -0
- package/extension/icons/icon16.png +0 -0
- package/extension/icons/icon32.png +0 -0
- package/extension/icons/icon48.png +0 -0
- package/extension/inpage.js +129 -0
- package/extension/manifest.json +15 -0
- package/extension/popup.html +35 -0
- package/extension/popup.js +39 -0
- package/package.json +3 -2
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
// Tollkit Wallet provider, injected into pages. It holds no keys and no secrets: every call is
|
|
2
|
+
// passed to the Tollkit extension, which asks the Tollkit Wallet on this computer.
|
|
3
|
+
// Ethereum (Base and Ethereum): EIP-1193 provider, announced with EIP-6963 (and window.ethereum if no other wallet set it).
|
|
4
|
+
// Solana: registered with the Wallet Standard (wallet-standard:register-wallet / wallet-standard:app-ready).
|
|
5
|
+
(() => {
|
|
6
|
+
if (window.__tollkitWallet) return;
|
|
7
|
+
const TAG = "tollkit-wallet";
|
|
8
|
+
const ICON = "data:image/svg+xml;base64," + btoa('<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><rect x="1.5" y="1.5" width="97" height="97" rx="20" fill="#0a0a0a" stroke="#2f3442" stroke-width="3"/><path d="M42 22h12v16h16v11H54v17c0 4.5 2 6.5 6.5 6.5H70V83H59C48 83 42 77.5 42 67V49h-9V38h9z" fill="#4a8eff"/></svg>');
|
|
9
|
+
const pending = new Map();
|
|
10
|
+
let n = 0;
|
|
11
|
+
|
|
12
|
+
function call(method, params) {
|
|
13
|
+
return new Promise((resolve, reject) => {
|
|
14
|
+
const id = `${Date.now()}-${++n}-${Math.random().toString(36).slice(2)}`;
|
|
15
|
+
pending.set(id, { resolve, reject });
|
|
16
|
+
window.postMessage({ [TAG]: "req", id, method, params }, window.location.origin);
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
window.addEventListener("message", (e) => {
|
|
20
|
+
if (e.source !== window || !e.data || e.data[TAG] !== "res") return;
|
|
21
|
+
const p = pending.get(e.data.id);
|
|
22
|
+
if (!p) return;
|
|
23
|
+
pending.delete(e.data.id);
|
|
24
|
+
if (e.data.error) {
|
|
25
|
+
const err = new Error(e.data.error.message || "Tollkit error");
|
|
26
|
+
err.code = e.data.error.code;
|
|
27
|
+
p.reject(err);
|
|
28
|
+
} else p.resolve(e.data.result);
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
// ---- EIP-1193 ------------------------------------------------------------------------------
|
|
32
|
+
const listeners = {};
|
|
33
|
+
const emit = (ev, v) => (listeners[ev] || []).slice().forEach((f) => { try { f(v); } catch (x) { console.error(x); } });
|
|
34
|
+
let chainId = null, accounts = [];
|
|
35
|
+
const provider = {
|
|
36
|
+
isTollkit: true,
|
|
37
|
+
async request(args) {
|
|
38
|
+
if (!args || typeof args !== "object" || typeof args.method !== "string") { const e = new Error("request() needs { method, params }"); e.code = -32602; throw e; }
|
|
39
|
+
const { method, params } = args;
|
|
40
|
+
const result = await call(method, params);
|
|
41
|
+
if (method === "eth_chainId" && result !== chainId) { const first = chainId === null; chainId = result; if (!first) emit("chainChanged", result); }
|
|
42
|
+
if ((method === "wallet_switchEthereumChain" || method === "wallet_addEthereumChain") && result === null) {
|
|
43
|
+
const next = String(params && params[0] && params[0].chainId).toLowerCase();
|
|
44
|
+
if (next !== chainId) { chainId = next; emit("chainChanged", next); }
|
|
45
|
+
}
|
|
46
|
+
if (method === "eth_requestAccounts" || method === "eth_accounts") {
|
|
47
|
+
const a = Array.isArray(result) ? result.map((x) => String(x).toLowerCase()) : [];
|
|
48
|
+
if (a.join() !== accounts.join()) { const wasEmpty = !accounts.length; accounts = a; if (wasEmpty && a.length) emit("connect", { chainId: chainId || (await call("eth_chainId")) }); emit("accountsChanged", a); }
|
|
49
|
+
}
|
|
50
|
+
if (method === "wallet_revokePermissions") { accounts = []; emit("accountsChanged", []); }
|
|
51
|
+
return result;
|
|
52
|
+
},
|
|
53
|
+
on(ev, f) { (listeners[ev] = listeners[ev] || []).push(f); return provider; },
|
|
54
|
+
removeListener(ev, f) { listeners[ev] = (listeners[ev] || []).filter((x) => x !== f); return provider; },
|
|
55
|
+
off(ev, f) { return provider.removeListener(ev, f); },
|
|
56
|
+
// Older apps
|
|
57
|
+
enable() { return provider.request({ method: "eth_requestAccounts" }); },
|
|
58
|
+
};
|
|
59
|
+
Object.freeze(provider);
|
|
60
|
+
const info = Object.freeze({ uuid: crypto.randomUUID(), name: "Tollkit", icon: ICON, rdns: "dev.tollkit" });
|
|
61
|
+
const announce = () => window.dispatchEvent(new CustomEvent("eip6963:announceProvider", { detail: Object.freeze({ info, provider }) }));
|
|
62
|
+
window.addEventListener("eip6963:requestProvider", announce);
|
|
63
|
+
announce();
|
|
64
|
+
if (!("ethereum" in window)) { try { Object.defineProperty(window, "ethereum", { value: provider, configurable: true, writable: false }); } catch { /* another wallet won */ } }
|
|
65
|
+
|
|
66
|
+
// ---- Solana Wallet Standard -----------------------------------------------------------------
|
|
67
|
+
const b64 = (u8) => { let s = ""; for (let i = 0; i < u8.length; i++) s += String.fromCharCode(u8[i]); return btoa(s); };
|
|
68
|
+
const unb64 = (s) => Uint8Array.from(atob(s), (c) => c.charCodeAt(0));
|
|
69
|
+
const CHAINS = ["solana:mainnet"];
|
|
70
|
+
const SOL_FEATURES = ["solana:signAndSendTransaction", "solana:signTransaction", "solana:signMessage"];
|
|
71
|
+
let solAccounts = [];
|
|
72
|
+
const solListeners = new Set();
|
|
73
|
+
const changed = () => solListeners.forEach((f) => { try { f({ accounts: solAccounts }); } catch (x) { console.error(x); } });
|
|
74
|
+
const makeAccount = (r) => Object.freeze({ address: r.address, publicKey: unb64(r.publicKey), chains: CHAINS, features: SOL_FEATURES, label: "Tollkit", icon: ICON });
|
|
75
|
+
const mine = (acct) => { if (!acct || !solAccounts.some((a) => a.address === acct.address)) { const e = new Error("Connect this site to Tollkit first."); e.code = 4100; throw e; } };
|
|
76
|
+
const wallet = {
|
|
77
|
+
get version() { return "1.0.0"; },
|
|
78
|
+
get name() { return "Tollkit"; },
|
|
79
|
+
get icon() { return ICON; },
|
|
80
|
+
get chains() { return CHAINS.slice(); },
|
|
81
|
+
get accounts() { return solAccounts.slice(); },
|
|
82
|
+
get features() {
|
|
83
|
+
return {
|
|
84
|
+
"standard:connect": { version: "1.0.0", connect: async (input) => {
|
|
85
|
+
const r = await call("sol_connect", { silent: !!(input && input.silent) });
|
|
86
|
+
solAccounts = [makeAccount(r)]; changed();
|
|
87
|
+
return { accounts: solAccounts.slice() };
|
|
88
|
+
} },
|
|
89
|
+
"standard:disconnect": { version: "1.0.0", disconnect: async () => { await call("sol_disconnect"); solAccounts = []; changed(); } },
|
|
90
|
+
"standard:events": { version: "1.0.0", on: (ev, f) => { if (ev !== "change") return () => {}; solListeners.add(f); return () => solListeners.delete(f); } },
|
|
91
|
+
"solana:signTransaction": { version: "1.0.0", supportedTransactionVersions: ["legacy", 0], signTransaction: async (...inputs) => {
|
|
92
|
+
const out = [];
|
|
93
|
+
for (const i of inputs) { mine(i.account); const r = await call("sol_signTransaction", { transaction: b64(i.transaction) }); out.push({ signedTransaction: unb64(r.signedTransaction) }); }
|
|
94
|
+
return out;
|
|
95
|
+
} },
|
|
96
|
+
"solana:signAndSendTransaction": { version: "1.0.0", supportedTransactionVersions: ["legacy", 0], signAndSendTransaction: async (...inputs) => {
|
|
97
|
+
const out = [];
|
|
98
|
+
for (const i of inputs) {
|
|
99
|
+
mine(i.account);
|
|
100
|
+
if (i.chain && i.chain !== "solana:mainnet") { const e = new Error("Tollkit works on Solana mainnet only."); e.code = 4901; throw e; }
|
|
101
|
+
const r = await call("sol_signAndSendTransaction", { transaction: b64(i.transaction), options: i.options ? { skipPreflight: !!i.options.skipPreflight } : undefined });
|
|
102
|
+
out.push({ signature: unb64(r.signature) });
|
|
103
|
+
}
|
|
104
|
+
return out;
|
|
105
|
+
} },
|
|
106
|
+
"solana:signMessage": { version: "1.0.0", signMessage: async (...inputs) => {
|
|
107
|
+
const out = [];
|
|
108
|
+
for (const i of inputs) { mine(i.account); const r = await call("sol_signMessage", { message: b64(i.message) }); out.push({ signedMessage: i.message, signature: unb64(r.signature), signatureType: "ed25519" }); }
|
|
109
|
+
return out;
|
|
110
|
+
} },
|
|
111
|
+
};
|
|
112
|
+
},
|
|
113
|
+
};
|
|
114
|
+
// Same registration as @wallet-standard/wallet's registerWallet (Apache-2.0).
|
|
115
|
+
const callback = ({ register }) => register(wallet);
|
|
116
|
+
class RegisterWalletEvent extends Event {
|
|
117
|
+
#detail;
|
|
118
|
+
get detail() { return this.#detail; }
|
|
119
|
+
get type() { return "wallet-standard:register-wallet"; }
|
|
120
|
+
constructor(cb) { super("wallet-standard:register-wallet", { bubbles: false, cancelable: false, composed: false }); this.#detail = cb; }
|
|
121
|
+
preventDefault() { throw new Error("preventDefault cannot be called"); }
|
|
122
|
+
stopImmediatePropagation() { throw new Error("stopImmediatePropagation cannot be called"); }
|
|
123
|
+
stopPropagation() { throw new Error("stopPropagation cannot be called"); }
|
|
124
|
+
}
|
|
125
|
+
try { window.dispatchEvent(new RegisterWalletEvent(callback)); } catch (x) { console.error("wallet-standard:register-wallet event could not be dispatched", x); }
|
|
126
|
+
try { window.addEventListener("wallet-standard:app-ready", ({ detail: api }) => callback(api)); } catch (x) { console.error(x); }
|
|
127
|
+
|
|
128
|
+
Object.defineProperty(window, "__tollkitWallet", { value: true });
|
|
129
|
+
})();
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"manifest_version": 3,
|
|
3
|
+
"name": "Tollkit Wallet",
|
|
4
|
+
"version": "0.1.0",
|
|
5
|
+
"description": "Connect websites to the Tollkit Wallet on this computer. Keys stay in Tollkit, and you approve every request there.",
|
|
6
|
+
"icons": { "16": "icons/icon16.png", "32": "icons/icon32.png", "48": "icons/icon48.png", "128": "icons/icon128.png" },
|
|
7
|
+
"action": { "default_popup": "popup.html", "default_title": "Tollkit Wallet", "default_icon": { "16": "icons/icon16.png", "32": "icons/icon32.png" } },
|
|
8
|
+
"background": { "service_worker": "background.js" },
|
|
9
|
+
"permissions": ["storage"],
|
|
10
|
+
"host_permissions": ["http://127.0.0.1/*"],
|
|
11
|
+
"content_scripts": [
|
|
12
|
+
{ "matches": ["https://*/*", "http://localhost/*"], "js": ["inpage.js"], "run_at": "document_start", "world": "MAIN" },
|
|
13
|
+
{ "matches": ["https://*/*", "http://localhost/*"], "js": ["content.js"], "run_at": "document_start" }
|
|
14
|
+
]
|
|
15
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html>
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width,initial-scale=1">
|
|
6
|
+
<title>Tollkit Wallet</title>
|
|
7
|
+
<style>
|
|
8
|
+
:root{--bg:#0e1015;--card:#171a21;--surf:#1f232c;--line:#2a2f3a;--tx:#e8eaf0;--mut:#9aa1b2;--acc:#4a8eff;--acc2:#2f6bff;--ok:#2fd27a;--bad:#ff6b6b}
|
|
9
|
+
@media (prefers-color-scheme: light){:root{--bg:#f4f5f8;--card:#fff;--surf:#f1f2f6;--line:#e2e5ec;--tx:#141821;--mut:#5d6474;--ok:#14a05a;--bad:#d93c3c}}
|
|
10
|
+
*{box-sizing:border-box}
|
|
11
|
+
body{margin:0;width:340px;background:var(--bg);color:var(--tx);font:14px/1.45 system-ui,-apple-system,"Segoe UI",sans-serif}
|
|
12
|
+
header{display:flex;align-items:center;gap:10px;padding:14px 16px;border-bottom:1px solid var(--line);background:var(--card)}
|
|
13
|
+
header img{width:28px;height:28px}
|
|
14
|
+
header b{font:700 15px ui-monospace,SFMono-Regular,Menlo,monospace}header b span{color:var(--acc)}
|
|
15
|
+
main{padding:14px 16px 16px}
|
|
16
|
+
p{margin:0 0 10px;color:var(--mut)}
|
|
17
|
+
ol{margin:0 0 12px;padding-left:18px;color:var(--mut)}ol li{margin:3px 0}
|
|
18
|
+
input{width:100%;padding:10px;border-radius:10px;border:1px solid var(--line);background:var(--surf);color:var(--tx);font:15px ui-monospace,Menlo,monospace;letter-spacing:.04em}
|
|
19
|
+
input:focus{outline:2px solid var(--acc);border-color:transparent}
|
|
20
|
+
button{width:100%;margin-top:10px;padding:10px;border:0;border-radius:10px;background:var(--acc2);color:#fff;font:600 14px system-ui,sans-serif;cursor:pointer}
|
|
21
|
+
button.g{background:var(--surf);color:var(--tx)}
|
|
22
|
+
.row{display:flex;align-items:center;gap:8px;padding:9px 11px;background:var(--surf);border-radius:10px;margin-top:8px}
|
|
23
|
+
.row small{display:block;color:var(--mut);font-size:11.5px}
|
|
24
|
+
.addr{font:12px ui-monospace,Menlo,monospace;word-break:break-all}
|
|
25
|
+
.msg{margin-top:10px;padding:8px 10px;border-radius:9px;background:var(--surf);font-size:13px}.err{color:var(--bad)}.okc{color:var(--ok)}
|
|
26
|
+
.dot{width:8px;height:8px;border-radius:50%;background:var(--ok);flex:none}.dot.off{background:var(--bad)}
|
|
27
|
+
h4{margin:14px 0 2px;font-size:11px;letter-spacing:.06em;text-transform:uppercase;color:var(--mut)}
|
|
28
|
+
</style>
|
|
29
|
+
</head>
|
|
30
|
+
<body>
|
|
31
|
+
<header><img src="icons/icon48.png" alt=""><b>Toll<span>kit</span></b></header>
|
|
32
|
+
<main id="main"><p>Loading…</p></main>
|
|
33
|
+
<script src="popup.js"></script>
|
|
34
|
+
</body>
|
|
35
|
+
</html>
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
const main = document.getElementById("main");
|
|
2
|
+
const esc = (s) => String(s ?? "").replace(/[&<>"']/g, (c) => ({ "&": "&", "<": "<", ">": ">", '"': """, "'": "'" }[c]));
|
|
3
|
+
const ask = (m) => new Promise((r) => chrome.runtime.sendMessage(m, r));
|
|
4
|
+
const short = (a) => (a && a.length > 14 ? a.slice(0, 6) + "…" + a.slice(-4) : a || "");
|
|
5
|
+
|
|
6
|
+
function pairView(err) {
|
|
7
|
+
main.innerHTML = `<p>Connect this browser to the Tollkit Wallet on this computer.</p>
|
|
8
|
+
<ol><li>Start Tollkit: <b>tollkit-wallet ui</b></li><li>In Tollkit, open <b>Settings</b> and click <b>Pair a browser</b>.</li><li>Paste the code here.</li></ol>
|
|
9
|
+
<input id="code" placeholder="7420-AB12-CD34" autocomplete="off" spellcheck="false">
|
|
10
|
+
<button id="go">Pair</button>${err ? `<div class="msg err">${esc(err)}</div>` : ""}`;
|
|
11
|
+
const go = async () => {
|
|
12
|
+
const b = document.getElementById("go"); b.disabled = true; b.textContent = "Pairing…";
|
|
13
|
+
const r = await ask({ type: "pair", code: document.getElementById("code").value });
|
|
14
|
+
if (r && r.ok) render(); else pairView((r && r.error) || "Pairing failed.");
|
|
15
|
+
};
|
|
16
|
+
document.getElementById("go").onclick = go;
|
|
17
|
+
document.getElementById("code").onkeydown = (e) => { if (e.key === "Enter") go(); };
|
|
18
|
+
document.getElementById("code").focus();
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
async function render() {
|
|
22
|
+
const s = await ask({ type: "state" });
|
|
23
|
+
if (!s || !s.paired) return pairView();
|
|
24
|
+
if (s.error) {
|
|
25
|
+
main.innerHTML = `<div class="row"><span class="dot off"></span><div>Tollkit isn't answering<small>${esc(s.error)}</small></div></div>
|
|
26
|
+
<p style="margin-top:10px">Start it with <b>tollkit-wallet ui</b>, then reopen this.</p><button class="g" id="un">Unpair this browser</button>`;
|
|
27
|
+
} else {
|
|
28
|
+
const sites = (s.sites || []).map((x) => `<div class="row"><div style="min-width:0"><div>${esc(new URL(x.origin).host)}</div><small>${[x.evm ? "Base/Ethereum" : "", x.solana ? "Solana" : ""].filter(Boolean).join(" + ")}</small></div></div>`).join("");
|
|
29
|
+
main.innerHTML = `<div class="row"><span class="dot"></span><div>Connected to Tollkit<small>127.0.0.1:${esc(s.port)}</small></div></div>
|
|
30
|
+
<h4>Your addresses</h4>
|
|
31
|
+
<div class="row"><div style="min-width:0"><small>Base / Ethereum</small><div class="addr" title="${esc(s.evm)}">${esc(short(s.evm))}</div></div></div>
|
|
32
|
+
<div class="row"><div style="min-width:0"><small>Solana</small><div class="addr" title="${esc(s.solana)}">${esc(short(s.solana))}</div></div></div>
|
|
33
|
+
<h4>Connected sites</h4>${sites || `<p style="margin-top:6px">None yet. When a site asks to connect, approve it in Tollkit's Approvals tab.</p>`}
|
|
34
|
+
<p style="margin-top:12px">Every connect, signature and transaction waits for your OK in Tollkit. Manage sites in Tollkit's Settings.</p>
|
|
35
|
+
<button class="g" id="un">Unpair this browser</button>`;
|
|
36
|
+
}
|
|
37
|
+
document.getElementById("un").onclick = async () => { await ask({ type: "unpair" }); pairView(); };
|
|
38
|
+
}
|
|
39
|
+
render();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "tollkit-wallet",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.2",
|
|
4
4
|
"description": "Non-custodial wallet for AI trading agents: swaps on Base, Ethereum and Solana, x402 and MPP payments, budgets that hold, Telegram approvals, receipts.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
},
|
|
12
12
|
"scripts": {
|
|
13
13
|
"typecheck": "tsc --noEmit",
|
|
14
|
-
"test": "npm run typecheck && tsx test/run.ts && tsx test/pay.test.ts && tsx test/wallet.test.ts && tsx test/send.test.ts && tsx test/dashboard.test.ts && tsx test/plugins.test.ts && tsx test/watch.test.ts && tsx test/prices.test.ts && tsx test/autopilot.test.ts && tsx test/connect.test.ts && tsx test/ai.test.ts",
|
|
14
|
+
"test": "npm run typecheck && tsx test/run.ts && tsx test/pay.test.ts && tsx test/wallet.test.ts && tsx test/send.test.ts && tsx test/dashboard.test.ts && tsx test/plugins.test.ts && tsx test/watch.test.ts && tsx test/prices.test.ts && tsx test/autopilot.test.ts && tsx test/connect.test.ts && tsx test/ai.test.ts && tsx test/backup.test.ts && tsx test/holdings.test.ts && tsx test/buy.test.ts && tsx test/stake.test.ts && tsx test/bridge.test.ts && tsx test/sell.test.ts && tsx test/dapp.test.ts",
|
|
15
15
|
"build": "tsc -p tsconfig.build.json",
|
|
16
16
|
"prepublishOnly": "npm test && npm run build"
|
|
17
17
|
},
|
|
@@ -57,6 +57,7 @@
|
|
|
57
57
|
},
|
|
58
58
|
"files": [
|
|
59
59
|
"dist",
|
|
60
|
+
"extension",
|
|
60
61
|
"README.md",
|
|
61
62
|
"LICENSE",
|
|
62
63
|
"THIRD_PARTY_NOTICES.md"
|