This commit is contained in:
crazywhalecc
2026-06-25 11:06:38 +00:00
parent 8d4128c7d2
commit 0ffade7dca
364 changed files with 2743 additions and 7367 deletions

File diff suppressed because one or more lines are too long

2
CNAME
View File

@@ -1 +1 @@
static-php.dev
static-php.dev

View File

@@ -1 +1 @@
import{R as p}from"./chunks/theme.lltLxBIM.js";import{C as o,a5 as i,a6 as u,a7 as c,a8 as l,a9 as f,aa as d,ab as m,ac as h,ad as g,ae as A,d as y,u as C,p as v,y as w,af as P,ag as R,ah as b,ai as E}from"./chunks/framework.C2AwuPrQ.js";function r(e){if(e.extends){const a=r(e.extends);return{...a,...e,async enhanceApp(t){a.enhanceApp&&await a.enhanceApp(t),e.enhanceApp&&await e.enhanceApp(t)}}}return e}const n=r(p),S=y({name:"VitePressApp",setup(){const{site:e,lang:a,dir:t}=C();return v(()=>{w(()=>{document.documentElement.lang=a.value,document.documentElement.dir=t.value})}),e.value.router.prefetchLinks&&P(),R(),b(),n.setup&&n.setup(),()=>E(n.Layout)}});async function T(){globalThis.__VITEPRESS__=!0;const e=L(),a=D();a.provide(u,e);const t=c(e.route);return a.provide(l,t),a.component("Content",f),a.component("ClientOnly",d),Object.defineProperties(a.config.globalProperties,{$frontmatter:{get(){return t.frontmatter.value}},$params:{get(){return t.page.value.params}}}),n.enhanceApp&&await n.enhanceApp({app:a,router:e,siteData:m}),{app:a,router:e,data:t}}function D(){return A(S)}function L(){let e=o;return h(a=>{let t=g(a),s=null;return t&&(e&&(t=t.replace(/\.js$/,".lean.js")),s=import(t)),o&&(e=!1),s},n.NotFound)}o&&T().then(({app:e,router:a,data:t})=>{a.go(location.href,{initialLoad:!0}).then(()=>{i(a.route,t.site),e.mount("#app")})});export{T as createApp};
import{R as p}from"./chunks/theme.MOrVMOSc.js";import{C as o,a3 as i,a4 as u,a5 as c,a6 as l,a7 as f,a8 as d,a9 as m,aa as h,ab as g,ac as A,d as y,u as C,p as v,y as w,ad as P,ae as R,af as b,ag as E}from"./chunks/framework.Bhsyh9kO.js";function r(e){if(e.extends){const a=r(e.extends);return{...a,...e,async enhanceApp(t){a.enhanceApp&&await a.enhanceApp(t),e.enhanceApp&&await e.enhanceApp(t)}}}return e}const n=r(p),S=y({name:"VitePressApp",setup(){const{site:e,lang:a,dir:t}=C();return v(()=>{w(()=>{document.documentElement.lang=a.value,document.documentElement.dir=t.value})}),e.value.router.prefetchLinks&&P(),R(),b(),n.setup&&n.setup(),()=>E(n.Layout)}});async function T(){globalThis.__VITEPRESS__=!0;const e=L(),a=D();a.provide(u,e);const t=c(e.route);return a.provide(l,t),a.component("Content",f),a.component("ClientOnly",d),Object.defineProperties(a.config.globalProperties,{$frontmatter:{get(){return t.frontmatter.value}},$params:{get(){return t.page.value.params}}}),n.enhanceApp&&await n.enhanceApp({app:a,router:e,siteData:m}),{app:a,router:e,data:t}}function D(){return A(S)}function L(){let e=o;return h(a=>{let t=g(a),s=null;return t&&(e&&(t=t.replace(/\.js$/,".lean.js")),s=import(t)),o&&(e=!1),s},n.NotFound)}o&&T().then(({app:e,router:a,data:t})=>{a.go(location.href,{initialLoad:!0}).then(()=>{i(a.route,t.site),e.mount("#app")})});export{T as createApp};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1 +1 @@
import{d as p,x as i,p as _,c as s,o as e,j as t,t as u,G as h,H as v,_ as g}from"./framework.C2AwuPrQ.js";const f={class:"contributors-container"},b={key:0,class:"loading-state"},m={key:1,class:"error-state"},y={key:2,class:"contributors-grid"},k=["href","title"],w=["src","alt"],C={class:"contributor-name"},x=p({__name:"Contributors",setup(j){const c=i([]),l=i(!0),n=i(""),d=async()=>{try{l.value=!0,n.value="";const a=await fetch("https://api.github.com/repos/crazywhalecc/static-php-cli/contributors?per_page=24");if(!a.ok)throw new Error("Failed to fetch contributors");const o=await a.json();c.value=o}catch(a){n.value="Failed to load contributors. Please try again later.",console.error("Error fetching contributors:",a)}finally{l.value=!1}};return _(()=>{d()}),(a,o)=>(e(),s("div",f,[o[1]||(o[1]=t("div",{class:"contributors-header"},[t("h2",null,"Contributors"),t("p",{class:"contributors-description"}," Thanks to all the amazing people who have contributed to this project! ")],-1)),l.value?(e(),s("div",b,[...o[0]||(o[0]=[t("div",{class:"spinner"},null,-1),t("p",null,"Loading contributors...",-1)])])):n.value?(e(),s("div",m,[t("p",null,u(n.value),1)])):(e(),s("div",y,[(e(!0),s(h,null,v(c.value,r=>(e(),s("a",{key:r.id,href:r.html_url,target:"_blank",rel:"noopener noreferrer",class:"contributor-card",title:r.login},[t("img",{src:r.avatar_url,alt:r.login,class:"contributor-avatar",loading:"lazy"},null,8,w),t("div",C,u(r.login),1)],8,k))),128))]))]))}}),B=g(x,[["__scopeId","data-v-d508f059"]]);export{B as C};
import{d as p,x as i,p as _,c as s,o as e,j as t,t as u,G as h,H as v,_ as g}from"./framework.Bhsyh9kO.js";const f={class:"contributors-container"},b={key:0,class:"loading-state"},m={key:1,class:"error-state"},y={key:2,class:"contributors-grid"},k=["href","title"],w=["src","alt"],C={class:"contributor-name"},x=p({__name:"Contributors",setup(j){const c=i([]),l=i(!0),n=i(""),d=async()=>{try{l.value=!0,n.value="";const a=await fetch("https://api.github.com/repos/crazywhalecc/static-php-cli/contributors?per_page=24");if(!a.ok)throw new Error("Failed to fetch contributors");const o=await a.json();c.value=o}catch(a){n.value="Failed to load contributors. Please try again later.",console.error("Error fetching contributors:",a)}finally{l.value=!1}};return _(()=>{d()}),(a,o)=>(e(),s("div",f,[o[1]||(o[1]=t("div",{class:"contributors-header"},[t("h2",null,"Contributors"),t("p",{class:"contributors-description"}," Thanks to all the amazing people who have contributed to this project! ")],-1)),l.value?(e(),s("div",b,[...o[0]||(o[0]=[t("div",{class:"spinner"},null,-1),t("p",null,"Loading contributors...",-1)])])):n.value?(e(),s("div",m,[t("p",null,u(n.value),1)])):(e(),s("div",y,[(e(!0),s(h,null,v(c.value,r=>(e(),s("a",{key:r.id,href:r.html_url,target:"_blank",rel:"noopener noreferrer",class:"contributor-card",title:r.login},[t("img",{src:r.avatar_url,alt:r.login,class:"contributor-avatar",loading:"lazy"},null,8,w),t("div",C,u(r.login),1)],8,k))),128))]))]))}}),B=g(x,[["__scopeId","data-v-d508f059"]]);export{B as C};

View File

@@ -1 +0,0 @@
import{x as u,c as n,o as l,k as f,j as e,a as h,G as p,e as v,a3 as g,a4 as _,H as k,t as a}from"./framework.C2AwuPrQ.js";import{d as i}from"./extensions.data.B9rRhpZ-.js";const y={key:0,class:"warning custom-block",style:{"margin-bottom":"16px"}},w={class:"DocSearch-SearchBar",style:{padding:"0"}},b={class:"DocSearch-Form searchinput"},N={key:0},S=["href"],V=["href"],D={key:0,style:{margin:"0 4px 20px 4px",color:"var(--vp-c-text-2)","font-size":"14px"}},B={name:"SearchTable"},H=Object.assign(B,{setup(L){const m=i.missing,d=u(i.extensions),o=u(i.extensions),r=u(""),x=()=>{if(r.value===""){o.value=d.value;return}o.value=d.value.filter(c=>c.name.toLowerCase().includes(r.value.toLowerCase()))};return(c,s)=>(l(),n("div",null,[f(m)?(l(),n("div",y,[...s[1]||(s[1]=[e("p",{class:"custom-block-title"},"WARNING",-1),e("p",null,[h("Extension list is not generated yet. Run "),e("code",null,"bin/spc dev:gen-ext-docs"),h(" to generate it.")],-1)])])):(l(),n(p,{key:1},[e("header",w,[e("form",b,[g(e("input",{class:"DocSearch-Input","onUpdate:modelValue":s[0]||(s[0]=t=>r.value=t),placeholder:"Filter name...",onInput:x},null,544),[[_,r.value]])])]),e("table",null,[s[3]||(s[3]=e("thead",null,[e("tr",null,[e("th",null,"Extension Name"),e("th",null,"Linux"),e("th",null,"macOS"),e("th",null,"Windows"),e("th",null,"Website")])],-1)),e("tbody",null,[(l(!0),n(p,null,k(o.value,t=>(l(),n("tr",{key:t.name},[e("td",null,[t.hasNotes?(l(),n("a",{key:1,href:"./extension-notes.html#"+t.name},a(t.name),9,S)):(l(),n("span",N,a(t.name),1))]),e("td",null,a(t.linux?"✅":""),1),e("td",null,a(t.macos?"✅":""),1),e("td",null,a(t.windows?"✅":""),1),e("td",null,[t.url?(l(),n("a",{key:0,href:t.url,target:"_blank",rel:"noopener noreferrer",class:"ext-source-link"},[...s[2]||(s[2]=[e("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",width:"12",height:"12",fill:"currentColor"},[e("path",{d:"M10 6v2H5v11h11v-5h2v6a1 1 0 01-1 1H4a1 1 0 01-1-1V7a1 1 0 011-1h6zm11-3v8h-2V6.413l-7.793 7.794-1.414-1.414L17.585 5H13V3h8z"})],-1)])],8,V)):v("",!0)])]))),128))])]),o.value.length===0?(l(),n("div",D," No result, please try another keyword. ")):v("",!0)],64))]))}});export{H as _};

File diff suppressed because one or more lines are too long

View File

@@ -1 +0,0 @@
import{M as ln,N as an,O as Y,P as O,Q,R as un,S as y,T as tn,V as j,W as _,X as rn,Y as o,Z as sn,$ as on,a0 as fn}from"./mermaid.core.WsuUSYUF.js";function cn(l){return l.innerRadius}function yn(l){return l.outerRadius}function gn(l){return l.startAngle}function dn(l){return l.endAngle}function mn(l){return l&&l.padAngle}function pn(l,h,D,S,v,R,V,a){var E=D-l,i=S-h,n=V-v,d=a-R,u=d*E-n*i;if(!(u*u<y))return u=(n*(h-R)-d*(l-v))/u,[l+u*E,h+u*i]}function H(l,h,D,S,v,R,V){var a=l-D,E=h-S,i=(V?R:-R)/j(a*a+E*E),n=i*E,d=-i*a,u=l+n,s=h+d,f=D+n,c=S+d,W=(u+f)/2,t=(s+c)/2,m=f-u,g=c-s,A=m*m+g*g,T=v-R,P=u*c-f*s,I=(g<0?-1:1)*j(on(0,T*T*A-P*P)),M=(P*g-m*I)/A,N=(-P*m-g*I)/A,w=(P*g+m*I)/A,p=(-P*m+g*I)/A,x=M-W,e=N-t,r=w-W,X=p-t;return x*x+e*e>r*r+X*X&&(M=w,N=p),{cx:M,cy:N,x01:-n,y01:-d,x11:M*(v/T-1),y11:N*(v/T-1)}}function hn(){var l=cn,h=yn,D=Q(0),S=null,v=gn,R=dn,V=mn,a=null,E=ln(i);function i(){var n,d,u=+l.apply(this,arguments),s=+h.apply(this,arguments),f=v.apply(this,arguments)-un,c=R.apply(this,arguments)-un,W=rn(c-f),t=c>f;if(a||(a=n=E()),s<u&&(d=s,s=u,u=d),!(s>y))a.moveTo(0,0);else if(W>tn-y)a.moveTo(s*Y(f),s*O(f)),a.arc(0,0,s,f,c,!t),u>y&&(a.moveTo(u*Y(c),u*O(c)),a.arc(0,0,u,c,f,t));else{var m=f,g=c,A=f,T=c,P=W,I=W,M=V.apply(this,arguments)/2,N=M>y&&(S?+S.apply(this,arguments):j(u*u+s*s)),w=_(rn(s-u)/2,+D.apply(this,arguments)),p=w,x=w,e,r;if(N>y){var X=sn(N/u*O(M)),z=sn(N/s*O(M));(P-=X*2)>y?(X*=t?1:-1,A+=X,T-=X):(P=0,A=T=(f+c)/2),(I-=z*2)>y?(z*=t?1:-1,m+=z,g-=z):(I=0,m=g=(f+c)/2)}var Z=s*Y(m),$=s*O(m),B=u*Y(T),C=u*O(T);if(w>y){var F=s*Y(g),G=s*O(g),J=u*Y(A),K=u*O(A),q;if(W<an)if(q=pn(Z,$,J,K,F,G,B,C)){var L=Z-q[0],U=$-q[1],k=F-q[0],b=G-q[1],nn=1/O(fn((L*k+U*b)/(j(L*L+U*U)*j(k*k+b*b)))/2),en=j(q[0]*q[0]+q[1]*q[1]);p=_(w,(u-en)/(nn-1)),x=_(w,(s-en)/(nn+1))}else p=x=0}I>y?x>y?(e=H(J,K,Z,$,s,x,t),r=H(F,G,B,C,s,x,t),a.moveTo(e.cx+e.x01,e.cy+e.y01),x<w?a.arc(e.cx,e.cy,x,o(e.y01,e.x01),o(r.y01,r.x01),!t):(a.arc(e.cx,e.cy,x,o(e.y01,e.x01),o(e.y11,e.x11),!t),a.arc(0,0,s,o(e.cy+e.y11,e.cx+e.x11),o(r.cy+r.y11,r.cx+r.x11),!t),a.arc(r.cx,r.cy,x,o(r.y11,r.x11),o(r.y01,r.x01),!t))):(a.moveTo(Z,$),a.arc(0,0,s,m,g,!t)):a.moveTo(Z,$),!(u>y)||!(P>y)?a.lineTo(B,C):p>y?(e=H(B,C,F,G,u,-p,t),r=H(Z,$,J,K,u,-p,t),a.lineTo(e.cx+e.x01,e.cy+e.y01),p<w?a.arc(e.cx,e.cy,p,o(e.y01,e.x01),o(r.y01,r.x01),!t):(a.arc(e.cx,e.cy,p,o(e.y01,e.x01),o(e.y11,e.x11),!t),a.arc(0,0,u,o(e.cy+e.y11,e.cx+e.x11),o(r.cy+r.y11,r.cx+r.x11),t),a.arc(r.cx,r.cy,p,o(r.y11,r.x11),o(r.y01,r.x01),!t))):a.arc(0,0,u,T,A,t)}if(a.closePath(),n)return a=null,n+""||null}return i.centroid=function(){var n=(+l.apply(this,arguments)+ +h.apply(this,arguments))/2,d=(+v.apply(this,arguments)+ +R.apply(this,arguments))/2-an/2;return[Y(d)*n,O(d)*n]},i.innerRadius=function(n){return arguments.length?(l=typeof n=="function"?n:Q(+n),i):l},i.outerRadius=function(n){return arguments.length?(h=typeof n=="function"?n:Q(+n),i):h},i.cornerRadius=function(n){return arguments.length?(D=typeof n=="function"?n:Q(+n),i):D},i.padRadius=function(n){return arguments.length?(S=n==null?null:typeof n=="function"?n:Q(+n),i):S},i.startAngle=function(n){return arguments.length?(v=typeof n=="function"?n:Q(+n),i):v},i.endAngle=function(n){return arguments.length?(R=typeof n=="function"?n:Q(+n),i):R},i.padAngle=function(n){return arguments.length?(V=typeof n=="function"?n:Q(+n),i):V},i.context=function(n){return arguments.length?(a=n??null,i):a},i}export{hn as d};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1 +0,0 @@
import{U as a,D as n}from"./mermaid.core.WsuUSYUF.js";const t=(r,o)=>a.lang.round(n.parse(r)[o]);export{t as c};

