@harperfast/harper 5.1.0-beta.3 → 5.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/bin/copyDb.ts +16 -3
  2. package/dist/bin/copyDb.js +16 -3
  3. package/dist/bin/copyDb.js.map +1 -1
  4. package/dist/resources/Table.js +43 -4
  5. package/dist/resources/Table.js.map +1 -1
  6. package/dist/resources/databases.js +135 -41
  7. package/dist/resources/databases.js.map +1 -1
  8. package/dist/resources/graphql.js +3 -0
  9. package/dist/resources/graphql.js.map +1 -1
  10. package/dist/resources/replayLogs.d.ts +1 -0
  11. package/dist/resources/replayLogs.js +100 -40
  12. package/dist/resources/replayLogs.js.map +1 -1
  13. package/dist/resources/replayLogsGuards.d.ts +25 -8
  14. package/dist/resources/replayLogsGuards.js +50 -10
  15. package/dist/resources/replayLogsGuards.js.map +1 -1
  16. package/dist/server/nodeName.js +9 -3
  17. package/dist/server/nodeName.js.map +1 -1
  18. package/dist/server/operationsServer.js +20 -0
  19. package/dist/server/operationsServer.js.map +1 -1
  20. package/dist/utility/install/installer.js +12 -6
  21. package/dist/utility/install/installer.js.map +1 -1
  22. package/package.json +3 -3
  23. package/resources/Table.ts +41 -4
  24. package/resources/databases.ts +134 -42
  25. package/resources/graphql.ts +3 -0
  26. package/resources/replayLogs.ts +114 -42
  27. package/resources/replayLogsGuards.ts +58 -9
  28. package/server/nodeName.ts +9 -3
  29. package/server/operationsServer.ts +17 -0
  30. package/studio/web/assets/{Chat-BdFickL8.js → Chat-DMBW4pI2.js} +2 -2
  31. package/studio/web/assets/{Chat-BdFickL8.js.map → Chat-DMBW4pI2.js.map} +1 -1
  32. package/studio/web/assets/{FloatingChat-CaAoco8I.js → FloatingChat-DTmhPsrm.js} +4 -4
  33. package/studio/web/assets/{FloatingChat-CaAoco8I.js.map → FloatingChat-DTmhPsrm.js.map} +1 -1
  34. package/studio/web/assets/{applications-C3y3xwyG.js → applications-CigxJarn.js} +2 -2
  35. package/studio/web/assets/{applications-C3y3xwyG.js.map → applications-CigxJarn.js.map} +1 -1
  36. package/studio/web/assets/{index-Cd3Zh3nK.js → index-oRZw5GW3.js} +6 -6
  37. package/studio/web/assets/index-oRZw5GW3.js.map +1 -0
  38. package/studio/web/assets/{index.lazy-0hLbh5Fo.js → index.lazy-DY3VcR86.js} +4 -4
  39. package/studio/web/assets/{index.lazy-0hLbh5Fo.js.map → index.lazy-DY3VcR86.js.map} +1 -1
  40. package/studio/web/assets/{profile-CwBWGuVt.js → profile-DiV60L50.js} +2 -2
  41. package/studio/web/assets/{profile-CwBWGuVt.js.map → profile-DiV60L50.js.map} +1 -1
  42. package/studio/web/assets/{setComponentFile-Dhrmd8eR.js → setComponentFile-Bz6WI4jy.js} +2 -2
  43. package/studio/web/assets/{setComponentFile-Dhrmd8eR.js.map → setComponentFile-Bz6WI4jy.js.map} +1 -1
  44. package/studio/web/assets/{status-Bykq6QcD.js → status-fW6PBpPM.js} +2 -2
  45. package/studio/web/assets/{status-Bykq6QcD.js.map → status-fW6PBpPM.js.map} +1 -1
  46. package/studio/web/assets/{swagger-ui-react-CF94s29D.js → swagger-ui-react-DRYf7G3J.js} +2 -2
  47. package/studio/web/assets/{swagger-ui-react-CF94s29D.js.map → swagger-ui-react-DRYf7G3J.js.map} +1 -1
  48. package/studio/web/assets/{useEntityRestURL-D7vuaG2W.js → useEntityRestURL-14jWKu9J.js} +2 -2
  49. package/studio/web/assets/{useEntityRestURL-D7vuaG2W.js.map → useEntityRestURL-14jWKu9J.js.map} +1 -1
  50. package/studio/web/index.html +1 -1
  51. package/utility/install/installer.ts +12 -5
  52. package/studio/web/assets/index-Cd3Zh3nK.js.map +0 -1
