planche 0.7.16 → 0.7.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.
- package/app/assets/{AboutDialog-CnvspLjT.js → AboutDialog-znljyQnx.js} +1 -1
- package/app/assets/{ConnectDialog-dYIs3EdM.js → ConnectDialog-Bxe0mP_e.js} +1 -1
- package/app/assets/{CopyDatabaseDialog-DoyT3Cud.js → CopyDatabaseDialog-N5QtFoaJ.js} +1 -1
- package/app/assets/{CopyTableDialog-CE32sy8Y.js → CopyTableDialog-DU3m9hM4.js} +1 -1
- package/app/assets/{CreateDatabaseDialog-g7Ex6Ira.js → CreateDatabaseDialog-CoEVJ90U.js} +1 -1
- package/app/assets/{CreateSchemaDialog-CS_3p1YF.js → CreateSchemaDialog-bxvZ9P5c.js} +1 -1
- package/app/assets/{DataDiffDialog-eK_rqQqW.js → DataDiffDialog-nKX0ACC-.js} +1 -1
- package/app/assets/{DownloadToCSVDialog-BZMBDq9a.js → DownloadToCSVDialog-DdUo0ORh.js} +1 -1
- package/app/assets/{EditSchemaDialog-TPU9HsbU.js → EditSchemaDialog-BaQy8PKH.js} +1 -1
- package/app/assets/{FindReplaceDialog-DQwlbxSb.js → FindReplaceDialog-D5ZYGSHY.js} +1 -1
- package/app/assets/{FlushDialog-SyF5aOC9.js → FlushDialog-CSS8dkGi.js} +1 -1
- package/app/assets/{LinkColumnDialog-CroawG1F.js → LinkColumnDialog-BsalpSZc.js} +1 -1
- package/app/assets/{LocalHistoryDialog-D0hZ8QS5.js → LocalHistoryDialog-BMrQIB_G.js} +1 -1
- package/app/assets/{ProcessListDialog-BRAf5TE2.js → ProcessListDialog-DG4Dx5g0.js} +1 -1
- package/app/assets/{QuickCommandPalette-Dh1fsO1J.js → QuickCommandPalette-B3pggSef.js} +1 -1
- package/app/assets/{RowFormDialog-DICM-X2S.js → RowFormDialog-DANBt29z.js} +1 -1
- package/app/assets/{SafetySettingsDialog-dM0fuFsY.js → SafetySettingsDialog-BTw7pePV.js} +1 -1
- package/app/assets/{SchemaDiffDialog-CKV8hg4W.js → SchemaDiffDialog-fdaV0PYL.js} +1 -1
- package/app/assets/{SchemaToHTMLDialog-2rZVoLkj.js → SchemaToHTMLDialog-C6G-jwAb.js} +1 -1
- package/app/assets/{StatusDialog-DDSLt40C.js → StatusDialog-B3olF444.js} +1 -1
- package/app/assets/{UserAddDialog-1faiXqe2.js → UserAddDialog-BF-VlG8X.js} +1 -1
- package/app/assets/{UserManagerDialog-BFTsCX59.js → UserManagerDialog-B9oy1ki3.js} +1 -1
- package/app/assets/{VariablesDialog-DjvvwrfV.js → VariablesDialog-kv9FBrEY.js} +1 -1
- package/app/assets/database-DGumofGk.js +1 -0
- package/app/assets/{de-DNOmZt4L.js → de-BCxLqtYG.js} +1 -1
- package/app/assets/{fr-Bs9HybVR.js → fr-BFM0dzUF.js} +1 -1
- package/app/assets/{i18n-XcmivDWI.js → i18n-Bq2RK9_J.js} +2 -2
- package/app/assets/{ja-DLbyFRJv.js → ja-ChGb_KdX.js} +1 -1
- package/app/assets/{ko-BOX3JDDY.js → ko-BDq66jka.js} +1 -1
- package/app/assets/{main-DLYTmffu.js → main-D39M4PeA.js} +3 -3
- package/app/assets/pro-usage-CymO6bdA.js +1 -0
- package/app/assets/{query-execution-DMUlIoF2.js → query-execution-K2AH0M79.js} +3 -3
- package/app/assets/{select-BMtc6vRo.js → select-DwXB_ZKA.js} +1 -1
- package/app/assets/{table-copy-6G1mhU8O.js → table-copy-CclNaq6-.js} +1 -1
- package/app/assets/{zh-Bc_dasqF.js → zh-C4cAyvNo.js} +1 -1
- package/app/index.html +6 -6
- package/dist/index.js +68 -9
- package/package.json +1 -1
- package/app/assets/database-_lr1w6xK.js +0 -1
- package/app/assets/pro-usage-Die_FxwH.js +0 -1
package/dist/index.js
CHANGED
|
@@ -962,6 +962,16 @@ var D1Driver = class {
|
|
|
962
962
|
headers;
|
|
963
963
|
/** Declared column types per table, for result-source resolution. */
|
|
964
964
|
columns = /* @__PURE__ */ new Map();
|
|
965
|
+
/**
|
|
966
|
+
* D1 is a REST call, not a session: there is no cancel to send, so stopping
|
|
967
|
+
* means dropping the request the agent is waiting on. The query may still
|
|
968
|
+
* finish at Cloudflare, which is why this is `abandon` and not `kill`.
|
|
969
|
+
*/
|
|
970
|
+
cancelKind = "abandon";
|
|
971
|
+
inFlight = null;
|
|
972
|
+
async cancel() {
|
|
973
|
+
this.inFlight?.abort();
|
|
974
|
+
}
|
|
965
975
|
constructor(config) {
|
|
966
976
|
this.label = `d1:${config.databaseId}`;
|
|
967
977
|
this.url = `${API}/accounts/${encodeURIComponent(config.accountId)}/d1/database/${encodeURIComponent(config.databaseId)}/raw`;
|
|
@@ -970,8 +980,22 @@ var D1Driver = class {
|
|
|
970
980
|
async raw(sql2) {
|
|
971
981
|
let res;
|
|
972
982
|
try {
|
|
973
|
-
|
|
983
|
+
const controller = new AbortController();
|
|
984
|
+
this.inFlight = controller;
|
|
985
|
+
try {
|
|
986
|
+
res = await fetch(this.url, {
|
|
987
|
+
method: "POST",
|
|
988
|
+
headers: this.headers,
|
|
989
|
+
body: JSON.stringify({ sql: sql2 }),
|
|
990
|
+
signal: AbortSignal.any([controller.signal, AbortSignal.timeout(6e4)])
|
|
991
|
+
});
|
|
992
|
+
} finally {
|
|
993
|
+
if (this.inFlight === controller) this.inFlight = null;
|
|
994
|
+
}
|
|
974
995
|
} catch (err) {
|
|
996
|
+
if (err instanceof Error && err.name === "AbortError") {
|
|
997
|
+
throw new D1Error("Stopped waiting for D1; the query may still finish at Cloudflare.", 400);
|
|
998
|
+
}
|
|
975
999
|
throw new D1Error(`Cannot reach the Cloudflare API: ${err instanceof Error ? err.message : String(err)}`, 400);
|
|
976
1000
|
}
|
|
977
1001
|
let body = null;
|
|
@@ -1196,11 +1220,15 @@ function routeStatement(sql2, known) {
|
|
|
1196
1220
|
}
|
|
1197
1221
|
return { sql: out, target };
|
|
1198
1222
|
}
|
|
1199
|
-
async function fetchJson(url, init, unreachable) {
|
|
1223
|
+
async function fetchJson(url, init, unreachable, abort) {
|
|
1200
1224
|
let res;
|
|
1201
1225
|
try {
|
|
1202
|
-
|
|
1226
|
+
const signal = abort ? AbortSignal.any([abort, AbortSignal.timeout(6e4)]) : AbortSignal.timeout(6e4);
|
|
1227
|
+
res = await fetch(url, { ...init, signal });
|
|
1203
1228
|
} catch (err) {
|
|
1229
|
+
if (err instanceof Error && err.name === "AbortError" && abort?.aborted) {
|
|
1230
|
+
throw new DoError("Stopped waiting for the request; the query may still finish.", 400);
|
|
1231
|
+
}
|
|
1204
1232
|
throw unreachable(err instanceof Error ? err.message : String(err));
|
|
1205
1233
|
}
|
|
1206
1234
|
let body = null;
|
|
@@ -1213,6 +1241,16 @@ async function fetchJson(url, init, unreachable) {
|
|
|
1213
1241
|
var LocalTransport = class {
|
|
1214
1242
|
label;
|
|
1215
1243
|
base;
|
|
1244
|
+
/** The request being waited on, so a stop can drop it. */
|
|
1245
|
+
inFlight = null;
|
|
1246
|
+
abort() {
|
|
1247
|
+
this.inFlight?.abort();
|
|
1248
|
+
}
|
|
1249
|
+
/** Signal for the next request; replaces whatever was tracked before. */
|
|
1250
|
+
track() {
|
|
1251
|
+
this.inFlight = new AbortController();
|
|
1252
|
+
return this.inFlight.signal;
|
|
1253
|
+
}
|
|
1216
1254
|
constructor(devUrl) {
|
|
1217
1255
|
this.label = `do:${devUrl}`;
|
|
1218
1256
|
this.base = `${devUrl.replace(/\/+$/, "")}${LOCAL_EXPLORER}`;
|
|
@@ -1229,7 +1267,8 @@ var LocalTransport = class {
|
|
|
1229
1267
|
(reason) => new DoError(
|
|
1230
1268
|
`Cannot reach a wrangler dev server at ${origin} (${reason}). Run \`wrangler dev\` in your Worker project and try again.`,
|
|
1231
1269
|
400
|
|
1232
|
-
)
|
|
1270
|
+
),
|
|
1271
|
+
this.track()
|
|
1233
1272
|
);
|
|
1234
1273
|
const envelope = parsed && typeof parsed.success === "boolean" && (parsed.result !== void 0 || Array.isArray(parsed.errors)) ? parsed : null;
|
|
1235
1274
|
if (!envelope) {
|
|
@@ -1265,6 +1304,16 @@ var LocalTransport = class {
|
|
|
1265
1304
|
var RemoteTransport = class {
|
|
1266
1305
|
label;
|
|
1267
1306
|
base;
|
|
1307
|
+
/** The request being waited on, so a stop can drop it. */
|
|
1308
|
+
inFlight = null;
|
|
1309
|
+
abort() {
|
|
1310
|
+
this.inFlight?.abort();
|
|
1311
|
+
}
|
|
1312
|
+
/** Signal for the next request; replaces whatever was tracked before. */
|
|
1313
|
+
track() {
|
|
1314
|
+
this.inFlight = new AbortController();
|
|
1315
|
+
return this.inFlight.signal;
|
|
1316
|
+
}
|
|
1268
1317
|
headers;
|
|
1269
1318
|
only;
|
|
1270
1319
|
constructor(config) {
|
|
@@ -1281,7 +1330,8 @@ var RemoteTransport = class {
|
|
|
1281
1330
|
headers: this.headers,
|
|
1282
1331
|
body: body === void 0 ? void 0 : JSON.stringify(body)
|
|
1283
1332
|
},
|
|
1284
|
-
(reason) => new DoError(`Cannot reach the Cloudflare API: ${reason}`, 400)
|
|
1333
|
+
(reason) => new DoError(`Cannot reach the Cloudflare API: ${reason}`, 400),
|
|
1334
|
+
this.track()
|
|
1285
1335
|
);
|
|
1286
1336
|
if (res.status === 401 || res.status === 403) {
|
|
1287
1337
|
throw new DoError(
|
|
@@ -1356,6 +1406,14 @@ var DoDriver = class {
|
|
|
1356
1406
|
targets = /* @__PURE__ */ new Map();
|
|
1357
1407
|
/** Declared column types per `database table`, for result-source resolution. */
|
|
1358
1408
|
columns = /* @__PURE__ */ new Map();
|
|
1409
|
+
/**
|
|
1410
|
+
* These are HTTP calls, not sessions: there is nothing to cancel upstream, so
|
|
1411
|
+
* stopping drops the request the agent waits on. `abandon`, not `kill`.
|
|
1412
|
+
*/
|
|
1413
|
+
cancelKind = "abandon";
|
|
1414
|
+
async cancel() {
|
|
1415
|
+
this.transport.abort();
|
|
1416
|
+
}
|
|
1359
1417
|
/**
|
|
1360
1418
|
* Every object of every SQLite-backed namespace, as app-level database
|
|
1361
1419
|
* names. Locally, a `wrangler dev` session registers itself in wrangler's
|
|
@@ -2657,9 +2715,9 @@ var ConnectionManager = class {
|
|
|
2657
2715
|
async cancel(connectionId) {
|
|
2658
2716
|
const driver = this.connections.get(connectionId);
|
|
2659
2717
|
if (!driver) throw new Error(`Connection not found: ${connectionId}`);
|
|
2660
|
-
if (!driver.cancel) return false;
|
|
2718
|
+
if (!driver.cancel) return { cancelled: false, abandoned: false };
|
|
2661
2719
|
await driver.cancel();
|
|
2662
|
-
return true;
|
|
2720
|
+
return { cancelled: true, abandoned: driver.cancelKind === "abandon" };
|
|
2663
2721
|
}
|
|
2664
2722
|
/**
|
|
2665
2723
|
* Close and remove a connection.
|
|
@@ -2971,11 +3029,12 @@ function createAgent(options) {
|
|
|
2971
3029
|
fail(res, 400, "connectionId is required");
|
|
2972
3030
|
return;
|
|
2973
3031
|
}
|
|
2974
|
-
const cancelled = await manager.cancel(connectionId);
|
|
3032
|
+
const { cancelled, abandoned } = await manager.cancel(connectionId);
|
|
2975
3033
|
const body = {
|
|
2976
3034
|
success: true,
|
|
2977
3035
|
cancelled,
|
|
2978
|
-
|
|
3036
|
+
abandoned,
|
|
3037
|
+
message: !cancelled ? "This engine cannot interrupt a running statement" : abandoned ? "Stopped waiting for the request; the query may still finish upstream" : "Cancel sent"
|
|
2979
3038
|
};
|
|
2980
3039
|
res.json(body);
|
|
2981
3040
|
} catch (err) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "planche",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.17",
|
|
4
4
|
"description": "Local agent for Planche — lets the browser-based Planche SQL client reach MySQL/MariaDB/PostgreSQL/SQLite/SQL Server/Oracle/Neon/Supabase/Cloudflare D1 databases and local Durable Object storage from your machine.",
|
|
5
5
|
"license": "SEE LICENSE IN LICENSE",
|
|
6
6
|
"homepage": "https://planche.dev",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{c as e,n as t,r as n}from"./ui-store-DfspmPOn.js";import{a as r,i}from"./i18n-XcmivDWI.js";import{i as a,n as o,r as s,t as c}from"./app-storage-C_1RLCyI.js";import{t as l}from"./connection-store-DjSajhjh.js";import{n as u}from"./query-store-Bz1pmp4E.js";import{t as d}from"./hmr-singleton-Bit0Kfog.js";var f=new Set([`neon`,`supabase`]);function p(e){return e===`postgres`||f.has(e)}var ee=`_rowid_`,te=`http://127.0.0.1:8888`,m=d(`tunnelAgent`,()=>({url:null,token:null}));function ne(e){m.url=e.url?.replace(/\/+$/,``)||null,m.token=e.token?.trim()||null}var re=new Set([`127.0.0.1`,`localhost`,`[::1]`,`::1`]);function ie(e){try{let t=new URL(e);return(t.protocol===`http:`||t.protocol===`https:`)&&re.has(t.hostname)}catch{return!1}}function ae(e){try{return typeof window<`u`&&new URL(e).origin===window.location.origin}catch{return!1}}function oe(e){return ie(e)||ae(e)}function se(){return m.url!==null&&m.url!==`/api`&&!oe(m.url)}function h(){return m.url??te}function ce(){let e=h();return e===`/api`?r.t(`services.agent.devProxyUrl`,{url:`http://localhost:8888`}):e}async function le(){let e=ce(),t;try{let e={};m.token&&(e.Authorization=`Bearer ${m.token}`),t=await(await fetch(`${h()}/health`,{cache:`no-store`,headers:e})).json()}catch(t){return{state:`offline`,url:e,message:t instanceof Error?t.message:String(t)}}return t.name!==`planche`||typeof t.version!=`string`||!/^[\w.+-]{1,32}$/.test(t.version)?{state:`offline`,url:e,message:r.t(`services.agent.notPlanche`)}:t.protocolVersion===2?t.authorized===!1||m.token===null&&t.authorized===void 0?{state:`unauthorized`,url:e,version:t.version}:{state:`online`,url:e,version:t.version,activeConnections:t.activeConnections??0,...t.gateway?{gateway:t.gateway}:{}}:{state:`outdated`,url:e,version:t.version,protocolVersion:t.protocolVersion??0,install:t.install===`standalone`?`standalone`:`npx`}}async function ue(){let e=await fetch(`${h()}/profiles`,{cache:`no-store`,headers:y()}),t=await e.json().catch(()=>null);if(!e.ok||!t||t.success!==!0)throw new b(t?.message??r.t(`services.agent.httpError`,{status:e.status,statusText:e.statusText}),e.status);return t}function g(e){let t=e.ssh;if(t?.enabled)return{host:t.host,port:t.port,user:t.user,auth:t.auth,password:t.auth===`password`?t.password??``:void 0,privateKey:t.auth===`key`?t.privateKey:void 0,passphrase:t.auth===`key`&&t.passphrase||void 0}}function _(e){return e.gatewayProfile?{profile:e.gatewayProfile}:e.dbms===`sqlite`?{driver:`sqlite`,file:e.file??``,createIfMissing:e.createIfMissing??!1,readonly:e.readOnly??!1}:e.dbms===`do`?{driver:`do`,devUrl:e.devUrl??``}:e.dbms===`d1`?{driver:`d1`,accountId:e.accountId??``,databaseId:e.databaseId??``,apiToken:e.pass}:e.dbms===`postgres`?{driver:`postgres`,host:e.host,port:e.port,user:e.user,password:e.pass,database:e.database||`postgres`,ssl:e.ssl??!1,sslVerify:e.sslVerify??!1,ssh:g(e)}:f.has(e.dbms)?{driver:`postgres`,host:e.host,port:e.port,user:e.user,password:e.pass,database:e.database||`postgres`,ssl:!0,sslVerify:e.dbms===`neon`}:e.dbms===`mssql`?{driver:`mssql`,host:e.host,port:e.port,user:e.user,password:e.pass,database:e.database||`master`,ssl:e.ssl??!1,sslVerify:e.sslVerify??!1,ssh:g(e)}:e.dbms===`oracle`?{driver:`oracle`,host:e.host,port:e.port,user:e.user,password:e.pass,serviceName:e.database||`FREEPDB1`,ssh:g(e)}:{driver:`mysql`,host:e.host,port:e.port,user:e.user,password:e.pass,charset:e.charset===`utf8`?`utf8mb4`:e.charset,ssl:e.ssl??!1,sslVerify:e.sslVerify??!1,ssh:g(e)}}var v=d(`tunnelAuthTokens`,()=>new Map);function de(e,t){let n=t?.trim();n?v.set(e,n):v.delete(e)}function fe(e){return e?.trim()||m.token||void 0}function y(e){let t={"Content-Type":`application/json`},n=fe(e);return n&&(t.Authorization=`Bearer ${n}`),t}var b=class extends Error{status;body;constructor(e,t,n=null){super(e),this.status=t,this.body=n}};function pe(e){if(!(e instanceof b)||e.status!==409)return null;let t=e.body,n=t?.hostKey;if(t?.code!==`host-key-unknown`||!n)return null;let r=typeof n.host==`string`&&/^[A-Za-z0-9._:[\]-]{1,253}$/.test(n.host)?n.host:null,i=typeof n.type==`string`&&/^[\w.@-]{1,64}$/.test(n.type)?n.type:null,a=typeof n.fingerprint==`string`&&/^SHA256:[A-Za-z0-9+/]{43}$/.test(n.fingerprint)?n.fingerprint:null,o=Number.isInteger(n.port)&&n.port>0&&n.port<65536?n.port:null;return r&&i&&a&&o?{host:r,port:o,type:i,fingerprint:a}:null}async function me(e,t){let n=await fetch(`${e.replace(/\/+$/,``)}/pair`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({code:t})}),i=await n.json().catch(()=>null);if(!n.ok||!i?.success||typeof i.token!=`string`)throw Error(i?.message??r.t(`services.agent.httpError`,{status:n.status,statusText:n.statusText}));return i.token}async function x(e,t,n){let i;try{i=await fetch(`${h()}${e}`,{method:`POST`,headers:y(n),body:JSON.stringify(t)})}catch(e){throw Error(r.t(`services.agent.unreachable`,{url:ce(),message:e instanceof Error?e.message:String(e)}))}let a=null;try{a=await i.json()}catch{a=null}if(!i.ok)throw new b(a?.message??r.t(`services.agent.httpError`,{status:i.status,statusText:i.statusText}),i.status,a);if(!a)throw Error(r.t(`services.agent.emptyResponse`));return a}async function he(e,t){let n=await x(`/connect`,e,t);return n.success&&n.connectionId&&(de(n.connectionId,fe(t)),ve()),n}async function ge(e){try{return(await x(`/cancel`,{connectionId:e},v.get(e))).cancelled?`cancelled`:`unsupported`}catch(e){return e instanceof b&&e.status===404?`agent-outdated`:`failed`}}async function _e(e,t,n){let r=performance.now(),i=await x(`/query`,{connectionId:e,sql:t,database:n},v.get(e));return i.execTime||=Math.round(performance.now()-r),i}function ve(){if(typeof window>`u`)return;let e=d(`tunnelPageHide`,()=>({done:!1}));e.done||(e.done=!0,window.addEventListener(`pagehide`,()=>{for(let[e,t]of v)fetch(`${h()}/disconnect`,{method:`POST`,headers:y(t),body:JSON.stringify({connectionId:e}),keepalive:!0}).catch(()=>void 0)}))}async function ye(e){try{await x(`/disconnect`,{connectionId:e},v.get(e))}finally{v.delete(e)}}async function be(e,t){return x(`/test-connection`,e,t)}var S=0;function xe(e){S>=3||(async()=>{try{(await fetch(`${h()}/usage`,{method:`POST`,headers:y(),body:JSON.stringify({feature:e})})).ok?S=0:S+=1}catch{S+=1}})()}function C(e,t,n){return e.map(e=>e.id===t?n(e):e.children.length>0?{...e,children:C(e.children,t,n)}:e)}function Se(e,t){for(let n of e){if(n.id===t)return n;let e=Se(n.children,t);if(e)return e}return null}function w(e,t,n){let r=new Set(e??[]);if(n)r.add(t);else for(let e of r)(e===t||e.startsWith(`${t}/`))&&r.delete(e);return[...r]}var Ce=n()(a(e=>({trees:{},selectedNodeId:{},expandedIds:{},setTree:(t,n)=>e(e=>({trees:{...e.trees,[t]:n}})),setChildren:(t,n,r)=>e(e=>{let i=e.trees[t];return i?{expandedIds:{...e.expandedIds,[t]:w(e.expandedIds[t],n,!0)},trees:{...e.trees,[t]:C(i,n,e=>({...e,children:r,isLoading:!1,isExpanded:!0,metadata:{...e.metadata,count:r.length}}))}}:e}),setNodeMetadata:(t,n,r)=>e(e=>{let i=e.trees[t];return i?{trees:{...e.trees,[t]:C(i,n,e=>({...e,metadata:{...e.metadata,...r}}))}}:e}),toggleExpanded:(t,n)=>e(e=>{let r=e.trees[t];if(!r)return e;let i=!Se(r,n)?.isExpanded;return{expandedIds:{...e.expandedIds,[t]:w(e.expandedIds[t],n,i)},trees:{...e.trees,[t]:C(r,n,e=>({...e,isExpanded:i}))}}}),setExpanded:(t,n,r)=>e(e=>{let i=e.trees[t];return i?{expandedIds:{...e.expandedIds,[t]:w(e.expandedIds[t],n,r)},trees:{...e.trees,[t]:C(i,n,e=>({...e,isExpanded:r}))}}:e}),setSelected:(t,n)=>e(e=>({selectedNodeId:{...e.selectedNodeId,[t]:n}})),setLoading:(t,n,r)=>e(e=>{let i=e.trees[t];return i?{trees:{...e.trees,[t]:C(i,n,e=>({...e,isLoading:r}))}}:e}),removeTree:t=>e(e=>{let n={...e.trees},r={...e.selectedNodeId};return delete n[t],delete r[t],{trees:n,selectedNodeId:r}})}),{name:`planche-schema`,storage:c(),partialize:e=>({selectedNodeId:e.selectedNodeId,expandedIds:e.expandedIds})})),T=32,E=24,we=931071618,D=931071619,O=(e,t)=>(e[t]<<24|e[t+1]<<16|e[t+2]<<8|e[t+3])>>>0,Te=(e,t)=>(e[t+3]<<24|e[t+2]<<16|e[t+1]<<8|e[t])>>>0;function k(e,t,n,r,i=0,a=0){let o=r?O:Te;for(let r=t;r<t+n;r+=8)i=i+o(e,r)+a>>>0,a=a+o(e,r+4)+i>>>0;return[i,a]}function Ee(e){if(e.byteLength<T)return null;let t=O(e,0);if(t!==we&&t!==D)return null;let n=t===D,r=O(e,8);if(r<512||r>65536||r&r-1)return null;let i=O(e,16),a=O(e,20),[o,s]=k(e,0,24,n);if(o!==O(e,24)||s!==O(e,28))return null;let c=E+r,l=new Map,u=new Map,d=0,f=0,p=0;for(let t=T;t+c<=e.byteLength&&!(O(e,t+8)!==i||O(e,t+12)!==a||([o,s]=k(e,t,8,n,o,s),[o,s]=k(e,t+E,r,n,o,s),o!==O(e,t+16)||s!==O(e,t+20)));t+=c){let n=O(e,t),r=O(e,t+4);if(n===0)break;if(u.set(n,e.subarray(t+E,t+c)),p++,r>0){for(let[e,t]of u)l.set(e,t);u.clear(),d=r,f+=p,p=0}}return{pageSize:r,dbSizePages:d,pages:l,committedFrames:f}}function A(e,t){let n=Ee(t);if(!n||n.committedFrames===0)return{bytes:e,appliedFrames:0};let{pageSize:r,dbSizePages:i,pages:a}=n,o=Math.max(i*r,e.byteLength-e.byteLength%r),s=new Uint8Array(o);s.set(e.subarray(0,Math.min(e.byteLength,o)));for(let[e,t]of a){let n=(e-1)*r;n+r<=o&&s.set(t,n)}return{bytes:i>0?s.subarray(0,i*r):s,appliedFrames:n.committedFrames}}var De=`planche-file-handles`,j=`handles`;function Oe(){return new Promise((e,t)=>{if(typeof indexedDB>`u`){t(Error(`IndexedDB unavailable`));return}let n=indexedDB.open(De,1);n.onupgradeneeded=()=>n.result.createObjectStore(j),n.onsuccess=()=>e(n.result),n.onerror=()=>t(n.error)})}function M(e,t){return Oe().then(n=>new Promise((r,i)=>{let a=t(n.transaction(j,e).objectStore(j));a.onsuccess=()=>r(a.result),a.onerror=()=>i(a.error)}))}var N=e=>`${e}:wal`;async function P(e,t){try{await M(`readwrite`,n=>n.put(t,e))}catch{}}async function F(e){try{return await M(`readonly`,t=>t.get(e))??null}catch{return null}}async function I(e){try{await M(`readwrite`,t=>t.delete(e))}catch{}}async function L(e,t){let n=e,r={mode:`readwrite`};try{if(n.queryPermission&&await n.queryPermission(r)===`granted`)return!0;if(t&&n.requestPermission)return await n.requestPermission(r)===`granted`}catch{}return!1}var R=e=>`dbcache-meta:${e}`,z=e=>`${e}.sqlite3`;async function ke(e){try{let t=await s.getItem(R(e));if(!t)return null;let n=JSON.parse(t),r=await o.get(z(e));return r?{bytes:new Uint8Array(r),meta:n}:null}catch{return null}}async function Ae(e,t,n){try{let r=t.slice().buffer;return await o.set(z(e),r)?(await s.setItem(R(e),JSON.stringify(n)),!0):!1}catch(e){return console.warn(`[db-cache] write failed:`,e),!1}}async function je(e,t){try{let n=await s.getItem(R(e));if(!n)return;await s.setItem(R(e),JSON.stringify({...JSON.parse(n),...t}))}catch{}}async function Me(e){try{await o.remove(z(e)),await s.removeItem(R(e))}catch{}}var Ne=`browser:`;function B(e){return typeof e==`string`&&e.startsWith(`browser:`)}var Pe=750;function Fe(e){let t=W.get(e);t?.profileId&&(t.flushTimer&&clearTimeout(t.flushTimer),t.flushTimer=setTimeout(()=>{t.flushTimer=null,V(e)},Pe))}async function V(e){let t=W.get(e);if(t?.profileId)try{let n=await et(e);await Ae(t.profileId,n,H(t))}catch(e){console.warn(`[browser-sqlite] cache flush failed:`,e)}}function H(e){return{name:e.source.name,lastModified:e.fileMeta.lastModified,size:e.fileMeta.size,dirty:e.dirty,cachedAt:Date.now()}}var Ie=d(`browserSqliteVisibilityListener`,()=>({installed:!1}));typeof document<`u`&&!Ie.installed&&(Ie.installed=!0,document.addEventListener(`visibilitychange`,()=>{if(document.visibilityState===`hidden`)for(let[e,t]of W)t.flushTimer&&(clearTimeout(t.flushTimer),t.flushTimer=null,V(e))}));function U(e){return e.toLowerCase().endsWith(`-wal`)}var W=d(`browserSqliteDatabases`,()=>new Map),Le=d(`browserSqliteModule`,()=>({promise:null}));async function G(){return Le.promise||=i(()=>import(`./dist-Roudme38.js`).then(e=>e.default()),[]),Le.promise}function K(e){let t=W.get(e);if(!t)throw Error(`Browser connection not found: ${e}`);return t}function Re(e){if(!(e.byteLength>=100&&e[0]===83&&e[15]===0)||e[18]!==2&&e[19]!==2)return{bytes:e,wal:!1};let t=new Uint8Array(e);return t[18]=1,t[19]=1,{bytes:t,wal:!0}}var ze=`SQLite format 3\0`;function Be(e){if(e.byteLength===0)return null;if(e.byteLength<100)return r.t(`services.sqliteFile.tooSmall`);if(String.fromCharCode(...e.subarray(0,16))!==ze)return r.t(`services.sqliteFile.notSqlite`);let t=e[16]<<8|e[17],n=t===1?65536:t;return n<512||n&n-1?r.t(`services.sqliteFile.badPageSize`,{size:n}):null}async function Ve(e){let t=Be(e);if(t)throw Error(t);let n=await G(),i=new n.oo1.DB;if(e.byteLength===0)return i;let a=n.wasm.allocFromTypedArray(e),o=n.capi,s=o.SQLITE_DESERIALIZE_FREEONCLOSE??1,c=o.SQLITE_DESERIALIZE_RESIZEABLE??2,l=n.capi.sqlite3_deserialize(i.pointer,`main`,a,e.byteLength,e.byteLength,s|c);i.checkRc(l);try{i.exec(`SELECT count(*) FROM sqlite_master`)}catch(e){throw i.close(),Error(r.t(`services.sqliteFile.unreadable`,{message:e instanceof Error?e.message:String(e)}))}return i}async function He(e){let t=window.showOpenFilePicker;if(t)try{let n=await t({multiple:e.multiple,types:e.sqliteOnly?[{description:r.t(`services.sqliteFile.pickerDescription`),accept:{"application/vnd.sqlite3":[`.sqlite`,`.sqlite3`,`.db`,`.db3`]}}]:void 0,excludeAcceptAllOption:!1});return Promise.all(n.map(async e=>({file:await e.getFile(),handle:e})))}catch(e){if(e instanceof DOMException&&e.name===`AbortError`)return[];throw e}return new Promise(t=>{let n=document.createElement(`input`);n.type=`file`,n.multiple=e.multiple,e.sqliteOnly&&(n.accept=`.sqlite,.sqlite3,.db,.db3,application/vnd.sqlite3`),n.onchange=()=>t(Array.from(n.files??[]).map(e=>({file:e}))),n.oncancel=()=>t([]),n.click()})}async function Ue(){let e=await He({multiple:!0,sqliteOnly:!1}),t=e.find(e=>!U(e.file.name));return t?{main:t,wal:e.find(e=>U(e.file.name)&&e.file.name.toLowerCase()===`${t.file.name.toLowerCase()}-wal`)??e.find(e=>U(e.file.name))}:null}async function We(){let[e]=await He({multiple:!1,sqliteOnly:!1});return e??null}async function q(e,t,n={}){let{bytes:r,wal:i}=Re(e),a=await Ve(r),o=`${Ne}${crypto.randomUUID()}`,s={...t,wal:i};return W.set(o,{db:a,source:s,rawBytes:e,profileId:n.profileId,fileMeta:n.fileMeta??{lastModified:0,size:e.byteLength},dirty:n.dirty??!1,flushTimer:null}),{connectionId:o,source:s}}async function J(e,t,n,r={}){let i=e?new Uint8Array(await e.arrayBuffer()):new Uint8Array,a=i,o=!1;n&&(a=A(i,new Uint8Array(await n.file.arrayBuffer())).bytes,o=!0);let s=await q(a,{name:e?.name??`:memory:`,handle:t,walApplied:o,walHandle:n?.handle},{profileId:r.profileId,fileMeta:{lastModified:Math.max(e?.lastModified??0,n?.file.lastModified??0),size:i.byteLength}});return W.get(s.connectionId).rawBytes=i,r.profileId&&V(s.connectionId),s}async function Ge(e,t,n,r){return await q(t,{name:n.name,handle:r,walApplied:!0},{profileId:e,fileMeta:{lastModified:n.lastModified,size:n.size},dirty:n.dirty})}function Ke(e,t){let n=K(e);n.source={...n.source,handle:t}}function qe(e){return W.get(e)?.dirty??!1}async function Je(e,t){let n=K(e),r=A(n.rawBytes,new Uint8Array(await t.file.arrayBuffer())),i=await q(r.bytes,{...n.source,walApplied:!0,walHandle:t.handle},{profileId:n.profileId,fileMeta:n.fileMeta});return W.get(i.connectionId).rawBytes=n.rawBytes,X(e),n.profileId&&V(i.connectionId),{...i,appliedFrames:r.appliedFrames}}function Y(e){return W.get(e)?.source??null}function Ye(e){return e&&e.trim().toLowerCase().replace(/\(.*$/,``).trim()||null}function Xe(e){return e==null?`null`:typeof e==`number`?Number.isInteger(e)?`integer`:`real`:typeof e==`bigint`?`bigint`:e instanceof Uint8Array?`blob`:`text`}function Ze(e){return typeof e==`bigint`?Number(e):e instanceof Uint8Array?{type:`Buffer`,data:Array.from(e)}:e}async function Qe(e,t){let{db:n}=K(e),r=await G(),i=performance.now(),a=K(e),o=Number(r.capi.sqlite3_total_changes(n.pointer)),s=n.prepare(t);try{if(s.columnCount===0){s.step();let c=Number(n.changes()),l=Number(r.capi.sqlite3_last_insert_rowid(n.pointer)),u=/^\s*(BEGIN|COMMIT|END|ROLLBACK|SAVEPOINT|RELEASE)\b/i.test(t);return(c>0||Number(r.capi.sqlite3_total_changes(n.pointer))!==o||!u)&&(a.dirty=!0,Fe(e)),{success:!0,fields:[],records:[],affectedRows:c,insertId:l,isResultQuery:!1,execTime:Math.round(performance.now()-i)}}let c=[];for(;s.step();)c.push(s.get([]).map(Ze));let l=s.getColumnNames(),u=r.capi,d=s.pointer;return{success:!0,fields:l.map((e,t)=>{let n=Ye(u.sqlite3_column_decltype(d,t)),r=u.sqlite3_column_table_name(d,t)??``;return{name:e,orgName:u.sqlite3_column_origin_name(d,t)??e,type:n??Xe($e(c,t)),table:r,orgTable:r,db:u.sqlite3_column_database_name(d,t)??``,maxLength:0}}),records:c,affectedRows:0,insertId:0,isResultQuery:!0,execTime:Math.round(performance.now()-i)}}finally{s.finalize()}}function $e(e,t){for(let n of e){let e=n[t];if(e!=null)return e}return null}async function et(e){let{db:t}=K(e);return(await G()).capi.sqlite3_js_db_export(t.pointer)}function tt(e){let t=W.get(e);if(!t?.source.handle)return null;let{source:n}=t;return n.wal&&!n.walApplied&&!n.walAcknowledged?r.t(`services.sqliteFile.walNotLoaded`):null}function nt(e){let t=K(e);t.source={...t.source,walAcknowledged:!0}}async function rt(e){let{source:t,fileMeta:n}=e;if(!t.handle)return;let i=await t.handle.getFile();if(n.lastModified&&(i.lastModified!==n.lastModified||i.size!==n.size))throw Error(r.t(`services.sqliteFile.changedOnDisk`,{name:t.name}));if(t.walHandle)try{let e=await t.walHandle.getFile();if(e.size>0&&!t.walApplied)throw Error(r.t(`services.sqliteFile.walHasChanges`,{name:t.name}));if(e.size>0&&t.walApplied&&e.lastModified>n.lastModified)throw Error(r.t(`services.sqliteFile.walChangedOnDisk`,{name:t.name}))}catch(e){if(e instanceof Error&&!(e instanceof DOMException))throw e}}async function it(e){let t=K(e),{source:n}=t,i=tt(e);if(i)throw Error(i);n.handle&&await rt(t);let a=await et(e);if(n.handle){if(!await L(n.handle,!0))throw Error(r.t(`services.sqliteFile.writeDenied`,{name:n.name}));let t=await n.handle.createWritable();await t.write(a),await t.close(),n.walHandle&&await(await n.walHandle.createWritable()).close();let i=K(e);i.dirty=!1;try{let e=await n.handle.getFile();i.fileMeta={lastModified:e.lastModified,size:e.size}}catch{i.fileMeta={lastModified:Date.now(),size:a.byteLength}}return i.profileId&&je(i.profileId,{...H(i)}),`in-place`}let o=new Blob([a],{type:`application/vnd.sqlite3`}),s=URL.createObjectURL(o),c=document.createElement(`a`);return c.href=s,c.download=n.name===`:memory:`?`database.sqlite`:n.name,c.click(),URL.revokeObjectURL(s),`download`}function X(e){let t=W.get(e);t&&(t.flushTimer&&clearTimeout(t.flushTimer),t.db.close(),W.delete(e))}function Z(e){return W.get(e)?.profileId}async function at(e){await I(e),await I(N(e)),await Me(e)}async function ot(e,t){let n=await F(e);if(!n)return null;if(!await L(n,t))return`denied`;try{return{handle:n,file:await n.getFile()}}catch(t){if(t instanceof DOMException&&(t.name===`NotFoundError`||t.name===`NotAllowedError`))return await I(e),null;throw t}}async function st(e,t){let n=await F(N(e));if(!(!n||!await L(n,t)))try{return{file:await n.getFile(),handle:n}}catch{await I(N(e));return}}async function ct(e,t){let n={remembered:!0,fromCache:!1,restoredUnsaved:!1,fileDetached:!1,diskChanged:!1},r=await ke(e),i=await ot(e,t.interactive),a=i&&i!==`denied`?i.handle:void 0,o=i&&i!==`denied`?i.file:null;if(r?.meta.dirty){let{connectionId:t,source:i}=await Ge(e,r.bytes,r.meta,a),s=o?o.lastModified!==r.meta.lastModified||o.size!==r.meta.size:!1;return{...n,connectionId:t,fileName:i.name,wal:i.wal,walApplied:i.walApplied,fromCache:!0,restoredUnsaved:!0,fileDetached:!a,diskChanged:s}}if(o&&a){let{connectionId:r,source:i}=await J(o,a,await st(e,t.interactive),{profileId:e});return{...n,connectionId:r,fileName:i.name,wal:i.wal,walApplied:i.walApplied}}if(r){let{connectionId:t,source:i}=await Ge(e,r.bytes,r.meta);return{...n,connectionId:t,fileName:i.name,wal:i.wal,walApplied:i.walApplied,fromCache:!0,fileDetached:!0}}if(!t.interactive)return null;let s=await Ue();if(!s)return null;let{connectionId:c,source:l}=await J(s.main.file,s.main.handle,s.wal,{profileId:e});return s.main.handle?await P(e,s.main.handle):await I(e),s.wal?.handle?await P(N(e),s.wal.handle):await I(N(e)),{...n,connectionId:c,fileName:l.name,wal:l.wal,walApplied:l.walApplied,remembered:!1}}var lt=`SQLite format 3\0`;async function ut(e){if(e.size===0)return!0;if(e.size<100)return!1;let t=new Uint8Array(await e.slice(0,16).arrayBuffer());return String.fromCharCode(...t)===lt}async function dt(e,t){try{let n=await F(e);return n?await n.isSameEntry(t):!1}catch{return!1}}async function ft(n){let i=n.find(e=>!U(e.file.name));if(!i)return;if(!await ut(i.file))throw Error(r.t(`app.dropNotSqlite`,{name:i.file.name}));let a=n.find(e=>U(e.file.name)&&e.file.name.toLowerCase()===`${i.file.name.toLowerCase()}-wal`),o=l.getState(),s;for(let e of o.savedConnections)if(!(e.dbms!==`sqlite`||(e.transport??`browser`)!==`browser`||e.sample||e.file!==i.file.name)&&i.handle&&await dt(e.id,i.handle)){s=e;break}let c=s??{id:crypto.randomUUID(),hostName:i.file.name.replace(/\.(db|sqlite|sqlite3|db3)$/i,``),host:``,user:``,pass:``,charset:`utf8`,port:0,dbms:`sqlite`,transport:`browser`,file:i.file.name,autoConnection:!1,savePassword:!0,authToken:``};e(`sqlite_file_drop`,{reused:!!s,wal:!!a,handle:!!i.handle});let d=o.activeConnections.some(e=>e.id===c.id),f=o.activeConnections.find(e=>e.id===c.id)?.serverConnectionId,{connectionId:p}=await J(i.file,i.handle,a,{profileId:c.id});f&&f!==p&&B(f)&&X(f),i.handle?await P(c.id,i.handle):await I(c.id),a?.handle?await P(N(c.id),a.handle):await I(N(c.id)),s||o.addSavedConnection(c),o.openConnection({...c,serverConnectionId:p}),o.setPendingReopen(c.id,!1),o.setFileDetached(c.id,!1),d?Ce.getState().removeTree(c.id):u.getState().addQueryTab(c.id,{id:`tab-${Date.now()}`,title:r.t(`connection.dialog.firstQueryTab`),query:``,database:``,isExecuting:!1,results:[],error:null,executionTime:null}),t.getState().setWelcomeVisible(!1)}async function pt(e,t){let n=await ot(e,!0);return!n||n===`denied`?!1:(Ke(t,n.handle),!0)}async function mt(e){let t=Z(e),n=Y(e);return n&&!n.handle&&t&&await pt(t,e),it(e)}function ht(e){let t=Y(e);return t?t.name===`:memory:`?r.t(`services.save.inMemory`):typeof window<`u`&&!(`showOpenFilePicker`in window)?r.t(`services.save.noFileSystemAccess`):!t.handle&&!Z(e)?r.t(`services.save.noWritableHandle`):null:r.t(`services.save.notBrowserSqlite`)}async function gt(e,t){let n=await We();if(!n)return null;let r=await Je(t,n);return n.handle&&await P(N(e),n.handle),{connectionId:r.connectionId,appliedFrames:r.appliedFrames}}function _t(e){if(!B(e))return null;let t=Y(e);return t?{wal:t.wal,walApplied:t.walApplied,walAcknowledged:t.walAcknowledged??!1}:null}function vt(e){return e.dbms===`sqlite`&&e.transport===`browser`?`browser`:`tunnel`}async function yt(e,t){return he(e,t)}async function bt(e,t){return be(e,t)}async function xt(e,t,n){let r=e=>({success:!1,fields:[],records:[],affectedRows:0,insertId:0,isResultQuery:!1,execTime:0,message:e instanceof Error?e.message:String(e)});if(B(e))try{return await Qe(e,t)}catch(e){return r(e)}let i=Q.get(e)??e;try{return await _e(i,t,n)}catch(e){if(!(e instanceof b)||e.status!==404)return r(e);let a=await St(i);if(!a)return r(e);try{return await _e(a,t,n)}catch(e){return r(e)}}}var Q=new Map,$=new Map;function St(e){let n=$.get(e);if(n)return n;let i=(async()=>{let n=l.getState(),i=n.activeConnections.find(t=>t.serverConnectionId===e||Q.get(t.serverConnectionId??``)===e);if(!i||vt(i)===`browser`||se())return null;if(i.serverConnectionId&&i.serverConnectionId!==e&&!Q.has(i.serverConnectionId))return Q.set(e,i.serverConnectionId),i.serverConnectionId;let a=n.resolveCredentials(i),o=a.ssh?.enabled&&a.ssh.auth===`password`&&!a.ssh.password;if(!a.pass&&i.pass===``&&i.dbms!==`sqlite`||o)return null;try{let n=await he(_(a),a.authToken||void 0);if(!n.success||!n.connectionId)return null;for(let[t,r]of Q)r===e&&Q.set(t,n.connectionId);return Q.set(e,n.connectionId),l.getState().updateServerConnectionId(i.id,n.connectionId),l.getState().setTransactionOpen(i.id,!1),t.getState().setFooterMessage(r.t(`services.agent.reconnected`,{name:i.hostName||i.host||i.databaseId||i.file||i.id})),n.connectionId}catch{return null}})();return $.set(e,i),i.finally(()=>$.delete(e)),i}async function Ct(e){if(B(e)){let t=Z(e);X(e),t&&await Me(t);return}return ye(e)}function wt(e){return e===`cancelled`?null:e===`agent-outdated`?r.t(`result.running.agentOutdated`):e===`unsupported`?r.t(`result.running.cannotCancel`):r.t(`result.running.cancelFailed`)}async function Tt(e){if(B(e))return`unsupported`;let t=l.getState().activeConnections.find(t=>t.id===e)?.serverConnectionId;return t?ge(t):`failed`}function Et(e){return async(t,n)=>{let i=await xt(e,t,n);if(!i.success)throw Error(i.message??r.t(`services.query.failed`));return i}}export{xe as A,se as C,pe as D,ue as E,f as M,ee as N,oe as O,p as P,Ce as S,ne as T,nt as _,Et as a,qe as b,xt as c,vt as d,gt as f,bt as g,mt as h,yt as i,_ as j,me as k,at as l,pt as m,wt as n,ht as o,ft as p,ct as r,Ct as s,Tt as t,_t as u,tt as v,le as w,J as x,B as y};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{i as e}from"./connection-store-DjSajhjh.js";import{A as t}from"./database-_lr1w6xK.js";function n(n){t(n),e(n)}export{n as t};
|