View File

@@ -1 +0,0 @@
import{_ as a,e as w,l as x}from"./mermaid.core.WsuUSYUF.js";var d=a((e,t,i,r)=>{e.attr("class",i);const{width:o,height:h,x:n,y:c}=u(e,t);w(e,h,o,r);const s=l(n,c,o,h,t);e.attr("viewBox",s),x.debug(`viewBox configured: ${s} with padding: ${t}`)},"setupViewPortForSVG"),u=a((e,t)=>{const i=e.node()?.getBBox()||{width:0,height:0,x:0,y:0};return{width:i.width+t*2,height:i.height+t*2,x:i.x,y:i.y}},"calculateDimensionsWithPadding"),l=a((e,t,i,r,o)=>`${e-o} ${t-o} ${i} ${r}`,"createViewBox");export{d as s};

View File

@@ -1 +0,0 @@
import{_ as i}from"./mermaid.core.WsuUSYUF.js";function t(c,e){c.accDescr&&e.setAccDescription?.(c.accDescr),c.accTitle&&e.setAccTitle?.(c.accTitle),c.title&&e.setDiagramTitle?.(c.title)}i(t,"populateCommonDb");export{t as p};

View File

@@ -1 +0,0 @@
import{_ as a,d as o}from"./mermaid.core.WsuUSYUF.js";var d=a((t,e)=>{let n;return e==="sandbox"&&(n=o("#i"+t)),(e==="sandbox"?o(n.nodes()[0].contentDocument.body):o("body")).select(`[id="${t}"]`)},"getDiagramElement");export{d as g};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,15 +0,0 @@
import{_ as e}from"./mermaid.core.WsuUSYUF.js";var l=e(()=>`
/* Font Awesome icon styling - consolidated */
.label-icon {
display: inline-block;
height: 1em;
overflow: visible;
vertical-align: -0.125em;
}
.node .label-icon path {
fill: currentColor;
stroke: revert;
stroke-width: revert;
}
`,"getIconStyles");export{l as g};

View File

@@ -1 +0,0 @@
import{_ as i,d as l,n as d,j as o}from"./mermaid.core.WsuUSYUF.js";var x=i((r,t)=>{const e=r.append("rect");if(e.attr("x",t.x),e.attr("y",t.y),e.attr("fill",t.fill),e.attr("stroke",t.stroke),e.attr("width",t.width),e.attr("height",t.height),t.name&&e.attr("name",t.name),t.rx&&e.attr("rx",t.rx),t.ry&&e.attr("ry",t.ry),t.attrs!==void 0)for(const s in t.attrs)e.attr(s,t.attrs[s]);return t.class&&e.attr("class",t.class),e},"drawRect"),p=i((r,t)=>{const e={x:t.startx,y:t.starty,width:t.stopx-t.startx,height:t.stopy-t.starty,fill:t.fill,stroke:t.stroke,class:"rect"};x(r,e).lower()},"drawBackgroundRect"),y=i((r,t)=>{const e=t.text.replace(d," "),s=r.append("text");s.attr("x",t.x),s.attr("y",t.y),s.attr("class","legend"),s.style("text-anchor",t.anchor),t.class&&s.attr("class",t.class);const a=s.append("tspan");return a.attr("x",t.x+t.textMargin*2),a.text(e),s},"drawText"),m=i((r,t,e,s)=>{const a=r.append("image");a.attr("x",t),a.attr("y",e);const n=o.sanitizeUrl(s);a.attr("xlink:href",n)},"drawImage"),g=i((r,t,e,s)=>{const a=r.append("use");a.attr("x",t),a.attr("y",e);const n=o.sanitizeUrl(s);a.attr("xlink:href",`#${n}`)},"drawEmbeddedImage"),h=i(()=>({x:0,y:0,width:100,height:100,fill:"#EDF2AE",stroke:"#666",anchor:"start",rx:0,ry:0}),"getNoteRect"),f=i(()=>({x:0,y:0,width:100,height:100,"text-anchor":"start",style:"#666",textMargin:0,rx:0,ry:0,tspan:!0}),"getTextObj"),w=i(()=>{let r=l(".mermaidTooltip");return r.empty()&&(r=l("body").append("div").attr("class","mermaidTooltip").style("opacity",0).style("position","absolute").style("text-align","center").style("max-width","200px").style("padding","2px").style("font-size","12px").style("background","#ffffde").style("border","1px solid #333").style("border-radius","2px").style("pointer-events","none").style("z-index","100")),r},"createTooltip");export{p as a,f as b,w as c,x as d,g as e,m as f,h as g,y as h};

View File

@@ -1 +0,0 @@
import{_ as s}from"./mermaid.core.WsuUSYUF.js";var t,e=(t=class{constructor(i){this.init=i,this.records=this.init()}reset(){this.records=this.init()}},s(t,"ImperativeState"),t);export{e as I};

View File

