PageSourceSearch

https://app.speckle.systems/_nuxt/CXsIsePb.js

js speckle.systems collected 2026-10-09 21:38:06 UTC 40,039 bytes, 224 lines download raw bytes

1import{b as He,x as Ve,aP as ke,g as Z,ab as Ge,f as x,D as Ce,c7 as We,n as De,a4 as ge,o as l,c as j,b$ as Ne,K as e,I as u,i as o,bP as Te,bl as D,k as M,J as t,bO as U,bY as fe,c3 as Qe,c0 as Me,c1 as ze,bU as Re,ca as Ee,c8 as Ke,dH as Ae,r as b,h as d,dc as Ye,a9 as me,aa as be,a1 as Je,aH as Xe,bT as Ze,u as et,w as tt,p as at,bR as st,be as nt}from"./WEeefKdr.js";import{_ as Oe}from"./C-udOVnR.js";import{_ as ot}from"./BIM5MnR_.js";import{_ as Ie}from"./CqbgGWOm.js";import{_ as lt}from"./DBDnvsHa.js";import{_ as rt}from"./BtsXZHuJ.js";import{_ as it}from"./Cmu_BONc.js";import{u as ut}from"./DwXyfwD8.js";import{_ as ct}from"./BQ2QNe2N.js";import{u as dt}from"./BONC1BrT.js";import{u as mt}from"./dmtbb0rK.js";import"./ITofZdyC.js";import"./DAEL-3gK.js";import"./DlAUqK2U.js";import"./CI7TgXTl.js";import"./DTlf9xqd.js";import"./BIedx-DL.js";import"./BGgBgLEZ.js";import"./DA_d_HHx.js";import"./Bu7SVJc9.js";const ft=Z`
2  query WorkspaceSnowflakeConnection($workspaceId: String!) {
3    workspace(id: $workspaceId) {
4      id
5      dataWarehouses {
6        encryptionPublicKey
7        snowflakeConnections {
8          id
9          workspaceId
10          account
11          username
12          authMode
13          warehouse
14          role
15          database
16          schema
17          createdAt
18          updatedAt
19          lastTestedAt
20          lastTestSucceeded
21          lastTestError
22        }
23      }
24    }
25  }
26`,pt=Z`
27  mutation UpsertSnowflakeConnection($input: UpsertWorkspaceSnowflakeConnectionInput!) {
28    workspaceMutations {
29      dataWarehouses {
30        upsertSnowflakeConnection(input: $input) {
31          id
32          workspaceId
33          account
34          username
35          authMode
36          warehouse
37          role
38          database
39          schema
40          createdAt
41          updatedAt
42          lastTestedAt
43          lastTestSucceeded
44          lastTestError
45        }
46      }
47    }
48  }
49`,vt=Z`
50  mutation TestSnowflakeConnection($workspaceId: String!) {
51    workspaceMutations {
52      dataWarehouses {
53        testSnowflakeConnection(workspaceId: $workspaceId) {
54          success
55          error
56          durationMs
57        }
58      }
59    }
60  }
61`,wt=Z`
62  mutation DeleteSnowflakeConnection($workspaceId: String!) {
63    workspaceMutations {
64      dataWarehouses {
65        deleteSnowflakeConnection(workspaceId: $workspaceId)
66      }
67    }
68  }
69`,bt=Z`
70  query BrowseSnowflakeDatabases($workspaceId: String!) {
71    workspace(id: $workspaceId) {
72      id
73      dataWarehouses {
74        snowflakeConnections {
75          id
76          databases
77        }
78      }
79    }
80  }
81`,ht=Z`
82  query BrowseSnowflakeSchemas($workspaceId: String!, $database: String!) {
83    workspace(id: $workspaceId) {
84      id
85      dataWarehouses {
86        snowflakeConnections {
87          id
88          schemas(database: $database)
89        }
90      }
91    }
92  }
93`,kt=Z`
94  query BrowseSnowflakeTables(
95    $workspaceId: String!
96    $database: String!
97    $schema: String!
98  ) {
99    workspace(id: $workspaceId) {
100      id
101      dataWarehouses {
102        snowflakeConnections {
103          id
104          tables(database: $database, schema: $schema) {
105            database
106            schema
107            name
108            fullyQualifiedName
109            kind
110          }
111          views(database: $database, schema: $schema) {
112            database
113            schema
114            name
115            fullyQualifiedName
116            kind
117          }
118        }
119      }
120    }
121  }
122`,gt=Z`
123  query BrowseSnowflakeTableColumns(
124    $workspaceId: String!
125    $database: String!
126    $schema: String!
127    $table: String!
128  ) {
129    workspace(id: $workspaceId) {
130      id
131      dataWarehouses {
132        snowflakeConnections {
133          id
134          tableColumns(database: $database, schema: $schema, table: $table) {
135            name
136            type
137            nullable
138          }
139        }
140      }
141    }
142  }
143`,yt=Z`
144  query BrowseSnowflakeTablePreview(
145    $workspaceId: String!
146    $database: String!
147    $schema: String!
148    $table: String!
149    $limit: Int
150  ) {
151    workspace(id: $workspaceId) {
152      id
153      dataWarehouses {
154        snowflakeConnections {
155          id
156          tablePreview(
157            database: $database
158            schema: $schema
159            table: $table
160            limit: $limit
161          ) {
162            columns {
163              name
164              type
165              nullable
166            }
167            rows
168            truncated
169          }
170        }
171      }
172    }
173  }
174`,xt=Z`
175  mutation RegisterSnowflakeTableAsDataSource(
176    $input: RegisterWorkspaceSnowflakeTableInput!
177  ) {
178    workspaceMutations {
179      dataWarehouses {
180        registerSnowflakeTableAsDataSource(input: $input) {
181          id
182          name
183          kind
184          tableFqn
185          lastRefreshedAt
186          status
187        }
188      }
189    }
190  }
191`,Pe=h=>{const{client:V}=He(),T=ut(),{result:H,loading:oe,refetch:ee}=Ve(ft,()=>({workspaceId:h.value??""}),()=>({enabled:!!h.value})),le=x(()=>H.value?.workspace?.dataWarehouses?.snowflakeConnections?.[0]??null),z=x(()=>!!le.value),pe=x(()=>H.value?.workspace?.dataWarehouses?.encryptionPublicKey??null),ve=async a=>{if(!pe.value)throw new Error("Snowflake encryption pubkey unavailable (workspace not loaded yet)");const y=(await T.ensure()).buildEncryptor(pe.value);
191try{return y.encrypt(JSON.stringify(a))}finally{y.dispose()}},{mutate:re,loading:K}=ke(pt),{mutate:w,loading:_}=ke(vt),{mutate:r,loading:k}=ke(wt),S=async a=>{if(!h.value)throw new Error("No workspace context");const A=a.authMode==="key_pair"?{privateKeyPem:a.keyPair?.privateKeyPem??"",...a.keyPair?.privateKeyPassphrase?{privateKeyPassphrase:a.keyPair.privateKeyPassphrase}:{}}:{token:a.pat?.token??""},y=await ve(A),R=await re({input:{workspaceId:h.value,account:a.account,username:a.username,authMode:a.authMode,warehouse:a.warehouse,role:a.role??null,database:a.database??null,schema:a.schema??null,encryptedCredentials:y}});return await ee(),R?.data?.workspaceMutations?.dataWarehouses?.upsertSnowflakeConnection??null},C=async()=>{if(!h.value)throw new Error("No workspace context");const a=await w({workspaceId:h.value});return await ee(),a?.data?.workspaceMutations?.dataWarehouses?.testSnowflakeConnection??null},W=async()=>{if(!h.value)throw new Error("No workspace context");await r({workspaceId:h.value}),await ee()},g=async()=>{if(!h.value)throw new Error("No workspace context");return(await V.query({query:bt,variables:{workspaceId:h.value},fetchPolicy:"no-cache"})).data?.workspace?.dataWarehouses?.snowflakeConnections?.[0]?.databases??[]},$=async a=>{if(!h.value)throw new Error("No workspace context");return(await V.query({query:ht,variables:{workspaceId:h.value,database:a},fetchPolicy:"no-cache"})).data?.workspace?.dataWarehouses?.snowflakeConnections?.[0]?.schemas??[]},L=async(a,A)=>{if(!h.value)throw new Error("No workspace context");const R=(await V.query({query:kt,variables:{workspaceId:h.value,database:a,schema:A},fetchPolicy:"no-cache"})).data?.workspace?.dataWarehouses?.snowflakeConnections?.[0],G=R?.tables??[],E=R?.views??[];return[...G,...E].sort((F,J)=>F.name.localeCompare(J.name))},N=async(a,A,y)=>{if(!h.value)throw new Error("No workspace context");return(await V.query({query:gt,variables:{workspaceId:h.value,database:a,schema:A,table:y},fetchPolicy:"no-cache"})).data?.workspace?.dataWarehouses?.snowflakeConnections?.[0]?.tableColumns??[]},Y=async(a,A,y,R)=>{if(!h.value)throw new Error("No workspace context");const E=(await V.query({query:yt,variables:{workspaceId:h.value,database:a,schema:A,table:y,limit:R??null},fetchPolicy:"no-cache"})).data?.workspace?.dataWarehouses?.snowflakeConnections?.[0]?.tablePreview;return{columns:E?.columns??[],rows:E?.rows??[],truncated:E?.truncated??!1}},{mutate:te,loading:ie}=ke(xt);return{connection:le,isConnected:z,loading:oe,upserting:K,testing:_,deleting:k,registering:ie,upsert:S,test:C,disconnect:W,refetch:ee,browseDatabases:g,browseSchemas:$,browseTables:L,browseTableColumns:N,browseTablePreview:Y,registerTable:async a=>{if(!h.value)throw new Error("No workspace context");const A=await te({input:{workspaceId:h.value,name:a.name,tableFqn:a.tableFqn,columnAllowlist:a.columnAllowlist,ttlSeconds:a.ttlSeconds??null}});if(A?.errors?.length)throw new Error(Ge(A.errors));return A?.data?.workspaceMutations?.dataWarehouses?.registerSnowflakeTableAsDataSource??null}}},_t={class:"flex flex-col gap-3"},St={class:"grid grid-cols-2 gap-3"},$t={class:"grid grid-cols-3 gap-3"},Et={class:"flex flex-col gap-3"},Ct={class:"flex justify-between gap-2 w-full"},Tt={class:"ml-auto flex gap-2"},Rt=Ce({__name:"SnowflakeConnectionDialog",props:Ke({workspaceId:{}},{open:{type:Boolean,required:!0},openModifiers:{}}),emits:["update:open"],setup(h){const V=h,T=We(h,"open"),H=De(),oe=x(()=>V.workspaceId),{connection:ee,upsert:le,test:z,disconnect:pe,upserting:ve,testing:re,deleting:K}=Pe(oe),w=x(()=>ee.value),_=x(()=>ve.value||re.value||K.value),r=Ae({account:"",username:"",warehouse:"",role:"",database:"",schema:"",authMode:"key_pair",privateKeyPem:"",privateKeyPassphrase:""}),k=b(null),S=b(!1);ge([w,T],([p,a])=>{a&&(r.account=p?.account??"",r.username=p?.username??"",r.warehouse=p?.warehouse??"",r.role=p?.role??"",r.database=p?.database??"",r.schema=p?.schema??"",r.authMode="key_pair",r.privateKeyPem="",r.privateKeyPassphrase="",k.value=null,S.value=!!(p?.role||p?.database||p?.schema))},{immediate:!0});const C=x(()=>!!r.privateKeyPem.trim()),W=x(()=>!!r.account.trim()&&!!r.username.trim()&&!!r.warehouse.trim()),g=x(()=>W.value?w.value?!0:C.value:!1),$=x(()=>W.value?C.value||!!w.value:!1),L=()=>({account:r.account.trim(),username:r.username.trim(),warehouse:r.warehouse.trim(),role:r.role.trim()||null,database:r.database.trim()||null,schema:r.schema.trim()||null,authMode:r.authMode,keyPair:{privateKeyPem:r.privateKeyPem,privateKeyPassphrase:r.privateKeyPassphrase||void 0}}),N=async()=>
191{if(!(!g.value||_.value)){if(w.value&&!C.value){if(w.value.account===r.account.trim()&&w.value.username===r.username.trim()&&w.value.warehouse===r.warehouse.trim()&&(w.value.role??"")===r.role.trim()&&(w.value.database??"")===r.database.trim()&&(w.value.schema??"")===r.schema.trim()){T.value=!1;return}H.add({color:"warning",title:"Re-enter credentials to change connection details",description:"Account, user, or warehouse changes require fresh credentials so we can re-encrypt the secret."});return}try{await le(L()),H.add({color:"success",title:w.value?"Snowflake connection updated":"Snowflake connected",icon:"i-lucide-check"}),T.value=!1}catch(p){H.add({color:"error",title:"Failed to save connection",description:p instanceof Error?p.message:String(p)})}}},Y=async()=>{if(!(!$.value||_.value)){if(C.value&&!w.value)try{await le(L())}catch(p){H.add({color:"error",title:"Failed to save before test",description:p instanceof Error?p.message:String(p)});return}try{const p=await z();p&&(k.value={success:p.success,error:p.error??null,durationMs:p.durationMs})}catch(p){k.value={success:!1,error:p instanceof Error?p.message:String(p),durationMs:0}}}},te=b(!1),ie=async()=>{if(!(!w.value||_.value))try{await pe(),H.add({color:"success",title:"Snowflake disconnected",icon:"i-lucide-check"}),te.value=!1,T.value=!1}catch(p){H.add({color:"error",title:"Failed to disconnect",description:p instanceof Error?p.message:String(p)})}};return(p,a)=>{const A=Ie,y=Re,R=Oe,G=ze,E=Me,F=Te,J=lt,ue=rt,ce=it,ae=Ne;return l(),j(ae,{open:T.value,"onUpdate:open":a[12]||(a[12]=v=>T.value=v),title:e(w)?"Edit Snowflake connection":"Connect Snowflake",dismissible:!1,ui:{content:"sm:max-w-lg"}},{body:u(()=>[o("form",{class:"flex flex-col gap-5",onSubmit:Qe(N,["prevent"])},[t(A,{color:"neutral",variant:"subtle",icon:"i-lucide-shield-check",title:"Credentials are encrypted in your browser before transit and stored encrypted at rest.",ui:{root:"p-2.5 items-center",title:"text-xs font-normal leading-5"}}),o("section",_t,[t(E,{label:"Account identifier",name:"account",required:""},{hint:u(()=>[t(R,{text:"Modern format orgname-account_name. Find it under Admin → Accounts in Snowflake."},{default:u(()=>[t(y,{name:"i-lucide-info",class:"size-3.5 text-muted"})]),_:1})]),default:u(()=>[t(G,{modelValue:e(r).account,"onUpdate:modelValue":a[0]||(a[0]=v=>e(r).account=v),placeholder:"myorg-account_name",class:"w-full",autofocus:""},null,8,["modelValue"])]),_:1}),o("div",St,[t(E,{label:"Service user",name:"username",required:""},{hint:u(()=>[t(R,{text:"Dedicated TYPE=SERVICE user recommended."},{default:u(()=>[t(y,{name:"i-lucide-info",class:"size-3.5 text-muted"})]),_:1})]),default:u(()=>[t(G,{modelValue:e(r).username,"onUpdate:modelValue":a[1]||(a[1]=v=>e(r).username=v),placeholder:"SPECKLE_SVC",class:"w-full"},null,8,["modelValue"])]),_:1}),t(E,{label:"Default warehouse",name:"warehouse",required:""},{hint:u(()=>[t(R,{text:"Required. Use XS for low cost."},{default:u(()=>[t(y,{name:"i-lucide-info",class:"size-3.5 text-muted"})]),_:1})]),default:u(()=>[t(G,{modelValue:e(r).warehouse,"onUpdate:modelValue":a[2]||(a[2]=v=>e(r).warehouse=v),placeholder:"ANALYTICS_WH",class:"w-full"},null,8,["modelValue"])]),_:1})]),t(J,{open:e(S),"onUpdate:open":a[6]||(a[6]=v=>fe(S)?S.value=v:null),class:"flex flex-col gap-3"},{content:u(()=>[o("div",$t,[t(E,{label:"Role",name:"role"},{hint:u(()=>[t(R,{text:"Pins least-privilege if set."},{default:u(()=>[t(y,{name:"i-lucide-info",class:"size-3.5 text-muted"})]),_:1})]),default:u(()=>[t(G,{modelValue:e(r).role,"onUpdate:modelValue":a[3]||(a[3]=v=>e(r).role=v),placeholder:"SPECKLE_READER",class:"w-full"},null,8,["modelValue"])]),_:1}),t(E,{label:"Database",name:"database"},{hint:u(()=>[t(R,{text:"Session default."},{default:u(()=>[t(y,{name:"i-lucide-info",class:"size-3.5 text-muted"})]),_:1})]),default:u(()=>[t(G,{modelValue:e(r).database,"onUpdate:modelValue":a[4]||(a[4]=v=>e(r).database=v),placeholder:"ANALYTICS",class:"w-full"},null,8,["modelValue"])]),_:1}),t(E,{label:"Schema",name:"schema"},{hint:u(()=>[t(R,{text:"Session default."},{default:u(()=>[t(y,{name:"i-lucide-info",class:"size-3.5 text-muted"})]),_:1})]),default:u(()=>[t(G,{modelValue:e(r).schema,"onUpdate:modelValue":a[5]||(a[5]=v=>e(r).schema=v),placeholder:"PUBLIC",class:"w-full"},null,8,["modelValue"])]),_:1})])]),default:u(()=>[t(F,{variant:"ghost",color:"neutral",size:"sm",class:"-mx-2 justify-start gap-1.5"},{default:u(()=>[t(y,{name:"i-lucide-chevron-right",class:Ee(["size-4 transition-transform",{"rotate-90":e(S)}])},null,8,["class"]),a[13]||(a[13]=o("span",{class:"font-semibold text-default"},"Session defaults",-1)),a[14]||(a[14]=o("span",{class:"text-muted font-normal"}," Role, database, schema — optional ",-1))]),_:1})]),_:1},8,["open"])]),o("section",Et,[t(E,{label:"Private key (PEM)",name:"privateKeyPem",required:""},{hint:u(()=>[t(R,{text:"PKCS8 RSA. Install the matching public key in Snowflake with ALTER USER ... SET RSA_PUBLIC_KEY."},{default:u(()=>[t(y,{name:"i-lucide-info",class:"size-3.5 text-muted"})]),_:1})]),default:u(()=>[t(ue,{modelValue:e(r).privateKeyPem,"onUpdate:modelValue":a[7]||(a[7]=v=>e(r).privateKeyPem=v),placeholder:e(w)?"Leave blank to keep the current key":"Paste full PKCS8 PEM here (including BEGIN/END markers)",rows:7,class:"w-full font-mono text-xs",autocomplete:"off"},null,8,["modelValue","placeholder"])]),_:1}),t(E,{label:"Key passphrase",name:"privateKeyPassphrase"},{hint:u(()=>[t(R,{text:"Only if the PEM is encrypted."},{default:u(()=>[t(y,{name:"i-lucide-info",class:"size-3.5 text-muted"})]),_:1})]),default:u(()=>[t(G,{modelValue:e(r).privateKeyPassphrase,"onUpdate:modelValue":a[8]||(a[8]=v=>e(r).privateKeyPassphrase=v),type:"password",placeholder:e(w)?"Leave blank to keep":"Optional",class:"w-full",autocomplete:"off"},null,8,["modelValue","placeholder"])]),_:1})]),e(k)?(l(),j(A,{key:0,color:e(k).success?"success":"error",variant:"subtle",title:e(k).success?`Test connection succeeded (${e(k).durationMs} ms)`:"Test connection failed",description:e(k).error||void 0,icon:"i-lucide-zap"},null,8,["color","title","description"])):M("",!0)],32)]),footer:u(()=>[o("div",Ct,[e(w)?(l(),j(F,{key:0,variant:"outline",color:"error",loading:e(K),disabled:e(_),onClick:a[9]||(a[9]=v=>te.value=!0)},{default:u(()=>[...a[15]||(a[15]=[D(" Disconnect ",-1)])]),_:1},8,["loading","disabled"])):M("",!0),o("div",Tt,[t(F,{variant:"outline",disabled:e(_),onClick:a[10]||(a[10]=v=>T.value=!1)},{default:u(()=>[...a[16]||(a[16]=[D(" Cancel ",-1)])]),_:1},8,["disabled"]),t(F,{variant:"outline",loading:e(re),disabled:e(_)||!e($),onClick:Y},{default:u(()=>[...a[17]||(a[17]=[D(" Test connection ",-1)])]),_:1},8,["loading","disabled"]),t(F,{color:"primary",loading:e(ve),disabled:e(_)||!e(g),onClick:N},{default:u(()=>[D(U(e(w)?"Save changes":"Connect"),1)]),_:1},8,["loading","disabled"])])]),t(ce,{open:e(te),"onUpdate:open":a[11]||(a[11]=v=>fe(te)?te.value=v:null),provider:"Snowflake",loading:e(K),onConfirm:ie},null,8,["open","loading"])]),_:1},8,["open","title"])}}}),At=Object.assign(Rt,{__name:"DataValidationSnowflakeConnectionDialog"}),It={class:"flex flex-col gap-4"},Pt={key:0,class:"text-muted text-xs leading-5"},Ut={key:1,class:"text-muted text-xs leading-5"},Vt={key:2,class:"flex items-center gap-2 rounded-md border border-default bg-elevated px-3 py-2 text-xs"},Wt={class:"font-mono font-medium"},Dt={key:3,class:"grid grid-cols-3 gap-2"},Nt={key:5,class:"space-y-3 border-t border-default pt-3"},Mt={class:"flex items-center justify-between"},zt={class:"flex gap-2"},Kt={key:0,class:"flex items-center gap-2 text-sm text-muted py-3"},Ot={key:1,class:"grid grid-cols-2 gap-1 max-h-56 overflow-auto rounded-md border border-default p-2 bg-elevated"},Lt={class:"font-mono font-medium"},Ft={class:"text-muted ml-auto"},qt={key:2,class:"text-xs text-muted"},Bt={key:6,class:"space-y-3 border-t border-default pt-3"},jt={class:"flex justify-end gap-2 w-full"},Ht=Ce({__name:"SnowflakeBrowseDialog",props:Ke({workspaceId:{},initialDatabase:{},initialSchema:{},initialTable:{}},{open:{type:Boolean,required:!0},openModifiers:{}}),emits:["update:open"],setup(h){const V=h,T=We(h,"open"),H=De(),oe=x(()=>V.workspaceId),{browseDatabases:ee,browseSchemas:le,browseTables:z,browseTableColumns:pe,registerTable:ve,registering:re}=Pe(oe),K=b([]),w=b([]),_=b([]),r=b([]),k=b(void 0),S=b(void 0),C=b(void 0),W=b(new Set),g=Ae({databases:!1,schemas:!1,tables:!1,columns:!1}),$=b(null),L=b(null),N=b(""),Y=b(86400),te=x(()=>K.value.map(m=>({label:m,value:m}))),ie=x(()=>w.value.map(m=>({label:m,value:m}))),p=x(()=>_.value.map(m=>({label:`${m.name} (${m.kind})`,value:m.name}))),a=x(()=>g.databases||g.schemas||g.tables||g.columns||re.value),A=/^[A-Za-z_]\w*$/,y=x(()=>
191{if(N.value&&!A.test(N.value))return"Use letters, numbers, and underscores only. Must start with a letter or underscore."}),R=x(()=>!!k.value&&!!S.value&&!!C.value&&W.value.size>0&&!!N.value&&!y.value),G=async()=>{g.databases=!0,$.value=null;try{K.value=await ee()}catch(m){$.value=m instanceof Error?m.message:String(m),K.value=[]}finally{g.databases=!1}},E=async m=>{if(S.value=void 0,C.value=void 0,w.value=[],_.value=[],r.value=[],W.value=new Set,!!m){g.schemas=!0,$.value=null;try{w.value=await le(m)}catch(n){$.value=n instanceof Error?n.message:String(n)}finally{g.schemas=!1}}},F=async m=>{if(C.value=void 0,_.value=[],r.value=[],W.value=new Set,!(!m||!k.value)){g.tables=!0,$.value=null;try{_.value=await z(k.value,m)}catch(n){$.value=n instanceof Error?n.message:String(n)}finally{g.tables=!1}}},J=async m=>{if(r.value=[],W.value=new Set,!(!m||!k.value||!S.value)){g.columns=!0,$.value=null;try{r.value=await pe(k.value,S.value,m),W.value=new Set(r.value.map(n=>n.name)),N.value||(N.value=m)}catch(n){$.value=n instanceof Error?n.message:String(n)}finally{g.columns=!1}}},ue=(m,n)=>{const I=new Set(W.value);n?I.add(m):I.delete(m),W.value=I},ce=()=>{W.value=new Set(r.value.map(m=>m.name))},ae=()=>{W.value=new Set},v=x(()=>!!(V.initialDatabase&&V.initialSchema&&V.initialTable));ge(T,async m=>{m&&(k.value=void 0,S.value=void 0,C.value=void 0,W.value=new Set,w.value=[],_.value=[],r.value=[],N.value="",Y.value=86400,L.value=null,$.value=null,v.value?(k.value=V.initialDatabase,S.value=V.initialSchema,C.value=V.initialTable,N.value=V.initialTable,await J(V.initialTable)):G())});const se=async()=>{if(!R.value||!k.value||!S.value||!C.value)return;L.value=null;const m=`${k.value}.${S.value}.${C.value}`;try{const n=await ve({name:N.value,tableFqn:m,columnAllowlist:[...W.value],ttlSeconds:Y.value&&Y.value>=60?Y.value:null});if(!n)throw new Error("Server did not return the registered data source");H.add({color:"success",title:`Registered ${m} as "${n.name}"`,description:"It will be fetched from Snowflake the first time a rule references it.",icon:"i-lucide-check"}),T.value=!1}catch(n){L.value=n instanceof Error?n.message:String(n)}};return(m,n)=>{const I=Re,q=Ye,X=Me,de=Ie,ne=Te,ye=ct,he=ze,_e=Ne;return l(),j(_e,{open:T.value,"onUpdate:open":n[6]||(n[6]=P=>T.value=P),title:e(v)?"Register data source":"Browse Snowflake tables",ui:{content:"sm:max-w-3xl"}},{body:u(()=>[o("div",It,[e(v)?(l(),d("p",Ut," Pin this table as a workspace data source. Validation rules will reference it by name; the snapshot is fetched on first use and cached on S3. ")):(l(),d("p",Pt," Pick a table from your Snowflake account and pin it as a workspace data source. Validation rules will reference it by name; the snapshot is fetched on first use and cached on S3. ")),e(v)?(l(),d("div",Vt,[t(I,{name:"i-lucide-table-2",class:"size-3.5 text-muted"}),n[7]||(n[7]=o("span",{class:"text-muted"},"Registering:",-1)),o("span",Wt,U(e(k))+"."+U(e(S))+"."+U(e(C)),1)])):(l(),d("div",Dt,[t(X,{label:"Database",name:"database"},{default:u(()=>[t(q,{modelValue:e(k),"onUpdate:modelValue":[n[0]||(n[0]=P=>fe(k)?k.value=P:null),E],items:e(te),"value-key":"value",loading:e(g).databases,disabled:e(g).databases,placeholder:"Select database",class:"w-full"},null,8,["modelValue","items","loading","disabled"])]),_:1}),t(X,{label:"Schema",name:"schema"},{default:u(()=>[t(q,{modelValue:e(S),"onUpdate:modelValue":[n[1]||(n[1]=P=>fe(S)?S.value=P:null),F],items:e(ie),"value-key":"value",loading:e(g).schemas,disabled:!e(k)||e(g).schemas,placeholder:"Select schema",class:"w-full"},null,8,["modelValue","items","loading","disabled"])]),_:1}),t(X,{label:"Table / view",name:"table"},{default:u(()=>[t(q,{modelValue:e(C),"onUpdate:modelValue":[n[2]||(n[2]=P=>fe(C)?C.value=P:null),J],items:e(p),"value-key":"value",loading:e(g).tables,disabled:!e(S)||e(g).tables,placeholder:"Select table or view",class:"w-full"},null,8,["modelValue","items","loading","disabled"])]),_:1})])),e($)?(l(),j(de,{key:4,color:"error",variant:"subtle",icon:"i-lucide-circle-alert",description:e($)},null,8,["description"])):M("",!0),e(C)?(l(),d("div",Nt,[o("div",Mt,[n[10]||(n[10]=o("h3",{class:"text-sm font-medium"},[D(" Columns "),o("span",{class:"text-muted font-normal"}," — pick the columns to include in the snapshot ")],-1)),o("div",zt,[t(ne,{size:"xs",variant:"ghost",onClick:ce},{default:u(()=>[...n[8]||(n[8]=[D(" Select all ",-1)])]),_:1}),t(ne,{size:"xs",variant:"ghost",onClick:ae},{default:u(()=>[...n[9]||(n[9]=[D("None",-1)])]),_:1})])]),e(g).columns?(l(),d("div",Kt,[t(I,{name:"i-lucide-loader-2",class:"animate-spin size-4"}),n[11]||(n[11]=D(" Loading columns… ",-1))])):e(r).length?(l(),d("div",Ot,[(l(!0),d(me,null,be(e(r),P=>(l(),d("label",{key:P.name,class:"flex items-center gap-2 px-2 py-1 rounded hover:bg-default cursor-pointer text-xs"},[t(ye,{"model-value":e(W).has(P.name),"onUpdate:modelValue":Se=>ue(P.name,Se===!0)},null,8,["model-value","onUpdate:modelValue"]),o("span",Lt,U(P.name),1),o("span",Ft,U(P.type),1)]))),128))])):(l(),d("p",qt," No columns returned. Does the service user have SELECT on this table? "))])):M("",!0),e(C)&&e(r).length?(l(),d("div",Bt,[n[12]||(n[12]=o("h3",{class:"text-sm font-medium"},"Register as data source",-1)),t(X,{label:"Name",name:"name",error:e(y),help:"How rules will reference this table — keep it short, e.g. cost_codes"},{default:u(()=>[t(he,{modelValue:e(N),"onUpdate:modelValue":n[3]||(n[3]=P=>fe(N)?N.value=P:null),placeholder:"cost_codes",class:"w-full font-mono"},null,8,["modelValue"])]),_:1},8,["error"]),t(X,{label:"Snapshot TTL (seconds)",name:"ttl",help:"How long Speckle reuses the cached snapshot before re-pulling. Default: 86 400 s (24 h)."},{default:u(()=>[t(he,{modelValue:e(Y),"onUpdate:modelValue":n[4]||(n[4]=P=>fe(Y)?Y.value=P:null),modelModifiers:{number:!0},type:"number",min:"60",placeholder:"86400",class:"w-full"},null,8,["modelValue"])]),_:1})])):M("",!0),e(L)?(l(),j(de,{key:7,color:"error",variant:"subtle",icon:"i-lucide-circle-alert",description:e(L)},null,8,["description"])):M("",!0)])]),footer:u(()=>[o("div",jt,[t(ne,{variant:"outline",disabled:e(a),onClick:n[5]||(n[5]=P=>T.value=!1)},{default:u(()=>[...n[13]||(n[13]=[D(" Cancel ",-1)])]),_:1},8,["disabled"]),t(ne,{color:"primary",loading:e(re),disabled:!e(R)||e(a),onClick:se},{default:u(()=>[...n[14]||(n[14]=[D(" Register data source ",-1)])]),_:1},8,["loading","disabled"])])]),_:1},8,["open","title"])}}}),Gt=Object.assign(Ht,{__name:"DataValidationSnowflakeBrowseDialog"}),Qt={class:"flex flex-col overflow-hidden h-full"},Yt={class:"text-sm font-medium truncate"},Jt={class:"text-xs text-muted truncate"},Xt={key:1,class:"flex flex-col items-center justify-center flex-1 gap-3 p-8 text-center"},Zt={key:2,class:"flex items-center justify-center flex-1"},ea={key:3,class:"flex flex-col items-center justify-center flex-1 gap-5 p-8 text-center"},ta={class:"size-16 rounded-2xl border border-default bg-elevated flex items-center justify-center p-2.5"},aa={key:4,class:"flex flex-col items-center justify-center flex-1 gap-5 p-8 text-center"},sa={class:"size-16 rounded-2xl border border-default bg-elevated flex items-center justify-center p-2.5"},na={key:5,class:"flex flex-col items-center justify-center flex-1 gap-5 p-8 text-center"},oa={class:"size-16 rounded-2xl border border-default bg-elevated flex items-center justify-center p-2.5"},la={class:"flex flex-col gap-2 w-full max-w-[220px]"},ra={key:6,class:"flex flex-col items-center justify-center flex-1 gap-5 p-8 text-center"},ia={class:"size-16 rounded-2xl border border-default bg-elevated flex items-center justify-center p-2.5"},ua={key:7,class:"flex flex-1 overflow-hidden"},ca={class:"w-80 border-r border-default flex flex-col overflow-hidden shrink-0"},da={class:"flex-1 overflow-y-auto py-1 select-none"},ma={key:0,class:"flex items-center gap-2 text-xs text-muted py-3 px-3"},fa={key:1,class:"text-xs text-error py-3 px-3"},pa={key:2},va=["onClick"],wa={class:"truncate"},ba={key:0,class:"ml-3 border-l border-default"},ha={key:0,class:"text-xs text-muted px-3 py-1.5"},ka=["onClick"],ga={class:"truncate"},ya={key:0,class:"ml-3 border-l border-default"},xa={key:0,class:"text-xs text-muted px-3 py-1.5"},_a=["onClick"],Sa={class:"truncate"},$a={key:3,class:"text-xs text-muted px-3 py-3"},Ea={class:"flex-1 flex flex-col overflow-hidden"},Ca={class:"px-4 py-2 flex items-center justify-between gap-2 h-10 border-b border-default shrink-0"},Ta={class:"flex items-center gap-2 min-w-0"},Ra={class:"text-xs font-semibold text-muted uppercase tracking-wide truncate"},Aa={class:"font-mono ml-1"},Ia={class:"flex-1 overflow-auto"},Pa={key:0,class:"flex items-center justify-center h-full text-muted text-sm"},Ua={key:1,class:"flex items-center justify-center h-full gap-2 text-muted text-sm"},Va={key:2,class:"p-6"},Wa={key:3,class:"p-2"},Da={class:"w-full text-xs border-collapse"},Na={class:"sticky top-0 bg-default z-10"},Ma={class:"font-mono font-semibold"},za={class:"font-normal text-muted text-[0.65rem]"},Ka=["title"],Oa={key:0,class:"text-muted italic"},La={key:1},Fa={key:4,class:"flex items-center justify-center h-full text-muted text-sm"},ds=Ce({__name:"snowflake",setup(h){const V=Je(),T=x(()=>nt(V.params.id)),H=Xe(),{workspace:oe,project:ee,loading:le}=mt({projectId:T}),z=x(()=>oe.value?.id??null),pe=x(()=>z.value??"");Ze({title:x(()=>`Snowflake - ${ee.value?.name??""}`)});const{canManage:ve,isLoading:re}=dt({workspaceId:z,kind:"snowflake"}),K=x(()=>!!ve.value?.authorized),{connection:w,isConnected:_,loading:r,browseDatabases:k,browseSchemas:S,browseTables:C,browseTablePreview:W}=Pe(pe),g=x(()=>le.value||re.value||r.value),$=b(!1),L=b(!1),N=Z`
192  query WorkspaceRegisteredSnowflakeSources($workspaceId: String!, $projectId: String) {
193    workspace(id: $workspaceId) {
194      id
195      dataWarehouses {
196        sources(projectId: $projectId) {
197          id
198          name
199          kind
200          tableFqn
201          lastRefreshedAt
202          status
203          connectionId
204          ttlSeconds
205        }
206      }
207    }
208  }
209`,Y=Z`
210  mutation RefreshWarehouseDataSource($workspaceId: String!, $id: String!) {
211    workspaceMutations {
212      dataWarehouses {
213        refreshSource(workspaceId: $workspaceId, id: $id) {
214          id
215          name
216          kind
217          tableFqn
218          lastRefreshedAt
219          status
220        }
221      }
222    }
223  }
224`,{result:te,refetch:ie}=Ve(N,()=>({workspaceId:z.value??"",projectId:T.value}),()=>({enabled:!!z.value})),p=x(()=>{const c=new Map,s=te.value?.workspace?.dataWarehouses?.sources??[];for(const i of s)i.kind!=="snowflake"||!i.tableFqn||c.set(i.tableFqn,{id:i.id,name:i.name,tableFqn:i.tableFqn,lastRefreshedAt:i.lastRefreshedAt?new Date(i.lastRefreshedAt):null});return c}),a=(c,s,i)=>p.value.get(`${c}.${s}.${i}`)??null,{mutate:A,loading:y}=ke(Y);ge(L,(c,s)=>{s&&!c&&ie()});const R=async()=>
224{if(!m.value||!n.value||!I.value)return;const c=a(m.value,n.value,I.value);if(c)try{await A({id:c.id,workspaceId:z.value??""}),await ie()}catch(s){ne.value=s instanceof Error?s.message:String(s)}},G=c=>{if(!c)return"never refreshed";const s=Math.max(0,Math.floor((Date.now()-c.getTime())/1e3));if(s<60)return"just now";const i=Math.floor(s/60);if(i<60)return`${i} minute${i===1?"":"s"} ago`;const B=Math.floor(i/60);if(B<24)return`${B} hour${B===1?"":"s"} ago`;const we=Math.floor(B/24);return`${we} day${we===1?"":"s"} ago`},E=b([]),F=b({}),J=b({}),ue=b({}),ce=b({}),ae=b({}),v=b({}),se=(c,s)=>`${c}.${s}`,m=b(),n=b(),I=b(),q=b(null),X=Ae({databases:!1,preview:!1}),de=b(null),ne=b(null),ye=(c,s,i)=>m.value===c&&n.value===s&&I.value===i,he=async()=>{X.databases=!0,de.value=null;try{E.value=await k()}catch(c){de.value=c instanceof Error?c.message:String(c),E.value=[]}finally{X.databases=!1}},_e=async c=>{const s=!ue.value[c];if(ue.value={...ue.value,[c]:s},!!s&&!F.value[c]){ae.value={...ae.value,[c]:!0};try{F.value={...F.value,[c]:await S(c)}}catch(i){de.value=i instanceof Error?i.message:String(i)}finally{ae.value={...ae.value,[c]:!1}}}},P=async(c,s)=>{const i=se(c,s),B=!ce.value[i];if(ce.value={...ce.value,[i]:B},!!B&&!J.value[i]){v.value={...v.value,[i]:!0};try{J.value={...J.value,[i]:await C(c,s)}}catch(we){de.value=we instanceof Error?we.message:String(we)}finally{v.value={...v.value,[i]:!1}}}},Se=async(c,s,i)=>{if(!ye(c,s,i)){m.value=c,n.value=s,I.value=i,q.value=null,ne.value=null,X.preview=!0;try{q.value=await W(c,s,i,50)}catch(B){ne.value=B instanceof Error?B.message:String(B)}finally{X.preview=!1}}},Ue=c=>{if(c==null)return"";if(typeof c=="object")try{return JSON.stringify(c)}catch{return String(c)}return String(c)};ge([_,z],async([c,s])=>{c&&s&&K.value&&!E.value.length&&await he()},{immediate:!0}),ge($,async c=>{c||(await ie(),_.value&&K.value&&!E.value.length&&await he())});const{setBreadcrumbs:Le,setWorkspaceContext:Fe}=et();return tt(()=>{if(!T.value)return;const c=oe.value?.slug,s=oe.value?.name||c||"Workspace",i=ee.value?.name||T.value;c&&Fe({slug:c,name:s}),Le([{label:i,to:at(T.value)},{label:"Snowflake"}])}),(c,s)=>{const i=Re,B=Oe,we=ot,xe=Te,$e=st,qe=Ie,Be=At,je=Gt;return l(),d("div",Qt,[e(H)&&e(K)&&e(_)?(l(),j(we,{key:0,class:"shrink-0"},{default:u(()=>[t(B,{text:"Manage connection"},{default:u(()=>[o("button",{type:"button","aria-label":"Manage connection",class:"group flex items-center gap-2 min-w-0 max-w-full -mx-2 px-2 py-1 rounded-md transition-colors hover:bg-elevated/50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary",onClick:s[0]||(s[0]=f=>$.value=!0)},[t(i,{name:e(w)?.lastTestSucceeded===!1?"i-lucide-circle-alert":"i-lucide-check-circle",class:Ee([e(w)?.lastTestSucceeded===!1?"text-warning":"text-success","size-4 shrink-0"])},null,8,["name","class"]),o("span",Yt,U(e(w)?.account),1),o("span",Jt,U(e(w)?.username)+" · "+U(e(w)?.warehouse),1),t(i,{name:"i-lucide-settings",class:"size-4 text-muted shrink-0 transition-colors group-hover:text-default"})])]),_:1})]),_:1})):M("",!0),e(H)?e(g)?(l(),d("div",Zt,[t(i,{name:"i-lucide-loader-2",class:"animate-spin text-muted"})])):e(z)?!e(K)&&!e(_)?(l(),d("div",aa,[o("div",sa,[t(i,{name:"i-custom-snowflake",class:"size-10 text-default"})]),s[8]||(s[8]=o("div",{class:"space-y-1.5 max-w-sm"},[o("h2",{class:"text-base font-semibold"},"Snowflake not connected"),o("p",{class:"text-sm text-muted"}," A workspace admin needs to set up the Snowflake connection before tables can be browsed. ")],-1))])):e(_)?!e(K)&&e(_)?(l(),d("div",ra,[o("div",ia,[t(i,{name:"i-custom-snowflake",class:"size-10 text-default"})]),s[12]||(s[12]=o("div",{class:"space-y-1.5 max-w-sm"},[o("h2",{class:"text-base font-semibold"},"Snowflake connected"),o("p",{class:"text-sm text-muted"}," Workspace admins can browse databases and register tables as data sources. ")],-1))])):(l(),d("div",ua,[o("div",ca,[s[14]||(s[14]=o("div",{class:"px-3 py-2 flex items-center h-10 border-b border-default shrink-0"},[o("p",{class:"text-xs font-semibold text-muted uppercase tracking-wide"}," Account ")],-1)),o("div",da,[e(X).databases?(l(),d("div",ma,[t(i,{name:"i-lucide-loader-2",class:"animate-spin size-3.5"}),s[13]||(s[13]=D(" Loading databases… ",-1))])):e(de)?(l(),d("div",fa,U(e(de)),1)):e(E).length?(l(),d("ul",pa,[(l(!0),d(me,null,be(e(E),f=>(l(),d("li",{key:f},[o("button",{class:"flex items-center gap-1.5 w-full pl-2 pr-3 py-1.5 text-sm text-left hover:bg-muted/50",onClick:O=>_e(f)},[t(i,{name:e(ue)[f]?"i-lucide-chevron-down":"i-lucide-chevron-right",class:"size-3.5 shrink-0 text-muted"},null,8,["name"]),t(i,{name:"i-lucide-database",class:"size-4 shrink-0 text-muted"}
224),o("span",wa,U(f),1),e(ae)[f]?(l(),j(i,{key:0,name:"i-lucide-loader-2",class:"animate-spin size-3 ml-auto shrink-0 text-muted"})):M("",!0)],8,va),e(ue)[f]?(l(),d("ul",ba,[!e(ae)[f]&&e(F)[f]&&!e(F)[f].length?(l(),d("li",ha," No schemas. ")):M("",!0),(l(!0),d(me,null,be(e(F)[f]??[],O=>(l(),d("li",{key:O},[o("button",{class:"flex items-center gap-1.5 w-full pl-2 pr-3 py-1.5 text-sm text-left hover:bg-muted/50",onClick:Q=>P(f,O)},[t(i,{name:e(ce)[se(f,O)]?"i-lucide-chevron-down":"i-lucide-chevron-right",class:"size-3.5 shrink-0 text-muted"},null,8,["name"]),t(i,{name:"i-lucide-folder",class:"size-4 shrink-0 text-muted"}),o("span",ga,U(O),1),e(v)[se(f,O)]?(l(),j(i,{key:0,name:"i-lucide-loader-2",class:"animate-spin size-3 ml-auto shrink-0 text-muted"})):M("",!0)],8,ka),e(ce)[se(f,O)]?(l(),d("ul",ya,[!e(v)[se(f,O)]&&e(J)[se(f,O)]&&!e(J)[se(f,O)].length?(l(),d("li",xa," No tables. ")):M("",!0),(l(!0),d(me,null,be(e(J)[se(f,O)]??[],Q=>(l(),d("li",{key:Q.fullyQualifiedName},[o("button",{class:Ee(["flex items-center gap-1.5 w-full pl-5 pr-3 py-1.5 text-sm text-left hover:bg-muted/50",{"bg-muted font-semibold":ye(f,O,Q.name)}]),onClick:qa=>Se(f,O,Q.name)},[t(i,{name:Q.kind==="VIEW"?"i-lucide-eye":"i-lucide-table-2",class:"size-4 shrink-0 text-muted"},null,8,["name"]),o("span",Sa,U(Q.name),1),a(f,O,Q.name)?(l(),j(B,{key:0,text:`Registered as "${a(f,O,Q.name)?.name}"`},{default:u(()=>[t(i,{name:"i-lucide-bookmark-check",class:"size-3.5 ml-auto shrink-0 text-success"})]),_:1},8,["text"])):M("",!0)],10,_a)]))),128))])):M("",!0)]))),128))])):M("",!0)]))),128))])):(l(),d("p",$a," No databases visible. Verify the service user's role grants USAGE on the databases. "))])]),o("div",Ea,[o("div",Ca,[o("div",Ta,[t(i,{name:"i-lucide-table",class:"size-4 text-muted shrink-0"}),o("p",Ra,U(e(I)?`${e(m)}.${e(n)}.${e(I)}`:"Preview"),1),e(q)&&e(q).truncated?(l(),j($e,{key:0,color:"neutral",variant:"subtle",size:"xs"},{default:u(()=>[D(" First "+U(e(q).rows.length)+" rows ",1)]),_:1})):e(q)?(l(),j($e,{key:1,color:"neutral",variant:"subtle",size:"xs"},{default:u(()=>[D(U(e(q).rows.length)+" rows ",1)]),_:1})):M("",!0)]),e(I)&&!e(X).preview?(l(),d(me,{key:0},[a(e(m),e(n),e(I))?(l(),d(me,{key:0},[t($e,{color:"success",variant:"subtle",size:"sm"},{default:u(()=>[t(i,{name:"i-lucide-bookmark-check",class:"size-3 mr-1"}),s[15]||(s[15]=D(" Registered as ",-1)),o("span",Aa,U(a(e(m),e(n),e(I))?.name),1)]),_:1}),t(B,{text:`Last refreshed ${G(a(e(m),e(n),e(I))?.lastRefreshedAt??null)}. Click to pull a fresh snapshot now.`},{default:u(()=>[t(xe,{size:"xs",variant:"outline",icon:"i-lucide-refresh-cw",loading:e(y),onClick:R},{default:u(()=>[...s[16]||(s[16]=[D(" Refresh now ",-1)])]),_:1},8,["loading"])]),_:1},8,["text"])],64)):(l(),j(xe,{key:1,size:"xs",variant:"solid",icon:"i-lucide-plus",onClick:s[2]||(s[2]=f=>L.value=!0)},{default:u(()=>[...s[17]||(s[17]=[D(" Register data source ",-1)])]),_:1}))],64)):M("",!0)]),o("div",Ia,[e(I)?e(X).preview?(l(),d("div",Ua,[t(i,{name:"i-lucide-loader-2",class:"animate-spin size-4"}),s[18]||(s[18]=D(" Querying Snowflake… ",-1))])):e(ne)?(l(),d("div",Va,[t(qe,{color:"error",variant:"subtle",icon:"i-lucide-circle-alert",title:`Couldn't preview ${e(m)}.${e(n)}.${e(I)}`,description:e(ne)},null,8,["title","description"])])):e(q)&&e(q).columns.length?(l(),d("div",Wa,[o("table",Da,[o("thead",Na,[o("tr",null,[(l(!0),d(me,null,be(e(q).columns,f=>(l(),d("th",{key:f.name,class:"px-2 py-1.5 text-left border-b border-default whitespace-nowrap"},[o("div",Ma,U(f.name),1),o("div",za,U(f.type),1)]))),128))])]),o("tbody",null,[(l(!0),d(me,null,be(e(q).rows,(f,O)=>(l(),d("tr",{key:O,class:"hover:bg-muted/30"},[(l(!0),d(me,null,be(e(q).columns,Q=>(l(),d("td",{key:Q.name,class:"px-2 py-1 border-b border-default font-mono text-[0.7rem] align-top max-w-xs truncate",title:Ue(f[Q.name])},[f[Q.name]===null||f[Q.name]===void 0?(l(),d("span",Oa," null ")):(l(),d("span",La,U(Ue(f[Q.name])),1))],8,Ka))),128))]))),128))])])])):(l(),d("div",Fa," Empty result. ")):(l(),d("div",Pa," Select a table to preview its data. "))])])])):(l(),d("div",na,[o("div",oa,[t(i,{name:"i-custom-snowflake",class:"size-10 text-default"})]),s[11]||(s[11]=o("div",{class:"space-y-1.5 max-w-sm"},[o("h2",{class:"text-base font-semibold"},"Connect Snowflake"),o("p",{class:"text-sm text-muted"}," Link your Snowflake account to query warehouse tables alongside your Speckle models. ")],-1)),o("div",la,[t(xe,{color:"primary",block:"",onClick:s[1]||(s[1]=f=>$.value=!0)},{default:u(()=>[...s[9]||(s[9]=[D(" Connect to Snowflake ",-1)])]),_:1}),t(xe,{color:"neutral",variant:"ghost",block:"",to:"https://docs.snowflake.com/en/user-guide/key-pair-auth",external:"",target:"_blank"},{default:u(()=>[...s[10]||(s[10]=[D(" View docs ",-1)])]),_:1})])])):(l(),d("div",ea,[o("div",ta,[t(i,{name:"i-custom-snowflake",class:"size-10 text-default"})]),s[7]||(s[7]=o("div",{class:"space-y-1.5 max-w-sm"},[o("h2",{class:"text-base font-semibold"},"Snowflake integration"),o("p",{class:"text-sm text-muted"}," Move this project into a workspace to connect a Snowflake account. ")],-1))])):(l(),d("div",Xt,[t(i,{name:"i-custom-snowflake",class:"size-10 text-muted"}),s[5]||(s[5]=o("h2",{class:"text-base font-semibold"},"Snowflake integration not available",-1)),s[6]||(s[6]=o("p",{class:"text-sm text-muted max-w-md"}," The Snowflake integration isn’t enabled for this server. ",-1))])),e(K)&&e(z)?(l(),j(Be,{key:8,open:e($),"onUpdate:open":s[3]||(s[3]=f=>fe($)?$.value=f:null),"workspace-id":e(z)},null,8,["open","workspace-id"])):M("",!0),e(K)&&e(_)&&e(z)?(l(),j(je,{key:9,open:e(L),"onUpdate:open":s[4]||(s[4]=f=>fe(L)?L.value=f:null),"workspace-id":e(z),"initial-database":e(m),"initial-schema":e(n),"initial-table":e(I)},null,8,["open","workspace-id","initial-database","initial-schema","initial-table"])):M("",!0)])}}});
224export{ds as default};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.