@goodfellow-cms/broker 0.9.0 → 0.10.1
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/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@goodfellow-cms/broker",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.10.1",
|
|
4
4
|
"description": "Goodfellow CMS's token broker: a page of its own that keeps editors' sign-in and AI keys, and shows the site's admin panel in a frame.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"goodfellow",
|
|
@@ -30,11 +30,11 @@
|
|
|
30
30
|
"site"
|
|
31
31
|
],
|
|
32
32
|
"devDependencies": {
|
|
33
|
-
"@goodfellow-cms/ai": "0.
|
|
34
|
-
"@goodfellow-cms/core": "0.
|
|
35
|
-
"@goodfellow-cms/bitbucket": "0.
|
|
36
|
-
"@goodfellow-cms/github": "0.
|
|
37
|
-
"@goodfellow-cms/gitlab": "0.
|
|
33
|
+
"@goodfellow-cms/ai": "0.10.1",
|
|
34
|
+
"@goodfellow-cms/core": "0.10.1",
|
|
35
|
+
"@goodfellow-cms/bitbucket": "0.10.1",
|
|
36
|
+
"@goodfellow-cms/github": "0.10.1",
|
|
37
|
+
"@goodfellow-cms/gitlab": "0.10.1",
|
|
38
38
|
"happy-dom": "21.0.4",
|
|
39
39
|
"vite": "8.3.4"
|
|
40
40
|
},
|
|
@@ -3,4 +3,4 @@ import{n as e,r as t,t as n}from"./store-BxUMMiN8.js";import{a as r,d as i,g as
|
|
|
3
3
|
}`,variables:{project:decodeURIComponent(this.project),ref:e,paths:r}}});for(let e of a.data?.project?.repository?.blobs?.nodes??[]){let n=t.get(e.path);n&&typeof e.rawTextBlob==`string`&&this.blobs.set(n,Promise.resolve(e.rawTextBlob))}}let a=new Map;for(let e of r){let n=await this.readFrom(t,e);n!==void 0&&a.set(e,n)}return a}async readBytes(e){return this.bytesFrom(await this.currentTree(),e)}async bytesFrom(e,t){let n=e.get(t);if(!n)return;let r=await S(this.api,this.repo(`/blobs/${n}/raw`));return new Uint8Array(await r.arrayBuffer())}async list(e){return G(await this.currentTree(),e)}filesAt(e){return{read:async t=>this.readFrom(await this.tree(e),t),readFiles:async t=>this.readFilesFrom(e,await this.tree(e),t),readBytes:async t=>this.bytesFrom(await this.tree(e),t),list:async t=>G(await this.tree(e),t)}}async fileSizes(e){let t=await this.list(e),n=this.pinned??await this.revision(),r=new Map;for(let e=0;e<t.length;e+=U){let i=await C(this.api,`/../graphql`,{method:`POST`,body:{query:`query ($project: ID!, $ref: String!, $paths: [String!]!) {
|
|
4
4
|
project(fullPath: $project) { repository { blobs(ref: $ref, paths: $paths) { nodes { path size } } } }
|
|
5
5
|
}`,variables:{project:decodeURIComponent(this.project),ref:n,paths:t.slice(e,e+U)}}});for(let e of i.data?.project?.repository?.blobs?.nodes??[]){let t=Number(e.size);Number.isFinite(t)&&r.set(e.path,t)}}return r}async lastCommitFor(e,t){return(await C(this.api,this.repo(`/files/${encodeURIComponent(e)}?ref=${t}`))).last_commit_id}async existsAt(t,n,r){return e.some(e=>n.startsWith(`${e}/`))?t.has(n):this.lastCommitFor(n,r).then(()=>!0,e=>{if(e instanceof b&&e.status===404)return!1;throw e})}async write(e,{message:r,expectedRevision:i}){if(this.contentOnly&&t(e),await this.revision()!==i)throw new n;let a=await this.tree(i),o=(await Promise.all(e.map(async e=>{let t=await this.existsAt(a,e.path,i);if(`delete`in e)return t?{action:`delete`,file_path:e.path,last_commit_id:await this.lastCommitFor(e.path,i)}:void 0;let n=`bytes`in e?{content:_(e.bytes),encoding:`base64`}:{content:e.content};return t?{action:`update`,file_path:e.path,...n,last_commit_id:await this.lastCommitFor(e.path,i)}:{action:`create`,file_path:e.path,...n}}))).filter(e=>e!==void 0);if(o.length===0)return{revision:i};try{let t=await C(this.api,this.repo(`/commits`),{method:`POST`,body:{branch:this.branch,commit_message:r,actions:o,...this.options.author&&{author_name:this.options.author.name,author_email:this.options.author.email}}});return this.pinned=t.id,t.parent_ids?.length===1&&t.parent_ids[0]===i&&await this.carryTree(a,t.id,e).catch(()=>{}),{revision:t.id}}catch(e){throw e instanceof b?e.status===403?new g(`cant-publish`,`This GitLab account can't publish to the site.`):e.status===400&&/already exists|changed since/i.test(e.message)||await this.revision()!==i?new n:e:e}}async carryTree(t,n,r){if(this.trees.has(n)||!globalThis.crypto?.subtle)return;let i=new Map(t);for(let t of r){if(!e.some(e=>t.path.startsWith(`${e}/`)))continue;if(`delete`in t){i.delete(t.path);continue}let n=await he(`bytes`in t?t.bytes:new TextEncoder().encode(t.content));i.set(t.path,n),`content`in t&&!this.blobs.has(n)&&this.blobs.set(n,Promise.resolve(t.content))}this.trees.set(n,Promise.resolve(i))}async history(e,{page:t=1,perPage:n=20}={}){let r=new URLSearchParams({ref_name:this.pinned??await this.revision(),path:e,per_page:String(n),page:String(t)});return(await C(this.api,this.repo(`/commits?${r}`))).map(e=>({revision:e.id,date:e.authored_date??e.committed_date??``,author:e.author_name||void 0,message:e.title}))}async readAt(e,t){let n=await S(this.api,this.repo(`/files/${encodeURIComponent(e)}/raw?${new URLSearchParams({ref:t})}`),{allow:[404]});return n.ok?n.text():void 0}async changedPaths(e,t){let n=(await C(this.api,this.repo(`/compare?${new URLSearchParams({from:e,to:t,straight:`true`})}`))).diffs??[];if(n.length>=fe)throw new b(0,`More files changed between ${e} and ${t} than GitLab lists.`);return[...new Set(n.flatMap(e=>[e.old_path,e.new_path]))]}async deployStatus(e){try{let t=await this.statuses(e),n=t.filter(W);if(t.length>0&&n.length===0)return{state:`unknown`};if(n.length===0){if((await C(this.api,`/projects/${this.project}/pipelines?per_page=1`)).length>0)return{state:`building`};let{parent_ids:t=[]}=await C(this.api,this.repo(`/commits/${e}`));return{state:(t[0]?(await this.statuses(t[0])).filter(W):[]).length>0?`building`:`unknown`}}let r=n.find(e=>e.status===`failed`)??n.find(e=>e.status===`canceled`);if(r?.status===`canceled`){let t=await this.head();if(t!==e)return this.deployStatus(t)}if(r){let t=await this.jobProblem(e).catch(()=>void 0);return{state:`failed`,detailsUrl:r.target_url??void 0,...t&&{problem:t}}}return n.every(e=>e.status===`success`||e.status===`skipped`)?{state:`live`,detailsUrl:n[0]?.target_url??void 0}:{state:`building`,detailsUrl:n[0]?.target_url??void 0}}catch(e){if(e instanceof b)return{state:`unknown`};throw e}}statuses(e){return C(this.api,this.repo(`/commits/${e}/statuses`))}async jobProblem(e){let[t]=await C(this.api,`/projects/${this.project}/pipelines?${new URLSearchParams({sha:e,per_page:`1`})}`);if(!t)return;let n=(await C(this.api,`/projects/${this.project}/pipelines/${t.id}/jobs?per_page=100`)).find(e=>e.status===`failed`);if(!n)return;let r=n.failure_reason??``,i=`${n.name}: ${r}`;if(r===`ci_quota_exceeded`)return{step:`not-started`,detail:i};if(/runner_system|stuck_or_timeout|scheduler|api_failure|data_integrity|job_execution_timeout/.test(r))return{step:`host`,detail:i};if(n.name===`pages:deploy`)return{step:`deploy`,detail:i};let a=await S(this.api,`/projects/${this.project}/jobs/${n.id}/trace`,{allow:[403,404]}),o=a.ok?await a.text():``,s=te(o),c=o.split(`
|
|
6
|
-
`).map(e=>e.replace(me,``).replace(/^.*\r/,``)).filter(e=>e.startsWith(`$ `)).at(-1);return{step:s?`build`:(c?ee(c):void 0)??`build`,detail:i,...s&&{cause:s}}}signOut(){this.onSignOut()}};function q(e){let t=``;for(let n of e)t+=String.fromCharCode(n);return btoa(t).replace(/\+/g,`-`).replace(/\//g,`_`).replace(/=+$/,``)}function J(e=32){return q(crypto.getRandomValues(new Uint8Array(e)))}async function Y(e){let t=await crypto.subtle.digest(`SHA-256`,new TextEncoder().encode(e));return q(new Uint8Array(t))}function X(e,t,n=Date.now()){return{type:`oauth`,access:e.access_token,refresh:e.refresh_token,expiresAt:n+(e.expires_in??7200)*1e3,verifier:t}}function Z(e){let t=new URL(e);return`${t.origin}${t.pathname.replace(/\/?$/,`/`)}`}var Q=`main`;function ge(){return{href:()=>window.location.href,assign:e=>window.location.assign(e),replace:e=>window.history.replaceState(window.history.state,``,e)}}function $(e={}){let t=(e.url??`https://gitlab.com`).replace(/\/$/,``),n=`${t}/api/v4`,r=e.fetch??((e,t)=>globalThis.fetch(e,t)),i=v(`goodfellow:gitlab-setup:pending`,e.storage),a=()=>e.location??ge();async function o(e){let n=await r(`${t}/oauth/token`,{method:`POST`,headers:{"content-type":`application/x-www-form-urlencoded`},body:new URLSearchParams(e)});if(!n.ok)throw new g(`invalid`,`GitLab didn't accept the sign-in (${n.status}).`);return await n.json()}async function s(t){let i=t,s={apiUrl:n,token:async({refresh:t}={})=>{if(i.type===`token`)return i.token;if(t||i.expiresAt-6e4<Date.now()){let{verifier:t}=i;i=X(await o({client_id:e.clientId??``,refresh_token:i.refresh,grant_type:`refresh_token`,redirect_uri:Z(a().href()),code_verifier:t}),t)}return i.access},canRefresh:i.type===`oauth`,fetch:r},c=await C(s,`/user`);async function l(e,t){return(await S(s,`/projects/${encodeURIComponent(`${e.path}/${t}`)}`,{allow:[404]})).status===404}async function u(e){let t=e=>`/projects/${encodeURIComponent(e)}`;try{let n=new Map;for(let r of[`code`,`content`])n.set(r,(await C(s,t(e[r]))).id);for(let{reader:r,read:i}of e.links.reads)await S(s,`${t(e[i])}/job_token_scope/allowlist`,{method:`POST`,body:{target_project_id:n.get(r)}});e.links.updates&&await S(s,t(e[e.links.updates]),{method:`PUT`,body:{ci_push_repository_for_job_token_allowed:!0}});for(let n of e.links.nightly)await S(s,`${t(e[n])}/pipeline_schedules`,{method:`POST`,body:{description:n===e.links.updates?`Rebuild the site and install Goodfellow's fixes each night`:`Rebuild the site each night`,ref:Q,cron:L,cron_timezone:`UTC`,active:!0}});return!0}catch(e){if(e instanceof b&&[400,403,404].includes(e.status))return!1;throw e}}return{user:{login:c.username,name:c.name,avatarUrl:c.avatar_url},async owners(){let e=(await C(s,`/namespaces?per_page=100`)).map(e=>({path:e.full_path,name:e.kind===`user`?c.name??e.name:e.name,kind:e.kind===`user`?`personal`:`organization`,id:e.id}));return[...e.filter(e=>e.kind===`personal`),...e.filter(e=>e.kind!==`personal`)]},isAvailable:l,async createSite(e,t){if(t?.(`repository`),!await l(e.owner,e.name))throw new p(`name-taken`,`There's already a project called ${e.owner.path}/${e.name}.`);let n;try{n=await C(s,`/projects`,{method:`POST`,body:{name:e.name,path:e.name,namespace_id:e.owner.id,visibility:e.private?`private`:`public`,description:e.description,...e.pages&&{pages_access_level:e.private?`public`:`enabled`}}})}catch(t){throw t instanceof b&&t.status===400?new p(`name-invalid`,`GitLab can't use "${e.name}" as a project name.`):t instanceof b&&(t.status===403||t.status===404)?new p(`not-allowed`,`This sign-in can't create projects in ${e.owner.path}.`):t}let r=[];e.link&&(t?.(`connect`),await u(e.link)||r.push(`connect-unavailable`));let i;if(e.pages&&e.domain){t?.(`pages`);try{await S(s,`/projects/${n.id}/pages/domains`,{method:`POST`,body:{domain:e.domain,auto_ssl_enabled:!0}}),i=`https://${e.domain}/`}catch(e){if(!(e instanceof b)||![400,403,404,409,422].includes(e.status))throw e;r.push(`domain-unavailable`)}}return t?.(`files`),await S(s,`/projects/${n.id}/repository/commits`,{method:`POST`,body:{branch:Q,commit_message:e.message,actions:e.files.flatMap(e=>`delete`in e?[]:`content`in e?[{action:`create`,file_path:e.path,content:e.content}]:[{action:`create`,file_path:e.path,content:_(e.bytes),encoding:`base64`}])}}),{repo:n.path_with_namespace,webUrl:n.web_url,...i&&{siteUrl:i},buildsUrl:`${n.web_url}/-/pipelines`,pagesUrl:e.pages?`${n.web_url}/pages`:void 0,warnings:r}}}}return{name:`GitLab`,canRedirect:!!e.clientId,tokenLinks:[{url:`${t}/-/user_settings/personal_access_tokens?${new URLSearchParams({name:`Goodfellow site setup`,scopes:`api`})}`,label:`signIn.token.create`}],async restore(){let t=new URL(a().href()),n=t.searchParams.get(`code`),r=t.searchParams.get(`error`);if(!n&&!r)return null;let c=i.load();if(!c)return null;i.clear();let l=JSON.parse(c),u=t.searchParams.get(`state`);for(let e of[`code`,`state`,`error`,`error_description`])t.searchParams.delete(e);if(a().replace(t.toString()),r||!n||u!==l.state)throw new g(`redirect-failed`,`Signing in with GitLab was cancelled or didn't finish.`);return s(X(await o({client_id:e.clientId??``,code:n,grant_type:`authorization_code`,redirect_uri:Z(t.toString()),code_verifier:l.verifier}),l.verifier))},async signInWithToken(e){let t=e.trim();if(!t)throw new g(`invalid`,`Paste a token to sign in.`);return s({type:`token`,token:t})},async startRedirect(){if(!e.clientId)throw Error(`gitlabSetup({ clientId }) is needed to sign in with GitLab.`);let n={state:J(16),verifier:J(48)};i.save(JSON.stringify(n),!1);let r=new URLSearchParams({client_id:e.clientId,redirect_uri:Z(a().href()),response_type:`code`,state:n.state,scope:`api`,code_challenge:await Y(n.verifier),code_challenge_method:`S256`});a().assign(`${t}/oauth/authorize?${r}`)}}}var _e=30;function ve(){return{href:()=>window.location.href,assign:e=>window.location.assign(e),replace:e=>window.history.replaceState(window.history.state,``,e)}}function ye(e){let t=(e.url??`https://gitlab.com`).replace(/\/$/,``),n=`${t}/api/v4`,r=u(e.fetch??((e,t)=>globalThis.fetch(e,t)),{host:`GitLab`}),i=v(`goodfellow:gitlab:${t}:${e.project}`,e.storage),a=v(`goodfellow:gitlab:pending:${e.project}`,e.storage),o=()=>e.location??ve();async function s(e){let n=await r(`${t}/oauth/token`,{method:`POST`,headers:{"content-type":`application/x-www-form-urlencoded`},body:new URLSearchParams(e)});if(!n.ok)throw new g(`invalid`,`GitLab didn't accept the sign-in (${n.status}).`);return await n.json()}async function c(a,c){let l=a,u,d=t=>u??=(async()=>(l=X(await s({client_id:e.clientId??``,refresh_token:t.refresh,grant_type:`refresh_token`,redirect_uri:Z(o().href()),code_verifier:t.verifier}),t.verifier),i.save(JSON.stringify(l),c),l.access))().finally(()=>{u=void 0}),f={apiUrl:n,token:async({refresh:e,stale:t}={})=>l.type===`token`?l.token:u||(e&&t!==void 0&&t!==l.access?l.access:e||l.expiresAt-6e4<Date.now()?d(l):l.access),canRefresh:l.type===`oauth`,fetch:r},p=await C(f,`/user`),m;try{m=await C(f,`/projects/${encodeURIComponent(e.project)}`)}catch(t){throw t instanceof b&&(t.status===404||t.status===403)?new g(`no-access`,`The GitLab account ${p.username} can't see ${e.project}.`):t}if(Math.max(m.permissions?.project_access?.access_level??0,m.permissions?.group_access?.access_level??0)<_e)throw new g(`cant-publish`,`The GitLab account ${p.username} can see ${e.project} but can't publish to it.`);return i.save(JSON.stringify(l),c),new K({api:f,project:e.project,branch:e.branch??m.default_branch,...e.contentOnly&&{contentOnly:!0},...e.contentOnly&&e.code&&{code:{project:e.code,webUrl:t}},user:{login:p.username,name:p.name,avatarUrl:p.avatar_url},onSignOut:()=>i.clear()})}async function l(){let t=new URL(o().href()),n=t.searchParams.get(`code`),r=t.searchParams.get(`state`),i=t.searchParams.get(`error`);if(!n&&!i)return null;for(let e of[`code`,`state`,`error`,`error_description`])t.searchParams.delete(e);let l=a.load();if(l&&(t.hash=JSON.parse(l).hash),o().replace(t.toString()),!l)return null;a.clear();let u=JSON.parse(l);if(i||!n||r!==u.state)throw new g(`redirect-failed`,`Signing in with GitLab was cancelled or didn't finish.`);return c(X(await s({client_id:e.clientId??``,code:n,grant_type:`authorization_code`,redirect_uri:Z(t.toString()),code_verifier:u.verifier}),u.verifier),u.remember)}function d({token:t}){let i={apiUrl:n,token:async()=>typeof t==`string`?t:t(),canRefresh:!1,fetch:r},a,o=()=>(a??=e.branch?Promise.resolve(e.branch):C(i,`/projects/${encodeURIComponent(e.project)}`).then(e=>e.default_branch),a.catch(()=>{a=void 0}),a),s=async(t,n)=>new K({api:i,project:e.project,branch:await o(),...e.contentOnly&&{contentOnly:!0},user:{login:n?.name??e.project,...n&&{name:n.name}},onSignOut:()=>{},...t&&{revision:t},...n&&{author:n}});return{...e.contentOnly&&{contentOnly:!0},async revision(){return(await s()).revision()},at:s}}return{name:`GitLab`,source:y(`@goodfellow-cms/gitlab`,`gitlab`,e,[`fetch`,`storage`,`location`]),canRedirect:!!e.clientId,setup:()=>$({...e.url&&{url:e.url},...e.fetch&&{fetch:e.fetch},...e.storage&&{storage:e.storage},...e.location&&{location:e.location}}),redirectAddressesListed:!!e.clientId,tokenLinks:[{url:`${t}/-/user_settings/personal_access_tokens?${new URLSearchParams({name:`Goodfellow admin`,scopes:`api`})}`,label:`signIn.token.create`}],async restore(){let e=await l();if(e)return e;let t=i.load();if(!t)return null;try{return await c(JSON.parse(t),i.remembered())}catch(e){throw e instanceof g&&i.clear(),e}},async signInWithToken(e,t){let n=e.trim();if(!n)throw new g(`invalid`,`Paste a token to sign in.`);return c({type:`token`,token:n},t)},async startRedirect(n){if(!e.clientId)throw Error(`gitlab({ clientId }) is needed to sign in with GitLab.`);let r=J(48),i=J(16),s=new URL(o().href()),c={state:i,verifier:r,remember:n,hash:s.hash};a.save(JSON.stringify(c),!1);let l=new URLSearchParams({client_id:e.clientId,redirect_uri:Z(s.toString()),response_type:`code`,state:i,scope:`api`,code_challenge:await Y(r),code_challenge_method:`S256`});o().assign(`${t}/oauth/authorize?${l}`)},server:d}}export{K as GitLabBackend,ye as gitlab,M as gitlabPagesRecords,$ as gitlabSetup,Z as redirectUri};
|
|
6
|
+
`).map(e=>e.replace(me,``).replace(/^.*\r/,``)).filter(e=>e.startsWith(`$ `)).at(-1);return{step:s?`build`:(c?ee(c):void 0)??`build`,detail:i,...s&&{cause:s}}}signOut(){this.onSignOut()}};function q(e){let t=``;for(let n of e)t+=String.fromCharCode(n);return btoa(t).replace(/\+/g,`-`).replace(/\//g,`_`).replace(/=+$/,``)}function J(e=32){return q(crypto.getRandomValues(new Uint8Array(e)))}async function Y(e){let t=await crypto.subtle.digest(`SHA-256`,new TextEncoder().encode(e));return q(new Uint8Array(t))}function X(e,t,n=Date.now()){return{type:`oauth`,access:e.access_token,refresh:e.refresh_token,expiresAt:n+(e.expires_in??7200)*1e3,verifier:t}}function Z(e){let t=new URL(e);return`${t.origin}${t.pathname.replace(/\/?$/,`/`)}`}var Q=`main`;function ge(){return{href:()=>window.location.href,assign:e=>window.location.assign(e),replace:e=>window.history.replaceState(window.history.state,``,e)}}function $(e={}){let t=(e.url??`https://gitlab.com`).replace(/\/$/,``),n=`${t}/api/v4`,r=e.fetch??((e,t)=>globalThis.fetch(e,t)),i=v(`goodfellow:gitlab-setup:pending`,e.storage),a=()=>e.location??ge();async function o(e){let n=await r(`${t}/oauth/token`,{method:`POST`,headers:{"content-type":`application/x-www-form-urlencoded`},body:new URLSearchParams(e)});if(!n.ok)throw new g(`invalid`,`GitLab didn't accept the sign-in (${n.status}).`);return await n.json()}async function s(t){let i=t,s={apiUrl:n,token:async({refresh:t}={})=>{if(i.type===`token`)return i.token;if(t||i.expiresAt-6e4<Date.now()){let{verifier:t}=i;i=X(await o({client_id:e.clientId??``,refresh_token:i.refresh,grant_type:`refresh_token`,redirect_uri:Z(a().href()),code_verifier:t}),t)}return i.access},canRefresh:i.type===`oauth`,fetch:r},c=await C(s,`/user`);async function l(e,t){return(await S(s,`/projects/${encodeURIComponent(`${e.path}/${t}`)}`,{allow:[404]})).status===404}let u=e=>`/projects/${encodeURIComponent(e)}`;async function d(e,t,n){try{await t()}catch(t){if(!(t instanceof b))throw t;n.push({...e,reason:t.message})}}async function f(e,t){let n=new Map;for(let t of[`code`,`content`])try{n.set(t,(await C(s,u(e[t]))).id)}catch(e){if(!(e instanceof b))throw e}for(let{reader:r,read:i}of e.links.reads){let a=n.get(r),o=n.get(i);await d({kind:`read`,reader:e[r],read:e[i],reason:``},async()=>{if(a===void 0)throw new b(404,`GitLab couldn't find ${e[r]}.`);if(o===void 0)throw new b(404,`GitLab couldn't find ${e[i]}.`);await S(s,`/projects/${o}/job_token_scope/allowlist`,{method:`POST`,body:{target_project_id:a}})},t)}if(e.links.updates){let n=e[e.links.updates];await d({kind:`push`,repo:n,reason:``},()=>S(s,u(n),{method:`PUT`,body:{ci_push_repository_for_job_token_allowed:!0}}),t)}}async function m(e,t){for(let n of e.links.nightly){let r=e[n];await d({kind:`nightly`,repo:r,reason:``},()=>S(s,`${u(r)}/pipeline_schedules`,{method:`POST`,body:{description:n===e.links.updates?`Rebuild the site and install Goodfellow's fixes each night`:`Rebuild the site each night`,ref:Q,cron:L,cron_timezone:`UTC`,active:!0}}),t)}}return{user:{login:c.username,name:c.name,avatarUrl:c.avatar_url},async owners(){let e=(await C(s,`/namespaces?per_page=100`)).map(e=>({path:e.full_path,name:e.kind===`user`?c.name??e.name:e.name,kind:e.kind===`user`?`personal`:`organization`,id:e.id}));return[...e.filter(e=>e.kind===`personal`),...e.filter(e=>e.kind!==`personal`)]},isAvailable:l,async createSite(e,t){if(t?.(`repository`),!await l(e.owner,e.name))throw new p(`name-taken`,`There's already a project called ${e.owner.path}/${e.name}.`);let n;try{n=await C(s,`/projects`,{method:`POST`,body:{name:e.name,path:e.name,namespace_id:e.owner.id,visibility:e.private?`private`:`public`,description:e.description,...e.pages&&{pages_access_level:e.private?`public`:`enabled`}}})}catch(t){throw t instanceof b&&t.status===400?new p(`name-invalid`,`GitLab can't use "${e.name}" as a project name.`):t instanceof b&&(t.status===403||t.status===404)?new p(`not-allowed`,`This sign-in can't create projects in ${e.owner.path}.`):t}let r=[],i=[];e.link&&(t?.(`connect`),await f(e.link,i));let a;if(e.pages&&e.domain){t?.(`pages`);try{await S(s,`/projects/${n.id}/pages/domains`,{method:`POST`,body:{domain:e.domain,auto_ssl_enabled:!0}}),a=`https://${e.domain}/`}catch(e){if(!(e instanceof b)||![400,403,404,409,422].includes(e.status))throw e;r.push(`domain-unavailable`)}}return t?.(`files`),await S(s,`/projects/${n.id}/repository/commits`,{method:`POST`,body:{branch:Q,commit_message:e.message,actions:e.files.flatMap(e=>`delete`in e?[]:`content`in e?[{action:`create`,file_path:e.path,content:e.content}]:[{action:`create`,file_path:e.path,content:_(e.bytes),encoding:`base64`}])}}),e.link&&await m(e.link,i),i.length&&r.push(`connect-unavailable`),{repo:n.path_with_namespace,webUrl:n.web_url,...a&&{siteUrl:a},buildsUrl:`${n.web_url}/-/pipelines`,pagesUrl:e.pages?`${n.web_url}/pages`:void 0,warnings:r,...i.length&&{unconnected:i}}}}}return{name:`GitLab`,canRedirect:!!e.clientId,tokenLinks:[{url:`${t}/-/user_settings/personal_access_tokens?${new URLSearchParams({name:`Goodfellow site setup`,scopes:`api`})}`,label:`signIn.token.create`}],async restore(){let t=new URL(a().href()),n=t.searchParams.get(`code`),r=t.searchParams.get(`error`);if(!n&&!r)return null;let c=i.load();if(!c)return null;i.clear();let l=JSON.parse(c),u=t.searchParams.get(`state`);for(let e of[`code`,`state`,`error`,`error_description`])t.searchParams.delete(e);if(a().replace(t.toString()),r||!n||u!==l.state)throw new g(`redirect-failed`,`Signing in with GitLab was cancelled or didn't finish.`);return s(X(await o({client_id:e.clientId??``,code:n,grant_type:`authorization_code`,redirect_uri:Z(t.toString()),code_verifier:l.verifier}),l.verifier))},async signInWithToken(e){let t=e.trim();if(!t)throw new g(`invalid`,`Paste a token to sign in.`);return s({type:`token`,token:t})},async startRedirect(){if(!e.clientId)throw Error(`gitlabSetup({ clientId }) is needed to sign in with GitLab.`);let n={state:J(16),verifier:J(48)};i.save(JSON.stringify(n),!1);let r=new URLSearchParams({client_id:e.clientId,redirect_uri:Z(a().href()),response_type:`code`,state:n.state,scope:`api`,code_challenge:await Y(n.verifier),code_challenge_method:`S256`});a().assign(`${t}/oauth/authorize?${r}`)}}}var _e=30;function ve(){return{href:()=>window.location.href,assign:e=>window.location.assign(e),replace:e=>window.history.replaceState(window.history.state,``,e)}}function ye(e){let t=(e.url??`https://gitlab.com`).replace(/\/$/,``),n=`${t}/api/v4`,r=u(e.fetch??((e,t)=>globalThis.fetch(e,t)),{host:`GitLab`}),i=v(`goodfellow:gitlab:${t}:${e.project}`,e.storage),a=v(`goodfellow:gitlab:pending:${e.project}`,e.storage),o=()=>e.location??ve();async function s(e){let n=await r(`${t}/oauth/token`,{method:`POST`,headers:{"content-type":`application/x-www-form-urlencoded`},body:new URLSearchParams(e)});if(!n.ok)throw new g(`invalid`,`GitLab didn't accept the sign-in (${n.status}).`);return await n.json()}async function c(a,c){let l=a,u,d=t=>u??=(async()=>(l=X(await s({client_id:e.clientId??``,refresh_token:t.refresh,grant_type:`refresh_token`,redirect_uri:Z(o().href()),code_verifier:t.verifier}),t.verifier),i.save(JSON.stringify(l),c),l.access))().finally(()=>{u=void 0}),f={apiUrl:n,token:async({refresh:e,stale:t}={})=>l.type===`token`?l.token:u||(e&&t!==void 0&&t!==l.access?l.access:e||l.expiresAt-6e4<Date.now()?d(l):l.access),canRefresh:l.type===`oauth`,fetch:r},p=await C(f,`/user`),m;try{m=await C(f,`/projects/${encodeURIComponent(e.project)}`)}catch(t){throw t instanceof b&&(t.status===404||t.status===403)?new g(`no-access`,`The GitLab account ${p.username} can't see ${e.project}.`):t}if(Math.max(m.permissions?.project_access?.access_level??0,m.permissions?.group_access?.access_level??0)<_e)throw new g(`cant-publish`,`The GitLab account ${p.username} can see ${e.project} but can't publish to it.`);return i.save(JSON.stringify(l),c),new K({api:f,project:e.project,branch:e.branch??m.default_branch,...e.contentOnly&&{contentOnly:!0},...e.contentOnly&&e.code&&{code:{project:e.code,webUrl:t}},user:{login:p.username,name:p.name,avatarUrl:p.avatar_url},onSignOut:()=>i.clear()})}async function l(){let t=new URL(o().href()),n=t.searchParams.get(`code`),r=t.searchParams.get(`state`),i=t.searchParams.get(`error`);if(!n&&!i)return null;for(let e of[`code`,`state`,`error`,`error_description`])t.searchParams.delete(e);let l=a.load();if(l&&(t.hash=JSON.parse(l).hash),o().replace(t.toString()),!l)return null;a.clear();let u=JSON.parse(l);if(i||!n||r!==u.state)throw new g(`redirect-failed`,`Signing in with GitLab was cancelled or didn't finish.`);return c(X(await s({client_id:e.clientId??``,code:n,grant_type:`authorization_code`,redirect_uri:Z(t.toString()),code_verifier:u.verifier}),u.verifier),u.remember)}function d({token:t}){let i={apiUrl:n,token:async()=>typeof t==`string`?t:t(),canRefresh:!1,fetch:r},a,o=()=>(a??=e.branch?Promise.resolve(e.branch):C(i,`/projects/${encodeURIComponent(e.project)}`).then(e=>e.default_branch),a.catch(()=>{a=void 0}),a),s=async(t,n)=>new K({api:i,project:e.project,branch:await o(),...e.contentOnly&&{contentOnly:!0},user:{login:n?.name??e.project,...n&&{name:n.name}},onSignOut:()=>{},...t&&{revision:t},...n&&{author:n}});return{...e.contentOnly&&{contentOnly:!0},async revision(){return(await s()).revision()},at:s}}return{name:`GitLab`,source:y(`@goodfellow-cms/gitlab`,`gitlab`,e,[`fetch`,`storage`,`location`]),canRedirect:!!e.clientId,setup:()=>$({...e.url&&{url:e.url},...e.fetch&&{fetch:e.fetch},...e.storage&&{storage:e.storage},...e.location&&{location:e.location}}),redirectAddressesListed:!!e.clientId,tokenLinks:[{url:`${t}/-/user_settings/personal_access_tokens?${new URLSearchParams({name:`Goodfellow admin`,scopes:`api`})}`,label:`signIn.token.create`}],async restore(){let e=await l();if(e)return e;let t=i.load();if(!t)return null;try{return await c(JSON.parse(t),i.remembered())}catch(e){throw e instanceof g&&i.clear(),e}},async signInWithToken(e,t){let n=e.trim();if(!n)throw new g(`invalid`,`Paste a token to sign in.`);return c({type:`token`,token:n},t)},async startRedirect(n){if(!e.clientId)throw Error(`gitlab({ clientId }) is needed to sign in with GitLab.`);let r=J(48),i=J(16),s=new URL(o().href()),c={state:i,verifier:r,remember:n,hash:s.hash};a.save(JSON.stringify(c),!1);let l=new URLSearchParams({client_id:e.clientId,redirect_uri:Z(s.toString()),response_type:`code`,state:i,scope:`api`,code_challenge:await Y(r),code_challenge_method:`S256`});o().assign(`${t}/oauth/authorize?${l}`)},server:d}}export{K as GitLabBackend,ye as gitlab,M as gitlabPagesRecords,$ as gitlabSetup,Z as redirectUri};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./dist-BgSqMIdW.js","./store-BxUMMiN8.js","./setup-host-D55O8ui4.js","./git-eGyMXUIu.js","./scheduled-builds-BPfDaBYt.js","./dist-pDBJlXWC.js","./preload-helper-CEqbogAV.js","./content-repository-setup-CzHqy87S.js","./dist-
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./dist-BgSqMIdW.js","./store-BxUMMiN8.js","./setup-host-D55O8ui4.js","./git-eGyMXUIu.js","./scheduled-builds-BPfDaBYt.js","./dist-pDBJlXWC.js","./preload-helper-CEqbogAV.js","./content-repository-setup-CzHqy87S.js","./dist-zCxHbxxj.js"])))=>i.map(i=>d[i]);
|
|
2
2
|
import{a as e,n as t,r as n,s as r,t as i}from"./preload-helper-CEqbogAV.js";import{d as a,f as o,g as s,h as c,i as l,l as u,m as d,o as f,p,s as m,u as h}from"./store-BxUMMiN8.js";function g(e){if(e)try{let t=new URL(e.url),n=t.hostname===`localhost`||t.hostname===`127.0.0.1`;return(t.protocol===`https:`||t.protocol===`http:`&&n)&&t.pathname===`/`&&!t.search&&!t.hash?t.origin:void 0}catch{return}}[`s`,`S`].flatMap(e=>[`v`,`V`].flatMap(t=>[`g`,`G`].map(n=>`${e}${t}${n}`)));var _=/^[ \t]*admin:[ \t]*\{[^\n]*\},?[ \t]*\n/m;function v(e){let t=_.exec(e)?.[0],n=t&&/url:\s*"([^"\\]+)"/.exec(t)?.[1];if(t&&n)return{url:n,.../checked:\s*true/.test(t)&&{checked:!0}}}var y={site:1,menus:1,page:1,layout:1,collection:1,entry:1,updates:1,redirects:1,media:1,theme:1,storage:1,permissions:1,"admin-text":1,"synced-block":1},ee={site:[],menus:[],page:[],layout:[],collection:[],entry:[],updates:[],redirects:[],media:[],theme:[],storage:[],permissions:[],"admin-text":[],"synced-block":[]},b=class extends Error{name=`MigrationError`};function te(e,t,n={}){let r=n.registry??ee,i=n.currentVersion??y[e],a=t.version;if(typeof a!=`number`||!Number.isInteger(a)||a<1)throw new b(`is missing its "version" number.`);if(a>i)throw new b(`was saved by a newer version of Goodfellow (file version ${a}, this version reads up to ${i}). Update Goodfellow to use it.`);let o=t;for(let t=a;t<i;t++){let n=r[e].find(e=>e.from===t);if(!n)throw new b(`can't be upgraded from version ${t}: no migration exists.`);o={...n.up(o),version:t+1}}return o}function ne(e){let t=Object.values(e).filter(e=>typeof e==`number`);return Object.entries(e).filter(([e,n])=>t.indexOf(+e)===-1).map(([e,t])=>t)}function re(e,t=`|`){return e.map(e=>Oe(e)).join(t)}function ie(e,t){return typeof t==`bigint`?t.toString():t}var ae=class{constructor(e){this._getter=e,this._value=void 0}get value(){let e=this._getter;return e!==void 0&&(this._value=e(),this._getter=void 0),this._value}};function oe(e){return new ae(e)}function se(e){return e==null}function ce(e){let t=+!!e.startsWith(`^`),n=e.endsWith(`$`)?e.length-1:e.length;return e.slice(t,n)}function le(e,t){let n=e/t,r=Math.round(n),i=4*2**-52*Math.max(Math.abs(n),1);return Math.abs(n-r)<i?0:n-r}function ue(e,t,n){Object.defineProperty(e,t,{value:n,writable:!0,enumerable:!0,configurable:!0})}function de(e){let t=Object.getOwnPropertyDescriptor(e,`shape`);return t?.get?t.get.raw:t?.value}function fe(e){return de(e._zod.def)??e._zod.def.shape}function pe(e,t,n){Object.defineProperty(e,t,{get(){let e=n();return ue(this,t,e),e},enumerable:!0,configurable:!0})}function me(e,t,n){t in e?ue(e,t,n):e[t]=n}function he(e,t,n,r){let i=fe(t);for(let a of n){let n=Object.getOwnPropertyDescriptor(i,a);n.enumerable&&(n.get?pe(e,a,()=>{let e=t._zod.def.shape[a];return r?r(e,a):e}):me(e,a,r?r(n.value,a):n.value))}}function ge(e,t){for(let n of Reflect.ownKeys(t)){let r=Object.getOwnPropertyDescriptor(t,n);r.enumerable&&(r.get?pe(e,n,()=>t[n]):me(e,n,r.value))}}function _e(...e){let t={};for(let n of e){let e=Object.getOwnPropertyDescriptors(n);Object.assign(t,e)}return Object.defineProperties({},t)}function ve(e){return JSON.stringify(e)}function ye(e){return e.toLowerCase().trim().replace(/[^\w\s-]/g,``).replace(/[\s_-]+/g,`-`).replace(/^-+|-+$/g,``)}var be=`captureStackTrace`in Error?Error.captureStackTrace:(...e)=>{};function xe(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}var Se=oe(()=>{if(_t.jitless||typeof navigator<`u`&&navigator?.userAgent?.includes(`Cloudflare`))return!1;try{return Function(``),!0}catch{return!1}});function Ce(e){if(xe(e)===!1)return!1;let t=e.constructor;if(t===void 0||typeof t!=`function`)return!0;let n=t.prototype;return xe(n)!==!1&&Object.prototype.hasOwnProperty.call(n,`isPrototypeOf`)!==!1}function we(e){return Ce(e)?{...e}:Array.isArray(e)?[...e]:e instanceof Map?new Map(e):e instanceof Set?new Set(e):e}var Te=new Set([`string`,`number`,`symbol`]);function Ee(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function De(e,t,n){let r=new e._zod.constr(t??e._zod.def);return(!t||n?.parent)&&(r._zod.parent=e),r}function x(e){let t=e;if(!t)return{};if(typeof t==`string`)return{error:()=>t};if(t?.message!==void 0){if(t?.error!==void 0)throw Error("Cannot specify both `message` and `error` params");t.error=t.message}return delete t.message,typeof t.error==`string`?{...t,error:()=>t.error}:t}function Oe(e){return typeof e==`bigint`?e.toString()+`n`:typeof e==`string`?`"${e}"`:`${e}`}function ke(e){return Object.keys(e).filter(t=>e[t]._zod.optin!==void 0&&e[t]._zod.optout===`optional`)}var Ae={safeint:[-(2**53-1),2**53-1],int32:[-2147483648,2147483647],uint32:[0,4294967295],float32:[-34028234663852886e22,34028234663852886e22],float64:[-Number.MAX_VALUE,Number.MAX_VALUE]},je={int64:[BigInt(`-9223372036854775808`),BigInt(`9223372036854775807`)],uint64:[BigInt(0),BigInt(`18446744073709551615`)]};function Me(e,t){let n=e._zod.def,r=n.checks;if(r&&r.length>0)throw Error(`.pick() cannot be used on object schemas containing refinements`);let i={};return he(i,e,Ne(e,t)),De(e,_e(n,{shape:i,checks:[]}))}function Ne(e,t){let n=fe(e),r=[];for(let e of Reflect.ownKeys(t)){if(!Object.getOwnPropertyDescriptor(n,e)?.enumerable)throw Error(`Unrecognized key: "${String(e)}"`);t[e]&&r.push(e)}return r}function Pe(e,t){let n=e._zod.def,r=n.checks;if(r&&r.length>0)throw Error(`.omit() cannot be used on object schemas containing refinements`);let i=new Set(Ne(e,t)),a={};return he(a,e,Reflect.ownKeys(fe(e)).filter(e=>!i.has(e))),De(e,_e(n,{shape:a,checks:[]}))}function Fe(e,t){if(!Ce(t))throw Error(`Invalid input to extend: expected a plain object`);let n=e._zod.def.checks;if(n&&n.length>0){let n=fe(e);for(let e of Reflect.ownKeys(t))if(Object.getOwnPropertyDescriptor(n,e)!==void 0)throw Error("Cannot overwrite keys on object schemas containing refinements. Use `.safeExtend()` instead.")}return De(e,_e(e._zod.def,{shape:Ie(e,t)}))}function Ie(e,t){let n={};return he(n,e,Reflect.ownKeys(fe(e))),ge(n,t),n}function Le(e,t){if(!Ce(t))throw Error(`Invalid input to safeExtend: expected a plain object`);return De(e,_e(e._zod.def,{shape:Ie(e,t)}))}function Re(e,t){if(!t?._zod?.def)throw Error("Invalid input to merge: expected an object schema. To merge a plain shape, use `.extend()`.");if(e._zod.def.checks?.length)throw Error(`.merge() cannot be used on object schemas containing refinements. Use .safeExtend() instead.`);let n={};return he(n,e,Reflect.ownKeys(fe(e))),he(n,t,Reflect.ownKeys(fe(t))),De(e,_e(e._zod.def,{shape:n,get catchall(){return t._zod.def.catchall},checks:t._zod.def.checks??[]}))}function ze(e,t,n,r=`partial`){let i=t._zod.def.checks;if(i&&i.length>0)throw Error(`.${r}() cannot be used on object schemas containing refinements`);let a=n?new Set(Ne(t,n)):void 0,o={};return he(o,t,Reflect.ownKeys(fe(t)),e&&((t,n)=>a&&!a.has(n)?t:new e({type:`optional`,innerType:t}))),De(t,_e(t._zod.def,{shape:o,checks:[]}))}function Be(e,t,n){let r=n?new Set(Ne(t,n)):void 0,i={};return he(i,t,Reflect.ownKeys(fe(t)),(t,n)=>r&&!r.has(n)?t:new e({type:`nonoptional`,innerType:t})),De(t,_e(t._zod.def,{shape:i}))}function Ve(e,t=0){if(e.aborted===!0)return!0;for(let n=t;n<e.issues.length;n++)if(e.issues[n]?.continue!==!0)return!0;return!1}function He(e,t=0){if(e.aborted===!0)return!0;for(let n=t;n<e.issues.length;n++)if(e.issues[n]?.continue===!1)return!0;return!1}function Ue(e,t){return t.map(t=>{var n;return(n=t).path??(n.path=[]),t.path.unshift(e),t})}function We(e){return typeof e==`string`?e:e?.message}function Ge(e){let t=[];for(let n of e??[]){let e=n._zod.def;if(!/_(length|size)$|_equals$/.test(e.check))break;let r=e.maximum??e.length??e.size;r>=0&&t.push([r,n])}return t}function Ke(e,t,n){var r;for(let i=t;i<e.length;i++)(r=e[i]).schema??(r.schema=n)}function qe(e,t,n){var r;let i=e.inst?._zod?.traits;i?.has(`$ZodType`)&&(i.has(`$ZodCheck`)?(r=e).schema??(r.schema=e.inst):e.schema=e.inst);let a=e.schema===e.inst?void 0:e.schema?._zod.def?.error,o=e.message?e.message:We(e.inst?._zod.def?.error?.(e))??We(a?.(e))??We(t?.error?.(e))??We(n.customError?.(e))??We(n.localeError?.(e))??`Invalid input`,s={};for(let t of Object.keys(e))t!==`inst`&&t!==`schema`&&t!==`continue`&&t!==`input`&&t!==`__proto__`&&(s[t]=e[t]);return s.path??=[],s.message=o,t?.reportInput&&(s.input=e.input),s}var Je=/[\uD800-\uDBFF]/;function Ye(e){let t=e.length;if(!Je.test(e))return t;let n=t;for(let r=0;r<t-1;r++)(e.charCodeAt(r)&64512)==55296&&(e.charCodeAt(r+1)&64512)==56320&&(n--,r++);return n}function Xe(e){return Array.isArray(e)?`array`:typeof e==`string`?`string`:`unknown`}function Ze(e){let t=typeof e;switch(t){case`number`:return Number.isNaN(e)?`nan`:`number`;case`object`:{if(e===null)return`null`;if(Array.isArray(e))return`array`;let t=e;if(t&&Object.getPrototypeOf(t)!==Object.prototype&&`constructor`in t&&t.constructor)return t.constructor.name}}return t}function Qe(...e){let[t,n,r]=e;return typeof t==`string`?{message:t,code:`custom`,input:n,inst:r}:{...t}}function $e(e,t){for(let n in t){let r=Object.getOwnPropertyDescriptor(t,n);r.get?Object.defineProperty(e,n,{...r,enumerable:!1}):rt(e,n,r.value)}}function et(e,t,n,r=!0){return Object.defineProperty(e,t,{configurable:!0,writable:!0,enumerable:r,value:n}),n}function tt(e,t,n){return et(e,t,n,!1)}function nt(e,t){for(let n in e){let r=e[n];Object.defineProperty(t,n,{configurable:!0,enumerable:!0,get(){return et(this,n,r(this))},set(e){et(this,n,e)}})}return t}function rt(e,t,n){Object.defineProperty(e,t,{configurable:!0,get(){return this==null?n:et(this,t,n.bind(this))},set(e){et(this,t,e)}})}function it(e,t){let n=Object.getPrototypeOf(e);return t in n?void 0:n}var at,ot=!1,st={configurable:!0,get(){ot=!0}};function S(e,t,n){let r=Object.getPrototypeOf(e._zod);if(t in r&&at!==e._zod){at=void 0;return}at=e._zod,Object.defineProperty(r,t,{configurable:!0,get(){Object.defineProperty(this,t,st);let e=ot;ot=!1;try{let r=n(this);return ot?delete this[t]:Object.defineProperty(this,t,{configurable:!0,writable:!0,value:r}),ot||=e,r}catch(n){throw delete this[t],ot||=e,n}},set(e){Object.defineProperty(this,t,{configurable:!0,writable:!0,value:e})}})}function ct(e,t,n,r){let i=it(e,t);i&&Object.defineProperty(i,t,{configurable:!0,get(){let e={configurable:!0,writable:!0,enumerable:r,value:void 0};return Object.defineProperty(this,t,e),e.value=n(this),Object.defineProperty(this,t,e),e.value},set(e){Object.defineProperty(this,t,{configurable:!0,writable:!0,enumerable:r,value:e})}})}var lt=`~constantCatch`;function ut(e){let t=()=>e;return t[lt]=!0,t}var dt,ft={value:void 0,enumerable:!1},pt=`captureStackTrace`in Error?Error:null;function mt(e){let t=pt;if(t){let n=t.stackTraceLimit;if(typeof n==`number`){try{t.stackTraceLimit=0}catch{return pt=null,new e}try{return new e}finally{t.stackTraceLimit=n}}}return new e}function C(e,t,n,r){let i={};function a(e){this.def=e,this.constr=d,this.traits=new Set}a.prototype=i;let o=n,s=o&&new WeakSet;function c(n,r){if(!n._zod){ft.value=new a(r);try{Object.defineProperty(n,"_zod",ft)}finally{ft.value=void 0}}else if(n._zod.traits.has(e))return;if(n._zod.traits.add(e),t(n,r),s){let e=Object.getPrototypeOf(n),t=n._zod.constr.prototype,r=e;for(;r&&r!==t;)r=Object.getPrototypeOf(r);let i=r??e;s.has(i)||(s.add(i),$e(i,o))}let i=d.prototype;for(let e in i)Object.prototype.hasOwnProperty.call(i,e)&&(e in n||(n[e]=i[e].bind(n)))}let l=r?.Parent??Object;class u extends l{}Object.defineProperty(u,"name",{value:e});function d(e){let t=r?.Parent?mt(u):this;c(t,e);let n=t._zod.deferred;if(n){for(let e of n)e();t._zod.deferred=void 0}let i=globalThis.__zod_globalConfig?.postProcessor;return i&&i(t),t}return Object.defineProperty(d,"init",{value:c}),Object.defineProperty(d,Symbol.hasInstance,{value:t=>r?.Parent&&t instanceof r.Parent?!0:t?._zod?.traits?.has(e)}),Object.defineProperty(d,"name",{value:e}),d}var ht=class extends Error{constructor(){super(`Encountered Promise during synchronous parse. Use .parseAsync() instead.`)}},gt=class extends Error{constructor(e){super(`Encountered unidirectional transform during encode: ${e}`),this.name=`ZodEncodeError`}};(dt=globalThis).__zod_globalConfig??(dt.__zod_globalConfig={});var _t=globalThis.__zod_globalConfig;function vt(e){return e&&Object.assign(_t,e),_t}function yt(){let e=this._zod;return e.message??=JSON.stringify(e.def,ie,2),e.message}function bt(e){this._zod.message=e}var xt={get:yt,set:bt,enumerable:!0,configurable:!0},St={value:void 0,enumerable:!1},Ct=new WeakSet([Object.prototype,Error.prototype]),wt=(e,t)=>{e.name=`$ZodError`,St.value=t,Object.defineProperty(e,"issues",St),St.value=void 0,Object.defineProperty(e,"message",xt);let n=Object.getPrototypeOf(e);Ct.has(n)||(Ct.add(n),Object.defineProperty(n,"toString",{configurable:!0,enumerable:!1,get(){let e=()=>this.message;return Object.defineProperty(this,"toString",{value:e,configurable:!0,writable:!0}),e},set(e){Object.defineProperty(this,"toString",{value:e,configurable:!0,writable:!0})}}))},Tt=C(`$ZodError`,wt);C(`$ZodError`,wt,void 0,{Parent:Error});function Et(e,t,n){return Object.prototype.hasOwnProperty.call(e,t)||(t===`__proto__`?Object.defineProperty(e,t,{value:n(),writable:!0,enumerable:!0,configurable:!0}):e[t]=n()),e[t]}function Dt(e,t=e=>e.message){let n={},r=[];for(let i of e.issues)i.path.length>0?Et(n,i.path[0],()=>[]).push(t(i)):r.push(t(i));return{formErrors:r,fieldErrors:n}}function Ot(e,t=e=>e.message){let n={_errors:[]},r=(e,i=[])=>{for(let a of e.issues)if(a.code===`invalid_union`&&a.errors.length)a.errors.map(e=>r({issues:e},[...i,...a.path]));else if(a.code===`invalid_key`)r({issues:a.issues},[...i,...a.path]);else if(a.code===`invalid_element`)r({issues:a.issues},[...i,...a.path]);else{let e=[...i,...a.path];if(e.length===0)n._errors.push(t(a));else{let r=n,i=0;for(;i<e.length;){let n=e[i],o=i===e.length-1;if(n===`_errors`){o&&r._errors.push(t(a)),i++;continue}Object.prototype.hasOwnProperty.call(r,n)||Object.defineProperty(r,n,{value:{_errors:[]},enumerable:!0,writable:!0,configurable:!0});let s=r[n];o&&s._errors.push(t(a)),r=s,i++}}}};return r(e),n}function kt(e,t){return{callee:t?.callee??e,Err:t?.Err}}var At=e=>{let t=(n,r,i,a)=>{let o=i?{...i,async:!1}:{async:!1},s=n._zod.run({value:r,issues:[]},o);if(s instanceof Promise)throw new ht;if(s.issues.length){let n=new((a?.Err)??e)(s.issues.map(e=>qe(e,o,vt())));throw be(n,a?.callee??t),n}return s.value};return t},jt=e=>{let t=async(n,r,i,a)=>{let o=i?{...i,async:!0}:{async:!0},s=n._zod.run({value:r,issues:[]},o);if(s instanceof Promise&&(s=await s),s.issues.length){let n=new((a?.Err)??e)(s.issues.map(e=>qe(e,o,vt())));throw be(n,a?.callee??t),n}return s.value};return t},Mt=e=>(t,n,r)=>{let i=r?{...r,async:!1}:{async:!1},a=t._zod.run({value:n,issues:[]},i);if(a instanceof Promise)throw new ht;return a.issues.length?Nt(e,a.issues,i):{success:!0,data:a.value}};function Nt(e,t,n){let r;return{success:!1,get error(){return r||(r=new e(t.map(e=>qe(e,n,vt()))),t=void 0,n=void 0),r},set error(e){r=e,t=void 0,n=void 0}}}var Pt=e=>async(t,n,r)=>{let i=r?{...r,async:!0}:{async:!0},a=t._zod.run({value:n,issues:[]},i);return a instanceof Promise&&(a=await a),a.issues.length?Nt(e,a.issues,i):{success:!0,data:a.value}},Ft=Symbol.for(`zod.compile.invalid`),It=Symbol.for(`zod.compile.fallback`),Lt=((e,t,n)=>{let r=e._zod.bag.validator;if(r!==void 0){if(r(t)!==Ft)return!0;if(r.definite===!0&&n===void 0)return!1}return Rt(e,t,n)});function Rt(e,t,n){let r=n?{...n,async:!1,abortEarly:!0}:{async:!1,abortEarly:!0},i=e._zod.bag.fallbackRun,a;if(i?(r[It]=!0,a=i({value:t,issues:[]},r)):a=e._zod.run({value:t,issues:[]},r),a instanceof Promise)throw new ht;return a.issues.length===0}var zt=async(e,t,n)=>{let r=n?{...n,async:!0,abortEarly:!0}:{async:!0,abortEarly:!0},i=e._zod.run({value:t,issues:[]},r);return i instanceof Promise&&(i=await i),i.issues.length===0},Bt=e=>{let t=At(e),n=(e,r,i,a)=>{let o=i?{...i,direction:`backward`}:{direction:`backward`};return t(e,r,o,kt(n,a))};return n},Vt=e=>{let t=At(e),n=(e,r,i,a)=>t(e,r,i,kt(n,a));return n},Ht=e=>{let t=jt(e),n=async(e,r,i,a)=>{let o=i?{...i,direction:`backward`}:{direction:`backward`};return await t(e,r,o,kt(n,a))};return n},Ut=e=>{let t=jt(e),n=async(e,r,i,a)=>await t(e,r,i,kt(n,a));return n},Wt=e=>(t,n,r)=>{let i=r?{...r,direction:`backward`}:{direction:`backward`};return Mt(e)(t,n,i)},Gt=e=>(t,n,r)=>Mt(e)(t,n,r),Kt=e=>async(t,n,r)=>{let i=r?{...r,direction:`backward`}:{direction:`backward`};return Pt(e)(t,n,i)},qt=e=>async(t,n,r)=>Pt(e)(t,n,r),Jt=/^[cC][0-9a-z]{6,}$/,Yt=/^[0-9a-z]+$/,Xt=/^[0-7][0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{25}$/,Zt=/^[0-9a-vA-V]{20}$/,Qt=/^[A-Za-z0-9]{27}$/,$t=/^[a-zA-Z0-9_-]{21}$/;function en(e){return RegExp(`^[a-zA-Z0-9_-]{${e}}$`)}var tn=/^P(?:(\d+W)|(?!.*W)(?=\d|T\d)(\d+Y)?(\d+M)?(\d+D)?(T(?=\d)(\d+H)?(\d+M)?(\d+([.,]\d+)?S)?)?)$/,nn=/^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$/,rn=e=>e?RegExp(`^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-${e}[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$`):/^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/,an=/^(?:[A-Za-z0-9_'+\-]+\.)*[A-Za-z0-9_'+\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$/,on=`^(?=[\\s\\S]*[\\p{Extended_Pictographic}\\p{Regional_Indicator}\\u20E3])[\\p{Extended_Pictographic}\\p{Emoji_Component}]+$`;function sn(){return new RegExp(on,`u`)}var cn=/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/,ln=/^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))$/,un=/^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/([0-9]|[1-2][0-9]|3[0-2])$/,dn=/^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/,fn=/^$|^(?:[0-9a-zA-Z+/]{4})*(?:(?:[0-9a-zA-Z+/]{2}==)|(?:[0-9a-zA-Z+/]{3}=))?$/,pn=/^(?:[A-Za-z0-9_-]{4})*(?:[A-Za-z0-9_-]{2,3})?$/,mn=/^https?$/,hn=/^\+[1-9]\d{6,14}$/,gn=`(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))`;function _n(e){return RegExp(`^${e}$`)}var vn=_n(gn);function yn(e){let t=`(?:[01]\\d|2[0-3]):[0-5]\\d`;return typeof e.precision==`number`?e.precision===-1?`${t}`:e.precision===0?`${t}:[0-5]\\d`:`${t}:[0-5]\\d\\.\\d{${e.precision}}`:e.seconds?`${t}:[0-5]\\d(?:\\.\\d+)?`:`${t}(?::[0-5]\\d(?:\\.\\d+)?)?`}function bn(e){return RegExp(`^${yn(e)}$`)}function xn(e){let t=[`Z`];e.offset&&t.push(`([+-](?:[01]\\d|2[0-3]):[0-5]\\d)`);let n=`${yn({precision:e.precision,seconds:!0})}(?:${t.join(`|`)})`,r=e.local?`${n}|${yn({precision:e.precision})}`:n;return RegExp(`^${gn}T(?:${r})$`)}var Sn=/^[\s\S]{0,}$/,Cn=/^-?\d+$/,wn=/^-?\d+(?:\.\d+)?$/,Tn=/^(?:true|false)$/i,En=/^[^A-Z]*$/,Dn=/^[^a-z]*$/,On=C(`$ZodCheck`,(e,t)=>{var n;e._zod??={},e._zod.def=t,(n=e._zod).onattach??(n.onattach=[])}),kn=e=>{let t=e.value;return!se(t)&&t.length!==void 0},An={number:`number`,bigint:`bigint`,object:`date`},jn=C(`$ZodCheckLessThan`,(e,t)=>{On.init(e,t);let n=An[typeof t.value];e._zod.check=r=>{(t.inclusive?r.value<=t.value:r.value<t.value)||r.issues.push({origin:An[typeof r.value]??n,code:`too_big`,maximum:typeof t.value==`object`?t.value.getTime():t.value,input:r.value,inclusive:t.inclusive,inst:e,continue:!t.abort})}}),Mn=C(`$ZodCheckGreaterThan`,(e,t)=>{On.init(e,t);let n=An[typeof t.value];e._zod.check=r=>{(t.inclusive?r.value>=t.value:r.value>t.value)||r.issues.push({origin:An[typeof r.value]??n,code:`too_small`,minimum:typeof t.value==`object`?t.value.getTime():t.value,input:r.value,inclusive:t.inclusive,inst:e,continue:!t.abort})}}),Nn=C(`$ZodCheckMultipleOf`,(e,t)=>{On.init(e,t),e._zod.check=n=>{if(typeof n.value!=typeof t.value)throw Error(`Cannot mix number and bigint in multiple_of check.`);(typeof n.value==`bigint`?t.value!==BigInt(0)&&n.value%t.value===BigInt(0):le(n.value,t.value)===0)||n.issues.push({origin:typeof n.value,code:`not_multiple_of`,divisor:t.value,input:n.value,inst:e,continue:!t.abort})}}),Pn=C(`$ZodCheckNumberFormat`,(e,t)=>{On.init(e,t),t.format=t.format||`float64`;let n=t.format?.includes(`int`),r=n?`int`:`number`,[i,a]=Ae[t.format];e._zod.check=o=>{let s=o.value;if(n){if(!Number.isInteger(s)){o.issues.push({expected:r,format:t.format,code:`invalid_type`,continue:!1,input:s,inst:e});return}if(!Number.isSafeInteger(s)){s>0?o.issues.push({input:s,code:`too_big`,maximum:2**53-1,note:`Integers must be within the safe integer range.`,inst:e,origin:r,inclusive:!0,continue:!t.abort}):o.issues.push({input:s,code:`too_small`,minimum:-(2**53-1),note:`Integers must be within the safe integer range.`,inst:e,origin:r,inclusive:!0,continue:!t.abort});return}}s<i&&o.issues.push({origin:`number`,input:s,code:`too_small`,minimum:i,inclusive:!0,inst:e,continue:!t.abort}),s>a&&o.issues.push({origin:`number`,input:s,code:`too_big`,maximum:a,inclusive:!0,inst:e,continue:!t.abort})}}),Fn=C(`$ZodCheckMaxLength`,(e,t)=>{var n;On.init(e,t),(n=e._zod.def).when??(n.when=kn),e._zod.check=n=>{let r=n.value,i=r.length;if((typeof r==`string`&&i>t.maximum?Ye(r):i)<=t.maximum)return;let a=Xe(r);n.issues.push({origin:a,code:`too_big`,maximum:t.maximum,inclusive:!0,input:r,inst:e,continue:!t.abort})}}),In=C(`$ZodCheckMinLength`,(e,t)=>{var n;On.init(e,t),(n=e._zod.def).when??(n.when=kn),e._zod.check=n=>{let r=n.value,i=r.length;if((typeof r==`string`&&i>=t.minimum&&i<t.minimum*2?Ye(r):i)>=t.minimum)return;let a=Xe(r);n.issues.push({origin:a,code:`too_small`,minimum:t.minimum,inclusive:!0,input:r,inst:e,continue:!t.abort})}}),Ln=C(`$ZodCheckLengthEquals`,(e,t)=>{var n;On.init(e,t),(n=e._zod.def).when??(n.when=kn),e._zod.check=n=>{let r=n.value,i=r.length,a=typeof r==`string`&&i>=t.length&&i<=t.length*2?Ye(r):i;if(a===t.length)return;let o=Xe(r),s=a>t.length;n.issues.push({origin:o,...s?{code:`too_big`,maximum:t.length}:{code:`too_small`,minimum:t.length},inclusive:!0,exact:!0,input:n.value,inst:e,continue:!t.abort})}}),Rn=C(`$ZodCheckStringFormat`,(e,t)=>{var n,r;On.init(e,t),t.pattern?(n=e._zod).check??(n.check=n=>{t.pattern.lastIndex=0,!t.pattern.test(n.value)&&n.issues.push({origin:`string`,code:`invalid_format`,format:t.format,input:n.value,...t.pattern?{pattern:t.pattern.toString()}:{},inst:e,continue:!t.abort})}):(r=e._zod).check??(r.check=()=>{})}),zn=C(`$ZodCheckRegex`,(e,t)=>{Rn.init(e,t),e._zod.check=n=>{t.pattern.lastIndex=0,!t.pattern.test(n.value)&&n.issues.push({origin:`string`,code:`invalid_format`,format:`regex`,input:n.value,pattern:t.pattern.toString(),inst:e,continue:!t.abort})}}),Bn=C(`$ZodCheckLowerCase`,(e,t)=>{t.pattern??=En,Rn.init(e,t)}),Vn=C(`$ZodCheckUpperCase`,(e,t)=>{t.pattern??=Dn,Rn.init(e,t)}),Hn=C(`$ZodCheckIncludes`,(e,t)=>{On.init(e,t);let n=Ee(t.includes);t.pattern=new RegExp(typeof t.position==`number`?`^.{${t.position},}${n}`:n),e._zod.check=n=>{n.value.includes(t.includes,t.position)||n.issues.push({origin:`string`,code:`invalid_format`,format:`includes`,includes:t.includes,input:n.value,inst:e,continue:!t.abort})}}),Un=C(`$ZodCheckStartsWith`,(e,t)=>{On.init(e,t);let n=RegExp(`^${Ee(t.prefix)}.*`);t.pattern??=n,e._zod.check=n=>{n.value.startsWith(t.prefix)||n.issues.push({origin:`string`,code:`invalid_format`,format:`starts_with`,prefix:t.prefix,input:n.value,inst:e,continue:!t.abort})}}),Wn=C(`$ZodCheckEndsWith`,(e,t)=>{On.init(e,t);let n=RegExp(`.*${Ee(t.suffix)}$`);t.pattern??=n,e._zod.check=n=>{n.value.endsWith(t.suffix)||n.issues.push({origin:`string`,code:`invalid_format`,format:`ends_with`,suffix:t.suffix,input:n.value,inst:e,continue:!t.abort})}}),Gn=C(`$ZodCheckOverwrite`,(e,t)=>{On.init(e,t),e._zod.check=e=>{e.value=t.tx(e.value)}}),Kn=class{constructor(e=[],t={}){this.content=[],this.indent=0,this.args=e,this.closed=t}indented(e){this.indent+=1;try{e(this)}finally{--this.indent}}write(e){if(typeof e==`function`){e(this,{execution:`sync`}),e(this,{execution:`async`});return}let t=e.split(`
|
|
3
3
|
`).filter(e=>e),n=Math.min(...t.map(e=>e.length-e.trimStart().length)),r=t.map(e=>e.slice(n)).map(e=>` `.repeat(this.indent*2)+e);for(let e of r)this.content.push(e)}compile(){let e=Function,t=this?.content??[``];return new e(...Object.keys(this.closed),`return function (${this.args.join(`, `)}) {\n${t.join(`
|
|
4
4
|
`)}\n};`)(...Object.values(this.closed))}},qn={major:4,minor:6,patch:6},w=C(`$ZodType`,(e,t)=>{var n;e??={},e._zod.def=t,e._zod.bag=e._zod.bag||{},e._zod.version=qn;let r=e._zod.def.checks,i=e._zod.traits.has(`$ZodCheck`)?[e,...r??[]]:r?.length?[...r]:[];for(let t of i)for(let n of t._zod.onattach)n(e);if(i.length===0)(n=e._zod).deferred??(n.deferred=[]),e._zod.deferred?.push(()=>{e._zod.run=e._zod.parse});else{let t=(t,n,r)=>{if(t.memo)return t;let i=Ve(t),a;for(let o of n){if(o._zod.def.when){if(He(t)||!o._zod.def.when(t))continue}else if(i)continue;let n=t.issues.length,s=o._zod.check(t);if(s instanceof Promise&&r?.async===!1)throw new ht;if(a||s instanceof Promise)a=(a??Promise.resolve()).then(async()=>{await s,t.issues.length!==n&&(Ke(t.issues,n,e),i||=Ve(t,n))});else{if(t.issues.length===n)continue;Ke(t.issues,n,e),i||=Ve(t,n)}}return a?a.then(()=>t):t},n=(n,r,a)=>{if(Ve(n))return n.aborted=!0,n;let o=t(r,i,a);if(o instanceof Promise){if(a.async===!1)throw new ht;return o.then(t=>e._zod.parse(t,a))}return e._zod.parse(o,a)};e._zod.run=(r,a)=>{if(a.skipChecks)return e._zod.parse(r,a);if(a.direction===`backward`){let t=e._zod.parse({value:r.value,issues:[]},{...a,skipChecks:!0});return t instanceof Promise?t.then(e=>n(e,r,a)):n(t,r,a)}let o=e._zod.parse(r,a);if(o instanceof Promise){if(a.async===!1)throw new ht;return o.then(e=>t(e,i,a))}return t(o,i,a)}}},{get"~standard"(){return tt(this,`~standard`,Xn(this))},set"~standard"(e){et(this,`~standard`,e)}}),Jn=(e,t)=>e.issues.length?{issues:e.issues.map(e=>qe(e,t,vt()))}:{value:e.value};async function Yn(e,t){let n={async:!0};return Jn(await e._zod.run({value:t,issues:[]},n),n)}function Xn(e){return{validate:t=>{let n={async:!1};try{let r=e._zod.run({value:t,issues:[]},n);if(!(r instanceof Promise))return Jn(r,n)}catch{}return Yn(e,t)},vendor:`zod`,version:1}}var Zn=C(`$ZodString`,(e,t)=>{w.init(e,t),e._zod.pattern=t.pattern??Sn,e._zod.parse=(n,r)=>{if(t.coerce)try{n.value=String(n.value)}catch{}return typeof n.value==`string`||n.issues.push({expected:`string`,code:`invalid_type`,input:n.value,inst:e}),n}}),T=C(`$ZodStringFormat`,(e,t)=>{Rn.init(e,t),Zn.init(e,t)}),Qn=C(`$ZodGUID`,(e,t)=>{t.pattern??=nn,T.init(e,t)}),$n=C(`$ZodUUID`,(e,t)=>{if(t.version){let e={v1:1,v2:2,v3:3,v4:4,v5:5,v6:6,v7:7,v8:8}[t.version];if(e===void 0)throw Error(`Invalid UUID version: "${t.version}"`);t.pattern??=rn(e)}else t.pattern??=rn();T.init(e,t)}),er=C(`$ZodEmail`,(e,t)=>{t.pattern??=an,T.init(e,t)});function tr(e){try{return typeof URL<`u`&&typeof URL.canParse==`function`?URL.canParse(e):(new URL(e),!0)}catch{return!1}}function nr(e,t){return!(`normalize`in t)&&!(`hostname`in t)&&!(`protocol`in t)?tr(e)||2:rr(e,t)}function rr(e,t){if(!t.normalize&&t.protocol?.source===mn.source&&!/^https?:\/\//i.test(e))return 1;try{if(typeof URL<`u`){let t=URL;if(typeof t.parse==`function`)return t.parse(e)??2}return new URL(e)}catch{return 2}}var ir=/[\t\n\r]/g;function ar(e){return e.replace(ir,``)}function or(e,t){return t.lastIndex=0,t.test(e.hostname)}function sr(e,t){return t.lastIndex=0,t.test(e.protocol.endsWith(`:`)?e.protocol.slice(0,-1):e.protocol)}var cr=C(`$ZodURL`,(e,t)=>{T.init(e,t),e._zod.check=n=>{try{let r=n.value.trim(),i=nr(r,t);if(i===1){n.issues.push({code:`invalid_format`,format:`url`,note:`Invalid URL format`,input:n.value,inst:e,continue:!t.abort});return}if(i===2){n.issues.push({code:`invalid_format`,format:`url`,input:n.value,inst:e,continue:!t.abort});return}if(i===!0){n.value=ar(r);return}t.hostname&&!or(i,t.hostname)&&n.issues.push({code:`invalid_format`,format:`url`,note:`Invalid hostname`,pattern:t.hostname.source,input:n.value,inst:e,continue:!t.abort}),t.protocol&&!sr(i,t.protocol)&&n.issues.push({code:`invalid_format`,format:`url`,note:`Invalid protocol`,pattern:t.protocol.source,input:n.value,inst:e,continue:!t.abort}),n.value=t.normalize?i.href:ar(r);return}catch{n.issues.push({code:`invalid_format`,format:`url`,input:n.value,inst:e,continue:!t.abort})}}}),lr=C(`$ZodEmoji`,(e,t)=>{t.pattern??=sn(),T.init(e,t)}),ur=C(`$ZodNanoID`,(e,t)=>{if(t.length!==void 0&&(!Number.isInteger(t.length)||t.length<1))throw Error(`Invalid nanoid length: ${t.length}`);t.pattern??=t.length===void 0?$t:en(t.length),T.init(e,t)}),dr=C(`$ZodCUID`,(e,t)=>{t.pattern??=Jt,T.init(e,t)}),fr=C(`$ZodCUID2`,(e,t)=>{t.pattern??=Yt,T.init(e,t)}),pr=C(`$ZodULID`,(e,t)=>{t.pattern??=Xt,T.init(e,t)}),mr=C(`$ZodXID`,(e,t)=>{t.pattern??=Zt,T.init(e,t)}),hr=C(`$ZodKSUID`,(e,t)=>{t.pattern??=Qt,T.init(e,t)}),gr=C(`$ZodISODateTime`,(e,t)=>{t.pattern??=xn(t),T.init(e,t)}),_r=C(`$ZodISODate`,(e,t)=>{t.pattern??=vn,T.init(e,t)}),vr=C(`$ZodISOTime`,(e,t)=>{t.pattern??=bn(t),T.init(e,t)}),yr=C(`$ZodISODuration`,(e,t)=>{t.pattern??=tn,T.init(e,t)}),br=C(`$ZodIPv4`,(e,t)=>{t.pattern??=cn,T.init(e,t)}),xr=/^[0-9a-fA-F:.]+$/;function Sr(e){return xr.test(e)?tr(`http://[${e}]`):!1}var Cr=C(`$ZodIPv6`,(e,t)=>{t.pattern??=ln,T.init(e,t),e._zod.check=n=>{Sr(n.value)||n.issues.push({code:`invalid_format`,format:`ipv6`,input:n.value,inst:e,continue:!t.abort})}}),wr=C(`$ZodCIDRv4`,(e,t)=>{t.pattern??=un,T.init(e,t)});function Tr(e){let t=e.split(`/`);if(t.length!==2)return!1;let[n,r]=t;if(!r)return!1;let i=Number(r);return`${i}`!==r||i<0||i>128?!1:Sr(n)}var Er=C(`$ZodCIDRv6`,(e,t)=>{t.pattern??=dn,T.init(e,t),e._zod.check=n=>{Tr(n.value)||n.issues.push({code:`invalid_format`,format:`cidrv6`,input:n.value,inst:e,continue:!t.abort})}});function Dr(e){if(e===``)return!0;if(/\s/.test(e)||e.length%4!=0)return!1;try{return atob(e),!0}catch{return!1}}var Or=/^[0-9a-zA-Z+/]*={0,2}$/,kr=C(`$ZodBase64`,(e,t)=>{t.pattern??=Or,T.init(e,t),e._zod.check=n=>{Dr(n.value)||n.issues.push({code:`invalid_format`,format:`base64`,input:n.value,inst:e,continue:!t.abort})}}),Ar=/^[A-Za-z0-9_-]*$/;function jr(e){if(!Ar.test(e))return!1;let t=e.replace(/[-_]/g,e=>e===`-`?`+`:`/`);return Dr(t.padEnd(Math.ceil(t.length/4)*4,`=`))}var Mr=C(`$ZodBase64URL`,(e,t)=>{t.pattern??=Ar,T.init(e,t),e._zod.check=n=>{jr(n.value)||n.issues.push({code:`invalid_format`,format:`base64url`,input:n.value,inst:e,continue:!t.abort})}}),Nr=C(`$ZodE164`,(e,t)=>{t.pattern??=hn,T.init(e,t)});function Pr(e,t=null){try{let n=e.split(`.`);if(n.length!==3)return!1;let[r]=n;if(!r)return!1;let i=JSON.parse(atob(r));return!(`typ`in i&&i?.typ!==`JWT`||!i.alg||t&&(!(`alg`in i)||i.alg!==t))}catch{return!1}}var Fr=C(`$ZodJWT`,(e,t)=>{T.init(e,t),e._zod.check=n=>{Pr(n.value,t.alg)||n.issues.push({code:`invalid_format`,format:`jwt`,input:n.value,inst:e,continue:!t.abort})}}),Ir=C(`$ZodNumber`,(e,t)=>{w.init(e,t),e._zod.pattern=wn,e._zod.parse=(n,r)=>{if(t.coerce)try{n.value=Number(n.value)}catch{}let i=n.value;if(typeof i==`number`&&!Number.isNaN(i)&&Number.isFinite(i))return n;let a=typeof i==`number`?Number.isNaN(i)?`NaN`:Number.isFinite(i)?void 0:String(i):void 0;return n.issues.push({expected:`number`,code:`invalid_type`,input:i,inst:e,...a?{received:a}:{}}),n}}),Lr=C(`$ZodNumberFormat`,(e,t)=>{Pn.init(e,t),Ir.init(e,t)}),Rr=C(`$ZodBoolean`,(e,t)=>{w.init(e,t),e._zod.pattern=Tn,e._zod.parse=(n,r)=>{if(t.coerce)try{n.value=!!n.value}catch{}let i=n.value;return typeof i==`boolean`||n.issues.push({expected:`boolean`,code:`invalid_type`,input:i,inst:e}),n}}),zr=C(`$ZodUnknown`,(e,t)=>{w.init(e,t),e._zod.parse=e=>e}),Br=C(`$ZodNever`,(e,t)=>{w.init(e,t),e._zod.parse=(t,n)=>(t.issues.push({expected:`never`,code:`invalid_type`,input:t.value,inst:e}),t)});function Vr(e,t){let n=Ge(e._zod.def.checks);if(!n.length)return;let r=Math.min(...n.map(e=>e[0])),i=e._zod.parse;e._zod.parse=(n,a)=>{let o=t(n.value);if(o>r&&!a?.skipChecks&&a?.direction!==`backward`){for(let[t,r]of Ge(e._zod.def.checks))if(o>t&&r._zod.def.when(n)){let t=n.issues.length;return r._zod.check(n),n.issues[t].continue=!1,Ke(n.issues,t,e),n}}return i(n,a)}}var Hr=e=>Array.isArray(e)?e.length:-1;function Ur(e,t,n){e.issues.length&&t.issues.push(...Ue(n,e.issues)),t.value[n]=e.value}var Wr=C(`$ZodArray`,(e,t)=>{w.init(e,t);let n=_t.memoizer;n?.attach(e),e._zod.parse=(r,i)=>{let a=r.value;if(!Array.isArray(a))return r.issues.push({expected:`array`,code:`invalid_type`,input:a,inst:e}),r;r.value=n?n.alloc(e,r,Array(a.length),i):Array(a.length);let o=[],s=i?.abortEarly;for(let e=0;e<a.length;e++){let n=a[e],c=t.element._zod.run({value:n,issues:[]},i);if(c instanceof Promise)o.push(c.then(t=>Ur(t,r,e)));else if(Ur(c,r,e),s&&c.issues.length!==0&&Ve(c))break}return o.length?Promise.all(o).then(()=>r):r},Vr(e,Hr)});function Gr(e,t,n,r,i,a){let o=n in r,s=a===`optional`;if(o||!s||i!==`optional`){if(e.issues.length){if(i!==void 0&&s&&!o)return;t.issues.push(...Ue(n,e.issues))}if(!o&&i===void 0){e.issues.length||t.issues.push({code:`invalid_type`,expected:`nonoptional`,input:void 0,path:[n]});return}e.value===void 0?(o||i===`defaulted`&&!s)&&(t.value[n]=void 0):t.value[n]=e.value}}var Kr=[];function qr(e){let t=Object.keys(e.shape),n=Object.getOwnPropertySymbols(e.shape),r=n.length?n:Kr,i=r.length?[...t,...r]:t;for(let t of i)if(!e.shape?.[t]?._zod?.traits?.has(`$ZodType`))throw Error(`Invalid element at key "${String(t)}": expected a Zod schema`);let a=ke(e.shape);return{...e,allKeys:i,symbolKeys:r,keySet:new Set(t),numKeys:t.length,optionalKeys:new Set(a)}}function Jr(e,t,n,r,i,a,o){let s=[],c=i.keySet,l=i.catchall._zod,u=l.def.type,d=l.optin,f=l.optout,p=0;for(let i in t){if(o&&n.issues.length!==p){if(Ve(n,p))break;p=n.issues.length}if(c.has(i))continue;if(i===`__proto__`){u===`never`&&s.push(i);continue}if(u===`never`){s.push(i);continue}let a=l.run({value:t[i],issues:[]},r);a instanceof Promise?e.push(a.then(e=>Gr(e,n,i,t,d,f))):Gr(a,n,i,t,d,f)}return s.length&&n.issues.push({code:`unrecognized_keys`,keys:s,input:t,inst:a,continue:!0}),e.length?Promise.all(e).then(()=>n):n}var Yr=C(`$ZodObject`,(e,t)=>{w.init(e,t);let n=Object.getOwnPropertyDescriptor(t,`shape`),r=n?.get?n.get.raw:t.shape??{};if(r){let e=()=>{let n={...r};return Object.defineProperty(t,"shape",{value:n}),e.raw=n,n};e.raw=r,Object.defineProperty(t,"shape",{get:e})}let i=oe(()=>qr(t));S(e,`propValues`,e=>{let t=e.def.shape,n={};for(let e in t){let r=t[e]._zod;if(r.values){Object.prototype.hasOwnProperty.call(n,e)||ue(n,e,new Set);for(let t of r.values)n[e].add(t);r.optin!==void 0&&n[e].add(void 0)}}return n});let a=xe,o=t.catchall,s,c=_t.memoizer;c?.attach(e),e._zod.parse=(t,n)=>{s??=i.value;let r=t.value;if(!a(r))return t.issues.push({expected:`object`,code:`invalid_type`,input:r,inst:e}),t;t.value=c?c.alloc(e,t,{},n):{};let l=[],u=s.shape,d=n?.abortEarly,f=t.issues.length;for(let e of s.allKeys){if(d&&t.issues.length!==f){if(Ve(t,f))break;f=t.issues.length}if(e===`__proto__`)continue;let i=u[e],a=i._zod.optin,o=i._zod.optout,s=i._zod.run({value:r[e],issues:[]},n);s instanceof Promise?l.push(s.then(n=>Gr(n,t,e,r,a,o))):Gr(s,t,e,r,a,o)}return o?Jr(l,r,t,n,i.value,e,d===!0):l.length?Promise.all(l).then(()=>t):t}}),Xr=C(`$ZodObjectJIT`,(e,t)=>{Yr.init(e,t);let n=e._zod.parse,r=oe(()=>qr(t)),i=_t.memoizer,a=t=>{let n=r.value,a=n.symbolKeys,o=new Kn([`payload`,`ctx`],{shape:t,inst:e,memo:i,syms:a}),s=e=>`shape[${e}]._zod.run({ value: input[${e}], issues: [] }, ctx)`,c=(e,t)=>`
|
|
@@ -231,4 +231,4 @@ $&`).replace(/(?:^|\n)([\t ].*)(?:([\n\t ]*)\n(?![\n\t ]))?/g,`$1$2`).replace(/\
|
|
|
231
231
|
`,e)+1}yield*this.pop();break;default:yield*this.pop(),yield*this.step()}}*blockMap(e){let t=e.items[e.items.length-1];switch(this.type){case`newline`:if(this.onKeyLine=!1,t.value){let n=`end`in t.value?t.value.end:void 0;(Array.isArray(n)?n[n.length-1]:void 0)?.type===`comment`?n?.push(this.sourceToken):e.items.push({start:[this.sourceToken]})}else t.sep?t.sep.push(this.sourceToken):t.start.push(this.sourceToken);return;case`space`:case`comment`:if(t.value)e.items.push({start:[this.sourceToken]});else if(t.sep)t.sep.push(this.sourceToken);else{if(this.atIndentedComment(t.start,e.indent)){let n=e.items[e.items.length-2]?.value?.end;if(Array.isArray(n)){Qg(n,t.start),n.push(this.sourceToken),e.items.pop();return}}t.start.push(this.sourceToken)}return}if(this.indent>=e.indent){let n=!this.onKeyLine&&this.indent===e.indent,r=n&&(t.sep||t.explicitKey)&&this.type!==`seq-item-ind`,i=[];if(r&&t.sep&&!t.value){let n=[];for(let r=0;r<t.sep.length;++r){let i=t.sep[r];switch(i.type){case`newline`:n.push(r);break;case`space`:break;case`comment`:i.indent>e.indent&&(n.length=0);break;default:n.length=0}}n.length>=2&&(i=t.sep.splice(n[1]))}switch(this.type){case`anchor`:case`tag`:r||t.value?(i.push(this.sourceToken),e.items.push({start:i}),this.onKeyLine=!0):t.sep?t.sep.push(this.sourceToken):t.start.push(this.sourceToken);return;case`explicit-key-ind`:!t.sep&&!t.explicitKey?(t.start.push(this.sourceToken),t.explicitKey=!0):r||t.value?(i.push(this.sourceToken),e.items.push({start:i,explicitKey:!0})):this.stack.push({type:`block-map`,offset:this.offset,indent:this.indent,items:[{start:[this.sourceToken],explicitKey:!0}]}),this.onKeyLine=!0;return;case`map-value-ind`:if(t.explicitKey){if(!t.sep){if(qg(t.start,`newline`))Object.assign(t,{key:null,sep:[this.sourceToken]});else{let e=Zg(t.start);this.stack.push({type:`block-map`,offset:this.offset,indent:this.indent,items:[{start:e,key:null,sep:[this.sourceToken]}]})}}else if(t.value)e.items.push({start:[],key:null,sep:[this.sourceToken]});else if(qg(t.sep,`map-value-ind`))this.stack.push({type:`block-map`,offset:this.offset,indent:this.indent,items:[{start:i,key:null,sep:[this.sourceToken]}]});else if(Yg(t.key)&&!qg(t.sep,`newline`)){let e=Zg(t.start),n=t.key,r=t.sep;r.push(this.sourceToken),delete t.key,delete t.sep,this.stack.push({type:`block-map`,offset:this.offset,indent:this.indent,items:[{start:e,key:n,sep:r}]})}else i.length>0?t.sep=t.sep.concat(i,this.sourceToken):t.sep.push(this.sourceToken)}else t.sep?t.value||r?e.items.push({start:i,key:null,sep:[this.sourceToken]}):qg(t.sep,`map-value-ind`)?this.stack.push({type:`block-map`,offset:this.offset,indent:this.indent,items:[{start:[],key:null,sep:[this.sourceToken]}]}):t.sep.push(this.sourceToken):Object.assign(t,{key:null,sep:[this.sourceToken]});this.onKeyLine=!0;return;case`alias`:case`scalar`:case`single-quoted-scalar`:case`double-quoted-scalar`:{let n=this.flowScalar(this.type);r||t.value?(e.items.push({start:i,key:n,sep:[]}),this.onKeyLine=!0):t.sep?this.stack.push(n):(Object.assign(t,{key:n,sep:[]}),this.onKeyLine=!0);return}default:{let r=this.startBlockValue(e);if(r){if(r.type===`block-seq`){if(!t.explicitKey&&t.sep&&!qg(t.sep,`newline`)){yield*this.pop({type:`error`,offset:this.offset,message:`Unexpected block-seq-ind on same line with key`,source:this.source});return}}else n&&e.items.push({start:i});this.stack.push(r);return}}}}yield*this.pop(),yield*this.step()}*blockSequence(e){let t=e.items[e.items.length-1];switch(this.type){case`newline`:if(t.value){let n=`end`in t.value?t.value.end:void 0;(Array.isArray(n)?n[n.length-1]:void 0)?.type===`comment`?n?.push(this.sourceToken):e.items.push({start:[this.sourceToken]})}else t.start.push(this.sourceToken);return;case`space`:case`comment`:if(t.value)e.items.push({start:[this.sourceToken]});else{if(this.atIndentedComment(t.start,e.indent)){let n=e.items[e.items.length-2]?.value?.end;if(Array.isArray(n)){Qg(n,t.start),n.push(this.sourceToken),e.items.pop();return}}t.start.push(this.sourceToken)}return;case`anchor`:case`tag`:if(t.value||this.indent<=e.indent)break;t.start.push(this.sourceToken);return;case`seq-item-ind`:if(this.indent!==e.indent)break;t.value||qg(t.start,`seq-item-ind`)?e.items.push({start:[this.sourceToken]}):t.start.push(this.sourceToken);return}if(this.indent>e.indent){let t=this.startBlockValue(e);if(t){this.stack.push(t);return}}yield*this.pop(),yield*this.step()}*flowCollection(e){let t=e.items[e.items.length-1];if(this.type===`flow-error-end`){let e;do yield*this.pop(),e=this.peek(1);while(e?.type===`flow-collection`)}else if(e.end.length===0){switch(this.type){case`comma`:case`explicit-key-ind`:!t||t.sep?e.items.push({start:[this.sourceToken]}):t.start.push(this.sourceToken);return;case`map-value-ind`:!t||t.value?e.items.push({start:[],key:null,sep:[this.sourceToken]}):t.sep?t.sep.push(this.sourceToken):Object.assign(t,{key:null,sep:[this.sourceToken]});return;case`space`:case`comment`:case`newline`:case`anchor`:case`tag`:!t||t.value?e.items.push({start:[this.sourceToken]}):t.sep?t.sep.push(this.sourceToken):t.start.push(this.sourceToken);return;case`alias`:case`scalar`:case`single-quoted-scalar`:case`double-quoted-scalar`:{let n=this.flowScalar(this.type);!t||t.value?e.items.push({start:[],key:n,sep:[]}):t.sep?this.stack.push(n):Object.assign(t,{key:n,sep:[]});return}case`flow-map-end`:case`flow-seq-end`:e.end.push(this.sourceToken);return}let n=this.startBlockValue(e);n?this.stack.push(n):(yield*this.pop(),yield*this.step())}else{let t=this.peek(2);if(t.type===`block-map`&&(this.type===`map-value-ind`&&t.indent===e.indent||this.type===`newline`&&!t.items[t.items.length-1].sep))yield*this.pop(),yield*this.step();else if(this.type===`map-value-ind`&&t.type!==`flow-collection`){let n=Zg(Xg(t));$g(e);let r=e.end.splice(1,e.end.length);r.push(this.sourceToken);let i={type:`block-map`,offset:e.offset,indent:e.indent,items:[{start:n,key:e,sep:r}]};this.onKeyLine=!0,this.stack[this.stack.length-1]=i}else yield*this.lineEnd(e)}}flowScalar(e){if(this.onNewLine){let e=this.source.indexOf(`
|
|
232
232
|
`)+1;for(;e!==0;)this.onNewLine(this.offset+e),e=this.source.indexOf(`
|
|
233
233
|
`,e)+1}return{type:e,offset:this.offset,indent:this.indent,source:this.source}}startBlockValue(e){switch(this.type){case`alias`:case`scalar`:case`single-quoted-scalar`:case`double-quoted-scalar`:return this.flowScalar(this.type);case`block-scalar-header`:return{type:`block-scalar`,offset:this.offset,indent:this.indent,props:[this.sourceToken],source:``};case`flow-map-start`:case`flow-seq-start`:return{type:`flow-collection`,offset:this.offset,indent:this.indent,start:this.sourceToken,items:[],end:[]};case`seq-item-ind`:return{type:`block-seq`,offset:this.offset,indent:this.indent,items:[{start:[this.sourceToken]}]};case`explicit-key-ind`:{this.onKeyLine=!0;let t=Zg(Xg(e));return t.push(this.sourceToken),{type:`block-map`,offset:this.offset,indent:this.indent,items:[{start:t,explicitKey:!0}]}}case`map-value-ind`:{this.onKeyLine=!0;let t=Zg(Xg(e));return{type:`block-map`,offset:this.offset,indent:this.indent,items:[{start:t,key:null,sep:[this.sourceToken]}]}}}return null}atIndentedComment(e,t){return this.type!==`comment`||this.indent<=t?!1:e.every(e=>e.type===`newline`||e.type===`space`)}*documentEnd(e){this.type!==`doc-mode`&&(e.end?e.end.push(this.sourceToken):e.end=[this.sourceToken],this.type===`newline`&&(yield*this.pop()))}*lineEnd(e){switch(this.type){case`comma`:case`doc-start`:case`doc-end`:case`flow-seq-end`:case`flow-map-end`:case`map-value-ind`:yield*this.pop(),yield*this.step();break;case`newline`:this.onKeyLine=!1;default:e.end?e.end.push(this.sourceToken):e.end=[this.sourceToken],this.type===`newline`&&(yield*this.pop())}}};function t_(e){let t=e.prettyErrors!==!1;return{lineCounter:e.lineCounter||t&&new Kg||null,prettyErrors:t}}function n_(e,t={}){let{lineCounter:n,prettyErrors:r}=t_(t),i=new e_(n?.addNewLine),a=new Mg(t),o=null;for(let t of a.compose(i.parse(e),!0,e.length))if(!o)o=t;else if(o.options.logLevel!==`silent`){o.errors.push(new Jh(t.range.slice(0,2),`MULTIPLE_DOCS`,`Source contains multiple documents; please use YAML.parseAllDocuments()`));break}return r&&n&&(o.errors.forEach(Xh(e,n)),o.warnings.forEach(Xh(e,n))),o}function r_(e,t,n){let r;typeof t==`function`?r=t:n===void 0&&t&&typeof t==`object`&&(n=t);let i=n_(e,n);if(!i)return null;if(i.warnings.forEach(e=>Em(i.options.logLevel,e)),i.errors.length>0){if(i.options.logLevel!==`silent`)throw i.errors[0];i.errors=[]}return i.toJS(Object.assign({reviver:r},n))}var i_=/^---\r?\n(?:([\s\S]*?)\r?\n)?---[ \t]*(?:\r?\n|$)/;function a_(e,t){let n=i_.exec(e);if(!n)throw Error(`must start with front matter: a line "---", the fields, then another "---".`);let r;try{r=r_(n[1]??``)??{}}catch(e){throw Error(`has front matter that isn't valid YAML (${e.message.split(`
|
|
234
|
-
`)[0]}).`)}if(typeof r!=`object`||!r||Array.isArray(r))throw Error("must have front matter that lists fields, such as `title: My page`.");let{version:i,showFrom:a,hideAfter:o,inLanguage:s,translationOf:c,translatedFrom:l,...u}=r,d=e.slice(n[0].length).replace(/^\r?\n/,``).trimEnd();return{version:i,...a!==void 0&&{showFrom:a},...o!==void 0&&{hideAfter:o},...s!==void 0&&{inLanguage:s},...c!==void 0&&{translationOf:c},...l!==void 0&&{translatedFrom:l},fields:{...u,[t]:d}}}function o_(e){return e===`/`||/^(\/[a-z0-9]+(?:-[a-z0-9]+)*)+$/.test(e)}var s_=M({pages:j(k().refine(o_,`must be a page's address, such as /news`)).optional(),collections:j(k().min(1)).optional(),media:Js().optional(),layout:Js().optional(),menus:Js().optional(),languages:j(k().min(1)).optional()}),c_=M({version:N(1),people:lc(k().min(1),s_).default({}),reviewers:j(k().min(1)).optional()});function l_(e,t){return e.toLowerCase()===t.toLowerCase()}function u_(e,t){if(e&&t)return Object.entries(e.people).find(([e])=>l_(e,t))?.[1]}function d_(e,t){return(e??[]).some(e=>e===`/`||t===e||t.startsWith(`${e}/`))}function f_(e,t){return!e.languages||e.languages.includes(t)}function p_(e,t,n){if(!t)return!0;if(!f_(t,z_(e.settings,n.path)))return!1;let r=n.content?.translationOf;return d_(t.pages,n.path)||r!==void 0&&d_(t.pages,r)}function m_(e,t){return!e||(e.collections??[]).includes(t)}function h_(e,t,n){return!t||m_(t,n.collection)&&f_(t,B_(e.settings,n))}function g_(e){return!e||e.media===!0}function __(e,t,n){return!t||t.layout===!0&&f_(t,n??F_(e.settings))}function v_(e,t,n){return!t||t.menus===!0&&f_(t,n??F_(e.settings))}function y_(e){return`content`in e?e.content:void 0}function b_(e){if(e!==void 0)try{let t=JSON.parse(e);return t&&typeof t==`object`&&!Array.isArray(t)?t:void 0}catch{return}}function x_(e,t){if(t===`content/layout/header.json`||t===`content/layout/footer.json`)return F_(e.settings);let n=/^content\/layout\/(?:header|footer)\.([a-z]{2,3}(?:-[A-Za-z0-9]+)*)\.json$/.exec(t);if(n)return n[1];let r=/^content\/synced-blocks\/[a-z0-9-]+(?:\.([a-z]{2,3}(?:-[A-Za-z0-9]+)*))?\.json$/.exec(t);return r?r[1]??F_(e.settings):void 0}function S_(e,t){let n=rd.safeParse(b_(t));if(!n.success)return;let r=n.data,i=(e,t)=>Dd(e??{})===Dd(t??{}),a=[];i(r.menus,e.menus)||a.push(F_(e.settings));let o=r.languages??{},s=e.languageMenus??{};for(let e of new Set([...Object.keys(o),...Object.keys(s)]))i(o[e],s[e])||a.push(e);return a}function C_(e){if(!e.startsWith(`content/collections/`))return;let[t,n,...r]=e.slice(f.length+1).split(`/`);if(!t||!n||r.length>0||n===`_collection.json`)return;let i=/^(.+)\.(?:json|md)$/.exec(n)?.[1];return i?{collection:t,slug:i}:void 0}function w_(e,t,n){let r=y_(n);if(!e||r===void 0)return;let i=P_(e.settings,t,r);return i.ok?{content:i.value}:void 0}function T_(e,t,n){if(!t)return[];let r=[];for(let i of n){let{path:n}=i;if(n.startsWith(`content/pages/`)&&n.endsWith(`.json`)){let a;try{a=s(n)}catch{r.push({path:n,kind:`other`});continue}let o=e.pages.find(e=>e.file===n),c=b_(y_(i));(!o||p_(e,t,o))&&(`delete`in i||p_(e,t,{path:a,content:{translationOf:typeof c?.translationOf==`string`?c.translationOf:void 0}}))||r.push({path:n,kind:`page`,address:a});continue}let a=C_(n);if(a){let o=e.collections.find(e=>e.id===a.collection),s=o?.entries.find(e=>e.file===n),c=w_(o,n,i);(!m_(t,a.collection)||s&&!h_(e,t,s)||c&&!h_(e,t,{collection:a.collection,content:c.content}))&&r.push({path:n,kind:`entry`,...a});continue}if(n.startsWith(`public/media/`)||n===`content/media.json`||n===`content/media-storage.json`){g_(t)||r.push({path:n,kind:`media`});continue}let o=x_(e,n);if(o!==void 0){__(e,t,o)||r.push({path:n,kind:`layout`});continue}if(n===`content/menus.json`){(`delete`in i?void 0:S_(e,y_(i)))?.every(n=>v_(e,t,n))!==!0&&r.push({path:n,kind:`menus`});continue}r.push({path:n,kind:`other`})}return r}async function E_(e){let t=await e.read(o);if(t===void 0)return;let n=j_(`permissions`,c_,o,t);if(!n.ok)return;let{people:r,reviewers:i}=n.value;return{people:r,...i&&{reviewers:i}}}async function D_(e,t){let n=new Map;for(let{path:e}of t){let t=C_(e);t&&n.set(t.collection,(n.get(t.collection)??new Set).add(e))}let r=[...n.keys()].map(e=>`${f}/${e}/${m}`),i=t.map(e=>e.path).filter(e=>e.startsWith(`content/pages/`)&&e.endsWith(`.json`)),o=await k_(e,[p,...t.some(e=>e.path===`content/menus.json`)?[a]:[],...i,...r,...[...n.values()].flatMap(e=>[...e])]),c=e=>e.ok?e.value:void 0,l=o.get(p),u=l!==void 0&&c(j_(`site`,ed,`content/site.json`,l))||ed.parse({version:1}),d=i.flatMap(e=>{let t=o.get(e),n=t===void 0?void 0:c(j_(`page`,ud,e,t));return n?[{path:s(e),file:e,content:n}]:[]}),h=[...n].flatMap(([e,t])=>{let n=`${f}/${e}/${m}`,r=o.get(n),i=r===void 0?void 0:c(j_(`collection`,vd,n,r));return i?[{id:e,file:n,settings:i,entries:[...t].flatMap(t=>{let n=o.get(t),r=n===void 0?void 0:c(P_(i,t,n)),a=C_(t)?.slug;return r&&a?[{collection:e,slug:a,file:t,content:r}]:[]})}]:[]}),g=o.get(a),_=g===void 0?void 0:c(j_(`menus`,rd,a,g));return{settings:u,pages:d,collections:h,menus:_?.menus??{},..._?.languages&&{languageMenus:_.languages}}}function O_(e,t,{start:n=!0,end:r=!0}={}){let i=0,a=e.length;for(;n&&i<a&&t.includes(e.charAt(i));)i++;for(;r&&a>i&&t.includes(e.charAt(a-1));)a--;return e.slice(i,a)}async function k_(e,t){if(e.readFiles)return e.readFiles(t);let n=await Promise.all(t.map(async t=>[t,await e.read(t)]));return new Map(n.filter(e=>e[1]!==void 0))}function A_(e){return e.issues.map(e=>e.path.length?`${e.path.join(`.`)} ${e.message}`:e.message).join(`; `)}function j_(e,t,n,r){let i;try{i=JSON.parse(r)}catch(e){return{ok:!1,problem:{file:n,message:`isn't valid JSON (${e.message}).`}}}return typeof i!=`object`||!i||Array.isArray(i)?{ok:!1,problem:{file:n,message:`must contain a JSON object.`}}:M_(e,t,n,i)}function M_(e,t,n,r){let i;try{i=te(e,r)}catch(e){return{ok:!1,problem:{file:n,message:e.message}}}let a=t.safeParse(i);return a.success?{ok:!0,value:a.data}:{ok:!1,problem:{file:n,message:A_(a.error)}}}function N_(e,t,n){let r;try{r=a_(t,n)}catch(t){return{ok:!1,problem:{file:e,message:t.message}}}return M_(`entry`,yd,e,r)}function P_(e,t,n){let r=e.markdown?N_(t,n,e.markdown.body):j_(`entry`,yd,t,n);if(!r.ok)return r;let i=Sd(e.fields,r.value.fields);return i.length>0?{ok:!1,problem:{file:t,message:i.map(e=>`fields.${e}`).join(`; `)}}:r}function F_(e){return e.mainLanguage??e.language}function I_(e){try{let t=new Intl.DisplayNames([e],{type:`language`}).of(e);if(t&&t!==e)return t.charAt(0).toLocaleUpperCase(e)+t.slice(1)}catch{}return e}function L_(e){return`/${e.toLowerCase()}`}function R_(e){let t=F_(e);return[{code:t,name:e.languageName||I_(t),prefix:``,main:!0},...(e.languages??[]).filter(e=>e.code.toLowerCase()!==t.toLowerCase()).map(e=>({code:e.code,name:e.name||I_(e.code),prefix:L_(e.code),main:!1}))]}function z_(e,t){for(let n of R_(e))if(!n.main&&(t===n.prefix||t.startsWith(`${n.prefix}/`)))return n.code;return F_(e)}function B_(e,t){return t.content.inLanguage??F_(e)}var V_=`goodfellow:broker-connect`;function H_(e){return e.startsWith(`.github/`)||e===`.gitlab-ci.yml`||e.startsWith(`.gitlab/`)||e===`bitbucket-pipelines.yml`}function U_(e,t){let n={refused:[],confirm:[]};for(let r of e){let{path:e}=r;if(H_(e)||e.startsWith(`/`)||e.split(`/`).includes(`..`))n.refused.push(e);else if(e.startsWith(`content/code/`))n.confirm.push({path:e,kind:`custom-code`});else if(!l(e))n.confirm.push({path:e,kind:`code`});else if(e===`content/site.json`){let i=`content`in r?r.content:`bytes`in r?new TextDecoder(`utf-8`,{fatal:!1}).decode(r.bytes):void 0,a;try{a=i===void 0?void 0:JSON.parse(i).url}catch{a=void 0}(a??void 0)!==(t??void 0)&&n.confirm.push({path:e,kind:`site-address`})}}return n}var W_=class extends Error{problem;name=`BrokerRefusedError`;constructor(e,t){super(t),this.problem=e}},G_=[`revision`,`read`,`readBytes`,`list`,`readFiles`,`fileSizes`,`write`,`changedPaths`],K_={methods:[`read`,`readBytes`,`list`]},q_={name:`draft`,data:[`name`],methods:[`changes`,`paths`,`publish`,`submitForReview`,`discard`],objects:{store:{methods:G_}}},J_={data:[`user`,`contentOnly`],methods:[...G_,`deployStatus`,`history`,`readAt`,`repositoryVisibility`,`signOut`],sync:{filesAt:K_},objects:{pages:{data:[`severalDomains`],methods:[`site`,`connect`,`records`,`status`,`secure`,`disconnect`]},editors:{data:[`invitesByEmail`,`membersOnly`],methods:[`list`,`invite`,`setRole`,`remove`,`letEditorsPublish`]},ownerAccess:{data:[`tokenLink`,`active`,`problem`],methods:[`forget`,`startRedirect`,`requestToken`]},updates:{methods:[`setup`,`enable`,`lastRun`,`start`,`rebuild`],objects:{code:{data:[`repo`,`webUrl`],methods:[`read`,`history`,`readAt`]},nightly:{methods:[`supported`,`get`,`set`]}}},drafts:{methods:[`create`,`open`,`list`,`reviews`],returns:{create:q_,open:q_}},scheduledBuilds:{methods:[`timing`,`sync`]},tasks:{methods:[`supported`,`secretsPlace`,`run`]},comments:{methods:[`create`,`find`,`threads`,`hide`,`show`,`remove`,`lock`,`unlock`],objects:{access:{data:[`tokenLink`,`active`],methods:[`forget`,`requestToken`]}}}}};function Y_(e){if(!(e instanceof Error))return{name:`Error`,message:String(e),fields:{}};let t={};for(let[n,r]of Object.entries(e))[`string`,`number`,`boolean`].includes(typeof r)&&(t[n]=r);return{name:e.name,message:e.message,fields:t}}function X_(e){return e instanceof Error?{__error:Y_(e)}:e}function Z_(e,t,n={}){let r=new Map([[0,{target:t,shape:J_,prefix:``}]]),i=1;function a(e,t,r,i){let o=e,s={};for(let e of t.data??[])o[e]!==void 0&&(s[e]=X_(o[e]));let c=(t.methods??[]).filter(e=>typeof o[e]==`function`||n.extra?.[`${r}${e}`]!==void 0);for(let e of Object.keys(t.sync??{}))typeof o[e]==`function`&&c.push(e);let l={};for(let[e,n]of Object.entries(t.objects??{})){let t=o[e];typeof t==`object`&&t&&(l[e]=a(t,n,`${r}${e}.`,i))}return{handle:i,data:s,methods:c,objects:l}}let o=()=>a(t,J_,``,0);function s(e,t){let n=r.get(e);if(!n)return;let i=n.target,a=n.shape,o=n.prefix;for(let e of t.slice(0,-1))if(a=a?.objects?.[e],i=i?.[e],o+=`${e}.`,!a||typeof i!=`object`||!i)return;let s=t.at(-1)??``;if((a?.methods?.includes(s)||Object.hasOwn(a?.sync??{},s))&&a)return{target:i,shape:a,method:s,name:`${o}${s}`}}async function c(e){let t=s(e.handle,e.path);if(!t)throw new W_(`not-here`,`The broker doesn't offer that.`);let{target:o,shape:c,method:l,name:u}=t,d=Array.isArray(e.args)?e.args:[],f=n.extra?.[u];if(c.sync?.[l]){let t=c.sync[l],[r,i]=e.then??[``,[]];if(!t.methods?.includes(r))throw new W_(`not-here`,`The broker doesn't offer that.`);await n.check?.({path:`${u}.${r}`,args:[...d,...i],target:o});let a=o[l].apply(o,d);return a[r].apply(a,i)}await n.check?.({path:u,args:d,target:o});let p=f?await f(...d):await o[l].apply(o,d),m=c.returns?.[l];if(m&&typeof p==`object`&&p){let e=i++,t=`${m.name??u}.`;return r.set(e,{target:p,shape:m,prefix:t}),{__object:a(p,m,t,e)}}return p}return e.onmessage=async t=>{let n=t.data;if(n?.type===`call`&&Array.isArray(n.path))try{let t=await c(n);e.postMessage({type:`answer`,id:n.id,ok:!0,value:t,state:o()})}catch(t){e.postMessage({type:`answer`,id:n.id,ok:!1,error:Y_(t),state:o()})}},e.postMessage({type:`state`,state:o()}),()=>{e.onmessage=null,r.clear()}}var Q_=M({repository:k().min(1),workflow:k().min(1)}),$_=Q_.extend({from:k().min(1)}),ev=k().regex(/^(?!.*\.\.)[A-Za-z0-9_-][A-Za-z0-9_./-]*$/,`must be a file in the theme's package, such as theme.css`);M({version:N(1),title:k().trim().min(1).max(80),description:k().max(500).optional(),theme:Hu.refine(e=>e.fonts.custom===void 0,{message:`a theme's fonts must be Google Fonts`,path:[`fonts`,`custom`]}).default({colors:{},fonts:{}}),css:ev.optional(),header:ev.optional(),footer:ev.optional(),image:ev.optional()});var tv=k().regex(/^[0-9a-f]{64}$/),nv=M({version:N(1),name:k(),release:k(),title:k(),goodfellow:k().optional(),theme:Hu.default({colors:{},fonts:{}}),css:tv.optional(),header:tv.optional(),footer:tv.optional(),provenance:Q_.optional(),early:$_.optional()}),rv=M(Object.fromEntries([`connect`,`files`,`secrets`,`read`,`write`].map(e=>[e,j(k()).optional()]))).strict(),iv=M({version:N(1),title:k().trim().min(1),description:k().optional(),permissions:rv.default({}),blocks:j(k()).optional(),admin:Js().optional(),screens:j(M({id:k(),title:k()}).strict()).optional(),build:j(M({id:k(),title:k().optional()}).strict()).optional(),tasks:j(M({id:k(),title:k().optional()}).strict()).optional(),server:Js().optional(),mediaStorage:Js().optional(),editor:M({title:k().trim().min(1),kinds:j(fc([`page`,`header`,`footer`,`template`])).optional()}).strict().optional()}).strict(),av=M({release:k(),installed:k(),goodfellow:k().optional(),manifest:iv,provenance:Q_.optional(),early:$_.optional()}),ov=M({version:N(1),plugins:lc(k(),av)}),sv={version:1,plugins:{}};function cv(e){return e===void 0?sv:ov.parse(JSON.parse(e))}var lv={anthropic:{name:`Claude`,keyUrl:`https://platform.claude.com/settings/keys`,needsKey:!0,models:[`claude-opus-5-5`,`claude-sonnet-5-5`,`claude-haiku-4-5`]},openai:{name:`OpenAI`,keyUrl:`https://platform.openai.com/api-keys`,needsKey:!0,baseUrl:`https://api.openai.com/v1`,structured:`json_schema`},gemini:{name:`Google Gemini`,keyUrl:`https://aistudio.google.com/apikey`,needsKey:!0,baseUrl:`https://generativelanguage.googleapis.com/v1beta/openai`,structured:`json_schema`},groq:{name:`Groq`,keyUrl:`https://console.groq.com/keys`,needsKey:!0,baseUrl:`https://api.groq.com/openai/v1`,structured:`json_object`},mistral:{name:`Mistral`,keyUrl:`https://console.mistral.ai/api-keys`,needsKey:!0,baseUrl:`https://api.mistral.ai/v1`,structured:`json_schema`},openrouter:{name:`OpenRouter`,keyUrl:`https://openrouter.ai/settings/keys`,needsKey:!0,baseUrl:`https://openrouter.ai/api/v1`,structured:`json_schema`},ovhcloud:{name:`OVHcloud AI Endpoints`,needsKey:!1,baseUrl:`https://oai.endpoints.kepler.ai.cloud.ovh.net/v1`,structured:`json_object`,models:[`gpt-oss-120b`]},custom:{name:`OpenAI-compatible`,needsKey:!1,structured:`json_object`},manual:{name:`Chat app`,needsKey:!1}};function uv(e,t){let n=t?e.split(t).join(`[key]`):e;return n=n.replace(/\b(sk|gsk|AIza)[-_A-Za-z0-9]{12,}/g,`[key]`),n}var dv=`https://api.anthropic.com`,fv=10485760,pv=[`content-type`,`accept`,`anthropic-version`,`anthropic-beta`];function mv(e,t,n){return e===`anthropic`?t===`POST`&&n===`v1/messages`:t===`POST`&&n===`chat/completions`||t===`GET`&&n===`models`}function hv(e,t){return Response.json({error:{message:t}},{status:e,headers:{"cache-control":`no-store`}})}function gv(e,t={}){let n=t.fetch??((e,t)=>fetch(e,t)),r=Object.entries(e).flatMap(([e,t])=>t&&(typeof t==`string`||t.baseUrl)?[[e,t]]:[]),i=new Map(r);async function a(e,t,r){let a=t,o=i.get(a);if(!o)return hv(404,`This site has no key for that service.`);if(!mv(a,e.method,r))return hv(404,`The AI assistant doesn't use that.`);let s=typeof o==`string`?o:o.key,c=a===`anthropic`?dv:typeof o==`object`?o.baseUrl:lv[a].baseUrl??``;if(!c)return hv(404,`This site has no address for that service.`);let l=e.method===`GET`?void 0:await e.arrayBuffer();if(l&&l.byteLength>fv)return hv(413,`That request is too large.`);let u=new Headers;for(let t of pv){let n=e.headers.get(t);n&&u.set(t,n)}s&&(a===`anthropic`?u.set(`x-api-key`,s):u.set(`authorization`,`Bearer ${s}`));let d=`${O_(c,`/`,{start:!1})}/${r}${new URL(e.url).search}`,f;try{f=await n(d,{method:e.method,headers:u,body:l,signal:e.signal})}catch(e){if(e.name===`AbortError`)throw e;return hv(502,`The AI service couldn't be reached.`)}if(!f.ok){let e=uv(await f.text().catch(()=>``),s);return new Response(e,{status:f.status,headers:{"content-type":f.headers.get(`content-type`)??`text/plain`,"cache-control":`no-store`}})}return new Response(f.body,{status:f.status,headers:{"content-type":f.headers.get(`content-type`)??`application/json`,"cache-control":`no-store`}})}return{services:[...i.keys()],forward:a}}var _v=new Set([`write`,`draft.store.write`]),vv=[`revision`,`read`,`readBytes`,`list`,`readFiles`,`fileSizes`,`changedPaths`],yv=new Set([...vv,`deployStatus`,`history`,`readAt`,`repositoryVisibility`,`signOut`,`filesAt.read`,`filesAt.readBytes`,`filesAt.list`,`pages.site`,`pages.records`,`pages.status`,`editors.list`,`ownerAccess.forget`,`ownerAccess.startRedirect`,`ownerAccess.requestToken`,`updates.lastRun`,`updates.rebuild`,`updates.code.read`,`updates.code.history`,`updates.code.readAt`,`updates.nightly.supported`,`updates.nightly.get`,`updates.nightly.set`,`drafts.create`,`drafts.open`,`drafts.list`,`drafts.reviews`,`draft.changes`,`draft.paths`,`draft.submitForReview`,...vv.map(e=>`draft.store.${e}`),`scheduledBuilds.timing`,`scheduledBuilds.sync`,`tasks.supported`,`tasks.secretsPlace`,`comments.find`,`comments.threads`,`comments.hide`,`comments.show`,`comments.lock`,`comments.unlock`,`comments.access.forget`,`comments.access.requestToken`]),bv={"pages.connect":`connect`,"pages.secure":`secure`,"pages.disconnect":`disconnect`};async function xv(e,t){let n=e.find(e=>e.path===u);if(n&&`content`in n)try{let e=cv(n.content).plugins,r=cv(await t?.(u)).plugins,i=Object.entries(e).filter(([e,t])=>JSON.stringify(r[e])!==JSON.stringify(t)).map(([e,t])=>({name:e,...t})),a=Object.keys(r).filter(t=>!e[t]);return i.length+a.length>0?{kind:`plugins`,installed:i,removed:a}:void 0}catch{return}}function Sv(e){let t=e.find(e=>e.path===d);if(t&&`content`in t)try{let e=nv.safeParse(JSON.parse(t.content)),n=e.success?e.data.early:void 0;return e.success&&n?{kind:`theme-early`,name:e.data.name,release:e.data.release,...n}:void 0}catch{return}}async function Cv(e,t,n){let r=U_(e,t);if(r.refused.length>0)return{action:`refuse`,paths:r.refused,reason:`workflow`};let i=new Map;for(let{path:e,kind:t}of r.confirm)i.set(t,[...i.get(t)??[],e]);let a=await xv(e,n),o=Sv(e),s=[...a?[a]:[],...o?[o]:[],...[...i].map(([e,t])=>({kind:e,paths:t}))];return s.length>0?{action:`ask`,questions:s}:{action:`allow`}}async function wv(e,t){if(!e)return;let n=u_(await E_(e),e.user.login);if(!n)return;let r=T_(await D_(e,t),n,t);return r.length>0?{action:`refuse`,paths:r.map(e=>e.path),reason:`limits`}:void 0}function Tv(e){let t=e?.read;return typeof t==`function`?n=>t.call(e,n):void 0}function Ev(e){if(typeof e==`string`)return e;let{login:t,email:n}=e??{};return typeof t==`string`?t:typeof n==`string`?n:``}function Dv(e){return typeof e==`string`?e:``}async function Ov(e,t,n){let{path:r,args:i,target:a}=e;if(_v.has(r)){let e=i[0]??[];if(r===`write`){let t=await wv(n,e);if(t)return t}return Cv(e,t,Tv(a))}if(r===`draft.publish`){let e=await a.changes();return await wv(n,e)??Cv(e,t)}if(r===`updates.start`)return{action:`ask`,questions:[{kind:`update`,release:String(i[0])}]};if(r===`editors.invite`||r===`editors.setRole`)return{action:`ask`,questions:[{kind:`editors`,who:Ev(i[0]),role:String(i[1])}]};if(r===`editors.letEditorsPublish`)return{action:`ask`,questions:[{kind:`editors`,who:``}]};if(r===`editors.remove`)return{action:`ask`,questions:[{kind:`editors-remove`,who:Ev(i[0])}]};let o=bv[r];if(o)return{action:`ask`,questions:[{kind:`domain`,change:o,domain:Dv(i[0])}]};if(r===`tasks.run`){let e=i[0]??{};return{action:`ask`,questions:[{kind:`task`,plugin:Dv(e.plugin),task:Dv(e.task)}]}}if(r===`updates.setup`||r===`updates.enable`)return{action:`ask`,questions:[{kind:`updates-setup`}]};if(r===`draft.discard`){let e=a?.name;return{action:`ask`,questions:[{kind:`discard-draft`,name:Dv(e)}]}}return r===`comments.create`?{action:`ask`,questions:[{kind:`comments-create`,name:Dv(i[0])}]}:r===`comments.remove`?{action:`ask`,questions:[{kind:`comments-delete`}]}:yv.has(r)?{action:`allow`}:{action:`refuse`,paths:[r],reason:`unknown`}}var kv={title:`Sign in`,loading:`Loading…`,framed:`This page can't be shown inside another page. Open it on its own.`,noConfig:`This sign-in page isn't set up yet: it needs a broker.json beside it, naming the site it signs in to. See the token broker page in Goodfellow's documentation.`,signInTitle:`Sign in to edit {site}`,signInIntro:`This page keeps your sign-in and AI keys where the site's pages can't reach them, and shows the admin panel from here.`,signInRedirect:`Sign in with {host}`,signInToken:`Or sign in with an access token`,tokenLabel:`Access token`,remember:`Stay signed in on this device`,signInButton:`Sign in`,signingIn:`Signing in…`,signInError:`That didn't work: {message}`,noSiteAddress:`The site has no address yet, so there's no admin panel to show. Set its address in Site Settings first, or ask its owner to.`,badSiteAddress:`The site's address, {address}, isn't one this page can show the admin panel from.`,sameOrigin:`The admin panel is at this page's own address, {address}, where it could read your sign-in. Give the sign-in page an address of its own.`,pinnedElsewhere:`The site's settings say its admin panel is at {address}, but this sign-in page only shows it from {pinned}, as its broker.json says. If you moved the site, change broker.json's admin to the new address.`,movedTitle:`The admin panel has moved`,moved:`Last time, this page showed the admin panel from {pinned}. The site's settings now say it's at {address}. Only go on if you or another owner changed the site's address: anyone who can edit the site can change its settings, and the page at that address would act as you.`,movedGoOn:`Go on to {address}`,signedInAs:`Signed in as {name}`,showing:`Showing {address}`,aiKeys:`AI keys`,signOut:`Sign out`,adminFrame:`Admin panel`,confirmTitle:`Publish this?`,confirmIntro:`The admin panel asked to publish changes that need you to say so here, where nothing it runs can say so for you:`,confirmCode:`The site's code, which runs when the site is built:`,confirmCustomCode:`Code that runs on the site's pages:`,confirmSiteAddress:`A new Site address, which is where this page shows the admin panel from. Only publish it if you changed it yourself:`,confirmUpdate:`Installing Goodfellow {release}, which changes the site's packages.`,confirmPlugin:`Installing the plugin {title} ({name} {release}), whose code is included when the site is built and runs on its pages. It asks to:`,confirmPluginRemove:`Removing the plugin {name}.`,confirmThemeEarly:`Updating the theme {name} to {release}.`,confirmEarly:`This installs {release} before it's three days old, skipping the wait that protects against harmful releases, since it says it was built by {repository} ({workflow}), as {from} was. The site's build checks that before it uses it.`,pluginConnect:`Reach these addresses from the admin panel: {list}`,pluginFiles:`Read and publish these files: {list}`,pluginSecrets:`Get these secrets when the site is built: {list}`,pluginRead:`Read these parts of the site when it's built: {list}`,pluginWrite:`Write these parts of the built site: {list}`,pluginBlocks:`Add these blocks: {list}`,pluginAdmin:`Run in the admin panel, in a frame of its own`,pluginBuild:`Run steps when the site is built`,pluginServer:`Answer requests on the site's server, with everything the server can do`,pluginEditor:`Offer its own page editor, {title}, which is given what's edited in it`,pluginNothing:`Nothing more`,confirmEditors:`Giving {who} access to edit the site{role}.`,confirmEditorsPublish:`Letting the site's editors publish to it.`,confirmAskTitle:`Allow this?`,confirmAskIntro:`The admin panel asked to do something that needs you to say so here, where nothing it runs can say so for you:`,confirmEditorsRemove:`Taking away {who}'s access to the site.`,confirmDomainConnect:`Connecting the domain {domain} to the site.`,confirmDomainSecure:`Turning on HTTPS for {domain}, and serving the site from it.`,confirmDomainDisconnect:`Removing the domain {domain} from the site.`,confirmTask:`Running the plugin {plugin}'s task {task} with the secrets it was given. Allowing it lets it run again while this page is open.`,confirmUpdatesSetup:`Changing the site's settings on its host so it can install updates by itself.`,confirmDiscardDraft:`Throwing away the draft {name}, which can't be undone.`,confirmCommentsCreate:`Making a public repository, {name}, for visitors' comments, beside the site's.`,confirmCommentsDelete:`Deleting a visitor's comment, which can't be undone.`,confirmPublish:`Publish`,confirmAllow:`Allow`,cancel:`Cancel`,refusedLimits:`An owner has limited what you can change on this site, and this publish changes things outside it: {paths}. Submit it for review instead.`,refusedWorkflow:`The token broker never changes the site's workflows, which run with its secrets: {paths}.`,refusedUnknown:`The token broker doesn't make this call for the admin panel: {paths}.`,declined:`You chose not to do this.`,ownerTitle:`Owner token`,ownerIntro:`Create a token that can manage the site, then paste it here. This page keeps it for as long as it's open, and the admin panel never sees it.`,ownerCreate:`Create a token`,ownerLabel:`Owner token`,ownerUse:`Use this token`,commentsTitle:`GitHub token for comments`,commentsLabel:`GitHub token`,commentsIntro:`Create a GitHub token that can manage the comments' repository, then paste it here. This page keeps it for as long as it's open, and the admin panel never sees it.`,aiTitle:`AI keys`,aiIntro:`The AI assistant asks these services through this page, with your keys, so the admin panel never sees them. Leave a service empty to not use it.`,aiRemember:`Remember these keys on this device`,aiSave:`Save`};function Q(e,t={}){return kv[e].replace(/\{(\w+)\}/g,(e,n)=>t[n]??e)}var Av=`goodfellow:broker:route`,jv=`goodfellow:broker:shown`,Mv=`goodfellow:broker:ai`,Nv=`goodfellow.config.tsx`,Pv=Object.keys(lv).filter(e=>e!==`custom`&&e!==`manual`&&(e===`anthropic`||lv[e].baseUrl));function $(e,t={},...n){let r=document.createElement(e);for(let[e,n]of Object.entries(t))r.setAttribute(e,n);return r.append(...n),r}function Fv(e){return JSON.stringify([e.plugin,e.task])}function Iv(e){return e instanceof Error?e.message:String(e)}function Lv(e){let{repo:t,project:n}=e.options;return typeof t==`string`?t:typeof n==`string`?n:e.package}function Rv(){for(let e of[sessionStorage,localStorage])try{let t=e.getItem(Mv);if(t)return JSON.parse(t)}catch{}return{}}function zv(e,t){Uv(),(t?localStorage:sessionStorage).setItem(Mv,JSON.stringify(e))}function Bv(e){try{let t=JSON.parse(localStorage.getItem(jv)??`{}`)[e];return typeof t==`string`?t:void 0}catch{return}}function Vv(e,t){try{let n=JSON.parse(localStorage.getItem(jv)??`{}`);localStorage.setItem(jv,JSON.stringify({...n,[e]:t}))}catch{}}function Hv(e){if(typeof e.admin==`string`)try{return new URL(e.admin).origin}catch{return`null`}}function Uv(){sessionStorage.removeItem(Mv),localStorage.removeItem(Mv)}async function Wv(e){let t=await e.revision(),n=JSON.parse(await e.read(`content/site.json`)??`{}`);if(typeof n.url!=`string`||!n.url)return{problem:`noSiteAddress`};let r;try{r=new URL(n.url.replace(/\/?$/,`/`))}catch{return{problem:`badSiteAddress`}}let i=r.hostname===`localhost`||r.hostname===`127.0.0.1`;if(r.protocol!==`https:`&&!(r.protocol===`http:`&&i))return{problem:`badSiteAddress`};let a=await e.readAt(Nv,t).catch(()=>void 0),o=a?v(a):void 0;return{url:`${(o?.checked?g(o):void 0)??r.origin}${r.pathname}admin/`,siteUrl:n.url}}async function Gv({root:e,config:t,hosts:n}){document.title=Q(`title`);let r=(...t)=>e.replaceChildren(...t);if(window.top!==window){r($(`p`,{class:`broker-note`},Q(`framed`)));return}let i=new URLSearchParams(location.search).get(`site`),a=t?.sites.find(e=>!i||Lv(e)===i)??t?.sites[0],o=a&&Object.hasOwn(n,a.package)?n[a.package]:void 0,s=o&&(await o())[a?.export??``];if(!a||typeof s!=`function`){r($(`p`,{class:`broker-note`},Q(`noConfig`)));return}let c=s(a.options),l=()=>{location.hash&&sessionStorage.setItem(Av,location.hash)};l(),window.addEventListener(`hashchange`,l),r($(`p`,{class:`broker-note`},Q(`loading`)));let u=null,d;try{u=await c.restore()}catch(e){d=e}u?await p(u):f(d);function f(e){let t=$(`form`,{class:`broker-sign-in`}),n=$(`input`,{type:`checkbox`,id:`broker-remember`}),i=$(`input`,{type:`password`,id:`broker-token`,autocomplete:`off`}),o=$(`p`,{class:`broker-error`,role:`alert`});e!==void 0&&(o.textContent=Q(`signInError`,{message:Iv(e)}));let s=$(`button`,{type:`submit`},Q(`signInButton`)),l=async e=>{s.disabled=!0,o.textContent=Q(`signingIn`);try{await p(await e())}catch(e){o.textContent=Q(`signInError`,{message:Iv(e)}),s.disabled=!1}};if(t.append($(`h1`,{},Q(`signInTitle`,{site:Lv(a)})),$(`p`,{},Q(`signInIntro`)),o),c.canRedirect){let e=$(`button`,{type:`button`,class:`broker-primary`},Q(`signInRedirect`,{host:c.name}));e.addEventListener(`click`,()=>void c.startRedirect(n.checked).catch(e=>{o.textContent=Q(`signInError`,{message:Iv(e)})})),t.append($(`div`,{},e))}if(c.tokenLinks){let e=$(`ul`,{});for(let t of c.tokenLinks)e.append($(`li`,{},$(`a`,{href:t.url,target:`_blank`,rel:`noreferrer`},t.url)));t.append($(`h2`,{},Q(`signInToken`)),e,$(`label`,{for:`broker-token`},Q(`tokenLabel`)),i,$(`label`,{class:`broker-check`},n,` ${Q(`remember`)}`),$(`div`,{},s))}t.addEventListener(`submit`,e=>{e.preventDefault(),i.value.trim()&&l(()=>c.signInWithToken(i.value.trim(),n.checked))}),r(t)}async function p(e){let t=await Wv(e).catch(e=>({problem:`signInError`,error:e}));if(`problem`in t){r($(`p`,{class:`broker-note`,role:`alert`},Q(t.problem,{address:``,message:`error`in t?Iv(t.error):``})));return}let n=new URL(t.url).origin;if(n===location.origin){r($(`p`,{class:`broker-note`,role:`alert`},Q(`sameOrigin`,{address:n})));return}let i=Lv(a),o=Hv(a);if(o!==void 0&&o!==n){r($(`p`,{class:`broker-note`,role:`alert`},Q(`pinnedElsewhere`,{address:n,pinned:o})));return}let s=Bv(i);if(o===void 0&&s!==void 0&&s!==n){let t=$(`button`,{type:`button`,class:`broker-primary`},Q(`movedGoOn`,{address:n})),a=$(`button`,{type:`button`},Q(`signOut`));t.addEventListener(`click`,()=>{Vv(i,n),p(e)}),a.addEventListener(`click`,()=>{e.signOut(),Uv(),sessionStorage.removeItem(Av),f()}),r($(`div`,{class:`broker-sign-in`,role:`alertdialog`,"aria-labelledby":`broker-moved`},$(`h1`,{id:`broker-moved`},Q(`movedTitle`)),$(`p`,{},Q(`moved`,{address:n,pinned:s})),$(`div`,{},t,` `,a)));return}Vv(i,n);let l=sessionStorage.getItem(Av)??``,u=$(`iframe`,{class:`broker-frame`,title:Q(`adminFrame`),src:`${t.url}${l.startsWith(`#`)?l:``}`,sandbox:`allow-scripts allow-same-origin allow-forms allow-popups allow-popups-to-escape-sandbox allow-downloads allow-modals`,allow:`clipboard-write`}),d=()=>{window.removeEventListener(`message`,ne),ee?.(),e.signOut(),Uv(),sessionStorage.removeItem(Av),f()},h=$(`button`,{type:`button`},Q(`aiKeys`));h.addEventListener(`click`,()=>b(()=>u.contentWindow?.location.replace(u.src)));let g=$(`button`,{type:`button`},Q(`signOut`));g.addEventListener(`click`,d),r($(`header`,{class:`broker-bar`},$(`span`,{},Q(`signedInAs`,{name:e.user.name||e.user.login})),$(`span`,{class:`broker-origin`},Q(`showing`,{address:n})),h,g),u);let ee,te=new Set,ne=r=>{if(r.source!==u.contentWindow||r.origin!==n||r.data?.type!==`goodfellow:broker-ready`)return;ee?.();let i=new MessageChannel,a=new MessageChannel;ee=Z_(i.port1,e,{async check(n){let r=await Ov(n,t.siteUrl,e);if(r.action===`refuse`){let e=r.paths.join(`, `);throw r.reason===`limits`?new W_(`limits`,Q(`refusedLimits`,{paths:e})):r.reason===`unknown`?new W_(`not-here`,Q(`refusedUnknown`,{paths:e})):new W_(`workflow`,Q(`refusedWorkflow`,{paths:e}))}if(r.action!==`ask`)return;let i=r.questions.filter(e=>e.kind!==`task`||!te.has(Fv(e)));if(i.length!==0){if(!await _(i))throw new W_(`declined`,Q(`declined`));for(let e of i)e.kind===`task`&&te.add(Fv(e))}},extra:{signOut:d,"ownerAccess.requestToken":()=>v(e),"comments.access.requestToken":()=>y(e)}}),a.port1.onmessage=e=>void m(a.port1,e.data);let o={hostName:c.name,redirectAddressesListed:c.canRedirect&&c.redirectAddressesListed===!0,aiServices:Object.keys(Rv())};u.contentWindow?.postMessage({type:V_,account:o},n,[i.port2,a.port2])};window.addEventListener(`message`,ne)}async function m(e,t){if(t?.type===`route`&&typeof t.hash==`string`){sessionStorage.setItem(Av,t.hash);return}if(t?.type!==`ai`)return;let[n=``,...r]=t.path.split(`?`)[0]?.split(`/`)??[],i=t.path.includes(`?`)?t.path.slice(t.path.indexOf(`?`)):``,a=new Request(`https://broker.invalid/${r.join(`/`)}${i}`,{method:t.method,headers:t.headers,...t.body&&t.method!==`GET`&&{body:t.body}}),o=await gv(Rv()).forward(a,n,r.join(`/`)),s=await o.arrayBuffer(),c={type:`ai`,id:t.id,status:o.status,headers:[...o.headers.entries()],body:s};e.postMessage(c,[s])}function h(e,t,n){return new Promise(r=>{let i=$(`dialog`,{class:`broker-dialog`},$(`h2`,{},e),...t),a=$(`div`,{class:`broker-actions`});for(let e of n){let t=$(`button`,{type:`button`,...e.primary&&{class:`broker-primary`}},e.label);t.addEventListener(`click`,()=>i.close(e.value?`yes`:`no`)),a.append(t)}i.append(a),i.addEventListener(`close`,()=>{i.remove(),r(i.returnValue===`yes`)}),document.body.append(i),i.showModal()})}function g(e){let{permissions:t}=e,n=(e,t)=>e?.length?[Q(t,{list:e.join(`, `)})]:[],r=[...n(t.connect,`pluginConnect`),...n(t.files,`pluginFiles`),...n(t.secrets,`pluginSecrets`),...n(t.read,`pluginRead`),...n(t.write,`pluginWrite`),...n(e.blocks,`pluginBlocks`),...e.admin?[Q(`pluginAdmin`)]:[],...e.build?.length?[Q(`pluginBuild`)]:[],...e.server?[Q(`pluginServer`)]:[],...e.editor?[Q(`pluginEditor`,{title:e.editor.title})]:[]];return r.length>0?r:[Q(`pluginNothing`)]}function _(e){let t=[$(`p`,{},Q(`confirmIntro`))],n=!1;for(let r of e)if(r.kind===`update`)t.push($(`p`,{},Q(`confirmUpdate`,{release:r.release})));else if(r.kind===`plugins`){n=!0;for(let e of r.installed){let{manifest:n}=e;t.push($(`p`,{},Q(`confirmPlugin`,{title:n.title,name:e.name,release:e.release})),$(`ul`,{},...g(n).map(e=>$(`li`,{},e)))),e.early&&t.push($(`p`,{class:`broker-warning`},Q(`confirmEarly`,{release:e.release,from:e.early.from,repository:e.early.repository,workflow:e.early.workflow})))}for(let e of r.removed)t.push($(`p`,{},Q(`confirmPluginRemove`,{name:e})))}else if(r.kind===`theme-early`)n=!0,t.push($(`p`,{},Q(`confirmThemeEarly`,{name:r.name,release:r.release})),$(`p`,{class:`broker-warning`},Q(`confirmEarly`,{release:r.release,from:r.from,repository:r.repository,workflow:r.workflow})));else if(r.kind===`editors`)t.push($(`p`,{},r.who?Q(`confirmEditors`,{who:r.who,role:r.role?` (${r.role})`:``}):Q(`confirmEditorsPublish`)));else if(r.kind===`editors-remove`)t.push($(`p`,{},Q(`confirmEditorsRemove`,{who:r.who})));else if(r.kind===`domain`){let e=r.change===`connect`?`confirmDomainConnect`:r.change===`secure`?`confirmDomainSecure`:`confirmDomainDisconnect`;t.push($(`p`,{},Q(e,{domain:r.domain})))}else if(r.kind===`task`)t.push($(`p`,{},Q(`confirmTask`,{plugin:r.plugin,task:r.task})));else if(r.kind===`updates-setup`)t.push($(`p`,{},Q(`confirmUpdatesSetup`)));else if(r.kind===`discard-draft`)t.push($(`p`,{},Q(`confirmDiscardDraft`,{name:r.name})));else if(r.kind===`comments-create`)t.push($(`p`,{},Q(`confirmCommentsCreate`,{name:r.name})));else if(r.kind===`comments-delete`)t.push($(`p`,{},Q(`confirmCommentsDelete`)));else{n=!0;let e=r.kind===`code`?`confirmCode`:r.kind===`custom-code`?`confirmCustomCode`:`confirmSiteAddress`;t.push($(`p`,{},Q(e)),$(`ul`,{},...r.paths.map(e=>$(`li`,{},$(`code`,{},e)))))}return n||(t[0]=$(`p`,{},Q(`confirmAskIntro`))),h(Q(n?`confirmTitle`:`confirmAskTitle`),t,[{label:Q(`cancel`),value:!1},{label:Q(n?`confirmPublish`:`confirmAllow`),value:!0,primary:!0}])}function v(e){let t=e.ownerAccess;if(!t)throw new W_(`not-here`,`This site's host has no owner token.`);return ee(t,Q(`ownerTitle`),Q(`ownerIntro`),Q(`ownerLabel`))}function y(e){let t=e.comments?.access;if(!t)throw new W_(`not-here`,`This site's host has no comments.`);return ee(t,Q(`commentsTitle`),Q(`commentsIntro`),Q(`commentsLabel`))}async function ee(e,t,n,r){let i=$(`input`,{type:`password`,id:`broker-owner-token`,autocomplete:`off`}),a=$(`p`,{class:`broker-error`,role:`alert`});for(;;){if(!await h(t,[$(`p`,{},n),$(`p`,{},$(`a`,{href:e.tokenLink.url,target:`_blank`,rel:`noreferrer`},Q(`ownerCreate`))),$(`label`,{for:`broker-owner-token`},r),i,a],[{label:Q(`cancel`),value:!1},{label:Q(`ownerUse`),value:!0,primary:!0}]))throw new W_(`declined`,Q(`declined`));try{await e.applyToken(i.value.trim());return}catch(e){a.textContent=Q(`signInError`,{message:Iv(e)})}}}async function b(e){let t=Rv(),n=new Map,r=Pv.map(e=>{let r=$(`input`,{type:`password`,id:`broker-ai-${e}`,autocomplete:`off`}),i=t[e];return typeof i==`string`&&(r.value=i),n.set(e,r),$(`div`,{},$(`label`,{for:`broker-ai-${e}`},lv[e].name),r)}),i=$(`input`,{type:`checkbox`,id:`broker-ai-remember`});if(i.checked=localStorage.getItem(Mv)!==null,!await h(Q(`aiTitle`),[$(`p`,{},Q(`aiIntro`)),...r,$(`label`,{class:`broker-check`},i,` ${Q(`aiRemember`)}`)],[{label:Q(`cancel`),value:!1},{label:Q(`aiSave`),value:!0,primary:!0}]))return;let a={};for(let[e,t]of n)t.value.trim()&&(a[e]=t.value.trim());zv(a,i.checked),e()}}await Gv({root:document.getElementById(`broker`),config:await fetch(`./broker.json`,{cache:`no-store`}).then(e=>e.ok?e.json():void 0).catch(()=>void 0),hosts:{"@goodfellow-cms/bitbucket":()=>i(()=>import(`./dist-BgSqMIdW.js`),__vite__mapDeps([0,1,2,3,4]),import.meta.url),"@goodfellow-cms/github":()=>i(()=>import(`./dist-pDBJlXWC.js`),__vite__mapDeps([5,6,1,2,7,3]),import.meta.url),"@goodfellow-cms/gitlab":()=>i(()=>import(`./dist-CoI2plUt.js`),__vite__mapDeps([8,1,2,7,3,4]),import.meta.url)}});
|
|
234
|
+
`)[0]}).`)}if(typeof r!=`object`||!r||Array.isArray(r))throw Error("must have front matter that lists fields, such as `title: My page`.");let{version:i,showFrom:a,hideAfter:o,inLanguage:s,translationOf:c,translatedFrom:l,...u}=r,d=e.slice(n[0].length).replace(/^\r?\n/,``).trimEnd();return{version:i,...a!==void 0&&{showFrom:a},...o!==void 0&&{hideAfter:o},...s!==void 0&&{inLanguage:s},...c!==void 0&&{translationOf:c},...l!==void 0&&{translatedFrom:l},fields:{...u,[t]:d}}}function o_(e){return e===`/`||/^(\/[a-z0-9]+(?:-[a-z0-9]+)*)+$/.test(e)}var s_=M({pages:j(k().refine(o_,`must be a page's address, such as /news`)).optional(),collections:j(k().min(1)).optional(),media:Js().optional(),layout:Js().optional(),menus:Js().optional(),languages:j(k().min(1)).optional()}),c_=M({version:N(1),people:lc(k().min(1),s_).default({}),reviewers:j(k().min(1)).optional()});function l_(e,t){return e.toLowerCase()===t.toLowerCase()}function u_(e,t){if(e&&t)return Object.entries(e.people).find(([e])=>l_(e,t))?.[1]}function d_(e,t){return(e??[]).some(e=>e===`/`||t===e||t.startsWith(`${e}/`))}function f_(e,t){return!e.languages||e.languages.includes(t)}function p_(e,t,n){if(!t)return!0;if(!f_(t,z_(e.settings,n.path)))return!1;let r=n.content?.translationOf;return d_(t.pages,n.path)||r!==void 0&&d_(t.pages,r)}function m_(e,t){return!e||(e.collections??[]).includes(t)}function h_(e,t,n){return!t||m_(t,n.collection)&&f_(t,B_(e.settings,n))}function g_(e){return!e||e.media===!0}function __(e,t,n){return!t||t.layout===!0&&f_(t,n??F_(e.settings))}function v_(e,t,n){return!t||t.menus===!0&&f_(t,n??F_(e.settings))}function y_(e){return`content`in e?e.content:void 0}function b_(e){if(e!==void 0)try{let t=JSON.parse(e);return t&&typeof t==`object`&&!Array.isArray(t)?t:void 0}catch{return}}function x_(e,t){if(t===`content/layout/header.json`||t===`content/layout/footer.json`)return F_(e.settings);let n=/^content\/layout\/(?:header|footer)\.([a-z]{2,3}(?:-[A-Za-z0-9]+)*)\.json$/.exec(t);if(n)return n[1];let r=/^content\/synced-blocks\/[a-z0-9-]+(?:\.([a-z]{2,3}(?:-[A-Za-z0-9]+)*))?\.json$/.exec(t);return r?r[1]??F_(e.settings):void 0}function S_(e,t){let n=rd.safeParse(b_(t));if(!n.success)return;let r=n.data,i=(e,t)=>Dd(e??{})===Dd(t??{}),a=[];i(r.menus,e.menus)||a.push(F_(e.settings));let o=r.languages??{},s=e.languageMenus??{};for(let e of new Set([...Object.keys(o),...Object.keys(s)]))i(o[e],s[e])||a.push(e);return a}function C_(e){if(!e.startsWith(`content/collections/`))return;let[t,n,...r]=e.slice(f.length+1).split(`/`);if(!t||!n||r.length>0||n===`_collection.json`)return;let i=/^(.+)\.(?:json|md)$/.exec(n)?.[1];return i?{collection:t,slug:i}:void 0}function w_(e,t,n){let r=y_(n);if(!e||r===void 0)return;let i=P_(e.settings,t,r);return i.ok?{content:i.value}:void 0}function T_(e,t,n){if(!t)return[];let r=[];for(let i of n){let{path:n}=i;if(n.startsWith(`content/pages/`)&&n.endsWith(`.json`)){let a;try{a=s(n)}catch{r.push({path:n,kind:`other`});continue}let o=e.pages.find(e=>e.file===n),c=b_(y_(i));(!o||p_(e,t,o))&&(`delete`in i||p_(e,t,{path:a,content:{translationOf:typeof c?.translationOf==`string`?c.translationOf:void 0}}))||r.push({path:n,kind:`page`,address:a});continue}let a=C_(n);if(a){let o=e.collections.find(e=>e.id===a.collection),s=o?.entries.find(e=>e.file===n),c=w_(o,n,i);(!m_(t,a.collection)||s&&!h_(e,t,s)||c&&!h_(e,t,{collection:a.collection,content:c.content}))&&r.push({path:n,kind:`entry`,...a});continue}if(n.startsWith(`public/media/`)||n===`content/media.json`||n===`content/media-storage.json`){g_(t)||r.push({path:n,kind:`media`});continue}let o=x_(e,n);if(o!==void 0){__(e,t,o)||r.push({path:n,kind:`layout`});continue}if(n===`content/menus.json`){(`delete`in i?void 0:S_(e,y_(i)))?.every(n=>v_(e,t,n))!==!0&&r.push({path:n,kind:`menus`});continue}r.push({path:n,kind:`other`})}return r}async function E_(e){let t=await e.read(o);if(t===void 0)return;let n=j_(`permissions`,c_,o,t);if(!n.ok)return;let{people:r,reviewers:i}=n.value;return{people:r,...i&&{reviewers:i}}}async function D_(e,t){let n=new Map;for(let{path:e}of t){let t=C_(e);t&&n.set(t.collection,(n.get(t.collection)??new Set).add(e))}let r=[...n.keys()].map(e=>`${f}/${e}/${m}`),i=t.map(e=>e.path).filter(e=>e.startsWith(`content/pages/`)&&e.endsWith(`.json`)),o=await k_(e,[p,...t.some(e=>e.path===`content/menus.json`)?[a]:[],...i,...r,...[...n.values()].flatMap(e=>[...e])]),c=e=>e.ok?e.value:void 0,l=o.get(p),u=l!==void 0&&c(j_(`site`,ed,`content/site.json`,l))||ed.parse({version:1}),d=i.flatMap(e=>{let t=o.get(e),n=t===void 0?void 0:c(j_(`page`,ud,e,t));return n?[{path:s(e),file:e,content:n}]:[]}),h=[...n].flatMap(([e,t])=>{let n=`${f}/${e}/${m}`,r=o.get(n),i=r===void 0?void 0:c(j_(`collection`,vd,n,r));return i?[{id:e,file:n,settings:i,entries:[...t].flatMap(t=>{let n=o.get(t),r=n===void 0?void 0:c(P_(i,t,n)),a=C_(t)?.slug;return r&&a?[{collection:e,slug:a,file:t,content:r}]:[]})}]:[]}),g=o.get(a),_=g===void 0?void 0:c(j_(`menus`,rd,a,g));return{settings:u,pages:d,collections:h,menus:_?.menus??{},..._?.languages&&{languageMenus:_.languages}}}function O_(e,t,{start:n=!0,end:r=!0}={}){let i=0,a=e.length;for(;n&&i<a&&t.includes(e.charAt(i));)i++;for(;r&&a>i&&t.includes(e.charAt(a-1));)a--;return e.slice(i,a)}async function k_(e,t){if(e.readFiles)return e.readFiles(t);let n=await Promise.all(t.map(async t=>[t,await e.read(t)]));return new Map(n.filter(e=>e[1]!==void 0))}function A_(e){return e.issues.map(e=>e.path.length?`${e.path.join(`.`)} ${e.message}`:e.message).join(`; `)}function j_(e,t,n,r){let i;try{i=JSON.parse(r)}catch(e){return{ok:!1,problem:{file:n,message:`isn't valid JSON (${e.message}).`}}}return typeof i!=`object`||!i||Array.isArray(i)?{ok:!1,problem:{file:n,message:`must contain a JSON object.`}}:M_(e,t,n,i)}function M_(e,t,n,r){let i;try{i=te(e,r)}catch(e){return{ok:!1,problem:{file:n,message:e.message}}}let a=t.safeParse(i);return a.success?{ok:!0,value:a.data}:{ok:!1,problem:{file:n,message:A_(a.error)}}}function N_(e,t,n){let r;try{r=a_(t,n)}catch(t){return{ok:!1,problem:{file:e,message:t.message}}}return M_(`entry`,yd,e,r)}function P_(e,t,n){let r=e.markdown?N_(t,n,e.markdown.body):j_(`entry`,yd,t,n);if(!r.ok)return r;let i=Sd(e.fields,r.value.fields);return i.length>0?{ok:!1,problem:{file:t,message:i.map(e=>`fields.${e}`).join(`; `)}}:r}function F_(e){return e.mainLanguage??e.language}function I_(e){try{let t=new Intl.DisplayNames([e],{type:`language`}).of(e);if(t&&t!==e)return t.charAt(0).toLocaleUpperCase(e)+t.slice(1)}catch{}return e}function L_(e){return`/${e.toLowerCase()}`}function R_(e){let t=F_(e);return[{code:t,name:e.languageName||I_(t),prefix:``,main:!0},...(e.languages??[]).filter(e=>e.code.toLowerCase()!==t.toLowerCase()).map(e=>({code:e.code,name:e.name||I_(e.code),prefix:L_(e.code),main:!1}))]}function z_(e,t){for(let n of R_(e))if(!n.main&&(t===n.prefix||t.startsWith(`${n.prefix}/`)))return n.code;return F_(e)}function B_(e,t){return t.content.inLanguage??F_(e)}var V_=`goodfellow:broker-connect`;function H_(e){return e.startsWith(`.github/`)||e===`.gitlab-ci.yml`||e.startsWith(`.gitlab/`)||e===`bitbucket-pipelines.yml`}function U_(e,t){let n={refused:[],confirm:[]};for(let r of e){let{path:e}=r;if(H_(e)||e.startsWith(`/`)||e.split(`/`).includes(`..`))n.refused.push(e);else if(e.startsWith(`content/code/`))n.confirm.push({path:e,kind:`custom-code`});else if(!l(e))n.confirm.push({path:e,kind:`code`});else if(e===`content/site.json`){let i=`content`in r?r.content:`bytes`in r?new TextDecoder(`utf-8`,{fatal:!1}).decode(r.bytes):void 0,a;try{a=i===void 0?void 0:JSON.parse(i).url}catch{a=void 0}(a??void 0)!==(t??void 0)&&n.confirm.push({path:e,kind:`site-address`})}}return n}var W_=class extends Error{problem;name=`BrokerRefusedError`;constructor(e,t){super(t),this.problem=e}},G_=[`revision`,`read`,`readBytes`,`list`,`readFiles`,`fileSizes`,`write`,`changedPaths`],K_={methods:[`read`,`readBytes`,`list`]},q_={name:`draft`,data:[`name`],methods:[`changes`,`paths`,`publish`,`submitForReview`,`discard`],objects:{store:{methods:G_}}},J_={data:[`user`,`contentOnly`],methods:[...G_,`deployStatus`,`history`,`readAt`,`repositoryVisibility`,`signOut`],sync:{filesAt:K_},objects:{pages:{data:[`severalDomains`],methods:[`site`,`connect`,`records`,`status`,`secure`,`disconnect`]},editors:{data:[`invitesByEmail`,`membersOnly`],methods:[`list`,`invite`,`setRole`,`remove`,`letEditorsPublish`]},ownerAccess:{data:[`tokenLink`,`active`,`problem`],methods:[`forget`,`startRedirect`,`requestToken`]},updates:{methods:[`setup`,`enable`,`lastRun`,`start`,`rebuild`],objects:{code:{data:[`repo`,`webUrl`],methods:[`read`,`history`,`readAt`]},nightly:{methods:[`supported`,`get`,`set`]}}},drafts:{methods:[`create`,`open`,`list`,`reviews`],returns:{create:q_,open:q_}},scheduledBuilds:{methods:[`timing`,`sync`]},tasks:{methods:[`supported`,`secretsPlace`,`run`]},comments:{methods:[`create`,`find`,`threads`,`hide`,`show`,`remove`,`lock`,`unlock`],objects:{access:{data:[`tokenLink`,`active`],methods:[`forget`,`requestToken`]}}}}};function Y_(e){if(!(e instanceof Error))return{name:`Error`,message:String(e),fields:{}};let t={};for(let[n,r]of Object.entries(e))[`string`,`number`,`boolean`].includes(typeof r)&&(t[n]=r);return{name:e.name,message:e.message,fields:t}}function X_(e){return e instanceof Error?{__error:Y_(e)}:e}function Z_(e,t,n={}){let r=new Map([[0,{target:t,shape:J_,prefix:``}]]),i=1;function a(e,t,r,i){let o=e,s={};for(let e of t.data??[])o[e]!==void 0&&(s[e]=X_(o[e]));let c=(t.methods??[]).filter(e=>typeof o[e]==`function`||n.extra?.[`${r}${e}`]!==void 0);for(let e of Object.keys(t.sync??{}))typeof o[e]==`function`&&c.push(e);let l={};for(let[e,n]of Object.entries(t.objects??{})){let t=o[e];typeof t==`object`&&t&&(l[e]=a(t,n,`${r}${e}.`,i))}return{handle:i,data:s,methods:c,objects:l}}let o=()=>a(t,J_,``,0);function s(e,t){let n=r.get(e);if(!n)return;let i=n.target,a=n.shape,o=n.prefix;for(let e of t.slice(0,-1))if(a=a?.objects?.[e],i=i?.[e],o+=`${e}.`,!a||typeof i!=`object`||!i)return;let s=t.at(-1)??``;if((a?.methods?.includes(s)||Object.hasOwn(a?.sync??{},s))&&a)return{target:i,shape:a,method:s,name:`${o}${s}`}}async function c(e){let t=s(e.handle,e.path);if(!t)throw new W_(`not-here`,`The broker doesn't offer that.`);let{target:o,shape:c,method:l,name:u}=t,d=Array.isArray(e.args)?e.args:[],f=n.extra?.[u];if(c.sync?.[l]){let t=c.sync[l],[r,i]=e.then??[``,[]];if(!t.methods?.includes(r))throw new W_(`not-here`,`The broker doesn't offer that.`);await n.check?.({path:`${u}.${r}`,args:[...d,...i],target:o});let a=o[l].apply(o,d);return a[r].apply(a,i)}await n.check?.({path:u,args:d,target:o});let p=f?await f(...d):await o[l].apply(o,d),m=c.returns?.[l];if(m&&typeof p==`object`&&p){let e=i++,t=`${m.name??u}.`;return r.set(e,{target:p,shape:m,prefix:t}),{__object:a(p,m,t,e)}}return p}return e.onmessage=async t=>{let n=t.data;if(n?.type===`call`&&Array.isArray(n.path))try{let t=await c(n);e.postMessage({type:`answer`,id:n.id,ok:!0,value:t,state:o()})}catch(t){e.postMessage({type:`answer`,id:n.id,ok:!1,error:Y_(t),state:o()})}},e.postMessage({type:`state`,state:o()}),()=>{e.onmessage=null,r.clear()}}var Q_=M({repository:k().min(1),workflow:k().min(1)}),$_=Q_.extend({from:k().min(1)}),ev=k().regex(/^(?!.*\.\.)[A-Za-z0-9_-][A-Za-z0-9_./-]*$/,`must be a file in the theme's package, such as theme.css`);M({version:N(1),title:k().trim().min(1).max(80),description:k().max(500).optional(),theme:Hu.refine(e=>e.fonts.custom===void 0,{message:`a theme's fonts must be Google Fonts`,path:[`fonts`,`custom`]}).default({colors:{},fonts:{}}),css:ev.optional(),header:ev.optional(),footer:ev.optional(),image:ev.optional()});var tv=k().regex(/^[0-9a-f]{64}$/),nv=M({version:N(1),name:k(),release:k(),title:k(),goodfellow:k().optional(),theme:Hu.default({colors:{},fonts:{}}),css:tv.optional(),header:tv.optional(),footer:tv.optional(),provenance:Q_.optional(),early:$_.optional()}),rv=M(Object.fromEntries([`connect`,`files`,`secrets`,`read`,`write`].map(e=>[e,j(k()).optional()]))).strict(),iv=M({version:N(1),title:k().trim().min(1),description:k().optional(),permissions:rv.default({}),blocks:j(k()).optional(),admin:Js().optional(),screens:j(M({id:k(),title:k()}).strict()).optional(),build:j(M({id:k(),title:k().optional()}).strict()).optional(),tasks:j(M({id:k(),title:k().optional()}).strict()).optional(),server:Js().optional(),mediaStorage:Js().optional(),editor:M({title:k().trim().min(1),kinds:j(fc([`page`,`header`,`footer`,`template`])).optional()}).strict().optional()}).strict(),av=M({release:k(),installed:k(),goodfellow:k().optional(),manifest:iv,provenance:Q_.optional(),early:$_.optional()}),ov=M({version:N(1),plugins:lc(k(),av)}),sv={version:1,plugins:{}};function cv(e){return e===void 0?sv:ov.parse(JSON.parse(e))}var lv={anthropic:{name:`Claude`,keyUrl:`https://platform.claude.com/settings/keys`,needsKey:!0,models:[`claude-opus-5-5`,`claude-sonnet-5-5`,`claude-haiku-4-5`]},openai:{name:`OpenAI`,keyUrl:`https://platform.openai.com/api-keys`,needsKey:!0,baseUrl:`https://api.openai.com/v1`,structured:`json_schema`},gemini:{name:`Google Gemini`,keyUrl:`https://aistudio.google.com/apikey`,needsKey:!0,baseUrl:`https://generativelanguage.googleapis.com/v1beta/openai`,structured:`json_schema`},groq:{name:`Groq`,keyUrl:`https://console.groq.com/keys`,needsKey:!0,baseUrl:`https://api.groq.com/openai/v1`,structured:`json_object`},mistral:{name:`Mistral`,keyUrl:`https://console.mistral.ai/api-keys`,needsKey:!0,baseUrl:`https://api.mistral.ai/v1`,structured:`json_schema`},openrouter:{name:`OpenRouter`,keyUrl:`https://openrouter.ai/settings/keys`,needsKey:!0,baseUrl:`https://openrouter.ai/api/v1`,structured:`json_schema`},ovhcloud:{name:`OVHcloud AI Endpoints`,needsKey:!1,baseUrl:`https://oai.endpoints.kepler.ai.cloud.ovh.net/v1`,structured:`json_object`,models:[`gpt-oss-120b`]},custom:{name:`OpenAI-compatible`,needsKey:!1,structured:`json_object`},manual:{name:`Chat app`,needsKey:!1}};function uv(e,t){let n=t?e.split(t).join(`[key]`):e;return n=n.replace(/\b(sk|gsk|AIza)[-_A-Za-z0-9]{12,}/g,`[key]`),n}var dv=`https://api.anthropic.com`,fv=10485760,pv=[`content-type`,`accept`,`anthropic-version`,`anthropic-beta`];function mv(e,t,n){return e===`anthropic`?t===`POST`&&n===`v1/messages`:t===`POST`&&n===`chat/completions`||t===`GET`&&n===`models`}function hv(e,t){return Response.json({error:{message:t}},{status:e,headers:{"cache-control":`no-store`}})}function gv(e,t={}){let n=t.fetch??((e,t)=>fetch(e,t)),r=Object.entries(e).flatMap(([e,t])=>t&&(typeof t==`string`||t.baseUrl)?[[e,t]]:[]),i=new Map(r);async function a(e,t,r){let a=t,o=i.get(a);if(!o)return hv(404,`This site has no key for that service.`);if(!mv(a,e.method,r))return hv(404,`The AI assistant doesn't use that.`);let s=typeof o==`string`?o:o.key,c=a===`anthropic`?dv:typeof o==`object`?o.baseUrl:lv[a].baseUrl??``;if(!c)return hv(404,`This site has no address for that service.`);let l=e.method===`GET`?void 0:await e.arrayBuffer();if(l&&l.byteLength>fv)return hv(413,`That request is too large.`);let u=new Headers;for(let t of pv){let n=e.headers.get(t);n&&u.set(t,n)}s&&(a===`anthropic`?u.set(`x-api-key`,s):u.set(`authorization`,`Bearer ${s}`));let d=`${O_(c,`/`,{start:!1})}/${r}${new URL(e.url).search}`,f;try{f=await n(d,{method:e.method,headers:u,body:l,signal:e.signal})}catch(e){if(e.name===`AbortError`)throw e;return hv(502,`The AI service couldn't be reached.`)}if(!f.ok){let e=uv(await f.text().catch(()=>``),s);return new Response(e,{status:f.status,headers:{"content-type":f.headers.get(`content-type`)??`text/plain`,"cache-control":`no-store`}})}return new Response(f.body,{status:f.status,headers:{"content-type":f.headers.get(`content-type`)??`application/json`,"cache-control":`no-store`}})}return{services:[...i.keys()],forward:a}}var _v=new Set([`write`,`draft.store.write`]),vv=[`revision`,`read`,`readBytes`,`list`,`readFiles`,`fileSizes`,`changedPaths`],yv=new Set([...vv,`deployStatus`,`history`,`readAt`,`repositoryVisibility`,`signOut`,`filesAt.read`,`filesAt.readBytes`,`filesAt.list`,`pages.site`,`pages.records`,`pages.status`,`editors.list`,`ownerAccess.forget`,`ownerAccess.startRedirect`,`ownerAccess.requestToken`,`updates.lastRun`,`updates.rebuild`,`updates.code.read`,`updates.code.history`,`updates.code.readAt`,`updates.nightly.supported`,`updates.nightly.get`,`updates.nightly.set`,`drafts.create`,`drafts.open`,`drafts.list`,`drafts.reviews`,`draft.changes`,`draft.paths`,`draft.submitForReview`,...vv.map(e=>`draft.store.${e}`),`scheduledBuilds.timing`,`scheduledBuilds.sync`,`tasks.supported`,`tasks.secretsPlace`,`comments.find`,`comments.threads`,`comments.hide`,`comments.show`,`comments.lock`,`comments.unlock`,`comments.access.forget`,`comments.access.requestToken`]),bv={"pages.connect":`connect`,"pages.secure":`secure`,"pages.disconnect":`disconnect`};async function xv(e,t){let n=e.find(e=>e.path===u);if(n&&`content`in n)try{let e=cv(n.content).plugins,r=cv(await t?.(u)).plugins,i=Object.entries(e).filter(([e,t])=>JSON.stringify(r[e])!==JSON.stringify(t)).map(([e,t])=>({name:e,...t})),a=Object.keys(r).filter(t=>!e[t]);return i.length+a.length>0?{kind:`plugins`,installed:i,removed:a}:void 0}catch{return}}function Sv(e){let t=e.find(e=>e.path===d);if(t&&`content`in t)try{let e=nv.safeParse(JSON.parse(t.content)),n=e.success?e.data.early:void 0;return e.success&&n?{kind:`theme-early`,name:e.data.name,release:e.data.release,...n}:void 0}catch{return}}async function Cv(e,t,n){let r=U_(e,t);if(r.refused.length>0)return{action:`refuse`,paths:r.refused,reason:`workflow`};let i=new Map;for(let{path:e,kind:t}of r.confirm)i.set(t,[...i.get(t)??[],e]);let a=await xv(e,n),o=Sv(e),s=[...a?[a]:[],...o?[o]:[],...[...i].map(([e,t])=>({kind:e,paths:t}))];return s.length>0?{action:`ask`,questions:s}:{action:`allow`}}async function wv(e,t){if(!e)return;let n=u_(await E_(e),e.user.login);if(!n)return;let r=T_(await D_(e,t),n,t);return r.length>0?{action:`refuse`,paths:r.map(e=>e.path),reason:`limits`}:void 0}function Tv(e){let t=e?.read;return typeof t==`function`?n=>t.call(e,n):void 0}function Ev(e){if(typeof e==`string`)return e;let{login:t,email:n}=e??{};return typeof t==`string`?t:typeof n==`string`?n:``}function Dv(e){return typeof e==`string`?e:``}async function Ov(e,t,n){let{path:r,args:i,target:a}=e;if(_v.has(r)){let e=i[0]??[];if(r===`write`){let t=await wv(n,e);if(t)return t}return Cv(e,t,Tv(a))}if(r===`draft.publish`){let e=await a.changes();return await wv(n,e)??Cv(e,t)}if(r===`updates.start`)return{action:`ask`,questions:[{kind:`update`,release:String(i[0])}]};if(r===`editors.invite`||r===`editors.setRole`)return{action:`ask`,questions:[{kind:`editors`,who:Ev(i[0]),role:String(i[1])}]};if(r===`editors.letEditorsPublish`)return{action:`ask`,questions:[{kind:`editors`,who:``}]};if(r===`editors.remove`)return{action:`ask`,questions:[{kind:`editors-remove`,who:Ev(i[0])}]};let o=bv[r];if(o)return{action:`ask`,questions:[{kind:`domain`,change:o,domain:Dv(i[0])}]};if(r===`tasks.run`){let e=i[0]??{};return{action:`ask`,questions:[{kind:`task`,plugin:Dv(e.plugin),task:Dv(e.task)}]}}if(r===`updates.setup`||r===`updates.enable`)return{action:`ask`,questions:[{kind:`updates-setup`}]};if(r===`draft.discard`){let e=a?.name;return{action:`ask`,questions:[{kind:`discard-draft`,name:Dv(e)}]}}return r===`comments.create`?{action:`ask`,questions:[{kind:`comments-create`,name:Dv(i[0])}]}:r===`comments.remove`?{action:`ask`,questions:[{kind:`comments-delete`}]}:yv.has(r)?{action:`allow`}:{action:`refuse`,paths:[r],reason:`unknown`}}var kv={title:`Sign in`,loading:`Loading…`,framed:`This page can't be shown inside another page. Open it on its own.`,noConfig:`This sign-in page isn't set up yet: it needs a broker.json beside it, naming the site it signs in to. See the token broker page in Goodfellow's documentation.`,signInTitle:`Sign in to edit {site}`,signInIntro:`This page keeps your sign-in and AI keys where the site's pages can't reach them, and shows the admin panel from here.`,signInRedirect:`Sign in with {host}`,signInToken:`Or sign in with an access token`,tokenLabel:`Access token`,remember:`Stay signed in on this device`,signInButton:`Sign in`,signingIn:`Signing in…`,signInError:`That didn't work: {message}`,noSiteAddress:`The site has no address yet, so there's no admin panel to show. Set its address in Site Settings first, or ask its owner to.`,badSiteAddress:`The site's address, {address}, isn't one this page can show the admin panel from.`,sameOrigin:`The admin panel is at this page's own address, {address}, where it could read your sign-in. Give the sign-in page an address of its own.`,pinnedElsewhere:`The site's settings say its admin panel is at {address}, but this sign-in page only shows it from {pinned}, as its broker.json says. If you moved the site, change broker.json's admin to the new address.`,movedTitle:`The admin panel has moved`,moved:`Last time, this page showed the admin panel from {pinned}. The site's settings now say it's at {address}. Only go on if you or another owner changed the site's address: anyone who can edit the site can change its settings, and the page at that address would act as you.`,movedGoOn:`Go on to {address}`,signedInAs:`Signed in as {name}`,showing:`Showing {address}`,aiKeys:`AI keys`,signOut:`Sign out`,adminFrame:`Admin panel`,confirmTitle:`Publish this?`,confirmIntro:`The admin panel asked to publish changes that need you to say so here, where nothing it runs can say so for you:`,confirmCode:`The site's code, which runs when the site is built:`,confirmCustomCode:`Code that runs on the site's pages:`,confirmSiteAddress:`A new Site address, which is where this page shows the admin panel from. Only publish it if you changed it yourself:`,confirmUpdate:`Installing Goodfellow {release}, which changes the site's packages.`,confirmPlugin:`Installing the plugin {title} ({name} {release}), whose code is included when the site is built and runs on its pages. It asks to:`,confirmPluginRemove:`Removing the plugin {name}.`,confirmThemeEarly:`Updating the theme {name} to {release}.`,confirmEarly:`This installs {release} before it's three days old, skipping the wait that protects against harmful releases, since it says it was built by {repository} ({workflow}), as {from} was. The site's build checks that before it uses it.`,pluginConnect:`Reach these addresses from the admin panel: {list}`,pluginFiles:`Read and publish these files: {list}`,pluginSecrets:`Get these secrets when the site is built: {list}`,pluginRead:`Read these parts of the site when it's built: {list}`,pluginWrite:`Write these parts of the built site: {list}`,pluginBlocks:`Add these blocks: {list}`,pluginAdmin:`Run in the admin panel, in a frame of its own`,pluginBuild:`Run steps when the site is built`,pluginServer:`Answer requests on the site's server, with everything the server can do`,pluginEditor:`Offer its own page editor, {title}, which is given what's edited in it`,pluginNothing:`Nothing more`,confirmEditors:`Giving {who} access to edit the site{role}.`,confirmEditorsPublish:`Letting the site's editors publish to it.`,confirmAskTitle:`Allow this?`,confirmAskIntro:`The admin panel asked to do something that needs you to say so here, where nothing it runs can say so for you:`,confirmEditorsRemove:`Taking away {who}'s access to the site.`,confirmDomainConnect:`Connecting the domain {domain} to the site.`,confirmDomainSecure:`Turning on HTTPS for {domain}, and serving the site from it.`,confirmDomainDisconnect:`Removing the domain {domain} from the site.`,confirmTask:`Running the plugin {plugin}'s task {task} with the secrets it was given. Allowing it lets it run again while this page is open.`,confirmUpdatesSetup:`Changing the site's settings on its host so it can install updates by itself.`,confirmDiscardDraft:`Throwing away the draft {name}, which can't be undone.`,confirmCommentsCreate:`Making a public repository, {name}, for visitors' comments, beside the site's.`,confirmCommentsDelete:`Deleting a visitor's comment, which can't be undone.`,confirmPublish:`Publish`,confirmAllow:`Allow`,cancel:`Cancel`,refusedLimits:`An owner has limited what you can change on this site, and this publish changes things outside it: {paths}. Submit it for review instead.`,refusedWorkflow:`The token broker never changes the site's workflows, which run with its secrets: {paths}.`,refusedUnknown:`The token broker doesn't make this call for the admin panel: {paths}.`,declined:`You chose not to do this.`,ownerTitle:`Owner token`,ownerIntro:`Create a token that can manage the site, then paste it here. This page keeps it for as long as it's open, and the admin panel never sees it.`,ownerCreate:`Create a token`,ownerLabel:`Owner token`,ownerUse:`Use this token`,commentsTitle:`GitHub token for comments`,commentsLabel:`GitHub token`,commentsIntro:`Create a GitHub token that can manage the comments' repository, then paste it here. This page keeps it for as long as it's open, and the admin panel never sees it.`,aiTitle:`AI keys`,aiIntro:`The AI assistant asks these services through this page, with your keys, so the admin panel never sees them. Leave a service empty to not use it.`,aiRemember:`Remember these keys on this device`,aiSave:`Save`};function Q(e,t={}){return kv[e].replace(/\{(\w+)\}/g,(e,n)=>t[n]??e)}var Av=`goodfellow:broker:route`,jv=`goodfellow:broker:shown`,Mv=`goodfellow:broker:ai`,Nv=`goodfellow.config.tsx`,Pv=Object.keys(lv).filter(e=>e!==`custom`&&e!==`manual`&&(e===`anthropic`||lv[e].baseUrl));function $(e,t={},...n){let r=document.createElement(e);for(let[e,n]of Object.entries(t))r.setAttribute(e,n);return r.append(...n),r}function Fv(e){return JSON.stringify([e.plugin,e.task])}function Iv(e){return e instanceof Error?e.message:String(e)}function Lv(e){let{repo:t,project:n}=e.options;return typeof t==`string`?t:typeof n==`string`?n:e.package}function Rv(){for(let e of[sessionStorage,localStorage])try{let t=e.getItem(Mv);if(t)return JSON.parse(t)}catch{}return{}}function zv(e,t){Uv(),(t?localStorage:sessionStorage).setItem(Mv,JSON.stringify(e))}function Bv(e){try{let t=JSON.parse(localStorage.getItem(jv)??`{}`)[e];return typeof t==`string`?t:void 0}catch{return}}function Vv(e,t){try{let n=JSON.parse(localStorage.getItem(jv)??`{}`);localStorage.setItem(jv,JSON.stringify({...n,[e]:t}))}catch{}}function Hv(e){if(typeof e.admin==`string`)try{return new URL(e.admin).origin}catch{return`null`}}function Uv(){sessionStorage.removeItem(Mv),localStorage.removeItem(Mv)}async function Wv(e){let t=await e.revision(),n=JSON.parse(await e.read(`content/site.json`)??`{}`);if(typeof n.url!=`string`||!n.url)return{problem:`noSiteAddress`};let r;try{r=new URL(n.url.replace(/\/?$/,`/`))}catch{return{problem:`badSiteAddress`}}let i=r.hostname===`localhost`||r.hostname===`127.0.0.1`;if(r.protocol!==`https:`&&!(r.protocol===`http:`&&i))return{problem:`badSiteAddress`};let a=await e.readAt(Nv,t).catch(()=>void 0),o=a?v(a):void 0;return{url:`${(o?.checked?g(o):void 0)??r.origin}${r.pathname}admin/`,siteUrl:n.url}}async function Gv({root:e,config:t,hosts:n}){document.title=Q(`title`);let r=(...t)=>e.replaceChildren(...t);if(window.top!==window){r($(`p`,{class:`broker-note`},Q(`framed`)));return}let i=new URLSearchParams(location.search).get(`site`),a=t?.sites.find(e=>!i||Lv(e)===i)??t?.sites[0],o=a&&Object.hasOwn(n,a.package)?n[a.package]:void 0,s=o&&(await o())[a?.export??``];if(!a||typeof s!=`function`){r($(`p`,{class:`broker-note`},Q(`noConfig`)));return}let c=s(a.options),l=()=>{location.hash&&sessionStorage.setItem(Av,location.hash)};l(),window.addEventListener(`hashchange`,l),r($(`p`,{class:`broker-note`},Q(`loading`)));let u=null,d;try{u=await c.restore()}catch(e){d=e}u?await p(u):f(d);function f(e){let t=$(`form`,{class:`broker-sign-in`}),n=$(`input`,{type:`checkbox`,id:`broker-remember`}),i=$(`input`,{type:`password`,id:`broker-token`,autocomplete:`off`}),o=$(`p`,{class:`broker-error`,role:`alert`});e!==void 0&&(o.textContent=Q(`signInError`,{message:Iv(e)}));let s=$(`button`,{type:`submit`},Q(`signInButton`)),l=async e=>{s.disabled=!0,o.textContent=Q(`signingIn`);try{await p(await e())}catch(e){o.textContent=Q(`signInError`,{message:Iv(e)}),s.disabled=!1}};if(t.append($(`h1`,{},Q(`signInTitle`,{site:Lv(a)})),$(`p`,{},Q(`signInIntro`)),o),c.canRedirect){let e=$(`button`,{type:`button`,class:`broker-primary`},Q(`signInRedirect`,{host:c.name}));e.addEventListener(`click`,()=>void c.startRedirect(n.checked).catch(e=>{o.textContent=Q(`signInError`,{message:Iv(e)})})),t.append($(`div`,{},e))}if(c.tokenLinks){let e=$(`ul`,{});for(let t of c.tokenLinks)e.append($(`li`,{},$(`a`,{href:t.url,target:`_blank`,rel:`noreferrer`},t.url)));t.append($(`h2`,{},Q(`signInToken`)),e,$(`label`,{for:`broker-token`},Q(`tokenLabel`)),i,$(`label`,{class:`broker-check`},n,` ${Q(`remember`)}`),$(`div`,{},s))}t.addEventListener(`submit`,e=>{e.preventDefault(),i.value.trim()&&l(()=>c.signInWithToken(i.value.trim(),n.checked))}),r(t)}async function p(e){let t=await Wv(e).catch(e=>({problem:`signInError`,error:e}));if(`problem`in t){r($(`p`,{class:`broker-note`,role:`alert`},Q(t.problem,{address:``,message:`error`in t?Iv(t.error):``})));return}let n=new URL(t.url).origin;if(n===location.origin){r($(`p`,{class:`broker-note`,role:`alert`},Q(`sameOrigin`,{address:n})));return}let i=Lv(a),o=Hv(a);if(o!==void 0&&o!==n){r($(`p`,{class:`broker-note`,role:`alert`},Q(`pinnedElsewhere`,{address:n,pinned:o})));return}let s=Bv(i);if(o===void 0&&s!==void 0&&s!==n){let t=$(`button`,{type:`button`,class:`broker-primary`},Q(`movedGoOn`,{address:n})),a=$(`button`,{type:`button`},Q(`signOut`));t.addEventListener(`click`,()=>{Vv(i,n),p(e)}),a.addEventListener(`click`,()=>{e.signOut(),Uv(),sessionStorage.removeItem(Av),f()}),r($(`div`,{class:`broker-sign-in`,role:`alertdialog`,"aria-labelledby":`broker-moved`},$(`h1`,{id:`broker-moved`},Q(`movedTitle`)),$(`p`,{},Q(`moved`,{address:n,pinned:s})),$(`div`,{},t,` `,a)));return}Vv(i,n);let l=sessionStorage.getItem(Av)??``,u=$(`iframe`,{class:`broker-frame`,title:Q(`adminFrame`),src:`${t.url}${l.startsWith(`#`)?l:``}`,sandbox:`allow-scripts allow-same-origin allow-forms allow-popups allow-popups-to-escape-sandbox allow-downloads allow-modals`,allow:`clipboard-write`}),d=()=>{window.removeEventListener(`message`,ne),ee?.(),e.signOut(),Uv(),sessionStorage.removeItem(Av),f()},h=$(`button`,{type:`button`},Q(`aiKeys`));h.addEventListener(`click`,()=>b(()=>u.contentWindow?.location.replace(u.src)));let g=$(`button`,{type:`button`},Q(`signOut`));g.addEventListener(`click`,d),r($(`header`,{class:`broker-bar`},$(`span`,{},Q(`signedInAs`,{name:e.user.name||e.user.login})),$(`span`,{class:`broker-origin`},Q(`showing`,{address:n})),h,g),u);let ee,te=new Set,ne=r=>{if(r.source!==u.contentWindow||r.origin!==n||r.data?.type!==`goodfellow:broker-ready`)return;ee?.();let i=new MessageChannel,a=new MessageChannel;ee=Z_(i.port1,e,{async check(n){let r=await Ov(n,t.siteUrl,e);if(r.action===`refuse`){let e=r.paths.join(`, `);throw r.reason===`limits`?new W_(`limits`,Q(`refusedLimits`,{paths:e})):r.reason===`unknown`?new W_(`not-here`,Q(`refusedUnknown`,{paths:e})):new W_(`workflow`,Q(`refusedWorkflow`,{paths:e}))}if(r.action!==`ask`)return;let i=r.questions.filter(e=>e.kind!==`task`||!te.has(Fv(e)));if(i.length!==0){if(!await _(i))throw new W_(`declined`,Q(`declined`));for(let e of i)e.kind===`task`&&te.add(Fv(e))}},extra:{signOut:d,"ownerAccess.requestToken":()=>v(e),"comments.access.requestToken":()=>y(e)}}),a.port1.onmessage=e=>void m(a.port1,e.data);let o={hostName:c.name,redirectAddressesListed:c.canRedirect&&c.redirectAddressesListed===!0,aiServices:Object.keys(Rv())};u.contentWindow?.postMessage({type:V_,account:o},n,[i.port2,a.port2])};window.addEventListener(`message`,ne)}async function m(e,t){if(t?.type===`route`&&typeof t.hash==`string`){sessionStorage.setItem(Av,t.hash);return}if(t?.type!==`ai`)return;let[n=``,...r]=t.path.split(`?`)[0]?.split(`/`)??[],i=t.path.includes(`?`)?t.path.slice(t.path.indexOf(`?`)):``,a=new Request(`https://broker.invalid/${r.join(`/`)}${i}`,{method:t.method,headers:t.headers,...t.body&&t.method!==`GET`&&{body:t.body}}),o=await gv(Rv()).forward(a,n,r.join(`/`)),s=await o.arrayBuffer(),c={type:`ai`,id:t.id,status:o.status,headers:[...o.headers.entries()],body:s};e.postMessage(c,[s])}function h(e,t,n){return new Promise(r=>{let i=$(`dialog`,{class:`broker-dialog`},$(`h2`,{},e),...t),a=$(`div`,{class:`broker-actions`});for(let e of n){let t=$(`button`,{type:`button`,...e.primary&&{class:`broker-primary`}},e.label);t.addEventListener(`click`,()=>i.close(e.value?`yes`:`no`)),a.append(t)}i.append(a),i.addEventListener(`close`,()=>{i.remove(),r(i.returnValue===`yes`)}),document.body.append(i),i.showModal()})}function g(e){let{permissions:t}=e,n=(e,t)=>e?.length?[Q(t,{list:e.join(`, `)})]:[],r=[...n(t.connect,`pluginConnect`),...n(t.files,`pluginFiles`),...n(t.secrets,`pluginSecrets`),...n(t.read,`pluginRead`),...n(t.write,`pluginWrite`),...n(e.blocks,`pluginBlocks`),...e.admin?[Q(`pluginAdmin`)]:[],...e.build?.length?[Q(`pluginBuild`)]:[],...e.server?[Q(`pluginServer`)]:[],...e.editor?[Q(`pluginEditor`,{title:e.editor.title})]:[]];return r.length>0?r:[Q(`pluginNothing`)]}function _(e){let t=[$(`p`,{},Q(`confirmIntro`))],n=!1;for(let r of e)if(r.kind===`update`)t.push($(`p`,{},Q(`confirmUpdate`,{release:r.release})));else if(r.kind===`plugins`){n=!0;for(let e of r.installed){let{manifest:n}=e;t.push($(`p`,{},Q(`confirmPlugin`,{title:n.title,name:e.name,release:e.release})),$(`ul`,{},...g(n).map(e=>$(`li`,{},e)))),e.early&&t.push($(`p`,{class:`broker-warning`},Q(`confirmEarly`,{release:e.release,from:e.early.from,repository:e.early.repository,workflow:e.early.workflow})))}for(let e of r.removed)t.push($(`p`,{},Q(`confirmPluginRemove`,{name:e})))}else if(r.kind===`theme-early`)n=!0,t.push($(`p`,{},Q(`confirmThemeEarly`,{name:r.name,release:r.release})),$(`p`,{class:`broker-warning`},Q(`confirmEarly`,{release:r.release,from:r.from,repository:r.repository,workflow:r.workflow})));else if(r.kind===`editors`)t.push($(`p`,{},r.who?Q(`confirmEditors`,{who:r.who,role:r.role?` (${r.role})`:``}):Q(`confirmEditorsPublish`)));else if(r.kind===`editors-remove`)t.push($(`p`,{},Q(`confirmEditorsRemove`,{who:r.who})));else if(r.kind===`domain`){let e=r.change===`connect`?`confirmDomainConnect`:r.change===`secure`?`confirmDomainSecure`:`confirmDomainDisconnect`;t.push($(`p`,{},Q(e,{domain:r.domain})))}else if(r.kind===`task`)t.push($(`p`,{},Q(`confirmTask`,{plugin:r.plugin,task:r.task})));else if(r.kind===`updates-setup`)t.push($(`p`,{},Q(`confirmUpdatesSetup`)));else if(r.kind===`discard-draft`)t.push($(`p`,{},Q(`confirmDiscardDraft`,{name:r.name})));else if(r.kind===`comments-create`)t.push($(`p`,{},Q(`confirmCommentsCreate`,{name:r.name})));else if(r.kind===`comments-delete`)t.push($(`p`,{},Q(`confirmCommentsDelete`)));else{n=!0;let e=r.kind===`code`?`confirmCode`:r.kind===`custom-code`?`confirmCustomCode`:`confirmSiteAddress`;t.push($(`p`,{},Q(e)),$(`ul`,{},...r.paths.map(e=>$(`li`,{},$(`code`,{},e)))))}return n||(t[0]=$(`p`,{},Q(`confirmAskIntro`))),h(Q(n?`confirmTitle`:`confirmAskTitle`),t,[{label:Q(`cancel`),value:!1},{label:Q(n?`confirmPublish`:`confirmAllow`),value:!0,primary:!0}])}function v(e){let t=e.ownerAccess;if(!t)throw new W_(`not-here`,`This site's host has no owner token.`);return ee(t,Q(`ownerTitle`),Q(`ownerIntro`),Q(`ownerLabel`))}function y(e){let t=e.comments?.access;if(!t)throw new W_(`not-here`,`This site's host has no comments.`);return ee(t,Q(`commentsTitle`),Q(`commentsIntro`),Q(`commentsLabel`))}async function ee(e,t,n,r){let i=$(`input`,{type:`password`,id:`broker-owner-token`,autocomplete:`off`}),a=$(`p`,{class:`broker-error`,role:`alert`});for(;;){if(!await h(t,[$(`p`,{},n),$(`p`,{},$(`a`,{href:e.tokenLink.url,target:`_blank`,rel:`noreferrer`},Q(`ownerCreate`))),$(`label`,{for:`broker-owner-token`},r),i,a],[{label:Q(`cancel`),value:!1},{label:Q(`ownerUse`),value:!0,primary:!0}]))throw new W_(`declined`,Q(`declined`));try{await e.applyToken(i.value.trim());return}catch(e){a.textContent=Q(`signInError`,{message:Iv(e)})}}}async function b(e){let t=Rv(),n=new Map,r=Pv.map(e=>{let r=$(`input`,{type:`password`,id:`broker-ai-${e}`,autocomplete:`off`}),i=t[e];return typeof i==`string`&&(r.value=i),n.set(e,r),$(`div`,{},$(`label`,{for:`broker-ai-${e}`},lv[e].name),r)}),i=$(`input`,{type:`checkbox`,id:`broker-ai-remember`});if(i.checked=localStorage.getItem(Mv)!==null,!await h(Q(`aiTitle`),[$(`p`,{},Q(`aiIntro`)),...r,$(`label`,{class:`broker-check`},i,` ${Q(`aiRemember`)}`)],[{label:Q(`cancel`),value:!1},{label:Q(`aiSave`),value:!0,primary:!0}]))return;let a={};for(let[e,t]of n)t.value.trim()&&(a[e]=t.value.trim());zv(a,i.checked),e()}}await Gv({root:document.getElementById(`broker`),config:await fetch(`./broker.json`,{cache:`no-store`}).then(e=>e.ok?e.json():void 0).catch(()=>void 0),hosts:{"@goodfellow-cms/bitbucket":()=>i(()=>import(`./dist-BgSqMIdW.js`),__vite__mapDeps([0,1,2,3,4]),import.meta.url),"@goodfellow-cms/github":()=>i(()=>import(`./dist-pDBJlXWC.js`),__vite__mapDeps([5,6,1,2,7,3]),import.meta.url),"@goodfellow-cms/gitlab":()=>i(()=>import(`./dist-zCxHbxxj.js`),__vite__mapDeps([8,1,2,7,3,4]),import.meta.url)}});
|
package/site/files.json
CHANGED
|
@@ -4,10 +4,10 @@
|
|
|
4
4
|
"assets/content-repository-setup-CzHqy87S.js",
|
|
5
5
|
"assets/deploy-keys-DAj2oX-N-DRd_HmOG.js",
|
|
6
6
|
"assets/dist-BgSqMIdW.js",
|
|
7
|
-
"assets/dist-CoI2plUt.js",
|
|
8
7
|
"assets/dist-pDBJlXWC.js",
|
|
8
|
+
"assets/dist-zCxHbxxj.js",
|
|
9
9
|
"assets/git-eGyMXUIu.js",
|
|
10
|
-
"assets/index-
|
|
10
|
+
"assets/index-BEH5xJhr.js",
|
|
11
11
|
"assets/index-fBFd9gqV.css",
|
|
12
12
|
"assets/preload-helper-CEqbogAV.js",
|
|
13
13
|
"assets/scheduled-builds-BPfDaBYt.js",
|
package/site/index.html
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
/>
|
|
10
10
|
<meta name="referrer" content="no-referrer" />
|
|
11
11
|
<title>Sign in</title>
|
|
12
|
-
<script type="module" crossorigin src="./assets/index-
|
|
12
|
+
<script type="module" crossorigin src="./assets/index-BEH5xJhr.js"></script>
|
|
13
13
|
<link rel="modulepreload" crossorigin href="./assets/preload-helper-CEqbogAV.js">
|
|
14
14
|
<link rel="modulepreload" crossorigin href="./assets/store-BxUMMiN8.js">
|
|
15
15
|
<link rel="stylesheet" crossorigin href="./assets/index-fBFd9gqV.css">
|