@@ -1 +0,0 @@
import{s as a,c as s,a as e,C as t}from"./chunk-727SXJPM.DDamJJmS.js";import{_ as i}from"./mermaid.core.WsuUSYUF.js";import"./chunk-FMBD7UC4.BGC-9qj3.js";import"./chunk-ND2GUHAM.C8Xp7Al5.js";import"./chunk-55IACEB6.DRbZtpoG.js";import"./chunk-2J33WTMH.hjBnoQT6.js";import"./framework.C2AwuPrQ.js";var n={parser:e,get db(){return new t},renderer:s,styles:a,init:i(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{n as diagram};

View File

@@ -1 +0,0 @@
import{s as a,c as s,a as e,C as t}from"./chunk-727SXJPM.DDamJJmS.js";import{_ as i}from"./mermaid.core.WsuUSYUF.js";import"./chunk-FMBD7UC4.BGC-9qj3.js";import"./chunk-ND2GUHAM.C8Xp7Al5.js";import"./chunk-55IACEB6.DRbZtpoG.js";import"./chunk-2J33WTMH.hjBnoQT6.js";import"./framework.C2AwuPrQ.js";var n={parser:e,get db(){return new t},renderer:s,styles:a,init:i(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{n as diagram};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1 +0,0 @@
function J(n){return Math.abs(n=Math.round(n))>=1e21?n.toLocaleString("en").replace(/,/g,""):n.toString(10)}function j(n,t){if(!isFinite(n)||n===0)return null;var e=(n=t?n.toExponential(t-1):n.toExponential()).indexOf("e"),i=n.slice(0,e);return[i.length>1?i[0]+i.slice(2):i,+n.slice(e+1)]}function K(n){return n=j(Math.abs(n)),n?n[1]:NaN}function Q(n,t){return function(e,i){for(var o=e.length,a=[],c=0,h=n[0],M=0;o>0&&h>0&&(M+h+1>i&&(h=Math.max(1,i-M)),a.push(e.substring(o-=h,o+h)),!((M+=h+1)>i));)h=n[c=(c+1)%n.length];return a.reverse().join(t)}}function V(n){return function(t){return t.replace(/[0-9]/g,function(e){return n[+e]})}}var W=/^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;function $(n){if(!(t=W.exec(n)))throw new Error("invalid format: "+n);var t;return new L({fill:t[1],align:t[2],sign:t[3],symbol:t[4],zero:t[5],width:t[6],comma:t[7],precision:t[8]&&t[8].slice(1),trim:t[9],type:t[10]})}$.prototype=L.prototype;function L(n){this.fill=n.fill===void 0?" ":n.fill+"",this.align=n.align===void 0?">":n.align+"",this.sign=n.sign===void 0?"-":n.sign+"",this.symbol=n.symbol===void 0?"":n.symbol+"",this.zero=!!n.zero,this.width=n.width===void 0?void 0:+n.width,this.comma=!!n.comma,this.precision=n.precision===void 0?void 0:+n.precision,this.trim=!!n.trim,this.type=n.type===void 0?"":n.type+""}L.prototype.toString=function(){return this.fill+this.align+this.sign+this.symbol+(this.zero?"0":"")+(this.width===void 0?"":Math.max(1,this.width|0))+(this.comma?",":"")+(this.precision===void 0?"":"."+Math.max(0,this.precision|0))+(this.trim?"~":"")+this.type};function _(n){n:for(var t=n.length,e=1,i=-1,o;e<t;++e)switch(n[e]){case".":i=o=e;break;case"0":i===0&&(i=e),o=e;break;default:if(!+n[e])break n;i>0&&(i=0);break}return i>0?n.slice(0,i)+n.slice(o+1):n}var N;function v(n,t){var e=j(n,t);if(!e)return N=void 0,n.toPrecision(t);var i=e[0],o=e[1],a=o-(N=Math.max(-8,Math.min(8,Math.floor(o/3)))*3)+1,c=i.length;return a===c?i:a>c?i+new Array(a-c+1).join("0"):a>0?i.slice(0,a)+"."+i.slice(a):"0."+new Array(1-a).join("0")+j(n,Math.max(0,t+a-1))[0]}function X(n,t){var e=j(n,t);if(!e)return n+"";var i=e[0],o=e[1];return o<0?"0."+new Array(-o).join("0")+i:i.length>o+1?i.slice(0,o+1)+"."+i.slice(o+1):i+new Array(o-i.length+2).join("0")}const O={"%":(n,t)=>(n*100).toFixed(t),b:n=>Math.round(n).toString(2),c:n=>n+"",d:J,e:(n,t)=>n.toExponential(t),f:(n,t)=>n.toFixed(t),g:(n,t)=>n.toPrecision(t),o:n=>Math.round(n).toString(8),p:(n,t)=>X(n*100,t),r:X,s:v,X:n=>Math.round(n).toString(16).toUpperCase(),x:n=>Math.round(n).toString(16)};function R(n){return n}var U=Array.prototype.map,Y=["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"];function nn(n){var t=n.grouping===void 0||n.thousands===void 0?R:Q(U.call(n.grouping,Number),n.thousands+""),e=n.currency===void 0?"":n.currency[0]+"",i=n.currency===void 0?"":n.currency[1]+"",o=n.decimal===void 0?".":n.decimal+"",a=n.numerals===void 0?R:V(U.call(n.numerals,String)),c=n.percent===void 0?"%":n.percent+"",h=n.minus===void 0?"":n.minus+"",M=n.nan===void 0?"NaN":n.nan+"";function T(f,g){f=$(f);var b=f.fill,p=f.align,m=f.sign,w=f.symbol,S=f.zero,E=f.width,F=f.comma,y=f.precision,C=f.trim,d=f.type;d==="n"?(F=!0,d="g"):O[d]||(y===void 0&&(y=12),C=!0,d="g"),(S||b==="0"&&p==="=")&&(S=!0,b="0",p="=");var q=(g&&g.prefix!==void 0?g.prefix:"")+(w==="$"?e:w==="#"&&/[boxX]/.test(d)?"0"+d.toLowerCase():""),B=(w==="$"?i:/[%p]/.test(d)?c:"")+(g&&g.suffix!==void 0?g.suffix:""),D=O[d],H=/[defgprs%]/.test(d);y=y===void 0?6:/[gprs]/.test(d)?Math.max(1,Math.min(21,y)):Math.max(0,Math.min(20,y));function G(r){var l=q,u=B,x,I,k;if(d==="c")u=D(r)+u,r="";else{r=+r;var P=r<0||1/r<0;if(r=isNaN(r)?M:D(Math.abs(r),y),C&&(r=_(r)),P&&+r==0&&m!=="+"&&(P=!1),l=(P?m==="("?m:h:m==="-"||m==="("?"":m)+l,u=(d==="s"&&!isNaN(r)&&N!==void 0?Y[8+N/3]:"")+u+(P&&m==="("?")":""),H){for(x=-1,I=r.length;++x<I;)if(k=r.charCodeAt(x),48>k||k>57){u=(k===46?o+r.slice(x+1):r.slice(x))+u,r=r.slice(0,x);break}}}F&&!S&&(r=t(r,1/0));var z=l.length+r.length+u.length,s=z<E?new Array(E-z+1).join(b):"";switch(F&&S&&(r=t(s+r,s.length?E-u.length:1/0),s=""),p){case"<":r=l+r+u+s;break;case"=":r=l+s+r+u;break;case"^":r=s.slice(0,z=s.length>>1)+l+r+u+s.slice(z);break;default:r=s+l+r+u;break}return a(r)}return G.toString=function(){return f+""},G}function Z(f,g){var b=Math.max(-8,Math.min(8,Math.floor(K(g)/3)))*3,p=Math.pow(10,-b),m=T((f=$(f),f.type="f",f),{suffix:Y[8+b/3]});return function(w){return m(p*w)}}return{format:T,formatPrefix:Z}}var A,tn,rn;en({thousands:",",grouping:[3],currency:["$",""]});function en(n){return A=nn(n),tn=A.format,rn=A.formatPrefix,A}export{rn as a,tn as b,K as e,$ as f};

View File

@@ -1,43 +0,0 @@
import{_ as l,s as k,g as I,t as R,q as F,a as _,b as E,L as D,A as z,H as y,F as C,I as G,l as P,a1 as W,e as B}from"./mermaid.core.WsuUSYUF.js";import{p as H}from"./chunk-4BX2VUAB.tbDSeIh4.js";import{p as V}from"./wardley-L42UT6IY.C8rjnVeB.js";import"./framework.C2AwuPrQ.js";var m={showLegend:!0,ticks:5,max:null,min:0,graticule:"circle"},w={axes:[],curves:[],options:m},x=structuredClone(w),j=G.radar,q=l(()=>y({...j,...C().radar}),"getConfig"),b=l(()=>x.axes,"getAxes"),N=l(()=>x.curves,"getCurves"),U=l(()=>x.options,"getOptions"),X=l(a=>{x.axes=a.map(t=>({name:t.name,label:t.label??t.name}))},"setAxes"),Y=l(a=>{x.curves=a.map(t=>({name:t.name,label:t.label??t.name,entries:Z(t.entries)}))},"setCurves"),Z=l(a=>{if(a[0].axis==null)return a.map(e=>e.value);const t=b();if(t.length===0)throw new Error("Axes must be populated before curves for reference entries");return t.map(e=>{const r=a.find(s=>s.axis?.$refText===e.name);if(r===void 0)throw new Error("Missing entry for axis "+e.label);return r.value})},"computeCurveEntries"),J=l(a=>{const t=a.reduce((e,r)=>(e[r.name]=r,e),{});x.options={showLegend:t.showLegend?.value??m.showLegend,ticks:t.ticks?.value??m.ticks,max:t.max?.value??m.max,min:t.min?.value??m.min,graticule:t.graticule?.value??m.graticule}},"setOptions"),K=l(()=>{z(),x=structuredClone(w)},"clear"),$={getAxes:b,getCurves:N,getOptions:U,setAxes:X,setCurves:Y,setOptions:J,getConfig:q,clear:K,setAccTitle:E,getAccTitle:_,setDiagramTitle:F,getDiagramTitle:R,getAccDescription:I,setAccDescription:k},Q=l(a=>{H(a,$);const{axes:t,curves:e,options:r}=a;$.setAxes(t),$.setCurves(e),$.setOptions(r)},"populate"),tt={parse:l(async a=>{const t=await V("radar",a);P.debug(t),Q(t)},"parse")},et=l((a,t,e,r)=>{const s=r.db,o=s.getAxes(),i=s.getCurves(),n=s.getOptions(),c=s.getConfig(),d=s.getDiagramTitle(),p=D(t),u=at(p,c),g=n.max??Math.max(...i.map(f=>Math.max(...f.entries))),h=n.min,v=Math.min(c.width,c.height)/2;rt(u,o,v,n.ticks,n.graticule),st(u,o,v,c),M(u,o,i,h,g,n.graticule,c),T(u,i,n.showLegend,c),u.append("text").attr("class","radarTitle").text(d).attr("x",0).attr("y",-c.height/2-c.marginTop)},"draw"),at=l((a,t)=>{const e=t.width+t.marginLeft+t.marginRight,r=t.height+t.marginTop+t.marginBottom,s={x:t.marginLeft+t.width/2,y:t.marginTop+t.height/2};return B(a,r,e,t.useMaxWidth??!0),a.attr("viewBox",`0 0 ${e} ${r}`),a.append("g").attr("transform",`translate(${s.x}, ${s.y})`)},"drawFrame"),rt=l((a,t,e,r,s)=>{if(s==="circle")for(let o=0;o<r;o++){const i=e*(o+1)/r;a.append("circle").attr("r",i).attr("class","radarGraticule")}else if(s==="polygon"){const o=t.length;for(let i=0;i<r;i++){const n=e*(i+1)/r,c=t.map((d,p)=>{const u=2*p*Math.PI/o-Math.PI/2,g=n*Math.cos(u),h=n*Math.sin(u);return`${g},${h}`}).join(" ");a.append("polygon").attr("points",c).attr("class","radarGraticule")}}},"drawGraticule"),st=l((a,t,e,r)=>{const s=t.length;for(let o=0;o<s;o++){const i=t[o].label,n=2*o*Math.PI/s-Math.PI/2;a.append("line").attr("x1",0).attr("y1",0).attr("x2",e*r.axisScaleFactor*Math.cos(n)).attr("y2",e*r.axisScaleFactor*Math.sin(n)).attr("class","radarAxisLine"),a.append("text").text(i).attr("x",e*r.axisLabelFactor*Math.cos(n)).attr("y",e*r.axisLabelFactor*Math.sin(n)).attr("class","radarAxisLabel")}},"drawAxes");function M(a,t,e,r,s,o,i){const n=t.length,c=Math.min(i.width,i.height)/2;e.forEach((d,p)=>{if(d.entries.length!==n)return;const u=d.entries.map((g,h)=>{const v=2*Math.PI*h/n-Math.PI/2,f=A(g,r,s,c),S=f*Math.cos(v),O=f*Math.sin(v);return{x:S,y:O}});o==="circle"?a.append("path").attr("d",L(u,i.curveTension)).attr("class",`radarCurve-${p}`):o==="polygon"&&a.append("polygon").attr("points",u.map(g=>`${g.x},${g.y}`).join(" ")).attr("class",`radarCurve-${p}`)})}l(M,"drawCurves");function A(a,t,e,r){const s=Math.min(Math.max(a,t),e);return r*(s-t)/(e-t)}l(A,"relativeRadius");function L(a,t){const e=a.length;let r=`M${a[0].x},${a[0].y}`;for(let s=0;s<e;s++){const o=a[(s-1+e)%e],i=a[s],n=a[(s+1)%e],c=a[(s+2)%e],d={x:i.x+(n.x-o.x)*t,y:i.y+(n.y-o.y)*t},p={x:n.x-(c.x-i.x)*t,y:n.y-(c.y-i.y)*t};r+=` C${d.x},${d.y} ${p.x},${p.y} ${n.x},${n.y}`}return`${r} Z`}l(L,"closedRoundCurve");function T(a,t,e,r){if(!e)return;const s=(r.width/2+r.marginRight)*3/4,o=-(r.height/2+r.marginTop)*3/4,i=20;t.forEach((n,c)=>{const d=a.append("g").attr("transform",`translate(${s}, ${o+c*i})`);d.append("rect").attr("width",12).attr("height",12).attr("class",`radarLegendBox-${c}`),d.append("text").attr("x",16).attr("y",0).attr("class","radarLegendText").text(n.label)})}l(T,"drawLegend");var nt={draw:et},ot=l((a,t)=>{let e="";for(let r=0;r<a.THEME_COLOR_LIMIT;r++){const s=a[`cScale${r}`];e+=`
.radarCurve-${r} {
color: ${s};
fill: ${s};
fill-opacity: ${t.curveOpacity};
stroke: ${s};
stroke-width: ${t.curveStrokeWidth};
}
.radarLegendBox-${r} {
fill: ${s};
fill-opacity: ${t.curveOpacity};
stroke: ${s};
}
`}return e},"genIndexStyles"),it=l(a=>{const t=W(),e=C(),r=y(t,e.themeVariables),s=y(r.radar,a);return{themeVariables:r,radarOptions:s}},"buildRadarStyleOptions"),lt=l(({radar:a}={})=>{const{themeVariables:t,radarOptions:e}=it(a);return`
.radarTitle {
font-size: ${t.fontSize};
color: ${t.titleColor};
dominant-baseline: hanging;
text-anchor: middle;
}
.radarAxisLine {
stroke: ${e.axisColor};
stroke-width: ${e.axisStrokeWidth};
}
.radarAxisLabel {
dominant-baseline: middle;
text-anchor: middle;
font-size: ${e.axisLabelFontSize}px;
color: ${e.axisColor};
}
.radarGraticule {
fill: ${e.graticuleColor};
fill-opacity: ${e.graticuleOpacity};
stroke: ${e.graticuleColor};
stroke-width: ${e.graticuleStrokeWidth};
}
.radarLegendText {
text-anchor: start;
font-size: ${e.legendFontSize}px;
dominant-baseline: hanging;
}
${ot(t,e)}
`},"styles"),gt={parser:tt,db:$,renderer:nt,styles:lt};export{gt as diagram};

View File

@@ -1,10 +0,0 @@
import{_ as s,q as x,b as f,s as C,t as B,g as T,a as y,H as u,l as k,L as V,e as _,F as N,A as S,I as A}from"./mermaid.core.WsuUSYUF.js";import{p as D}from"./chunk-4BX2VUAB.tbDSeIh4.js";import{I}from"./chunk-QZHKN3VN.BUKTzDbl.js";import{p as $}from"./wardley-L42UT6IY.C8rjnVeB.js";import"./framework.C2AwuPrQ.js";var d=new I(()=>({cnt:1,stack:[{id:0,level:-1,name:"/",children:[]}]})),H=s(()=>{d.reset(),S()},"clear"),L=s(()=>d.records.stack[0],"getRoot"),X=s(()=>d.records.cnt,"getCount"),z=A.treeView,R=s(()=>u(z,N().treeView),"getConfig"),W=s((e,t)=>{for(;e<=d.records.stack[d.records.stack.length-1].level;)d.records.stack.pop();const a={id:d.records.cnt++,level:e,name:t,children:[]};d.records.stack[d.records.stack.length-1].children.push(a),d.records.stack.push(a)},"addNode"),E={clear:H,addNode:W,getRoot:L,getCount:X,getConfig:R,getAccTitle:y,getAccDescription:T,getDiagramTitle:B,setAccDescription:C,setAccTitle:f,setDiagramTitle:x},m=E,F=s(e=>{D(e,m),e.nodes.map(t=>m.addNode(t.indent?parseInt(t.indent):0,t.name))},"populate"),M={parse:s(async e=>{const t=await $("treeView",e);k.debug(t),F(t)},"parse")},Y=s((e,t,a,n,o)=>{const c=n.append("text").text(a.name).attr("dominant-baseline","middle").attr("class","treeView-node-label"),{height:g,width:r}=c.node().getBBox(),l=g+o.paddingY*2,i=r+o.paddingX*2;c.attr("x",e+o.paddingX),c.attr("y",t+l/2),a.BBox={x:e,y:t,width:i,height:l}},"positionLabel"),b=s((e,t,a,n,o,c)=>e.append("line").attr("x1",t).attr("y1",a).attr("x2",n).attr("y2",o).attr("stroke-width",c).attr("class","treeView-node-line"),"positionLine"),q=s((e,t,a)=>{let n=0,o=0;const c=s((r,l,i,h)=>{const v=h*(i.rowIndent+i.paddingX);Y(v,n,l,r,i);const{height:p,width:w}=l.BBox;b(r,v-i.rowIndent,n+p/2,v,n+p/2,i.lineThickness),o=Math.max(o,v+w),n+=p},"drawNode"),g=s((r,l=0)=>{c(e,r,a,l),r.children.forEach(p=>{g(p,l+1)});const{x:i,y:h,height:v}=r.BBox;if(r.children.length){const{y:p,height:w}=r.children[r.children.length-1].BBox;b(e,i+a.paddingX,h+v,i+a.paddingX,p+w/2+a.lineThickness/2,a.lineThickness)}},"processNode");return g(t),{totalHeight:n,totalWidth:o}},"drawTree"),j=s((e,t,a,n)=>{k.debug(`Rendering treeView diagram
`+e);const o=n.db,c=o.getRoot(),g=o.getConfig(),r=V(t),l=r.append("g");l.attr("class","tree-view");const{totalHeight:i,totalWidth:h}=q(l,c,g);r.attr("viewBox",`-${g.lineThickness/2} 0 ${h} ${i}`),_(r,i,h,g.useMaxWidth)},"draw"),G={draw:j},J=G,K={labelFontSize:"16px",labelColor:"black",lineColor:"black"},O=s(({treeView:e})=>{const{labelFontSize:t,labelColor:a,lineColor:n}=u(K,e);return`
.treeView-node-label {
font-size: ${t};
fill: ${a};
}
.treeView-node-line {
stroke: ${n};
}
`},"styles"),P=O,ae={db:m,renderer:J,parser:M,styles:P};export{ae as diagram};

File diff suppressed because one or more lines are too long

View File

@@ -1,24 +0,0 @@
import{_ as b,H as m,L as B,e as C,l as w,b as S,a as D,q as T,t as F,g as P,s as z,F as A,I as E,A as W}from"./mermaid.core.WsuUSYUF.js";import{p as _}from"./chunk-4BX2VUAB.tbDSeIh4.js";import{p as L}from"./wardley-L42UT6IY.C8rjnVeB.js";import"./framework.C2AwuPrQ.js";var N=E.packet,u,v=(u=class{constructor(){this.packet=[],this.setAccTitle=S,this.getAccTitle=D,this.setDiagramTitle=T,this.getDiagramTitle=F,this.getAccDescription=P,this.setAccDescription=z}getConfig(){const t=m({...N,...A().packet});return t.showBits&&(t.paddingY+=10),t}getPacket(){return this.packet}pushWord(t){t.length>0&&this.packet.push(t)}clear(){W(),this.packet=[]}},b(u,"PacketDB"),u),I=1e4,M=b((e,t)=>{_(e,t);let r=-1,s=[],n=1;const{bitsPerRow:l}=t.getConfig();for(let{start:a,end:i,bits:d,label:c}of e.blocks){if(a!==void 0&&i!==void 0&&i<a)throw new Error(`Packet block ${a} - ${i} is invalid. End must be greater than start.`);if(a??=r+1,a!==r+1)throw new Error(`Packet block ${a} - ${i??a} is not contiguous. It should start from ${r+1}.`);if(d===0)throw new Error(`Packet block ${a} is invalid. Cannot have a zero bit field.`);for(i??=a+(d??1)-1,d??=i-a+1,r=i,w.debug(`Packet block ${a} - ${r} with label ${c}`);s.length<=l+1&&t.getPacket().length<I;){const[p,o]=Y({start:a,end:i,bits:d,label:c},n,l);if(s.push(p),p.end+1===n*l&&(t.pushWord(s),s=[],n++),!o)break;({start:a,end:i,bits:d,label:c}=o)}}t.pushWord(s)},"populate"),Y=b((e,t,r)=>{if(e.start===void 0)throw new Error("start should have been set during first phase");if(e.end===void 0)throw new Error("end should have been set during first phase");if(e.start>e.end)throw new Error(`Block start ${e.start} is greater than block end ${e.end}.`);if(e.end+1<=t*r)return[e,void 0];const s=t*r-1,n=t*r;return[{start:e.start,end:s,label:e.label,bits:s-e.start},{start:n,end:e.end,label:e.label,bits:e.end-n}]},"getNextFittingBlock"),x={parser:{yy:void 0},parse:b(async e=>{const t=await L("packet",e),r=x.parser?.yy;if(!(r instanceof v))throw new Error("parser.parser?.yy was not a PacketDB. This is due to a bug within Mermaid, please report this issue at https://github.com/mermaid-js/mermaid/issues.");w.debug(t),M(t,r)},"parse")},H=b((e,t,r,s)=>{const n=s.db,l=n.getConfig(),{rowHeight:a,paddingY:i,bitWidth:d,bitsPerRow:c}=l,p=n.getPacket(),o=n.getDiagramTitle(),h=a+i,g=h*(p.length+1)-(o?0:a),k=d*c+2,f=B(t);f.attr("viewBox",`0 0 ${k} ${g}`),C(f,g,k,l.useMaxWidth);for(const[y,$]of p.entries())O(f,$,y,l);f.append("text").text(o).attr("x",k/2).attr("y",g-h/2).attr("dominant-baseline","middle").attr("text-anchor","middle").attr("class","packetTitle")},"draw"),O=b((e,t,r,{rowHeight:s,paddingX:n,paddingY:l,bitWidth:a,bitsPerRow:i,showBits:d})=>{const c=e.append("g"),p=r*(s+l)+l;for(const o of t){const h=o.start%i*a+1,g=(o.end-o.start+1)*a-n;if(c.append("rect").attr("x",h).attr("y",p).attr("width",g).attr("height",s).attr("class","packetBlock"),c.append("text").attr("x",h+g/2).attr("y",p+s/2).attr("class","packetLabel").attr("dominant-baseline","middle").attr("text-anchor","middle").text(o.label),!d)continue;const k=o.end===o.start,f=p-2;c.append("text").attr("x",h+(k?g/2:0)).attr("y",f).attr("class","packetByte start").attr("dominant-baseline","auto").attr("text-anchor",k?"middle":"start").text(o.start),k||c.append("text").attr("x",h+g).attr("y",f).attr("class","packetByte end").attr("dominant-baseline","auto").attr("text-anchor","end").text(o.end)}},"drawWord"),j={draw:H},q={byteFontSize:"10px",startByteColor:"black",endByteColor:"black",labelColor:"black",labelFontSize:"12px",titleColor:"black",titleFontSize:"14px",blockStrokeColor:"black",blockStrokeWidth:"1",blockFillColor:"#efefef"},G=b(({packet:e}={})=>{const t=m(q,e);return`
.packetByte {
font-size: ${t.byteFontSize};
}
.packetByte.start {
fill: ${t.startByteColor};
}
.packetByte.end {
fill: ${t.endByteColor};
}
.packetLabel {
fill: ${t.labelColor};
font-size: ${t.labelFontSize};
}
.packetTitle {
fill: ${t.titleColor};
font-size: ${t.titleFontSize};
}
.packetBlock {
stroke: ${t.blockStrokeColor};
stroke-width: ${t.blockStrokeWidth};
fill: ${t.blockFillColor};
}
`},"styles"),J={parser:x,get db(){return new v},renderer:j,styles:G};export{J as diagram};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,2 +0,0 @@
import{_ as a,l as s,L as o,e as i}from"./mermaid.core.WsuUSYUF.js";import{p as g}from"./wardley-L42UT6IY.C8rjnVeB.js";import"./framework.C2AwuPrQ.js";var p={parse:a(async r=>{const e=await g("info",r);s.debug(e)},"parse")},v={version:"11.15.0"},d=a(()=>v.version,"getVersion"),m={getVersion:d},c=a((r,e,n)=>{s.debug(`rendering info diagram
`+r);const t=o(e);i(t,100,400,!0),t.append("g").append("text").attr("x",100).attr("y",40).attr("class","version").attr("font-size",32).style("text-anchor","middle").text(`v${n}`)},"draw"),l={draw:c},b={parser:p,db:m,renderer:l};export{b as diagram};

View File

@@ -1 +0,0 @@
function t(e,a){switch(arguments.length){case 0:break;case 1:this.range(e);break;default:this.range(a).domain(e);break}return this}export{t as i};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1 +0,0 @@
import{i as a}from"./init.Gi6I4Gst.js";class o extends Map{constructor(n,t=g){if(super(),Object.defineProperties(this,{_intern:{value:new Map},_key:{value:t}}),n!=null)for(const[r,s]of n)this.set(r,s)}get(n){return super.get(c(this,n))}has(n){return super.has(c(this,n))}set(n,t){return super.set(l(this,n),t)}delete(n){return super.delete(p(this,n))}}function c({_intern:e,_key:n},t){const r=n(t);return e.has(r)?e.get(r):t}function l({_intern:e,_key:n},t){const r=n(t);return e.has(r)?e.get(r):(e.set(r,t),t)}function p({_intern:e,_key:n},t){const r=n(t);return e.has(r)&&(t=e.get(r),e.delete(r)),t}function g(e){return e!==null&&typeof e=="object"?e.valueOf():e}const f=Symbol("implicit");function h(){var e=new o,n=[],t=[],r=f;function s(u){let i=e.get(u);if(i===void 0){if(r!==f)return r;e.set(u,i=n.push(u)-1)}return t[i%t.length]}return s.domain=function(u){if(!arguments.length)return n.slice();n=[],e=new o;for(const i of u)e.has(i)||e.set(i,n.push(i)-1);return s},s.range=function(u){return arguments.length?(t=Array.from(u),s):t.slice()},s.unknown=function(u){return arguments.length?(r=u,s):r},s.copy=function(){return h(n,t).unknown(r)},a.apply(s,arguments),s}export{h as o};

View File

@@ -1,30 +0,0 @@
import{Q as S,T as R,b2 as J,_ as d,g as K,s as Y,a as tt,b as et,t as at,q as rt,l as W,c as nt,H as it,L as st,a4 as ot,e as lt,A as ct,I as ut}from"./mermaid.core.WsuUSYUF.js";import{p as dt}from"./chunk-4BX2VUAB.tbDSeIh4.js";import{p as pt}from"./wardley-L42UT6IY.C8rjnVeB.js";import{d as P}from"./arc.BWgyNIn7.js";import{o as gt}from"./ordinal.BYWQX77i.js";import"./framework.C2AwuPrQ.js";import"./init.Gi6I4Gst.js";function ft(t,a){return a<t?-1:a>t?1:a>=t?0:NaN}function ht(t){return t}function mt(){var t=ht,a=ft,f=null,y=S(0),s=S(R),p=S(0);function o(e){var n,l=(e=J(e)).length,g,h,v=0,c=new Array(l),i=new Array(l),x=+y.apply(this,arguments),w=Math.min(R,Math.max(-R,s.apply(this,arguments)-x)),m,D=Math.min(Math.abs(w)/l,p.apply(this,arguments)),$=D*(w<0?-1:1),u;for(n=0;n<l;++n)(u=i[c[n]=n]=+t(e[n],n,e))>0&&(v+=u);for(a!=null?c.sort(function(A,C){return a(i[A],i[C])}):f!=null&&c.sort(function(A,C){return f(e[A],e[C])}),n=0,h=v?(w-l*$)/v:0;n<l;++n,x=m)g=c[n],u=i[g],m=x+(u>0?u*h:0)+$,i[g]={data:e[g],index:n,value:u,startAngle:x,endAngle:m,padAngle:D};return i}return o.value=function(e){return arguments.length?(t=typeof e=="function"?e:S(+e),o):t},o.sortValues=function(e){return arguments.length?(a=e,f=null,o):a},o.sort=function(e){return arguments.length?(f=e,a=null,o):f},o.startAngle=function(e){return arguments.length?(y=typeof e=="function"?e:S(+e),o):y},o.endAngle=function(e){return arguments.length?(s=typeof e=="function"?e:S(+e),o):s},o.padAngle=function(e){return arguments.length?(p=typeof e=="function"?e:S(+e),o):p},o}var vt=ut.pie,z={sections:new Map,showData:!1},T=z.sections,F=z.showData,xt=structuredClone(vt),St=d(()=>structuredClone(xt),"getConfig"),yt=d(()=>{T=new Map,F=z.showData,ct()},"clear"),wt=d(({label:t,value:a})=>{if(a<0)throw new Error(`"${t}" has invalid value: ${a}. Negative values are not allowed in pie charts. All slice values must be >= 0.`);T.has(t)||(T.set(t,a),W.debug(`added new section: ${t}, with value: ${a}`))},"addSection"),At=d(()=>T,"getSections"),Ct=d(t=>{F=t},"setShowData"),Dt=d(()=>F,"getShowData"),_={getConfig:St,clear:yt,setDiagramTitle:rt,getDiagramTitle:at,setAccTitle:et,getAccTitle:tt,setAccDescription:Y,getAccDescription:K,addSection:wt,getSections:At,setShowData:Ct,getShowData:Dt},$t=d((t,a)=>{dt(t,a),a.setShowData(t.showData),t.sections.map(a.addSection)},"populateDb"),Tt={parse:d(async t=>{const a=await pt("pie",t);W.debug(a),$t(a,_)},"parse")},bt=d(t=>`
.pieCircle{
stroke: ${t.pieStrokeColor};
stroke-width : ${t.pieStrokeWidth};
opacity : ${t.pieOpacity};
}
.pieOuterCircle{
stroke: ${t.pieOuterStrokeColor};
stroke-width: ${t.pieOuterStrokeWidth};
fill: none;
}
.pieTitleText {
text-anchor: middle;
font-size: ${t.pieTitleTextSize};
fill: ${t.pieTitleTextColor};
font-family: ${t.fontFamily};
}
.slice {
font-family: ${t.fontFamily};
fill: ${t.pieSectionTextColor};
font-size:${t.pieSectionTextSize};
// fill: white;
}
.legend text {
fill: ${t.pieLegendTextColor};
font-family: ${t.fontFamily};
font-size: ${t.pieLegendTextSize};
}
`,"getStyles"),kt=bt,Et=d(t=>{const a=[...t.values()].reduce((s,p)=>s+p,0),f=[...t.entries()].map(([s,p])=>({label:s,value:p})).filter(s=>s.value/a*100>=1);return mt().value(s=>s.value).sort(null)(f)},"createPieArcs"),Mt=d((t,a,f,y)=>{W.debug(`rendering pie chart
`+t);const s=y.db,p=nt(),o=it(s.getConfig(),p.pie),e=40,n=18,l=4,g=450,h=g,v=st(a),c=v.append("g");c.attr("transform","translate("+h/2+","+g/2+")");const{themeVariables:i}=p;let[x]=ot(i.pieOuterStrokeWidth);x??=2;const w=o.textPosition,m=Math.min(h,g)/2-e,D=P().innerRadius(0).outerRadius(m),$=P().innerRadius(m*w).outerRadius(m*w);c.append("circle").attr("cx",0).attr("cy",0).attr("r",m+x/2).attr("class","pieOuterCircle");const u=s.getSections(),A=Et(u),C=[i.pie1,i.pie2,i.pie3,i.pie4,i.pie5,i.pie6,i.pie7,i.pie8,i.pie9,i.pie10,i.pie11,i.pie12];let b=0;u.forEach(r=>{b+=r});const L=A.filter(r=>(r.data.value/b*100).toFixed(0)!=="0"),k=gt(C).domain([...u.keys()]);c.selectAll("mySlices").data(L).enter().append("path").attr("d",D).attr("fill",r=>k(r.data.label)).attr("class","pieCircle"),c.selectAll("mySlices").data(L).enter().append("text").text(r=>(r.data.value/b*100).toFixed(0)+"%").attr("transform",r=>"translate("+$.centroid(r)+")").style("text-anchor","middle").attr("class","slice");const V=c.append("text").text(s.getDiagramTitle()).attr("x",0).attr("y",-400/2).attr("class","pieTitleText"),G=[...u.entries()].map(([r,M])=>({label:r,value:M})),E=c.selectAll(".legend").data(G).enter().append("g").attr("class","legend").attr("transform",(r,M)=>{const O=n+l,Q=O*G.length/2,X=12*n,Z=M*O-Q;return"translate("+X+","+Z+")"});E.append("rect").attr("width",n).attr("height",n).style("fill",r=>k(r.label)).style("stroke",r=>k(r.label)),E.append("text").attr("x",n+l).attr("y",n-l).text(r=>s.getShowData()?`${r.label} [${r.value}]`:r.label);const U=Math.max(...E.selectAll("text").nodes().map(r=>r?.getBoundingClientRect().width??0)),j=h+e+n+l+U,N=V.node()?.getBoundingClientRect().width??0,q=h/2-N/2,H=h/2+N/2,B=Math.min(0,q),I=Math.max(j,H)-B;v.attr("viewBox",`${B} 0 ${I} ${g}`),lt(v,g,I,o.useMaxWidth)},"draw"),Rt={draw:Mt},Ot={parser:Tt,db:_,renderer:Rt,styles:kt};export{Ot as diagram};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1 +0,0 @@
import{s as e,b as r,a,S as s}from"./chunk-AQP2D5EJ.B4iX4Bo1.js";import{_ as i}from"./mermaid.core.WsuUSYUF.js";import"./chunk-55IACEB6.DRbZtpoG.js";import"./chunk-2J33WTMH.hjBnoQT6.js";import"./framework.C2AwuPrQ.js";var p={parser:a,get db(){return new s(2)},renderer:r,styles:e,init:i(t=>{t.state||(t.state={}),t.state.arrowMarkerAbsolute=t.arrowMarkerAbsolute},"init")};export{p as diagram};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1 +0,0 @@
import{_ as i,c as a,o as n,aj as l}from"./chunks/framework.C2AwuPrQ.js";const c=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"deps-craft-yml.md","filePath":"deps-craft-yml.md"}'),p={name:"deps-craft-yml.md"};function t(e,s,h,k,r,d){return n(),a("div",null,[...s[0]||(s[0]=[l("",1)])])}const E=i(p,[["render",t]]);export{c as __pageData,E as default};

View File

@@ -1,30 +1,27 @@
import{_ as i,c as a,o as n,aj as l}from"./chunks/framework.C2AwuPrQ.js";const c=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"deps-craft-yml.md","filePath":"deps-craft-yml.md"}'),p={name:"deps-craft-yml.md"};function t(e,s,h,k,r,d){return n(),a("div",null,[...s[0]||(s[0]=[l(`<div class="language-yaml"><button title="Copy Code" class="copy"></button><span class="lang">yaml</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># PHP version to build (default: 8.5)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">php-version</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">8.5</span></span>
import{_ as i,c as a,o as n,ah as l}from"./chunks/framework.Bhsyh9kO.js";const E=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"deps-craft-yml.md","filePath":"deps-craft-yml.md"}'),t={name:"deps-craft-yml.md"};function p(e,s,h,k,r,d){return n(),a("div",null,[...s[0]||(s[0]=[l(`<div class="language-yaml"><button title="Copy Code" class="copy"></button><span class="lang">yaml</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># PHP version to build (default: 8.4)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">php-version</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">8.4</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># [REQUIRED] Static PHP extensions to build (list or comma-separated are both accepted)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">extensions</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">bcmath,fileinfo,phar,zlib,sodium,posix,pcntl</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Extra packages to build (list or comma-separated are both accepted)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">packages</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [ ]</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Extra libraries to build (list or comma-separated are both accepted)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">libs</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [ ]</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># [REQUIRED] Build SAPIs (list or comma-separated are both accepted)</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Available: cli, micro, fpm, embed, frankenphp, cgi, all</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">sapi</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">cli,micro,fpm</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Show full console output (default: false)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">debug</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">false</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Before build, remove all old build files and sources (default: false)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">clean-build</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">false</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Build options (same as \`build:php\` command options, all options are optional)</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Build options (same as \`build\` command options, all options are optional)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">build-options</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # Build with all suggested packages (libraries and extensions) as well (default: false)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> with-suggests</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">false</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # Build extra shared extensions (comma-separated string)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> build-shared</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;&quot;</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # Before build, remove all old build files and sources (default: false)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> with-clean</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">false</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # Build with all suggested libraries (default: false)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> with-suggested-libs</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">false</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # Build with all suggested extensions (default: false)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> with-suggested-exts</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">false</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # Build extra shared extensions (list or comma-separated are both accepted)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> build-shared</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [ ]</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # Build without stripping the binary (default: false)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> no-strip</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">false</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # Disable Opcache JIT (default: false)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> disable-opcache-jit</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">false</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # Enable thread-safe (ZTS) support (default: false)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> enable-zts</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">false</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # Disable smoke test, or for specific SAPIs comma-separated (default: false)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> no-smoke-test</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">false</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # PHP configuration options (same as --with-config-file-path)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> with-config-file-path</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;&quot;</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # PHP configuration options (same as --with-config-file-scan-dir)</span></span>
@@ -43,44 +40,29 @@ import{_ as i,c as a,o as n,aj as l}from"./chunks/framework.C2AwuPrQ.js";const c
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> with-micro-logo</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;&quot;</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # Set micro SAPI as win32 mode, without this, micro SAPI will be compiled as a console application (only for Windows, default: false)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> enable-micro-win32</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">false</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # Path to a folder to be embedded in FrankenPHP (frankenphp SAPI only)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> with-frankenphp-app</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Build options for shared extensions (list or comma-separated are both accepted)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">shared-extensions</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [ ]</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Download options</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">download-options</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # Number of parallel downloads (default: 1)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> parallel</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">1</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # Retries count for downloading sources (default: 0)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> retry</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">0</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # Prefer source downloads when both source and binary are available (default: false)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> prefer-source</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">false</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # Prefer binary downloads when both source and binary are available (default: false)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> prefer-binary</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">false</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # Only download source artifacts, skip binary artifacts (default: false)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> source-only</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">false</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # Only download binary artifacts, skip source artifacts (default: false)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> binary-only</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">false</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # Ignore download cache for specified packages, comma separated (default: false)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> ignore-cache</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">false</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # Do not use alternative mirror download sources (default: false)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> no-alt</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">false</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # Do not clone shallowly repositories when downloading sources (default: false)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> no-shallow-clone</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">false</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # Use custom url for specified sources, format: &quot;{source-name}:{url}&quot; (e.g. &quot;php-src:https://example.com/php-8.4.0.tar.gz&quot;)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> custom-url</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [ ]</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # Use custom git repo for specified sources, format: &quot;{source-name}:{branch}:{url}&quot; (e.g. &quot;php-src:master:https://github.com/php/php-src.git&quot;)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> custom-git</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [ ]</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # Use custom local source path, format: &quot;{source-name}:{path}&quot; (e.g. &quot;php-src:/path/to/php-src&quot;)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> custom-local</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [ ]</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # Retries count for downloading sources (default: 5)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> retry</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">5</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # Use pre-built libraries if available (default: false)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> prefer-pre-built</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">true</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # Do not download from alternative sources (default: false)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> no-alt</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">false</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">craft-options</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> doctor</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">true</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> download</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">true</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> build</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">true</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Extra environment variables</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">extra-env</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # e.g. Use github token to avoid rate limit</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> GITHUB_TOKEN</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">your-github-token</span></span></code></pre></div>`,1)])])}const E=i(p,[["render",t]]);export{c as __pageData,E as default};
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> GITHUB_TOKEN</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">your-github-token</span></span></code></pre></div>`,1)])])}const c=i(t,[["render",p]]);export{E as __pageData,c as default};

View File

@@ -0,0 +1 @@
import{_ as i,c as a,o as n,ah as l}from"./chunks/framework.Bhsyh9kO.js";const E=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"deps-craft-yml.md","filePath":"deps-craft-yml.md"}'),t={name:"deps-craft-yml.md"};function p(e,s,h,k,r,d){return n(),a("div",null,[...s[0]||(s[0]=[l("",1)])])}const c=i(t,[["render",p]]);export{E as __pageData,c as default};

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
import{_ as d,c as b,o as r,ah as s}from"./chunks/framework.Bhsyh9kO.js";const c=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"deps-map-ext.md","filePath":"deps-map-ext.md"}'),l={name:"deps-map-ext.md"};function i(e,t,o,p,n,m){return r(),b("div",null,[...t[0]||(t[0]=[s("",8)])])}const g=d(l,[["render",i]]);export{c as __pageData,g as default};

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
import{_ as d,c as b,o as r,ah as i}from"./chunks/framework.Bhsyh9kO.js";const g=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"deps-map-lib.md","filePath":"deps-map-lib.md"}'),l={name:"deps-map-lib.md"};function e(s,t,n,p,a,o){return r(),b("div",null,[...t[0]||(t[0]=[i("",8)])])}const z=d(l,[["render",e]]);export{g as __pageData,z as default};

