db-studio 1.2.8 → 1.2.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core-dist/assets/{_baseUniq-DeTP8pep.js → _baseUniq-CAv_sUq0.js} +1 -1
- package/dist/core-dist/assets/{mermaid-VLURNSYL-DIO6bwbh.js → _pathlessLayout-CZkGDKr3.js} +60 -60
- package/dist/core-dist/assets/_queryId-BlJwBNE7.js +1 -0
- package/dist/core-dist/assets/_table-Bg3Jhj3R.js +1 -0
- package/dist/core-dist/assets/{arc-BoR-jFRR.js → arc-BJuKLB46.js} +1 -1
- package/dist/core-dist/assets/architecture-U656AL7Q-CG9_JmIP.js +1 -0
- package/dist/core-dist/assets/architectureDiagram-VXUJARFQ-BlKpMHgP.js +36 -0
- package/dist/core-dist/assets/{blockDiagram-VD42YOAC-CeAErDmg.js → blockDiagram-VD42YOAC-BzzsEP95.js} +2 -2
- package/dist/core-dist/assets/{c4Diagram-YG6GDRKO-OSVEUkvh.js → c4Diagram-YG6GDRKO-BnbEJDnT.js} +4 -4
- package/dist/core-dist/assets/channel-CymmV4CK.js +1 -0
- package/dist/core-dist/assets/{chunk-4BX2VUAB-BEVdK-cK.js → chunk-4BX2VUAB-BBlBt29z.js} +1 -1
- package/dist/core-dist/assets/{chunk-55IACEB6-BhPxNRfI.js → chunk-55IACEB6-DNkirFYu.js} +1 -1
- package/dist/core-dist/assets/{chunk-B4BG7PRW-BIYfgIK7.js → chunk-B4BG7PRW-DplPr675.js} +1 -1
- package/dist/core-dist/assets/{chunk-DI55MBZ5-usB5CT3s.js → chunk-DI55MBZ5-CuowJrst.js} +1 -1
- package/dist/core-dist/assets/{chunk-FMBD7UC4-D_zfIsjm.js → chunk-FMBD7UC4-CDLqhL7O.js} +1 -1
- package/dist/core-dist/assets/{chunk-QN33PNHL-BZgTlwI6.js → chunk-QN33PNHL-T2K3kI4j.js} +1 -1
- package/dist/core-dist/assets/{chunk-QZHKN3VN-DVUwvM1e.js → chunk-QZHKN3VN-Cn74Pd79.js} +1 -1
- package/dist/core-dist/assets/{chunk-TZMSLE5B-D0G1xb6O.js → chunk-TZMSLE5B-jRgtCDM3.js} +1 -1
- package/dist/core-dist/assets/classDiagram-2ON5EDUG-DsppMAOR.js +1 -0
- package/dist/core-dist/assets/classDiagram-v2-WZHVMYZB-DsppMAOR.js +1 -0
- package/dist/core-dist/assets/clone-tRzPOHdE.js +1 -0
- package/dist/core-dist/assets/{code-block-IT6T5CEO-CVoIiHLl.js → code-block-IT6T5CEO-CY4ZkvyN.js} +3 -3
- package/dist/core-dist/assets/cose-bilkent-S5V4N54A-Dj3H49oa.js +1 -0
- package/dist/core-dist/assets/cssMode-CF1T5vEU.js +1 -0
- package/dist/core-dist/assets/dagre-6UL2VRFP-Cly5tuXN.js +4 -0
- package/dist/core-dist/assets/defaultLocale-DX6XiGOO.js +1 -0
- package/dist/core-dist/assets/diagram-PSM6KHXK-DL2Q8K3B.js +24 -0
- package/dist/core-dist/assets/diagram-QEK2KX5R-DizZ-655.js +43 -0
- package/dist/core-dist/assets/diagram-S2PKOQOG-BzPXNCcq.js +24 -0
- package/dist/core-dist/assets/{erDiagram-Q2GNP2WA-BYhHqY5d.js → erDiagram-Q2GNP2WA-BofISlfK.js} +2 -2
- package/dist/core-dist/assets/{flowDiagram-NV44I4VS--B_JCKG9.js → flowDiagram-NV44I4VS-CraoKtH-.js} +2 -2
- package/dist/core-dist/assets/{format-cell-value-DJ9wR-dS.js → format-cell-value-BZxeFaA8.js} +1 -1
- package/dist/core-dist/assets/{freemarker2-C8JhQdZP.js → freemarker2-BIvjYnfp.js} +2 -2
- package/dist/core-dist/assets/ganttDiagram-JELNMOA3-BRvyb8VW.js +267 -0
- package/dist/core-dist/assets/gitGraph-F6HP7TQM-XNCl7HYP.js +1 -0
- package/dist/core-dist/assets/gitGraphDiagram-NY62KEGX-DKWRoQuV.js +65 -0
- package/dist/core-dist/assets/{graph-B4OompRX.js → graph-CiH4Elhg.js} +1 -1
- package/dist/core-dist/assets/handlebars-CK7lLchY.js +1 -0
- package/dist/core-dist/assets/html-D4oGQ6da.js +1 -0
- package/dist/core-dist/assets/htmlMode-UdBCLKNC.js +1 -0
- package/dist/core-dist/assets/index-BGJonb8r.js +1 -0
- package/dist/core-dist/assets/index-BTbtGsf1.js +1 -0
- package/dist/core-dist/assets/index-C1hGVAGZ.css +1 -0
- package/dist/core-dist/assets/index-DT0YxcHG.js +1 -0
- package/dist/core-dist/assets/index-D_Jinmad.js +93 -0
- package/dist/core-dist/assets/index-VbLkqC9g.js +1 -0
- package/dist/core-dist/assets/indexes-DUg8pguA.js +1 -0
- package/dist/core-dist/assets/info-NVLQJR56-C0BKzANU.js +1 -0
- package/dist/core-dist/assets/infoDiagram-WHAUD3N6-CJI0qAk5.js +2 -0
- package/dist/core-dist/assets/javascript-DVJFYsQU.js +1 -0
- package/dist/core-dist/assets/{journeyDiagram-XKPGCS4Q-DVnTCfN2.js → journeyDiagram-XKPGCS4Q-CbUo2D0u.js} +2 -2
- package/dist/core-dist/assets/{jsonMode-DDnE0tij.js → jsonMode-BxHkXShz.js} +2 -2
- package/dist/core-dist/assets/{kanban-definition-3W4ZIXB7-BCv733kL.js → kanban-definition-3W4ZIXB7-BI8V_-kx.js} +2 -2
- package/dist/core-dist/assets/{layout-Yc_iIB-x.js → layout-BwolAo18.js} +1 -1
- package/dist/core-dist/assets/{linear-Ccvhuns4.js → linear-DmRzTBeT.js} +1 -1
- package/dist/core-dist/assets/liquid-C5m2c79-.js +1 -0
- package/dist/core-dist/assets/logs-DvzMaNSj.js +1 -0
- package/dist/core-dist/assets/{lspLanguageFeatures-GQiniNAU.js → lspLanguageFeatures-Bi1yNEJU.js} +1 -1
- package/dist/core-dist/assets/mdx-DIQtb_gN.js +1 -0
- package/dist/core-dist/assets/mermaid-VLURNSYL-BwQZ3L24.js +1 -0
- package/dist/core-dist/assets/{treemap-KMMF4GRG-DbHVk-Xm.js → mermaid-parser.core-GpQo11SQ.js} +49 -48
- package/dist/core-dist/assets/{mermaid.core-slM-mBGw.js → mermaid.core-BmMdWyIh.js} +5 -5
- package/dist/core-dist/assets/{min-n8lTmAvY.js → min-CBpbEBoX.js} +1 -1
- package/dist/core-dist/assets/{mindmap-definition-VGOIOE7T-CZwrzjwH.js → mindmap-definition-VGOIOE7T-B5j249CZ.js} +2 -2
- package/dist/core-dist/assets/ordinal-BENe2yWM.js +1 -0
- package/dist/core-dist/assets/packet-BFZMPI3H-B3dLa20l.js +1 -0
- package/dist/core-dist/assets/pie-7BOR55EZ-SduROXgQ.js +1 -0
- package/dist/core-dist/assets/pieDiagram-ADFJNKIX-DWDcg6KO.js +30 -0
- package/dist/core-dist/assets/python-DsM0goT4.js +1 -0
- package/dist/core-dist/assets/{quadrantDiagram-AYHSOK5B-BZqGtn9b.js → quadrantDiagram-AYHSOK5B-XoLRHaBF.js} +2 -2
- package/dist/core-dist/assets/{queries.store-CbImnNJo.js → queries.store-DO7682hm.js} +1 -1
- package/dist/core-dist/assets/radar-NHE76QYJ-BUhlCoHu.js +1 -0
- package/dist/core-dist/assets/razor-CzWHKXwU.js +1 -0
- package/dist/core-dist/assets/{requirementDiagram-UZGBJVZJ-Dp1yAO4V.js → requirementDiagram-UZGBJVZJ-DY4QxjKx.js} +5 -5
- package/dist/core-dist/assets/{runner-tab-D2hjlCAt.js → runner-tab-D0elRWLb.js} +4 -4
- package/dist/core-dist/assets/sankeyDiagram-TZEHDZUN-C4xfe9wH.js +10 -0
- package/dist/core-dist/assets/schema-BII6kTqY.js +1 -0
- package/dist/core-dist/assets/{sequenceDiagram-WL72ISMW-DxWRatq4.js → sequenceDiagram-WL72ISMW-DWhVOvUA.js} +2 -2
- package/dist/core-dist/assets/{spinner-DRgNI7eU.js → spinner-MM9EZ74I.js} +1 -1
- package/dist/core-dist/assets/stateDiagram-FKZM4ZOC-B70Aswf4.js +1 -0
- package/dist/core-dist/assets/stateDiagram-v2-4FDKWEC3-Dc-RHAld.js +1 -0
- package/dist/core-dist/assets/{timeline-definition-IT6M3QCI-Dp45IwZ4.js → timeline-definition-IT6M3QCI-CjREf6gn.js} +2 -2
- package/dist/core-dist/assets/treemap-KMMF4GRG-Bbfo1cUw.js +1 -0
- package/dist/core-dist/assets/{tsMode-CE083Imf.js → tsMode-womOZTe5.js} +2 -2
- package/dist/core-dist/assets/typescript-ClkwQ9Fj.js +1 -0
- package/dist/core-dist/assets/visualizer-BTAd--C0.js +1 -0
- package/dist/core-dist/assets/xml-BIMxtbHt.js +1 -0
- package/dist/core-dist/assets/{xychartDiagram-PRI3JC2R-Dfqks87e.js → xychartDiagram-PRI3JC2R-kLx_CqKx.js} +2 -2
- package/dist/core-dist/assets/yaml-DblqwOQB.js +1 -0
- package/dist/core-dist/index.html +2 -2
- package/dist/index.js +26 -26
- package/dist/index.js.map +1 -1
- package/package.json +4 -8
- package/dist/core-dist/assets/_queryId-xb71ELMT.js +0 -1
- package/dist/core-dist/assets/_table-CPYKXxJK.js +0 -1
- package/dist/core-dist/assets/architectureDiagram-VXUJARFQ-CZLHhedK.js +0 -36
- package/dist/core-dist/assets/channel-CNjzrXvL.js +0 -1
- package/dist/core-dist/assets/classDiagram-2ON5EDUG-BhJm11nN.js +0 -1
- package/dist/core-dist/assets/classDiagram-v2-WZHVMYZB-BhJm11nN.js +0 -1
- package/dist/core-dist/assets/clone-CpKDUrON.js +0 -1
- package/dist/core-dist/assets/cose-bilkent-S5V4N54A-mPMfO63b.js +0 -1
- package/dist/core-dist/assets/cssMode-BbbavvFK.js +0 -1
- package/dist/core-dist/assets/dagre-6UL2VRFP-C2kq_KdG.js +0 -4
- package/dist/core-dist/assets/defaultLocale-C4B-KCzX.js +0 -1
- package/dist/core-dist/assets/diagram-PSM6KHXK-dnGx_20I.js +0 -24
- package/dist/core-dist/assets/diagram-QEK2KX5R-DUffoXTA.js +0 -43
- package/dist/core-dist/assets/diagram-S2PKOQOG-DknjRkcy.js +0 -24
- package/dist/core-dist/assets/ganttDiagram-JELNMOA3-fwVvPSFQ.js +0 -267
- package/dist/core-dist/assets/gitGraphDiagram-NY62KEGX-B1Rw385f.js +0 -65
- package/dist/core-dist/assets/handlebars-B9xzXuR2.js +0 -1
- package/dist/core-dist/assets/html-DhJbXNLg.js +0 -1
- package/dist/core-dist/assets/htmlMode-CSFATZjY.js +0 -1
- package/dist/core-dist/assets/index-BAVByTDE.js +0 -93
- package/dist/core-dist/assets/index-BjpaRjp0.css +0 -1
- package/dist/core-dist/assets/index-C1V1hQQg.js +0 -1
- package/dist/core-dist/assets/index-Cpv2wm86.js +0 -1
- package/dist/core-dist/assets/index-DQ8lDHvH.js +0 -1
- package/dist/core-dist/assets/index-DwoOS22k.js +0 -1
- package/dist/core-dist/assets/indexes-DvT7ztBf.js +0 -1
- package/dist/core-dist/assets/infoDiagram-WHAUD3N6-Ca5DIjt4.js +0 -2
- package/dist/core-dist/assets/javascript-XYqgRwCU.js +0 -1
- package/dist/core-dist/assets/liquid-BEKYmbJG.js +0 -1
- package/dist/core-dist/assets/logs-CJ_qckmn.js +0 -1
- package/dist/core-dist/assets/mdx-BwwPudXS.js +0 -1
- package/dist/core-dist/assets/ordinal-Cboi1Yqb.js +0 -1
- package/dist/core-dist/assets/pieDiagram-ADFJNKIX-Dij_1qyq.js +0 -30
- package/dist/core-dist/assets/python-CNAm6jim.js +0 -1
- package/dist/core-dist/assets/razor-1KPvGS6J.js +0 -1
- package/dist/core-dist/assets/sankeyDiagram-TZEHDZUN-D8yL2HOj.js +0 -10
- package/dist/core-dist/assets/schema-Dug6AN9b.js +0 -1
- package/dist/core-dist/assets/stateDiagram-FKZM4ZOC-OB1RLZSz.js +0 -1
- package/dist/core-dist/assets/stateDiagram-v2-4FDKWEC3-CRUlT-Qs.js +0 -1
- package/dist/core-dist/assets/typescript-CWvqEMrx.js +0 -1
- package/dist/core-dist/assets/visualizer-BO_uVLiI.js +0 -1
- package/dist/core-dist/assets/xml-D48gAAGL.js +0 -1
- package/dist/core-dist/assets/yaml-B9qGdCLx.js +0 -1
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
var
|
|
2
|
+
var Kt=Object.defineProperty;var m=(t,e)=>()=>(t&&(e=t(t=0)),e);var Mt=(t,e)=>{for(var r in e)Kt(t,r,{get:e[r],enumerable:!0})};var ue=m(()=>{"use strict"});var R,de=m(()=>{"use strict";R={PORT:3333,ENV:".env",VAR_NAME:"DATABASE_URL",BASE_URL:"http://localhost:3333",PROXY_URL:process.env.NODE_ENV==="development"?"http://localhost:8787":"https://db-studio-proxy.husamql3.workers.dev"}});var pe=m(()=>{"use strict"});var fe,B=m(()=>{"use strict";fe={AUTHOR:"H\xFCsam \u{1F951} <devhsmq@gmail.com>",AUTHOR_NAME:"H\xFCsam",AUTHOR_AVATAR:"/avocado.png",AUTHOR_USERNAME:"husamql3",AUTHOR_GITHUB_LINK:"https://github.com/husamql3",SITE_DESCRIPTION:"The modern pgAdmin alternative that works with every database.",SITE_KEYWORDS:["database","management","studio","spreadsheet","ai","sql"],SITE_TITLE:"DB Studio",SITE_NAME:"dbstudio.sh",SITE_URL:"https://dbstudio.sh",SITE_X_LINK:"https://x.com/dbstudio_sh",SITE_GITHUB_LINK:"https://github.com/husamql3/db-studio",SITE_DOCS_LINK:"https://dbstudio.sh/docs",SITE_CHANGELOG_LINK:"https://dbstudio.sh/changelog",SITE_ROADMAP_LINK:"https://dbstudio.sh/roadmap",SITE_IMAGE:"/og-image.png",SITE_IMAGE_WIDTH:"1200",SITE_IMAGE_HEIGHT:"630",SITE_IMAGE_ALT:"dbstudio.sh \u2013 Modern database management studio",SITE_COLOR:"#1447e6"}});var ge=m(()=>{"use strict"});var q=m(()=>{"use strict";ue();de();pe();B();ge()});import{Pool as nr}from"pg";var j,ar,x,G=m(()=>{"use strict";j=null,ar=()=>{if(!j){if(!process.env.DATABASE_URL)throw new Error("DATABASE_URL is not set. Please provide a database connection string.");try{j=new nr({connectionString:process.env.DATABASE_URL}),j.on("error",t=>{})}catch(t){throw t}}return j},x=new Proxy({},{get(t,e){try{return ar()[e]}catch(r){throw r}}})});var xe=m(()=>{"use strict"});var D,Y=m(()=>{"use strict";D={text:"text",boolean:"boolean",number:"number",enum:"enum",json:"json",date:"date",array:"array"}});function Ae(t){let e=t.toLowerCase().trim();return e.includes("[]")||e==="date"||e==="time"||e==="time without time zone"||e.startsWith("time(")||e==="timestamp"||e==="timestamp without time zone"||e.startsWith("timestamp(")||e==="timestamp with time zone"||e==="timestamptz"||e.startsWith("timestamp with time zone(")?D.date:e==="integer"||e==="int"||e==="int4"||e==="bigint"||e==="int8"||e==="smallint"||e==="int2"||e==="decimal"||e.startsWith("decimal(")||e==="numeric"||e.startsWith("numeric(")||e==="real"||e==="float4"||e==="double precision"||e==="float8"||e==="float"||e==="serial"||e==="serial4"||e==="bigserial"||e==="serial8"||e==="money"?D.number:e==="boolean"||e==="bool"?D.boolean:e==="json"||e==="jsonb"?D.json:e.startsWith("user-defined")||e==="enum"||e==="text"||e==="xml"?D.text:e==="character varying"||e.startsWith("varchar")||e.startsWith("character varying(")||e==="character"||e.startsWith("char")||e.startsWith("character(")||e==="bpchar"||e==="uuid"||e==="interval"||e.startsWith("interval")||e==="bytea"||e==="point"||e==="line"||e==="polygon"||e==="inet"||e==="cidr"||e==="macaddr"||e==="macaddr8"?D.text:D.text}function $e(t){let e=t.toLowerCase().trim();return e==="integer"||e==="int"||e==="int4"||e==="serial"||e==="serial4"?f.int:e==="bigint"||e==="int8"||e==="bigserial"||e==="serial8"?f.bigint:e==="smallint"||e==="int2"?f.smallint:e==="decimal"||e.startsWith("decimal(")||e==="numeric"||e.startsWith("numeric(")?f.numeric:e==="real"||e==="float4"?f.float:e==="double precision"||e==="float8"||e==="float"?f.double:e==="money"?f.money:e==="boolean"||e==="bool"?f.boolean:e==="text"?f.text:e==="character varying"||e.startsWith("varchar")||e.startsWith("character varying(")?f.varchar:e==="character"||e.startsWith("char")||e.startsWith("character(")||e==="bpchar"?f.char:e==="json"?f.json:e==="jsonb"?f.jsonb:e==="xml"?f.xml:e==="uuid"?f.uuid:e==="date"?f.date:e==="time"||e==="time without time zone"||e.startsWith("time(")?f.time:e==="timestamp"||e==="timestamp without time zone"||e.startsWith("timestamp(")?f.timestamp:e==="timestamp with time zone"||e==="timestamptz"||e.startsWith("timestamp with time zone(")?f.timestamptz:e==="interval"||e.startsWith("interval")?f.interval:e==="bytea"?f.bytea:e==="inet"?f.inet:e==="cidr"?f.cidr:e==="macaddr"?f.macaddr:e==="macaddr8"?f.macaddr8:e==="point"?f.point:e==="line"?f.line:e==="polygon"?f.polygon:e.startsWith("array")||e.includes("[]")?f.text:e.startsWith("user-defined")||e==="enum"?f.enum:f.text}var f,Le=m(()=>{"use strict";Y();f={int:"int",bigint:"bigint",smallint:"smallint",numeric:"numeric",float:"float",double:"double",money:"money",boolean:"boolean",text:"text",varchar:"varchar",char:"char",json:"json",jsonb:"jsonb",xml:"xml",uuid:"uuid",date:"date",time:"time",timestamp:"timestamp",timestamptz:"timestamptz",interval:"interval",bytea:"bytea",inet:"inet",cidr:"cidr",macaddr:"macaddr",macaddr8:"macaddr8",point:"point",line:"line",polygon:"polygon",array:"array",enum:"enum"}});var Pe=m(()=>{"use strict"});import{z as sr}from"zod";var ir,J,X=m(()=>{"use strict";ir=["CASCADE","SET NULL","SET DEFAULT","RESTRICT","NO ACTION"],J=sr.enum(ir)});import{z as l}from"zod";var cr,ko,Ie,F,Oe,qe,ke,Z,Ue,T,je=m(()=>{"use strict";X();cr=l.object({columnName:l.string().min(1),columnType:l.string().min(1),defaultValue:l.string(),isPrimaryKey:l.boolean(),isNullable:l.boolean(),isUnique:l.boolean(),isIdentity:l.boolean(),isArray:l.boolean()}),ko=l.object({columnName:l.string().min(1),referencedTable:l.string().min(1),referencedColumn:l.string().min(1),onUpdate:J,onDelete:J}),Ie=l.object({tableName:l.string().min(1,"Table name is required"),fields:l.array(cr).min(1,"At least one field is required")}),F=l.object({tableName:l.string().min(1,"Table name is required")}),Oe=l.object({page:l.string().optional().default("1").transform(Number),pageSize:l.string().optional().default("50").transform(Number),sort:l.string().optional().default(""),order:l.enum(["asc","desc"]).optional(),filters:l.string().optional().transform(t=>{if(!t)return[];try{return JSON.parse(t)}catch{return[]}})}),qe=l.object({tableName:l.string().min(1,"Table name is required"),data:l.record(l.string(),l.any())}),ke=l.object({tableName:l.string().min(1,"Table name is required"),updates:l.array(l.object({rowData:l.any(),columnName:l.string().min(1),value:l.any()})).min(1,"At least one update is required"),primaryKey:l.string().optional()}),Z=l.object({tableName:l.string().min(1,"Table name is required"),primaryKeys:l.array(l.object({columnName:l.string().min(1),value:l.any()})).min(1,"At least one primary key is required")}),Ue=l.object({query:l.string().min(1,"Query is required")}),T=l.object({database:l.string().optional()})});var Fe=m(()=>{"use strict"});var Ke=m(()=>{"use strict"});var Me=m(()=>{"use strict"});var We=m(()=>{"use strict"});var Ve=m(()=>{"use strict"});var He=m(()=>{"use strict"});var Be=m(()=>{"use strict"});var Qe=m(()=>{"use strict"});var ze=m(()=>{"use strict"});var v=m(()=>{"use strict";xe();Le();Pe();je();Y();Fe();Ke();Me();We();X();Ve();He();Be();Qe();ze()});import{Pool as Ge}from"pg";var ee,lr,b,S=m(()=>{"use strict";ee=class{pools=new Map;baseConfig=null;constructor(){this.initializeBaseConfig()}initializeBaseConfig(){let e=process.env.DATABASE_URL;if(!e)throw new Error("DATABASE_URL is not set. Please provide a database connection string.");try{let r=new URL(e);this.baseConfig={url:e,host:r.hostname,port:Number.parseInt(r.port,10)||5432,user:r.username,password:r.password}}catch(r){throw new Error(`Failed to parse DATABASE_URL: ${r}`)}}buildConnectionString(e){if(!this.baseConfig)throw new Error("Base configuration not initialized");if(!e){let r=this.baseConfig.url;r&&(e=new URL(r).pathname.slice(1))}try{let r=new URL(this.baseConfig.url);return r.pathname=`/${e}`,r.toString()}catch(r){throw new Error(`Failed to build connection string for database "${e}": ${r instanceof Error?r.message:String(r)}`)}}getPool(e){let r=this.buildConnectionString(e);if(!this.pools.has(r)){let o={connectionString:r,max:10,idleTimeoutMillis:3e4,connectionTimeoutMillis:2e3},a=new Ge(o);a.on("error",n=>{}),this.pools.set(r,a)}return this.pools.get(r)??new Ge({connectionString:r})}async closePool(e){let r=this.pools.get(e);r&&(await r.end(),this.pools.delete(e))}async closePoolByDatabase(e){let r=this.buildConnectionString(e);await this.closePool(r)}async closeAll(){let e=Array.from(this.pools.entries()).map(async([r,o])=>{await o.end()});await Promise.all(e),this.pools.clear()}getActivePools(){return Array.from(this.pools.keys())}},lr=new ee,b=t=>lr.getPool(t)});var K,te=m(()=>{"use strict";v();S();K=async(t,e)=>{let o=await b(e).connect();try{return(await o.query(`
|
|
3
3
|
SELECT
|
|
4
4
|
c.column_name as "columnName",
|
|
5
5
|
c.data_type as "dataType",
|
|
@@ -48,18 +48,18 @@ var Nt=Object.defineProperty;var f=(t,e)=>()=>(t&&(e=t(t=0)),e);var vt=(t,e)=>{f
|
|
|
48
48
|
WHERE c.table_schema = 'public'
|
|
49
49
|
AND c.table_name = $1
|
|
50
50
|
ORDER BY c.ordinal_position;
|
|
51
|
-
`,[t])).rows.map(n=>{let s=null;return n.enumValues&&(Array.isArray(n.enumValues)?s=n.enumValues:typeof n.enumValues=="string"&&(s=n.enumValues.replace(/[{}]/g,"").split(",").filter(Boolean))),{columnName:n.columnName,dataType:
|
|
51
|
+
`,[t])).rows.map(n=>{let s=null;return n.enumValues&&(Array.isArray(n.enumValues)?s=n.enumValues:typeof n.enumValues=="string"&&(s=n.enumValues.replace(/[{}]/g,"").split(",").filter(Boolean))),{columnName:n.columnName,dataType:Ae(n.dataType),dataTypeLabel:$e(n.dataType),isNullable:n.isNullable,columnDefault:n.columnDefault,isPrimaryKey:n.isPrimaryKey,isForeignKey:n.isForeignKey,referencedTable:n.referencedTable,referencedColumn:n.referencedColumn,enumValues:s}})}finally{o.release()}}});async function mr(){let t=await x.connect();try{return(await t.query(`
|
|
52
52
|
SELECT table_name
|
|
53
53
|
FROM information_schema.tables
|
|
54
54
|
WHERE table_schema = 'public'
|
|
55
55
|
AND table_type = 'BASE TABLE'
|
|
56
56
|
ORDER BY table_name;
|
|
57
|
-
`)).rows.map(r=>r.table_name)}finally{t.release()}}async function
|
|
57
|
+
`)).rows.map(r=>r.table_name)}finally{t.release()}}async function ur(t){let e=await x.connect();try{return(await e.query(`
|
|
58
58
|
SELECT obj_description(oid) as description
|
|
59
59
|
FROM pg_class
|
|
60
60
|
WHERE relname = $1
|
|
61
61
|
AND relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = 'public');
|
|
62
|
-
`,[t])).rows[0]?.description||void 0}finally{e.release()}}async function
|
|
62
|
+
`,[t])).rows[0]?.description||void 0}finally{e.release()}}async function dr(t){let e=await x.connect();try{return(await e.query(`SELECT * FROM "${t}" LIMIT 3`)).rows}catch{return[]}finally{e.release()}}function pr(t){let e={name:t.columnName,type:t.dataTypeLabel,nullable:t.isNullable};return t.isPrimaryKey&&(e.isPrimaryKey=!0),t.isForeignKey&&t.referencedTable&&t.referencedColumn&&(e.foreignKey=`${t.referencedTable}.${t.referencedColumn}`),t.enumValues&&t.enumValues.length>0&&(e.enumValues=t.enumValues,e.description=`Enum values: ${t.enumValues.join(", ")}`),e}function fr(t){let e=[];for(let r of t)for(let o of r.columns)if(o.foreignKey){let[a,n]=o.foreignKey.split(".");e.push({fromTable:r.name,fromColumn:o.name,toTable:a,toColumn:n})}return e}async function gr(t={}){let{includeSampleData:e=!1,includeDescriptions:r=!0}=t;try{let a=(await mr()).map(async i=>{let[d,u,p]=await Promise.all([K(i),r?ur(i):Promise.resolve(void 0),e?dr(i):Promise.resolve([])]),c={name:i,columns:d.map(pr)};return u&&(c.description=u),p.length>0&&(c.sampleData=p),c}),n=await Promise.all(a),s=fr(n);return{dbType:"PostgreSQL",tables:n,relationships:s}}catch(o){throw new Error(`Failed to fetch database schema: ${o instanceof Error?o.message:"Unknown error"}`)}}async function Ye(){return gr({includeSampleData:!0,includeDescriptions:!0})}var Je=m(()=>{"use strict";G();te()});function Xe(t){return`You are a database assistant for db-studio. Your responses must be CONCISE and FOCUSED.
|
|
63
63
|
|
|
64
64
|
**Your Role:**
|
|
65
65
|
1. Keep responses SHORT - 2-3 sentences maximum unless generating SQL
|
|
@@ -74,7 +74,7 @@ var Nt=Object.defineProperty;var f=(t,e)=>()=>(t&&(e=t(t=0)),e);var vt=(t,e)=>{f
|
|
|
74
74
|
6. No preamble, no apologies, get straight to the answer
|
|
75
75
|
|
|
76
76
|
**Database Context:**
|
|
77
|
-
${
|
|
77
|
+
${br(t)}
|
|
78
78
|
|
|
79
79
|
**Guidelines:**
|
|
80
80
|
1. Always generate syntactically correct SQL for the database type (${t.dbType})
|
|
@@ -112,7 +112,7 @@ LIMIT 5;
|
|
|
112
112
|
|
|
113
113
|
This will return the 5 customers with the highest total order value. You might also want to see:
|
|
114
114
|
- Revenue trends over time for these customers
|
|
115
|
-
- Their most frequently ordered products"`}function
|
|
115
|
+
- Their most frequently ordered products"`}function br(t){let e=`Database Type: ${t.dbType}
|
|
116
116
|
|
|
117
117
|
`;e+=`**Tables and Columns:**
|
|
118
118
|
`;for(let r of t.tables){e+=`
|
|
@@ -126,7 +126,7 @@ This will return the 5 customers with the highest total order value. You might a
|
|
|
126
126
|
`)}if(t.relationships&&t.relationships.length>0){e+=`
|
|
127
127
|
**Relationships:**
|
|
128
128
|
`;for(let r of t.relationships)e+=` - ${r.fromTable}.${r.fromColumn} -> ${r.toTable}.${r.toColumn}
|
|
129
|
-
`}return e}var
|
|
129
|
+
`}return e}var Ze=m(()=>{"use strict"});import{Hono as yr}from"hono";var re,et=m(()=>{"use strict";q();Je();Ze();re=new yr;re.post("/",async t=>{try{let{messages:e,conversationId:r}=await t.req.json(),o=await Ye(),a=Xe(o),n={messages:e,conversationId:r,systemPrompt:a},s=await fetch(`${R.PROXY_URL}/chat`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(n)});if(!s.ok){let u=await s.json();return t.json({error:u.error||"Proxy request failed"},s.status)}let{readable:i,writable:d}=new TransformStream;return s.body?.pipeTo(d),new Response(i,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}catch(e){let r=e instanceof Error?e.message:"An error occurred";return t.json({error:r},500)}})});var A,M=m(()=>{"use strict";A=(t,e,r)=>{let o=e instanceof Error?e.message:r,a=!1;return e&&typeof e=="object"&&"code"in e?a=e.code==="ECONNREFUSED":e&&typeof e=="object"&&"errors"in e&&Array.isArray(e.errors)&&(a=e.errors?.some(s=>s.code==="ECONNREFUSED")??!1),a?t.json({success:!1,message:"Cannot connect to database. Please check your DATABASE_URL and ensure the database server is running.",error:o},503):t.json({success:!1,message:o},500)}});import{zValidator as tt}from"@hono/zod-validator";import{Hono as hr}from"hono";var oe,rt=m(()=>{"use strict";v();te();M();oe=new hr;oe.get("/",tt("param",F),tt("query",T),async t=>{try{let{tableName:e}=t.req.valid("param"),{database:r}=t.req.valid("query"),o=await K(e,r);return t.json(o)}catch(e){return A(t,e,"Failed to fetch columns")}})});var Er,wr,ot,nt=m(()=>{"use strict";S();Er=t=>{if(t.length===0)return{clause:"",values:[]};let e=[],r=[];for(let o of t){let a=r.length+1,n=`"${o.columnName}"`;switch(o.operator){case"=":case"!=":case">":case">=":case"<":case"<=":e.push(`${n} ${o.operator} $${a}`),r.push(o.value);break;case"is":o.value.toLowerCase()==="null"?e.push(`${n} IS NULL`):(e.push(`${n} = $${a}`),r.push(o.value));break;case"is not":o.value.toLowerCase()==="null"?e.push(`${n} IS NOT NULL`):(e.push(`${n} != $${a}`),r.push(o.value));break;case"like":e.push(`${n}::text LIKE $${a}`),r.push(o.value);break;case"not like":e.push(`${n}::text NOT LIKE $${a}`),r.push(o.value);break;case"ilike":e.push(`${n}::text ILIKE $${a}`),r.push(o.value);break;case"not ilike":e.push(`${n}::text NOT ILIKE $${a}`),r.push(o.value);break;default:break}}return e.length===0?{clause:"",values:[]}:{clause:`WHERE ${e.join(" AND ")}`,values:r}},wr=(t,e)=>Array.isArray(t)?t.length===0?"":`ORDER BY ${t.map(o=>`"${o.columnName}" ${o.direction.toUpperCase()}`).join(", ")}`:t&&typeof t=="string"?`ORDER BY "${t}" ${e?.toUpperCase()||"ASC"}`:"",ot=async(t,e=1,r=50,o="",a="asc",n=[],s)=>{let i=wr((Array.isArray(o),o),a),{clause:d,values:u}=Er(n),c=await b(s).connect();try{let g=(e-1)*r,w=await c.query(`SELECT COUNT(*) as total FROM "${t}" ${d}`,u),y=Number(w.rows[0].total),E=Math.ceil(y/r),N=u.length+1,h=u.length+2;return{data:(await c.query(`SELECT * FROM "${t}" ${d} ${i} LIMIT $${N} OFFSET $${h}`,[...u,r,g])).rows,meta:{page:e,limit:r,total:y,totalPages:E,hasNextPage:e<E,hasPreviousPage:e>1}}}finally{c.release()}}});import{zValidator as at}from"@hono/zod-validator";import{Hono as Tr}from"hono";var ne,st=m(()=>{"use strict";v();nt();M();ne=new Tr;ne.get("/",at("param",F),at("query",Oe),async t=>{try{let{tableName:e}=t.req.valid("param"),{page:r,pageSize:o,sort:a,order:n,filters:s}=t.req.valid("query"),i="";if(a)try{let p=JSON.parse(a);Array.isArray(p)?i=p:i=a}catch{i=a}let d=t.req.query("database"),u=await ot(e,r,o,i,n,s,d);return t.json(u)}catch(e){return A(t,e,"Failed to fetch table data")}})});async function it(){return(await b().query(`
|
|
130
130
|
SELECT
|
|
131
131
|
d.datname as name,
|
|
132
132
|
pg_size_pretty(pg_database_size(d.datname)) as size,
|
|
@@ -135,7 +135,7 @@ This will return the 5 customers with the highest total order value. You might a
|
|
|
135
135
|
FROM pg_catalog.pg_database d
|
|
136
136
|
WHERE d.datistemplate = false
|
|
137
137
|
ORDER BY d.datname;
|
|
138
|
-
`)).rows}async function
|
|
138
|
+
`)).rows}async function ct(){return(await b().query("SELECT current_database() as database;")).rows[0]}async function lt(){let o=(await b().query(`
|
|
139
139
|
SELECT
|
|
140
140
|
version() as version,
|
|
141
141
|
current_database() as database,
|
|
@@ -144,7 +144,7 @@ This will return the 5 customers with the highest total order value. You might a
|
|
|
144
144
|
inet_server_port() as port,
|
|
145
145
|
(SELECT count(*) FROM pg_stat_activity WHERE datname = current_database()) as active_connections,
|
|
146
146
|
(SELECT setting::int FROM pg_settings WHERE name = 'max_connections') as max_connections;
|
|
147
|
-
`)).rows[0],a=process.env.DATABASE_URL,n="localhost",s=5432;if(a)try{let i=new URL(a);n=i.hostname,s=Number.parseInt(i.port,10)||5432}catch{}return{host:o.host||n,port:o.port||s,user:o.user,database:o.database,version:o.version,activeConnections:Number.parseInt(o.active_connections,10),maxConnections:Number.parseInt(o.max_connections,10)}}var
|
|
147
|
+
`)).rows[0],a=process.env.DATABASE_URL,n="localhost",s=5432;if(a)try{let i=new URL(a);n=i.hostname,s=Number.parseInt(i.port,10)||5432}catch{}return{host:o.host||n,port:o.port||s,user:o.user,database:o.database,version:o.version,activeConnections:Number.parseInt(o.active_connections,10),maxConnections:Number.parseInt(o.max_connections,10)}}var mt=m(()=>{"use strict";S()});import{Hono as Sr}from"hono";var I,ut=m(()=>{"use strict";mt();I=new Sr;I.get("/",async t=>{try{let e=await it();return t.json(e)}catch{return t.json({error:"Failed to fetch databases list"},500)}});I.get("/current",async t=>{try{let e=await ct();return t.json(e)}catch{return t.json({error:"Failed to fetch current database"},500)}});I.get("/connection",async t=>{try{let e=await lt();return t.json(e)}catch{return t.json({error:"Failed to fetch database connection info"},500)}})});var dt,pt=m(()=>{"use strict";S();dt=async t=>{let{query:e,database:r}=t,a=await b(r).connect();try{if(!e||!e.trim())throw new Error("Query cannot be empty");let n=e.trim().replace(/;+$/,""),s=performance.now(),i=await a.query(n),d=performance.now()-s;return{columns:i.fields.map(p=>p.name),rows:i.rows,rowCount:i.rows.length,duration:d,message:i.rows.length===0?"OK":void 0}}catch(n){let s=n instanceof Error?n.message:"Unknown error occurred";throw new Error(s)}finally{a.release()}}});import{zValidator as Nr}from"@hono/zod-validator";import{Hono as Rr}from"hono";var ae,ft=m(()=>{"use strict";v();pt();ae=new Rr;ae.post("/",Nr("json",Ue),async t=>{try{let{query:e}=t.req.valid("json"),r=t.req.query("database"),o=await dt({query:e,database:r});return t.json(o)}catch(e){let r=e instanceof Error?e.message:"Unknown error";return t.json({status:"error",error:r},500)}})});var se,Dr,gt,bt,yt=m(()=>{"use strict";S();se=async(t,e)=>(await b(e).query(`
|
|
148
148
|
SELECT
|
|
149
149
|
tc.constraint_name,
|
|
150
150
|
tc.table_name as referencing_table,
|
|
@@ -160,39 +160,39 @@ This will return the 5 customers with the highest total order value. You might a
|
|
|
160
160
|
AND ccu.table_schema = tc.table_schema
|
|
161
161
|
WHERE tc.constraint_type = 'FOREIGN KEY'
|
|
162
162
|
AND ccu.table_name = $1
|
|
163
|
-
`,[t])).rows.map(({row:n})=>({constraintName:n.constraint_name,referencingTable:n.referencing_table,referencingColumn:n.referencing_column,referencedTable:n.referenced_table,referencedColumn:n.referenced_column})),
|
|
164
|
-
SELECT * FROM "${
|
|
165
|
-
WHERE "${
|
|
163
|
+
`,[t])).rows.map(({row:n})=>({constraintName:n.constraint_name,referencingTable:n.referencing_table,referencingColumn:n.referencing_column,referencedTable:n.referenced_table,referencedColumn:n.referenced_column})),Dr=async(t,e,r)=>{let o=await se(t,r);if(o.length===0)return[];let a=[],n=b(r),s=new Map;for(let d of o){let u=`${d.referencingTable}.${d.referencingColumn}`;s.has(u)||s.set(u,[]),s.get(u)?.push(d)}let i=e.map(d=>d.value);for(let[d,u]of s){let p=u[0];if(!p||!e.find(y=>y.columnName===p.referencedColumn))continue;let g=i.map((y,E)=>`$${E+1}`).join(", "),w=`
|
|
164
|
+
SELECT * FROM "${p.referencingTable}"
|
|
165
|
+
WHERE "${p.referencingColumn}" IN (${g})
|
|
166
166
|
LIMIT 100
|
|
167
|
-
`;try{let y=await n.query(w,i);y.rows.length>0&&a.push({tableName:
|
|
167
|
+
`;try{let y=await n.query(w,i);y.rows.length>0&&a.push({tableName:p.referencingTable,columnName:p.referencingColumn,constraintName:p.constraintName,records:y.rows})}catch{}}return a},gt=async t=>{let{tableName:e,primaryKeys:r,database:o}=t,n=await b(o).connect();try{await n.query("BEGIN");let s=r[0]?.columnName;if(!s)throw new Error("Primary key column name is required");let i=r.map(c=>c.value),d=i.map((c,g)=>`$${g+1}`).join(", "),u=`
|
|
168
168
|
DELETE FROM "${e}"
|
|
169
|
-
WHERE "${s}" IN (${
|
|
169
|
+
WHERE "${s}" IN (${d})
|
|
170
170
|
RETURNING *
|
|
171
|
-
`,
|
|
172
|
-
SELECT "${
|
|
173
|
-
WHERE "${
|
|
174
|
-
`,
|
|
171
|
+
`,p=await n.query(u,i);return await n.query("COMMIT"),{success:!0,message:`Successfully deleted ${p.rowCount} ${p.rowCount===1?"record":"records"} from "${e}"`,deletedCount:p.rowCount??0}}catch(s){if(await n.query("ROLLBACK"),s.code==="23503")return{success:!1,message:"Cannot delete: Records are referenced by other tables",fkViolation:!0,relatedRecords:await Dr(e,r)};throw s}finally{n.release()}},bt=async t=>{let{tableName:e,primaryKeys:r,database:o}=t,n=await b(o).connect();try{await n.query("BEGIN");let s=r[0]?.columnName;if(!s)throw new Error("Primary key column name is required");let i=r.map(h=>h.value),d=await se(e,o),u=0,p=new Set,c=async(h,L,O)=>{let Ot=await se(h,o);for(let P of Ot){let H=O.map((me,Ft)=>`$${Ft+1}`).join(", "),jt=`
|
|
172
|
+
SELECT "${P.referencedColumn}" FROM "${h}"
|
|
173
|
+
WHERE "${L}" IN (${H})
|
|
174
|
+
`,le=(await n.query(jt,O)).rows.map(({row:me})=>me[P.referencedColumn]);le.length>0&&await c(P.referencingTable,P.referencingColumn,le)}let qt=O.map((P,H)=>`$${H+1}`).join(", "),kt=`
|
|
175
175
|
DELETE FROM "${h}"
|
|
176
|
-
WHERE "${
|
|
177
|
-
`,
|
|
176
|
+
WHERE "${L}" IN (${qt})
|
|
177
|
+
`,Ut=await n.query(kt,O);u+=Ut.rowCount??0,p.add(h)};for(let h of d)p.has(h.referencingTable)||await c(h.referencingTable,h.referencingColumn,i);let g=i.map((h,L)=>`$${L+1}`).join(", "),w=`
|
|
178
178
|
DELETE FROM "${e}"
|
|
179
179
|
WHERE "${s}" IN (${g})
|
|
180
180
|
RETURNING *
|
|
181
|
-
`,y=await n.query(w,i);await n.query("COMMIT");let E=y.rowCount??0;return{success:!0,message:u>0?`Successfully deleted ${E} ${E===1?"record":"records"} from "${e}" and ${u} related ${u===1?"record":"records"} from other tables`:`Successfully deleted ${E} ${E===1?"record":"records"} from "${e}"`,deletedCount:E+u}}catch(s){throw await n.query("ROLLBACK"),s}finally{n.release()}}});var
|
|
181
|
+
`,y=await n.query(w,i);await n.query("COMMIT");let E=y.rowCount??0;return{success:!0,message:u>0?`Successfully deleted ${E} ${E===1?"record":"records"} from "${e}" and ${u} related ${u===1?"record":"records"} from other tables`:`Successfully deleted ${E} ${E===1?"record":"records"} from "${e}"`,deletedCount:E+u}}catch(s){throw await n.query("ROLLBACK"),s}finally{n.release()}}});var ht,Et=m(()=>{"use strict";S();ht=async t=>{let{tableName:e,data:r,database:o}=t,n=await b(o).connect();try{let s=Object.keys(r),i=Object.values(r),d=s.map((g,w)=>`$${w+1}`).join(", "),u=s.map(g=>`"${g}"`).join(", "),p=`
|
|
182
182
|
INSERT INTO "${e}" (${u})
|
|
183
|
-
VALUES (${
|
|
183
|
+
VALUES (${d})
|
|
184
184
|
RETURNING *
|
|
185
|
-
`,
|
|
185
|
+
`,c=await n.query(p,i);return{success:!0,message:`Record inserted into "${e}" successfully`,data:c.rows[0]}}catch(s){throw s}finally{n.release()}}});var wt,Tt=m(()=>{"use strict";S();wt=async t=>{let{tableName:e,updates:r,primaryKey:o="id",database:a}=t,s=await b(a).connect();try{await s.query("BEGIN");let i=new Map;for(let p of r){let c=p.rowData[o];if(c===void 0)throw new Error(`Primary key "${o}" not found in row data. Please ensure the row has a primary key.`);i.has(c)||i.set(c,[]),i.get(c)?.push({columnName:p.columnName,value:p.value,rowData:p.rowData})}let d=[],u=0;for(let[p,c]of i.entries()){let g=c.map((N,h)=>`"${N.columnName}" = $${h+1}`),w=c.map(N=>N.value!==null&&typeof N.value=="object"?JSON.stringify(N.value):N.value);w.push(p);let y=`
|
|
186
186
|
UPDATE "${e}"
|
|
187
187
|
SET ${g.join(", ")}
|
|
188
188
|
WHERE "${o}" = $${w.length}
|
|
189
189
|
RETURNING *
|
|
190
|
-
`,E=await s.query(y,w);if(E.rowCount===0)throw new Error(`Record with ${o} = ${
|
|
190
|
+
`,E=await s.query(y,w);if(E.rowCount===0)throw new Error(`Record with ${o} = ${p} not found in table "${e}"`);d.push(E.rows[0]),u+=E.rowCount||0}return await s.query("COMMIT"),{success:!0,message:`Successfully updated ${u} ${u===1?"row":"rows"} in "${e}"`,data:d,updatedCount:u}}catch(i){throw await s.query("ROLLBACK"),i}finally{s.release()}}});import{zValidator as _}from"@hono/zod-validator";import{Hono as _r}from"hono";var $,St=m(()=>{"use strict";v();yt();Et();Tt();$=new _r;$.post("/",_("json",qe),_("query",T),async t=>{try{let e=t.req.valid("json"),{tableName:r,data:o}=e,{database:a}=t.req.valid("query"),n=await ht({tableName:r,data:o,database:a});return t.json(n)}catch(e){let r=e&&typeof e=="object"&&"detail"in e?e.detail:void 0;return t.json({success:!1,message:e instanceof Error?e.message:"Failed to create record",detail:r},500)}});$.patch("/",_("json",ke),_("query",T),async t=>{try{let e=t.req.valid("json"),{tableName:r,updates:o,primaryKey:a}=e,{database:n}=t.req.valid("query"),s=await wt({tableName:r,updates:o,primaryKey:a,database:n});return t.json(s)}catch(e){let r=e&&typeof e=="object"&&"detail"in e?e.detail:void 0;return t.json({success:!1,message:e instanceof Error?e.message:"Failed to update records",detail:r},500)}});$.delete("/",_("json",Z),_("query",T),async t=>{try{let e=t.req.valid("json"),{tableName:r,primaryKeys:o}=e,{database:a}=t.req.valid("query"),n=await gt({tableName:r,primaryKeys:o,database:a});return n.fkViolation?t.json(n,409):t.json(n)}catch(e){let r=e&&typeof e=="object"&&"detail"in e?e.detail:void 0;return t.json({success:!1,message:e instanceof Error?e.message:"Failed to delete records",detail:r},500)}});$.delete("/force",_("json",Z),_("query",T),async t=>{try{let e=t.req.valid("json"),{tableName:r,primaryKeys:o}=e,{database:a}=t.req.valid("query"),n=await bt({tableName:r,primaryKeys:o,database:a});return t.json(n)}catch(e){let r=e&&typeof e=="object"&&"detail"in e?e.detail:void 0;return t.json({success:!1,message:e instanceof Error?e.message:"Failed to force delete records",detail:r},500)}})});var Nt,Rt=m(()=>{"use strict";S();Nt=async(t,e)=>{let{tableName:r,fields:o,foreignKeys:a}=t,s=await b(e).connect();try{let i=o.map(c=>{let g=`"${c.columnName}" ${c.columnType}`;return c.isArray&&(g+="[]"),c.isPrimaryKey&&(g+=" PRIMARY KEY"),c.isUnique&&!c.isPrimaryKey&&(g+=" UNIQUE"),c.isNullable||(g+=" NOT NULL"),c.isIdentity&&(g+=" GENERATED ALWAYS AS IDENTITY"),c.defaultValue&&!c.isIdentity&&(g+=` DEFAULT ${c.defaultValue}`),g}),d=a?.map(c=>`CONSTRAINT "${`fk_${r}_${c.columnName}_${c.referencedTable}_${c.referencedColumn}`}" FOREIGN KEY ("${c.columnName}") REFERENCES "${c.referencedTable}" ("${c.referencedColumn}") ON UPDATE ${c.onUpdate} ON DELETE ${c.onDelete}`)||[],u=[...i,...d],p=`
|
|
191
191
|
CREATE TABLE "${r}" (
|
|
192
192
|
${u.join(`,
|
|
193
193
|
`)}
|
|
194
194
|
);
|
|
195
|
-
`;return await s.query(
|
|
195
|
+
`;return await s.query(p),{success:!0,tableName:r,message:`Table "${r}" created successfully`}}catch(i){throw i}finally{s.release()}}});var Dt,_t=m(()=>{"use strict";S();Dt=async t=>{let r=await b(t).connect();try{return(await r.query(`
|
|
196
196
|
SELECT
|
|
197
197
|
t.table_name as "tableName",
|
|
198
198
|
COALESCE(s.n_live_tup, 0) as "rowCount"
|
|
@@ -201,5 +201,5 @@ This will return the 5 customers with the highest total order value. You might a
|
|
|
201
201
|
WHERE t.table_schema = 'public'
|
|
202
202
|
AND t.table_type = 'BASE TABLE'
|
|
203
203
|
ORDER BY t.table_name;
|
|
204
|
-
`)).rows.map(a=>({tableName:a.tableName,rowCount:Number(a.rowCount)}))}finally{r.release()}}});import{zValidator as
|
|
204
|
+
`)).rows.map(a=>({tableName:a.tableName,rowCount:Number(a.rowCount)}))}finally{r.release()}}});import{zValidator as ie}from"@hono/zod-validator";import{Hono as vr}from"hono";var W,vt=m(()=>{"use strict";v();Rt();_t();M();W=new vr;W.get("/",ie("query",T),async t=>{try{let{database:e}=t.req.valid("query"),r=await Dt(e);return t.json(r)}catch(e){return A(t,e,"Failed to fetch tables")}});W.post("/",ie("json",Ie),ie("query",T),async t=>{try{let e=t.req.valid("json"),{database:r}=t.req.valid("query"),o=await Nt(e,r);return t.json(o)}catch(e){let r=e&&typeof e=="object"&&"detail"in e?e.detail:void 0;return t.json({success:!1,message:e instanceof Error?e.message:"Failed to create table",detail:r},500)}})});import{Hono as Cr}from"hono";var Ct,xr,Ar,xt,At=m(()=>{"use strict";G();Ct=async()=>{let t=await x.connect();try{return await t.query("SELECT 1"),{success:!0}}catch(e){return{success:!1,error:e instanceof Error?e.message:"Unknown error"}}finally{t.release()}},xr=5e3,Ar=1e4,xt=t=>{let e=new Cr;return e.get("/",t(()=>{let r;return{onOpen:async(o,a)=>{try{let n=await Ct();a.send(JSON.stringify({...n,status:n.success?"connected":"failed",timestamp:new Date().toISOString()}))}catch{a.send(JSON.stringify({success:!1,status:"failed",error:"Initial check failed",timestamp:new Date().toISOString()}))}r=setInterval(async()=>{try{let n=await Promise.race([Ct(),new Promise((s,i)=>setTimeout(()=>i({success:!1,error:"Database check timeout"}),Ar))]);a.send(JSON.stringify({...n,status:n.success?"connected":"failed",timestamp:new Date().toISOString()}))}catch(n){a.send(JSON.stringify({success:!1,status:"failed",error:n instanceof Error?n.message:"Check failed",timestamp:new Date().toISOString()}))}},xr)},onMessage(o,a){},onClose:()=>{r&&clearInterval(r)},onError:o=>{r&&clearInterval(r)}}})),e}});var Pt={};Mt(Pt,{createServer:()=>qr});import V from"path";import{fileURLToPath as $r}from"url";import{serveStatic as $t}from"@hono/node-server/serve-static";import{createNodeWebSocket as Lr}from"@hono/node-ws";import{Hono as Pr}from"hono";import{cors as Ir}from"hono/cors";import{logger as Or}from"hono/logger";var Lt,qr,It=m(()=>{"use strict";et();rt();st();ut();ft();St();vt();At();Lt=()=>{if(process.env.NODE_ENV==="development")return V.resolve(process.cwd(),"../core/dist");let t=V.dirname($r(import.meta.url));return V.resolve(t,"./core-dist")},qr=()=>{let t=new Pr({strict:!1}),{upgradeWebSocket:e,injectWebSocket:r}=Lr({app:t});return t.use("/*",Ir()),process.env.NODE_ENV==="development"&&t.use(Or()),t.use("/favicon.ico",$t({path:V.resolve(Lt(),"favicon.ico")})),t.use("*",async(o,a)=>{o.header("Access-Control-Allow-Origin","*"),o.header("Access-Control-Allow-Methods","GET, POST, PUT, DELETE, OPTIONS"),o.header("Access-Control-Allow-Headers","Content-Type"),await a()}),t.route("/ws",xt(e)),t.route("/databases",I),t.route("/tables",W),t.route("/tables/:tableName/columns",oe),t.route("/tables/:tableName/data",ne),t.route("/records",$),t.route("/query",ae),t.route("/chat",re),t.use("/*",$t({root:Lt()})),{app:t,injectWebSocket:r}}});q();import{intro as kr,outro as Ur}from"@clack/prompts";import{serve as jr}from"@hono/node-server";import Fr from"open";import ce from"picocolors";import{program as be}from"commander";var ye=()=>(be.name("db-studio").option("-e, --env <path>","Path to custom .env file").option("-p, --port <port>","Port to run the server on").option("-d, --database-url <url>","Database URL to use").option("-n, --var-name <name>","Custom environment variable name (default: DATABASE_URL)").option("-s, --status","Show status of the server").option("-h, --help","Show help").option("-v, --version","Show version").parse(process.argv),be.opts());import{readFile as Wt}from"fs/promises";import{resolve as Vt}from"path";import{cancel as k,isCancel as Q,note as he,select as Ht,spinner as Bt,text as Ee}from"@clack/prompts";import{parse as Qt}from"dotenv";import z from"picocolors";var we=async(t,e)=>{let r=e||"DATABASE_URL";if(t?.[r])return t[r];let o=Bt();o.start("Looking for database connection..."),t?he(z.red(`${r} not found in .env`)):he(z.red("No .env file found in current directory"));let a=await Ht({message:`How do you want to provide ${r}?`,options:[{value:"manual",label:"Enter connection string manually"},{value:"other-env",label:"Use different .env file"},{value:"cancel",label:"Cancel / Exit"}],initialValue:"manual"});if((Q(a)||a==="cancel")&&(k("No database connection provided. Exiting..."),process.exit(0)),a==="other-env"){o.start("Waiting for path...");let s=await Ee({message:"Enter path to .env file",placeholder:"~/projects/myapp/.env.local or ./special.env",validate(d){if(!d.trim())return"Path is required"}});Q(s)&&(k("Cancelled."),process.exit(0)),o.stop("Trying custom .env...");let i=Vt(s);try{let d=await Wt(i,"utf-8"),u=Qt(d);if(u[r])return u[r];throw new Error(`${r} still missing in custom file`)}catch(d){let u=d;k(`Cannot read or parse file: ${z.dim(u.message)}`),process.exit(1)}}o.stop("Manual input...");let n=await Ee({message:`Paste your ${r}`,placeholder:"postgresql://user:password@localhost:5432/mydb",validate(s){if(!s.trim())return"Connection string is required!";try{new URL(s);return}catch{return"Must be a valid URL format"}}});return Q(n)&&(k("Cancelled."),process.exit(0)),n.trim()};import{access as zt,readFile as Gt}from"fs/promises";import{resolve as Te}from"path";import{parse as Yt}from"dotenv";var C=async t=>{let e=t?Te(t):Te(process.cwd(),".env");try{await zt(e);let r=await Gt(e,"utf-8");return Yt(r)}catch(r){if(r instanceof Error&&r.message.includes("ENOENT"))return null;throw r}};B();import{intro as Jt,outro as Xt}from"@clack/prompts";import Se from"picocolors";var Ne=()=>{Jt(Se.inverse(" db-studio ")),Xt(Se.green(`For more information, visit: ${fe.SITE_DOCS_LINK}`))};q();import{intro as Zt,note as er,outro as Re}from"@clack/prompts";import U from"picocolors";var De=async(t,e,r)=>{Zt(U.inverse(" db-studio "));let o=r||R.VAR_NAME,a=null;if(e)a=e;else{let n=t?await C(t):await C(R.ENV);n?.[o]&&(a=n[o])}a?Re(U.green(`\u2713 Database connection configured (using ${o})`)):(er(U.red(`\u2717 ${o} not found`),"Status"),Re(U.yellow("\u26A0 No database connection configured")))};import{intro as rr,outro as or}from"@clack/prompts";import ve from"picocolors";var _e={name:"db-studio",type:"module",version:"1.2.9",description:"Modern database client for PostgreSQL with spreadsheet-like grid, AI-powered SQL assistance, ER diagrams, fast data browsing and editing. CLI tool, upcoming desktop & web versions.",keywords:["database","database client","postgres","postgresql","database gui","sql client","database studio","postgres gui","ai sql","sql editor","er diagram","database management","data browser","spreadsheet database","postgres admin","mysql client","sqlite client","database tool","developer tools"],author:"H\xFCsam \u{1F951} <devhsmq@gmail.com>",homepage:"https://dbstudio.sh",repository:{type:"git",url:"git+https://github.com/husamql3/db-studio.git"},bugs:{url:"https://github.com/husamql3/db-studio/issues"},license:"MIT",bin:{"db-studio":"./dist/index.js"},files:["dist"],scripts:{dev:"NODE_ENV=development tsx watch src/index.ts",build:"tsup --minify --sourcemap",start:"node dist/index.js",check:"biome check --write --unsafe --verbose"},dependencies:{"@clack/prompts":"^0.11.0","@hono/node-server":"^1.19.7","@hono/node-ws":"^1.2.0","@hono/zod-validator":"^0.7.6",commander:"^12.1.0",dotenv:"^16.4.7",hono:"^4.10.4",open:"^10.0.2",pg:"^8.13.1",picocolors:"^1.1.1",zod:"^4.2.1"},devDependencies:{shared:"workspace:*","@biomejs/biome":"^2.2.6","@types/node":"^20.11.17","@types/pg":"^8.16.0",tsup:"^8.5.1",tsx:"^4.7.1",typescript:"^5.8.3"}};var Ce=()=>{rr(ve.inverse(" db-studio ")),or(ve.green(`\u{1F680} db-studio v${_e.version}`))};var Kr=async()=>{let{env:t,port:e,databaseUrl:r,varName:o,status:a,help:n,version:s}=ye();n&&(Ne(),process.exit(0)),s&&(Ce(),process.exit(0)),a&&(await De(t,r,o),process.exit(0)),kr(ce.inverse(" db-studio "));let i=e?parseInt(e,10):R.PORT,d=o||R.VAR_NAME,u=t?await C(t):await C(R.ENV),p=r||await we(u,d);process.env.DATABASE_URL=p;let{createServer:c}=await Promise.resolve().then(()=>(It(),Pt)),{app:g,injectWebSocket:w}=c(),y=jr({fetch:g.fetch,port:i});w(y),Ur(ce.green(`Server running at ${ce.cyan(`http://localhost:${i}`)}`)),process.env.NODE_ENV&&process.env.NODE_ENV!=="development"&&await Fr(`http://localhost:${i}`)};Kr().catch(t=>{process.exit(1)});export{Kr as main};
|
|
205
205
|
//# sourceMappingURL=index.js.map
|