@@ -1,5 +1,5 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/swagger-ui-react-CF94s29D.js","assets/rolldown-runtime-Cyuzqnbw.js","assets/index-Cd3Zh3nK.js","assets/vendor-datadog-Bq_0f1ke.js","assets/vendor-ui-to0aD0Fq.js","assets/vendor-core-BIhSIGPv.js","assets/vendor-react-BqTNj-ZI.js","assets/vendor-tanstack-DmFvmRiZ.js","assets/createLucideIcon-D6HmSa4x.js","assets/button-kCMf1ZBL.js","assets/index-C_rO7c5w.css","assets/with-selector-DZDEkpbZ.js"])))=>i.map(i=>d[i]);
2
- import{a as e}from"./rolldown-runtime-Cyuzqnbw.js";import{t}from"./button-kCMf1ZBL.js";import{A as n,C as r,M as i,h as a}from"./vendor-tanstack-DmFvmRiZ.js";import{a as o,i as s}from"./vendor-datadog-Bq_0f1ke.js";import{r as c}from"./vendor-react-BqTNj-ZI.js";import{$ as l,$t as u,Ht as d,Pt as f,Q as p,S as m,v as h,y as g}from"./index-Cd3Zh3nK.js";import{t as _}from"./useEntityRestURL-D7vuaG2W.js";var v=[{fn:{requestSnippetGenerator_fetch:e=>{let t=new URL(e.get(`url`)),n=!1,r=e.get(`headers`);r&&r.size&&r.map((e,t)=>{n||=/^content-type$/i.test(t)&&/^multipart\/form-data$/i.test(e)});let i=e.get(`body`),a=e.get(`method`);if(i){if(n&&[`POST`,`PUT`,`PATCH`].includes(a))return`throw new Error("Currently unsupported content-type: /^multipart\\/form-data$/i");`;typeof i!=`string`&&(i=JSON.stringify(i,null,` `))}else !i&&a===`POST`&&(i=``);let o="`"+(i||``).replace(/\\n/g,`
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/swagger-ui-react-DRYf7G3J.js","assets/rolldown-runtime-Cyuzqnbw.js","assets/index-oRZw5GW3.js","assets/vendor-datadog-Bq_0f1ke.js","assets/vendor-ui-to0aD0Fq.js","assets/vendor-core-BIhSIGPv.js","assets/vendor-react-BqTNj-ZI.js","assets/vendor-tanstack-DmFvmRiZ.js","assets/createLucideIcon-D6HmSa4x.js","assets/button-kCMf1ZBL.js","assets/index-C_rO7c5w.css","assets/with-selector-DZDEkpbZ.js"])))=>i.map(i=>d[i]);
2
+ import{a as e}from"./rolldown-runtime-Cyuzqnbw.js";import{t}from"./button-kCMf1ZBL.js";import{A as n,C as r,M as i,h as a}from"./vendor-tanstack-DmFvmRiZ.js";import{a as o,i as s}from"./vendor-datadog-Bq_0f1ke.js";import{r as c}from"./vendor-react-BqTNj-ZI.js";import{$ as l,$t as u,Ht as d,Pt as f,Q as p,S as m,v as h,y as g}from"./index-oRZw5GW3.js";import{t as _}from"./useEntityRestURL-14jWKu9J.js";var v=[{fn:{requestSnippetGenerator_fetch:e=>{let t=new URL(e.get(`url`)),n=!1,r=e.get(`headers`);r&&r.size&&r.map((e,t)=>{n||=/^content-type$/i.test(t)&&/^multipart\/form-data$/i.test(e)});let i=e.get(`body`),a=e.get(`method`);if(i){if(n&&[`POST`,`PUT`,`PATCH`].includes(a))return`throw new Error("Currently unsupported content-type: /^multipart\\/form-data$/i");`;typeof i!=`string`&&(i=JSON.stringify(i,null,` `))}else !i&&a===`POST`&&(i=``);let o="`"+(i||``).replace(/\\n/g,`
3
3
  `).replace(/`/g,"\\`")+"`";return`const response = await fetch("${t.toString()}", {
4
4
  \tmethod: "${e.get(`method`)}",${r&&r.size?`
5
5
  \theaders: {
@@ -10,5 +10,5 @@ import{a as e}from"./rolldown-runtime-Cyuzqnbw.js";import{t}from"./button-kCMf1Z
10
10
  });
11
11
  const data = await response.json();
12
12
  console.log(data);
13
- `}}}],y={generators:{fetch:{title:`Fetch`,syntax:`javascript`}}};function b({entityId:e,instanceClient:t}){return n({queryKey:[e,`OpenAPI`],queryFn:async()=>{let{data:e}=await t.get(`/api/openapi/rest`);return e}})}var x=e(o(),1),S=c(),C=(0,x.lazy)(()=>s(()=>import(`./swagger-ui-react-CF94s29D.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11])));function w(){let{instanceId:e,clusterId:n}=r({strict:!1}),a=f(),{data:o,isLoading:s}=i(g(a)),{data:c,isLoading:w}=i(h(a)),T=_(),{data:E,isLoading:D,error:O}=i(b(a));E?.servers?.length&&(E.servers[0].url=T);let k=o?.http,A=``,j=k?.cors===!1,M=k?.corsAccessList?.length!==void 0&&!k.corsAccessList.includes(`*`)&&!k.corsAccessList.includes(`null`)&&!k.corsAccessList.includes(window.location.origin);j?A=`This ${n&&!e?`cluster`:`instance`} has CORS disabled currently, so you won't be able to execute API requests from the browser.`:M&&(A=`This ${n&&!e?`cluster`:`instance`} has CORS enabled, but ${window.location.origin} is not allowed, so you won't be able to execute API requests from the browser.`);let{onConfigUpdate:N,isPending:P}=m(),F=(0,x.useCallback)(()=>{N({...j?{http_cors:!0}:{},...M?{http_corsAccessList:[...k?.corsAccessList??[],window.location.origin]}:{}})},[j,k?.corsAccessList,M,N]);if(s||w||D)return(0,S.jsx)(l,{centered:!0,text:`Looking up your instance configuration, one moment.`});if(O){let e;return e=c?.version&&!p(`4.7.0-beta.7`,c?.version)?`API Docs are only available starting in version '4.7.0-beta.7' of Harper, please update your version ${c.version}!`:`We weren't able to look up your docs. Please check the Network tab of your developer tools to see why the docs were not accessible to Studio.`,(0,S.jsx)(d,{title:`API Docs Unavailable`,error:{message:e},showReturnToHome:!1})}return(0,S.jsxs)(`div`,{className:`pt-6`,children:[A&&(0,S.jsx)(d,{title:`CORS Disabled: HTTP API Not Accessible`,className:`mt-0 mx-4 mb-4 border-yellow text-yellow`,error:{message:A},showReturnToHome:!1,children:(0,S.jsxs)(t,{type:`button`,disabled:P,variant:`warning`,className:`rounded-full`,onClick:F,children:[(0,S.jsx)(u,{}),P?`Enabling CORS...`:`Enable CORS for ${window.location.origin}`]})}),(0,S.jsx)(x.Suspense,{fallback:(0,S.jsx)(l,{centered:!0,text:`Loading API documentation...`}),children:(0,S.jsx)(C,{spec:E,persistAuthorization:!0,withCredentials:!0,requestSnippetsEnabled:!0,defaultModelRendering:`model`,requestSnippets:y,plugins:v,tryItOutEnabled:!0})})]})}var T=a(`/apis`)({component:w});export{T as route};
14
- //# sourceMappingURL=index.lazy-0hLbh5Fo.js.map
13
+ `}}}],y={generators:{fetch:{title:`Fetch`,syntax:`javascript`}}};function b({entityId:e,instanceClient:t}){return n({queryKey:[e,`OpenAPI`],queryFn:async()=>{let{data:e}=await t.get(`/api/openapi/rest`);return e}})}var x=e(o(),1),S=c(),C=(0,x.lazy)(()=>s(()=>import(`./swagger-ui-react-DRYf7G3J.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11])));function w(){let{instanceId:e,clusterId:n}=r({strict:!1}),a=f(),{data:o,isLoading:s}=i(g(a)),{data:c,isLoading:w}=i(h(a)),T=_(),{data:E,isLoading:D,error:O}=i(b(a));E?.servers?.length&&(E.servers[0].url=T);let k=o?.http,A=``,j=k?.cors===!1,M=k?.corsAccessList?.length!==void 0&&!k.corsAccessList.includes(`*`)&&!k.corsAccessList.includes(`null`)&&!k.corsAccessList.includes(window.location.origin);j?A=`This ${n&&!e?`cluster`:`instance`} has CORS disabled currently, so you won't be able to execute API requests from the browser.`:M&&(A=`This ${n&&!e?`cluster`:`instance`} has CORS enabled, but ${window.location.origin} is not allowed, so you won't be able to execute API requests from the browser.`);let{onConfigUpdate:N,isPending:P}=m(),F=(0,x.useCallback)(()=>{N({...j?{http_cors:!0}:{},...M?{http_corsAccessList:[...k?.corsAccessList??[],window.location.origin]}:{}})},[j,k?.corsAccessList,M,N]);if(s||w||D)return(0,S.jsx)(l,{centered:!0,text:`Looking up your instance configuration, one moment.`});if(O){let e;return e=c?.version&&!p(`4.7.0-beta.7`,c?.version)?`API Docs are only available starting in version '4.7.0-beta.7' of Harper, please update your version ${c.version}!`:`We weren't able to look up your docs. Please check the Network tab of your developer tools to see why the docs were not accessible to Studio.`,(0,S.jsx)(d,{title:`API Docs Unavailable`,error:{message:e},showReturnToHome:!1})}return(0,S.jsxs)(`div`,{className:`pt-6`,children:[A&&(0,S.jsx)(d,{title:`CORS Disabled: HTTP API Not Accessible`,className:`mt-0 mx-4 mb-4 border-yellow text-yellow`,error:{message:A},showReturnToHome:!1,children:(0,S.jsxs)(t,{type:`button`,disabled:P,variant:`warning`,className:`rounded-full`,onClick:F,children:[(0,S.jsx)(u,{}),P?`Enabling CORS...`:`Enable CORS for ${window.location.origin}`]})}),(0,S.jsx)(x.Suspense,{fallback:(0,S.jsx)(l,{centered:!0,text:`Loading API documentation...`}),children:(0,S.jsx)(C,{spec:E,persistAuthorization:!0,withCredentials:!0,requestSnippetsEnabled:!0,defaultModelRendering:`model`,requestSnippets:y,plugins:v,tryItOutEnabled:!0})})]})}var T=a(`/apis`)({component:w});export{T as route};
14
+ //# sourceMappingURL=index.lazy-DY3VcR86.js.map
@@ -1 +1 @@
1
- {"version":3,"mappings":"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","names":[],"ignoreList":[],"sources":["../../src/features/instance/apis/plugins.ts","../../src/features/instance/apis/requestSnippets.ts","../../src/integrations/api/instance/status/getOpenAPI.ts","../../src/features/instance/apis/APIDocs.tsx","../../src/features/instance/apis/index.lazy.tsx"],"sourcesContent":["export const SnippedGeneratorNodeJsPlugin = {\n\tfn: {\n\t\trequestSnippetGenerator_fetch: (request: { get: (key: string) => unknown }) => {\n\t\t\tconst url = new URL(request.get('url') as string);\n\t\t\tlet isMultipartFormDataRequest = false;\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t\t\tconst headers = request.get('headers') as any;\n\t\t\tif (headers && headers.size) {\n\t\t\t\theaders.map((val: string, key: string) => {\n\t\t\t\t\tisMultipartFormDataRequest = isMultipartFormDataRequest\n\t\t\t\t\t\t|| /^content-type$/i.test(key) && /^multipart\\/form-data$/i.test(val);\n\t\t\t\t});\n\t\t\t}\n\t\t\tlet reqBody = request.get('body') as string | object;\n\t\t\tconst reqMethod = request.get('method') as string;\n\t\t\tif (reqBody) {\n\t\t\t\tif (isMultipartFormDataRequest && ['POST', 'PUT', 'PATCH'].includes(reqMethod)) {\n\t\t\t\t\treturn 'throw new Error(\"Currently unsupported content-type: /^multipart\\\\/form-data$/i\");';\n\t\t\t\t} else {\n\t\t\t\t\tif (typeof reqBody !== 'string') {\n\t\t\t\t\t\treqBody = JSON.stringify(reqBody, null, '\\t');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (!reqBody && reqMethod === 'POST') {\n\t\t\t\treqBody = '';\n\t\t\t}\n\n\t\t\tconst stringBody = '`' + (reqBody || '')\n\t\t\t\t.replace(/\\\\n/g, '\\n')\n\t\t\t\t.replace(/`/g, '\\\\`')\n\t\t\t\t+ '`';\n\n\t\t\treturn `const response = await fetch(\"${url.toString()}\", {\n\\tmethod: \"${request.get('method')}\",${\n\t\t\t\theaders && headers.size\n\t\t\t\t\t? `\n\\theaders: {\n\\t\\t${headers.map((val: string, key: string) => `\"${key}\": \"${val}\"`).valueSeq().join(',\\n\\t\\t')}\n\\t},`\n\t\t\t\t\t: ''\n\t\t\t}${\n\t\t\t\treqBody\n\t\t\t\t\t? `\n\\tbody: ${stringBody},`\n\t\t\t\t\t: ''\n\t\t\t}\n});\nconst data = await response.json();\nconsole.log(data);\n`;\n\t\t},\n\t},\n};\n\nexport const plugins = [\n\tSnippedGeneratorNodeJsPlugin,\n];\n","export const requestSnippets = {\n\tgenerators: {\n\t\tfetch: {\n\t\t\ttitle: 'Fetch',\n\t\t\tsyntax: 'javascript',\n\t\t},\n\t},\n};\n","import { InstanceClientIdConfig } from '@/config/instanceClientConfig';\nimport { queryOptions } from '@tanstack/react-query';\n\nexport function getOpenAPIQueryOptions({ entityId, instanceClient }: InstanceClientIdConfig) {\n\treturn queryOptions({\n\t\tqueryKey: [entityId, 'OpenAPI'] as const,\n\t\tqueryFn: async () => {\n\t\t\tconst { data } = await instanceClient.get('/api/openapi/rest');\n\t\t\treturn data;\n\t\t},\n\t});\n}\n","import { ErrorComponent } from '@/components/ErrorComponent';\nimport { Loading } from '@/components/Loading';\nimport { Button } from '@/components/ui/button';\nimport { useEntityRestURL } from '@/config/useEntityRestURL';\nimport { useInstanceClientIdParams } from '@/config/useInstanceClient';\nimport { plugins } from '@/features/instance/apis/plugins';\nimport { requestSnippets } from '@/features/instance/apis/requestSnippets';\nimport { useRollingConfigUpdate } from '@/hooks/useRollingConfigUpdate';\nimport { getConfigurationQueryOptions } from '@/integrations/api/instance/status/getConfiguration';\nimport { getOpenAPIQueryOptions } from '@/integrations/api/instance/status/getOpenAPI';\nimport { getRegistrationInfoQueryOptions } from '@/integrations/api/instance/status/getRegistrationInfo';\nimport { wasAReleasedBeforeB } from '@/lib/string/wasAReleasedBeforeB';\nimport { useQuery } from '@tanstack/react-query';\nimport { useParams } from '@tanstack/react-router';\nimport { Plus } from 'lucide-react';\nimport { lazy, Suspense, useCallback } from 'react';\n\nconst SwaggerUI = lazy(() => import('swagger-ui-react'));\nimport 'swagger-ui-react/swagger-ui.css';\nimport './swagger.css';\n\nexport function APIDocs() {\n\tconst { instanceId, clusterId }: { instanceId?: string; clusterId?: string } = useParams({ strict: false });\n\tconst operationsParams = useInstanceClientIdParams();\n\tconst {\n\t\tdata: configurationInfo,\n\t\tisLoading: isLoadingConfiguration,\n\t} = useQuery(getConfigurationQueryOptions(operationsParams));\n\tconst { data: registrationInfo, isLoading: isLoadingRegistration } = useQuery(\n\t\tgetRegistrationInfoQueryOptions(operationsParams),\n\t);\n\tconst baseURL = useEntityRestURL();\n\tconst {\n\t\tdata: spec,\n\t\tisLoading: isLoadingDocs,\n\t\terror,\n\t} = useQuery(getOpenAPIQueryOptions(operationsParams));\n\tif (spec?.servers?.length) {\n\t\tspec.servers[0].url = baseURL;\n\t}\n\tconst http = configurationInfo?.http;\n\n\tlet apiInaccessibleWarning: string = '';\n\n\tconst corsDisabled = http?.cors === false;\n\tconst missingFromCORSList = http?.corsAccessList?.length !== undefined\n\t\t&& !http.corsAccessList.includes('*')\n\t\t&& !http.corsAccessList.includes('null')\n\t\t&& !http.corsAccessList.includes(window.location.origin);\n\tif (corsDisabled) {\n\t\tapiInaccessibleWarning = `This ${\n\t\t\tclusterId && !instanceId ? 'cluster' : 'instance'\n\t\t} has CORS disabled currently, so you won't be able to execute API requests from the browser.`;\n\t} else if (missingFromCORSList) {\n\t\tapiInaccessibleWarning = `This ${\n\t\t\tclusterId && !instanceId ? 'cluster' : 'instance'\n\t\t} has CORS enabled, but ${window.location.origin} is not allowed, so you won't be able to execute API requests from the browser.`;\n\t}\n\n\tconst { onConfigUpdate, isPending: isSettingConfiguration } = useRollingConfigUpdate();\n\tconst enableCORS = useCallback(() => {\n\t\tonConfigUpdate({\n\t\t\t...(corsDisabled\n\t\t\t\t? {\n\t\t\t\t\t'http_cors': true,\n\t\t\t\t}\n\t\t\t\t: {}),\n\t\t\t...(missingFromCORSList\n\t\t\t\t? {\n\t\t\t\t\t'http_corsAccessList': [\n\t\t\t\t\t\t...(http?.corsAccessList ?? []),\n\t\t\t\t\t\twindow.location.origin,\n\t\t\t\t\t],\n\t\t\t\t}\n\t\t\t\t: {}),\n\t\t});\n\t}, [corsDisabled, http?.corsAccessList, missingFromCORSList, onConfigUpdate]);\n\n\tif (isLoadingConfiguration || isLoadingRegistration || isLoadingDocs) {\n\t\treturn <Loading centered={true} text=\"Looking up your instance configuration, one moment.\" />;\n\t}\n\n\tif (error) {\n\t\tlet message: string;\n\t\tif (registrationInfo?.version && !wasAReleasedBeforeB('4.7.0-beta.7', registrationInfo?.version)) {\n\t\t\tmessage =\n\t\t\t\t`API Docs are only available starting in version '4.7.0-beta.7' of Harper, please update your version ${registrationInfo.version}!`;\n\t\t} else {\n\t\t\tmessage =\n\t\t\t\t`We weren't able to look up your docs. Please check the Network tab of your developer tools to see why the docs were not accessible to Studio.`;\n\t\t}\n\n\t\treturn (\n\t\t\t<ErrorComponent\n\t\t\t\ttitle=\"API Docs Unavailable\"\n\t\t\t\terror={{ message }}\n\t\t\t\tshowReturnToHome={false}\n\t\t\t/>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div className=\"pt-6\">\n\t\t\t{apiInaccessibleWarning && (\n\t\t\t\t<ErrorComponent\n\t\t\t\t\ttitle=\"CORS Disabled: HTTP API Not Accessible\"\n\t\t\t\t\tclassName=\"mt-0 mx-4 mb-4 border-yellow text-yellow\"\n\t\t\t\t\terror={{ message: apiInaccessibleWarning }}\n\t\t\t\t\tshowReturnToHome={false}\n\t\t\t\t>\n\t\t\t\t\t<Button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tdisabled={isSettingConfiguration}\n\t\t\t\t\t\tvariant=\"warning\"\n\t\t\t\t\t\tclassName=\"rounded-full\"\n\t\t\t\t\t\tonClick={enableCORS}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Plus />\n\t\t\t\t\t\t{isSettingConfiguration ? 'Enabling CORS...' : `Enable CORS for ${window.location.origin}`}\n\t\t\t\t\t</Button>\n\t\t\t\t</ErrorComponent>\n\t\t\t)}\n\t\t\t<Suspense fallback={<Loading centered={true} text=\"Loading API documentation...\" />}>\n\t\t\t\t<SwaggerUI\n\t\t\t\t\tspec={spec}\n\t\t\t\t\tpersistAuthorization={true}\n\t\t\t\t\twithCredentials={true}\n\t\t\t\t\trequestSnippetsEnabled={true}\n\t\t\t\t\tdefaultModelRendering=\"model\"\n\t\t\t\t\trequestSnippets={requestSnippets}\n\t\t\t\t\tplugins={plugins}\n\t\t\t\t\ttryItOutEnabled={true}\n\t\t\t\t/>\n\t\t\t</Suspense>\n\t\t</div>\n\t);\n}\n","import { APIDocs } from '@/features/instance/apis/APIDocs';\nimport { createLazyRoute } from '@tanstack/react-router';\n\nexport const route = createLazyRoute('/apis')({\n\tcomponent: APIDocs,\n});\n"],"file":"index.lazy-0hLbh5Fo.js"}
1
+ {"version":3,"mappings":"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","names":[],"ignoreList":[],"sources":["../../src/features/instance/apis/plugins.ts","../../src/features/instance/apis/requestSnippets.ts","../../src/integrations/api/instance/status/getOpenAPI.ts","../../src/features/instance/apis/APIDocs.tsx","../../src/features/instance/apis/index.lazy.tsx"],"sourcesContent":["export const SnippedGeneratorNodeJsPlugin = {\n\tfn: {\n\t\trequestSnippetGenerator_fetch: (request: { get: (key: string) => unknown }) => {\n\t\t\tconst url = new URL(request.get('url') as string);\n\t\t\tlet isMultipartFormDataRequest = false;\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t\t\tconst headers = request.get('headers') as any;\n\t\t\tif (headers && headers.size) {\n\t\t\t\theaders.map((val: string, key: string) => {\n\t\t\t\t\tisMultipartFormDataRequest = isMultipartFormDataRequest\n\t\t\t\t\t\t|| /^content-type$/i.test(key) && /^multipart\\/form-data$/i.test(val);\n\t\t\t\t});\n\t\t\t}\n\t\t\tlet reqBody = request.get('body') as string | object;\n\t\t\tconst reqMethod = request.get('method') as string;\n\t\t\tif (reqBody) {\n\t\t\t\tif (isMultipartFormDataRequest && ['POST', 'PUT', 'PATCH'].includes(reqMethod)) {\n\t\t\t\t\treturn 'throw new Error(\"Currently unsupported content-type: /^multipart\\\\/form-data$/i\");';\n\t\t\t\t} else {\n\t\t\t\t\tif (typeof reqBody !== 'string') {\n\t\t\t\t\t\treqBody = JSON.stringify(reqBody, null, '\\t');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (!reqBody && reqMethod === 'POST') {\n\t\t\t\treqBody = '';\n\t\t\t}\n\n\t\t\tconst stringBody = '`' + (reqBody || '')\n\t\t\t\t.replace(/\\\\n/g, '\\n')\n\t\t\t\t.replace(/`/g, '\\\\`')\n\t\t\t\t+ '`';\n\n\t\t\treturn `const response = await fetch(\"${url.toString()}\", {\n\\tmethod: \"${request.get('method')}\",${\n\t\t\t\theaders && headers.size\n\t\t\t\t\t? `\n\\theaders: {\n\\t\\t${headers.map((val: string, key: string) => `\"${key}\": \"${val}\"`).valueSeq().join(',\\n\\t\\t')}\n\\t},`\n\t\t\t\t\t: ''\n\t\t\t}${\n\t\t\t\treqBody\n\t\t\t\t\t? `\n\\tbody: ${stringBody},`\n\t\t\t\t\t: ''\n\t\t\t}\n});\nconst data = await response.json();\nconsole.log(data);\n`;\n\t\t},\n\t},\n};\n\nexport const plugins = [\n\tSnippedGeneratorNodeJsPlugin,\n];\n","export const requestSnippets = {\n\tgenerators: {\n\t\tfetch: {\n\t\t\ttitle: 'Fetch',\n\t\t\tsyntax: 'javascript',\n\t\t},\n\t},\n};\n","import { InstanceClientIdConfig } from '@/config/instanceClientConfig';\nimport { queryOptions } from '@tanstack/react-query';\n\nexport function getOpenAPIQueryOptions({ entityId, instanceClient }: InstanceClientIdConfig) {\n\treturn queryOptions({\n\t\tqueryKey: [entityId, 'OpenAPI'] as const,\n\t\tqueryFn: async () => {\n\t\t\tconst { data } = await instanceClient.get('/api/openapi/rest');\n\t\t\treturn data;\n\t\t},\n\t});\n}\n","import { ErrorComponent } from '@/components/ErrorComponent';\nimport { Loading } from '@/components/Loading';\nimport { Button } from '@/components/ui/button';\nimport { useEntityRestURL } from '@/config/useEntityRestURL';\nimport { useInstanceClientIdParams } from '@/config/useInstanceClient';\nimport { plugins } from '@/features/instance/apis/plugins';\nimport { requestSnippets } from '@/features/instance/apis/requestSnippets';\nimport { useRollingConfigUpdate } from '@/hooks/useRollingConfigUpdate';\nimport { getConfigurationQueryOptions } from '@/integrations/api/instance/status/getConfiguration';\nimport { getOpenAPIQueryOptions } from '@/integrations/api/instance/status/getOpenAPI';\nimport { getRegistrationInfoQueryOptions } from '@/integrations/api/instance/status/getRegistrationInfo';\nimport { wasAReleasedBeforeB } from '@/lib/string/wasAReleasedBeforeB';\nimport { useQuery } from '@tanstack/react-query';\nimport { useParams } from '@tanstack/react-router';\nimport { Plus } from 'lucide-react';\nimport { lazy, Suspense, useCallback } from 'react';\n\nconst SwaggerUI = lazy(() => import('swagger-ui-react'));\nimport 'swagger-ui-react/swagger-ui.css';\nimport './swagger.css';\n\nexport function APIDocs() {\n\tconst { instanceId, clusterId }: { instanceId?: string; clusterId?: string } = useParams({ strict: false });\n\tconst operationsParams = useInstanceClientIdParams();\n\tconst {\n\t\tdata: configurationInfo,\n\t\tisLoading: isLoadingConfiguration,\n\t} = useQuery(getConfigurationQueryOptions(operationsParams));\n\tconst { data: registrationInfo, isLoading: isLoadingRegistration } = useQuery(\n\t\tgetRegistrationInfoQueryOptions(operationsParams),\n\t);\n\tconst baseURL = useEntityRestURL();\n\tconst {\n\t\tdata: spec,\n\t\tisLoading: isLoadingDocs,\n\t\terror,\n\t} = useQuery(getOpenAPIQueryOptions(operationsParams));\n\tif (spec?.servers?.length) {\n\t\tspec.servers[0].url = baseURL;\n\t}\n\tconst http = configurationInfo?.http;\n\n\tlet apiInaccessibleWarning: string = '';\n\n\tconst corsDisabled = http?.cors === false;\n\tconst missingFromCORSList = http?.corsAccessList?.length !== undefined\n\t\t&& !http.corsAccessList.includes('*')\n\t\t&& !http.corsAccessList.includes('null')\n\t\t&& !http.corsAccessList.includes(window.location.origin);\n\tif (corsDisabled) {\n\t\tapiInaccessibleWarning = `This ${\n\t\t\tclusterId && !instanceId ? 'cluster' : 'instance'\n\t\t} has CORS disabled currently, so you won't be able to execute API requests from the browser.`;\n\t} else if (missingFromCORSList) {\n\t\tapiInaccessibleWarning = `This ${\n\t\t\tclusterId && !instanceId ? 'cluster' : 'instance'\n\t\t} has CORS enabled, but ${window.location.origin} is not allowed, so you won't be able to execute API requests from the browser.`;\n\t}\n\n\tconst { onConfigUpdate, isPending: isSettingConfiguration } = useRollingConfigUpdate();\n\tconst enableCORS = useCallback(() => {\n\t\tonConfigUpdate({\n\t\t\t...(corsDisabled\n\t\t\t\t? {\n\t\t\t\t\t'http_cors': true,\n\t\t\t\t}\n\t\t\t\t: {}),\n\t\t\t...(missingFromCORSList\n\t\t\t\t? {\n\t\t\t\t\t'http_corsAccessList': [\n\t\t\t\t\t\t...(http?.corsAccessList ?? []),\n\t\t\t\t\t\twindow.location.origin,\n\t\t\t\t\t],\n\t\t\t\t}\n\t\t\t\t: {}),\n\t\t});\n\t}, [corsDisabled, http?.corsAccessList, missingFromCORSList, onConfigUpdate]);\n\n\tif (isLoadingConfiguration || isLoadingRegistration || isLoadingDocs) {\n\t\treturn <Loading centered={true} text=\"Looking up your instance configuration, one moment.\" />;\n\t}\n\n\tif (error) {\n\t\tlet message: string;\n\t\tif (registrationInfo?.version && !wasAReleasedBeforeB('4.7.0-beta.7', registrationInfo?.version)) {\n\t\t\tmessage =\n\t\t\t\t`API Docs are only available starting in version '4.7.0-beta.7' of Harper, please update your version ${registrationInfo.version}!`;\n\t\t} else {\n\t\t\tmessage =\n\t\t\t\t`We weren't able to look up your docs. Please check the Network tab of your developer tools to see why the docs were not accessible to Studio.`;\n\t\t}\n\n\t\treturn (\n\t\t\t<ErrorComponent\n\t\t\t\ttitle=\"API Docs Unavailable\"\n\t\t\t\terror={{ message }}\n\t\t\t\tshowReturnToHome={false}\n\t\t\t/>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div className=\"pt-6\">\n\t\t\t{apiInaccessibleWarning && (\n\t\t\t\t<ErrorComponent\n\t\t\t\t\ttitle=\"CORS Disabled: HTTP API Not Accessible\"\n\t\t\t\t\tclassName=\"mt-0 mx-4 mb-4 border-yellow text-yellow\"\n\t\t\t\t\terror={{ message: apiInaccessibleWarning }}\n\t\t\t\t\tshowReturnToHome={false}\n\t\t\t\t>\n\t\t\t\t\t<Button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tdisabled={isSettingConfiguration}\n\t\t\t\t\t\tvariant=\"warning\"\n\t\t\t\t\t\tclassName=\"rounded-full\"\n\t\t\t\t\t\tonClick={enableCORS}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Plus />\n\t\t\t\t\t\t{isSettingConfiguration ? 'Enabling CORS...' : `Enable CORS for ${window.location.origin}`}\n\t\t\t\t\t</Button>\n\t\t\t\t</ErrorComponent>\n\t\t\t)}\n\t\t\t<Suspense fallback={<Loading centered={true} text=\"Loading API documentation...\" />}>\n\t\t\t\t<SwaggerUI\n\t\t\t\t\tspec={spec}\n\t\t\t\t\tpersistAuthorization={true}\n\t\t\t\t\twithCredentials={true}\n\t\t\t\t\trequestSnippetsEnabled={true}\n\t\t\t\t\tdefaultModelRendering=\"model\"\n\t\t\t\t\trequestSnippets={requestSnippets}\n\t\t\t\t\tplugins={plugins}\n\t\t\t\t\ttryItOutEnabled={true}\n\t\t\t\t/>\n\t\t\t</Suspense>\n\t\t</div>\n\t);\n}\n","import { APIDocs } from '@/features/instance/apis/APIDocs';\nimport { createLazyRoute } from '@tanstack/react-router';\n\nexport const route = createLazyRoute('/apis')({\n\tcomponent: APIDocs,\n});\n"],"file":"index.lazy-DY3VcR86.js"}
@@ -1,2 +1,2 @@
1
- import{a as e}from"./rolldown-runtime-Cyuzqnbw.js";import{h as t,i as n,r,t as i}from"./button-kCMf1ZBL.js";import{v as a,x as o}from"./vendor-core-BIhSIGPv.js";import{E as s,k as c,x as l}from"./vendor-tanstack-DmFvmRiZ.js";import{a as u}from"./vendor-datadog-Bq_0f1ke.js";import{r as d}from"./vendor-react-BqTNj-ZI.js";import{Tt as f,at as p,ut as m}from"./vendor-ui-to0aD0Fq.js";import{Ct as h,Mt as g,St as _,Tt as v,Xt as y,bt as b,vt as x,wt as S,yn as C,yt as w}from"./index-Cd3Zh3nK.js";async function T(e){let{id:n,newPassword:r,confirmNewPassword:i,...a}=e,o={...a};r&&r===i&&(o.password=r);let{data:s}=await t.patch(`/User/${n}`,o);return s}function E(){return c({mutationFn:e=>T(e)})}var D=a({id:o(),firstname:o({error:`Please enter your first name.`}).min(2,{error:`First name is required.`}).max(50,{error:`First name must be less than 50 characters.`}),lastname:o({error:`Please enter your last name.`}).min(2,{error:`Last name is required.`}).max(50,{error:`Last name must be less than 50 characters.`}),newPassword:o({error:`Please enter your new password.`}).min(8,{error:`Password must be 8 characters or more.`}).or(o().max(0)),confirmNewPassword:o().optional()}).refine(e=>e.newPassword===e.confirmNewPassword,{error:`Passwords do not match`,path:[`confirmNewPassword`]}),O=e(u(),1),k=d();function A(){let e=s(),t=l(),{user:a}=C(),o=m({resolver:p(D),defaultValues:{confirmNewPassword:``,firstname:a?.firstname||``,id:a?.id||``,lastname:a?.lastname||``,newPassword:``}}),{control:c,handleSubmit:u,reset:d,formState:{defaultValues:T,isDirty:A,isValid:j}}=o,{mutate:M,isPending:N}=E(),P=(0,O.useCallback)(async i=>{i&&M(i,{onSuccess:a=>{d({...T,...a}),n.updateUserForEntity(r,a),i.newPassword?(f.success(`Profile updated successfully!`,{description:`Please sign in with your new password.`}),g(),t({to:`/sign-in`}),e.invalidate()):f.success(`Profile updated successfully!`)}})},[T,t,d,e,M]);return(0,k.jsxs)(`div`,{className:`mt-20 px-4 pt-4 md:px-12 max-w-2xl`,children:[(0,k.jsx)(`h1`,{className:`text-2xl font-light`,children:`Profile`}),(0,k.jsx)(v,{...o,children:(0,k.jsxs)(`form`,{id:`profile-edit-form`,name:`profile-edit-form`,onSubmit:u(P),className:`grid gap-4 my-4`,children:[(0,k.jsx)(h,{control:c,name:`firstname`,render:({field:e})=>(0,k.jsxs)(_,{children:[(0,k.jsx)(b,{className:`pb-1`,children:`First Name`}),(0,k.jsx)(S,{children:(0,k.jsx)(x,{type:`text`,className:`dark:bg-black dark:border-black`,autoCapitalize:`words`,autoFocus:!0,...e})}),(0,k.jsx)(w,{})]})}),(0,k.jsx)(h,{control:c,name:`lastname`,render:({field:e})=>(0,k.jsxs)(_,{children:[(0,k.jsx)(b,{className:`pb-1`,children:`Last Name`}),(0,k.jsx)(S,{children:(0,k.jsx)(x,{type:`text`,className:`dark:bg-black dark:border-black`,autoCapitalize:`words`,...e})}),(0,k.jsx)(w,{})]})}),(0,k.jsxs)(_,{children:[(0,k.jsx)(b,{htmlFor:`profile-email`,className:`pb-1`,children:`Email`}),(0,k.jsx)(S,{children:(0,k.jsx)(x,{id:`profile-email`,type:`email`,enterKeyHint:`next`,autoComplete:`email`,autoCapitalize:`none`,value:a?.email||``,disabled:!0,readOnly:!0})})]}),(0,k.jsx)(h,{control:c,name:`newPassword`,render:({field:e})=>(0,k.jsxs)(_,{children:[(0,k.jsx)(b,{className:`pb-1`,children:`New Password`}),(0,k.jsx)(S,{children:(0,k.jsx)(x,{type:`password`,placeholder:`Optional`,className:`dark:bg-black dark:border-black`,autoComplete:`new-password`,autoCapitalize:`none`,...e})}),(0,k.jsx)(w,{})]})}),(0,k.jsx)(h,{control:c,name:`confirmNewPassword`,render:({field:e})=>(0,k.jsxs)(_,{children:[(0,k.jsx)(b,{className:`pb-1`,children:`Confirm New Password`}),(0,k.jsx)(S,{children:(0,k.jsx)(x,{type:`password`,className:`dark:bg-black dark:border-black`,autoComplete:`new-password`,autoCapitalize:`none`,...e})}),(0,k.jsx)(w,{})]})}),(0,k.jsx)(`div`,{className:`flex justify-between w-full`,children:(0,k.jsxs)(i,{type:`submit`,variant:`submit`,className:`rounded-full`,disabled:N||!A||!j,children:[(0,k.jsx)(y,{}),` Update Profile`]})})]})})]})}export{A as ProfileIndex};
2
- //# sourceMappingURL=profile-CwBWGuVt.js.map
1
+ import{a as e}from"./rolldown-runtime-Cyuzqnbw.js";import{h as t,i as n,r,t as i}from"./button-kCMf1ZBL.js";import{v as a,x as o}from"./vendor-core-BIhSIGPv.js";import{E as s,k as c,x as l}from"./vendor-tanstack-DmFvmRiZ.js";import{a as u}from"./vendor-datadog-Bq_0f1ke.js";import{r as d}from"./vendor-react-BqTNj-ZI.js";import{Tt as f,at as p,ut as m}from"./vendor-ui-to0aD0Fq.js";import{Ct as h,Mt as g,St as _,Tt as v,Xt as y,bt as b,vt as x,wt as S,yn as C,yt as w}from"./index-oRZw5GW3.js";async function T(e){let{id:n,newPassword:r,confirmNewPassword:i,...a}=e,o={...a};r&&r===i&&(o.password=r);let{data:s}=await t.patch(`/User/${n}`,o);return s}function E(){return c({mutationFn:e=>T(e)})}var D=a({id:o(),firstname:o({error:`Please enter your first name.`}).min(2,{error:`First name is required.`}).max(50,{error:`First name must be less than 50 characters.`}),lastname:o({error:`Please enter your last name.`}).min(2,{error:`Last name is required.`}).max(50,{error:`Last name must be less than 50 characters.`}),newPassword:o({error:`Please enter your new password.`}).min(8,{error:`Password must be 8 characters or more.`}).or(o().max(0)),confirmNewPassword:o().optional()}).refine(e=>e.newPassword===e.confirmNewPassword,{error:`Passwords do not match`,path:[`confirmNewPassword`]}),O=e(u(),1),k=d();function A(){let e=s(),t=l(),{user:a}=C(),o=m({resolver:p(D),defaultValues:{confirmNewPassword:``,firstname:a?.firstname||``,id:a?.id||``,lastname:a?.lastname||``,newPassword:``}}),{control:c,handleSubmit:u,reset:d,formState:{defaultValues:T,isDirty:A,isValid:j}}=o,{mutate:M,isPending:N}=E(),P=(0,O.useCallback)(async i=>{i&&M(i,{onSuccess:a=>{d({...T,...a}),n.updateUserForEntity(r,a),i.newPassword?(f.success(`Profile updated successfully!`,{description:`Please sign in with your new password.`}),g(),t({to:`/sign-in`}),e.invalidate()):f.success(`Profile updated successfully!`)}})},[T,t,d,e,M]);return(0,k.jsxs)(`div`,{className:`mt-20 px-4 pt-4 md:px-12 max-w-2xl`,children:[(0,k.jsx)(`h1`,{className:`text-2xl font-light`,children:`Profile`}),(0,k.jsx)(v,{...o,children:(0,k.jsxs)(`form`,{id:`profile-edit-form`,name:`profile-edit-form`,onSubmit:u(P),className:`grid gap-4 my-4`,children:[(0,k.jsx)(h,{control:c,name:`firstname`,render:({field:e})=>(0,k.jsxs)(_,{children:[(0,k.jsx)(b,{className:`pb-1`,children:`First Name`}),(0,k.jsx)(S,{children:(0,k.jsx)(x,{type:`text`,className:`dark:bg-black dark:border-black`,autoCapitalize:`words`,autoFocus:!0,...e})}),(0,k.jsx)(w,{})]})}),(0,k.jsx)(h,{control:c,name:`lastname`,render:({field:e})=>(0,k.jsxs)(_,{children:[(0,k.jsx)(b,{className:`pb-1`,children:`Last Name`}),(0,k.jsx)(S,{children:(0,k.jsx)(x,{type:`text`,className:`dark:bg-black dark:border-black`,autoCapitalize:`words`,...e})}),(0,k.jsx)(w,{})]})}),(0,k.jsxs)(_,{children:[(0,k.jsx)(b,{htmlFor:`profile-email`,className:`pb-1`,children:`Email`}),(0,k.jsx)(S,{children:(0,k.jsx)(x,{id:`profile-email`,type:`email`,enterKeyHint:`next`,autoComplete:`email`,autoCapitalize:`none`,value:a?.email||``,disabled:!0,readOnly:!0})})]}),(0,k.jsx)(h,{control:c,name:`newPassword`,render:({field:e})=>(0,k.jsxs)(_,{children:[(0,k.jsx)(b,{className:`pb-1`,children:`New Password`}),(0,k.jsx)(S,{children:(0,k.jsx)(x,{type:`password`,placeholder:`Optional`,className:`dark:bg-black dark:border-black`,autoComplete:`new-password`,autoCapitalize:`none`,...e})}),(0,k.jsx)(w,{})]})}),(0,k.jsx)(h,{control:c,name:`confirmNewPassword`,render:({field:e})=>(0,k.jsxs)(_,{children:[(0,k.jsx)(b,{className:`pb-1`,children:`Confirm New Password`}),(0,k.jsx)(S,{children:(0,k.jsx)(x,{type:`password`,className:`dark:bg-black dark:border-black`,autoComplete:`new-password`,autoCapitalize:`none`,...e})}),(0,k.jsx)(w,{})]})}),(0,k.jsx)(`div`,{className:`flex justify-between w-full`,children:(0,k.jsxs)(i,{type:`submit`,variant:`submit`,className:`rounded-full`,disabled:N||!A||!j,children:[(0,k.jsx)(y,{}),` Update Profile`]})})]})})]})}export{A as ProfileIndex};
2
+ //# sourceMappingURL=profile-DiV60L50.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"profile-CwBWGuVt.js","names":[],"sources":["../../src/features/profile/mutations/updateUserMutation.ts","../../src/features/profile/mutations/updateUserSchema.ts","../../src/features/profile/index.tsx"],"sourcesContent":["import { apiClient } from '@/config/apiClient';\nimport { UpdateUserSchema } from '@/features/profile/mutations/updateUserSchema';\nimport { SchemaUser } from '@/integrations/api/api.gen';\nimport { User } from '@/integrations/api/api.patch';\nimport { useMutation } from '@tanstack/react-query';\nimport z from 'zod';\n\nasync function onUpdateUser(formData: z.infer<typeof UpdateUserSchema>) {\n\tconst { id, newPassword, confirmNewPassword, ...otherFields } = formData;\n\tconst userData: Partial<SchemaUser & { password: string }> = {\n\t\t...otherFields,\n\t};\n\tif (newPassword && newPassword === confirmNewPassword) {\n\t\tuserData.password = newPassword;\n\t}\n\tconst { data } = await apiClient.patch(`/User/${id}` as '/User/{id}', userData);\n\treturn data as Partial<User>;\n}\n\nexport function useUpdateUserMutation() {\n\treturn useMutation({\n\t\tmutationFn: (formData: z.infer<typeof UpdateUserSchema>) => onUpdateUser(formData),\n\t});\n}\n","import { z } from 'zod';\n\nexport const UpdateUserSchema = z\n\t.object({\n\t\tid: z.string(),\n\t\tfirstname: z\n\t\t\t.string({\n\t\t\t\terror: 'Please enter your first name.',\n\t\t\t})\n\t\t\t.min(2, { error: 'First name is required.' })\n\t\t\t.max(50, { error: 'First name must be less than 50 characters.' }),\n\t\tlastname: z\n\t\t\t.string({\n\t\t\t\terror: 'Please enter your last name.',\n\t\t\t})\n\t\t\t.min(2, { error: 'Last name is required.' })\n\t\t\t.max(50, { error: 'Last name must be less than 50 characters.' }),\n\t\tnewPassword: z\n\t\t\t.string({\n\t\t\t\terror: 'Please enter your new password.',\n\t\t\t})\n\t\t\t.min(8, { error: 'Password must be 8 characters or more.' })\n\t\t\t.or(z.string().max(0)),\n\t\tconfirmNewPassword: z\n\t\t\t.string()\n\t\t\t.optional(),\n\t})\n\t.refine((data) => data.newPassword === data.confirmNewPassword, {\n\t\terror: 'Passwords do not match',\n\t\tpath: ['confirmNewPassword'],\n\t});\n","import { Button } from '@/components/ui/button';\nimport { Form } from '@/components/ui/form/Form';\nimport { FormControl } from '@/components/ui/form/FormControl';\nimport { FormField } from '@/components/ui/form/FormField';\nimport { FormItem } from '@/components/ui/form/FormItem';\nimport { FormLabel } from '@/components/ui/form/FormLabel';\nimport { FormMessage } from '@/components/ui/form/FormMessage';\nimport { Input } from '@/components/ui/input';\nimport { logoutOnSuccess } from '@/features/auth/handlers/logoutOnSuccess';\nimport { authStore, OverallAppSignIn } from '@/features/auth/store/authStore';\nimport { useUpdateUserMutation } from '@/features/profile/mutations/updateUserMutation';\nimport { UpdateUserSchema } from '@/features/profile/mutations/updateUserSchema';\nimport { useCloudAuth } from '@/hooks/useAuth';\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { useNavigate, useRouter } from '@tanstack/react-router';\nimport { Save } from 'lucide-react';\nimport { useCallback } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { toast } from 'sonner';\nimport { z } from 'zod';\n\nexport function ProfileIndex() {\n\tconst router = useRouter();\n\tconst navigate = useNavigate();\n\tconst { user } = useCloudAuth();\n\n\tconst methods = useForm({\n\t\tresolver: zodResolver(UpdateUserSchema),\n\t\tdefaultValues: {\n\t\t\tconfirmNewPassword: '',\n\t\t\tfirstname: user?.firstname || '',\n\t\t\tid: user?.id || '',\n\t\t\tlastname: user?.lastname || '',\n\t\t\tnewPassword: '',\n\t\t},\n\t});\n\tconst { control, handleSubmit, reset, formState: { defaultValues, isDirty, isValid } } = methods;\n\tconst { mutate: updateUser, isPending: isUpdatePending } = useUpdateUserMutation();\n\n\tconst onSubmitClick = useCallback(\n\t\tasync (formData: z.infer<typeof UpdateUserSchema>) => {\n\t\t\tif (formData) {\n\t\t\t\tupdateUser(formData, {\n\t\t\t\t\tonSuccess: (data) => {\n\t\t\t\t\t\treset({\n\t\t\t\t\t\t\t...defaultValues,\n\t\t\t\t\t\t\t...data,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tauthStore.updateUserForEntity(OverallAppSignIn, data);\n\t\t\t\t\t\tif (formData.newPassword) {\n\t\t\t\t\t\t\ttoast.success('Profile updated successfully!', {\n\t\t\t\t\t\t\t\tdescription: 'Please sign in with your new password.',\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tlogoutOnSuccess();\n\t\t\t\t\t\t\tvoid navigate({ to: '/sign-in' });\n\t\t\t\t\t\t\tvoid router.invalidate();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ttoast.success('Profile updated successfully!');\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\t[defaultValues, navigate, reset, router, updateUser],\n\t);\n\n\treturn (\n\t\t<div className=\"mt-20 px-4 pt-4 md:px-12 max-w-2xl\">\n\t\t\t<h1 className=\"text-2xl font-light\">Profile</h1>\n\t\t\t<Form {...methods}>\n\t\t\t\t<form\n\t\t\t\t\tid=\"profile-edit-form\"\n\t\t\t\t\tname=\"profile-edit-form\"\n\t\t\t\t\tonSubmit={handleSubmit(onSubmitClick)}\n\t\t\t\t\tclassName=\"grid gap-4 my-4\"\n\t\t\t\t>\n\t\t\t\t\t<FormField\n\t\t\t\t\t\tcontrol={control}\n\t\t\t\t\t\tname=\"firstname\"\n\t\t\t\t\t\trender={({ field }) => (\n\t\t\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t\t\t<FormLabel className=\"pb-1\">First Name</FormLabel>\n\t\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t\t<Input\n\t\t\t\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\t\t\t\tclassName=\"dark:bg-black dark:border-black\"\n\t\t\t\t\t\t\t\t\t\tautoCapitalize=\"words\"\n\t\t\t\t\t\t\t\t\t\tautoFocus\n\t\t\t\t\t\t\t\t\t\t{...field}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</FormControl>\n\t\t\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t\t\t</FormItem>\n\t\t\t\t\t\t)}\n\t\t\t\t\t/>\n\n\t\t\t\t\t<FormField\n\t\t\t\t\t\tcontrol={control}\n\t\t\t\t\t\tname=\"lastname\"\n\t\t\t\t\t\trender={({ field }) => (\n\t\t\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t\t\t<FormLabel className=\"pb-1\">Last Name</FormLabel>\n\t\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t\t<Input\n\t\t\t\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\t\t\t\tclassName=\"dark:bg-black dark:border-black\"\n\t\t\t\t\t\t\t\t\t\tautoCapitalize=\"words\"\n\t\t\t\t\t\t\t\t\t\t{...field}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</FormControl>\n\t\t\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t\t\t</FormItem>\n\t\t\t\t\t\t)}\n\t\t\t\t\t/>\n\n\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t<FormLabel htmlFor=\"profile-email\" className=\"pb-1\">Email</FormLabel>\n\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t<Input\n\t\t\t\t\t\t\t\tid=\"profile-email\"\n\t\t\t\t\t\t\t\ttype=\"email\"\n\t\t\t\t\t\t\t\tenterKeyHint=\"next\"\n\t\t\t\t\t\t\t\tautoComplete=\"email\"\n\t\t\t\t\t\t\t\tautoCapitalize=\"none\"\n\t\t\t\t\t\t\t\tvalue={user?.email || ''}\n\t\t\t\t\t\t\t\tdisabled={true}\n\t\t\t\t\t\t\t\treadOnly={true}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</FormControl>\n\t\t\t\t\t</FormItem>\n\n\t\t\t\t\t<FormField\n\t\t\t\t\t\tcontrol={control}\n\t\t\t\t\t\tname=\"newPassword\"\n\t\t\t\t\t\trender={({ field }) => (\n\t\t\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t\t\t<FormLabel className=\"pb-1\">New Password</FormLabel>\n\t\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t\t<Input\n\t\t\t\t\t\t\t\t\t\ttype=\"password\"\n\t\t\t\t\t\t\t\t\t\tplaceholder=\"Optional\"\n\t\t\t\t\t\t\t\t\t\tclassName=\"dark:bg-black dark:border-black\"\n\t\t\t\t\t\t\t\t\t\tautoComplete=\"new-password\"\n\t\t\t\t\t\t\t\t\t\tautoCapitalize=\"none\"\n\t\t\t\t\t\t\t\t\t\t{...field}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</FormControl>\n\t\t\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t\t\t</FormItem>\n\t\t\t\t\t\t)}\n\t\t\t\t\t/>\n\n\t\t\t\t\t<FormField\n\t\t\t\t\t\tcontrol={control}\n\t\t\t\t\t\tname=\"confirmNewPassword\"\n\t\t\t\t\t\trender={({ field }) => (\n\t\t\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t\t\t<FormLabel className=\"pb-1\">Confirm New Password</FormLabel>\n\t\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t\t<Input\n\t\t\t\t\t\t\t\t\t\ttype=\"password\"\n\t\t\t\t\t\t\t\t\t\tclassName=\"dark:bg-black dark:border-black\"\n\t\t\t\t\t\t\t\t\t\tautoComplete=\"new-password\"\n\t\t\t\t\t\t\t\t\t\tautoCapitalize=\"none\"\n\t\t\t\t\t\t\t\t\t\t{...field}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</FormControl>\n\t\t\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t\t\t</FormItem>\n\t\t\t\t\t\t)}\n\t\t\t\t\t/>\n\n\t\t\t\t\t<div className=\"flex justify-between w-full\">\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\ttype=\"submit\"\n\t\t\t\t\t\t\tvariant=\"submit\"\n\t\t\t\t\t\t\tclassName=\"rounded-full\"\n\t\t\t\t\t\t\tdisabled={isUpdatePending || !isDirty || !isValid}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Save /> Update Profile\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</div>\n\t\t\t\t</form>\n\t\t\t</Form>\n\t\t</div>\n\t);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"profile-DiV60L50.js","names":[],"sources":["../../src/features/profile/mutations/updateUserMutation.ts","../../src/features/profile/mutations/updateUserSchema.ts","../../src/features/profile/index.tsx"],"sourcesContent":["import { apiClient } from '@/config/apiClient';\nimport { UpdateUserSchema } from '@/features/profile/mutations/updateUserSchema';\nimport { SchemaUser } from '@/integrations/api/api.gen';\nimport { User } from '@/integrations/api/api.patch';\nimport { useMutation } from '@tanstack/react-query';\nimport z from 'zod';\n\nasync function onUpdateUser(formData: z.infer<typeof UpdateUserSchema>) {\n\tconst { id, newPassword, confirmNewPassword, ...otherFields } = formData;\n\tconst userData: Partial<SchemaUser & { password: string }> = {\n\t\t...otherFields,\n\t};\n\tif (newPassword && newPassword === confirmNewPassword) {\n\t\tuserData.password = newPassword;\n\t}\n\tconst { data } = await apiClient.patch(`/User/${id}` as '/User/{id}', userData);\n\treturn data as Partial<User>;\n}\n\nexport function useUpdateUserMutation() {\n\treturn useMutation({\n\t\tmutationFn: (formData: z.infer<typeof UpdateUserSchema>) => onUpdateUser(formData),\n\t});\n}\n","import { z } from 'zod';\n\nexport const UpdateUserSchema = z\n\t.object({\n\t\tid: z.string(),\n\t\tfirstname: z\n\t\t\t.string({\n\t\t\t\terror: 'Please enter your first name.',\n\t\t\t})\n\t\t\t.min(2, { error: 'First name is required.' })\n\t\t\t.max(50, { error: 'First name must be less than 50 characters.' }),\n\t\tlastname: z\n\t\t\t.string({\n\t\t\t\terror: 'Please enter your last name.',\n\t\t\t})\n\t\t\t.min(2, { error: 'Last name is required.' })\n\t\t\t.max(50, { error: 'Last name must be less than 50 characters.' }),\n\t\tnewPassword: z\n\t\t\t.string({\n\t\t\t\terror: 'Please enter your new password.',\n\t\t\t})\n\t\t\t.min(8, { error: 'Password must be 8 characters or more.' })\n\t\t\t.or(z.string().max(0)),\n\t\tconfirmNewPassword: z\n\t\t\t.string()\n\t\t\t.optional(),\n\t})\n\t.refine((data) => data.newPassword === data.confirmNewPassword, {\n\t\terror: 'Passwords do not match',\n\t\tpath: ['confirmNewPassword'],\n\t});\n","import { Button } from '@/components/ui/button';\nimport { Form } from '@/components/ui/form/Form';\nimport { FormControl } from '@/components/ui/form/FormControl';\nimport { FormField } from '@/components/ui/form/FormField';\nimport { FormItem } from '@/components/ui/form/FormItem';\nimport { FormLabel } from '@/components/ui/form/FormLabel';\nimport { FormMessage } from '@/components/ui/form/FormMessage';\nimport { Input } from '@/components/ui/input';\nimport { logoutOnSuccess } from '@/features/auth/handlers/logoutOnSuccess';\nimport { authStore, OverallAppSignIn } from '@/features/auth/store/authStore';\nimport { useUpdateUserMutation } from '@/features/profile/mutations/updateUserMutation';\nimport { UpdateUserSchema } from '@/features/profile/mutations/updateUserSchema';\nimport { useCloudAuth } from '@/hooks/useAuth';\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { useNavigate, useRouter } from '@tanstack/react-router';\nimport { Save } from 'lucide-react';\nimport { useCallback } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { toast } from 'sonner';\nimport { z } from 'zod';\n\nexport function ProfileIndex() {\n\tconst router = useRouter();\n\tconst navigate = useNavigate();\n\tconst { user } = useCloudAuth();\n\n\tconst methods = useForm({\n\t\tresolver: zodResolver(UpdateUserSchema),\n\t\tdefaultValues: {\n\t\t\tconfirmNewPassword: '',\n\t\t\tfirstname: user?.firstname || '',\n\t\t\tid: user?.id || '',\n\t\t\tlastname: user?.lastname || '',\n\t\t\tnewPassword: '',\n\t\t},\n\t});\n\tconst { control, handleSubmit, reset, formState: { defaultValues, isDirty, isValid } } = methods;\n\tconst { mutate: updateUser, isPending: isUpdatePending } = useUpdateUserMutation();\n\n\tconst onSubmitClick = useCallback(\n\t\tasync (formData: z.infer<typeof UpdateUserSchema>) => {\n\t\t\tif (formData) {\n\t\t\t\tupdateUser(formData, {\n\t\t\t\t\tonSuccess: (data) => {\n\t\t\t\t\t\treset({\n\t\t\t\t\t\t\t...defaultValues,\n\t\t\t\t\t\t\t...data,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tauthStore.updateUserForEntity(OverallAppSignIn, data);\n\t\t\t\t\t\tif (formData.newPassword) {\n\t\t\t\t\t\t\ttoast.success('Profile updated successfully!', {\n\t\t\t\t\t\t\t\tdescription: 'Please sign in with your new password.',\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tlogoutOnSuccess();\n\t\t\t\t\t\t\tvoid navigate({ to: '/sign-in' });\n\t\t\t\t\t\t\tvoid router.invalidate();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ttoast.success('Profile updated successfully!');\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\t[defaultValues, navigate, reset, router, updateUser],\n\t);\n\n\treturn (\n\t\t<div className=\"mt-20 px-4 pt-4 md:px-12 max-w-2xl\">\n\t\t\t<h1 className=\"text-2xl font-light\">Profile</h1>\n\t\t\t<Form {...methods}>\n\t\t\t\t<form\n\t\t\t\t\tid=\"profile-edit-form\"\n\t\t\t\t\tname=\"profile-edit-form\"\n\t\t\t\t\tonSubmit={handleSubmit(onSubmitClick)}\n\t\t\t\t\tclassName=\"grid gap-4 my-4\"\n\t\t\t\t>\n\t\t\t\t\t<FormField\n\t\t\t\t\t\tcontrol={control}\n\t\t\t\t\t\tname=\"firstname\"\n\t\t\t\t\t\trender={({ field }) => (\n\t\t\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t\t\t<FormLabel className=\"pb-1\">First Name</FormLabel>\n\t\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t\t<Input\n\t\t\t\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\t\t\t\tclassName=\"dark:bg-black dark:border-black\"\n\t\t\t\t\t\t\t\t\t\tautoCapitalize=\"words\"\n\t\t\t\t\t\t\t\t\t\tautoFocus\n\t\t\t\t\t\t\t\t\t\t{...field}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</FormControl>\n\t\t\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t\t\t</FormItem>\n\t\t\t\t\t\t)}\n\t\t\t\t\t/>\n\n\t\t\t\t\t<FormField\n\t\t\t\t\t\tcontrol={control}\n\t\t\t\t\t\tname=\"lastname\"\n\t\t\t\t\t\trender={({ field }) => (\n\t\t\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t\t\t<FormLabel className=\"pb-1\">Last Name</FormLabel>\n\t\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t\t<Input\n\t\t\t\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\t\t\t\tclassName=\"dark:bg-black dark:border-black\"\n\t\t\t\t\t\t\t\t\t\tautoCapitalize=\"words\"\n\t\t\t\t\t\t\t\t\t\t{...field}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</FormControl>\n\t\t\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t\t\t</FormItem>\n\t\t\t\t\t\t)}\n\t\t\t\t\t/>\n\n\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t<FormLabel htmlFor=\"profile-email\" className=\"pb-1\">Email</FormLabel>\n\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t<Input\n\t\t\t\t\t\t\t\tid=\"profile-email\"\n\t\t\t\t\t\t\t\ttype=\"email\"\n\t\t\t\t\t\t\t\tenterKeyHint=\"next\"\n\t\t\t\t\t\t\t\tautoComplete=\"email\"\n\t\t\t\t\t\t\t\tautoCapitalize=\"none\"\n\t\t\t\t\t\t\t\tvalue={user?.email || ''}\n\t\t\t\t\t\t\t\tdisabled={true}\n\t\t\t\t\t\t\t\treadOnly={true}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</FormControl>\n\t\t\t\t\t</FormItem>\n\n\t\t\t\t\t<FormField\n\t\t\t\t\t\tcontrol={control}\n\t\t\t\t\t\tname=\"newPassword\"\n\t\t\t\t\t\trender={({ field }) => (\n\t\t\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t\t\t<FormLabel className=\"pb-1\">New Password</FormLabel>\n\t\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t\t<Input\n\t\t\t\t\t\t\t\t\t\ttype=\"password\"\n\t\t\t\t\t\t\t\t\t\tplaceholder=\"Optional\"\n\t\t\t\t\t\t\t\t\t\tclassName=\"dark:bg-black dark:border-black\"\n\t\t\t\t\t\t\t\t\t\tautoComplete=\"new-password\"\n\t\t\t\t\t\t\t\t\t\tautoCapitalize=\"none\"\n\t\t\t\t\t\t\t\t\t\t{...field}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</FormControl>\n\t\t\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t\t\t</FormItem>\n\t\t\t\t\t\t)}\n\t\t\t\t\t/>\n\n\t\t\t\t\t<FormField\n\t\t\t\t\t\tcontrol={control}\n\t\t\t\t\t\tname=\"confirmNewPassword\"\n\t\t\t\t\t\trender={({ field }) => (\n\t\t\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t\t\t<FormLabel className=\"pb-1\">Confirm New Password</FormLabel>\n\t\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t\t<Input\n\t\t\t\t\t\t\t\t\t\ttype=\"password\"\n\t\t\t\t\t\t\t\t\t\tclassName=\"dark:bg-black dark:border-black\"\n\t\t\t\t\t\t\t\t\t\tautoComplete=\"new-password\"\n\t\t\t\t\t\t\t\t\t\tautoCapitalize=\"none\"\n\t\t\t\t\t\t\t\t\t\t{...field}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</FormControl>\n\t\t\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t\t\t</FormItem>\n\t\t\t\t\t\t)}\n\t\t\t\t\t/>\n\n\t\t\t\t\t<div className=\"flex justify-between w-full\">\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\ttype=\"submit\"\n\t\t\t\t\t\t\tvariant=\"submit\"\n\t\t\t\t\t\t\tclassName=\"rounded-full\"\n\t\t\t\t\t\t\tdisabled={isUpdatePending || !isDirty || !isValid}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Save /> Update Profile\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</div>\n\t\t\t\t</form>\n\t\t\t</Form>\n\t\t</div>\n\t);\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{A as e,k as t}from"./vendor-tanstack-DmFvmRiZ.js";import{t as n}from"./createLucideIcon-D6HmSa4x.js";import{zt as r}from"./index-Cd3Zh3nK.js";var i=n(`file`,[[`path`,{d:`M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z`,key:`1oefj6`}],[`path`,{d:`M14 2v5a1 1 0 0 0 1 1h5`,key:`wfsgrz`}]]),a=n(`folder`,[[`path`,{d:`M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z`,key:`1kt360`}]]);function o(...e){let t=e.flat(1);return t.map((e,n)=>typeof e==`string`?s(e,n!==0,n!==t.length-1):e).join(`/`)}function s(e,t=!0,n=!0){let r=t&&e[0]===`/`,i=n&&e[e.length-1]===`/`;return r&&i?e.slice(1,-1):r?e.slice(1):i?e.slice(0,-1):e}var c=[{id:`vanilla-js`,name:`Web + REST ORM`,description:`Define your entities in schema.graphql, add your HTML/CSS/JS in web, and you're cooking!`,tags:[`Harper`,`ORM`,`REST`,`GraphQL`],npm:`@harperfast/template-vanilla-studio`,githubUrl:`https://github.com/HarperFast/create-harper/tree/main/template-vanilla`},{id:`vanilla-ts`,name:`TypeScript`,description:`The same Web + REST ORM from the first template, but with TypeScript sprinkled in.`,tags:[`Harper`,`TypeScript`,`GraphQL`],npm:`@harperfast/template-vanilla-ts-studio`,githubUrl:`https://github.com/HarperFast/create-harper/tree/main/template-vanilla-ts`}];async function l({instanceClient:e,project:t,template:n,entityType:r}){let{data:i}=await e.post(`/`,{operation:`add_component`,project:t,template:n,replicated:r===`cluster`},{timeout:3e5});return i}function u(){return t({mutationFn:l})}function d(e,t,n){for(let r of e)if(r[t]===n)return r}async function f({file:e,project:t,entityType:n,instanceClient:r}){let{data:i}=await r.post(`/`,{operation:`drop_component`,file:e||void 0,project:t,replicated:n===`cluster`});return i}function p(e){let t=(e||``)?.split(`.`);return t.length>1?t.slice(-1)[0]:``}var m={apng:{kind:`image`,mime:`image/apng`},avif:{kind:`image`,mime:`image/avif`},bmp:{kind:`image`,mime:`image/bmp`},gif:{kind:`image`,mime:`image/gif`},ico:{kind:`image`,mime:`image/x-icon`},jfif:{kind:`image`,mime:`image/jpeg`},jpeg:{kind:`image`,mime:`image/jpeg`},jpg:{kind:`image`,mime:`image/jpeg`},png:{kind:`image`,mime:`image/png`},svg:{kind:`image`,mime:`image/svg+xml`},webp:{kind:`image`,mime:`image/webp`},m4v:{kind:`video`,mime:`video/mp4`},mov:{kind:`video`,mime:`video/quicktime`},mp4:{kind:`video`,mime:`video/mp4`},ogv:{kind:`video`,mime:`video/ogg`},webm:{kind:`video`,mime:`video/webm`}};function h(e){return m[p(e).toLowerCase()]}function g(e){return h(e)!==void 0}async function _({instanceClient:e,file:t,project:n,encoding:r}){let{data:i}=await e.post(`/`,{operation:`get_component_file`,project:n,file:t,encoding:r??(g(t)?`base64`:`utf8`)});return{project:n,file:t,...i}}function v(t){return e({queryKey:y(t),queryFn:()=>_(t),enabled:!!t.file&&!!t.project,retry:!1})}function y(e){return[e.entityId,`get_component_file`,e.project,e.file,e.encoding]}function b(e){return!!e?.entries}var x=`__root__`,S=`importedApplications`,C=`newApplication`;function w(e){let t={},n=[],i=[],a=[];for(let r of e)b(r)?r.package?i.push(r.path):n.push(r.path):a.push(r.path),T(t,r);return t[x]={index:x,isFolder:!0,children:[C,S,...n,...a].filter(r),data:void 0,canMove:!1,canRename:!1},t[S]={index:S,isFolder:!0,children:i,data:{name:`Imported Applications`,path:S,package:S,project:``,entries:[]},canMove:!1,canRename:!1},t[C]={index:C,isFolder:!1,data:{name:`New Application`,path:C,project:``},canMove:!1,canRename:!1},{items:t,rootId:x}}function T(e,t){let n=t.path;if(b(t)){let r=t,i=[],a=[];for(let e of r.entries)b(e)?i.push(e.path):a.push(e.path);e[n]={index:n,isFolder:!0,children:[...i,...a],data:t,canMove:!1,canRename:!1};for(let t of r.entries)T(e,t)}else e[n]={index:n,isFolder:!1,data:t,canMove:!t.package,canRename:!t.package}}function E(e,t,n,r=[]){let i=[];for(let a of e){let e=n(a,r);i.push(e);let o=a,s=o[t];s&&(e[t]=E(s,t,n,[...r,o]))}return i}function D(e){let t=new Set;return{rootEntries:E(e||[],`entries`,(e,n)=>{let r=b(e)&&e.entries.find(e=>e.name.toLowerCase()===`readme.md`),i=[...n.map(e=>e.name),e.name].join(`/`);return t.add(i),{name:e.name,path:i,project:(n[0]||e)?.name,package:(n[0]||e)?.package,overviewEntry:r&&!b(r)&&{name:r.name,path:[...n.map(e=>e.name),e.name,r.name].join(`/`),project:(n[0]||e)?.name,package:(n[0]||e)?.package}||void 0}}),pathsRegistry:t}}async function O({file:e,payload:t,project:n,entityType:r,instanceClient:i,encoding:a}){let{data:o}=await i.post(`/`,{operation:`set_component_file`,file:e,payload:t,project:n,encoding:a,replicated:r===`cluster`},{timeout:3e5});return o}function k(){return t({mutationFn:O})}export{c as _,S as a,i as b,_ as c,h as d,p as f,u as g,l as h,w as i,y as l,d as m,k as n,C as o,f as p,D as r,b as s,O as t,v as u,o as v,a as y};
2
- //# sourceMappingURL=setComponentFile-Dhrmd8eR.js.map
1
+ import{A as e,k as t}from"./vendor-tanstack-DmFvmRiZ.js";import{t as n}from"./createLucideIcon-D6HmSa4x.js";import{zt as r}from"./index-oRZw5GW3.js";var i=n(`file`,[[`path`,{d:`M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z`,key:`1oefj6`}],[`path`,{d:`M14 2v5a1 1 0 0 0 1 1h5`,key:`wfsgrz`}]]),a=n(`folder`,[[`path`,{d:`M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z`,key:`1kt360`}]]);function o(...e){let t=e.flat(1);return t.map((e,n)=>typeof e==`string`?s(e,n!==0,n!==t.length-1):e).join(`/`)}function s(e,t=!0,n=!0){let r=t&&e[0]===`/`,i=n&&e[e.length-1]===`/`;return r&&i?e.slice(1,-1):r?e.slice(1):i?e.slice(0,-1):e}var c=[{id:`vanilla-js`,name:`Web + REST ORM`,description:`Define your entities in schema.graphql, add your HTML/CSS/JS in web, and you're cooking!`,tags:[`Harper`,`ORM`,`REST`,`GraphQL`],npm:`@harperfast/template-vanilla-studio`,githubUrl:`https://github.com/HarperFast/create-harper/tree/main/template-vanilla`},{id:`vanilla-ts`,name:`TypeScript`,description:`The same Web + REST ORM from the first template, but with TypeScript sprinkled in.`,tags:[`Harper`,`TypeScript`,`GraphQL`],npm:`@harperfast/template-vanilla-ts-studio`,githubUrl:`https://github.com/HarperFast/create-harper/tree/main/template-vanilla-ts`}];async function l({instanceClient:e,project:t,template:n,entityType:r}){let{data:i}=await e.post(`/`,{operation:`add_component`,project:t,template:n,replicated:r===`cluster`},{timeout:3e5});return i}function u(){return t({mutationFn:l})}function d(e,t,n){for(let r of e)if(r[t]===n)return r}async function f({file:e,project:t,entityType:n,instanceClient:r}){let{data:i}=await r.post(`/`,{operation:`drop_component`,file:e||void 0,project:t,replicated:n===`cluster`});return i}function p(e){let t=(e||``)?.split(`.`);return t.length>1?t.slice(-1)[0]:``}var m={apng:{kind:`image`,mime:`image/apng`},avif:{kind:`image`,mime:`image/avif`},bmp:{kind:`image`,mime:`image/bmp`},gif:{kind:`image`,mime:`image/gif`},ico:{kind:`image`,mime:`image/x-icon`},jfif:{kind:`image`,mime:`image/jpeg`},jpeg:{kind:`image`,mime:`image/jpeg`},jpg:{kind:`image`,mime:`image/jpeg`},png:{kind:`image`,mime:`image/png`},svg:{kind:`image`,mime:`image/svg+xml`},webp:{kind:`image`,mime:`image/webp`},m4v:{kind:`video`,mime:`video/mp4`},mov:{kind:`video`,mime:`video/quicktime`},mp4:{kind:`video`,mime:`video/mp4`},ogv:{kind:`video`,mime:`video/ogg`},webm:{kind:`video`,mime:`video/webm`}};function h(e){return m[p(e).toLowerCase()]}function g(e){return h(e)!==void 0}async function _({instanceClient:e,file:t,project:n,encoding:r}){let{data:i}=await e.post(`/`,{operation:`get_component_file`,project:n,file:t,encoding:r??(g(t)?`base64`:`utf8`)});return{project:n,file:t,...i}}function v(t){return e({queryKey:y(t),queryFn:()=>_(t),enabled:!!t.file&&!!t.project,retry:!1})}function y(e){return[e.entityId,`get_component_file`,e.project,e.file,e.encoding]}function b(e){return!!e?.entries}var x=`__root__`,S=`importedApplications`,C=`newApplication`;function w(e){let t={},n=[],i=[],a=[];for(let r of e)b(r)?r.package?i.push(r.path):n.push(r.path):a.push(r.path),T(t,r);return t[x]={index:x,isFolder:!0,children:[C,S,...n,...a].filter(r),data:void 0,canMove:!1,canRename:!1},t[S]={index:S,isFolder:!0,children:i,data:{name:`Imported Applications`,path:S,package:S,project:``,entries:[]},canMove:!1,canRename:!1},t[C]={index:C,isFolder:!1,data:{name:`New Application`,path:C,project:``},canMove:!1,canRename:!1},{items:t,rootId:x}}function T(e,t){let n=t.path;if(b(t)){let r=t,i=[],a=[];for(let e of r.entries)b(e)?i.push(e.path):a.push(e.path);e[n]={index:n,isFolder:!0,children:[...i,...a],data:t,canMove:!1,canRename:!1};for(let t of r.entries)T(e,t)}else e[n]={index:n,isFolder:!1,data:t,canMove:!t.package,canRename:!t.package}}function E(e,t,n,r=[]){let i=[];for(let a of e){let e=n(a,r);i.push(e);let o=a,s=o[t];s&&(e[t]=E(s,t,n,[...r,o]))}return i}function D(e){let t=new Set;return{rootEntries:E(e||[],`entries`,(e,n)=>{let r=b(e)&&e.entries.find(e=>e.name.toLowerCase()===`readme.md`),i=[...n.map(e=>e.name),e.name].join(`/`);return t.add(i),{name:e.name,path:i,project:(n[0]||e)?.name,package:(n[0]||e)?.package,overviewEntry:r&&!b(r)&&{name:r.name,path:[...n.map(e=>e.name),e.name,r.name].join(`/`),project:(n[0]||e)?.name,package:(n[0]||e)?.package}||void 0}}),pathsRegistry:t}}async function O({file:e,payload:t,project:n,entityType:r,instanceClient:i,encoding:a}){let{data:o}=await i.post(`/`,{operation:`set_component_file`,file:e,payload:t,project:n,encoding:a,replicated:r===`cluster`},{timeout:3e5});return o}function k(){return t({mutationFn:O})}export{c as _,S as a,i as b,_ as c,h as d,p as f,u as g,l as h,w as i,y as l,d as m,k as n,C as o,f as p,D as r,b as s,O as t,v as u,o as v,a as y};
2
+ //# sourceMappingURL=setComponentFile-Bz6WI4jy.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"setComponentFile-Dhrmd8eR.js","names":["__iconNode"],"sources":["../../node_modules/.pnpm/lucide-react@1.17.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/file.mjs","../../node_modules/.pnpm/lucide-react@1.17.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/folder.mjs","../../src/lib/string/paths/joinPath.ts","../../src/features/instance/applications/components/NewApplication/templates.ts","../../src/integrations/api/instance/applications/addComponent.ts","../../src/lib/arrays/findBy.ts","../../src/integrations/api/instance/applications/dropComponent.ts","../../src/lib/string/parseFileExtension.ts","../../src/lib/string/mediaFileType.ts","../../src/integrations/api/instance/applications/getComponentFile.ts","../../src/features/instance/applications/context/isDirectory.ts","../../src/features/instance/applications/components/ApplicationsSidebar/specialItems.ts","../../src/features/instance/applications/components/ApplicationsSidebar/buildItems.tsx","../../src/lib/arrays/transformNodes.ts","../../src/features/instance/applications/components/ApplicationsSidebar/calculateRootEntries.ts","../../src/integrations/api/instance/applications/setComponentFile.ts"],"sourcesContent":["/**\n * @license lucide-react v1.17.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z\",\n key: \"1oefj6\"\n }\n ],\n [\"path\", { d: \"M14 2v5a1 1 0 0 0 1 1h5\", key: \"wfsgrz\" }]\n];\nconst File = createLucideIcon(\"file\", __iconNode);\n\nexport { __iconNode, File as default };\n//# sourceMappingURL=file.mjs.map\n","/**\n * @license lucide-react v1.17.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z\",\n key: \"1kt360\"\n }\n ]\n];\nconst Folder = createLucideIcon(\"folder\", __iconNode);\n\nexport { __iconNode, Folder as default };\n//# sourceMappingURL=folder.mjs.map\n","export function joinPath(...parts: (string | string[])[]): string {\n\tconst flattened = parts.flat(1);\n\treturn flattened\n\t\t.map((p, i) =>\n\t\t\ttypeof p !== 'string'\n\t\t\t\t? p\n\t\t\t\t: trimSlashes(p, i !== 0, i !== flattened.length - 1)\n\t\t)\n\t\t.join('/');\n}\n\nfunction trimSlashes(str: string, start: boolean = true, end: boolean = true) {\n\tconst trimStart = start && str[0] === '/';\n\tconst trimEnd = end && str[str.length - 1] === '/';\n\tif (trimStart && trimEnd) {\n\t\treturn str.slice(1, -1);\n\t}\n\tif (trimStart) {\n\t\treturn str.slice(1);\n\t}\n\tif (trimEnd) {\n\t\treturn str.slice(0, -1);\n\t}\n\treturn str;\n}\n","export const templates = [\n\t{\n\t\tid: 'vanilla-js',\n\t\tname: 'Web + REST ORM',\n\t\tdescription: \"Define your entities in schema.graphql, add your HTML/CSS/JS in web, and you're cooking!\",\n\t\ttags: ['Harper', 'ORM', 'REST', 'GraphQL'],\n\t\tnpm: '@harperfast/template-vanilla-studio',\n\t\tgithubUrl: 'https://github.com/HarperFast/create-harper/tree/main/template-vanilla',\n\t},\n\t{\n\t\tid: 'vanilla-ts',\n\t\tname: 'TypeScript',\n\t\tdescription: 'The same Web + REST ORM from the first template, but with TypeScript sprinkled in.',\n\t\ttags: ['Harper', 'TypeScript', 'GraphQL'],\n\t\tnpm: '@harperfast/template-vanilla-ts-studio',\n\t\tgithubUrl: 'https://github.com/HarperFast/create-harper/tree/main/template-vanilla-ts',\n\t},\n\t// {\n\t// \tid: 'nextjs',\n\t// \tname: 'Next.js',\n\t// \tdescription: 'Full-stack React framework with API routes',\n\t// \ttags: ['React', 'SSR', 'API Routes'],\n\t// \tgithubUrl: 'https://github.com/vercel/next.js',\n\t// },\n\t// {\n\t// \tid: 'angular',\n\t// \tname: 'Angular',\n\t// \tdescription: 'Enterprise-ready framework with TypeScript',\n\t// \ttags: ['TypeScript', 'SPA', 'Enterprise'],\n\t// \tgithubUrl: 'https://github.com/angular/angular',\n\t// },\n\t// {\n\t// \tid: 'fastify',\n\t// \tname: 'Fastify',\n\t// \tdescription: 'Fast and low overhead web framework',\n\t// \ttags: ['Node.js', 'REST', 'Performance'],\n\t// \tgithubUrl: 'https://github.com/fastify/fastify',\n\t// },\n\t// {\n\t// \tid: 'vector-search',\n\t// \tname: 'Vector Search',\n\t// \tdescription: 'AI-powered semantic search application',\n\t// \ttags: ['AI', 'Embeddings', 'Search'],\n\t// \tgithubUrl: 'https://github.com/HarperDB/vector-search-template',\n\t// },\n\t// {\n\t// \tid: 'express',\n\t// \tname: 'Express',\n\t// \tdescription: 'Minimal and flexible Node.js framework',\n\t// \ttags: ['Node.js', 'REST', 'Minimal'],\n\t// \tgithubUrl: 'https://github.com/expressjs/express',\n\t// },\n\t// {\n\t// \tid: 'graphql',\n\t// \tname: 'GraphQL API',\n\t// \tdescription: 'API with GraphQL query language',\n\t// \ttags: ['GraphQL', 'Apollo', 'API'],\n\t// \tgithubUrl: 'https://github.com/graphql/graphql-js',\n\t// },\n];\n","import { InstanceClientConfig, InstanceTypeConfig } from '@/config/instanceClientConfig';\nimport { ReplicatedResponse } from '@/integrations/api/replication';\nimport { useMutation } from '@tanstack/react-query';\n\nexport interface CreateComponentFormData {\n\tproject: string;\n\ttemplate: string;\n}\n\nexport async function addComponent({\n\tinstanceClient,\n\tproject,\n\ttemplate,\n\tentityType,\n}: CreateComponentFormData & InstanceClientConfig & InstanceTypeConfig): Promise<ReplicatedResponse> {\n\tconst { data } = await instanceClient.post('/', {\n\t\toperation: 'add_component',\n\t\tproject,\n\t\ttemplate,\n\t\treplicated: entityType === 'cluster',\n\t}, { timeout: 300_000 });\n\treturn data;\n}\n\nexport function useAddComponentMutation() {\n\treturn useMutation({\n\t\tmutationFn: addComponent,\n\t});\n}\n","export function findBy<T, F extends keyof T>(array: T[], fieldName: F, value: T[F]): T | undefined {\n\tfor (const element of array) {\n\t\tif (element[fieldName] === value) {\n\t\t\treturn element;\n\t\t}\n\t}\n\treturn undefined;\n}\n","import { InstanceClientConfig, InstanceTypeConfig } from '@/config/instanceClientConfig';\nimport { ReplicatedResponse } from '@/integrations/api/replication';\nimport { useMutation } from '@tanstack/react-query';\n\ninterface DropComponentRequest extends InstanceClientConfig, InstanceTypeConfig {\n\tproject: string;\n\tfile: string | undefined;\n}\n\nexport async function dropComponent({\n\tfile,\n\tproject,\n\tentityType,\n\tinstanceClient,\n}: DropComponentRequest): Promise<ReplicatedResponse> {\n\tconst { data } = await instanceClient.post('/', {\n\t\toperation: 'drop_component',\n\t\tfile: file || undefined,\n\t\tproject,\n\t\treplicated: entityType === 'cluster',\n\t});\n\treturn data;\n}\n\nexport function useDropComponent() {\n\treturn useMutation({\n\t\tmutationFn: dropComponent,\n\t});\n}\n","export function parseFileExtension(filename: string | undefined) {\n\tconst parts = (filename || '')?.split('.');\n\treturn parts.length > 1 ? parts.slice(-1)[0] : '';\n}\n","import { parseFileExtension } from '@/lib/string/parseFileExtension';\n\nexport type MediaKind = 'image' | 'video';\n\nexport interface MediaFileType {\n\tkind: MediaKind;\n\t/** MIME type used to build the blob/data URL for the preview. */\n\tmime: string;\n}\n\n/**\n * Maps file extensions the Applications editor can preview as media (rather than\n * editing as text) to their kind and MIME type. Limited to formats browsers can\n * render in an `<img>`/`<video>` element.\n */\nconst mediaTypesByExtension: Record<string, MediaFileType> = {\n\t// Images\n\tapng: { kind: 'image', mime: 'image/apng' },\n\tavif: { kind: 'image', mime: 'image/avif' },\n\tbmp: { kind: 'image', mime: 'image/bmp' },\n\tgif: { kind: 'image', mime: 'image/gif' },\n\tico: { kind: 'image', mime: 'image/x-icon' },\n\tjfif: { kind: 'image', mime: 'image/jpeg' },\n\tjpeg: { kind: 'image', mime: 'image/jpeg' },\n\tjpg: { kind: 'image', mime: 'image/jpeg' },\n\tpng: { kind: 'image', mime: 'image/png' },\n\tsvg: { kind: 'image', mime: 'image/svg+xml' },\n\twebp: { kind: 'image', mime: 'image/webp' },\n\t// Videos\n\tm4v: { kind: 'video', mime: 'video/mp4' },\n\tmov: { kind: 'video', mime: 'video/quicktime' },\n\tmp4: { kind: 'video', mime: 'video/mp4' },\n\togv: { kind: 'video', mime: 'video/ogg' },\n\twebm: { kind: 'video', mime: 'video/webm' },\n};\n\n/** Returns the previewable media type for a filename, or undefined if it is not media. */\nexport function getMediaFileType(filename: string | undefined): MediaFileType | undefined {\n\treturn mediaTypesByExtension[parseFileExtension(filename).toLowerCase()];\n}\n\n/** True when the file should be loaded as binary (base64) and previewed as media instead of text. */\nexport function isMediaFile(filename: string | undefined): boolean {\n\treturn getMediaFileType(filename) !== undefined;\n}\n","import { InstanceClientIdConfig } from '@/config/instanceClientConfig';\nimport { isMediaFile } from '@/lib/string/mediaFileType';\nimport { queryOptions } from '@tanstack/react-query';\n\ninterface GetComponentFileRequest extends InstanceClientIdConfig {\n\tproject: string | undefined;\n\tfile: string | undefined;\n\tencoding?: 'utf8' | 'ASCII' | 'binary' | 'hex' | 'base64' | 'utf16le' | 'latin1' | 'ucs2';\n}\n\nexport interface GetComponentFileResponse {\n\tproject: string;\n\tfile: string;\n\tbirthtime: string;\n\tmessage: string;\n\tmtime: string;\n\tsize: number;\n}\n\nexport async function getComponentFile({\n\tinstanceClient,\n\tfile,\n\tproject,\n\tencoding,\n}: GetComponentFileRequest): Promise<GetComponentFileResponse> {\n\tconst { data } = await instanceClient.post('/', {\n\t\toperation: 'get_component_file',\n\t\tproject,\n\t\tfile,\n\t\tencoding: encoding ?? (isMediaFile(file) ? 'base64' : 'utf8'),\n\t});\n\treturn {\n\t\tproject,\n\t\tfile,\n\t\t...data,\n\t};\n}\n\nexport function getComponentFileQueryOptions(params: GetComponentFileRequest) {\n\treturn queryOptions({\n\t\tqueryKey: getComponentFileQueryKey(params),\n\t\tqueryFn: () => getComponentFile(params),\n\t\tenabled: !!params.file && !!params.project,\n\t\tretry: false,\n\t});\n}\n\nexport function getComponentFileQueryKey(params: GetComponentFileRequest) {\n\treturn [\n\t\tparams.entityId,\n\t\t'get_component_file',\n\t\tparams.project,\n\t\tparams.file,\n\t\tparams.encoding,\n\t] as const;\n}\n","import { DirectoryEntry } from '@/features/instance/applications/context/directoryEntry';\nimport { FileEntry } from '@/features/instance/applications/context/fileEntry';\nimport { APIDirectoryEntry, APIFileEntry } from '@/integrations/api/instance/applications/getComponents';\n\nexport function isDirectory(entry: DirectoryEntry | FileEntry | undefined): entry is DirectoryEntry;\nexport function isDirectory(entry: APIDirectoryEntry | APIFileEntry | undefined): entry is APIDirectoryEntry;\nexport function isDirectory(entry: DirectoryEntry | FileEntry | APIDirectoryEntry | APIFileEntry | undefined) {\n\treturn Boolean((entry as DirectoryEntry)?.entries);\n}\n","export const rootId = '__root__';\nexport const importedApplications = 'importedApplications';\nexport const newApplication = 'newApplication';\n","import type { DirectoryEntry } from '@/features/instance/applications/context/directoryEntry';\nimport type { FileEntry } from '@/features/instance/applications/context/fileEntry';\nimport { isDirectory } from '@/features/instance/applications/context/isDirectory';\nimport { excludeFalsy } from '@/lib/arrays/excludeFalsy';\nimport type { TreeItem } from 'react-complex-tree';\nimport { importedApplications, newApplication, rootId } from './specialItems';\n\nexport function buildItems(rootEntries: Array<DirectoryEntry | FileEntry>): {\n\titems: Record<string, TreeItem<DirectoryEntry | FileEntry | undefined>>;\n\trootId: string;\n} {\n\tconst items: Record<string, TreeItem<DirectoryEntry | FileEntry | undefined>> = {};\n\n\tconst directoryIds: string[] = [];\n\tconst applicationIds: string[] = [];\n\tconst fileIds: string[] = [];\n\tfor (const entry of rootEntries) {\n\t\tif (isDirectory(entry)) {\n\t\t\tif (entry.package) {\n\t\t\t\tapplicationIds.push(entry.path);\n\t\t\t} else {\n\t\t\t\tdirectoryIds.push(entry.path);\n\t\t\t}\n\t\t} else {\n\t\t\tfileIds.push(entry.path);\n\t\t}\n\t\taddEntry(items, entry);\n\t}\n\n\titems[rootId] = {\n\t\tindex: rootId,\n\t\tisFolder: true,\n\t\tchildren: [\n\t\t\tnewApplication,\n\t\t\timportedApplications,\n\t\t\t...directoryIds,\n\t\t\t...fileIds,\n\t\t].filter(\n\t\t\texcludeFalsy,\n\t\t),\n\t\tdata: undefined,\n\t\tcanMove: false,\n\t\tcanRename: false,\n\t} satisfies TreeItem<undefined>;\n\n\titems[importedApplications] = {\n\t\tindex: importedApplications,\n\t\tisFolder: true,\n\t\tchildren: applicationIds,\n\t\tdata: {\n\t\t\tname: 'Imported Applications',\n\t\t\tpath: importedApplications,\n\t\t\tpackage: importedApplications,\n\t\t\tproject: '',\n\t\t\tentries: [],\n\t\t},\n\t\tcanMove: false,\n\t\tcanRename: false,\n\t} satisfies TreeItem<DirectoryEntry>;\n\n\titems[newApplication] = {\n\t\tindex: newApplication,\n\t\tisFolder: false,\n\t\tdata: {\n\t\t\tname: 'New Application',\n\t\t\tpath: newApplication,\n\t\t\tproject: '',\n\t\t},\n\t\tcanMove: false,\n\t\tcanRename: false,\n\t} satisfies TreeItem<FileEntry>;\n\n\treturn { items, rootId };\n}\n\nfunction addEntry(\n\titems: Record<string, TreeItem<DirectoryEntry | FileEntry | undefined>>,\n\tentry: DirectoryEntry | FileEntry,\n) {\n\tconst index = entry.path;\n\tif (isDirectory(entry)) {\n\t\tconst dir = entry as DirectoryEntry;\n\t\tconst childDirectoryIds: string[] = [];\n\t\tconst childFileIds: string[] = [];\n\t\tfor (const childEntry of dir.entries) {\n\t\t\tif (isDirectory(childEntry)) {\n\t\t\t\tchildDirectoryIds.push(childEntry.path);\n\t\t\t} else {\n\t\t\t\tchildFileIds.push(childEntry.path);\n\t\t\t}\n\t\t}\n\t\titems[index] = {\n\t\t\tindex,\n\t\t\tisFolder: true,\n\t\t\tchildren: [...childDirectoryIds, ...childFileIds],\n\t\t\tdata: entry,\n\t\t\tcanMove: false,\n\t\t\tcanRename: false,\n\t\t} satisfies TreeItem<DirectoryEntry>;\n\t\tfor (const child of dir.entries) {\n\t\t\taddEntry(items, child);\n\t\t}\n\t} else {\n\t\titems[index] = {\n\t\t\tindex,\n\t\t\tisFolder: false,\n\t\t\tdata: entry,\n\t\t\tcanMove: !entry.package,\n\t\t\tcanRename: !entry.package,\n\t\t} satisfies TreeItem<FileEntry>;\n\t}\n}\n","export function transformNodes<Transformed, Branch, Leaf>(\n\tnodes: Array<Branch | Leaf>,\n\tnestedPropertyName: keyof Branch,\n\ttransformer: (node: Branch | Leaf, parents: Branch[]) => Transformed,\n\tparents: Branch[] = [],\n): Transformed[] {\n\tconst results: Transformed[] = [];\n\n\tfor (const node of nodes) {\n\t\tconst transformed = transformer(node, parents);\n\t\tresults.push(transformed);\n\t\tconst potentialBranch = node as Branch;\n\t\tconst nestedNodes = potentialBranch[nestedPropertyName] as Array<Branch | Leaf>;\n\t\tif (nestedNodes) {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t\t\t(transformed as any)[nestedPropertyName] = transformNodes(nestedNodes, nestedPropertyName, transformer, [\n\t\t\t\t...parents,\n\t\t\t\tpotentialBranch,\n\t\t\t]);\n\t\t}\n\t}\n\n\treturn results;\n}\n","import { DirectoryEntry } from '@/features/instance/applications/context/directoryEntry';\nimport { FileEntry } from '@/features/instance/applications/context/fileEntry';\nimport { isDirectory } from '@/features/instance/applications/context/isDirectory';\nimport { APIDirectoryEntry, APIFileEntry } from '@/integrations/api/instance/applications/getComponents';\nimport { transformNodes } from '@/lib/arrays/transformNodes';\n\nexport function calculateRootEntries(entries: Array<APIDirectoryEntry | APIFileEntry>): {\n\trootEntries: Array<DirectoryEntry | FileEntry>;\n\tpathsRegistry: Set<string>;\n} {\n\tconst pathsRegistry = new Set<string>();\n\tconst rootEntries = transformNodes(\n\t\tentries || [],\n\t\t'entries',\n\t\t(node: APIFileEntry | APIDirectoryEntry, parents: APIDirectoryEntry[]) => {\n\t\t\tconst readMeAPIFile = isDirectory(node) && node.entries.find(e => e.name.toLowerCase() === 'readme.md');\n\t\t\tconst path = [...parents.map(p => p.name), node.name].join('/');\n\t\t\tpathsRegistry.add(path);\n\t\t\treturn {\n\t\t\t\tname: node.name,\n\t\t\t\tpath,\n\t\t\t\tproject: (parents[0] || node)?.name,\n\t\t\t\tpackage: (parents[0] || node)?.package,\n\t\t\t\toverviewEntry: readMeAPIFile && !isDirectory(readMeAPIFile) && {\n\t\t\t\t\t\t\tname: readMeAPIFile.name,\n\t\t\t\t\t\t\tpath: [...parents.map(p => p.name), node.name, readMeAPIFile.name].join('/'),\n\t\t\t\t\t\t\tproject: (parents[0] || node)?.name,\n\t\t\t\t\t\t\tpackage: (parents[0] || node)?.package,\n\t\t\t\t\t\t} || undefined,\n\t\t\t} satisfies DirectoryEntry | FileEntry;\n\t\t},\n\t);\n\treturn {\n\t\trootEntries,\n\t\tpathsRegistry,\n\t};\n}\n","import { InstanceClientConfig, InstanceTypeConfig } from '@/config/instanceClientConfig';\nimport { useMutation } from '@tanstack/react-query';\n\nexport interface SetComponentFileRequest extends InstanceClientConfig, InstanceTypeConfig {\n\tfile: string;\n\tpayload?: string;\n\tproject: string;\n\tencoding?: 'utf8' | 'ASCII' | 'binary' | 'hex' | 'base64' | 'utf16le' | 'latin1' | 'ucs2';\n}\n\nexport async function setComponentFile({\n\tfile,\n\tpayload,\n\tproject,\n\tentityType,\n\tinstanceClient,\n\tencoding,\n}: SetComponentFileRequest) {\n\tconst { data } = await instanceClient.post('/', {\n\t\toperation: 'set_component_file',\n\t\tfile,\n\t\tpayload,\n\t\tproject,\n\t\tencoding,\n\t\treplicated: entityType === 'cluster',\n\t}, { timeout: 300_000 });\n\treturn data;\n}\n\nexport function useSetComponentFile() {\n\treturn useMutation({\n\t\tmutationFn: setComponentFile,\n\t});\n}\n"],"x_google_ignoreList":[0,1],"mappings":"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"}
1
+ {"version":3,"file":"setComponentFile-Bz6WI4jy.js","names":["__iconNode"],"sources":["../../node_modules/.pnpm/lucide-react@1.17.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/file.mjs","../../node_modules/.pnpm/lucide-react@1.17.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/folder.mjs","../../src/lib/string/paths/joinPath.ts","../../src/features/instance/applications/components/NewApplication/templates.ts","../../src/integrations/api/instance/applications/addComponent.ts","../../src/lib/arrays/findBy.ts","../../src/integrations/api/instance/applications/dropComponent.ts","../../src/lib/string/parseFileExtension.ts","../../src/lib/string/mediaFileType.ts","../../src/integrations/api/instance/applications/getComponentFile.ts","../../src/features/instance/applications/context/isDirectory.ts","../../src/features/instance/applications/components/ApplicationsSidebar/specialItems.ts","../../src/features/instance/applications/components/ApplicationsSidebar/buildItems.tsx","../../src/lib/arrays/transformNodes.ts","../../src/features/instance/applications/components/ApplicationsSidebar/calculateRootEntries.ts","../../src/integrations/api/instance/applications/setComponentFile.ts"],"sourcesContent":["/**\n * @license lucide-react v1.17.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z\",\n key: \"1oefj6\"\n }\n ],\n [\"path\", { d: \"M14 2v5a1 1 0 0 0 1 1h5\", key: \"wfsgrz\" }]\n];\nconst File = createLucideIcon(\"file\", __iconNode);\n\nexport { __iconNode, File as default };\n//# sourceMappingURL=file.mjs.map\n","/**\n * @license lucide-react v1.17.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z\",\n key: \"1kt360\"\n }\n ]\n];\nconst Folder = createLucideIcon(\"folder\", __iconNode);\n\nexport { __iconNode, Folder as default };\n//# sourceMappingURL=folder.mjs.map\n","export function joinPath(...parts: (string | string[])[]): string {\n\tconst flattened = parts.flat(1);\n\treturn flattened\n\t\t.map((p, i) =>\n\t\t\ttypeof p !== 'string'\n\t\t\t\t? p\n\t\t\t\t: trimSlashes(p, i !== 0, i !== flattened.length - 1)\n\t\t)\n\t\t.join('/');\n}\n\nfunction trimSlashes(str: string, start: boolean = true, end: boolean = true) {\n\tconst trimStart = start && str[0] === '/';\n\tconst trimEnd = end && str[str.length - 1] === '/';\n\tif (trimStart && trimEnd) {\n\t\treturn str.slice(1, -1);\n\t}\n\tif (trimStart) {\n\t\treturn str.slice(1);\n\t}\n\tif (trimEnd) {\n\t\treturn str.slice(0, -1);\n\t}\n\treturn str;\n}\n","export const templates = [\n\t{\n\t\tid: 'vanilla-js',\n\t\tname: 'Web + REST ORM',\n\t\tdescription: \"Define your entities in schema.graphql, add your HTML/CSS/JS in web, and you're cooking!\",\n\t\ttags: ['Harper', 'ORM', 'REST', 'GraphQL'],\n\t\tnpm: '@harperfast/template-vanilla-studio',\n\t\tgithubUrl: 'https://github.com/HarperFast/create-harper/tree/main/template-vanilla',\n\t},\n\t{\n\t\tid: 'vanilla-ts',\n\t\tname: 'TypeScript',\n\t\tdescription: 'The same Web + REST ORM from the first template, but with TypeScript sprinkled in.',\n\t\ttags: ['Harper', 'TypeScript', 'GraphQL'],\n\t\tnpm: '@harperfast/template-vanilla-ts-studio',\n\t\tgithubUrl: 'https://github.com/HarperFast/create-harper/tree/main/template-vanilla-ts',\n\t},\n\t// {\n\t// \tid: 'nextjs',\n\t// \tname: 'Next.js',\n\t// \tdescription: 'Full-stack React framework with API routes',\n\t// \ttags: ['React', 'SSR', 'API Routes'],\n\t// \tgithubUrl: 'https://github.com/vercel/next.js',\n\t// },\n\t// {\n\t// \tid: 'angular',\n\t// \tname: 'Angular',\n\t// \tdescription: 'Enterprise-ready framework with TypeScript',\n\t// \ttags: ['TypeScript', 'SPA', 'Enterprise'],\n\t// \tgithubUrl: 'https://github.com/angular/angular',\n\t// },\n\t// {\n\t// \tid: 'fastify',\n\t// \tname: 'Fastify',\n\t// \tdescription: 'Fast and low overhead web framework',\n\t// \ttags: ['Node.js', 'REST', 'Performance'],\n\t// \tgithubUrl: 'https://github.com/fastify/fastify',\n\t// },\n\t// {\n\t// \tid: 'vector-search',\n\t// \tname: 'Vector Search',\n\t// \tdescription: 'AI-powered semantic search application',\n\t// \ttags: ['AI', 'Embeddings', 'Search'],\n\t// \tgithubUrl: 'https://github.com/HarperDB/vector-search-template',\n\t// },\n\t// {\n\t// \tid: 'express',\n\t// \tname: 'Express',\n\t// \tdescription: 'Minimal and flexible Node.js framework',\n\t// \ttags: ['Node.js', 'REST', 'Minimal'],\n\t// \tgithubUrl: 'https://github.com/expressjs/express',\n\t// },\n\t// {\n\t// \tid: 'graphql',\n\t// \tname: 'GraphQL API',\n\t// \tdescription: 'API with GraphQL query language',\n\t// \ttags: ['GraphQL', 'Apollo', 'API'],\n\t// \tgithubUrl: 'https://github.com/graphql/graphql-js',\n\t// },\n];\n","import { InstanceClientConfig, InstanceTypeConfig } from '@/config/instanceClientConfig';\nimport { ReplicatedResponse } from '@/integrations/api/replication';\nimport { useMutation } from '@tanstack/react-query';\n\nexport interface CreateComponentFormData {\n\tproject: string;\n\ttemplate: string;\n}\n\nexport async function addComponent({\n\tinstanceClient,\n\tproject,\n\ttemplate,\n\tentityType,\n}: CreateComponentFormData & InstanceClientConfig & InstanceTypeConfig): Promise<ReplicatedResponse> {\n\tconst { data } = await instanceClient.post('/', {\n\t\toperation: 'add_component',\n\t\tproject,\n\t\ttemplate,\n\t\treplicated: entityType === 'cluster',\n\t}, { timeout: 300_000 });\n\treturn data;\n}\n\nexport function useAddComponentMutation() {\n\treturn useMutation({\n\t\tmutationFn: addComponent,\n\t});\n}\n","export function findBy<T, F extends keyof T>(array: T[], fieldName: F, value: T[F]): T | undefined {\n\tfor (const element of array) {\n\t\tif (element[fieldName] === value) {\n\t\t\treturn element;\n\t\t}\n\t}\n\treturn undefined;\n}\n","import { InstanceClientConfig, InstanceTypeConfig } from '@/config/instanceClientConfig';\nimport { ReplicatedResponse } from '@/integrations/api/replication';\nimport { useMutation } from '@tanstack/react-query';\n\ninterface DropComponentRequest extends InstanceClientConfig, InstanceTypeConfig {\n\tproject: string;\n\tfile: string | undefined;\n}\n\nexport async function dropComponent({\n\tfile,\n\tproject,\n\tentityType,\n\tinstanceClient,\n}: DropComponentRequest): Promise<ReplicatedResponse> {\n\tconst { data } = await instanceClient.post('/', {\n\t\toperation: 'drop_component',\n\t\tfile: file || undefined,\n\t\tproject,\n\t\treplicated: entityType === 'cluster',\n\t});\n\treturn data;\n}\n\nexport function useDropComponent() {\n\treturn useMutation({\n\t\tmutationFn: dropComponent,\n\t});\n}\n","export function parseFileExtension(filename: string | undefined) {\n\tconst parts = (filename || '')?.split('.');\n\treturn parts.length > 1 ? parts.slice(-1)[0] : '';\n}\n","import { parseFileExtension } from '@/lib/string/parseFileExtension';\n\nexport type MediaKind = 'image' | 'video';\n\nexport interface MediaFileType {\n\tkind: MediaKind;\n\t/** MIME type used to build the blob/data URL for the preview. */\n\tmime: string;\n}\n\n/**\n * Maps file extensions the Applications editor can preview as media (rather than\n * editing as text) to their kind and MIME type. Limited to formats browsers can\n * render in an `<img>`/`<video>` element.\n */\nconst mediaTypesByExtension: Record<string, MediaFileType> = {\n\t// Images\n\tapng: { kind: 'image', mime: 'image/apng' },\n\tavif: { kind: 'image', mime: 'image/avif' },\n\tbmp: { kind: 'image', mime: 'image/bmp' },\n\tgif: { kind: 'image', mime: 'image/gif' },\n\tico: { kind: 'image', mime: 'image/x-icon' },\n\tjfif: { kind: 'image', mime: 'image/jpeg' },\n\tjpeg: { kind: 'image', mime: 'image/jpeg' },\n\tjpg: { kind: 'image', mime: 'image/jpeg' },\n\tpng: { kind: 'image', mime: 'image/png' },\n\tsvg: { kind: 'image', mime: 'image/svg+xml' },\n\twebp: { kind: 'image', mime: 'image/webp' },\n\t// Videos\n\tm4v: { kind: 'video', mime: 'video/mp4' },\n\tmov: { kind: 'video', mime: 'video/quicktime' },\n\tmp4: { kind: 'video', mime: 'video/mp4' },\n\togv: { kind: 'video', mime: 'video/ogg' },\n\twebm: { kind: 'video', mime: 'video/webm' },\n};\n\n/** Returns the previewable media type for a filename, or undefined if it is not media. */\nexport function getMediaFileType(filename: string | undefined): MediaFileType | undefined {\n\treturn mediaTypesByExtension[parseFileExtension(filename).toLowerCase()];\n}\n\n/** True when the file should be loaded as binary (base64) and previewed as media instead of text. */\nexport function isMediaFile(filename: string | undefined): boolean {\n\treturn getMediaFileType(filename) !== undefined;\n}\n","import { InstanceClientIdConfig } from '@/config/instanceClientConfig';\nimport { isMediaFile } from '@/lib/string/mediaFileType';\nimport { queryOptions } from '@tanstack/react-query';\n\ninterface GetComponentFileRequest extends InstanceClientIdConfig {\n\tproject: string | undefined;\n\tfile: string | undefined;\n\tencoding?: 'utf8' | 'ASCII' | 'binary' | 'hex' | 'base64' | 'utf16le' | 'latin1' | 'ucs2';\n}\n\nexport interface GetComponentFileResponse {\n\tproject: string;\n\tfile: string;\n\tbirthtime: string;\n\tmessage: string;\n\tmtime: string;\n\tsize: number;\n}\n\nexport async function getComponentFile({\n\tinstanceClient,\n\tfile,\n\tproject,\n\tencoding,\n}: GetComponentFileRequest): Promise<GetComponentFileResponse> {\n\tconst { data } = await instanceClient.post('/', {\n\t\toperation: 'get_component_file',\n\t\tproject,\n\t\tfile,\n\t\tencoding: encoding ?? (isMediaFile(file) ? 'base64' : 'utf8'),\n\t});\n\treturn {\n\t\tproject,\n\t\tfile,\n\t\t...data,\n\t};\n}\n\nexport function getComponentFileQueryOptions(params: GetComponentFileRequest) {\n\treturn queryOptions({\n\t\tqueryKey: getComponentFileQueryKey(params),\n\t\tqueryFn: () => getComponentFile(params),\n\t\tenabled: !!params.file && !!params.project,\n\t\tretry: false,\n\t});\n}\n\nexport function getComponentFileQueryKey(params: GetComponentFileRequest) {\n\treturn [\n\t\tparams.entityId,\n\t\t'get_component_file',\n\t\tparams.project,\n\t\tparams.file,\n\t\tparams.encoding,\n\t] as const;\n}\n","import { DirectoryEntry } from '@/features/instance/applications/context/directoryEntry';\nimport { FileEntry } from '@/features/instance/applications/context/fileEntry';\nimport { APIDirectoryEntry, APIFileEntry } from '@/integrations/api/instance/applications/getComponents';\n\nexport function isDirectory(entry: DirectoryEntry | FileEntry | undefined): entry is DirectoryEntry;\nexport function isDirectory(entry: APIDirectoryEntry | APIFileEntry | undefined): entry is APIDirectoryEntry;\nexport function isDirectory(entry: DirectoryEntry | FileEntry | APIDirectoryEntry | APIFileEntry | undefined) {\n\treturn Boolean((entry as DirectoryEntry)?.entries);\n}\n","export const rootId = '__root__';\nexport const importedApplications = 'importedApplications';\nexport const newApplication = 'newApplication';\n","import type { DirectoryEntry } from '@/features/instance/applications/context/directoryEntry';\nimport type { FileEntry } from '@/features/instance/applications/context/fileEntry';\nimport { isDirectory } from '@/features/instance/applications/context/isDirectory';\nimport { excludeFalsy } from '@/lib/arrays/excludeFalsy';\nimport type { TreeItem } from 'react-complex-tree';\nimport { importedApplications, newApplication, rootId } from './specialItems';\n\nexport function buildItems(rootEntries: Array<DirectoryEntry | FileEntry>): {\n\titems: Record<string, TreeItem<DirectoryEntry | FileEntry | undefined>>;\n\trootId: string;\n} {\n\tconst items: Record<string, TreeItem<DirectoryEntry | FileEntry | undefined>> = {};\n\n\tconst directoryIds: string[] = [];\n\tconst applicationIds: string[] = [];\n\tconst fileIds: string[] = [];\n\tfor (const entry of rootEntries) {\n\t\tif (isDirectory(entry)) {\n\t\t\tif (entry.package) {\n\t\t\t\tapplicationIds.push(entry.path);\n\t\t\t} else {\n\t\t\t\tdirectoryIds.push(entry.path);\n\t\t\t}\n\t\t} else {\n\t\t\tfileIds.push(entry.path);\n\t\t}\n\t\taddEntry(items, entry);\n\t}\n\n\titems[rootId] = {\n\t\tindex: rootId,\n\t\tisFolder: true,\n\t\tchildren: [\n\t\t\tnewApplication,\n\t\t\timportedApplications,\n\t\t\t...directoryIds,\n\t\t\t...fileIds,\n\t\t].filter(\n\t\t\texcludeFalsy,\n\t\t),\n\t\tdata: undefined,\n\t\tcanMove: false,\n\t\tcanRename: false,\n\t} satisfies TreeItem<undefined>;\n\n\titems[importedApplications] = {\n\t\tindex: importedApplications,\n\t\tisFolder: true,\n\t\tchildren: applicationIds,\n\t\tdata: {\n\t\t\tname: 'Imported Applications',\n\t\t\tpath: importedApplications,\n\t\t\tpackage: importedApplications,\n\t\t\tproject: '',\n\t\t\tentries: [],\n\t\t},\n\t\tcanMove: false,\n\t\tcanRename: false,\n\t} satisfies TreeItem<DirectoryEntry>;\n\n\titems[newApplication] = {\n\t\tindex: newApplication,\n\t\tisFolder: false,\n\t\tdata: {\n\t\t\tname: 'New Application',\n\t\t\tpath: newApplication,\n\t\t\tproject: '',\n\t\t},\n\t\tcanMove: false,\n\t\tcanRename: false,\n\t} satisfies TreeItem<FileEntry>;\n\n\treturn { items, rootId };\n}\n\nfunction addEntry(\n\titems: Record<string, TreeItem<DirectoryEntry | FileEntry | undefined>>,\n\tentry: DirectoryEntry | FileEntry,\n) {\n\tconst index = entry.path;\n\tif (isDirectory(entry)) {\n\t\tconst dir = entry as DirectoryEntry;\n\t\tconst childDirectoryIds: string[] = [];\n\t\tconst childFileIds: string[] = [];\n\t\tfor (const childEntry of dir.entries) {\n\t\t\tif (isDirectory(childEntry)) {\n\t\t\t\tchildDirectoryIds.push(childEntry.path);\n\t\t\t} else {\n\t\t\t\tchildFileIds.push(childEntry.path);\n\t\t\t}\n\t\t}\n\t\titems[index] = {\n\t\t\tindex,\n\t\t\tisFolder: true,\n\t\t\tchildren: [...childDirectoryIds, ...childFileIds],\n\t\t\tdata: entry,\n\t\t\tcanMove: false,\n\t\t\tcanRename: false,\n\t\t} satisfies TreeItem<DirectoryEntry>;\n\t\tfor (const child of dir.entries) {\n\t\t\taddEntry(items, child);\n\t\t}\n\t} else {\n\t\titems[index] = {\n\t\t\tindex,\n\t\t\tisFolder: false,\n\t\t\tdata: entry,\n\t\t\tcanMove: !entry.package,\n\t\t\tcanRename: !entry.package,\n\t\t} satisfies TreeItem<FileEntry>;\n\t}\n}\n","export function transformNodes<Transformed, Branch, Leaf>(\n\tnodes: Array<Branch | Leaf>,\n\tnestedPropertyName: keyof Branch,\n\ttransformer: (node: Branch | Leaf, parents: Branch[]) => Transformed,\n\tparents: Branch[] = [],\n): Transformed[] {\n\tconst results: Transformed[] = [];\n\n\tfor (const node of nodes) {\n\t\tconst transformed = transformer(node, parents);\n\t\tresults.push(transformed);\n\t\tconst potentialBranch = node as Branch;\n\t\tconst nestedNodes = potentialBranch[nestedPropertyName] as Array<Branch | Leaf>;\n\t\tif (nestedNodes) {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t\t\t(transformed as any)[nestedPropertyName] = transformNodes(nestedNodes, nestedPropertyName, transformer, [\n\t\t\t\t...parents,\n\t\t\t\tpotentialBranch,\n\t\t\t]);\n\t\t}\n\t}\n\n\treturn results;\n}\n","import { DirectoryEntry } from '@/features/instance/applications/context/directoryEntry';\nimport { FileEntry } from '@/features/instance/applications/context/fileEntry';\nimport { isDirectory } from '@/features/instance/applications/context/isDirectory';\nimport { APIDirectoryEntry, APIFileEntry } from '@/integrations/api/instance/applications/getComponents';\nimport { transformNodes } from '@/lib/arrays/transformNodes';\n\nexport function calculateRootEntries(entries: Array<APIDirectoryEntry | APIFileEntry>): {\n\trootEntries: Array<DirectoryEntry | FileEntry>;\n\tpathsRegistry: Set<string>;\n} {\n\tconst pathsRegistry = new Set<string>();\n\tconst rootEntries = transformNodes(\n\t\tentries || [],\n\t\t'entries',\n\t\t(node: APIFileEntry | APIDirectoryEntry, parents: APIDirectoryEntry[]) => {\n\t\t\tconst readMeAPIFile = isDirectory(node) && node.entries.find(e => e.name.toLowerCase() === 'readme.md');\n\t\t\tconst path = [...parents.map(p => p.name), node.name].join('/');\n\t\t\tpathsRegistry.add(path);\n\t\t\treturn {\n\t\t\t\tname: node.name,\n\t\t\t\tpath,\n\t\t\t\tproject: (parents[0] || node)?.name,\n\t\t\t\tpackage: (parents[0] || node)?.package,\n\t\t\t\toverviewEntry: readMeAPIFile && !isDirectory(readMeAPIFile) && {\n\t\t\t\t\t\t\tname: readMeAPIFile.name,\n\t\t\t\t\t\t\tpath: [...parents.map(p => p.name), node.name, readMeAPIFile.name].join('/'),\n\t\t\t\t\t\t\tproject: (parents[0] || node)?.name,\n\t\t\t\t\t\t\tpackage: (parents[0] || node)?.package,\n\t\t\t\t\t\t} || undefined,\n\t\t\t} satisfies DirectoryEntry | FileEntry;\n\t\t},\n\t);\n\treturn {\n\t\trootEntries,\n\t\tpathsRegistry,\n\t};\n}\n","import { InstanceClientConfig, InstanceTypeConfig } from '@/config/instanceClientConfig';\nimport { useMutation } from '@tanstack/react-query';\n\nexport interface SetComponentFileRequest extends InstanceClientConfig, InstanceTypeConfig {\n\tfile: string;\n\tpayload?: string;\n\tproject: string;\n\tencoding?: 'utf8' | 'ASCII' | 'binary' | 'hex' | 'base64' | 'utf16le' | 'latin1' | 'ucs2';\n}\n\nexport async function setComponentFile({\n\tfile,\n\tpayload,\n\tproject,\n\tentityType,\n\tinstanceClient,\n\tencoding,\n}: SetComponentFileRequest) {\n\tconst { data } = await instanceClient.post('/', {\n\t\toperation: 'set_component_file',\n\t\tfile,\n\t\tpayload,\n\t\tproject,\n\t\tencoding,\n\t\treplicated: entityType === 'cluster',\n\t}, { timeout: 300_000 });\n\treturn data;\n}\n\nexport function useSetComponentFile() {\n\treturn useMutation({\n\t\tmutationFn: setComponentFile,\n\t});\n}\n"],"x_google_ignoreList":[0,1],"mappings":"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"}