View File

@@ -1 +0,0 @@
import{_ as n,c as i,o as a,j as e,a as r}from"./chunks/framework.C2AwuPrQ.js";const m=JSON.parse('{"title":"Contributing","description":"","frontmatter":{},"headers":[],"relativePath":"en/contributing/index.md","filePath":"en/contributing/index.md"}'),o={name:"en/contributing/index.md"};function s(c,t,d,l,u,p){return a(),i("div",null,[...t[0]||(t[0]=[e("h1",{id:"contributing",tabindex:"-1"},[r("Contributing "),e("a",{class:"header-anchor",href:"#contributing","aria-label":"Permalink to “Contributing”"},"")],-1)])])}const f=n(o,[["render",s]]);export{m as __pageData,f as default};

View File

@@ -1 +0,0 @@
import{_ as n,c as i,o as a,j as e,a as r}from"./chunks/framework.C2AwuPrQ.js";const m=JSON.parse('{"title":"Contributing","description":"","frontmatter":{},"headers":[],"relativePath":"en/contributing/index.md","filePath":"en/contributing/index.md"}'),o={name:"en/contributing/index.md"};function s(c,t,d,l,u,p){return a(),i("div",null,[...t[0]||(t[0]=[e("h1",{id:"contributing",tabindex:"-1"},[r("Contributing "),e("a",{class:"header-anchor",href:"#contributing","aria-label":"Permalink to “Contributing”"},"")],-1)])])}const f=n(o,[["render",s]]);export{m as __pageData,f as default};

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
import{_ as t,c as i,o,ah as n}from"./chunks/framework.Bhsyh9kO.js";const m=JSON.parse('{"title":"Contributing","description":"","frontmatter":{},"headers":[],"relativePath":"en/contributing/index.md","filePath":"en/contributing/index.md"}'),a={name:"en/contributing/index.md"};function r(s,e,c,l,d,h){return o(),i("div",null,[...e[0]||(e[0]=[n("",18)])])}const p=t(a,[["render",r]]);export{m as __pageData,p as default};

