@package-broker/dist 2.0.0-rc.3 → 2.0.0-rc.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -0
- package/node/assets/access.62e9484517a0.js +1 -0
- package/node/assets/app.45b156168495.css +2 -0
- package/node/assets/{app.e8434f3343de.js → app.c064670cdc0d.js} +5 -5
- package/node/assets/audit.b7c40b9dc998.js +1 -0
- package/node/assets/{chunk.3704953b4a66.js → chunk.28a4d8aab337.js} +1 -1
- package/node/assets/chunk.3fcd6998795a.js +1 -0
- package/node/assets/chunk.51497edc7697.js +4 -0
- package/node/assets/chunk.56d473a1587d.js +1 -0
- package/node/assets/chunk.675b635d9462.js +1 -0
- package/node/assets/{chunk.bb25fc845269.js → chunk.6ea6bdcaa465.js} +1 -1
- package/node/assets/{chunk.f922af39a279.js → chunk.741aec8d1ff9.js} +1 -1
- package/node/assets/chunk.815f9a91c741.js +1 -0
- package/node/assets/chunk.8442124f6802.js +1 -0
- package/node/assets/{chunk.862544cf5835.js → chunk.965b76812604.js} +1 -1
- package/node/assets/{chunk.bf48b04e6a00.js → chunk.a6d755a9789f.js} +1 -1
- package/node/assets/chunk.d18497920e4d.js +1 -0
- package/node/assets/{chunk.ce96495b8b55.js → chunk.d813fefb410d.js} +1 -1
- package/node/assets/chunk.e3b0c44298fc.js +0 -0
- package/node/assets/{chunk.7cb6f6b4daaa.js → chunk.f54ea1378c8c.js} +1 -1
- package/node/assets/chunk.fd375c54b526.js +1 -0
- package/node/assets/import.e7a1e5834631.js +1 -0
- package/node/assets/index.html +9 -6
- package/node/assets/manifest.json +66 -38
- package/node/assets/notifications.19225fe12044.js +1 -0
- package/node/assets/npm-login.e059678af13d.js +1 -0
- package/node/assets/packages.ab5ab25b1c75.js +2 -0
- package/node/assets/projects.927fe18c785c.js +1 -0
- package/node/assets/setup.8e977608d413.js +1 -0
- package/node/assets/setup.html +2 -2
- package/node/assets/sources.ae50f239f80f.js +1 -0
- package/node/assets/tokens.6b86d8d97e07.js +4 -0
- package/node/assets.json +2 -2
- package/node/build-info.json +4 -4
- package/node/generated/manifest.json +53 -2
- package/node/migrations/core/0002_npm_publish.sql +88 -0
- package/node/migrations/core/0003_npm_identity.sql +96 -0
- package/node/migrations/core/0004_source_revision.sql +1 -0
- package/node/migrations/core/0005_package_settings_revision.sql +1 -0
- package/node/migrations/core/0006_npm_login_handoff.sql +39 -0
- package/node/migrations/core/0007_npm_vcs_build_outcomes.sql +10 -0
- package/node/migrations/core/0008_registry_policy.sql +49 -0
- package/node/migrations/core/0009_npm_notifications.sql +108 -0
- package/node/server.js +62532 -42978
- package/package.json +1 -1
- package/prebuilt.json +47 -32
- package/node/assets/access.6859f43998ca.js +0 -1
- package/node/assets/app.f15f8f21f88b.css +0 -2
- package/node/assets/audit.576009342714.js +0 -1
- package/node/assets/chunk.297a2d571f9c.js +0 -4
- package/node/assets/chunk.6e23a75a1324.js +0 -1
- package/node/assets/chunk.855a50f45830.js +0 -1
- package/node/assets/chunk.976a2ff4338e.js +0 -1
- package/node/assets/import.e2a1e35fcb8d.js +0 -1
- package/node/assets/packages.a8726e5144de.js +0 -1
- package/node/assets/projects.711deb86b7c9.js +0 -1
- package/node/assets/setup.dfed30ecfbad.js +0 -1
- package/node/assets/sources.d0ba0048bd96.js +0 -1
- package/node/assets/tokens.f48d235e8d25.js +0 -4
package/package.json
CHANGED
package/prebuilt.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 1,
|
|
3
3
|
"package": "@package-broker/dist",
|
|
4
|
-
"version": "2.0.0-rc.
|
|
4
|
+
"version": "2.0.0-rc.4",
|
|
5
5
|
"target": "node",
|
|
6
6
|
"payload": "node",
|
|
7
|
-
"gitSha": "
|
|
7
|
+
"gitSha": "7b18433edcc4002c3657ade85313764d5f2da5b3",
|
|
8
8
|
"lockfileSha256": "5349d3f893242687c7b1bf65b975654f1ed2808d8aa876f232ce00d285c57fe2",
|
|
9
9
|
"toolchain": {
|
|
10
10
|
"node": "v24.22.0",
|
|
@@ -13,39 +13,54 @@
|
|
|
13
13
|
"arch": "x64"
|
|
14
14
|
},
|
|
15
15
|
"plugins": {
|
|
16
|
-
"@package-broker/plugin-sso-oidc": "0.1.0-rc.
|
|
17
|
-
"@package-broker/plugin-github": "0.1.0-rc.
|
|
16
|
+
"@package-broker/plugin-sso-oidc": "0.1.0-rc.4",
|
|
17
|
+
"@package-broker/plugin-github": "0.1.0-rc.4"
|
|
18
18
|
},
|
|
19
19
|
"files": {
|
|
20
|
-
"assets.json": "sha256:
|
|
21
|
-
"assets/access.
|
|
22
|
-
"assets/app.
|
|
23
|
-
"assets/app.
|
|
24
|
-
"assets/audit.
|
|
25
|
-
"assets/chunk.
|
|
26
|
-
"assets/chunk.
|
|
27
|
-
"assets/chunk.
|
|
28
|
-
"assets/chunk.
|
|
29
|
-
"assets/chunk.
|
|
30
|
-
"assets/chunk.
|
|
31
|
-
"assets/chunk.
|
|
32
|
-
"assets/chunk.
|
|
33
|
-
"assets/chunk.
|
|
34
|
-
"assets/chunk.
|
|
35
|
-
"assets/chunk.
|
|
36
|
-
"assets/
|
|
37
|
-
"assets/
|
|
38
|
-
"assets/
|
|
39
|
-
"assets/
|
|
40
|
-
"assets/
|
|
41
|
-
"assets/
|
|
42
|
-
"assets/
|
|
43
|
-
"assets/
|
|
44
|
-
"assets/
|
|
45
|
-
"
|
|
46
|
-
"
|
|
20
|
+
"assets.json": "sha256:088dd6e6a221e9865368226bfa13934fac57b291423efb9bc7a91ed10f3edbd9",
|
|
21
|
+
"assets/access.62e9484517a0.js": "sha256:62e9484517a0a42ae8c4a184b08df58b59370bb9770fc78f7de46a89258414bc",
|
|
22
|
+
"assets/app.45b156168495.css": "sha256:45b156168495f969c466114d33cc009dc48c97e0e59f14848ef248d372c08285",
|
|
23
|
+
"assets/app.c064670cdc0d.js": "sha256:c064670cdc0dcacf33e73d36a6ed8ee38290253d8de50cb188fe1e49f85dc39c",
|
|
24
|
+
"assets/audit.b7c40b9dc998.js": "sha256:b7c40b9dc99882a7322e3df76792d37838d6b138177196b0222d6c16e4741e5d",
|
|
25
|
+
"assets/chunk.28a4d8aab337.js": "sha256:28a4d8aab3377fe1557209ea38865debe0018ed2a1ae3414046f30287e81a41e",
|
|
26
|
+
"assets/chunk.3fcd6998795a.js": "sha256:3fcd6998795a483d09a456179fa18563e784b4a277e0855232576a546b4f5771",
|
|
27
|
+
"assets/chunk.51497edc7697.js": "sha256:51497edc769770360ff2bf46304c9efe1101ed7df41bcbc0fc6a41bb2803180b",
|
|
28
|
+
"assets/chunk.56d473a1587d.js": "sha256:56d473a1587d478f226bd2e4d320d1ce5c2b7b963fce5d71201c7cb989235f67",
|
|
29
|
+
"assets/chunk.675b635d9462.js": "sha256:675b635d94621b2318dd423a6e56fca28a16231fbcc8f994a7bba5d7702a4626",
|
|
30
|
+
"assets/chunk.6ea6bdcaa465.js": "sha256:6ea6bdcaa4655d67a7b76ea37c04954d35c395fca66612a6b62cef03f190541b",
|
|
31
|
+
"assets/chunk.741aec8d1ff9.js": "sha256:741aec8d1ff9c4ad31931937569e7888cc6c8934d68dcc2ac6467e1d454853b9",
|
|
32
|
+
"assets/chunk.815f9a91c741.js": "sha256:815f9a91c74127bf0e144073570e5d3dcb53103241d4a2eeded20c549522113b",
|
|
33
|
+
"assets/chunk.8442124f6802.js": "sha256:8442124f6802d6c0bb0164d7439e878c3f91c5a908c3ec7bd3b9448070bdde44",
|
|
34
|
+
"assets/chunk.965b76812604.js": "sha256:965b7681260494aa4ddabc08d7842aa476fd28b660061a862c3d69959cfe969b",
|
|
35
|
+
"assets/chunk.a6d755a9789f.js": "sha256:a6d755a9789f174a4818af5c2b276d4b2ef353653a84489ea5f9e46102174328",
|
|
36
|
+
"assets/chunk.d18497920e4d.js": "sha256:d18497920e4d6b19701df38f99e2e159d0a5b7f141b8146ec4a2b71e48a96850",
|
|
37
|
+
"assets/chunk.d813fefb410d.js": "sha256:d813fefb410dfa56413ca1a8d04ecf8c038c4e5195733355b0cf9de16dcf91b8",
|
|
38
|
+
"assets/chunk.e3b0c44298fc.js": "sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
|
|
39
|
+
"assets/chunk.f54ea1378c8c.js": "sha256:f54ea1378c8ce25421e2073896cfa1533610f913008029053b8a6384b2684cba",
|
|
40
|
+
"assets/chunk.fd375c54b526.js": "sha256:fd375c54b526a451c7db52efe449eb6226d1f06f44ead090c2be8be82ffa45d9",
|
|
41
|
+
"assets/import.e7a1e5834631.js": "sha256:e7a1e5834631754155a6bd69d595f26e2fbde47cffe904bfe10f93722456846e",
|
|
42
|
+
"assets/index.html": "sha256:0e65b0e0ec1834392878c46b4bf147d087ba38762ddc0ad0f4d4436c1d46150e",
|
|
43
|
+
"assets/manifest.json": "sha256:d298deb81ac458894f55e28e6a2a48d93718a1a959d5d9249180dc6ef1799a10",
|
|
44
|
+
"assets/notifications.19225fe12044.js": "sha256:19225fe1204460810bef4555f8b668c04c90a26e530de81e6347fed438e6c850",
|
|
45
|
+
"assets/npm-login.e059678af13d.js": "sha256:e059678af13dfd4aca41a5031dccadb51225d56e762c9251452d8df7e36bd7d3",
|
|
46
|
+
"assets/packages.ab5ab25b1c75.js": "sha256:ab5ab25b1c755a6167123dc99f2981db14de5a198ea9b0ad9646741258d9319f",
|
|
47
|
+
"assets/projects.927fe18c785c.js": "sha256:927fe18c785cddb5fe9a929a4326144a13cff7893816f07bac709dd3ca3bb3ce",
|
|
48
|
+
"assets/setup.8e977608d413.js": "sha256:8e977608d413ae85e999ce5d4db14e483f8da451be20175f2266435f1816ecd5",
|
|
49
|
+
"assets/setup.html": "sha256:247fc264c9270a00886b8c73bdc060f33f9aaddf1551f84fac97ed9416ca9347",
|
|
50
|
+
"assets/sources.ae50f239f80f.js": "sha256:ae50f239f80fec6aa7a3eb35d05fd4b68c9fafbd837aa8d6f839400ae669da13",
|
|
51
|
+
"assets/tokens.6b86d8d97e07.js": "sha256:6b86d8d97e07468830d86d9a82a7c89803d8e442b3f6a9cc0fb5c4e088929450",
|
|
52
|
+
"build-info.json": "sha256:f2d62a4841658f1b5740631ce815cff76c148ec5d77f98fe781192aa53c18ffe",
|
|
53
|
+
"generated/manifest.json": "sha256:52588d3bddbb186dbf73c809c4849b400b1c1cc10a5d2e131bd3d7149a6bc0cd",
|
|
47
54
|
"migrations/core/0001_init.sql": "sha256:a1005fb24893ffe9174ae1f1642b3f1270d853476183a47ce2b5e4d32471e2fb",
|
|
48
|
-
"
|
|
55
|
+
"migrations/core/0002_npm_publish.sql": "sha256:1beaf4be82bc086b014d5999d85e37b2ead8b04acc5db98d6720d08d5d5368cb",
|
|
56
|
+
"migrations/core/0003_npm_identity.sql": "sha256:1b7ee8616cdbf062cea7fd10458b8df9739cb19323ce765f2f2b3068552288fa",
|
|
57
|
+
"migrations/core/0004_source_revision.sql": "sha256:9971e927c07c1b2e1ff7da3f73b4673b19c80be48329a35fc23def5a95aee6ed",
|
|
58
|
+
"migrations/core/0005_package_settings_revision.sql": "sha256:ed867ced9882400ec2e51bd9cdd1100426470d130091b4a8e95ff0bdd025c2cb",
|
|
59
|
+
"migrations/core/0006_npm_login_handoff.sql": "sha256:e1140895bb8b68e2b05054dc814d50e71ab1cf745638739310266a43dbe26117",
|
|
60
|
+
"migrations/core/0007_npm_vcs_build_outcomes.sql": "sha256:f8434d0e092809b35c472a2f1ba1b317836415694e909f929df3e6559f2e7891",
|
|
61
|
+
"migrations/core/0008_registry_policy.sql": "sha256:9ba4c9df12b3b17decaea7a7c3ed41222dbb6ffba0af1b53a054e3a6b48d72cc",
|
|
62
|
+
"migrations/core/0009_npm_notifications.sql": "sha256:454ba1748f98b35909db6003b73cad587de21ffb34e37d1991d62a8373ae4f09",
|
|
63
|
+
"server.js": "sha256:b8e2fe63f0485cfbc9b123a699c3dfe87d06ae5bd14a4a594ce45c94dd2fc058"
|
|
49
64
|
},
|
|
50
65
|
"artifactSha256": null
|
|
51
66
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{a as X,b as Z,c as C,d as ee,e as N,f as T,g as S,h as re,i as te,j as oe}from"./chunk.bb25fc845269.js";import{a as U}from"./chunk.bf48b04e6a00.js";import"./chunk.3704953b4a66.js";import{a as q}from"./chunk.f922af39a279.js";import{a as ae}from"./chunk.ce96495b8b55.js";import{a as V,b as E,c as J}from"./chunk.862544cf5835.js";import{C as D,D as F,E as $,J as Y,c as z,d as K,g as _,j as O,p as R}from"./chunk.6e23a75a1324.js";var x=z(K(),1);var se={"org:read":"Read organization details","org:settings:write":"Change organization settings","org:users:read":"Read organization users","org:users:write":"Manage organization users","org:roles:read":"Read organization roles","org:roles:write":"Manage organization roles","org:grants:read":"Read organization grants","org:grants:write":"Manage organization grants","org:projects:create":"Add projects","org:projects:archive":"Archive projects","org:sources:read":"Read organization sources","org:sources:write":"Manage organization sources","org:tokens:read":"Read organization tokens","org:tokens:revoke":"Revoke organization tokens","org:service-principals:write":"Manage service principals","org:packages:manage":"Manage all packages","org:import:write":"Import runs: create and read","org:import:approve":"Approve and apply import runs","org:audit:read":"Read organization audit records","project:read":"Read project details","project:settings:write":"Change project settings","project:grants:read":"Read project grants","project:grants:write":"Manage project grants","project:packages:read":"Read project packages","project:packages:write":"Publish project packages","project:packages:manage":"Manage project packages","project:sources:read":"Read project sources","project:sources:write":"Manage project sources","project:service-principals:write":"Manage project service principals","project:tokens:create":"Issue project tokens","project:tokens:read":"Read project tokens","project:tokens:revoke":"Revoke project tokens","project:audit:read":"Read project audit records"};async function ie(e){let t=[],s=new Set,n;do{let r=await e.request("get","/_pb/roles",{query:{limit:"50",after:n}});if(!r.ok)return{roles:[],status:r.status===403?"forbidden":"error"};if(t.push(...r.data.items),n=r.data.next??void 0,n&&s.has(n))return{roles:[],status:"error"};n&&s.add(n)}while(n);return{roles:t,status:"ready"}}var H=["project_developer","project_auditor","project_owner","organization_auditor","organization_admin"],B=(e,t)=>e.filter(s=>s.scope===(t===null?"organization":"project")).sort((s,n)=>{let r=c=>c.isSystem&&H.includes(c.key)?H.indexOf(c.key):H.length;return r(s)-r(n)||s.name.localeCompare(n.name)}),ge={project_developer:"Read packages, view sources and issue project tokens; includes publish permission.",project_auditor:"View project details, grants, packages, sources, tokens and audit records.",project_owner:"Manage project settings, access, packages, sources, service principals and tokens.",organization_auditor:"View organization records and project records across the organization.",organization_admin:"Manage the organization and all projects, including users, roles, grants and packages."},ne=e=>e.isSystem&&ge[e.key]||`Custom role \xB7 ${e.permissions.length} permissions`;var o=z(_(),1);function me(e){let t={},s=e.email.trim().toLowerCase();if(e.type==="email"){let n=s.slice(s.indexOf("@")+1);(s.length>254||!/^[\x21-\x7e]+$/.test(s)||!/^[^@]+@[^@]+$/.test(s)||!/^(?=.{1,253}$)(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/.test(n)||!/[a-z]/.test(n.slice(n.lastIndexOf(".")+1)))&&(t.email="Enter a valid sign-in email address.")}else e.provider||(t.provider="Choose a sign-in provider."),e.group?e.group!==e.group.trim()?t.group="Remove spaces at the start or end. Keep the group's spelling and capitalization.":(e.group.length>256||/[\p{Cc}\p{Cf}\p{Cs}]/u.test(e.group))&&(t.group="Enter the group value sent by your provider."):t.group="Enter the group value sent by your provider.";return e.roleId||(t.roleId="Choose a role to review this grant."),Object.keys(t).length?{errors:t}:{body:{roleId:e.roleId,subject:e.type==="email"?{type:"email",value:s}:{type:"group",provider:e.provider,value:e.group}}}}function Q(e,t,s,n,r){if(e.type==="email"&&!e.email.trim())return"Enter an email address to review this grant.";if(e.type==="group"&&(!s||!e.group))return"Choose a provider and enter a group value to review this grant.";if(!e.roleId)return"Choose a role to review this grant.";let c=e.type==="email"?e.email.trim().toLowerCase():`Members of ${e.group} signing in with ${s.displayName}`,f=n===null?`for ${r}${t?.key==="organization_auditor"?", including read access across projects":t?.permissions.some(m=>m.startsWith("project:"))?", including access across projects":""}`:`on project ${n}`;return`${c} will get ${t?.name??"the selected role"} ${f}.`}function A({id:e,label:t,help:s,error:n,note:r,children:c}){return(0,o.jsxs)("div",{className:"grid min-w-0 gap-1",children:[(0,o.jsx)($,{htmlFor:e,children:t}),c,s?(0,o.jsx)("p",{id:`${e}-help`,className:"text-sm text-neutral-600",children:s}):null,r?(0,o.jsx)("p",{className:"text-sm text-neutral-600",children:r}):null,n?(0,o.jsx)("p",{id:`${e}-error`,role:"alert",children:n}):null]})}function le({catalogue:e,project:t,value:s,onChange:n,id:r,error:c,retry:f}){let m=B(e.roles,t),v=m.find(a=>a.id===s),j=`${r}-help${c?` ${r}-error`:""}`;return e.status==="forbidden"?(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)("p",{className:"lg:col-span-2",children:"Role choices are unavailable for your account. Ask an organization administrator to grant access."}),(0,o.jsx)(A,{id:r,label:"Enter a role ID",help:"Ask an organization administrator for the role ID.",error:c,children:(0,o.jsx)(F,{id:r,name:"roleId",value:s,onChange:a=>n(a.target.value),"aria-invalid":!!c,"aria-describedby":j})})]}):(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)("div",{className:"grid min-w-0 gap-2",children:[(0,o.jsx)(A,{id:r,label:"Role",error:c,children:(0,o.jsxs)(q,{id:r,name:"roleId",value:v?s:"",onChange:a=>n(a.target.value),disabled:e.status!=="ready"||!m.length,"aria-invalid":!!c,"aria-describedby":j,children:[(0,o.jsx)("option",{value:"",children:"Choose a role"}),m.map(a=>(0,o.jsx)("option",{value:a.id,children:a.name},a.id))]})}),(0,o.jsxs)("div",{id:`${r}-help`,className:"grid gap-2 text-sm",children:[e.status==="loading"?(0,o.jsx)("p",{children:"Loading roles\u2026"}):e.status==="error"?(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)("p",{role:"alert",children:"Roles could not be loaded. Try again."}),(0,o.jsx)(R,{type:"button",variant:"outline",onClick:f,children:"Retry roles"})]}):m.length?null:(0,o.jsx)("p",{children:"No roles are available to grant at this scope."}),v?(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)("p",{children:ne(v)}),(0,o.jsx)("p",{children:v.isSystem?"System role":"Custom role"}),v.isSystem&&v.key==="project_developer"?(0,o.jsx)("p",{children:"Suggested for developers; includes package read and publish permissions."}):null,v.permissions.includes("project:packages:write")?(0,o.jsx)("p",{children:"Publishing is not available in this version. This role includes the publish permission."}):null]}):null]})]}),v?(0,o.jsxs)("details",{className:"min-w-0 lg:col-span-2",children:[(0,o.jsxs)("summary",{className:"cursor-pointer underline",children:["View permissions (",v.permissions.length,")"]}),(0,o.jsx)("ul",{children:v.permissions.map(a=>(0,o.jsxs)("li",{className:"my-2",children:[(0,o.jsx)("span",{children:se[a]})," ",(0,o.jsx)("code",{className:"break-all",children:a})]},a))})]},v.id):null]})}function pe(e){let t=(0,x.useId)(),[s,n]=(0,x.useState)({type:"email",email:"",group:"",provider:"",roleId:""}),[r,c]=(0,x.useState)({}),[f,m]=(0,x.useState)(!1),v=B(e.catalogue.roles,e.project),j=e.project===null?"":v.find(p=>p.isSystem&&p.key==="project_developer")?.id??"",a=f?s.roleId:j,l=e.providers.length===1?e.providers[0].id:s.provider,d={...s,roleId:a,provider:l},u=v.find(p=>p.id===a),h=e.providers.find(p=>p.id===l),b=p=>({id:`${t}-${p}`,"aria-invalid":!!r[p],"aria-describedby":`${t}-${p}-help${r[p]?` ${t}-${p}-error`:""}`}),k=p=>{n({...s,...p}),c({})},I=e.catalogue.status==="forbidden"||e.catalogue.status==="ready"&&v.length>0;return(0,o.jsxs)("form",{noValidate:!0,className:"my-6 grid max-w-5xl items-start gap-x-6 gap-y-4 lg:grid-cols-2",onSubmit:p=>{if(p.preventDefault(),e.busy||!I)return;let M=me(d),w=M.errors??{};s.type==="email"&&p.currentTarget.querySelector('[name="email"]')?.validity.typeMismatch&&(w.email="Enter a valid sign-in email address."),s.type==="group"&&!h&&(w.provider=l?"This provider is no longer available. Choose another provider.":"Choose a sign-in provider."),e.catalogue.status==="ready"&&!u&&(w.roleId="Choose a role to review this grant."),c(w);let g=["email","provider","group","roleId"].find(y=>w[y]);if(g){p.currentTarget.querySelector(`[id="${t}-${g}"]`)?.focus();return}M.body&&e.submit(M.body)},children:[(0,o.jsx)("p",{className:"lg:col-span-2",children:"Give a person or a sign-in group a role."}),(0,o.jsxs)("div",{className:"lg:col-span-2",children:[(0,o.jsxs)("p",{className:"font-semibold",children:["Access to:"," ",e.project===null?`Organization \xB7 ${e.organization}`:`Project \xB7 ${e.project}`]}),(0,o.jsx)("p",{className:"text-sm text-neutral-600",children:e.project===null?"Organization roles can give access across projects. To give a development group access, choose a project.":"This grant applies to this project."}),e.project===null?(0,o.jsx)("a",{className:"underline",href:"#/projects",children:"Choose a project"}):null]}),(0,o.jsxs)("fieldset",{className:"grid min-w-0 gap-2 lg:col-span-2",children:[(0,o.jsx)("legend",{className:"font-semibold",children:"Who gets access"}),["email","group"].map(p=>(0,o.jsxs)("div",{className:"flex items-center gap-2",children:[(0,o.jsx)("input",{id:`${t}-${p}-radio`,type:"radio",name:"type",value:p,checked:s.type===p,disabled:p==="group"&&(e.providerStatus!=="ready"||!e.providers.length),"aria-describedby":p==="group"?`${t}-provider-status`:void 0,onChange:()=>k({type:p})}),(0,o.jsx)($,{htmlFor:`${t}-${p}-radio`,children:p==="email"?"Person (email)":"Group (from your sign-in provider)"})]},p))]}),(0,o.jsx)("div",{id:`${t}-provider-status`,className:"lg:col-span-2",children:e.providerStatus==="error"?(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)("p",{role:"alert",children:"Sign-in providers could not be loaded. Try again."}),(0,o.jsx)(R,{type:"button",variant:"outline",onClick:e.retry,children:"Retry sign-in providers"})]}):e.providerStatus==="loading"?(0,o.jsx)("p",{children:"Loading sign-in providers\u2026"}):e.providers.length?null:(0,o.jsx)("p",{children:"Group access needs a sign-in provider that sends groups. Grant access to individual people instead."})}),s.type==="email"?(0,o.jsx)(A,{id:`${t}-email`,label:"Email address",help:"Use the person's sign-in email. Email matching ignores capitalization. Their provider must verify the email and allow its domain.",note:"This creates an access rule. No invitation email is sent.",error:r.email,children:(0,o.jsx)(F,{...b("email"),type:"email",name:"email",autoComplete:"email",placeholder:"alex@acme-company.example",value:s.email,onChange:p=>k({email:p.target.value})})}):(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)("div",{className:"grid min-w-0 items-start gap-x-6 gap-y-4 lg:col-span-2 lg:grid-cols-2",children:e.providers.length===1?(0,o.jsxs)("p",{children:["Members signing in with ",h?.displayName]}):(0,o.jsx)(A,{id:`${t}-provider`,label:"Sign-in provider",help:"Choose the provider members use to sign in to Package Broker.",error:r.provider,children:(0,o.jsxs)(q,{...b("provider"),name:"provider",value:l,onChange:p=>k({provider:p.target.value}),children:[(0,o.jsx)("option",{value:"",children:"Choose a provider"}),e.providers.map(p=>(0,o.jsx)("option",{value:p.id,children:p.displayName},p.id))]})})}),(0,o.jsx)(A,{id:`${t}-group`,label:"Group value",help:"Use the exact group value sent by this provider. A group email works only if the provider sends that email as a group value.",note:"Package Broker cannot check whether this group exists. Ask a member to sign in and confirm their access after saving.",error:r.group,children:(0,o.jsx)(F,{...b("group"),name:"group",value:s.group,autoComplete:"off",spellCheck:!1,onChange:p=>k({group:p.target.value})})})]}),(0,o.jsx)(le,{catalogue:e.catalogue,project:e.project,id:`${t}-roleId`,value:a,onChange:p=>{m(!0),k({roleId:p})},error:r.roleId,retry:e.retry}),(0,o.jsxs)("div",{"aria-live":"polite",className:"min-w-0 break-words rounded border p-3 lg:col-span-2",children:[(0,o.jsx)("p",{children:Q(d,u,h,e.project,e.organization)}),s.type==="group"?(0,o.jsx)("p",{className:"text-sm",children:"Applies when the provider reports this exact group value."}):null]}),(0,o.jsx)("div",{className:"flex flex-col items-start sm:flex-row lg:col-span-2",children:(0,o.jsx)(R,{className:"w-full sm:w-auto lg:w-auto",type:"submit",disabled:e.busy||!I||s.type==="group"&&(e.providerStatus!=="ready"||!e.providers.length),children:"Create grant"})})]})}function ce({catalogue:e,project:t,currentRole:s,busy:n,retry:r,submit:c}){let f=(0,x.useId)(),[m,v]=(0,x.useState)(s),j=B(e.roles,t),a=!!m&&(e.status==="forbidden"||e.status==="ready"&&j.some(l=>l.id===m));return(0,o.jsxs)("form",{className:"grid max-w-5xl items-start gap-x-6 gap-y-4 lg:grid-cols-2",onSubmit:l=>{l.preventDefault(),!n&&a&&c(m)},children:[(0,o.jsx)("p",{className:"lg:col-span-2",children:"To change who this grant applies to, create a new grant and revoke this one."}),(0,o.jsx)(le,{id:f,catalogue:e,project:t,value:m,onChange:v,retry:r}),(0,o.jsx)("p",{"aria-live":"polite",className:"min-w-0 break-words lg:col-span-2",children:j.find(l=>l.id===m)?.name?`Save ${j.find(l=>l.id===m).name} ${t===null?"for the organization":`on project ${t}`}.`:"Choose a role to review this grant."}),(0,o.jsx)("div",{className:"flex flex-col items-start sm:flex-row lg:col-span-2",children:(0,o.jsx)(R,{className:"w-full sm:w-auto lg:w-auto",type:"submit",disabled:n||!a,children:"Save role"})})]})}var L=z(K(),1);var i=z(_(),1),ue=["grants","roles"],W=e=>X(e,ue),ve=e=>O("access",W(O("access",e))),P=e=>e.query.project===null&&e.query.status==="roles";function G(e){let t=!e.loading&&!e.stale,s=e.query.q?.toLowerCase()??"";return{roles:e.roles.filter(n=>n.name.toLowerCase().startsWith(s)),grants:e.grants.filter(n=>[n.principalName,n.principalId,n.id].some(r=>r?.toLowerCase().startsWith(s))),writeRoles:t&&e.query.project===null&&e.organization.includes("org:roles:write"),writeGrants:t&&(e.query.project===null?e.organization.includes("org:grants:write"):e.permissions.includes("project:grants:write"))}}function ye(e){let t=Z({query:{project:null},roles:[],catalogue:{roles:[],status:"loading"},providers:[],providerStatus:"loading",organizationName:"this organization",grants:[],next:null,organization:[],permissions:[],loading:!1,listError:!1,busy:!1,stale:!1,notice:null}),{client:s}=e,n=0,r=0;async function c(){let a=++r,l=n;t.set({catalogue:{roles:[],status:"loading"},providerStatus:"loading"});let[d,u,h]=await Promise.all([ie(s),s.request("get","/_pb/auth/providers"),s.request("get","/_pb/organization")]);a!==r||l!==n||t.set({catalogue:d,providers:u.ok?u.data.providers:[],providerStatus:u.ok?"ready":"error",organizationName:h.ok?h.data.name:"this organization"})}async function f(a,l=null){let d=++n;t.set({query:a,roles:[],grants:[],next:null,organization:[],permissions:[],loading:!0,listError:!1,busy:!1,stale:!1,notice:l});let[u,h]=await Promise.all([s.request("get","/_pb/me/permissions"),a.project===null?null:s.request("get","/_pb/projects/{project}/permissions",{params:{project:a.project}})]);if(d!==n)return;let b=u.ok?u.data.organization:[],k=h?.ok?h.data.project:[];t.set({organization:b,permissions:k});let I=P(t.snapshot()),p=a.project===null?b.includes("org:grants:write"):k.includes("project:grants:write");if(!I&&p&&await c(),d!==n)return;if(!(a.project===null?b.includes(I?"org:roles:read":"org:grants:read"):k.includes("project:grants:read"))){t.set({loading:!1,listError:!0,notice:"You do not have permission to view this list."});return}let w={after:a.after,limit:"50"};if(I){let g=await s.request("get","/_pb/roles",{query:w});if(d!==n)return;t.set({loading:!1,listError:!g.ok,roles:g.ok?g.data.items:[],next:g.ok?g.data.next:null,notice:g.ok?l:C(g)})}else if(a.project!==null){let g=await s.request("get","/_pb/projects/{project}/grants",{params:{project:a.project},query:w});if(d!==n)return;t.set({loading:!1,listError:!g.ok,grants:g.ok?g.data.items.map(y=>({id:y.id,principalId:y.principal.id,principalName:y.principal.displayName,kind:y.principal.kind,roleId:y.role.id,roleName:y.role.name,revision:y.revision,createdAt:y.createdAt})):[],next:g.ok?g.data.next:null,notice:g.ok?l:C(g)})}else{let g=await s.request("get","/_pb/grants",{query:w});if(d!==n)return;t.set({loading:!1,listError:!g.ok,grants:g.ok?g.data.items.map(y=>({id:y.id,principalId:null,principalName:null,kind:y.subject.type,roleId:y.roleId,roleName:y.roleId,revision:y.revision,createdAt:y.createdAt})):[],next:g.ok?g.data.next:null,notice:g.ok?l:C(g)})}}async function m(a,l="Access updated.",d=!1){let u=t.snapshot();if(u.busy||u.loading||u.stale)return;let h=n;t.set({busy:!0,notice:null});let b=await a();h===n&&(t.set({busy:!1}),ee(e,b)?t.set({stale:!0,notice:"Complete reauthentication and confirm the pending action."}):b.ok?await f(u.query,l):t.set({stale:b.status===412,notice:d&&b.status===412?"This grant changed. Reload it before saving.":C(b)}))}let v=a=>{let l=t.snapshot(),d=l.roles.find(u=>u.id===a);return G(l).writeRoles&&d&&!d.isSystem&&N(d.revision)?d:null},j=a=>{let l=t.snapshot(),d=l.grants.find(u=>u.id===a);return G(l).writeGrants&&d&&N(d.revision)?d:null};return{snapshot:t.snapshot,subscribe:t.subscribe,load:f,loadFormOptions:c,async createGrant(a){let l=t.snapshot();if(!G(l).writeGrants)return;let d=Q({type:a.subject.type,email:a.subject.type==="email"?a.subject.value:"",group:a.subject.type==="group"?a.subject.value:"",provider:a.subject.type==="group"?a.subject.provider:"",roleId:a.roleId},l.catalogue.roles.find(u=>u.id===a.roleId),a.subject.type==="group"?l.providers.find(u=>a.subject.type==="group"&&u.id===a.subject.provider):void 0,l.query.project,l.organizationName);await m(()=>l.query.project===null?s.request("post","/_pb/grants",{body:a,idempotencyKey:crypto.randomUUID()}):s.request("post","/_pb/projects/{project}/grants",{params:{project:l.query.project},body:a,idempotencyKey:crypto.randomUUID()}),`Grant created. Access depends on the person's email or the groups their provider reports at sign-in. ${d}`,!0)},async changeGrant(a,l){let d=j(a);if(!d)return;let u=t.snapshot().query.project,h={"If-Match":N(d.revision)};await m(()=>u===null?s.request("patch","/_pb/grants/{grant}",{params:{grant:a},headers:h,body:{roleId:l}}):s.request("patch","/_pb/projects/{project}/grants/{grant}",{params:{project:u,grant:a},headers:h,body:{roleId:l}}),void 0,!0)},async revoke(a){let l=j(a);if(!l)return;let d=t.snapshot().query.project,u={"If-Match":N(l.revision)};await m(()=>d===null?s.request("delete","/_pb/grants/{grant}",{params:{grant:a},headers:u}):s.request("delete","/_pb/projects/{project}/grants/{grant}",{params:{project:d,grant:a},headers:u}),void 0,!0)},async createRole(a){G(t.snapshot()).writeRoles&&await m(()=>s.request("post","/_pb/roles",{body:a,idempotencyKey:crypto.randomUUID()}))},async updateRole(a,l){let d=v(a);d&&await m(()=>s.request("patch","/_pb/roles/{role}",{params:{role:a},headers:{"If-Match":N(d.revision)},body:l}))},async deleteRole(a){let l=v(a);l&&await m(()=>s.request("delete","/_pb/roles/{role}",{params:{role:a},headers:{"If-Match":N(l.revision)}}))},async replayed(a){let l=t.snapshot().query.project,d=l===null?P(t.snapshot())?"/_pb/roles":"/_pb/grants":`/_pb/projects/${encodeURIComponent(l)}/grants`;a.path!==d&&!a.path.startsWith(`${d}/`)||(a.ok?await f(t.snapshot().query,"Access updated."):t.set({stale:!0,notice:a.status===412&&!P(t.snapshot())?"This grant changed. Reload it before saving.":C(a)}))},dispose(){++n}}}var de=(e="")=>e.split(/[\s,]+/).filter(Boolean);function fe({state:e,controller:t}){let s=G(e),n=!e.loading&&(e.query.project===null?e.organization.includes("org:grants:write"):e.permissions.includes("project:grants:write"));return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(re,{...e,reload:()=>{t.load(e.query)}}),P(e)?(0,i.jsxs)(i.Fragment,{children:[!e.loading&&!e.listError&&s.roles.length?(0,i.jsx)(V,{label:"Roles",items:s.roles,columns:[{key:"name",label:"Role",value:r=>r.name,render:r=>(0,i.jsxs)("div",{className:"grid gap-1",children:[(0,i.jsx)("strong",{children:r.name}),(0,i.jsx)(D,{value:r.id,label:"role ID"}),r.isSystem?(0,i.jsx)(E,{variant:"outline",children:"System"}):null,r.protectsLastHolder?(0,i.jsx)("span",{className:"text-xs text-neutral-600",children:"Last holder protected"}):null]})},{key:"scope",label:"Scope",value:r=>r.scope},{key:"permissions",label:"Permissions",value:r=>r.permissions.join(", "),render:r=>(0,i.jsx)("div",{className:"flex flex-wrap gap-1",children:r.permissions.map(c=>(0,i.jsx)(E,{variant:"outline",children:c},c))})},{key:"actions",label:"Actions",value:()=>"",sortable:!1,render:r=>s.writeRoles&&!r.isSystem&&N(r.revision)?(0,i.jsxs)("details",{children:[(0,i.jsx)("summary",{className:"cursor-pointer underline",children:"Edit role"}),(0,i.jsxs)("div",{className:"mt-3 grid gap-3",children:[(0,i.jsxs)("form",{className:"grid gap-2",onSubmit:c=>{if(c.preventDefault(),e.busy)return;let f=T(c);t.updateRole(r.id,{name:f.name??""})},children:[(0,i.jsx)(S,{name:"name",label:"Role name",value:r.name}),(0,i.jsx)(R,{type:"submit",disabled:e.busy,children:"Rename role"})]}),(0,i.jsxs)("form",{className:"grid gap-2",onSubmit:c=>{if(c.preventDefault(),e.busy)return;let f=T(c);t.updateRole(r.id,{permissions:de(f.permissions)})},children:[(0,i.jsx)(S,{name:"permissions",label:"Permissions (comma separated)",value:r.permissions.join(", "),required:!1}),(0,i.jsx)(R,{type:"submit",disabled:e.busy,children:"Save permissions"})]}),(0,i.jsx)(U,{action:"Remove role",target:`${r.name} (${r.id})`,scope:"Organization",description:"Deleting this role removes its permission bundle. Review grants using this role before continuing. This cannot be undone.",disabled:e.busy,onConfirm:()=>{t.deleteRole(r.id)}},`${r.id}:${r.revision}`)]})]}):null}]}):null,s.writeRoles?(0,i.jsxs)("details",{className:"detail-group my-6",children:[(0,i.jsx)("summary",{className:"cursor-pointer font-semibold",children:"New role"}),(0,i.jsxs)("form",{className:"my-6 grid gap-3",onSubmit:r=>{if(r.preventDefault(),e.busy)return;let c=T(r);t.createRole({key:c.key??"",name:c.name??"",scope:c.scope,permissions:de(c.permissions)})},children:[(0,i.jsx)("h2",{className:"text-lg font-semibold",children:"New role"}),(0,i.jsx)(S,{name:"key",label:"Role key"}),(0,i.jsx)(S,{name:"name",label:"Role name"}),(0,i.jsxs)($,{className:"grid gap-1",children:["Scope",(0,i.jsxs)(q,{name:"scope",children:[(0,i.jsx)("option",{value:"organization",children:"Organization"}),(0,i.jsx)("option",{value:"project",children:"Project"})]})]}),(0,i.jsx)(S,{name:"permissions",label:"Permissions (comma separated)",required:!1}),(0,i.jsx)(R,{type:"submit",disabled:e.busy,children:"Create role"})]})]}):null]}):(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)("h2",{className:"my-3 text-lg font-semibold",children:e.query.project===null?"Organization grants":"Members and project grants"}),!e.loading&&!e.listError&&s.grants.length?(0,i.jsx)(V,{label:e.query.project===null?"Organization grants":"Members and project grants",items:s.grants,columns:[{key:"principal",label:"Principal / grant",value:r=>r.principalName??r.principalId??r.id,render:r=>(0,i.jsxs)("div",{className:"grid gap-1",children:[(0,i.jsx)("strong",{children:r.principalName??"Grant"}),(0,i.jsx)(D,{value:r.principalId??r.id,label:r.principalId?"principal ID":"grant ID"})]})},{key:"kind",label:"Kind",value:r=>r.kind,render:r=>(0,i.jsx)(E,{variant:"outline",children:r.kind})},{key:"role",label:"Role",value:r=>r.roleName},{key:"added",label:"Added",value:r=>r.createdAt,priority:2,render:r=>(0,i.jsx)(ae,{value:r.createdAt})},{key:"id",label:"Grant ID",value:r=>r.id,priority:3,render:r=>(0,i.jsx)(D,{value:r.id,label:"grant ID"})},{key:"actions",label:"Actions",value:()=>"",sortable:!1,render:r=>n&&N(r.revision)?(0,i.jsxs)("details",{children:[(0,i.jsx)("summary",{className:"cursor-pointer underline",children:"Change role"}),(0,i.jsxs)("div",{className:"mt-3 grid gap-2",children:[(0,i.jsx)(ce,{catalogue:e.catalogue,project:e.query.project,currentRole:r.roleId,busy:e.busy||e.stale,retry:()=>{t.loadFormOptions()},submit:c=>t.changeGrant(r.id,c)}),(0,i.jsx)(U,{action:"Revoke grant",target:`${r.principalName??r.principalId??r.id} \xB7 ${e.catalogue.roles.find(c=>c.id===r.roleId)?.name??r.roleName}`,scope:e.query.project===null?"Organization":`Project: ${e.query.project}`,description:"This removes the access provided by this grant. Other grants still apply. To restore this access, create a new grant.",disabled:e.busy||e.stale,onConfirm:()=>{t.revoke(r.id)}},`${r.id}:${r.revision}`)]})]}):null}]}):null,n?(0,i.jsxs)("details",{className:"detail-group my-6",children:[(0,i.jsx)("summary",{className:"cursor-pointer font-semibold",children:"New grant"}),(0,i.jsx)(pe,{catalogue:e.catalogue,providers:e.providers,providerStatus:e.providerStatus,project:e.query.project,organization:e.organizationName,busy:e.busy||e.stale,retry:()=>{t.loadFormOptions()},submit:r=>t.createGrant(r)},e.query.project??"organization")]}):null]}),!e.loading&&!e.listError&&(P(e)?s.roles:s.grants).length===0?(0,i.jsx)(J,{kind:e.query.q?"filtered-empty":"empty",title:"No entries found on this page."}):null,e.next?(0,i.jsx)("a",{className:"my-4 inline-block underline",href:ve({...e.query,after:e.next}),children:"Next entries"}):null]})}function Be(){let e=Y(),t=(0,L.useMemo)(()=>ye(e),[e]),s=(0,L.useSyncExternalStore)(t.subscribe,t.snapshot,t.snapshot),n=oe(e,t,W,"access"),r=W(n);return(0,i.jsxs)("section",{"aria-labelledby":"page-heading",children:[(0,i.jsx)("h1",{tabIndex:-1,id:"page-heading",className:"text-xl font-semibold",children:"Access"}),(0,i.jsx)("p",{className:"mt-1 text-neutral-600",children:"Membership comes from project grants. A role is the bundle of permissions a grant carries."}),(0,i.jsx)(te,{route:"access",query:r,statuses:r.project===null?ue:["grants"]},n),(0,i.jsx)(fe,{state:s,controller:t})]})}export{Be as AccessPage,fe as AccessView,G as accessViewModel,ve as buildAccessHash,ye as createAccessController,W as parseAccessHash};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */
|
|
2
|
-
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial}}}@layer theme{:root,:host{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-50:oklch(97.1% .013 17.38);--color-red-200:oklch(88.5% .062 18.334);--color-red-300:oklch(80.8% .114 19.571);--color-red-700:oklch(50.5% .213 27.518);--color-red-800:oklch(44.4% .177 26.899);--color-red-900:oklch(39.6% .141 25.723);--color-amber-50:oklch(98.7% .022 95.277);--color-amber-300:oklch(87.9% .169 91.605);--color-amber-900:oklch(41.4% .112 45.904);--color-emerald-50:oklch(97.9% .021 166.113);--color-emerald-200:oklch(90.5% .093 164.15);--color-emerald-800:oklch(43.2% .095 166.913);--color-blue-50:oklch(97% .014 254.604);--color-blue-100:oklch(93.2% .032 255.585);--color-blue-200:oklch(88.2% .059 254.128);--color-blue-600:oklch(54.6% .245 262.881);--color-blue-700:oklch(48.8% .243 264.376);--color-blue-800:oklch(42.4% .199 265.638);--color-gray-100:oklch(96.7% .003 264.542);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-700:oklch(37.3% .034 259.733);--color-neutral-50:oklch(98.5% 0 none);--color-neutral-100:oklch(97% 0 none);--color-neutral-200:oklch(92.2% 0 none);--color-neutral-300:oklch(87% 0 none);--color-neutral-500:oklch(55.6% 0 none);--color-neutral-600:oklch(43.9% 0 none);--color-neutral-700:oklch(37.1% 0 none);--color-neutral-900:oklch(20.5% 0 none);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-md:28rem;--container-lg:32rem;--container-xl:36rem;--container-5xl:64rem;--container-7xl:80rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--tracking-tight:-.025em;--leading-snug:1.375;--radius-sm:.25rem;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}body{color:#171717;background:#fafafa;font-size:14px}:focus-visible{outline-offset:2px;outline:2px solid #155dfc}h1{letter-spacing:-.01em}}@layer components;@layer utilities{.\@container{container-type:inline-size}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.inset-0{inset:0}.top-4{top:calc(var(--spacing) * 4)}.right-4{right:calc(var(--spacing) * 4)}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.m-4{margin:calc(var(--spacing) * 4)}.m-auto{margin:auto}.mx-auto{margin-inline:auto}.my-2{margin-block:calc(var(--spacing) * 2)}.my-3{margin-block:calc(var(--spacing) * 3)}.my-4{margin-block:calc(var(--spacing) * 4)}.my-6{margin-block:calc(var(--spacing) * 6)}.mt-1{margin-top:var(--spacing)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mt-12{margin-top:calc(var(--spacing) * 12)}.mr-auto{margin-right:auto}.mb-1{margin-bottom:var(--spacing)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-auto{margin-left:auto}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.h-4{height:calc(var(--spacing) * 4)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-11{height:calc(var(--spacing) * 11)}.h-auto{height:auto}.h-dvh{height:100dvh}.max-h-60{max-height:calc(var(--spacing) * 60)}.max-h-\[90dvh\]{max-height:90dvh}.max-h-none{max-height:none}.min-h-0{min-height:0}.min-h-10{min-height:calc(var(--spacing) * 10)}.min-h-11{min-height:calc(var(--spacing) * 11)}.min-h-screen{min-height:100vh}.w-4{width:calc(var(--spacing) * 4)}.w-11{width:calc(var(--spacing) * 11)}.w-36{width:calc(var(--spacing) * 36)}.w-\[calc\(100\%_-_2rem\)\]{width:calc(100% - 2rem)}.w-auto{width:auto}.w-fit{width:fit-content}.w-full{width:100%}.max-w-5xl{max-width:var(--container-5xl)}.max-w-7xl{max-width:var(--container-7xl)}.max-w-full{max-width:100%}.max-w-lg{max-width:var(--container-lg)}.max-w-md{max-width:var(--container-md)}.max-w-none{max-width:none}.max-w-xl{max-width:var(--container-xl)}.min-w-0{min-width:0}.min-w-32{min-width:calc(var(--spacing) * 32)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.caption-bottom{caption-side:bottom}.cursor-pointer{cursor:pointer}.resize{resize:both}.list-disc{list-style-type:disc}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-start{justify-content:flex-start}.gap-0{gap:0}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-6{gap:calc(var(--spacing) * 6)}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}.gap-x-6{column-gap:calc(var(--spacing) * 6)}.gap-y-4{row-gap:calc(var(--spacing) * 4)}.justify-self-start{justify-self:flex-start}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-none{border-radius:0}.rounded-sm{border-radius:var(--radius-sm)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-amber-300{border-color:var(--color-amber-300)}.border-blue-200{border-color:var(--color-blue-200)}.border-emerald-200{border-color:var(--color-emerald-200)}.border-gray-400{border-color:var(--color-gray-400)}.border-neutral-200{border-color:var(--color-neutral-200)}.border-neutral-300{border-color:var(--color-neutral-300)}.border-red-200{border-color:var(--color-red-200)}.border-red-300{border-color:var(--color-red-300)}.border-transparent{border-color:#0000}.bg-amber-50{background-color:var(--color-amber-50)}.bg-blue-50{background-color:var(--color-blue-50)}.bg-blue-100{background-color:var(--color-blue-100)}.bg-blue-700{background-color:var(--color-blue-700)}.bg-emerald-50{background-color:var(--color-emerald-50)}.bg-gray-100{background-color:var(--color-gray-100)}.bg-neutral-50{background-color:var(--color-neutral-50)}.bg-neutral-100{background-color:var(--color-neutral-100)}.bg-red-50{background-color:var(--color-red-50)}.bg-red-700{background-color:var(--color-red-700)}.bg-transparent{background-color:#0000}.bg-white{background-color:var(--color-white)}.p-0{padding:0}.p-1{padding:var(--spacing)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-6{padding:calc(var(--spacing) * 6)}.px-0{padding-inline:0}.px-1{padding-inline:var(--spacing)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-6{padding-inline:calc(var(--spacing) * 6)}.px-8{padding-inline:calc(var(--spacing) * 8)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-3{padding-block:calc(var(--spacing) * 3)}.pt-0{padding-top:0}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pr-7{padding-right:calc(var(--spacing) * 7)}.pr-16{padding-right:calc(var(--spacing) * 16)}.pb-6{padding-bottom:calc(var(--spacing) * 6)}.pb-\[max\(1rem\,env\(safe-area-inset-bottom\)\)\]{padding-bottom:max(1rem, env(safe-area-inset-bottom))}.pl-5{padding-left:calc(var(--spacing) * 5)}.pl-6{padding-left:calc(var(--spacing) * 6)}.text-left{text-align:left}.align-middle{vertical-align:middle}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.leading-none{--tw-leading:1;line-height:1}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.whitespace-normal{white-space:normal}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-amber-900{color:var(--color-amber-900)}.text-blue-700{color:var(--color-blue-700)}.text-blue-800{color:var(--color-blue-800)}.text-emerald-800{color:var(--color-emerald-800)}.text-gray-700{color:var(--color-gray-700)}.text-neutral-500{color:var(--color-neutral-500)}.text-neutral-600{color:var(--color-neutral-600)}.text-neutral-700{color:var(--color-neutral-700)}.text-neutral-900{color:var(--color-neutral-900)}.text-red-700{color:var(--color-red-700)}.text-red-800{color:var(--color-red-800)}.text-red-900{color:var(--color-red-900)}.text-white{color:var(--color-white)}.lowercase{text-transform:lowercase}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.underline{text-decoration-line:underline}.underline-offset-4{text-underline-offset:4px}.accent-blue-700{accent-color:var(--color-blue-700)}.opacity-70{opacity:.7}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.\[image-rendering\:pixelated\]{image-rendering:pixelated}.peer-disabled\:opacity-70:is(:where(.peer):disabled~*){opacity:.7}.placeholder\:text-neutral-500::placeholder{color:var(--color-neutral-500)}.backdrop\:bg-black\/50::backdrop{background-color:#00000080}@supports (color:color-mix(in lab, red, red)){.backdrop\:bg-black\/50::backdrop{background-color:color-mix(in oklab, var(--color-black) 50%, transparent)}}.open\:flex:is([open],:popover-open,:open){display:flex}@media (hover:hover){.hover\:bg-blue-800:hover{background-color:var(--color-blue-800)}.hover\:bg-neutral-50:hover{background-color:var(--color-neutral-50)}.hover\:bg-neutral-100:hover{background-color:var(--color-neutral-100)}.hover\:bg-neutral-200:hover{background-color:var(--color-neutral-200)}.hover\:bg-red-50:hover{background-color:var(--color-red-50)}.hover\:bg-red-800:hover{background-color:var(--color-red-800)}.hover\:text-red-800:hover{color:var(--color-red-800)}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus\:ring-blue-600:focus{--tw-ring-color:var(--color-blue-600)}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\:ring-blue-600:focus-visible{--tw-ring-color:var(--color-blue-600)}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:opacity-60:disabled{opacity:.6}.has-checked\:border-blue-700:has(:checked){border-color:var(--color-blue-700)}.has-checked\:bg-blue-50:has(:checked){background-color:var(--color-blue-50)}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.data-\[highlighted\]\:bg-neutral-100[data-highlighted]{background-color:var(--color-neutral-100)}.data-\[state\=active\]\:bg-white[data-state=active]{background-color:var(--color-white)}.data-\[state\=active\]\:text-neutral-900[data-state=active]{color:var(--color-neutral-900)}.data-\[state\=active\]\:shadow[data-state=active]{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}@media (min-width:40rem){.sm\:h-auto{height:auto}.sm\:max-h-\[90dvh\]{max-height:90dvh}.sm\:min-h-8{min-height:calc(var(--spacing) * 8)}.sm\:w-\[calc\(100\%_-_2rem\)\]{width:calc(100% - 2rem)}.sm\:w-auto{width:auto}.sm\:max-w-lg{max-width:var(--container-lg)}.sm\:flex-row{flex-direction:row}.sm\:rounded-lg{border-radius:var(--radius-lg)}.sm\:p-6{padding:calc(var(--spacing) * 6)}.sm\:py-1{padding-block:var(--spacing)}.sm\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}@media (min-width:48rem){.md\:hidden{display:none}}@media (min-width:64rem){.lg\:not-sr-only{clip-path:none;white-space:normal;width:auto;height:auto;margin:0;padding:0;position:static;overflow:visible}.lg\:col-span-2{grid-column:span 2/span 2}.lg\:hidden{display:none}.lg\:w-48{width:calc(var(--spacing) * 48)}.lg\:w-auto{width:auto}.lg\:max-w-5xl{max-width:var(--container-5xl)}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}.\[\&_tr\]\:border-b tr{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.\[\&_tr\:last-child\]\:border-0 tr:last-child{border-style:var(--tw-border-style);border-width:0}}.shell-header{background:#fff;border-bottom:1px solid #e5e5e5;flex-wrap:wrap;align-items:center;gap:8px;padding:8px 12px;display:flex}.shell-brand{white-space:nowrap;font-size:15px}.shell-nav{border-top:1px solid #e5e5e5;order:10;width:100%;padding-top:8px;display:none}.shell-nav.is-open{display:grid}.shell-nav-group{margin:0;padding:0;list-style:none}.shell-nav-divider{border:0;border-top:1px solid #e5e5e5;margin:8px 0}.shell-nav a{padding:10px 12px}@media (min-width:1024px){.shell-header{flex-wrap:nowrap}.shell-nav,.shell-nav.is-open{border:0;flex-wrap:wrap;flex:1;order:0;width:auto;min-width:0;padding:0;display:flex}.shell-nav-group{flex-wrap:wrap;align-items:center;display:flex}.shell-nav-administration{margin-left:auto}.shell-nav-divider{display:none}.shell-nav a{padding:6px 10px}}@media (max-width:420px){.shell-brand{white-space:normal;max-width:62px;line-height:1.2}}.list-card{background:#fff;border:1px solid #e5e5e5;border-radius:6px;min-width:0;overflow:hidden}.column-options{color:#525252;border-bottom:1px solid #e5e5e5;padding:10px 16px}.column-options summary{cursor:pointer}.card-sort{border-bottom:1px solid #e5e5e5;flex-wrap:wrap;align-items:center;gap:8px;padding:10px 16px;display:none}.card-sort select,.column-options select{background:#fff;border:1px solid #d4d4d4;border-radius:4px;min-width:0;max-width:100%;padding:4px}.table-container{width:100%;min-width:0;container:broker-table/inline-size}.table-scroll{background-color:#0000;background-image:linear-gradient(90deg,#fff 30%,#0000),linear-gradient(270deg,#fff 30%,#0000),linear-gradient(90deg,#d4d4d4,#0000),linear-gradient(270deg,#d4d4d4,#0000);background-position:0,100%,0,100%;background-repeat:no-repeat;background-size:32px 100%,32px 100%,12px 100%,12px 100%;background-attachment:local,local,scroll,scroll;background-origin:padding-box,padding-box,padding-box,padding-box;background-clip:border-box,border-box,border-box,border-box;max-width:100%;overflow-x:auto}.table-hint{color:#525252;border-bottom:1px solid #e5e5e5;padding:6px 12px;font-size:12px}.responsive-table{border-collapse:separate;border-spacing:0}.responsive-table th{white-space:nowrap}.responsive-table th:first-child,.responsive-table td:first-child{z-index:1;background:#fff;position:sticky;left:0;box-shadow:1px 0 #e5e5e5}.responsive-table td{overflow-wrap:anywhere}.responsive-table tr[aria-selected=true] td{background:#eff6ff}.responsive-table button{white-space:normal;overflow-wrap:anywhere;max-width:100%}@container broker-table (max-width:1140px){.responsive-table .priority-3:not([data-visibility=visible]){display:none}}@container broker-table (max-width:960px){.responsive-table .priority-2:not([data-visibility=visible]){display:none}}@container broker-table (max-width:640px){.card-sort{display:flex}.table-hint{display:none}.responsive-table thead{clip-path:inset(50%);width:1px;height:1px;position:absolute;overflow:hidden}.responsive-table,.responsive-table tbody{width:100%;display:block}.responsive-table tbody tr{padding:10px 16px;display:block}.responsive-table td,.responsive-table td.priority-2:not([data-visibility=visible]),.responsive-table td.priority-3:not([data-visibility=visible]){border:0;justify-content:space-between;align-items:baseline;gap:12px;padding:4px 0;display:flex}.responsive-table td:before{content:attr(data-label);color:#525252;flex:0 0 34%;font-size:12px}.responsive-table .cell-value{text-align:right;flex:1;min-width:0}.responsive-table td:first-child{box-shadow:none;padding-bottom:8px;position:static}.responsive-table td:first-child:before{display:none}.responsive-table td:first-child .cell-value{text-align:left}}.filter-toolbar form{flex-wrap:wrap;align-items:end;gap:12px;display:flex}.filter-toolbar form>div{flex:160px;gap:6px;min-width:0;display:grid}.filter-chip{background:#fff;border:1px solid #d4d4d4;border-radius:999px;align-items:center;gap:4px;max-width:100%;padding-left:10px;font-size:12px;display:inline-flex}@media (max-width:767px){.filter-toolbar{background:#fff;border:1px solid #e5e5e5;border-radius:6px}.filter-toolbar form{margin:0;padding:0 12px 12px}.filter-toolbar form>div{flex-basis:100%}.filter-toolbar input,.filter-toolbar select{font-size:16px}}.list-state{text-align:center;color:#525252;border:1px dashed #d4d4d4;border-radius:8px;justify-items:center;gap:8px;margin:16px 0;padding:36px 16px;display:grid}.list-state strong{color:#171717;font-weight:500}.list-state-error{background:#fef2f2;border-style:solid;border-color:#ffc9c9}.detail-grid{grid-template-columns:repeat(auto-fit,minmax(min(100%,280px),1fr));gap:12px;display:grid}.detail-group{background:#fff;border:1px solid #e5e5e5;border-radius:6px;min-width:0;padding:16px}.detail-group h3{color:#525252;text-transform:uppercase;letter-spacing:.04em;margin-bottom:12px;font-size:12px;font-weight:600}.detail-list{grid-template-columns:max-content minmax(0,1fr);gap:8px 20px;display:grid}.detail-list dt{color:#525252}.detail-list dd{overflow-wrap:anywhere;min-width:0}@media (max-width:480px){.detail-list{grid-template-columns:minmax(0,1fr);gap:2px}.detail-list dd{margin-bottom:8px}}[data-overlay-host]{z-index:50;position:relative}.menu-positioner{z-index:50}.menu-popup{max-width:var(--available-width);max-height:var(--available-height);overscroll-behavior:contain;overflow:auto}.product-footer{color:#525252;text-align:center;flex-wrap:wrap;justify-content:center;align-items:center;gap:4px 16px;padding:16px;font-size:12px;line-height:16px;display:flex}.product-footer a{text-underline-offset:2px;align-items:center;min-height:44px;text-decoration:underline;display:inline-flex}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{a as k}from"./chunk.3704953b4a66.js";import"./chunk.f922af39a279.js";import{a as y}from"./chunk.ce96495b8b55.js";import{a as L,b as g,c as h}from"./chunk.862544cf5835.js";import{C as m,D as c,E as s,J as w,c as b,d as P,g as x,p as d}from"./chunk.6e23a75a1324.js";var r=b(P(),1);var a=b(x(),1);function N(t){let e=new URLSearchParams(t.split("?")[1]??""),l=e.get("project");return{scope:l!==null&&/^[A-Za-z0-9._-]{1,64}$/.test(l)?l:null,filters:{actor:e.get("actor")??"",action:e.get("action")??"",project:e.get("filterProject")??"",limit:e.get("limit")??"50",after:e.get("after")??""}}}function p(t,e){let l=new URLSearchParams;e!==null&&l.set("project",e);for(let i of["actor","action","project","limit","after"])i==="project"&&e!==null||t[i]!==""&&l.set(i==="project"?"filterProject":i,t[i]);return`#/audit${l.size?`?${l}`:""}`}async function B(t,e,l){let i={actor:e.actor||void 0,action:e.action||void 0,limit:e.limit||void 0,after:e.after||void 0},[n,u]=await Promise.all([l===null?t.request("get","/_pb/audit",{query:{actor:i.actor,action:i.action,project:e.project||void 0,limit:i.limit,after:i.after}}):t.request("get","/_pb/projects/{project}/audit",{params:{project:l},query:i}),t.request("get","/_pb/audit/head")]);return{data:n.ok?n.data:null,head:u.ok?u.data:null,error:n.ok?u.ok?null:"Unable to load the chain head.":"Unable to load audit events."}}function C(t){return(0,a.jsxs)("section",{"aria-labelledby":"page-heading",className:"space-y-4",children:[(0,a.jsx)("h1",{tabIndex:-1,id:"page-heading",className:"text-2xl font-semibold",children:"Audit"}),t.head===null?null:(0,a.jsxs)("div",{className:"flex flex-wrap gap-2","aria-label":"Audit chain head",children:[(0,a.jsx)(g,{variant:"outline",children:`Head ${t.head.seq}`}),(0,a.jsx)(g,{variant:"secondary",children:t.head.lastVerifiedAt===null?"never verified":(0,a.jsxs)(a.Fragment,{children:["Last verified ",(0,a.jsx)(y,{value:t.head.lastVerifiedAt})]})}),t.head.pendingCount>0?(0,a.jsx)(g,{variant:"secondary",children:`${t.head.pendingCount} pending`}):null]}),(0,a.jsx)(k,{chips:["actor","action","project"].flatMap(e=>t.filters[e]&&(e!=="project"||t.scope===null)?[{label:{actor:"Actor",action:"Action",project:"Project"}[e],value:t.filters[e],onRemove:()=>t.onNavigate({...t.filters,[e]:"",after:""})}]:[]),children:(0,a.jsxs)("form",{className:"flex flex-wrap items-end gap-3",onSubmit:e=>{e.preventDefault();let l=new FormData(e.currentTarget),i=n=>String(l.get(n)??"");t.onNavigate({actor:i("actor"),action:i("action"),project:i("filterProject"),limit:i("limit"),after:""})},children:[(0,a.jsxs)("div",{children:[(0,a.jsx)(s,{htmlFor:"audit-actor",children:"Actor"}),(0,a.jsx)(c,{id:"audit-actor",name:"actor",maxLength:200,defaultValue:t.filters.actor})]}),(0,a.jsxs)("div",{children:[(0,a.jsx)(s,{htmlFor:"audit-action",children:"Action"}),(0,a.jsx)(c,{id:"audit-action",name:"action",maxLength:200,defaultValue:t.filters.action})]}),t.scope===null?(0,a.jsxs)("div",{children:[(0,a.jsx)(s,{htmlFor:"audit-project",children:"Project"}),(0,a.jsx)(c,{id:"audit-project",name:"filterProject",maxLength:200,defaultValue:t.filters.project})]}):null,(0,a.jsxs)("div",{children:[(0,a.jsx)(s,{htmlFor:"audit-limit",children:"Limit"}),(0,a.jsx)(c,{id:"audit-limit",name:"limit",type:"number",min:"1",max:"200",required:!0,defaultValue:t.filters.limit})]}),(0,a.jsx)(d,{type:"submit",children:"Filter"}),(0,a.jsx)(d,{type:"button",variant:"outline",onClick:()=>t.onNavigate({actor:"",action:"",project:"",limit:"50",after:""}),children:"Clear filters"})]},p(t.filters,t.scope))}),t.error===null?null:(0,a.jsx)(h,{kind:"error",title:t.error,children:(0,a.jsx)(d,{type:"button",variant:"outline",onClick:()=>t.onNavigate({...t.filters}),children:"Retry"})}),t.loading?(0,a.jsx)(h,{kind:"loading",title:"Loading audit events\u2026"}):null,t.data===null?null:(0,a.jsxs)(a.Fragment,{children:[t.data.items.length?(0,a.jsx)(L,{label:"Audit events",items:t.data.items,columns:[{key:"seq",label:"Sequence",value:e=>e.seq},{key:"time",label:"Time",value:e=>e.createdAt,render:e=>(0,a.jsx)(y,{value:e.createdAt})},{key:"action",label:"Action",value:e=>e.action},{key:"actor",label:"Actor",value:e=>e.actor.id??"",render:e=>(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("span",{className:"block text-xs text-neutral-600",children:e.actor.type}),(0,a.jsx)(m,{value:e.actor.id,label:"actor ID"})]})},{key:"project",label:"Project",priority:2,value:e=>e.projectId??"",render:e=>(0,a.jsx)(m,{value:e.projectId,label:"project ID"})},{key:"targetType",label:"Target type",priority:2,value:e=>e.targetType},{key:"targetId",label:"Target ID",priority:3,value:e=>e.targetId??"",render:e=>(0,a.jsx)(m,{value:e.targetId,label:"target ID"})}]}):!t.loading&&!t.error?(0,a.jsx)(h,{kind:t.filters.actor||t.filters.action||t.filters.project||t.filters.after?"filtered-empty":"empty",title:t.filters.actor||t.filters.action||t.filters.project||t.filters.after?"No audit events match these filters":"No audit events."}):null,(0,a.jsxs)("div",{className:"flex gap-2",children:[t.filters.after?(0,a.jsx)(d,{type:"button",variant:"outline",onClick:()=>t.onNavigate({...t.filters,after:""}),children:"First page"}):null,(0,a.jsx)(d,{type:"button",disabled:t.data.next===null||t.loading,onClick:()=>{t.data?.next&&t.onNavigate({...t.filters,after:t.data.next})},children:"Next page"})]})]})]})}function M(){let{client:t}=w(),[e,l]=(0,r.useState)(()=>window.location.hash),[i,n]=(0,r.useState)({data:null,head:null,error:null}),[u,j]=(0,r.useState)(!0),[F,q]=(0,r.useState)(0);(0,r.useEffect)(()=>{let o=()=>l(window.location.hash);return window.addEventListener("hashchange",o),()=>window.removeEventListener("hashchange",o)},[]),(0,r.useEffect)(()=>{let o=!0;j(!0),n({data:null,head:null,error:null});let{filters:f,scope:v}=N(e);return B(t,f,v).then(T=>{o&&(n(T),j(!1))}),()=>{o=!1}},[t,e,F]);let{filters:I,scope:A}=N(e);return(0,a.jsx)(C,{...i,filters:I,scope:A,loading:u,onNavigate:o=>{let f=p(o,A);window.location.hash===f?q(v=>v+1):window.location.hash=f}})}export{M as AuditPage,C as AuditView,p as auditHash,B as loadAudit,N as readAuditHash};
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import{b as ze,d as Ye,e as We,f as Xe,g as Je}from"./chunk.976a2ff4338e.js";import{a as fe}from"./chunk.bf48b04e6a00.js";import{b as et}from"./chunk.3704953b4a66.js";import{a as oe}from"./chunk.f922af39a279.js";import{b as Ze}from"./chunk.855a50f45830.js";import{a as de}from"./chunk.ce96495b8b55.js";import{a as Qe,b as Pe,c as Z}from"./chunk.862544cf5835.js";import{A as J,B as Q,C as K,D as B,E as q,J as Ke,c as O,d as Be,g as $,j as Ve,l as Ue,o as Ge,p as C,q as Ce,r as xe,s as Ee,t as _e,w as Y,x as W,y as X,z as me}from"./chunk.6e23a75a1324.js";var Ne="Sync requested. Waiting for a worker. Sync continues in the background.";function Ae(t,e,l){return t===200?`${e} is already available from ${l}.`:`${e}: ${Ne}`}function De(t){return t.status===202?{ok:!0,status:202,data:void 0}:t}var tt="For proxy sources, packages appear when a client first requests them.";function St(t,e){return t.sync?.generation!==e.sync?.generation||t.status!==e.status||t.lastPolledAt!==e.lastPolledAt||t.lastSuccessAt!==e.lastSuccessAt||t.lastError!==e.lastError}function Re(t,e){return e.sync&&(e.sync.listing||e.sync.queued+e.sync.running+(e.sync.retrying??0)>0)?"pending":St(t,e)}function rt(t,e=typeof document>"u"?void 0:document){let l=Date.now()+6e5,i=!1,o=0,g=!1,s=2e3,m,w=setTimeout(()=>f(),6e5),f=()=>{i=!0,clearTimeout(m),clearTimeout(w),e?.removeEventListener("visibilitychange",E)},E=()=>{e?.hidden&&f()},r=()=>{if(i||e?.hidden||Date.now()>=l||!g&&o>=15){f();return}m=setTimeout(()=>{if(i||e?.hidden||Date.now()>=l){f();return}o++,t().then(y=>{y==="pending"?(o=0,g=!0,s=Math.min(s*2,3e4)):(g=!1,s=2e3),y===!0?f():r()},f)},s)};return e?.addEventListener("visibilitychange",E),r(),f}var L=O($(),1);function nt({source:t,busy:e,fieldError:l,alert:i,onSubmit:o,onClose:g}){return(0,L.jsx)(Y,{open:!0,onOpenChange:s=>{!s&&!e&&g()},children:(0,L.jsxs)(W,{onCancel:s=>{e&&s.preventDefault()},children:[(0,L.jsxs)(X,{children:[(0,L.jsx)(J,{children:"Add package"}),(0,L.jsxs)(Q,{children:["Request a package from ",t.name," for this project."]})]}),(0,L.jsxs)("form",{className:"grid gap-3",onSubmit:s=>{s.preventDefault(),e||o(new FormData(s.currentTarget).get("name")?.toString()??"")},children:[(0,L.jsx)(q,{htmlFor:"add-package-name",children:"Package name"}),(0,L.jsx)(B,{id:"add-package-name",name:"name",required:!0,maxLength:428,placeholder:t.ecosystem==="composer"?"vendor/package":"@scope/package",disabled:e,"aria-invalid":l?!0:void 0,"aria-describedby":l?"add-package-error":void 0}),l?(0,L.jsx)("p",{id:"add-package-error",role:"alert",children:l}):null,i?(0,L.jsx)("p",{role:"alert",children:i}):null,(0,L.jsxs)(me,{children:[(0,L.jsx)(C,{type:"button",variant:"outline",disabled:e,onClick:g,children:"Cancel"}),(0,L.jsx)(C,{type:"submit",disabled:e,children:e?"Requesting\u2026":"Add package"})]})]})]})})}var j=O(Be(),1);var z=O($(),1),at="h-auto min-h-10 w-fit max-w-full shrink-0 whitespace-normal break-words py-2 sm:min-h-8 sm:py-1";function kt({entityLabel:t}){return(0,z.jsx)(We,{"aria-label":`More actions for ${t}`,className:Ue(Ge({size:"sm",variant:"outline"}),at),children:"More"})}function ot({entityLabel:t,actions:e,overflow:l=[]}){return(0,z.jsxs)("div",{role:"group","aria-label":`Actions for ${t}`,className:"flex flex-wrap items-center gap-2",children:[e.map(i=>(0,z.jsx)(C,{size:"sm",className:at,variant:i.variant??"outline",disabled:!!i.disabled,"aria-disabled":i.pending||void 0,"aria-busy":i.pending||void 0,"aria-describedby":i.describedBy,"aria-label":`${i.label} ${t}`,onClick:()=>{!i.disabled&&!i.pending&&i.onSelect()},children:i.label},i.id)),l.length>0?(0,z.jsxs)(Ye,{className:"max-w-full",children:[(0,z.jsx)(kt,{entityLabel:t}),(0,z.jsx)(Xe,{children:l.map(i=>(0,z.jsx)(Je,{"data-variant":i.variant??"outline",className:i.variant==="destructive"?"text-red-700":void 0,disabled:!!i.disabled,"aria-disabled":i.pending||void 0,"aria-busy":i.pending||void 0,"aria-describedby":i.describedBy,"aria-label":`${i.label} ${t}`,onClick:o=>{if(i.disabled||i.pending){o.preventDefault();return}i.onSelect()},children:i.label},i.id))})]}):null]})}var st=O($(),1);function it({onKeyDown:t,...e}){return(0,st.jsx)("textarea",{...e,onKeyDown:l=>{t?.(l),!l.defaultPrevented&&!l.nativeEvent.isComposing&&l.key==="Enter"&&(l.metaKey||l.ctrlKey)&&(l.preventDefault(),l.currentTarget.form?.requestSubmit())}})}var I=O(Be(),1);var u=O($(),1),lt={github:"GitHub",git:"Git over HTTP(S)",ssh:"Git over SSH"},wt=["github"];function Ct(t){return Object.keys(lt).filter(e=>t.includes(e)).map(e=>[e,lt[e]])}var ct={composer:["packagist_proxy","composer_repository","vcs"],npm:["npmjs_proxy","npm_registry"]},Te={packagist_proxy:"https://repo.packagist.org",npmjs_proxy:"https://registry.npmjs.org"},V={packagist_proxy:"Packagist proxy",composer_repository:"Composer repository",vcs:"Git repository",npmjs_proxy:"npmjs proxy",npm_registry:"Private npm registry",hosted:"Hosted repository"},xt={packagist_proxy:"Fetch public Composer packages on demand.",composer_repository:"Import selected packages from Satis, Private Packagist, or another Composer repository.",vcs:"Import a Composer package from GitHub or another Git repository.",npmjs_proxy:"Fetch public npm packages on demand.",npm_registry:"Fetch packages in selected scopes from another npm registry."},ee={name:"Source name",ecosystem:"Ecosystem",type:"Source type",url:"Repository URL",userAgent:"User-Agent override",pollIntervalSeconds:"Sync interval (seconds)",removalPolicy:"When a package disappears upstream",defaultVisibleToNewProjects:"Visible to new projects",retentionDaysOverride:"Archive retention (days)","config/provider":"Repository provider","config/repository":"GitHub repository","config/installationId":"GitHub App installation ID",githubAuthentication:"GitHub authentication","config/packageName":"Composer package name override","config/refs/branches":"Branches to import","config/refs/tags":"Import tags","config/selection/packages":"Package names (one per line)","config/selection/patterns":"Package patterns (one per line)","config/selection/expandPatterns":"Expand patterns","config/distHosts":"Additional archive hosts","config/mirrorsFallback":"Try repository mirrors if an archive download fails","config/scopes":"Package scopes (one per line)","config/githubToken":"Use GitHub token"},ie={name:"Enter a source name.",ecosystem:"Choose an ecosystem.",type:"Choose a source type.",url:"Enter a valid HTTP or HTTPS URL without credentials, a query, or a fragment.",userAgent:"Enter a valid User-Agent header without line breaks.",pollIntervalSeconds:"Enter a whole number of seconds greater than 0.",removalPolicy:"Choose what happens when a package disappears upstream.",defaultVisibleToNewProjects:"Choose whether this source is visible to new projects.",retentionDaysOverride:"Enter a whole number of days that does not shorten organization retention.","config/provider":"Choose a repository provider this broker supports.","config/repository":"Enter a valid repository for the selected provider: owner/repository for GitHub, or a clone URL for Git.","config/installationId":"Enter a positive whole-number installation ID.",githubAuthentication:"Choose GitHub App or Personal access token.","config/packageName":"Enter a Composer package name, such as acme/payments.","config/refs/branches":"Enter valid branch names, one per line, without duplicates.","config/refs/tags":"Choose whether to import tags.","config/selection/packages":"Enter valid Composer package names, one per line, without duplicates.","config/selection/patterns":"Enter valid package patterns, such as acme/*, without duplicates.","config/selection/expandPatterns":"Choose whether to expand patterns.","config/distHosts":"Enter hostnames only, one per line, without schemes, paths, or duplicates.","config/mirrorsFallback":"Choose whether to try repository mirrors.","config/scopes":"Enter at least one scope, such as @acme, one per line without duplicates.","config/githubToken":"Save a bearer credential before enabling the GitHub token option."},Le={pollIntervalSeconds:"How often to check for upstream changes. 300 seconds = 5 minutes.",retentionDaysOverride:"Leave blank to use the organization setting. An override can only lengthen retention.","config/distHosts":"One hostname per line. Archive downloads may come from these hosts; the source credential is also sent to them.","config/selection/packages":"Packages matching either list are selected. Empty lists select no packages.","config/scopes":"One scope per line, including @. Only these scopes use this registry. Register @scope/* for each scope before enabling the source.","config/packageName":"Leave blank to use the name in composer.json.","config/refs/branches":"One branch name per line. Leave blank to import no branches.","config/installationId":"Enter the numeric installation ID for the account that owns this repository."},Et={userAgent:"Use broker default",retentionDaysOverride:"Use organization default","config/selection/packages":"acme/payments","config/selection/patterns":"acme/*","config/scopes":"@acme","config/distHosts":"downloads.example.com","config/packageName":"acme/payments","config/refs/branches":"main","config/installationId":"12345678"};function pt(t){let e={};for(let l of t){let i=l.path.replace(/^\/body\//,"").replace(/^\//,""),o=Object.keys(ee).find(g=>i===g||i.startsWith(`${g}/`));o&&(e[o]=ie[o]??"Review this setting.")}return e}function _t(t,e,l,i=null,o=i?ye(i):null){let g={},s=f=>String(t.get(f)??"").trim(),m=(f,E)=>{let r=Number(s(f));(!s(f)||!Number.isSafeInteger(r)||r<E)&&(g[f]=ie[f]??"Review this setting.")};!l&&!s("name")&&(g.name=ie.name),(e==="composer_repository"||e==="npm_registry")&&(!l||s("url")!==String(o?.get("url")??""))&&!s("url")&&(g.url=ie.url),m("pollIntervalSeconds",1),s("retentionDaysOverride")&&m("retentionDaysOverride",0);let w=!o||Object.keys(ee).some(f=>(f.startsWith("config/")||e==="vcs"&&f==="githubAuthentication")&&String(t.get(f)??"")!==String(o.get(f)??""));return gt(i,t)&&(w||t.has("replaceConfig"))&&(t.has("config/provider")||t.has("config/scopes")||t.has("config/selection/packages")||!l)&&(e==="composer_repository"&&!s("config/selection/packages")&&!s("config/selection/patterns")&&(g["config/selection/packages"]="Add at least one package name or pattern"),e==="npm_registry"&&!s("config/scopes")&&(g["config/scopes"]=ie["config/scopes"]),e==="vcs"&&!s("config/repository")&&(g["config/repository"]=ie["config/repository"]),e==="vcs"&&s("config/provider")==="github"&&s("githubAuthentication")!=="token"&&m("config/installationId",1)),g}function je(t,e){let l=Number(t);if(!t.trim()||!Number.isSafeInteger(l)||l<e)throw new Error("Enter valid whole numbers for the numeric fields.");return l}function ut(t,e,l,i=!0){let o=w=>String(t.get(w)??""),g=w=>t.has(w),s=w=>o(w).split(/\r?\n/).map(f=>f.trim()).filter(Boolean),m={pollIntervalSeconds:je(o("pollIntervalSeconds"),1),removalPolicy:o("removalPolicy")};if(m.defaultVisibleToNewProjects=g("defaultVisibleToNewProjects"),m.retentionDaysOverride=o("retentionDaysOverride").trim()===""?null:je(o("retentionDaysOverride"),0),m.userAgent=o("userAgent")||null,e!=="vcs"&&(m.url=o("url")||null),i&&(!l||t.has("config/provider")||t.has("config/scopes")||t.has("config/selection/packages")||e==="packagist_proxy"||e==="npmjs_proxy"))switch(e){case"vcs":m.config={provider:o("config/provider"),repository:o("config/repository"),...o("config/provider")==="github"&&o("githubAuthentication")!=="token"?{installationId:je(o("config/installationId"),1)}:{},...o("config/packageName")?{packageName:o("config/packageName")}:{},refs:{branches:s("config/refs/branches"),tags:g("config/refs/tags")}};break;case"composer_repository":m.config={selection:{packages:s("config/selection/packages"),patterns:s("config/selection/patterns"),expandPatterns:g("config/selection/expandPatterns")},distHosts:s("config/distHosts"),mirrorsFallback:g("config/mirrorsFallback")};break;case"npm_registry":m.config={scopes:s("config/scopes"),distHosts:s("config/distHosts")};break;case"packagist_proxy":m.config={githubToken:l&&g("config/githubToken")};break;case"npmjs_proxy":m.config={};break}return m}function gt(t,e){return t===null||t.config!==void 0&&t.configComplete!==!1||e.has("replaceConfig")}function Pt(t,e,l,i,o=i?ye(i):null){let g=ut(t,l,i!==null,gt(i,t));if(!i)return{name:String(t.get("name")??""),ecosystem:e,type:l,...g};let s=ut(o??ye(i),l,!0,i.config!==void 0&&i.configComplete!==!1);return Object.fromEntries(Object.entries(g).filter(([m,w])=>JSON.stringify(w)!==JSON.stringify(s[m])))}function be(t,e){let l=t?.config;for(let i of e.split("/")){if(typeof l!="object"||l===null)return;l=l[i]}return l}function ye(t){let e=new FormData;for(let l of Object.keys(ee)){let i=l.startsWith("config/")?be(t,l.slice(7)):t[l];typeof i=="boolean"?i&&e.set(l,"on"):Array.isArray(i)?e.set(l,i.join(`
|
|
2
|
-
`)):i!=null&&e.set(l,String(i))}return(t.type==="packagist_proxy"||t.type==="npmjs_proxy")&&e.set("url",Te[t.type]),e.set("pollIntervalSeconds",String(t.pollIntervalSeconds)),e.set("removalPolicy",t.removalPolicy),e.set("githubAuthentication",t.githubAuthentication??(be(t,"installationId")?"app":"token")),e}function Ie(t){return[...new Set(t.split(/\r?\n/).map(e=>e.trim()).filter(e=>/^@[a-z0-9][a-z0-9._~-]*$/.test(e)))].map(e=>`${e}/*`)}function dt(t,e){if(!t)return;let l=Array.from(t.elements).find(o=>(o.getAttribute("name")??"")in e);if(!l)return;let i=l.closest("details");i&&(i.open=!0),l.focus()}function mt({source:t,busy:e,errors:l,alert:i,onSubmit:o,onClose:g,vcsProviders:s=wt,initialType:m,initialProvider:w}){let[f,E]=(0,I.useState)(t?.ecosystem??"composer"),[r,y]=(0,I.useState)(t?.type??m??"packagist_proxy"),_=Ct(s),A=_[0]?.[0]??"github",[v,le]=(0,I.useState)(be(t,"provider")??w??A),te=_.some(([p])=>p===v),re=r==="vcs"&&(_.length===0||!te);(0,I.useEffect)(()=>{!t&&!te&&_.length>0&&le(A)},[t,te,_.length,A]);let[F,H]=(0,I.useState)(t?.githubAuthentication??(t?be(t,"installationId")?"app":"token":"app")),[a,d]=(0,I.useState)(""),c=t?ye(t):null,b=t!==null&&(t.configComplete===!1||t.config===void 0),[h,k]=(0,I.useState)(!1),[R,U]=(0,I.useState)({}),M=(0,I.useRef)(null),P={...l,...R},x=t!==null,ne=r==="packagist_proxy"||r==="npmjs_proxy",N=!re&&(!b||h);(0,I.useEffect)(()=>{dt(M.current,l)},[l]);function G(p){return[Le[p]&&`source-${p}-help`,P[p]&&`source-${p}-error`].filter(Boolean).join(" ")||void 0}function Se(p){return(0,u.jsxs)(u.Fragment,{children:[Le[p]?(0,u.jsx)("p",{id:`source-${p}-help`,className:"text-sm text-neutral-600",children:Le[p]}):null,P[p]?(0,u.jsx)("p",{id:`source-${p}-error`,className:"text-sm text-red-700",children:P[p]}):null]})}function ce(p,S,D=ee[p]){return(0,u.jsxs)("div",{className:"grid gap-1",children:[(0,u.jsx)(q,{htmlFor:`source-${p}`,children:D}),S,Se(p)]},p)}function T(p,S={}){let D={id:`source-${p}`,name:p,required:S.required,defaultValue:S.value??c?.get(p)?.toString(),onChange:p==="config/scopes"?ue=>d(ue.currentTarget.value):void 0,placeholder:S.placeholder??Et[p],"aria-invalid":!!P[p],"aria-describedby":G(p)};return ce(p,S.multiline?(0,u.jsx)(it,{...D,rows:3,className:"w-full rounded-md border border-neutral-300 bg-white px-3 py-2 text-base sm:text-sm"}):(0,u.jsx)(B,{...D,className:"h-11 text-base sm:text-sm",type:S.number?"number":"text",inputMode:S.number?"numeric":void 0,min:S.minimum,max:S.number?Number.MAX_SAFE_INTEGER:void 0,step:S.number?1:void 0,maxLength:p==="url"?2048:void 0}),`${S.label??ee[p]}${S.required?" (required)":""}`)}function ae(p,S=ee[p],D,ue){return(0,u.jsxs)("div",{className:"grid gap-1",children:[(0,u.jsxs)(q,{className:"flex min-h-11 items-center gap-2",htmlFor:`source-${p}`,children:[(0,u.jsx)("input",{type:"checkbox",id:`source-${p}`,name:p,defaultChecked:t?c?.has(p):ue,onChange:D?we=>D(we.currentTarget.checked):void 0,"aria-invalid":!!P[p],"aria-describedby":G(p)}),S]}),Se(p)]},p)}function ke(p,S,D,ue,we=!1){return(0,u.jsxs)("fieldset",{className:"grid gap-1","aria-describedby":G(p),"aria-invalid":!!P[p],children:[(0,u.jsx)("legend",{className:"text-sm font-medium",children:ee[p]}),(0,u.jsx)("div",{className:we?"flex gap-4":"grid gap-1",children:D.map(([ge,vt,$e])=>(0,u.jsxs)("label",{className:"flex min-h-11 cursor-pointer items-center gap-2 py-1",children:[(0,u.jsx)("input",{type:"radio",name:p,value:ge,checked:S===ge,onChange:()=>ue(ge),"aria-invalid":!!P[p],"aria-describedby":G(p)}),(0,u.jsxs)("span",{children:[(0,u.jsx)("span",{className:"text-sm font-medium",children:vt}),$e?(0,u.jsx)("span",{className:"block text-sm text-neutral-600",children:$e}):null]})]},ge))}),Se(p)]})}let ht={packagist_proxy:"Packagist",npmjs_proxy:"npmjs",composer_repository:"Acme Composer",npm_registry:"Acme npm",vcs:"Acme payments",hosted:""}[r];return(0,u.jsx)(Y,{open:!0,onOpenChange:p=>{!p&&!e&&g()},children:(0,u.jsxs)(W,{variant:"source",onCancel:p=>{e&&p.preventDefault()},children:[(0,u.jsxs)(X,{className:"shrink-0 p-6 pr-16",children:[(0,u.jsx)(J,{children:x?"Edit source":"Add source"}),(0,u.jsx)(Q,{children:x?`${t.name} \xB7 ${f==="composer"?"Composer":"npm"} \xB7 ${V[r]}. Name, ecosystem and source type cannot be changed.`:"Add an upstream source for this organization or project."})]}),(0,u.jsxs)("form",{noValidate:!0,ref:M,className:"flex min-h-0 min-w-0 flex-1 flex-col",onSubmit:p=>{if(p.preventDefault(),e)return;let S=new FormData(p.currentTarget),D=_t(S,r,x,t,c);if(U(D),Object.keys(D).length){dt(M.current,D);return}o(Pt(S,f,r,t,c))},onInvalidCapture:p=>{let D=p.target.closest("details");D&&(D.open=!0)},children:[(0,u.jsxs)("div",{className:"min-h-0 flex-1 overflow-y-auto px-6 pb-6",children:[i||Object.keys(P).length?(0,u.jsx)("p",{role:"alert",className:"mb-4 text-sm text-red-700",children:Object.keys(P).length?"Review the highlighted fields.":i}):null,t?(0,u.jsxs)("dl",{className:"detail-list mb-4","aria-label":"Source identity",children:[(0,u.jsx)("dt",{children:"Source ID"}),(0,u.jsx)("dd",{children:(0,u.jsx)(K,{value:t.id,label:"source ID"})}),(0,u.jsx)("dt",{children:"Source URL"}),(0,u.jsx)("dd",{className:"break-all",children:pe(t.url)??"No displayable URL"}),(0,u.jsx)("dt",{children:"Credential"}),(0,u.jsx)("dd",{children:t.hasCredential?"credential set \xB7 write-only":"No credential set"}),"attached"in t?(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)("dt",{children:"Attached to this project"}),(0,u.jsx)("dd",{children:t.attached?"Yes":"No"})]}):null]}):null,(0,u.jsxs)("fieldset",{disabled:e,className:"grid min-w-0 gap-4",children:[x?(0,u.jsx)(u.Fragment,{children:re?(0,u.jsx)("p",{className:"text-sm",children:`Source type: ${V[r]}. This broker cannot change its repository settings.`}):null}):(0,u.jsxs)(u.Fragment,{children:[ke("ecosystem",f,[["composer","Composer"],["npm","npm"]],p=>{let S=p;E(S),y(ct[S][0]),d(""),U({})},!0),ke("type",r,ct[f].filter(p=>p!=="vcs"||_.length>0).map(p=>[p,V[p],xt[p]]),p=>{y(p),d(""),le(A),H("app"),U({})}),T("name",{required:!0,placeholder:ht})]}),ne?(0,u.jsxs)("p",{className:"break-words text-sm",children:["Upstream URL: ",Te[r]]}):null,ne?(0,u.jsx)("input",{type:"hidden",name:"url",value:Te[r]}):null,!ne&&r!=="vcs"?(0,u.jsx)("div",{children:T("url",{required:!x||t.url!==null,value:t?.url??"",label:r==="npm_registry"?"Registry URL":"Repository URL",placeholder:r==="npm_registry"?"https://npm.example.com":"https://composer.example.com"})},`network:${r}`):null,b&&!re?(0,u.jsxs)("div",{className:"grid gap-1",children:[(0,u.jsx)("p",{className:"text-sm text-neutral-600",children:"Some saved settings cannot be displayed. Replace the configuration only if you intend to overwrite all saved type-specific settings."}),ae("replaceConfig","Replace type-specific configuration",k)]}):null,N?(0,u.jsxs)("div",{className:"grid gap-4",children:[r==="vcs"?(0,u.jsxs)(u.Fragment,{children:[ce("config/provider",(0,u.jsx)(oe,{id:"source-config/provider",name:"config/provider",value:v,className:"h-11 text-base sm:text-sm","aria-invalid":!!P["config/provider"],"aria-describedby":G("config/provider"),onChange:p=>le(p.currentTarget.value),children:_.map(([p,S])=>(0,u.jsx)("option",{value:p,children:S},p))})),(0,u.jsxs)("div",{children:[T("config/repository",{required:!0,label:v==="github"?"GitHub repository":v==="git"?"Git repository URL":"SSH repository",placeholder:v==="github"?"acme/payments":v==="git"?"https://git.example.com/acme/payments.git":"git@git.example.com:acme/payments.git"}),v==="github"?(0,u.jsx)("p",{className:"mt-1 text-sm text-neutral-600",children:"Use owner/repository for GitHub, such as acme/payments."}):null]},v),v==="github"?(0,u.jsxs)(u.Fragment,{children:[x?(0,u.jsxs)(u.Fragment,{children:[ce("githubAuthentication",(0,u.jsx)(B,{id:"source-githubAuthentication",name:"githubAuthenticationDisplay",className:"h-11 text-base sm:text-sm",value:F==="app"?"GitHub App":"Personal access token",readOnly:!0})),(0,u.jsx)("input",{type:"hidden",name:"githubAuthentication",value:F})]}):ke("githubAuthentication",F,[["app","GitHub App","Use an app installation with access to this repository."],["token","Personal access token","Add your token after creating the source."]],p=>H(p)),F==="app"?T("config/installationId",{required:!0,number:!0,minimum:1}):null]}):null]}):null,r==="composer_repository"?(0,u.jsxs)(u.Fragment,{children:[T("config/selection/packages",{multiline:!0}),T("config/selection/patterns",{multiline:!0})]}):null,r==="npm_registry"?(0,u.jsxs)(u.Fragment,{children:[T("config/scopes",{multiline:!0}),x?null:ce("registeredPatterns",(0,u.jsx)("textarea",{id:"source-registeredPatterns",name:"registeredPatterns",rows:3,readOnly:!0,value:Ie(a).join(`
|
|
3
|
-
`)}),"Names to register after adding this source")]}):null]},`primary:${r}`):null,x?null:(0,u.jsx)("p",{className:"text-sm text-neutral-600",children:ne?"No credentials are needed to add this proxy.":r==="vcs"&&v==="github"?F==="app"?"After adding this source, save the GitHub App credentials.":"After adding this source, save your GitHub personal access token as a bearer credential.":r==="vcs"&&v==="ssh"?"After adding this source, save an SSH private key and known hosts.":"After adding this source, save its credentials to finish setup."}),(0,u.jsxs)("details",{className:"min-w-0",children:[(0,u.jsx)("summary",{className:"min-h-11 cursor-pointer py-3 text-sm font-medium",children:"Advanced settings"}),(0,u.jsxs)("div",{className:"grid gap-4 pt-2",children:[(0,u.jsx)("p",{className:"text-sm text-neutral-600",children:"Optional sync, visibility, retention, and connection settings."}),N?(0,u.jsxs)("div",{className:"grid gap-4",children:[r==="composer_repository"||r==="npm_registry"?T("config/distHosts",{multiline:!0}):null,r==="composer_repository"?(0,u.jsxs)(u.Fragment,{children:[ae("config/mirrorsFallback"),x?ae("config/selection/expandPatterns"):null]}):null,r==="vcs"?(0,u.jsxs)(u.Fragment,{children:[T("config/packageName"),T("config/refs/branches",{multiline:!0}),ae("config/refs/tags",void 0,void 0,!0)]}):null,r==="packagist_proxy"&&x?ae("config/githubToken"):null]},`advanced:${r}`):null,r==="packagist_proxy"&&x?(0,u.jsx)("p",{className:"text-sm text-neutral-600",children:"To enable Use GitHub token, save a bearer credential with your GitHub token, then select Use GitHub token and save the source."}):null,T("pollIntervalSeconds",{number:!0,minimum:1,value:t?.pollIntervalSeconds??300}),ce("removalPolicy",(0,u.jsxs)(oe,{id:"source-removalPolicy",name:"removalPolicy",className:"h-11 text-base sm:text-sm","aria-invalid":!!P.removalPolicy,"aria-describedby":G("removalPolicy"),defaultValue:t?.removalPolicy??"flag",children:[(0,u.jsx)("option",{value:"flag",children:"Keep available and mark removed"}),(0,u.jsx)("option",{value:"exclude",children:"Exclude from package resolution"})]})),ae("defaultVisibleToNewProjects"),T("retentionDaysOverride",{number:!0,minimum:0}),T("userAgent")]})]})]})]}),(0,u.jsxs)(me,{className:"shrink-0 border-t border-neutral-200 bg-white px-6 pt-4 pb-[max(1rem,env(safe-area-inset-bottom))]",children:[(0,u.jsx)(C,{className:"min-h-11",type:"button",variant:"outline",disabled:e,onClick:g,children:"Cancel"}),(0,u.jsx)(C,{type:"submit",className:"min-h-11",disabled:e,children:x?"Save source":"Add source"})]})]})]})})}var n=O($(),1),Me={http_basic:["username","password"],bearer:["token"],header:["name","value"],query:["param","value"],github_app:["appId","privateKeyPem","webhookSecret"],npm_token:["token"],ssh_key:["privateKeyPem","knownHosts"]},yt=Object.keys(Me);function qe(t,{scope:e,github:l,vcsProviders:i}){switch(t){case"packagist_proxy":return["bearer"];case"npmjs_proxy":case"hosted":return[];case"composer_repository":return["http_basic","bearer","header","query","npm_token"];case"npm_registry":return["npm_token","http_basic","bearer","header"];case"vcs":return l?e==="organization"?["bearer","github_app"]:["bearer"]:["bearer","http_basic","header","npm_token",...i?.includes("ssh")?["ssh_key"]:[]]}}function Fe(t,e){return{scope:t.projectId===null?"organization":"project",github:t.githubAuthentication!==void 0,vcsProviders:e}}function he(t){return["packagist_proxy","npmjs_proxy","npm_registry"].includes(t.type)&&"attached"in t&&t.attached===!0}function Nt(t){if(t.type==="composer_repository")return"http_basic";if(t.type==="npm_registry")return"npm_token";if(t.type==="vcs"){let e=t.config;if(e?.provider==="ssh")return"ssh_key";if(e?.provider==="github"&&e.installationId!==void 0)return"github_app"}return"bearer"}function se(t){return["packagist_proxy","npmjs_proxy"].includes(t.type)}var ve="An organization admin must enable this source.",He="Register package names, then enable the source.";function At(t,e){let l=t?.config;return t?.type!=="npm_registry"||!Array.isArray(l?.scopes)?[]:Ie(l.scopes.join(`
|
|
4
|
-
`)).filter(i=>!e.includes(i))}function pe(t){if(t===null)return null;try{let e=new URL(t);return["https:","http:","ssh:","git:"].includes(e.protocol)?(e.username="",e.password="",e.search="",e.hash="",e.toString()):null}catch{return null}}function Dt(t,e,l=()=>new Date().toISOString()){let{client:i}=t,o={ownership:"organization",editor:null,fieldErrors:{},formError:null,available:[],availableNext:null,availableLoading:!1,availableError:!1,items:[],next:null,loading:!0,listError:!1,settingsVersion:0,vcsProviders:void 0,busy:!1,error:null,notice:null,createdSource:null,credentialSource:null,credentialVersion:0,credentialKind:"bearer",credentialKinds:yt,packageSource:null,packageFieldError:null,packageAlert:null,savedCredential:null,names:null,preview:null,order:[],etag:null,canEnableProjectSource:!1,canWriteSources:!1,enableDenied:[],enableConflicts:[]},g=new Set,s=a=>{o={...o,...a};for(let d of g)d()},m,w=()=>{},f=0,E=0,r=0,y=0,_=0;function A(a,d=!1){return a.ok?!1:(a.code==="reauth_required"?(t.requireReauth(d?{method:a.request.method,path:a.request.path}:a.request,{credential:d,secretFields:[]}),s({enableDenied:[],error:d?"Reauthenticate, then enter the credential again.":"Reauthentication is required."})):s({error:"The request could not be saved or loaded. Refresh and try again."}),!0)}async function v(a=!1){if(a&&(o.loading||o.next===null))return;let d=++E,c=a?o.next:null,b=o.etag;++_,s({loading:!0,listError:!1,error:null,etag:null,preview:null,order:[],enableDenied:[],enableConflicts:[],notice:null});let h={limit:"100",...c===null?{}:{after:c}},[k,R]=await Promise.all([e!==null||o.ownership!=="organization"?m??=i.request("get","/_pb/me/permissions").then(N=>(N.ok||(m=void 0),N)):null,e===null?i.request("get","/_pb/sources",{query:{...h,...o.ownership==="organization"?{}:{ownership:o.ownership}}}):i.request("get","/_pb/projects/{project}/sources",{params:{project:e},query:h})]);if(d!==E)return;let U=!R.ok&&R.code==="reauth_required";if(k&&!k.ok&&!U&&(k.status!==403||k.code==="reauth_required")&&A(k),A(R)||!R.ok){s({loading:!1,listError:!0});return}s({canEnableProjectSource:k?.ok===!0&&k.data.organization.includes("org:sources:write")});let M=ze(R,"etag")??null;if(e!==null&&a&&M!==b){await v();return}let P=R.data.items.map(N=>({...N,url:pe(N.url)})),x=a?[...o.items,...P]:P,ne=x.flatMap(N=>"attached"in N&&N.attached===!0&&"precedence"in N&&typeof N.precedence=="number"?[{id:N.id,precedence:N.precedence}]:[]);s({items:x,settingsVersion:o.settingsVersion+1,next:R.data.next,vcsProviders:R.data.vcsProviders,loading:!1,etag:M,order:ne.sort((N,G)=>N.precedence-G.precedence).map(({id:N})=>N)})}async function le(a=!1){if(e===null||a&&(o.availableLoading||o.availableNext===null))return;let d=++r,c=a?o.availableNext:null;s({availableLoading:!0,availableError:!1});let b=await i.request("get","/_pb/sources",{query:{limit:"100",...c===null?{}:{after:c}}});if(d!==r)return;if(!b.ok){s({available:[],availableNext:null,availableLoading:!1,availableError:!0});return}let h=b.data.items.map(k=>({...k,attached:!1,url:pe(k.url)}));s({available:a?[...o.available,...h]:h,availableNext:b.data.next,availableLoading:!1})}async function te(a){for(;!o.items.some(d=>d.id===a)&&o.next!==null&&!o.listError;)await v(!0);return o.items.find(d=>d.id===a)}async function re(a,d){let c=await te(a);if(c&&s({createdSource:a,notice:`Next steps for ${c.name}`}),c&&!se(c)&&c.type!=="hosted"){let b=qe(c.type,Fe(c,o.vcsProviders)),h=d?Nt(d):c.githubAuthentication==="app"?"github_app":b[0];s({credentialSource:a,credentialVersion:o.credentialVersion+1,credentialKinds:b,credentialKind:h!==void 0&&b.includes(h)?h:b[0]})}}async function F(a,d=!1){let c=o.names;if(d||s({credentialSource:null,error:null}),d&&(c?.source!==a||c.next===null))return;let b=++y,h=d?c?.next:null,k=await i.request("get","/_pb/sources/{source}/names",{params:{source:a},query:{limit:"100",...h==null?{}:{after:h}}});b!==y||A(k)||!k.ok||s({names:{...k.data,source:a,items:d?[...c.items,...k.data.items]:k.data.items}})}async function H(a,d,c=()=>!1){if(!o.busy){s({busy:!0,error:null,notice:null});try{let b=await a();!c(b)&&!A(b)&&await d()}finally{s({busy:!1})}}}return{project:e,dispose(){++f,w()},snapshot:()=>o,enableNeedsAdmin(a){return a.projectId!==null&&(!o.canEnableProjectSource||o.enableDenied.includes(a.id))},subscribe(a){return g.add(a),()=>{g.delete(a)}},load:v,async setOwnership(a){e!==null||o.busy||(s({ownership:a,items:[],next:null}),await v())},loadAvailable:le,names:F,openEditor(a=null){o.busy||a&&e!==null&&a.projectId===null||s({editor:a??"create",fieldErrors:{},formError:null,error:null,credentialSource:null,savedCredential:null})},closeEditor(){o.busy||s({editor:null,fieldErrors:{},formError:null})},async saveSource(a){if(o.busy||o.editor===null)return;let d=o.editor;if(d!=="create"&&Object.keys(a).length===0){s({editor:null,fieldErrors:{},formError:null});return}s({busy:!0,error:null,formError:null,fieldErrors:{}});try{let c=d==="create"?e===null?await i.request("post","/_pb/sources",{body:a}):await i.request("post","/_pb/projects/{project}/sources",{params:{project:e},body:a}):e===null?await i.request("patch","/_pb/sources/{source}",{params:{source:d.id},body:a}):await i.request("patch","/_pb/projects/{project}/sources/{source}",{params:{project:e,source:d.id},body:a});if(!c.ok){A(c),s({fieldErrors:pt(c.details),formError:o.error});return}s({editor:null,fieldErrors:{},formError:null,...d==="create"&&e===null&&o.ownership==="project"?{ownership:"organization"}:{}}),await v(),d==="create"&&c.data&&"id"in c.data&&await re(c.data.id,a)}finally{s({busy:!1})}},attachment(a,d){return e===null?Promise.resolve():H(()=>d?i.request("put","/_pb/projects/{project}/sources/{source}/attachment",{params:{project:e,source:a},body:{}}):i.request("delete","/_pb/projects/{project}/sources/{source}/attachment",{params:{project:e,source:a}}),()=>v())},async replayed(a){let d=e===null?"/_pb/sources":`/_pb/projects/${encodeURIComponent(e)}/sources`,c=/^\/_pb\/sources\/[^/]+\/names(?:\/[^/]+)?$/.test(a.path),b=/^\/_pb\/sources\/([^/]+)\/enable$/.exec(a.path);if(a.path!==d&&!a.path.startsWith(`${d}/`)&&!c&&!b)return;let h=o.names?.source;s({enableDenied:[],enableConflicts:[]}),a.ok&&s({editor:null,fieldErrors:{},formError:null,...a.createdSourceId&&e===null&&o.ownership==="project"?{ownership:"organization"}:{}}),await v(),b&&!a.ok&&(a.status===403&&a.code==="forbidden"&&o.items.some(k=>k.id===b[1]&&k.projectId!==null)?s({enableDenied:[b[1]],notice:ve}):a.status===409&&a.code==="conflict"?s({enableConflicts:[b[1]],notice:He}):s({error:"The request could not be saved or loaded. Refresh and try again."})),a.ok&&a.createdSourceId&&await re(a.createdSourceId),h!==void 0&&await F(h)},moveSource(a,d){if(o.loading||o.busy||o.next!==null)return;let c=[...o.order],b=c.indexOf(a),h=b+d;b<0||h<0||h>=c.length||([c[b],c[h]]=[c[h],c[b]],s({order:c}))},async saveOrder(){if(e===null||o.loading||o.busy||o.next!==null||o.etag===null)return;let a=o.etag,d=[...o.order];s({busy:!0,error:null,preview:null}),++_;try{let c=await i.request("put","/_pb/projects/{project}/sources/order",{params:{project:e},headers:{"If-Match":a},body:{sourceIds:d}});!c.ok&&c.status===412?(await v(),s({error:"Source ordering changed. Review the reloaded list before saving again."})):A(c)||await v()}finally{s({busy:!1})}},closeCredential(){o.busy||s({credentialSource:null})},closeNames(){o.busy||(++y,s({names:null}))},chooseCredential(a){if(o.busy)return;let d=o.items.find(b=>b.id===a),c=d?qe(d.type,Fe(d,o.vcsProviders)):["bearer"];c.length!==0&&(++y,s({credentialSource:a,names:null,savedCredential:null,credentialVersion:o.credentialVersion+1,credentialKind:d?.githubAuthentication==="app"&&c.includes("github_app")?"github_app":c[0],credentialKinds:c,error:null}))},openPackage(a){o.busy||e===null||!he(a)||a.status==="paused"||s({packageSource:a,packageFieldError:null,packageAlert:null,notice:null})},closePackage(){o.busy||s({packageSource:null,packageFieldError:null,packageAlert:null})},async addPackage(a){let d=o.packageSource;if(!(o.busy||e===null||!d||!he(d))){if(a=a.trim(),!a||a.length>428){s({packageFieldError:"Enter a package name of 1 to 428 characters."});return}s({busy:!0,packageFieldError:null,packageAlert:null,notice:null});try{let c=await i.request("post","/_pb/projects/{project}/sources/{source}/packages",{params:{project:e,source:d.id},body:{name:a}});c.ok?s({packageSource:null,notice:c.status===202?Ae(202,c.data.name,d.name):Ae(200,c.data.name,d.name)}):c.status===400&&c.code==="invalid_request"?s({packageFieldError:"Enter a valid package name for this source."}):c.code==="package_not_found"?s({packageAlert:"Not found upstream. Check the package name or use another source."}):c.status===400?s({packageFieldError:"This source does not support that package. Check the name or use another source."}):c.code==="forbidden"?s({packageAlert:"You do not have permission to add packages to this project."}):c.status===502?s({packageAlert:"The upstream registry refused or failed the request. Check the source credential or try again later."}):c.status===404?s({packageAlert:"The package or attached source could not be found. Check the name and refresh sources."}):c.status===503?s({packageAlert:"Package requests are temporarily unavailable. Try again shortly."}):c.status===409?s({packageAlert:"This source is paused. Enable it before adding a package."}):(A(c),s({packageAlert:o.error,error:null}))}finally{s({busy:!1})}}},async credential(a,d,c){if(!o.busy){s({busy:!0,error:null,credentialSource:a,credentialVersion:o.credentialVersion+1,savedCredential:null});try{let b=e===null?await i.request("put","/_pb/sources/{source}/credential",{params:{source:a},body:{kind:d,material:c}}):await i.request("put","/_pb/projects/{project}/sources/{source}/credential",{params:{project:e,source:a},body:{kind:d,material:c}});A(b,!0)||s({savedCredential:{source:a,at:l()},notice:"Credential set.",items:o.items.map(h=>h.id===a?{...h,hasCredential:!0}:h)})}finally{s({busy:!1})}}},edit(a,d,c){if(!Number.isSafeInteger(d)||d<=0)return s({error:"Polling interval must be a positive whole number."}),Promise.resolve();let b={pollIntervalSeconds:d,removalPolicy:c};return H(()=>e===null?i.request("patch","/_pb/sources/{source}",{params:{source:a},body:b}):i.request("patch","/_pb/projects/{project}/sources/{source}",{params:{project:e,source:a},body:b}),()=>v())},async loadMutationPermissions(){let a=e===null?await i.request("get","/_pb/me/permissions"):await i.request("get","/_pb/projects/{project}/permissions",{params:{project:e}});s({canWriteSources:a.ok&&("organization"in a.data?a.data.organization.includes("org:sources:write"):a.data.project.includes("project:sources:write"))})},syncNow(a){if(o.busy||a.status==="paused"||e!==null&&a.projectId===null)return Promise.resolve();w();let d=++f;return H(()=>e===null?i.request("post","/_pb/sources/{source}/sync",{params:{source:a.id}}).then(De):i.request("post","/_pb/projects/{project}/sources/{source}/sync",{params:{project:e,source:a.id}}).then(De),async()=>{if(d!==f)return;let c=async()=>{let h=E,k=o.ownership,R=null;do{let U={limit:"100",...R===null?{}:{after:R}},M=e===null?await i.request("get","/_pb/sources",{query:{...U,...k==="organization"?{}:{ownership:k}}}):await i.request("get","/_pb/projects/{project}/sources",{params:{project:e},query:U});if(d!==f||h!==E||!M.ok)return!0;let P=M.data.items.find(x=>x.id===a.id);if(P)return s({items:o.items.map(x=>x.id===a.id?{...P,url:pe(P.url)}:x)}),Re(a,P);R=M.data.next}while(R!==null);return!0},b;if(o.loading&&o.items.length===0){await v();let h=await te(a.id);b=o.listError||!h||Re(a,h)}else b=await c();d===f&&(s({notice:Ne}),b!==!0&&d===f&&(w=rt(c)))})},async togglePause(a){if(e!==null&&a.projectId===null)return;if(a.status==="paused"&&!se(a)){if(o.busy||a.projectId!==null&&(!o.canEnableProjectSource||o.enableDenied.includes(a.id)))return;s({enableConflicts:o.enableConflicts.filter(c=>c!==a.id)}),await H(()=>i.request("post","/_pb/sources/{source}/enable",{params:{source:a.id}}),()=>v(),c=>a.projectId!==null&&!c.ok&&c.status===403&&c.code==="forbidden"?(s({enableDenied:[...new Set([...o.enableDenied,a.id])],notice:ve}),!0):!c.ok&&c.status===409&&c.code==="conflict"?(s({enableConflicts:[...new Set([...o.enableConflicts,a.id])],notice:He}),!0):!1);return}let d=a.status==="paused"?"resume":"pause";return H(()=>e===null?i.request("post",`/_pb/sources/{source}/${d}`,{params:{source:a.id}}):i.request("post",`/_pb/projects/{project}/sources/{source}/${d}`,{params:{project:e,source:a.id}}),()=>v())},addName(a,d){return d.length===0||d.length>50||!/^[a-z0-9._~@!/*-]+$/.test(d)?(s({error:"Enter a registered pattern of 1 to 50 supported characters."}),Promise.resolve()):H(()=>i.request("post","/_pb/sources/{source}/names",{params:{source:a},body:{pattern:d}}),()=>F(a))},removeName(a,d){return H(()=>i.request("delete","/_pb/sources/{source}/names/{name}",{params:{source:a,name:d}}),async()=>{await F(a),await v()})},async resolve(a){let d=++_;if(s({preview:null,error:null}),e===null||a.length===0||a.length>214){s({error:"Choose a project and enter a package name of 1 to 214 characters."});return}let c=await i.request("get","/_pb/projects/{project}/resolve",{params:{project:e},query:{name:a}});d===_&&!A(c)&&c.ok&&s({preview:c.data})}}}function Rt(t,e,l){let i=l.elements.namedItem("kind")?.value,o=yt.includes(i)?Me[i]:null,g=o===null?null:JSON.stringify(Object.fromEntries(o.map(s=>[s,l.elements.namedItem(s)?.value??""])));return l.reset(),g===null?Promise.resolve():t.credential(e,i,g)}function Lt({kind:t,busy:e}){return(0,n.jsx)(n.Fragment,{children:Me[t].map(l=>(0,n.jsxs)("div",{children:[(0,n.jsx)(q,{htmlFor:`credential-${l}`,children:l}),(0,n.jsx)(B,{id:`credential-${l}`,name:l,type:"password",autoComplete:"off",defaultValue:"",maxLength:16384,required:!0,disabled:e})]},l))})}function jt({model:t,source:e,busy:l,initialKind:i,kinds:o}){let[g,s]=(0,j.useState)(i);return(0,n.jsxs)("form",{className:"grid gap-3",autoComplete:"off",onSubmit:m=>{m.preventDefault(),!l&&Rt(t,e,m.currentTarget)},children:[(0,n.jsx)(q,{htmlFor:"credential-kind",children:"Credential kind"}),(0,n.jsx)(oe,{id:"credential-kind",name:"kind",value:g,disabled:l,onChange:m=>s(m.currentTarget.value),children:o.map(m=>(0,n.jsx)("option",{value:m,children:m},m))}),(0,n.jsx)(Lt,{kind:g,busy:l},g),(0,n.jsx)(C,{type:"submit",className:"w-fit",disabled:l,children:"Save credential"})]})}function ft(t,e){return new FormData(t).get(e)?.toString()??""}var Oe={network:"Network failure",timeout:"Sync timed out",http_error:"HTTP error",unauthorized:"Authorization failed",rate_limited:"Rate limited",not_found:"Not found",invalid_response:"Invalid response",tag_limit_exceeded:"Tag limit exceeded",mass_absence:"Mass package absence",too_large:"Response too large",policy_denied:"Policy denied",credential_unavailable:"Credential unavailable",internal:"Internal error"};function Tt({source:t}){let e=t.lastError!==null&&Object.hasOwn(Oe,t.lastError)?Oe[t.lastError]:null;return(0,n.jsxs)("div",{className:"grid gap-1 text-sm",children:[(0,n.jsxs)("p",{children:["Last listing: ",(0,n.jsx)(de,{value:t.lastSuccessAt,fallback:"Never"})]}),(0,n.jsxs)("p",{children:["Last listing error:"," ",t.lastError===null?"None":(0,n.jsxs)(n.Fragment,{children:[e&&`${e} \xB7 `,(0,n.jsx)("code",{children:t.lastError})]})]}),t.sync&&(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)("p",{children:["Latest sync: ",t.sync.queued," queued \xB7 ",t.sync.running," running \xB7"," ",t.sync.retrying," retrying \xB7 ",t.sync.failed," failed \xB7 ",t.sync.completed," ","completed"]}),t.sync.errors.slice(0,3).map(({code:l,count:i})=>(0,n.jsxs)("p",{children:[Oe[l]," \xB7 ",(0,n.jsx)("code",{children:l}),": ",i]},l))]}),se(t)?(0,n.jsx)("p",{children:tt}):null,(0,n.jsxs)("p",{children:["Next poll: ",(0,n.jsx)(de,{value:t.nextPollAt,fallback:"None"})]})]})}function It({source:t,model:e,busy:l}){let[i,o]=(0,j.useState)(null);(0,j.useEffect)(()=>{i&&(i.id!==t.id||i.status!==t.status)&&o(null)},[i,t.id,t.status]);let g=e.project===null?t.projectId===null:t.projectId!==null,s=e.project===null&&t.projectId!==null,m=(g||s)&&t.status==="paused"&&!se(t)&&e.enableNeedsAdmin(t),w=e.snapshot().enableConflicts.includes(t.id),f=`source-actions-note-${t.id}`,E=!g&&!s?"Manage this organization source in organization scope.":[m&&ve,w&&He].filter(Boolean).join(" "),r=g?[{id:"edit",label:"Edit",disabled:l,onSelect:()=>e.openEditor(t)},...e.snapshot().canWriteSources?[{id:"sync",label:"Sync now",disabled:l||t.status==="paused",...t.status==="paused"?{describedBy:`sync-paused-${t.id}`}:{},onSelect:()=>{e.syncNow(t)}}]:[]]:[],y=[];return g||s?(s&&(t.status!=="paused"||se(t))||y.push(t.status==="paused"?{id:"enable",label:"Enable",disabled:l||m,...m||w?{describedBy:f}:{},onSelect:()=>{e.togglePause(t)}}:{id:"pause",label:"Pause source\u2026",disabled:l,onSelect:()=>o(t)}),g&&qe(t.type,Fe(t,e.snapshot().vcsProviders)).length>0&&y.push({id:"credential",label:t.type==="packagist_proxy"?"Add GitHub token (optional)":"Set credential",disabled:l,onSelect:()=>e.chooseCredential(t.id)})):y.push({id:"manage",label:"Manage source",disabled:!0,describedBy:f,onSelect:()=>{}}),e.project!==null&&e.snapshot().canWriteSources&&he(t)&&y.push({id:"add-package",label:"Add package",disabled:l||t.status==="paused",...t.status==="paused"?{describedBy:`add-package-paused-${t.id}`}:{},onSelect:()=>e.openPackage(t)}),y.push({id:"names",label:"Registered names",disabled:l,onSelect:()=>{e.names(t.id)}}),(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(ot,{entityLabel:t.name,actions:r,overflow:y}),g&&t.status==="paused"?(0,n.jsx)("p",{id:`sync-paused-${t.id}`,children:"Enable before syncing."}):null,e.project!==null&&he(t)&&t.status==="paused"?(0,n.jsx)("p",{id:`add-package-paused-${t.id}`,children:"Enable before adding a package."}):null,E?(0,n.jsx)("p",{id:f,children:E}):null,(0,n.jsx)(fe,{action:"Pause",target:`${t.name} (${t.id})`,scope:e.project===null?"Organization":`Project: ${e.project}`,description:"Pausing this source stops it from resolving packages in this scope. You can enable it again later.",disabled:l,open:i?.id===t.id&&i.status===t.status&&t.status!=="paused",onOpenChange:_=>{_||o(null)},hideTrigger:!0,onConfirm:()=>{e.togglePause(t)}})]})}function Ot(t,e){return t.filter(l=>l.name.toLowerCase().includes(e.q.toLowerCase())&&(!e.type||l.type===e.type)&&(!e.scope||(e.scope==="organization"?l.projectId===null:l.projectId!==null)))}function qt({model:t}){let e=(0,j.useSyncExternalStore)(t.subscribe,t.snapshot,t.snapshot),[l,i]=(0,j.useState)({q:"",type:"",scope:""}),o=!!(l.q||l.type||l.scope),g=e.items.find(r=>r.id===e.createdSource),s=(0,j.useMemo)(()=>{let r=e.names;return r===null?[]:At(e.items.find(y=>y.id===r.source),r.items.map(y=>y.pattern))},[e.items,e.names]),m=!e.loading&&!e.listError&&e.next===null,w=e.items.find(r=>r.id===e.credentialSource)?.type==="packagist_proxy",f=[...e.items,...m?e.available.filter(r=>!e.items.some(y=>y.id===r.id)):[]],E=Ot(f,l).sort((r,y)=>{let _=A=>{let v=e.order.indexOf(A);return v<0?1/0:v};return _(r.id)-_(y.id)});return(0,n.jsxs)("section",{"aria-labelledby":"page-heading",className:"grid gap-6",children:[(0,n.jsxs)("div",{className:"flex flex-wrap items-center justify-between gap-3",children:[(0,n.jsx)("h1",{tabIndex:-1,id:"page-heading",className:"text-xl font-semibold",children:"Sources"}),(0,n.jsx)(C,{type:"button",disabled:e.busy,onClick:()=>t.openEditor(),children:"Add source"})]}),e.editor!==null?(0,n.jsx)(mt,{source:e.editor==="create"?null:e.editor,busy:e.busy,errors:e.fieldErrors,alert:e.formError,onSubmit:r=>{e.editor==="create"&&i({q:"",type:"",scope:""}),t.saveSource(r)},onClose:()=>t.closeEditor(),vcsProviders:e.vcsProviders,initialType:typeof window<"u"&&new URLSearchParams(window.location.hash.split("?")[1]).get("create")==="vcs"?"vcs":void 0,initialProvider:typeof window<"u"&&new URLSearchParams(window.location.hash.split("?")[1]).get("provider")==="github"?"github":void 0}):null,(0,n.jsx)("p",{className:"text-neutral-600",children:"Upstream registries and private repositories. Attached sources are tried in precedence order."}),t.project===null?(0,n.jsxs)(q,{children:["Ownership",(0,n.jsxs)(oe,{value:e.ownership,disabled:e.busy,onChange:r=>{t.setOwnership(r.target.value)},children:[(0,n.jsx)("option",{value:"organization",children:"Organization"}),(0,n.jsx)("option",{value:"project",children:"Project-owned"}),(0,n.jsx)("option",{value:"all",children:"All"})]})]}):null,(0,n.jsx)(et,{values:{...l,scope:l.scope==="organization"?"Organization":l.scope==="project"?"Project":"",type:V[l.type]??""},fields:[{key:"q",label:"Name (loaded sources)"},{key:"type",label:"Type",options:[...new Set(f.map(r=>V[r.type]))].sort()},...t.project===null?[]:[{key:"scope",label:"Source scope",options:["Organization","Project"]}]],onChange:r=>i({q:r.q??"",scope:t.project===null?"":r.scope==="Organization"?"organization":r.scope==="Project"?"project":"",type:Object.keys(V).find(y=>V[y]===r.type)??""})}),(0,n.jsx)("p",{role:"status","aria-live":"polite",children:e.notice}),g?.status==="paused"&&!se(g)?(0,n.jsxs)("p",{children:["Next steps for ",g.name,":"," ",t.enableNeedsAdmin(g)?ve:e.names?.source===g.id&&e.names.items.length>0?"Enable the source.":"Register names, then Enable the source."]}):null,e.error&&!e.listError?(0,n.jsx)(Z,{kind:"error",title:e.error}):null,e.listError?(0,n.jsxs)(Z,{kind:"error",title:"Sources could not be loaded.",children:[e.error?(0,n.jsx)("p",{children:e.error}):null,(0,n.jsx)(C,{type:"button",className:"w-fit",disabled:e.loading||e.busy,onClick:()=>{t.load()},children:"Retry sources"})]}):null,!e.listError&&!e.availableError?(0,n.jsx)(C,{type:"button",className:"w-fit",variant:"outline",disabled:e.loading||e.busy,onClick:()=>{t.load(),t.loadAvailable()},children:"Refresh sources"}):null,t.project!==null&&!m&&e.available.length>0?(0,n.jsx)("p",{className:"text-sm text-neutral-600",children:"Load all project sources before attaching organization sources."}):null,e.availableLoading?(0,n.jsx)(Z,{kind:"loading",title:"Loading organization sources\u2026"}):null,e.availableError?(0,n.jsx)(Z,{kind:"error",title:"Organization sources could not be loaded.",children:(0,n.jsx)(C,{type:"button",className:"w-fit",disabled:e.availableLoading||e.busy,onClick:()=>{t.loadAvailable()},children:"Retry organization sources"})}):null,e.loading?(0,n.jsx)(Z,{kind:"loading",title:"Loading sources\u2026"}):!e.listError&&E.length===0?(0,n.jsx)(Z,{kind:o?"filtered-empty":"empty",title:o?"No sources match these filters.":"No sources."}):null,!e.loading&&!e.listError&&E.length?(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)("p",{className:"text-sm text-neutral-600",children:[E.length," sources loaded",o?" matching filters":""]}),(0,n.jsx)(Qe,{label:"Sources in precedence order",items:E,columns:[{key:"name",label:"Source",value:r=>r.name,render:r=>(0,n.jsxs)("div",{className:"grid gap-1",children:[(0,n.jsx)("strong",{children:r.name}),"projectName"in r&&r.projectName!==null?(0,n.jsx)("span",{children:`Project: ${r.projectName}`}):null,(0,n.jsxs)("span",{className:"text-xs text-neutral-600",children:[r.ecosystem==="composer"?"Composer":"npm"," \xB7"," ",V[r.type]]}),(0,n.jsx)(Ze,{status:r.status})]})},{key:"precedence",label:"Precedence",value:r=>e.order.indexOf(r.id)<0?"\u2014":e.order.indexOf(r.id)+1,render:r=>{let y=e.order.indexOf(r.id);return y<0?"\u2014":(0,n.jsxs)("div",{className:"flex flex-wrap items-center gap-1",children:[(0,n.jsx)("strong",{children:y+1}),(0,n.jsx)(C,{type:"button",size:"sm",variant:"ghost","aria-label":`Move up ${r.name}`,disabled:e.busy||e.next!==null||y===0,onClick:()=>t.moveSource(r.id,-1),children:"Move up"}),(0,n.jsx)(C,{type:"button",size:"sm",variant:"ghost","aria-label":`Move down ${r.name}`,disabled:e.busy||e.next!==null||y===e.order.length-1,onClick:()=>t.moveSource(r.id,1),children:"Move down"})]})}},{key:"scope",label:"Attached to",value:r=>r.projectId===null?"Organization source":"Project source",render:r=>(0,n.jsxs)("div",{className:"grid gap-1",children:[(0,n.jsx)("span",{children:r.projectId===null?"Organization source":"Project source"}),t.project===null&&"attachedProjectCount"in r?(0,n.jsx)(Pe,{variant:"secondary",children:`Attached to ${r.attachedProjectCount} projects`}):null,"attached"in r?(0,n.jsx)("span",{className:"text-xs text-neutral-600",children:r.attached?"Attached to this project":"Not attached to this project"}):null]})},{key:"credential",label:"Credentials",value:r=>r.hasCredential?"Set \xB7 write-only":"None",render:r=>r.hasCredential?(0,n.jsx)(Pe,{variant:"outline",children:"Set \xB7 write-only"}):"None"},{key:"sync",label:"Sync status",value:r=>r.lastSuccessAt??"",render:r=>(0,n.jsx)(Tt,{source:r})},{key:"id",label:"Source ID",value:r=>r.id,priority:3,render:r=>(0,n.jsx)(K,{value:r.id,label:"source ID"})},{key:"actions",label:"Actions",value:()=>"",sortable:!1,render:r=>(0,n.jsxs)("div",{className:"flex flex-wrap items-start gap-2",children:[t.project!==null&&"attached"in r?r.attached?(0,n.jsx)(fe,{action:"Detach",target:`${r.name} (${r.id})`,scope:`Project: ${t.project}`,description:"Detaching this source stops this project from resolving packages through it. You can attach it again later.",disabled:e.busy,onConfirm:()=>{t.attachment(r.id,!1)}}):(0,n.jsx)(C,{type:"button",size:"sm",variant:"outline",disabled:e.busy,onClick:()=>{t.attachment(r.id,!0)},children:"Attach"}):null,(0,n.jsx)(It,{source:r,model:t,busy:e.busy})]})}]})]}):null,e.next!==null?(0,n.jsx)(C,{type:"button",className:"w-fit",disabled:e.loading||e.busy,onClick:()=>{t.load(!0)},children:"Load more sources"}):null,e.availableNext!==null?(0,n.jsx)(C,{type:"button",className:"w-fit",disabled:e.availableLoading||e.busy,onClick:()=>{t.loadAvailable(!0)},children:"Load more organization sources"}):null,e.packageSource!==null?(0,n.jsx)(nt,{source:e.packageSource,busy:e.busy,fieldError:e.packageFieldError,alert:e.packageAlert,onSubmit:r=>{t.addPackage(r)},onClose:()=>t.closePackage()},e.packageSource.id):null,e.credentialSource!==null?(0,n.jsx)(Y,{open:!0,onOpenChange:r=>{r||t.closeCredential()},children:(0,n.jsxs)(W,{variant:"source",onCancel:r=>{e.busy&&r.preventDefault()},children:[(0,n.jsxs)(X,{className:"shrink-0 p-6 pr-16",children:[(0,n.jsx)(J,{children:w?"Add GitHub token (optional)":"Set credential"}),(0,n.jsxs)(Q,{children:["Credentials are write-only. Save a new credential to rotate a secret.",w?" This optional bearer token is used only for GitHub archive downloads and their rate limits. Enable Use GitHub token in Edit after saving it.":""]})]}),(0,n.jsxs)("div",{className:"grid min-h-0 gap-3 overflow-y-auto px-6 pb-6",children:[(0,n.jsx)(K,{value:e.credentialSource,label:"source ID"}),(0,n.jsx)(jt,{model:t,source:e.credentialSource,initialKind:e.credentialKind,kinds:e.credentialKinds,busy:e.busy},e.credentialVersion),e.error?(0,n.jsx)("p",{role:"alert",children:e.error}):null,e.savedCredential?.source===e.credentialSource?(0,n.jsxs)("p",{children:["credential set \xB7 ",(0,n.jsx)(de,{value:e.savedCredential.at})]}):null]})]})}):null,e.savedCredential&&e.credentialSource===null?(0,n.jsxs)("p",{children:["credential set \xB7 ",e.savedCredential.source," \xB7"," ",(0,n.jsx)(de,{value:e.savedCredential.at})]}):null,e.names?(0,n.jsx)(Y,{open:!0,onOpenChange:r=>{r||t.closeNames()},children:(0,n.jsxs)(W,{variant:"source",onCancel:r=>{e.busy&&r.preventDefault()},children:[(0,n.jsxs)(X,{className:"shrink-0 p-6 pr-16",children:[(0,n.jsx)(J,{children:"Registered names"}),(0,n.jsx)(Q,{children:"Manage the package patterns registered for this source."})]}),(0,n.jsxs)("div",{className:"grid min-h-0 gap-3 overflow-y-auto px-6 pb-6",children:[e.error?(0,n.jsx)("p",{role:"alert",children:e.error}):null,(0,n.jsx)(K,{value:e.names.source,label:"source ID"}),(0,n.jsx)("ul",{children:e.names.items.map(r=>(0,n.jsxs)("li",{className:"flex items-center gap-3",children:[(0,n.jsx)("span",{children:r.pattern}),(0,n.jsx)(fe,{action:`Remove ${r.pattern}`,target:r.pattern,scope:t.project===null?"Organization":`Project: ${t.project}`,description:"Removing this registered pattern can stop the source from resolving matching packages. Add the pattern again to restore it.",disabled:e.busy,onConfirm:()=>{t.removeName(r.sourceId,r.id)}})]},r.id))}),e.names.next!==null?(0,n.jsx)(C,{type:"button",disabled:e.busy,onClick:()=>{t.names(e.names.source,!0)},children:"Load more names"}):null,(0,n.jsxs)("form",{className:"grid gap-3",onSubmit:r=>{if(r.preventDefault(),e.busy)return;let y=r.currentTarget,_=ft(y,"pattern");y.reset(),t.addName(e.names.source,_)},children:[(0,n.jsx)(q,{htmlFor:"registered-pattern",children:"Registered pattern"}),(0,n.jsx)(B,{id:"registered-pattern",name:"pattern",maxLength:50,required:!0,defaultValue:s[0]??""},`${e.names.source}:${e.names.items.map(r=>r.pattern).join(",")}`),s.map(r=>(0,n.jsxs)("p",{className:"text-sm",children:["Register ",r," before enabling this source."]},r)),(0,n.jsx)(C,{type:"submit",className:"w-fit",disabled:e.busy,children:"Add name"})]})]})]})}):null,t.project!==null&&!e.listError&&e.items.some(r=>"attached"in r&&r.attached)?(0,n.jsxs)(Ce,{children:[(0,n.jsx)(xe,{children:(0,n.jsx)(Ee,{children:"Source order"})}),(0,n.jsxs)(_e,{className:"grid gap-3",children:[(0,n.jsx)("p",{children:"Earlier sources take precedence. Only attached sources are ordered."}),e.next!==null?(0,n.jsx)("p",{children:"Load all sources before changing their order."}):null,(0,n.jsx)(C,{type:"button",className:"w-fit",disabled:e.loading||e.busy||e.next!==null||e.etag===null,onClick:()=>{t.saveOrder()},children:"Save source order"})]})]}):null,t.project!==null?(0,n.jsxs)(Ce,{children:[(0,n.jsx)(xe,{children:(0,n.jsx)(Ee,{children:"Who wins"})}),(0,n.jsxs)(_e,{className:"grid gap-3",children:[(0,n.jsxs)("form",{className:"grid gap-3",onSubmit:r=>{r.preventDefault(),!e.busy&&t.resolve(ft(r.currentTarget,"name"))},children:[(0,n.jsx)(q,{htmlFor:"resolve-name",children:"Package name"}),(0,n.jsx)(B,{id:"resolve-name",name:"name",maxLength:214,required:!0}),(0,n.jsx)(C,{type:"submit",className:"w-fit",disabled:e.busy,children:"Preview"})]}),e.preview?(0,n.jsxs)("div",{"aria-live":"polite",children:[(0,n.jsx)("p",{children:e.preview.name}),(0,n.jsxs)("p",{children:["Winning source: ",(0,n.jsx)(K,{value:e.preview.winner,label:"winning source ID"})]}),(0,n.jsx)("ol",{children:e.preview.candidates.map(r=>(0,n.jsxs)("li",{children:[r.sourceName," \xB7"," ",(0,n.jsx)(K,{value:r.sourceId,label:"candidate source ID"})," \xB7"," ",r.eligible?"Eligible":"Ineligible"]},r.sourceId))})]}):null]})]}):null]})}function bt(){if(typeof window>"u")return null;let t=new URLSearchParams(window.location.hash.split("?")[1]??"").get("project");return new URLSearchParams(Ve("sources",{project:t}).split("?")[1]??"").get("project")}function Ar(){let t=Ke(),[e,l]=(0,j.useState)(bt);(0,j.useEffect)(()=>{let o=()=>l(bt());return window.addEventListener("hashchange",o),()=>window.removeEventListener("hashchange",o)},[]);let i=(0,j.useMemo)(()=>Dt(t,e),[t,e]);return(0,j.useEffect)(()=>(i.load(),i.loadAvailable(),i.loadMutationPermissions().then(()=>{i.snapshot().canWriteSources&&new URLSearchParams(window.location.hash.split("?")[1]).get("create")==="vcs"&&i.openEditor()}),()=>i.dispose()),[i]),(0,j.useEffect)(()=>t.subscribeReplay?.(o=>{i.replayed(o)}),[t,i]),(0,n.jsx)(qt,{model:i},e??"organization")}export{Ne as a,Ae as b,De as c,tt as d,V as e,qe as f,Nt as g,At as h,pe as i,Dt as j,Rt as k,Lt as l,Oe as m,It as n,Ot as o,qt as p,Ar as q};
|