View File

@@ -1,129 +0,0 @@
import{_ as i,c as a,o as e,aj as t}from"./chunks/framework.C2AwuPrQ.js";const c=JSON.parse('{"title":"Artifact Model","description":"","frontmatter":{"outline":"deep"},"headers":[],"relativePath":"en/develop/artifact-model.md","filePath":"en/develop/artifact-model.md"}'),l={name:"en/develop/artifact-model.md"};function n(h,s,r,p,o,d){return e(),a("div",null,[...s[0]||(s[0]=[t(`<h1 id="artifact-model" tabindex="-1">Artifact Model <a class="header-anchor" href="#artifact-model" aria-label="Permalink to “Artifact Model”"></a></h1><p>An <strong>Artifact</strong> is a core concept in the StaticPHP build system. It represents a source archive or pre-built binary required to build a package. Each artifact describes where to download the file, how to extract it, and the resulting path layout. Packages reference one or more artifacts via the <code>artifact</code> field to obtain the source code or binaries they need.</p><h2 id="defining-an-artifact" tabindex="-1">Defining an Artifact <a class="header-anchor" href="#defining-an-artifact" aria-label="Permalink to “Defining an Artifact”"></a></h2><p>Here is a minimal artifact object that points to a source archive (curl&#39;s source code):</p><div class="language-yaml"><button title="Copy Code" class="copy"></button><span class="lang">yaml</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">&amp;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> source</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> type</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">ghrel</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> repo</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">curl/curl</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> match</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">curl.+\\.tar\\.xz</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> prefer-stable</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">true</span></span></code></pre></div><p>There are two ways to define an artifact and associate it with a package: <strong>inline</strong> (defined directly inside the package file) or <strong>standalone</strong> (defined in a separate file and referenced by name):</p><div class="vp-code-group"><div class="tabs"><input type="radio" name="group-16" id="tab-17" checked><label data-title="Inline Artifact" for="tab-17">Inline Artifact</label><input type="radio" name="group-16" id="tab-18"><label data-title="Standalone Artifact" for="tab-18">Standalone Artifact</label><input type="radio" name="group-16" id="tab-19"><label data-title="Package Referencing a Standalone Artifact" for="tab-19">Package Referencing a Standalone Artifact</label></div><div class="blocks"><div class="language-yaml active"><button title="Copy Code" class="copy"></button><span class="lang">yaml</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># This is a package declaration</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">curl</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> type</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">target</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> artifact</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> source</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> type</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">ghrel</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> repo</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">curl/curl</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> match</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">curl.+\\.tar\\.xz</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> prefer-stable</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">true</span></span></code></pre></div><div class="language-yaml"><button title="Copy Code" class="copy"></button><span class="lang">yaml</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># This is a standalone artifact declaration, typically placed under config/artifact/</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">curl-src</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> source</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> type</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">ghrel</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> repo</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">curl/curl</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> match</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">curl.+\\.tar\\.xz</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> prefer-stable</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">true</span></span></code></pre></div><div class="language-yaml"><button title="Copy Code" class="copy"></button><span class="lang">yaml</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># This is a package declaration</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">curl</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> type</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">target</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> artifact</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">curl-src</span></span></code></pre></div></div></div><h2 id="structure" tabindex="-1">Structure <a class="header-anchor" href="#structure" aria-label="Permalink to “Structure”"></a></h2><p>An artifact has three top-level sections: <code>source</code>, <code>binary</code>, and <code>metadata</code>.</p><ul><li><code>source</code> — the source code archive</li><li><code>binary</code> — pre-built binaries for specific platforms</li><li><code>metadata</code> — additional information such as license paths</li></ul><p>Both <code>source</code> and <code>binary</code> accept either an inline source object or a reference to a standalone artifact by name (as shown above).</p><p>Full artifact object format:</p><div class="language-yaml"><button title="Copy Code" class="copy"></button><span class="lang">yaml</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">&amp;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> source</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: {</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">source-object</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">} </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># (optional)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> binary</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> windows-x86_64</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: {</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">source-object</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">} </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># (optional)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> linux-x86_64</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: {</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">source-object</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">} </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># (optional)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> linux-aarch64</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: {</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">source-object</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">} </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># (optional)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> macos-x86_64</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: {</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">source-object</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">} </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># (optional)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> macos-aarch64</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: {</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">source-object</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">} </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># (optional)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> metadata</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># (optional)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> license</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;&quot;</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # (optional) SPDX identifier</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> license-files</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;LICENSE&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">] </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># License files from the source directory</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> source-root</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;subdir&quot;</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # (optional) Use if the actual source root is inside a subdirectory</span></span></code></pre></div><p>The basic format of a <code>source-object</code>:</p><div class="language-yaml"><button title="Copy Code" class="copy"></button><span class="lang">yaml</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">&amp;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> type</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;url&quot;</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # Download type</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # ...: Additional keys depend on the type; see below</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> extract</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;path/to/dir&quot;</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # (optional) Override extract path; default: SOURCE_PATH/{artifact-name}</span></span></code></pre></div><h2 id="metadata" tabindex="-1">Metadata <a class="header-anchor" href="#metadata" aria-label="Permalink to “Metadata”"></a></h2><p>The <code>metadata</code> field provides supplementary information about an artifact. It supports three subfields:</p><h3 id="license" tabindex="-1">license <a class="header-anchor" href="#license" aria-label="Permalink to “license”"></a></h3><ul><li><strong>Type</strong>: <code>string</code> (optional)</li><li><strong>Description</strong>: The open-source license identifier for this package, following the <a href="https://spdx.org/licenses/" target="_blank" rel="noreferrer">SPDX License Identifier</a> format (e.g. <code>MIT</code>, <code>Apache-2.0</code>, <code>GPL-2.0-only</code>). This is used only for annotation in the license summary of the build output and has no effect on the build process itself.</li></ul><div class="language-yaml"><button title="Copy Code" class="copy"></button><span class="lang">yaml</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">metadata</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> license</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">MIT</span></span></code></pre></div><h3 id="license-files" tabindex="-1">license-files <a class="header-anchor" href="#license-files" aria-label="Permalink to “license-files”"></a></h3><ul><li><strong>Type</strong>: <code>string[]</code> (optional)</li><li><strong>Description</strong>: A list of paths to license files. After a successful build, the framework collects these files and places them in the <code>license/</code> directory of the build output. Two path formats are supported: <ul><li><strong>Relative paths</strong> (e.g. <code>LICENSE</code>, <code>COPYING</code>, <code>gettext-runtime/intl/COPYING.LIB</code>): resolved relative to the artifact&#39;s source root directory.</li><li><strong><code>@/</code> prefix</strong> (e.g. <code>@/bzip2.txt</code>): references a license file bundled with the framework itself, resolved to <code>src/globals/licenses/</code>. This is useful when the upstream source package does not include a license file (or the license text is embedded in other documentation) — in such cases, the license text can be placed in the built-in directory and referenced with <code>@/</code>.</li></ul></li></ul><p>The following built-in license files are currently available: <code>bzip2.txt</code>, <code>gmp.txt</code>, <code>icu.txt</code>, <code>postgresql.txt</code>, <code>sqlite.txt</code>, <code>zlib.txt</code>.</p><div class="language-yaml"><button title="Copy Code" class="copy"></button><span class="lang">yaml</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Common case: read from the source directory</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">metadata</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> license-files</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">LICENSE</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">]</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Multiple license files</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">metadata</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> license-files</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">LICENSE</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">COPYING.LESSER</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">]</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># License file inside a subdirectory</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">metadata</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> license-files</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">gettext-runtime/intl/COPYING.LIB</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">]</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Use a built-in license file when the source package does not include one</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">metadata</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> license-files</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;@/bzip2.txt&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">]</span></span></code></pre></div><h3 id="source-root" tabindex="-1">source-root <a class="header-anchor" href="#source-root" aria-label="Permalink to “source-root”"></a></h3><ul><li><strong>Type</strong>: <code>string</code> (optional)</li><li><strong>Description</strong>: When the actual source root is located inside a subdirectory of the extracted archive, this field specifies that subdirectory name. The framework will use this path as the working directory during the build instead of the top-level extraction directory.</li></ul><div class="language-yaml"><button title="Copy Code" class="copy"></button><span class="lang">yaml</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># krb5&#39;s actual source root is in the src/ subdirectory after extraction</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">metadata</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> source-root</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">src</span></span></code></pre></div><h2 id="download-types" tabindex="-1">Download Types <a class="header-anchor" href="#download-types" aria-label="Permalink to “Download Types”"></a></h2><p>Artifacts support a variety of download types. Choose the one that best fits where the package is hosted.</p><table tabindex="0"><thead><tr><th>Type</th><th>Description</th></tr></thead><tbody><tr><td><code>url</code></td><td>Download from a fixed URL. Supports <code>filename</code> (custom local filename) and <code>version</code> (manually set version).</td></tr><tr><td><code>git</code></td><td>Clone from a Git repository. Supports <code>rev</code> (branch/tag/commit), <code>submodules</code> (fetch submodules), and <code>extract</code>.</td></tr><tr><td><code>ghrel</code></td><td>Download from GitHub Release Assets by regex match. Requires <code>repo</code> (<code>owner/repo</code>) and <code>match</code> (filename regex). Supports <code>prefer-stable</code>.</td></tr><tr><td><code>ghtar</code></td><td>Download the source tarball from a GitHub Release (<code>/releases</code> API), matching by release name with <code>match</code>. Supports <code>prefer-stable</code>.</td></tr><tr><td><code>ghtagtar</code></td><td>Download the source tarball from a GitHub Tag (<code>/tags</code> API), matching by tag name with <code>match</code>. Supports <code>prefer-stable</code>.</td></tr><tr><td><code>filelist</code></td><td>Scrape an HTML page for a file listing, extract the filename and version via <code>regex</code>, then download the matched file. Suitable for official download index pages (e.g. ftp.gnu.org, openssl.org).</td></tr><tr><td><code>pecl</code></td><td>Download a PHP extension from <a href="https://pecl.php.net" target="_blank" rel="noreferrer">PECL</a> by <code>name</code>. Supports <code>prefer-stable</code>.</td></tr><tr><td><code>pie</code></td><td>Download a PHP extension from Packagist via the <a href="https://github.com/php/pie" target="_blank" rel="noreferrer">PIE</a> spec. Requires <code>repo</code> (<code>vendor/package</code>).</td></tr><tr><td><code>php-release</code></td><td>Download official PHP source from php.net. The version is controlled by the <code>--with-php</code> build argument.</td></tr><tr><td><code>bitbuckettag</code></td><td>Download source tarball from the latest Bitbucket tag. Requires <code>repo</code> (<code>workspace/repo</code>).</td></tr><tr><td><code>local</code></td><td>Use a pre-existing local directory as the source. Requires <code>dirname</code>. Useful for offline or development scenarios.</td></tr><tr><td><code>custom</code></td><td>Fully custom download logic implemented in a PHP class under <code>src/Package/Artifact/</code>. Optionally calls a specific method via <code>func</code>.</td></tr></tbody></table><h2 id="type-reference" tabindex="-1">Type Reference <a class="header-anchor" href="#type-reference" aria-label="Permalink to “Type Reference”"></a></h2><h3 id="url" tabindex="-1">url <a class="header-anchor" href="#url" aria-label="Permalink to “url”"></a></h3><p>Downloads a file from a fixed URL and extracts it automatically.</p><ul><li><strong>Class</strong>: <code>StaticPHP\\Artifact\\Downloader\\Type\\Url</code></li><li><strong>Capabilities</strong>: Basic download only; no automatic version update checking</li><li><strong>Required</strong>: <code>url</code> — the download address</li><li><strong>Optional</strong>: <ul><li><code>filename</code> — local filename to save as (defaults to the last path segment of the URL)</li><li><code>version</code> — manually specify a version string (this type cannot auto-detect versions)</li><li><code>extract</code> — override the extraction directory (default: <code>SOURCE_PATH/{artifact-name}</code>)</li></ul></li></ul><div class="language-yaml"><button title="Copy Code" class="copy"></button><span class="lang">yaml</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># sqlite downloaded from a fixed URL</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">artifact</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> source</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> type</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">url</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> url</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;https://www.sqlite.org/2024/sqlite-autoconf-3450200.tar.gz&#39;</span></span></code></pre></div><div class="tip custom-block"><p class="custom-block-title custom-block-title-default">TIP</p><p>Inside an artifact, a bare string starting with <code>http://</code> or <code>https://</code> is automatically expanded into a <code>type: url</code> object, so you can often just write the URL directly:</p><div class="language-yaml"><button title="Copy Code" class="copy"></button><span class="lang">yaml</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">artifact</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> source</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;https://www.sqlite.org/2024/sqlite-autoconf-3450200.tar.gz&#39;</span></span></code></pre></div></div><hr><h3 id="git" tabindex="-1">git <a class="header-anchor" href="#git" aria-label="Permalink to “git”"></a></h3><p>Clones a Git repository as the source. Supports two modes: clone a specific branch/tag/commit (<code>rev</code>), or use a regex to match the highest-versioned branch from all remote refs (<code>regex</code>).</p><ul><li><strong>Class</strong>: <code>StaticPHP\\Artifact\\Downloader\\Type\\Git</code></li><li><strong>Capabilities</strong>: Version update checking (<code>CheckUpdateInterface</code>)</li><li><strong>Required</strong>: <code>url</code> — repository URL</li><li><strong>Optional</strong> (at least one of <code>rev</code> or <code>regex</code> is required): <ul><li><code>rev</code> — clone a specific branch, tag, or commit hash</li><li><code>regex</code> — match remote branch names with a PCRE regex; the highest matching version is selected (must include a named capture group <code>(?P&lt;version&gt;...)</code>)</li><li><code>submodules</code> — whether to fetch git submodules (boolean)</li><li><code>extract</code> — override the clone target directory</li></ul></li></ul><div class="language-yaml"><button title="Copy Code" class="copy"></button><span class="lang">yaml</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># php-glfw cloned from the master branch</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">artifact</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> source</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> type</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">git</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> url</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;https://github.com/mario-deluna/php-glfw&#39;</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> rev</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">master</span></span></code></pre></div><hr><h3 id="ghrel" tabindex="-1">ghrel <a class="header-anchor" href="#ghrel" aria-label="Permalink to “ghrel”"></a></h3><p>Downloads a file from GitHub Release Assets using a regex to match the asset filename. Best suited for repositories that upload pre-compiled packages or source archives as release assets.</p><ul><li><strong>Class</strong>: <code>StaticPHP\\Artifact\\Downloader\\Type\\GitHubRelease</code></li><li><strong>Capabilities</strong>: Version update checking (<code>CheckUpdateInterface</code>), integrity verification (<code>ValidatorInterface</code>, SHA256)</li><li><strong>Required</strong>: <ul><li><code>repo</code> — repository path in <code>owner/repo</code> format</li><li><code>match</code> — PCRE regex (without delimiters) to match the asset filename, e.g. <code>openssl.+\\.tar\\.gz</code></li></ul></li><li><strong>Optional</strong>: <ul><li><code>prefer-stable</code> — skip pre-release versions (default: <code>true</code>)</li><li><code>query</code> — query string appended to the API URL (e.g. <code>?per_page=5</code>)</li><li><code>extract</code> — override extraction directory</li></ul></li></ul><div class="language-yaml"><button title="Copy Code" class="copy"></button><span class="lang">yaml</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># openssl downloaded from GitHub Release Assets</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">artifact</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> source</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> type</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">ghrel</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> repo</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">openssl/openssl</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> match</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">openssl.+\\.tar\\.gz</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> prefer-stable</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">true</span></span></code></pre></div><hr><h3 id="ghtar" tabindex="-1">ghtar <a class="header-anchor" href="#ghtar" aria-label="Permalink to “ghtar”"></a></h3><p>Downloads the source tarball automatically generated by a GitHub Release (the &quot;Source code&quot; archive on the Release page). Unlike <code>ghrel</code> which downloads uploaded assets, <code>ghtar</code> uses the auto-generated tarball from the <code>/releases</code> API.</p><ul><li><strong>Class</strong>: <code>StaticPHP\\Artifact\\Downloader\\Type\\GitHubTarball</code></li><li><strong>Capabilities</strong>: Version update checking (<code>CheckUpdateInterface</code>)</li><li><strong>Required</strong>: <code>repo</code> — repository path in <code>owner/repo</code> format</li><li><strong>Optional</strong>: <ul><li><code>prefer-stable</code> — skip pre-release versions (default: <code>true</code>)</li><li><code>match</code> — regex filter applied to <code>tarball_url</code> (if omitted, the first result is used)</li><li><code>query</code> — query string appended to the API URL</li><li><code>extract</code> — override extraction directory</li></ul></li></ul><div class="language-yaml"><button title="Copy Code" class="copy"></button><span class="lang">yaml</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># librdkafka downloaded via GitHub Release tarball</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">artifact</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> source</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> type</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">ghtar</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> repo</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">confluentinc/librdkafka</span></span></code></pre></div><hr><h3 id="ghtagtar" tabindex="-1">ghtagtar <a class="header-anchor" href="#ghtagtar" aria-label="Permalink to “ghtagtar”"></a></h3><p>Downloads a source tarball from a GitHub Tag via the <code>/tags</code> API. Functionally identical to <code>ghtar</code>, but targets the tags endpoint instead of releases — useful for repositories that tag releases without creating a formal GitHub Release.</p><ul><li><strong>Class</strong>: <code>StaticPHP\\Artifact\\Downloader\\Type\\GitHubTarball</code> (shared with <code>ghtar</code>)</li><li><strong>Capabilities</strong>: Version update checking (<code>CheckUpdateInterface</code>)</li><li><strong>Required</strong>: <code>repo</code> — repository path in <code>owner/repo</code> format</li><li><strong>Optional</strong>: <ul><li><code>prefer-stable</code> — skip pre-release versions (default: <code>true</code>)</li><li><code>match</code> — regex filter applied to tag names (if omitted, the latest tag is used)</li><li><code>query</code> — query string appended to the API URL</li><li><code>extract</code> — override extraction directory</li></ul></li></ul><div class="language-yaml"><button title="Copy Code" class="copy"></button><span class="lang">yaml</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># brotli: only match v1.x tags</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">artifact</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> source</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> type</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">ghtagtar</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> repo</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">google/brotli</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> match</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;v1\\.\\d.*&#39;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># libpng: match v1.6.x tags, with pagination</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">artifact</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> source</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> type</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">ghtagtar</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> repo</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">pnggroup/libpng</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> match</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">v1\\.6\\.\\d+</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> query</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;?per_page=150&#39;</span></span></code></pre></div><hr><h3 id="filelist" tabindex="-1">filelist <a class="header-anchor" href="#filelist" aria-label="Permalink to “filelist”"></a></h3><p>Fetches an HTML page (typically an official download index), extracts filenames and version numbers from the page content using a regex, then automatically selects and downloads the highest stable version. Pre-release versions (those containing keywords like alpha, beta, rc, dev, nightly, or snapshot) are automatically skipped.</p><p><strong>Best for</strong>: projects without GitHub that publish versioned archives on their own FTP or web index, such as <code>https://ftp.gnu.org/pub/gnu/ncurses/</code>.</p><ul><li><strong>Class</strong>: <code>StaticPHP\\Artifact\\Downloader\\Type\\FileList</code></li><li><strong>Capabilities</strong>: Version update checking (<code>CheckUpdateInterface</code>)</li><li><strong>Required</strong>: <ul><li><code>url</code> — URL of the HTML page containing the file listing</li><li><code>regex</code> — PCRE regex to extract filenames and versions from the page (must include named capture groups <code>(?&lt;file&gt;...)</code> and <code>(?&lt;version&gt;...)</code>)</li></ul></li><li><strong>Optional</strong>: <ul><li><code>extract</code> — override extraction directory</li><li><code>download-url</code> — custom download URL template supporting <code>{file}</code> and <code>{version}</code> placeholders (by default the filename is appended directly to <code>url</code>)</li></ul></li></ul><div class="language-yaml"><button title="Copy Code" class="copy"></button><span class="lang">yaml</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># ncurses: scrape latest version from the GNU FTP index</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">artifact</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> source</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> type</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">filelist</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> url</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;https://ftp.gnu.org/pub/gnu/ncurses/&#39;</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> regex</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;/href=&quot;(?&lt;file&gt;ncurses-(?&lt;version&gt;[^&quot;]+)\\.tar\\.gz)&quot;/&#39;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># openssl: mirror source using filelist</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">artifact</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> source-mirror</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> type</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">filelist</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> url</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;https://www.openssl.org/source/&#39;</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> regex</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;/href=&quot;(?&lt;file&gt;openssl-(?&lt;version&gt;[^&quot;]+)\\.tar\\.gz)&quot;/&#39;</span></span></code></pre></div><hr><h3 id="pecl" tabindex="-1">pecl <a class="header-anchor" href="#pecl" aria-label="Permalink to “pecl”"></a></h3><p>Downloads a PHP extension source package from <a href="https://pecl.php.net" target="_blank" rel="noreferrer">PECL</a> using the PECL REST API. The latest stable version is selected automatically.</p><ul><li><strong>Class</strong>: <code>StaticPHP\\Artifact\\Downloader\\Type\\PECL</code></li><li><strong>Capabilities</strong>: Version update checking (<code>CheckUpdateInterface</code>)</li><li><strong>Required</strong>: <code>name</code> — PECL package name (case-insensitive, e.g. <code>APCu</code>)</li><li><strong>Optional</strong>: <ul><li><code>prefer-stable</code> — download stable releases only (default: <code>true</code>)</li><li><code>extract</code> — override extraction directory (default: <code>php-src/ext/{name}</code>)</li></ul></li></ul><div class="language-yaml"><button title="Copy Code" class="copy"></button><span class="lang">yaml</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># APCu downloaded from PECL</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">artifact</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> source</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> type</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">pecl</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> name</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">APCu</span></span></code></pre></div><hr><h3 id="pie" tabindex="-1">pie <a class="header-anchor" href="#pie" aria-label="Permalink to “pie”"></a></h3><p>Downloads a PHP extension from <a href="https://repo.packagist.org" target="_blank" rel="noreferrer">Packagist</a> following the <a href="https://github.com/php/pie" target="_blank" rel="noreferrer">PIE</a> specification. Package metadata is fetched via the Packagist <code>p2/</code> API, and the source archive is downloaded from the <code>dist</code> field.</p><ul><li><strong>Class</strong>: <code>StaticPHP\\Artifact\\Downloader\\Type\\PIE</code></li><li><strong>Capabilities</strong>: Version update checking (<code>CheckUpdateInterface</code>)</li><li><strong>Required</strong>: <code>repo</code> — Packagist package path in <code>vendor/package</code> format</li><li><strong>Optional</strong>: <ul><li><code>extract</code> — override extraction directory</li></ul></li></ul><div class="language-yaml"><button title="Copy Code" class="copy"></button><span class="lang">yaml</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># xdebug downloaded from Packagist</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">artifact</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> source</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> type</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">pie</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> repo</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">xdebug/xdebug</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># php-spx with a custom extraction path</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">artifact</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> source</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> type</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">pie</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> repo</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">noisebynorthwest/php-spx</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> extract</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">php-src/ext/spx</span></span></code></pre></div><hr><h3 id="php-release" tabindex="-1">php-release <a class="header-anchor" href="#php-release" aria-label="Permalink to “php-release”"></a></h3><p>Downloads the official PHP source from <a href="https://www.php.net" target="_blank" rel="noreferrer">php.net</a>. The version is determined at build time by the <code>--with-php</code> argument. SHA256 integrity is verified automatically. Passing <code>git</code> as the version will clone the <code>master</code> branch of <code>php/php-src</code> directly.</p><ul><li><strong>Class</strong>: <code>StaticPHP\\Artifact\\Downloader\\Type\\PhpRelease</code></li><li><strong>Capabilities</strong>: Version update checking (<code>CheckUpdateInterface</code>), integrity verification (<code>ValidatorInterface</code>, SHA256)</li><li><strong>Required</strong>: <code>domain</code> — download domain (e.g. <code>https://www.php.net</code> or a custom mirror)</li><li><strong>Optional</strong>: <ul><li><code>extract</code> — override extraction directory</li></ul></li></ul><div class="language-yaml"><button title="Copy Code" class="copy"></button><span class="lang">yaml</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># php-src with primary and mirror sources</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">artifact</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> source</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> type</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">php-release</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> domain</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;https://www.php.net&#39;</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> source-mirror</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> type</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">php-release</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> domain</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;https://phpmirror.static-php.dev&#39;</span></span></code></pre></div><hr><h3 id="bitbuckettag" tabindex="-1">bitbuckettag <a class="header-anchor" href="#bitbuckettag" aria-label="Permalink to “bitbuckettag”"></a></h3><p>Downloads a source tarball from the latest tag of a Bitbucket repository via the Bitbucket REST API.</p><ul><li><strong>Class</strong>: <code>StaticPHP\\Artifact\\Downloader\\Type\\BitBucketTag</code></li><li><strong>Capabilities</strong>: Basic download only; no automatic version update checking</li><li><strong>Required</strong>: <code>repo</code> — repository path in <code>workspace/repo</code> format</li><li><strong>Optional</strong>: <ul><li><code>extract</code> — override extraction directory</li></ul></li></ul><div class="language-yaml"><button title="Copy Code" class="copy"></button><span class="lang">yaml</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">artifact</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> source</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> type</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">bitbuckettag</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> repo</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">snappy-m-o/php-snappy</span></span></code></pre></div><hr><h3 id="local" tabindex="-1">local <a class="header-anchor" href="#local" aria-label="Permalink to “local”"></a></h3><p>Uses a pre-existing local directory as the source without performing any download. Useful for offline environments or local development where the source has already been placed on disk.</p><ul><li><strong>Class</strong>: <code>StaticPHP\\Artifact\\Downloader\\Type\\LocalDir</code></li><li><strong>Capabilities</strong>: Basic download only; no automatic version update checking</li><li><strong>Required</strong>: <code>dirname</code> — absolute path to the local directory</li><li><strong>Optional</strong>: <ul><li><code>extract</code> — override extraction directory</li></ul></li></ul><div class="language-yaml"><button title="Copy Code" class="copy"></button><span class="lang">yaml</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">artifact</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> source</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> type</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">local</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> dirname</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">/path/to/local/source</span></span></code></pre></div><hr><h3 id="custom" tabindex="-1">custom <a class="header-anchor" href="#custom" aria-label="Permalink to “custom”"></a></h3><p>Delegates download logic entirely to a PHP class under <code>src/Package/Artifact/</code>. If <code>func</code> is not specified, the class&#39;s default download method is called.</p><ul><li><strong>Optional</strong>: <code>func</code> — name of the specific method to invoke in the implementation class</li></ul><div class="language-yaml"><button title="Copy Code" class="copy"></button><span class="lang">yaml</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">artifact</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> source</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> type</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">custom</span></span></code></pre></div>`,92)])])}const g=i(l,[["render",n]]);export{c as __pageData,g as default};

View File

@@ -1 +0,0 @@
import{_ as i,c as a,o as e,aj as t}from"./chunks/framework.C2AwuPrQ.js";const c=JSON.parse('{"title":"Artifact Model","description":"","frontmatter":{"outline":"deep"},"headers":[],"relativePath":"en/develop/artifact-model.md","filePath":"en/develop/artifact-model.md"}'),l={name:"en/develop/artifact-model.md"};function n(h,s,r,p,o,d){return e(),a("div",null,[...s[0]||(s[0]=[t("",92)])])}const g=i(l,[["render",n]]);export{c as __pageData,g as default};

View File

@@ -1 +0,0 @@
import{_ as a,c,o as i,j as l,a as t}from"./chunks/framework.C2AwuPrQ.js";const m=JSON.parse('{"title":"Build Lifecycle","description":"","frontmatter":{},"headers":[],"relativePath":"en/develop/build-lifecycle.md","filePath":"en/develop/build-lifecycle.md"}'),d={name:"en/develop/build-lifecycle.md"};function r(o,e,n,s,f,p){return i(),c("div",null,[...e[0]||(e[0]=[l("h1",{id:"build-lifecycle",tabindex:"-1"},[t("Build Lifecycle "),l("a",{class:"header-anchor",href:"#build-lifecycle","aria-label":"Permalink to “Build Lifecycle”"},"")],-1)])])}const y=a(d,[["render",r]]);export{m as __pageData,y as default};

View File

@@ -1 +0,0 @@
import{_ as a,c,o as i,j as l,a as t}from"./chunks/framework.C2AwuPrQ.js";const m=JSON.parse('{"title":"Build Lifecycle","description":"","frontmatter":{},"headers":[],"relativePath":"en/develop/build-lifecycle.md","filePath":"en/develop/build-lifecycle.md"}'),d={name:"en/develop/build-lifecycle.md"};function r(o,e,n,s,f,p){return i(),c("div",null,[...e[0]||(e[0]=[l("h1",{id:"build-lifecycle",tabindex:"-1"},[t("Build Lifecycle "),l("a",{class:"header-anchor",href:"#build-lifecycle","aria-label":"Permalink to “Build Lifecycle”"},"")],-1)])])}const y=a(d,[["render",r]]);export{m as __pageData,y as default};

View File

@@ -1 +0,0 @@
import{_ as i,c as a,o as n,aj as l}from"./chunks/framework.C2AwuPrQ.js";const c=JSON.parse('{"title":"craft.yml Configuration","description":"","frontmatter":{"aside":false},"headers":[],"relativePath":"en/develop/craft-yml.md","filePath":"en/develop/craft-yml.md"}'),p={name:"en/develop/craft-yml.md"};function t(e,s,h,k,r,d){return n(),a("div",null,[...s[0]||(s[0]=[l("",2)])])}const E=i(p,[["render",t]]);export{c as __pageData,E as default};

View File

@@ -1,30 +1,27 @@
import{_ as i,c as a,o as n,aj as l}from"./chunks/framework.C2AwuPrQ.js";const c=JSON.parse('{"title":"craft.yml Configuration","description":"","frontmatter":{"aside":false},"headers":[],"relativePath":"en/develop/craft-yml.md","filePath":"en/develop/craft-yml.md"}'),p={name:"en/develop/craft-yml.md"};function t(e,s,h,k,r,d){return n(),a("div",null,[...s[0]||(s[0]=[l(`<h1 id="craft-yml-configuration" tabindex="-1">craft.yml Configuration <a class="header-anchor" href="#craft-yml-configuration" aria-label="Permalink to “craft.yml Configuration”"></a></h1><div class="language-yaml"><button title="Copy Code" class="copy"></button><span class="lang">yaml</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># PHP version to build (default: 8.5)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">php-version</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">8.5</span></span>
import{_ as i,c as a,o as n,ah as l}from"./chunks/framework.Bhsyh9kO.js";const c=JSON.parse('{"title":"craft.yml Configuration","description":"","frontmatter":{"aside":false},"headers":[],"relativePath":"en/develop/craft-yml.md","filePath":"en/develop/craft-yml.md"}'),t={name:"en/develop/craft-yml.md"};function p(e,s,h,k,r,d){return n(),a("div",null,[...s[0]||(s[0]=[l(`<h1 id="craft-yml-configuration" tabindex="-1">craft.yml Configuration <a class="header-anchor" href="#craft-yml-configuration" aria-label="Permalink to “craft.yml Configuration”"></a></h1><div class="language-yaml"><button title="Copy Code" class="copy"></button><span class="lang">yaml</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># PHP version to build (default: 8.4)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">php-version</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">8.4</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># [REQUIRED] Static PHP extensions to build (list or comma-separated are both accepted)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">extensions</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">bcmath,fileinfo,phar,zlib,sodium,posix,pcntl</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Extra packages to build (list or comma-separated are both accepted)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">packages</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [ ]</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Extra libraries to build (list or comma-separated are both accepted)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">libs</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [ ]</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># [REQUIRED] Build SAPIs (list or comma-separated are both accepted)</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Available: cli, micro, fpm, embed, frankenphp, cgi, all</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">sapi</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">cli,micro,fpm</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Show full console output (default: false)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">debug</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">false</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Before build, remove all old build files and sources (default: false)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">clean-build</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">false</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Build options (same as \`build:php\` command options, all options are optional)</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Build options (same as \`build\` command options, all options are optional)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">build-options</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # Build with all suggested packages (libraries and extensions) as well (default: false)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> with-suggests</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">false</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # Build extra shared extensions (comma-separated string)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> build-shared</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;&quot;</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # Before build, remove all old build files and sources (default: false)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> with-clean</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">false</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # Build with all suggested libraries (default: false)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> with-suggested-libs</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">false</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # Build with all suggested extensions (default: false)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> with-suggested-exts</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">false</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # Build extra shared extensions (list or comma-separated are both accepted)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> build-shared</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [ ]</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # Build without stripping the binary (default: false)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> no-strip</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">false</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # Disable Opcache JIT (default: false)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> disable-opcache-jit</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">false</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # Enable thread-safe (ZTS) support (default: false)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> enable-zts</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">false</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # Disable smoke test, or for specific SAPIs comma-separated (default: false)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> no-smoke-test</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">false</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # PHP configuration options (same as --with-config-file-path)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> with-config-file-path</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;&quot;</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # PHP configuration options (same as --with-config-file-scan-dir)</span></span>
@@ -43,44 +40,29 @@ import{_ as i,c as a,o as n,aj as l}from"./chunks/framework.C2AwuPrQ.js";const c
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> with-micro-logo</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;&quot;</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # Set micro SAPI as win32 mode, without this, micro SAPI will be compiled as a console application (only for Windows, default: false)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> enable-micro-win32</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">false</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # Path to a folder to be embedded in FrankenPHP (frankenphp SAPI only)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> with-frankenphp-app</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Build options for shared extensions (list or comma-separated are both accepted)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">shared-extensions</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [ ]</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Download options</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">download-options</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # Number of parallel downloads (default: 1)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> parallel</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">1</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # Retries count for downloading sources (default: 0)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> retry</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">0</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # Prefer source downloads when both source and binary are available (default: false)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> prefer-source</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">false</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # Prefer binary downloads when both source and binary are available (default: false)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> prefer-binary</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">false</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # Only download source artifacts, skip binary artifacts (default: false)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> source-only</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">false</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # Only download binary artifacts, skip source artifacts (default: false)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> binary-only</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">false</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # Ignore download cache for specified packages, comma separated (default: false)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> ignore-cache</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">false</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # Do not use alternative mirror download sources (default: false)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> no-alt</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">false</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # Do not clone shallowly repositories when downloading sources (default: false)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> no-shallow-clone</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">false</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # Use custom url for specified sources, format: &quot;{source-name}:{url}&quot; (e.g. &quot;php-src:https://example.com/php-8.4.0.tar.gz&quot;)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> custom-url</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [ ]</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # Use custom git repo for specified sources, format: &quot;{source-name}:{branch}:{url}&quot; (e.g. &quot;php-src:master:https://github.com/php/php-src.git&quot;)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> custom-git</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [ ]</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # Use custom local source path, format: &quot;{source-name}:{path}&quot; (e.g. &quot;php-src:/path/to/php-src&quot;)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> custom-local</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [ ]</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # Retries count for downloading sources (default: 5)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> retry</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">5</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # Use pre-built libraries if available (default: false)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> prefer-pre-built</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">true</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # Do not download from alternative sources (default: false)</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> no-alt</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">false</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">craft-options</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> doctor</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">true</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> download</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">true</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> build</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">true</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Extra environment variables</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">extra-env</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # e.g. Use github token to avoid rate limit</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> GITHUB_TOKEN</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">your-github-token</span></span></code></pre></div>`,2)])])}const E=i(p,[["render",t]]);export{c as __pageData,E as default};
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> GITHUB_TOKEN</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">your-github-token</span></span></code></pre></div>`,2)])])}const E=i(t,[["render",p]]);export{c as __pageData,E as default};

View File

@@ -0,0 +1 @@
import{_ as i,c as a,o as n,ah as l}from"./chunks/framework.Bhsyh9kO.js";const c=JSON.parse('{"title":"craft.yml Configuration","description":"","frontmatter":{"aside":false},"headers":[],"relativePath":"en/develop/craft-yml.md","filePath":"en/develop/craft-yml.md"}'),t={name:"en/develop/craft-yml.md"};function p(e,s,h,k,r,d){return n(),a("div",null,[...s[0]||(s[0]=[l("",2)])])}const E=i(t,[["render",p]]);export{c as __pageData,E as default};

View File

@@ -1 +0,0 @@
import{_ as t,c as r,o as a,j as o,a as d}from"./chunks/framework.C2AwuPrQ.js";const f=JSON.parse('{"title":"Doctor Module","description":"","frontmatter":{},"headers":[],"relativePath":"en/develop/doctor-module.md","filePath":"en/develop/doctor-module.md"}'),l={name:"en/develop/doctor-module.md"};function c(n,e,s,m,i,p){return a(),r("div",null,[...e[0]||(e[0]=[o("h1",{id:"doctor-module",tabindex:"-1"},[d("Doctor Module "),o("a",{class:"header-anchor",href:"#doctor-module","aria-label":"Permalink to “Doctor Module”"},"")],-1)])])}const _=t(l,[["render",c]]);export{f as __pageData,_ as default};

View File

@@ -1 +0,0 @@
import{_ as t,c as r,o as a,j as o,a as d}from"./chunks/framework.C2AwuPrQ.js";const f=JSON.parse('{"title":"Doctor Module","description":"","frontmatter":{},"headers":[],"relativePath":"en/develop/doctor-module.md","filePath":"en/develop/doctor-module.md"}'),l={name:"en/develop/doctor-module.md"};function c(n,e,s,m,i,p){return a(),r("div",null,[...e[0]||(e[0]=[o("h1",{id:"doctor-module",tabindex:"-1"},[d("Doctor Module "),o("a",{class:"header-anchor",href:"#doctor-module","aria-label":"Permalink to “Doctor Module”"},"")],-1)])])}const _=t(l,[["render",c]]);export{f as __pageData,_ as default};

View File

@@ -0,0 +1,29 @@
import{_ as i,c as a,o as e,ah as t}from"./chunks/framework.Bhsyh9kO.js";const E=JSON.parse('{"title":"Doctor module","description":"","frontmatter":{},"headers":[],"relativePath":"en/develop/doctor-module.md","filePath":"en/develop/doctor-module.md"}'),h={name:"en/develop/doctor-module.md"};function n(l,s,k,p,r,d){return e(),a("div",null,[...s[0]||(s[0]=[t(`<h1 id="doctor-module" tabindex="-1">Doctor module <a class="header-anchor" href="#doctor-module" aria-label="Permalink to “Doctor module”"></a></h1><p>The Doctor module is a relatively independent module used to check the system environment, which can be entered with the command <code>bin/spc doctor</code>, and the entry command class is in <code>DoctorCommand.php</code>.</p><p>The Doctor module is a checklist with a series of check items and automatic repair items. These items are stored in the <code>src/SPC/doctor/item/</code> directory, And two Attributes are used as check item tags and auto-fix item tags: <code>#[AsCheckItem]</code> and <code>#[AsFixItem]</code>.</p><p>Take the existing check item <code>if necessary tools are installed</code>, which is used to check whether the packages necessary for compilation are installed in the macOS system. The following is its source code:</p><div class="language-php"><button title="Copy Code" class="copy"></button><span class="lang">php</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">use</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> SPC\\doctor\\AsCheckItem</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">use</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> SPC\\doctor\\AsFixItem</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">use</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> SPC\\doctor\\CheckResult</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">#[</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">AsCheckItem</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;if necessary tools are installed&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">limit_os</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;Darwin&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">level</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">997</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)]</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">public</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> checkCliTools</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">()</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> ?</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">CheckResult</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">{</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> $missing </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> [];</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> foreach</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">self::</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">REQUIRED_COMMANDS</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> as</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> $cmd) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">$this</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">-&gt;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">findCommand</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">($cmd) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">===</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> null</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> $missing[] </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> $cmd;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">!</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">empty</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">($missing)) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> return</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> CheckResult</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">::</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">fail</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;missing system commands: &#39;</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> .</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> implode</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;, &#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, $missing), </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;build-tools&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, [$missing]);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> return</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> CheckResult</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">::</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">ok</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">();</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div><p>The first parameter of the attribute is the name of the check item, and the following <code>limit_os</code> parameter restricts the check item to be triggered only under the specified system, and <code>level</code> is the priority of executing the check item, the larger the number, the higher the priority higher.</p><p>The <code>$this-&gt;findCommand()</code> method used in it is the method of <code>SPC\\builder\\traits\\UnixSystemUtilTrait</code>, the purpose is to find the location of the system command, and return NULL if it cannot be found.</p><p>Each check item method should return a <code>SPC\\doctor\\CheckResult</code>:</p><ul><li>When returning <code>CheckResult::fail()</code>, the first parameter is used to output the error prompt of the terminal, and the second parameter is the name of the repair item when this check item can be automatically repaired.</li><li>When <code>CheckResult::ok()</code> is returned, the check passed. You can also pass a parameter to return the check result, for example: <code>CheckResult::ok(&#39;OS supported&#39;)</code>.</li><li>When returning <code>CheckResult::fail()</code>, if the third parameter is included, the array of the third parameter will be used as the parameter of <code>AsFixItem</code>.</li></ul><p>The following is the method for automatically repairing items corresponding to this check item:</p><div class="language-php"><button title="Copy Code" class="copy"></button><span class="lang">php</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">#[</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">AsFixItem</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;build-tools&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)]</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">public</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> fixBuildTools</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">array</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> $missing)</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> bool</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">{</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> foreach</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> ($missing </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">as</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> $cmd) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> try</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> shell</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">-&gt;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">exec</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;brew install &#39;</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> .</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> escapeshellarg</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">($cmd));</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">catch</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">RuntimeException</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> return</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> false</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> return</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div><p><code>#[AsFixItem()]</code> first parameter is the name of the fix item, and this method must return True or False. When False is returned, the automatic repair failed and manual handling is required.</p><p>In the code here, <code>shell()-&gt;exec()</code> is the method of executing commands of the project, which is used to replace <code>exec()</code> and <code>system()</code>, and also provides debugging, obtaining execution status, entering directories, etc. characteristic.</p>`,13)])])}const c=i(h,[["render",n]]);export{E as __pageData,c as default};

View File

@@ -0,0 +1 @@
import{_ as i,c as a,o as e,ah as t}from"./chunks/framework.Bhsyh9kO.js";const E=JSON.parse('{"title":"Doctor module","description":"","frontmatter":{},"headers":[],"relativePath":"en/develop/doctor-module.md","filePath":"en/develop/doctor-module.md"}'),h={name:"en/develop/doctor-module.md"};function n(l,s,k,p,r,d){return e(),a("div",null,[...s[0]||(s[0]=[t("",13)])])}const c=i(h,[["render",n]]);export{E as __pageData,c as default};

View File

@@ -1 +0,0 @@
import{_ as t,c as a,o,j as n,a as r}from"./chunks/framework.C2AwuPrQ.js";const _=JSON.parse('{"title":"Annotations Reference","description":"","frontmatter":{},"headers":[],"relativePath":"en/develop/extending/annotations.md","filePath":"en/develop/extending/annotations.md"}'),s={name:"en/develop/extending/annotations.md"};function i(d,e,c,l,f,p){return o(),a("div",null,[...e[0]||(e[0]=[n("h1",{id:"annotations-reference",tabindex:"-1"},[r("Annotations Reference "),n("a",{class:"header-anchor",href:"#annotations-reference","aria-label":"Permalink to “Annotations Reference”"},"")],-1)])])}const x=t(s,[["render",i]]);export{_ as __pageData,x as default};

View File

@@ -1 +0,0 @@
import{_ as t,c as a,o,j as n,a as r}from"./chunks/framework.C2AwuPrQ.js";const _=JSON.parse('{"title":"Annotations Reference","description":"","frontmatter":{},"headers":[],"relativePath":"en/develop/extending/annotations.md","filePath":"en/develop/extending/annotations.md"}'),s={name:"en/develop/extending/annotations.md"};function i(d,e,c,l,f,p){return o(),a("div",null,[...e[0]||(e[0]=[n("h1",{id:"annotations-reference",tabindex:"-1"},[r("Annotations Reference "),n("a",{class:"header-anchor",href:"#annotations-reference","aria-label":"Permalink to “Annotations Reference”"},"")],-1)])])}const x=t(s,[["render",i]]);export{_ as __pageData,x as default};

View File

@@ -1 +0,0 @@
import{_ as a,c as r,o,j as e,a as c}from"./chunks/framework.C2AwuPrQ.js";const u=JSON.parse('{"title":"Custom Artifact","description":"","frontmatter":{},"headers":[],"relativePath":"en/develop/extending/custom-artifact.md","filePath":"en/develop/extending/custom-artifact.md"}'),s={name:"en/develop/extending/custom-artifact.md"};function n(i,t,d,m,f,l){return o(),r("div",null,[...t[0]||(t[0]=[e("h1",{id:"custom-artifact",tabindex:"-1"},[c("Custom Artifact "),e("a",{class:"header-anchor",href:"#custom-artifact","aria-label":"Permalink to “Custom Artifact”"},"")],-1)])])}const _=a(s,[["render",n]]);export{u as __pageData,_ as default};

View File

@@ -1 +0,0 @@
import{_ as a,c as r,o,j as e,a as c}from"./chunks/framework.C2AwuPrQ.js";const u=JSON.parse('{"title":"Custom Artifact","description":"","frontmatter":{},"headers":[],"relativePath":"en/develop/extending/custom-artifact.md","filePath":"en/develop/extending/custom-artifact.md"}'),s={name:"en/develop/extending/custom-artifact.md"};function n(i,t,d,m,f,l){return o(),r("div",null,[...t[0]||(t[0]=[e("h1",{id:"custom-artifact",tabindex:"-1"},[c("Custom Artifact "),e("a",{class:"header-anchor",href:"#custom-artifact","aria-label":"Permalink to “Custom Artifact”"},"")],-1)])])}const _=a(s,[["render",n]]);export{u as __pageData,_ as default};

View File

@@ -1 +0,0 @@
import{_ as t,c as d,o as a,j as n,a as c}from"./chunks/framework.C2AwuPrQ.js";const f=JSON.parse('{"title":"Dependency Injection","description":"","frontmatter":{},"headers":[],"relativePath":"en/develop/extending/dependency-injection.md","filePath":"en/develop/extending/dependency-injection.md"}'),o={name:"en/develop/extending/dependency-injection.md"};function i(r,e,p,s,l,j){return a(),d("div",null,[...e[0]||(e[0]=[n("h1",{id:"dependency-injection",tabindex:"-1"},[c("Dependency Injection "),n("a",{class:"header-anchor",href:"#dependency-injection","aria-label":"Permalink to “Dependency Injection”"},"")],-1)])])}const y=t(o,[["render",i]]);export{f as __pageData,y as default};

View File

@@ -1 +0,0 @@
import{_ as t,c as d,o as a,j as n,a as c}from"./chunks/framework.C2AwuPrQ.js";const f=JSON.parse('{"title":"Dependency Injection","description":"","frontmatter":{},"headers":[],"relativePath":"en/develop/extending/dependency-injection.md","filePath":"en/develop/extending/dependency-injection.md"}'),o={name:"en/develop/extending/dependency-injection.md"};function i(r,e,p,s,l,j){return a(),d("div",null,[...e[0]||(e[0]=[n("h1",{id:"dependency-injection",tabindex:"-1"},[c("Dependency Injection "),n("a",{class:"header-anchor",href:"#dependency-injection","aria-label":"Permalink to “Dependency Injection”"},"")],-1)])])}const y=t(o,[["render",i]]);export{f as __pageData,y as default};

View File

@@ -1 +0,0 @@
import{_ as n,c as a,o as i,j as t,a as d}from"./chunks/framework.C2AwuPrQ.js";const f=JSON.parse('{"title":"Extending StaticPHP","description":"","frontmatter":{},"headers":[],"relativePath":"en/develop/extending/index.md","filePath":"en/develop/extending/index.md"}'),r={name:"en/develop/extending/index.md"};function o(s,e,c,p,x,l){return i(),a("div",null,[...e[0]||(e[0]=[t("h1",{id:"extending-staticphp",tabindex:"-1"},[d("Extending StaticPHP "),t("a",{class:"header-anchor",href:"#extending-staticphp","aria-label":"Permalink to “Extending StaticPHP”"},"")],-1)])])}const g=n(r,[["render",o]]);export{f as __pageData,g as default};

View File

@@ -1 +0,0 @@
import{_ as n,c as a,o as i,j as t,a as d}from"./chunks/framework.C2AwuPrQ.js";const f=JSON.parse('{"title":"Extending StaticPHP","description":"","frontmatter":{},"headers":[],"relativePath":"en/develop/extending/index.md","filePath":"en/develop/extending/index.md"}'),r={name:"en/develop/extending/index.md"};function o(s,e,c,p,x,l){return i(),a("div",null,[...e[0]||(e[0]=[t("h1",{id:"extending-staticphp",tabindex:"-1"},[d("Extending StaticPHP "),t("a",{class:"header-anchor",href:"#extending-staticphp","aria-label":"Permalink to “Extending StaticPHP”"},"")],-1)])])}const g=n(r,[["render",o]]);export{f as __pageData,g as default};

View File

@@ -1 +0,0 @@
import{_ as a,c,o as t,j as o,a as l}from"./chunks/framework.C2AwuPrQ.js";const h=JSON.parse('{"title":"Lifecycle Hooks","description":"","frontmatter":{},"headers":[],"relativePath":"en/develop/extending/lifecycle-hooks.md","filePath":"en/develop/extending/lifecycle-hooks.md"}'),s={name:"en/develop/extending/lifecycle-hooks.md"};function n(i,e,r,d,f,p){return t(),c("div",null,[...e[0]||(e[0]=[o("h1",{id:"lifecycle-hooks",tabindex:"-1"},[l("Lifecycle Hooks "),o("a",{class:"header-anchor",href:"#lifecycle-hooks","aria-label":"Permalink to “Lifecycle Hooks”"},"")],-1)])])}const m=a(s,[["render",n]]);export{h as __pageData,m as default};

View File

@@ -1 +0,0 @@
import{_ as a,c,o as t,j as o,a as l}from"./chunks/framework.C2AwuPrQ.js";const h=JSON.parse('{"title":"Lifecycle Hooks","description":"","frontmatter":{},"headers":[],"relativePath":"en/develop/extending/lifecycle-hooks.md","filePath":"en/develop/extending/lifecycle-hooks.md"}'),s={name:"en/develop/extending/lifecycle-hooks.md"};function n(i,e,r,d,f,p){return t(),c("div",null,[...e[0]||(e[0]=[o("h1",{id:"lifecycle-hooks",tabindex:"-1"},[l("Lifecycle Hooks "),o("a",{class:"header-anchor",href:"#lifecycle-hooks","aria-label":"Permalink to “Lifecycle Hooks”"},"")],-1)])])}const m=a(s,[["render",n]]);export{h as __pageData,m as default};

View File

@@ -1 +0,0 @@
import{_ as s,c as t,o as n,j as a,a as r}from"./chunks/framework.C2AwuPrQ.js";const m=JSON.parse('{"title":"Writing Package Classes","description":"","frontmatter":{},"headers":[],"relativePath":"en/develop/extending/package-classes.md","filePath":"en/develop/extending/package-classes.md"}'),c={name:"en/develop/extending/package-classes.md"};function i(l,e,o,d,p,g){return n(),t("div",null,[...e[0]||(e[0]=[a("h1",{id:"writing-package-classes",tabindex:"-1"},[r("Writing Package Classes "),a("a",{class:"header-anchor",href:"#writing-package-classes","aria-label":"Permalink to “Writing Package Classes”"},"")],-1)])])}const f=s(c,[["render",i]]);export{m as __pageData,f as default};

View File

@@ -1 +0,0 @@
import{_ as s,c as t,o as n,j as a,a as r}from"./chunks/framework.C2AwuPrQ.js";const m=JSON.parse('{"title":"Writing Package Classes","description":"","frontmatter":{},"headers":[],"relativePath":"en/develop/extending/package-classes.md","filePath":"en/develop/extending/package-classes.md"}'),c={name:"en/develop/extending/package-classes.md"};function i(l,e,o,d,p,g){return n(),t("div",null,[...e[0]||(e[0]=[a("h1",{id:"writing-package-classes",tabindex:"-1"},[r("Writing Package Classes "),a("a",{class:"header-anchor",href:"#writing-package-classes","aria-label":"Permalink to “Writing Package Classes”"},"")],-1)])])}const f=s(c,[["render",i]]);export{m as __pageData,f as default};

View File

@@ -1,2 +0,0 @@
import{_ as i,c as t,o as a,aj as s}from"./chunks/framework.C2AwuPrQ.js";const k=JSON.parse('{"title":"Developer Guide","description":"","frontmatter":{},"headers":[],"relativePath":"en/develop/index.md","filePath":"en/develop/index.md"}'),n={name:"en/develop/index.md"};function l(r,e,o,h,p,d){return a(),t("div",null,[...e[0]||(e[0]=[s(`<h1 id="developer-guide" tabindex="-1">Developer Guide <a class="header-anchor" href="#developer-guide" aria-label="Permalink to “Developer Guide”"></a></h1><p>This section covers the StaticPHP development workflow and the foundational knowledge needed to understand how StaticPHP works under the hood.</p><h2 id="overview" tabindex="-1">Overview <a class="header-anchor" href="#overview" aria-label="Permalink to “Overview”"></a></h2><p>StaticPHP is a binary build tool whose core purpose is managing the build pipeline — downloading and configuring PHP source code, resolving extension dependencies, and invoking the underlying build system (e.g., Docker or a local compiler).</p><p>From a development perspective, StaticPHP is an open framework that provides the ability to statically build PHP and other open-source tools together. The project is maintained by <a href="https://github.com/crazywhalecc" target="_blank" rel="noreferrer">@crazywhalecc</a> and <a href="https://github.com/henderkes" target="_blank" rel="noreferrer">@henderkes</a>, with contributions from the community.</p><p>You can think of StaticPHP as a typical PHP CLI project built on <a href="https://symfony.com/doc/current/components/console.html" target="_blank" rel="noreferrer">symfony/console</a>.</p><h2 id="development-environment" tabindex="-1">Development Environment <a class="header-anchor" href="#development-environment" aria-label="Permalink to “Development Environment”"></a></h2><p>To get started with StaticPHP development, you&#39;ll need a PHP development environment with the required dependencies installed.</p><p>Requirements:</p><ul><li>PHP 8.4 or later</li><li>Composer</li><li>Git</li><li>PHP extensions: <code>curl, dom, filter, mbstring, openssl, pcntl, phar, posix, sodium, tokenizer, xml, xmlwriter</code></li></ul><blockquote><p>These PHP extensions are required for StaticPHP&#39;s <code>dev</code> environment.</p></blockquote><h3 id="setup-steps" tabindex="-1">Setup Steps <a class="header-anchor" href="#setup-steps" aria-label="Permalink to “Setup Steps”"></a></h3><ol><li><p>Clone the repository:</p><div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">git</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> clone</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> https://github.com/crazywhalecc/static-php-cli.git</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">cd</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> static-php-cli</span></span></code></pre></div></li><li><p>Install PHP dependencies:</p><div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">composer</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> install</span></span></code></pre></div></li><li><p>Verify the setup:</p><div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">bin/spc</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --version</span></span></code></pre></div></li></ol><hr><p>You can continue reading <a href="./structure.html">Project Structure</a> to learn more about StaticPHP&#39;s framework architecture.</p>`,15)])])}const u=i(n,[["render",l]]);export{k as __pageData,u as default};

Some files were not shown because too many files have changed in this diff Show More