diff --git a/404.html b/404.html index 4665d493..0494900e 100644 --- a/404.html +++ b/404.html @@ -6,7 +6,7 @@ 404 | Regolith - + @@ -19,9 +19,9 @@ -
Skip to content

404

PAGE NOT FOUND

But if you don't change your direction, and if you keep looking, you may end up where you are heading.

Released under the MIT license.

- - +
Skip to content

404

PAGE NOT FOUND

But if you don't change your direction, and if you keep looking, you may end up where you are heading.

Released under the MIT license.

+ + \ No newline at end of file diff --git a/assets/app.aed23105.js b/assets/app.1d293fe1.js similarity index 99% rename from assets/app.aed23105.js rename to assets/app.1d293fe1.js index 896b6967..d0fa8a59 100644 --- a/assets/app.aed23105.js +++ b/assets/app.1d293fe1.js @@ -1,4 +1,4 @@ -function Gs(e,t){const n=Object.create(null),s=e.split(",");for(let o=0;o!!n[o.toLowerCase()]:o=>!!n[o]}function es(e){if(J(e)){const t={};for(let n=0;n{if(n){const s=n.split(Xr);s.length>1&&(t[s[0].trim()]=s[1].trim())}}),t}function _e(e){let t="";if(be(e))t=e;else if(J(e))for(let n=0;nbe(e)?e:e==null?"":J(e)||ve(e)&&(e.toString===Fi||!ne(e.toString))?JSON.stringify(e,Ii,2):String(e),Ii=(e,t)=>t&&t.__v_isRef?Ii(e,t.value):Ft(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[s,o])=>(n[`${s} =>`]=o,n),{})}:Ni(t)?{[`Set(${t.size})`]:[...t.values()]}:ve(t)&&!J(t)&&!Bi(t)?String(t):t,me={},Ot=[],qe=()=>{},sl=()=>!1,ol=/^on[^a-z]/,xn=e=>ol.test(e),Js=e=>e.startsWith("onUpdate:"),Pe=Object.assign,Qs=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},il=Object.prototype.hasOwnProperty,ce=(e,t)=>il.call(e,t),J=Array.isArray,Ft=e=>ts(e)==="[object Map]",Ni=e=>ts(e)==="[object Set]",ne=e=>typeof e=="function",be=e=>typeof e=="string",Xs=e=>typeof e=="symbol",ve=e=>e!==null&&typeof e=="object",Oi=e=>ve(e)&&ne(e.then)&&ne(e.catch),Fi=Object.prototype.toString,ts=e=>Fi.call(e),rl=e=>ts(e).slice(8,-1),Bi=e=>ts(e)==="[object Object]",Zs=e=>be(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,on=Gs(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),ns=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},ll=/-(\w)/g,nt=ns(e=>e.replace(ll,(t,n)=>n?n.toUpperCase():"")),cl=/\B([A-Z])/g,Yt=ns(e=>e.replace(cl,"-$1").toLowerCase()),ss=ns(e=>e.charAt(0).toUpperCase()+e.slice(1)),xs=ns(e=>e?`on${ss(e)}`:""),hn=(e,t)=>!Object.is(e,t),On=(e,t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value:n})},_n=e=>{const t=parseFloat(e);return isNaN(t)?e:t};let Eo;const al=()=>Eo||(Eo=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});let Oe;class ul{constructor(t=!1){this.detached=t,this.active=!0,this.effects=[],this.cleanups=[],this.parent=Oe,!t&&Oe&&(this.index=(Oe.scopes||(Oe.scopes=[])).push(this)-1)}run(t){if(this.active){const n=Oe;try{return Oe=this,t()}finally{Oe=n}}}on(){Oe=this}off(){Oe=this.parent}stop(t){if(this.active){let n,s;for(n=0,s=this.effects.length;n{const t=new Set(e);return t.w=0,t.n=0,t},Hi=e=>(e.w&pt)>0,Di=e=>(e.n&pt)>0,_l=({deps:e})=>{if(e.length)for(let t=0;t{const{deps:t}=e;if(t.length){let n=0;for(let s=0;s{(f==="length"||f>=c)&&l.push(a)})}else switch(n!==void 0&&l.push(r.get(n)),t){case"add":J(e)?Zs(n)&&l.push(r.get("length")):(l.push(r.get(Et)),Ft(e)&&l.push(r.get(Ns)));break;case"delete":J(e)||(l.push(r.get(Et)),Ft(e)&&l.push(r.get(Ns)));break;case"set":Ft(e)&&l.push(r.get(Et));break}if(l.length===1)l[0]&&Os(l[0]);else{const c=[];for(const a of l)a&&c.push(...a);Os(eo(c))}}function Os(e,t){const n=J(e)?e:[...e];for(const s of n)s.computed&&Mo(s);for(const s of n)s.computed||Mo(s)}function Mo(e,t){(e!==Ue||e.allowRecurse)&&(e.scheduler?e.scheduler():e.run())}const gl=Gs("__proto__,__v_isRef,__isVue"),ji=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(Xs)),ml=no(),vl=no(!1,!0),yl=no(!0),Ao=bl();function bl(){const e={};return["includes","indexOf","lastIndexOf"].forEach(t=>{e[t]=function(...n){const s=fe(this);for(let i=0,r=this.length;i{e[t]=function(...n){Gt();const s=fe(this)[t].apply(this,n);return Jt(),s}}),e}function no(e=!1,t=!1){return function(s,o,i){if(o==="__v_isReactive")return!e;if(o==="__v_isReadonly")return e;if(o==="__v_isShallow")return t;if(o==="__v_raw"&&i===(e?t?Ol:Yi:t?Wi:qi).get(s))return s;const r=J(s);if(!e&&r&&ce(Ao,o))return Reflect.get(Ao,o,i);const l=Reflect.get(s,o,i);return(Xs(o)?ji.has(o):gl(o))||(e||Be(s,"get",o),t)?l:Se(l)?r&&Zs(o)?l:l.value:ve(l)?e?io(l):is(l):l}}const xl=Ui(),wl=Ui(!0);function Ui(e=!1){return function(n,s,o,i){let r=n[s];if(jt(r)&&Se(r)&&!Se(o))return!1;if(!e&&(!Rn(o)&&!jt(o)&&(r=fe(r),o=fe(o)),!J(n)&&Se(r)&&!Se(o)))return r.value=o,!0;const l=J(n)&&Zs(s)?Number(s)e,os=e=>Reflect.getPrototypeOf(e);function Pn(e,t,n=!1,s=!1){e=e.__v_raw;const o=fe(e),i=fe(t);n||(t!==i&&Be(o,"get",t),Be(o,"get",i));const{has:r}=os(o),l=s?so:n?lo:pn;if(r.call(o,t))return l(e.get(t));if(r.call(o,i))return l(e.get(i));e!==o&&e.get(t)}function Cn(e,t=!1){const n=this.__v_raw,s=fe(n),o=fe(e);return t||(e!==o&&Be(s,"has",e),Be(s,"has",o)),e===o?n.has(e):n.has(e)||n.has(o)}function Sn(e,t=!1){return e=e.__v_raw,!t&&Be(fe(e),"iterate",Et),Reflect.get(e,"size",e)}function Io(e){e=fe(e);const t=fe(this);return os(t).has.call(t,e)||(t.add(e),rt(t,"add",e,e)),this}function No(e,t){t=fe(t);const n=fe(this),{has:s,get:o}=os(n);let i=s.call(n,e);i||(e=fe(e),i=s.call(n,e));const r=o.call(n,e);return n.set(e,t),i?hn(t,r)&&rt(n,"set",e,t):rt(n,"add",e,t),this}function Oo(e){const t=fe(this),{has:n,get:s}=os(t);let o=n.call(t,e);o||(e=fe(e),o=n.call(t,e)),s&&s.call(t,e);const i=t.delete(e);return o&&rt(t,"delete",e,void 0),i}function Fo(){const e=fe(this),t=e.size!==0,n=e.clear();return t&&rt(e,"clear",void 0,void 0),n}function Tn(e,t){return function(s,o){const i=this,r=i.__v_raw,l=fe(r),c=t?so:e?lo:pn;return!e&&Be(l,"iterate",Et),r.forEach((a,f)=>s.call(o,c(a),c(f),i))}}function Vn(e,t,n){return function(...s){const o=this.__v_raw,i=fe(o),r=Ft(i),l=e==="entries"||e===Symbol.iterator&&r,c=e==="keys"&&r,a=o[e](...s),f=n?so:t?lo:pn;return!t&&Be(i,"iterate",c?Ns:Et),{next(){const{value:h,done:p}=a.next();return p?{value:h,done:p}:{value:l?[f(h[0]),f(h[1])]:f(h),done:p}},[Symbol.iterator](){return this}}}}function ct(e){return function(...t){return e==="delete"?!1:this}}function Tl(){const e={get(i){return Pn(this,i)},get size(){return Sn(this)},has:Cn,add:Io,set:No,delete:Oo,clear:Fo,forEach:Tn(!1,!1)},t={get(i){return Pn(this,i,!1,!0)},get size(){return Sn(this)},has:Cn,add:Io,set:No,delete:Oo,clear:Fo,forEach:Tn(!1,!0)},n={get(i){return Pn(this,i,!0)},get size(){return Sn(this,!0)},has(i){return Cn.call(this,i,!0)},add:ct("add"),set:ct("set"),delete:ct("delete"),clear:ct("clear"),forEach:Tn(!0,!1)},s={get(i){return Pn(this,i,!0,!0)},get size(){return Sn(this,!0)},has(i){return Cn.call(this,i,!0)},add:ct("add"),set:ct("set"),delete:ct("delete"),clear:ct("clear"),forEach:Tn(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach(i=>{e[i]=Vn(i,!1,!1),n[i]=Vn(i,!0,!1),t[i]=Vn(i,!1,!0),s[i]=Vn(i,!0,!0)}),[e,n,t,s]}const[Vl,El,Ll,Ml]=Tl();function oo(e,t){const n=t?e?Ml:Ll:e?El:Vl;return(s,o,i)=>o==="__v_isReactive"?!e:o==="__v_isReadonly"?e:o==="__v_raw"?s:Reflect.get(ce(n,o)&&o in s?n:s,o,i)}const Al={get:oo(!1,!1)},Il={get:oo(!1,!0)},Nl={get:oo(!0,!1)},qi=new WeakMap,Wi=new WeakMap,Yi=new WeakMap,Ol=new WeakMap;function Fl(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function Bl(e){return e.__v_skip||!Object.isExtensible(e)?0:Fl(rl(e))}function is(e){return jt(e)?e:ro(e,!1,Ki,Al,qi)}function Hl(e){return ro(e,!1,Sl,Il,Wi)}function io(e){return ro(e,!0,Cl,Nl,Yi)}function ro(e,t,n,s,o){if(!ve(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const i=o.get(e);if(i)return i;const r=Bl(e);if(r===0)return e;const l=new Proxy(e,r===2?s:n);return o.set(e,l),l}function Bt(e){return jt(e)?Bt(e.__v_raw):!!(e&&e.__v_isReactive)}function jt(e){return!!(e&&e.__v_isReadonly)}function Rn(e){return!!(e&&e.__v_isShallow)}function Gi(e){return Bt(e)||jt(e)}function fe(e){const t=e&&e.__v_raw;return t?fe(t):e}function rn(e){return Dn(e,"__v_skip",!0),e}const pn=e=>ve(e)?is(e):e,lo=e=>ve(e)?io(e):e;function Ji(e){ht&&Ue&&(e=fe(e),zi(e.dep||(e.dep=eo())))}function Qi(e,t){e=fe(e),e.dep&&Os(e.dep)}function Se(e){return!!(e&&e.__v_isRef===!0)}function re(e){return Xi(e,!1)}function Dl(e){return Xi(e,!0)}function Xi(e,t){return Se(e)?e:new Rl(e,t)}class Rl{constructor(t,n){this.__v_isShallow=n,this.dep=void 0,this.__v_isRef=!0,this._rawValue=n?t:fe(t),this._value=n?t:pn(t)}get value(){return Ji(this),this._value}set value(t){const n=this.__v_isShallow||Rn(t)||jt(t);t=n?t:fe(t),hn(t,this._rawValue)&&(this._rawValue=t,this._value=n?t:pn(t),Qi(this))}}function m(e){return Se(e)?e.value:e}const zl={get:(e,t,n)=>m(Reflect.get(e,t,n)),set:(e,t,n,s)=>{const o=e[t];return Se(o)&&!Se(n)?(o.value=n,!0):Reflect.set(e,t,n,s)}};function Zi(e){return Bt(e)?e:new Proxy(e,zl)}var er;class jl{constructor(t,n,s,o){this._setter=n,this.dep=void 0,this.__v_isRef=!0,this[er]=!1,this._dirty=!0,this.effect=new to(t,()=>{this._dirty||(this._dirty=!0,Qi(this))}),this.effect.computed=this,this.effect.active=this._cacheable=!o,this.__v_isReadonly=s}get value(){const t=fe(this);return Ji(t),(t._dirty||!t._cacheable)&&(t._dirty=!1,t._value=t.effect.run()),t._value}set value(t){this._setter(t)}}er="__v_isReadonly";function Ul(e,t,n=!1){let s,o;const i=ne(e);return i?(s=e,o=qe):(s=e.get,o=e.set),new jl(s,o,i||!o,n)}function _t(e,t,n,s){let o;try{o=s?e(...s):e()}catch(i){rs(i,t,n)}return o}function Re(e,t,n,s){if(ne(e)){const i=_t(e,t,n,s);return i&&Oi(i)&&i.catch(r=>{rs(r,t,n)}),i}const o=[];for(let i=0;i>>1;mn(Ce[s])et&&Ce.splice(t,1)}function Yl(e){J(e)?Ht.push(...e):(!it||!it.includes(e,e.allowRecurse?Pt+1:Pt))&&Ht.push(e),nr()}function Bo(e,t=gn?et+1:0){for(;tmn(n)-mn(s)),Pt=0;Pte.id==null?1/0:e.id,Gl=(e,t)=>{const n=mn(e)-mn(t);if(n===0){if(e.pre&&!t.pre)return-1;if(t.pre&&!e.pre)return 1}return n};function sr(e){Fs=!1,gn=!0,Ce.sort(Gl);const t=qe;try{for(et=0;etbe(g)?g.trim():g)),h&&(o=n.map(_n))}let l,c=s[l=xs(t)]||s[l=xs(nt(t))];!c&&i&&(c=s[l=xs(Yt(t))]),c&&Re(c,e,6,o);const a=s[l+"Once"];if(a){if(!e.emitted)e.emitted={};else if(e.emitted[l])return;e.emitted[l]=!0,Re(a,e,6,o)}}function or(e,t,n=!1){const s=t.emitsCache,o=s.get(e);if(o!==void 0)return o;const i=e.emits;let r={},l=!1;if(!ne(e)){const c=a=>{const f=or(a,t,!0);f&&(l=!0,Pe(r,f))};!n&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}return!i&&!l?(ve(e)&&s.set(e,null),null):(J(i)?i.forEach(c=>r[c]=null):Pe(r,i),ve(e)&&s.set(e,r),r)}function ls(e,t){return!e||!xn(t)?!1:(t=t.slice(2).replace(/Once$/,""),ce(e,t[0].toLowerCase()+t.slice(1))||ce(e,Yt(t))||ce(e,t))}let $e=null,cs=null;function jn(e){const t=$e;return $e=e,cs=e&&e.type.__scopeId||null,t}function Ye(e){cs=e}function Ge(){cs=null}function F(e,t=$e,n){if(!t||e._n)return e;const s=(...o)=>{s._d&&Jo(-1);const i=jn(t);let r;try{r=e(...o)}finally{jn(i),s._d&&Jo(1)}return r};return s._n=!0,s._c=!0,s._d=!0,s}function ws(e){const{type:t,vnode:n,proxy:s,withProxy:o,props:i,propsOptions:[r],slots:l,attrs:c,emit:a,render:f,renderCache:h,data:p,setupState:g,ctx:C,inheritAttrs:L}=e;let W,y;const w=jn(e);try{if(n.shapeFlag&4){const N=o||s;W=je(f.call(N,N,h,i,g,p,C)),y=c}else{const N=t;W=je(N.length>1?N(i,{attrs:c,slots:l,emit:a}):N(i,null)),y=t.props?c:Ql(c)}}catch(N){un.length=0,rs(N,e,1),W=M(Fe)}let S=W;if(y&&L!==!1){const N=Object.keys(y),{shapeFlag:z}=S;N.length&&z&7&&(r&&N.some(Js)&&(y=Xl(y,r)),S=gt(S,y))}return n.dirs&&(S=gt(S),S.dirs=S.dirs?S.dirs.concat(n.dirs):n.dirs),n.transition&&(S.transition=n.transition),W=S,jn(w),W}const Ql=e=>{let t;for(const n in e)(n==="class"||n==="style"||xn(n))&&((t||(t={}))[n]=e[n]);return t},Xl=(e,t)=>{const n={};for(const s in e)(!Js(s)||!(s.slice(9)in t))&&(n[s]=e[s]);return n};function Zl(e,t,n){const{props:s,children:o,component:i}=e,{props:r,children:l,patchFlag:c}=t,a=i.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&c>=0){if(c&1024)return!0;if(c&16)return s?Ho(s,r,a):!!r;if(c&8){const f=t.dynamicProps;for(let h=0;he.__isSuspense;function ir(e,t){t&&t.pendingBranch?J(e)?t.effects.push(...e):t.effects.push(e):Yl(e)}function as(e,t){if(we){let n=we.provides;const s=we.parent&&we.parent.provides;s===n&&(n=we.provides=Object.create(s)),n[e]=t}}function We(e,t,n=!1){const s=we||$e;if(s){const o=s.parent==null?s.vnode.appContext&&s.vnode.appContext.provides:s.parent.provides;if(o&&e in o)return o[e];if(arguments.length>1)return n&&ne(t)?t.call(s.proxy):t}}function Ut(e,t){return us(e,null,t)}function nc(e,t){return us(e,null,{flush:"post"})}const En={};function tt(e,t,n){return us(e,t,n)}function us(e,t,{immediate:n,deep:s,flush:o,onTrack:i,onTrigger:r}=me){const l=we;let c,a=!1,f=!1;if(Se(e)?(c=()=>e.value,a=Rn(e)):Bt(e)?(c=()=>e,s=!0):J(e)?(f=!0,a=e.some(S=>Bt(S)||Rn(S)),c=()=>e.map(S=>{if(Se(S))return S.value;if(Bt(S))return Vt(S);if(ne(S))return _t(S,l,2)})):ne(e)?t?c=()=>_t(e,l,2):c=()=>{if(!(l&&l.isUnmounted))return h&&h(),Re(e,l,3,[p])}:c=qe,t&&s){const S=c;c=()=>Vt(S())}let h,p=S=>{h=y.onStop=()=>{_t(S,l,4)}},g;if(yn)if(p=qe,t?n&&Re(t,l,3,[c(),f?[]:void 0,p]):c(),o==="sync"){const S=Jc();g=S.__watcherHandles||(S.__watcherHandles=[])}else return qe;let C=f?new Array(e.length).fill(En):En;const L=()=>{if(!!y.active)if(t){const S=y.run();(s||a||(f?S.some((N,z)=>hn(N,C[z])):hn(S,C)))&&(h&&h(),Re(t,l,3,[S,C===En?void 0:f&&C[0]===En?[]:C,p]),C=S)}else y.run()};L.allowRecurse=!!t;let W;o==="sync"?W=L:o==="post"?W=()=>Le(L,l&&l.suspense):(L.pre=!0,l&&(L.id=l.uid),W=()=>uo(L));const y=new to(c,W);t?n?L():C=y.run():o==="post"?Le(y.run.bind(y),l&&l.suspense):y.run();const w=()=>{y.stop(),l&&l.scope&&Qs(l.scope.effects,y)};return g&&g.push(w),w}function sc(e,t,n){const s=this.proxy,o=be(e)?e.includes(".")?rr(s,e):()=>s[e]:e.bind(s,s);let i;ne(t)?i=t:(i=t.handler,n=t);const r=we;qt(this);const l=us(o,i.bind(s),n);return r?qt(r):Lt(),l}function rr(e,t){const n=t.split(".");return()=>{let s=e;for(let o=0;o{Vt(n,t)});else if(Bi(e))for(const n in e)Vt(e[n],t);return e}function oc(){const e={isMounted:!1,isLeaving:!1,isUnmounting:!1,leavingVNodes:new Map};return Je(()=>{e.isMounted=!0}),fr(()=>{e.isUnmounting=!0}),e}const He=[Function,Array],ic={name:"BaseTransition",props:{mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:He,onEnter:He,onAfterEnter:He,onEnterCancelled:He,onBeforeLeave:He,onLeave:He,onAfterLeave:He,onLeaveCancelled:He,onBeforeAppear:He,onAppear:He,onAfterAppear:He,onAppearCancelled:He},setup(e,{slots:t}){const n=Pr(),s=oc();let o;return()=>{const i=t.default&&ar(t.default(),!0);if(!i||!i.length)return;let r=i[0];if(i.length>1){for(const L of i)if(L.type!==Fe){r=L;break}}const l=fe(e),{mode:c}=l;if(s.isLeaving)return ks(r);const a=Do(r);if(!a)return ks(r);const f=Bs(a,l,s,n);Hs(a,f);const h=n.subTree,p=h&&Do(h);let g=!1;const{getTransitionKey:C}=a.type;if(C){const L=C();o===void 0?o=L:L!==o&&(o=L,g=!0)}if(p&&p.type!==Fe&&(!Ct(a,p)||g)){const L=Bs(p,l,s,n);if(Hs(p,L),c==="out-in")return s.isLeaving=!0,L.afterLeave=()=>{s.isLeaving=!1,n.update.active!==!1&&n.update()},ks(r);c==="in-out"&&a.type!==Fe&&(L.delayLeave=(W,y,w)=>{const S=cr(s,p);S[String(p.key)]=p,W._leaveCb=()=>{y(),W._leaveCb=void 0,delete f.delayedLeave},f.delayedLeave=w})}return r}}},lr=ic;function cr(e,t){const{leavingVNodes:n}=e;let s=n.get(t.type);return s||(s=Object.create(null),n.set(t.type,s)),s}function Bs(e,t,n,s){const{appear:o,mode:i,persisted:r=!1,onBeforeEnter:l,onEnter:c,onAfterEnter:a,onEnterCancelled:f,onBeforeLeave:h,onLeave:p,onAfterLeave:g,onLeaveCancelled:C,onBeforeAppear:L,onAppear:W,onAfterAppear:y,onAppearCancelled:w}=t,S=String(e.key),N=cr(n,e),z=(E,G)=>{E&&Re(E,s,9,G)},Y=(E,G)=>{const Q=G[1];z(E,G),J(E)?E.every(se=>se.length<=1)&&Q():E.length<=1&&Q()},X={mode:i,persisted:r,beforeEnter(E){let G=l;if(!n.isMounted)if(o)G=L||l;else return;E._leaveCb&&E._leaveCb(!0);const Q=N[S];Q&&Ct(e,Q)&&Q.el._leaveCb&&Q.el._leaveCb(),z(G,[E])},enter(E){let G=c,Q=a,se=f;if(!n.isMounted)if(o)G=W||c,Q=y||a,se=w||f;else return;let H=!1;const oe=E._enterCb=j=>{H||(H=!0,j?z(se,[E]):z(Q,[E]),X.delayedLeave&&X.delayedLeave(),E._enterCb=void 0)};G?Y(G,[E,oe]):oe()},leave(E,G){const Q=String(e.key);if(E._enterCb&&E._enterCb(!0),n.isUnmounting)return G();z(h,[E]);let se=!1;const H=E._leaveCb=oe=>{se||(se=!0,G(),oe?z(C,[E]):z(g,[E]),E._leaveCb=void 0,N[Q]===e&&delete N[Q])};N[Q]=e,p?Y(p,[E,H]):H()},clone(E){return Bs(E,t,n,s)}};return X}function ks(e){if(fs(e))return e=gt(e),e.children=null,e}function Do(e){return fs(e)?e.children?e.children[0]:void 0:e}function Hs(e,t){e.shapeFlag&6&&e.component?Hs(e.component.subTree,t):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function ar(e,t=!1,n){let s=[],o=0;for(let i=0;i1)for(let i=0;i!!e.type.__asyncLoader,fs=e=>e.type.__isKeepAlive;function rc(e,t){ur(e,"a",t)}function lc(e,t){ur(e,"da",t)}function ur(e,t,n=we){const s=e.__wdc||(e.__wdc=()=>{let o=n;for(;o;){if(o.isDeactivated)return;o=o.parent}return e()});if(ds(t,s,n),n){let o=n.parent;for(;o&&o.parent;)fs(o.parent.vnode)&&cc(s,t,n,o),o=o.parent}}function cc(e,t,n,s){const o=ds(t,e,s,!0);Qt(()=>{Qs(s[t],o)},n)}function ds(e,t,n=we,s=!1){if(n){const o=n[e]||(n[e]=[]),i=t.__weh||(t.__weh=(...r)=>{if(n.isUnmounted)return;Gt(),qt(n);const l=Re(t,n,e,r);return Lt(),Jt(),l});return s?o.unshift(i):o.push(i),i}}const lt=e=>(t,n=we)=>(!yn||e==="sp")&&ds(e,(...s)=>t(...s),n),ac=lt("bm"),Je=lt("m"),uc=lt("bu"),fo=lt("u"),fr=lt("bum"),Qt=lt("um"),fc=lt("sp"),dc=lt("rtg"),hc=lt("rtc");function _c(e,t=we){ds("ec",e,t)}function Ro(e,t){const n=$e;if(n===null)return e;const s=_s(n)||n.proxy,o=e.dirs||(e.dirs=[]);for(let i=0;it(r,l,void 0,i&&i[l]));else{const r=Object.keys(e);o=new Array(r.length);for(let l=0,c=r.length;lqn(t)?!(t.type===Fe||t.type===ee&&!_r(t.children)):!0)?e:null}const Ds=e=>e?Cr(e)?_s(e)||e.proxy:Ds(e.parent):null,ln=Pe(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>Ds(e.parent),$root:e=>Ds(e.root),$emit:e=>e.emit,$options:e=>po(e),$forceUpdate:e=>e.f||(e.f=()=>uo(e.update)),$nextTick:e=>e.n||(e.n=ao.bind(e.proxy)),$watch:e=>sc.bind(e)}),$s=(e,t)=>e!==me&&!e.__isScriptSetup&&ce(e,t),pc={get({_:e},t){const{ctx:n,setupState:s,data:o,props:i,accessCache:r,type:l,appContext:c}=e;let a;if(t[0]!=="$"){const g=r[t];if(g!==void 0)switch(g){case 1:return s[t];case 2:return o[t];case 4:return n[t];case 3:return i[t]}else{if($s(s,t))return r[t]=1,s[t];if(o!==me&&ce(o,t))return r[t]=2,o[t];if((a=e.propsOptions[0])&&ce(a,t))return r[t]=3,i[t];if(n!==me&&ce(n,t))return r[t]=4,n[t];Rs&&(r[t]=0)}}const f=ln[t];let h,p;if(f)return t==="$attrs"&&Be(e,"get",t),f(e);if((h=l.__cssModules)&&(h=h[t]))return h;if(n!==me&&ce(n,t))return r[t]=4,n[t];if(p=c.config.globalProperties,ce(p,t))return p[t]},set({_:e},t,n){const{data:s,setupState:o,ctx:i}=e;return $s(o,t)?(o[t]=n,!0):s!==me&&ce(s,t)?(s[t]=n,!0):ce(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(i[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:s,appContext:o,propsOptions:i}},r){let l;return!!n[r]||e!==me&&ce(e,r)||$s(t,r)||(l=i[0])&&ce(l,r)||ce(s,r)||ce(ln,r)||ce(o.config.globalProperties,r)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:ce(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};let Rs=!0;function gc(e){const t=po(e),n=e.proxy,s=e.ctx;Rs=!1,t.beforeCreate&&jo(t.beforeCreate,e,"bc");const{data:o,computed:i,methods:r,watch:l,provide:c,inject:a,created:f,beforeMount:h,mounted:p,beforeUpdate:g,updated:C,activated:L,deactivated:W,beforeDestroy:y,beforeUnmount:w,destroyed:S,unmounted:N,render:z,renderTracked:Y,renderTriggered:X,errorCaptured:E,serverPrefetch:G,expose:Q,inheritAttrs:se,components:H,directives:oe,filters:j}=t;if(a&&mc(a,s,null,e.appContext.config.unwrapInjectedRef),r)for(const ye in r){const pe=r[ye];ne(pe)&&(s[ye]=pe.bind(n))}if(o){const ye=o.call(n,n);ve(ye)&&(e.data=is(ye))}if(Rs=!0,i)for(const ye in i){const pe=i[ye],yt=ne(pe)?pe.bind(n,n):ne(pe.get)?pe.get.bind(n,n):qe,kn=!ne(pe)&&ne(pe.set)?pe.set.bind(n):qe,bt=le({get:yt,set:kn});Object.defineProperty(s,ye,{enumerable:!0,configurable:!0,get:()=>bt.value,set:Qe=>bt.value=Qe})}if(l)for(const ye in l)pr(l[ye],s,n,ye);if(c){const ye=ne(c)?c.call(n):c;Reflect.ownKeys(ye).forEach(pe=>{as(pe,ye[pe])})}f&&jo(f,e,"c");function de(ye,pe){J(pe)?pe.forEach(yt=>ye(yt.bind(n))):pe&&ye(pe.bind(n))}if(de(ac,h),de(Je,p),de(uc,g),de(fo,C),de(rc,L),de(lc,W),de(_c,E),de(hc,Y),de(dc,X),de(fr,w),de(Qt,N),de(fc,G),J(Q))if(Q.length){const ye=e.exposed||(e.exposed={});Q.forEach(pe=>{Object.defineProperty(ye,pe,{get:()=>n[pe],set:yt=>n[pe]=yt})})}else e.exposed||(e.exposed={});z&&e.render===qe&&(e.render=z),se!=null&&(e.inheritAttrs=se),H&&(e.components=H),oe&&(e.directives=oe)}function mc(e,t,n=qe,s=!1){J(e)&&(e=zs(e));for(const o in e){const i=e[o];let r;ve(i)?"default"in i?r=We(i.from||o,i.default,!0):r=We(i.from||o):r=We(i),Se(r)&&s?Object.defineProperty(t,o,{enumerable:!0,configurable:!0,get:()=>r.value,set:l=>r.value=l}):t[o]=r}}function jo(e,t,n){Re(J(e)?e.map(s=>s.bind(t.proxy)):e.bind(t.proxy),t,n)}function pr(e,t,n,s){const o=s.includes(".")?rr(n,s):()=>n[s];if(be(e)){const i=t[e];ne(i)&&tt(o,i)}else if(ne(e))tt(o,e.bind(n));else if(ve(e))if(J(e))e.forEach(i=>pr(i,t,n,s));else{const i=ne(e.handler)?e.handler.bind(n):t[e.handler];ne(i)&&tt(o,i,e)}}function po(e){const t=e.type,{mixins:n,extends:s}=t,{mixins:o,optionsCache:i,config:{optionMergeStrategies:r}}=e.appContext,l=i.get(t);let c;return l?c=l:!o.length&&!n&&!s?c=t:(c={},o.length&&o.forEach(a=>Un(c,a,r,!0)),Un(c,t,r)),ve(t)&&i.set(t,c),c}function Un(e,t,n,s=!1){const{mixins:o,extends:i}=t;i&&Un(e,i,n,!0),o&&o.forEach(r=>Un(e,r,n,!0));for(const r in t)if(!(s&&r==="expose")){const l=vc[r]||n&&n[r];e[r]=l?l(e[r],t[r]):t[r]}return e}const vc={data:Uo,props:$t,emits:$t,methods:$t,computed:$t,beforeCreate:Te,created:Te,beforeMount:Te,mounted:Te,beforeUpdate:Te,updated:Te,beforeDestroy:Te,beforeUnmount:Te,destroyed:Te,unmounted:Te,activated:Te,deactivated:Te,errorCaptured:Te,serverPrefetch:Te,components:$t,directives:$t,watch:bc,provide:Uo,inject:yc};function Uo(e,t){return t?e?function(){return Pe(ne(e)?e.call(this,this):e,ne(t)?t.call(this,this):t)}:t:e}function yc(e,t){return $t(zs(e),zs(t))}function zs(e){if(J(e)){const t={};for(let n=0;n0)&&!(r&16)){if(r&8){const f=e.vnode.dynamicProps;for(let h=0;h{c=!0;const[p,g]=mr(h,t,!0);Pe(r,p),g&&l.push(...g)};!n&&t.mixins.length&&t.mixins.forEach(f),e.extends&&f(e.extends),e.mixins&&e.mixins.forEach(f)}if(!i&&!c)return ve(e)&&s.set(e,Ot),Ot;if(J(i))for(let f=0;f-1,g[1]=L<0||C-1||ce(g,"default"))&&l.push(h)}}}const a=[r,l];return ve(e)&&s.set(e,a),a}function Ko(e){return e[0]!=="$"}function qo(e){const t=e&&e.toString().match(/^\s*function (\w+)/);return t?t[1]:e===null?"null":""}function Wo(e,t){return qo(e)===qo(t)}function Yo(e,t){return J(t)?t.findIndex(n=>Wo(n,e)):ne(t)&&Wo(t,e)?0:-1}const vr=e=>e[0]==="_"||e==="$stable",go=e=>J(e)?e.map(je):[je(e)],kc=(e,t,n)=>{if(t._n)return t;const s=F((...o)=>go(t(...o)),n);return s._c=!1,s},yr=(e,t,n)=>{const s=e._ctx;for(const o in e){if(vr(o))continue;const i=e[o];if(ne(i))t[o]=kc(o,i,s);else if(i!=null){const r=go(i);t[o]=()=>r}}},br=(e,t)=>{const n=go(t);e.slots.default=()=>n},$c=(e,t)=>{if(e.vnode.shapeFlag&32){const n=t._;n?(e.slots=fe(t),Dn(t,"_",n)):yr(t,e.slots={})}else e.slots={},t&&br(e,t);Dn(e.slots,hs,1)},Pc=(e,t,n)=>{const{vnode:s,slots:o}=e;let i=!0,r=me;if(s.shapeFlag&32){const l=t._;l?n&&l===1?i=!1:(Pe(o,t),!n&&l===1&&delete o._):(i=!t.$stable,yr(t,o)),r=t}else t&&(br(e,t),r={default:1});if(i)for(const l in o)!vr(l)&&!(l in r)&&delete o[l]};function xr(){return{app:null,config:{isNativeTag:sl,performance:!1,globalProperties:{},optionMergeStrategies:{},errorHandler:void 0,warnHandler:void 0,compilerOptions:{}},mixins:[],components:{},directives:{},provides:Object.create(null),optionsCache:new WeakMap,propsCache:new WeakMap,emitsCache:new WeakMap}}let Cc=0;function Sc(e,t){return function(s,o=null){ne(s)||(s=Object.assign({},s)),o!=null&&!ve(o)&&(o=null);const i=xr(),r=new Set;let l=!1;const c=i.app={_uid:Cc++,_component:s,_props:o,_container:null,_context:i,_instance:null,version:Qc,get config(){return i.config},set config(a){},use(a,...f){return r.has(a)||(a&&ne(a.install)?(r.add(a),a.install(c,...f)):ne(a)&&(r.add(a),a(c,...f))),c},mixin(a){return i.mixins.includes(a)||i.mixins.push(a),c},component(a,f){return f?(i.components[a]=f,c):i.components[a]},directive(a,f){return f?(i.directives[a]=f,c):i.directives[a]},mount(a,f,h){if(!l){const p=M(s,o);return p.appContext=i,f&&t?t(p,a):e(p,a,h),l=!0,c._container=a,a.__vue_app__=c,_s(p.component)||p.component.proxy}},unmount(){l&&(e(null,c._container),delete c._container.__vue_app__)},provide(a,f){return i.provides[a]=f,c}};return c}}function Kn(e,t,n,s,o=!1){if(J(e)){e.forEach((p,g)=>Kn(p,t&&(J(t)?t[g]:t),n,s,o));return}if(Dt(s)&&!o)return;const i=s.shapeFlag&4?_s(s.component)||s.component.proxy:s.el,r=o?null:i,{i:l,r:c}=e,a=t&&t.r,f=l.refs===me?l.refs={}:l.refs,h=l.setupState;if(a!=null&&a!==c&&(be(a)?(f[a]=null,ce(h,a)&&(h[a]=null)):Se(a)&&(a.value=null)),ne(c))_t(c,l,12,[r,f]);else{const p=be(c),g=Se(c);if(p||g){const C=()=>{if(e.f){const L=p?ce(h,c)?h[c]:f[c]:c.value;o?J(L)&&Qs(L,i):J(L)?L.includes(i)||L.push(i):p?(f[c]=[i],ce(h,c)&&(h[c]=f[c])):(c.value=[i],e.k&&(f[e.k]=c.value))}else p?(f[c]=r,ce(h,c)&&(h[c]=r)):g&&(c.value=r,e.k&&(f[e.k]=r))};r?(C.id=-1,Le(C,n)):C()}}}let at=!1;const Ln=e=>/svg/.test(e.namespaceURI)&&e.tagName!=="foreignObject",Mn=e=>e.nodeType===8;function Tc(e){const{mt:t,p:n,o:{patchProp:s,createText:o,nextSibling:i,parentNode:r,remove:l,insert:c,createComment:a}}=e,f=(y,w)=>{if(!w.hasChildNodes()){n(null,y,w),zn(),w._vnode=y;return}at=!1,h(w.firstChild,y,null,null,null),zn(),w._vnode=y,at&&console.error("Hydration completed but contains mismatches.")},h=(y,w,S,N,z,Y=!1)=>{const X=Mn(y)&&y.data==="[",E=()=>L(y,w,S,N,z,X),{type:G,ref:Q,shapeFlag:se,patchFlag:H}=w;let oe=y.nodeType;w.el=y,H===-2&&(Y=!1,w.dynamicChildren=null);let j=null;switch(G){case Kt:oe!==3?w.children===""?(c(w.el=o(""),r(y),y),j=y):j=E():(y.data!==w.children&&(at=!0,y.data=w.children),j=i(y));break;case Fe:oe!==8||X?j=E():j=i(y);break;case an:if(X&&(y=i(y),oe=y.nodeType),oe===1||oe===3){j=y;const Ie=!w.children.length;for(let de=0;de{Y=Y||!!w.dynamicChildren;const{type:X,props:E,patchFlag:G,shapeFlag:Q,dirs:se}=w,H=X==="input"&&se||X==="option";if(H||G!==-1){if(se&&Ze(w,null,S,"created"),E)if(H||!Y||G&48)for(const j in E)(H&&j.endsWith("value")||xn(j)&&!on(j))&&s(y,j,null,E[j],!1,void 0,S);else E.onClick&&s(y,"onClick",null,E.onClick,!1,void 0,S);let oe;if((oe=E&&E.onVnodeBeforeMount)&&De(oe,S,w),se&&Ze(w,null,S,"beforeMount"),((oe=E&&E.onVnodeMounted)||se)&&ir(()=>{oe&&De(oe,S,w),se&&Ze(w,null,S,"mounted")},N),Q&16&&!(E&&(E.innerHTML||E.textContent))){let j=g(y.firstChild,w,y,S,N,z,Y);for(;j;){at=!0;const Ie=j;j=j.nextSibling,l(Ie)}}else Q&8&&y.textContent!==w.children&&(at=!0,y.textContent=w.children)}return y.nextSibling},g=(y,w,S,N,z,Y,X)=>{X=X||!!w.dynamicChildren;const E=w.children,G=E.length;for(let Q=0;Q{const{slotScopeIds:X}=w;X&&(z=z?z.concat(X):X);const E=r(y),G=g(i(y),w,E,S,N,z,Y);return G&&Mn(G)&&G.data==="]"?i(w.anchor=G):(at=!0,c(w.anchor=a("]"),E,G),G)},L=(y,w,S,N,z,Y)=>{if(at=!0,w.el=null,Y){const G=W(y);for(;;){const Q=i(y);if(Q&&Q!==G)l(Q);else break}}const X=i(y),E=r(y);return l(y),n(null,w,E,X,S,N,Ln(E),z),X},W=y=>{let w=0;for(;y;)if(y=i(y),y&&Mn(y)&&(y.data==="["&&w++,y.data==="]")){if(w===0)return i(y);w--}return y};return[f,h]}const Le=ir;function Vc(e){return Ec(e,Tc)}function Ec(e,t){const n=al();n.__VUE__=!0;const{insert:s,remove:o,patchProp:i,createElement:r,createText:l,createComment:c,setText:a,setElementText:f,parentNode:h,nextSibling:p,setScopeId:g=qe,insertStaticContent:C}=e,L=(u,d,b,$=null,k=null,V=null,O=!1,T=null,A=!!d.dynamicChildren)=>{if(u===d)return;u&&!Ct(u,d)&&($=$n(u),Qe(u,k,V,!0),u=null),d.patchFlag===-2&&(A=!1,d.dynamicChildren=null);const{type:P,ref:U,shapeFlag:D}=d;switch(P){case Kt:W(u,d,b,$);break;case Fe:y(u,d,b,$);break;case an:u==null&&w(d,b,$,O);break;case ee:H(u,d,b,$,k,V,O,T,A);break;default:D&1?z(u,d,b,$,k,V,O,T,A):D&6?oe(u,d,b,$,k,V,O,T,A):(D&64||D&128)&&P.process(u,d,b,$,k,V,O,T,A,At)}U!=null&&k&&Kn(U,u&&u.ref,V,d||u,!d)},W=(u,d,b,$)=>{if(u==null)s(d.el=l(d.children),b,$);else{const k=d.el=u.el;d.children!==u.children&&a(k,d.children)}},y=(u,d,b,$)=>{u==null?s(d.el=c(d.children||""),b,$):d.el=u.el},w=(u,d,b,$)=>{[u.el,u.anchor]=C(u.children,d,b,$,u.el,u.anchor)},S=({el:u,anchor:d},b,$)=>{let k;for(;u&&u!==d;)k=p(u),s(u,b,$),u=k;s(d,b,$)},N=({el:u,anchor:d})=>{let b;for(;u&&u!==d;)b=p(u),o(u),u=b;o(d)},z=(u,d,b,$,k,V,O,T,A)=>{O=O||d.type==="svg",u==null?Y(d,b,$,k,V,O,T,A):G(u,d,k,V,O,T,A)},Y=(u,d,b,$,k,V,O,T)=>{let A,P;const{type:U,props:D,shapeFlag:K,transition:Z,dirs:ie}=u;if(A=u.el=r(u.type,V,D&&D.is,D),K&8?f(A,u.children):K&16&&E(u.children,A,null,$,k,V&&U!=="foreignObject",O,T),ie&&Ze(u,null,$,"created"),D){for(const he in D)he!=="value"&&!on(he)&&i(A,he,null,D[he],V,u.children,$,k,ot);"value"in D&&i(A,"value",null,D.value),(P=D.onVnodeBeforeMount)&&De(P,$,u)}X(A,u,u.scopeId,O,$),ie&&Ze(u,null,$,"beforeMount");const ge=(!k||k&&!k.pendingBranch)&&Z&&!Z.persisted;ge&&Z.beforeEnter(A),s(A,d,b),((P=D&&D.onVnodeMounted)||ge||ie)&&Le(()=>{P&&De(P,$,u),ge&&Z.enter(A),ie&&Ze(u,null,$,"mounted")},k)},X=(u,d,b,$,k)=>{if(b&&g(u,b),$)for(let V=0;V<$.length;V++)g(u,$[V]);if(k){let V=k.subTree;if(d===V){const O=k.vnode;X(u,O,O.scopeId,O.slotScopeIds,k.parent)}}},E=(u,d,b,$,k,V,O,T,A=0)=>{for(let P=A;P{const T=d.el=u.el;let{patchFlag:A,dynamicChildren:P,dirs:U}=d;A|=u.patchFlag&16;const D=u.props||me,K=d.props||me;let Z;b&&xt(b,!1),(Z=K.onVnodeBeforeUpdate)&&De(Z,b,d,u),U&&Ze(d,u,b,"beforeUpdate"),b&&xt(b,!0);const ie=k&&d.type!=="foreignObject";if(P?Q(u.dynamicChildren,P,T,b,$,ie,V):O||pe(u,d,T,null,b,$,ie,V,!1),A>0){if(A&16)se(T,d,D,K,b,$,k);else if(A&2&&D.class!==K.class&&i(T,"class",null,K.class,k),A&4&&i(T,"style",D.style,K.style,k),A&8){const ge=d.dynamicProps;for(let he=0;he{Z&&De(Z,b,d,u),U&&Ze(d,u,b,"updated")},$)},Q=(u,d,b,$,k,V,O)=>{for(let T=0;T{if(b!==$){if(b!==me)for(const T in b)!on(T)&&!(T in $)&&i(u,T,b[T],null,O,d.children,k,V,ot);for(const T in $){if(on(T))continue;const A=$[T],P=b[T];A!==P&&T!=="value"&&i(u,T,P,A,O,d.children,k,V,ot)}"value"in $&&i(u,"value",b.value,$.value)}},H=(u,d,b,$,k,V,O,T,A)=>{const P=d.el=u?u.el:l(""),U=d.anchor=u?u.anchor:l("");let{patchFlag:D,dynamicChildren:K,slotScopeIds:Z}=d;Z&&(T=T?T.concat(Z):Z),u==null?(s(P,b,$),s(U,b,$),E(d.children,b,U,k,V,O,T,A)):D>0&&D&64&&K&&u.dynamicChildren?(Q(u.dynamicChildren,K,b,k,V,O,T),(d.key!=null||k&&d===k.subTree)&&mo(u,d,!0)):pe(u,d,b,U,k,V,O,T,A)},oe=(u,d,b,$,k,V,O,T,A)=>{d.slotScopeIds=T,u==null?d.shapeFlag&512?k.ctx.activate(d,b,$,O,A):j(d,b,$,k,V,O,A):Ie(u,d,A)},j=(u,d,b,$,k,V,O)=>{const T=u.component=zc(u,$,k);if(fs(u)&&(T.ctx.renderer=At),jc(T),T.asyncDep){if(k&&k.registerDep(T,de),!u.el){const A=T.subTree=M(Fe);y(null,A,d,b)}return}de(T,u,d,b,k,V,O)},Ie=(u,d,b)=>{const $=d.component=u.component;if(Zl(u,d,b))if($.asyncDep&&!$.asyncResolved){ye($,d,b);return}else $.next=d,Wl($.update),$.update();else d.el=u.el,$.vnode=d},de=(u,d,b,$,k,V,O)=>{const T=()=>{if(u.isMounted){let{next:U,bu:D,u:K,parent:Z,vnode:ie}=u,ge=U,he;xt(u,!1),U?(U.el=ie.el,ye(u,U,O)):U=ie,D&&On(D),(he=U.props&&U.props.onVnodeBeforeUpdate)&&De(he,Z,U,ie),xt(u,!0);const xe=ws(u),ze=u.subTree;u.subTree=xe,L(ze,xe,h(ze.el),$n(ze),u,k,V),U.el=xe.el,ge===null&&ec(u,xe.el),K&&Le(K,k),(he=U.props&&U.props.onVnodeUpdated)&&Le(()=>De(he,Z,U,ie),k)}else{let U;const{el:D,props:K}=d,{bm:Z,m:ie,parent:ge}=u,he=Dt(d);if(xt(u,!1),Z&&On(Z),!he&&(U=K&&K.onVnodeBeforeMount)&&De(U,ge,d),xt(u,!0),D&&bs){const xe=()=>{u.subTree=ws(u),bs(D,u.subTree,u,k,null)};he?d.type.__asyncLoader().then(()=>!u.isUnmounted&&xe()):xe()}else{const xe=u.subTree=ws(u);L(null,xe,b,$,u,k,V),d.el=xe.el}if(ie&&Le(ie,k),!he&&(U=K&&K.onVnodeMounted)){const xe=d;Le(()=>De(U,ge,xe),k)}(d.shapeFlag&256||ge&&Dt(ge.vnode)&&ge.vnode.shapeFlag&256)&&u.a&&Le(u.a,k),u.isMounted=!0,d=b=$=null}},A=u.effect=new to(T,()=>uo(P),u.scope),P=u.update=()=>A.run();P.id=u.uid,xt(u,!0),P()},ye=(u,d,b)=>{d.component=u;const $=u.vnode.props;u.vnode=d,u.next=null,wc(u,d.props,$,b),Pc(u,d.children,b),Gt(),Bo(),Jt()},pe=(u,d,b,$,k,V,O,T,A=!1)=>{const P=u&&u.children,U=u?u.shapeFlag:0,D=d.children,{patchFlag:K,shapeFlag:Z}=d;if(K>0){if(K&128){kn(P,D,b,$,k,V,O,T,A);return}else if(K&256){yt(P,D,b,$,k,V,O,T,A);return}}Z&8?(U&16&&ot(P,k,V),D!==P&&f(b,D)):U&16?Z&16?kn(P,D,b,$,k,V,O,T,A):ot(P,k,V,!0):(U&8&&f(b,""),Z&16&&E(D,b,$,k,V,O,T,A))},yt=(u,d,b,$,k,V,O,T,A)=>{u=u||Ot,d=d||Ot;const P=u.length,U=d.length,D=Math.min(P,U);let K;for(K=0;KU?ot(u,k,V,!0,!1,D):E(d,b,$,k,V,O,T,A,D)},kn=(u,d,b,$,k,V,O,T,A)=>{let P=0;const U=d.length;let D=u.length-1,K=U-1;for(;P<=D&&P<=K;){const Z=u[P],ie=d[P]=A?dt(d[P]):je(d[P]);if(Ct(Z,ie))L(Z,ie,b,null,k,V,O,T,A);else break;P++}for(;P<=D&&P<=K;){const Z=u[D],ie=d[K]=A?dt(d[K]):je(d[K]);if(Ct(Z,ie))L(Z,ie,b,null,k,V,O,T,A);else break;D--,K--}if(P>D){if(P<=K){const Z=K+1,ie=ZK)for(;P<=D;)Qe(u[P],k,V,!0),P++;else{const Z=P,ie=P,ge=new Map;for(P=ie;P<=K;P++){const Ne=d[P]=A?dt(d[P]):je(d[P]);Ne.key!=null&&ge.set(Ne.key,P)}let he,xe=0;const ze=K-ie+1;let It=!1,So=0;const Zt=new Array(ze);for(P=0;P=ze){Qe(Ne,k,V,!0);continue}let Xe;if(Ne.key!=null)Xe=ge.get(Ne.key);else for(he=ie;he<=K;he++)if(Zt[he-ie]===0&&Ct(Ne,d[he])){Xe=he;break}Xe===void 0?Qe(Ne,k,V,!0):(Zt[Xe-ie]=P+1,Xe>=So?So=Xe:It=!0,L(Ne,d[Xe],b,null,k,V,O,T,A),xe++)}const To=It?Lc(Zt):Ot;for(he=To.length-1,P=ze-1;P>=0;P--){const Ne=ie+P,Xe=d[Ne],Vo=Ne+1{const{el:V,type:O,transition:T,children:A,shapeFlag:P}=u;if(P&6){bt(u.component.subTree,d,b,$);return}if(P&128){u.suspense.move(d,b,$);return}if(P&64){O.move(u,d,b,At);return}if(O===ee){s(V,d,b);for(let D=0;DT.enter(V),k);else{const{leave:D,delayLeave:K,afterLeave:Z}=T,ie=()=>s(V,d,b),ge=()=>{D(V,()=>{ie(),Z&&Z()})};K?K(V,ie,ge):ge()}else s(V,d,b)},Qe=(u,d,b,$=!1,k=!1)=>{const{type:V,props:O,ref:T,children:A,dynamicChildren:P,shapeFlag:U,patchFlag:D,dirs:K}=u;if(T!=null&&Kn(T,null,b,u,!0),U&256){d.ctx.deactivate(u);return}const Z=U&1&&K,ie=!Dt(u);let ge;if(ie&&(ge=O&&O.onVnodeBeforeUnmount)&&De(ge,d,u),U&6)Jr(u.component,b,$);else{if(U&128){u.suspense.unmount(b,$);return}Z&&Ze(u,null,d,"beforeUnmount"),U&64?u.type.remove(u,d,b,k,At,$):P&&(V!==ee||D>0&&D&64)?ot(P,d,b,!1,!0):(V===ee&&D&384||!k&&U&16)&&ot(A,d,b),$&&Po(u)}(ie&&(ge=O&&O.onVnodeUnmounted)||Z)&&Le(()=>{ge&&De(ge,d,u),Z&&Ze(u,null,d,"unmounted")},b)},Po=u=>{const{type:d,el:b,anchor:$,transition:k}=u;if(d===ee){Gr(b,$);return}if(d===an){N(u);return}const V=()=>{o(b),k&&!k.persisted&&k.afterLeave&&k.afterLeave()};if(u.shapeFlag&1&&k&&!k.persisted){const{leave:O,delayLeave:T}=k,A=()=>O(b,V);T?T(u.el,V,A):A()}else V()},Gr=(u,d)=>{let b;for(;u!==d;)b=p(u),o(u),u=b;o(d)},Jr=(u,d,b)=>{const{bum:$,scope:k,update:V,subTree:O,um:T}=u;$&&On($),k.stop(),V&&(V.active=!1,Qe(O,u,d,b)),T&&Le(T,d),Le(()=>{u.isUnmounted=!0},d),d&&d.pendingBranch&&!d.isUnmounted&&u.asyncDep&&!u.asyncResolved&&u.suspenseId===d.pendingId&&(d.deps--,d.deps===0&&d.resolve())},ot=(u,d,b,$=!1,k=!1,V=0)=>{for(let O=V;Ou.shapeFlag&6?$n(u.component.subTree):u.shapeFlag&128?u.suspense.next():p(u.anchor||u.el),Co=(u,d,b)=>{u==null?d._vnode&&Qe(d._vnode,null,null,!0):L(d._vnode||null,u,d,null,null,null,b),Bo(),zn(),d._vnode=u},At={p:L,um:Qe,m:bt,r:Po,mt:j,mc:E,pc:pe,pbc:Q,n:$n,o:e};let ys,bs;return t&&([ys,bs]=t(At)),{render:Co,hydrate:ys,createApp:Sc(Co,ys)}}function xt({effect:e,update:t},n){e.allowRecurse=t.allowRecurse=n}function mo(e,t,n=!1){const s=e.children,o=t.children;if(J(s)&&J(o))for(let i=0;i>1,e[n[l]]0&&(t[s]=n[i-1]),n[i]=s)}}for(i=n.length,r=n[i-1];i-- >0;)n[i]=r,r=t[r];return n}const Mc=e=>e.__isTeleport,cn=e=>e&&(e.disabled||e.disabled===""),Go=e=>typeof SVGElement<"u"&&e instanceof SVGElement,Us=(e,t)=>{const n=e&&e.to;return be(n)?t?t(n):null:n},Ac={__isTeleport:!0,process(e,t,n,s,o,i,r,l,c,a){const{mc:f,pc:h,pbc:p,o:{insert:g,querySelector:C,createText:L,createComment:W}}=a,y=cn(t.props);let{shapeFlag:w,children:S,dynamicChildren:N}=t;if(e==null){const z=t.el=L(""),Y=t.anchor=L("");g(z,n,s),g(Y,n,s);const X=t.target=Us(t.props,C),E=t.targetAnchor=L("");X&&(g(E,X),r=r||Go(X));const G=(Q,se)=>{w&16&&f(S,Q,se,o,i,r,l,c)};y?G(n,Y):X&&G(X,E)}else{t.el=e.el;const z=t.anchor=e.anchor,Y=t.target=e.target,X=t.targetAnchor=e.targetAnchor,E=cn(e.props),G=E?n:Y,Q=E?z:X;if(r=r||Go(Y),N?(p(e.dynamicChildren,N,G,o,i,r,l),mo(e,t,!0)):c||h(e,t,G,Q,o,i,r,l,!1),y)E||An(t,n,z,a,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const se=t.target=Us(t.props,C);se&&An(t,se,null,a,0)}else E&&An(t,Y,X,a,1)}wr(t)},remove(e,t,n,s,{um:o,o:{remove:i}},r){const{shapeFlag:l,children:c,anchor:a,targetAnchor:f,target:h,props:p}=e;if(h&&i(f),(r||!cn(p))&&(i(a),l&16))for(let g=0;g0?Ke||Ot:null,Oc(),vn>0&&Ke&&Ke.push(e),e}function x(e,t,n,s,o,i){return kr(v(e,t,n,s,o,i,!0))}function te(e,t,n,s,o){return kr(M(e,t,n,s,o,!0))}function qn(e){return e?e.__v_isVNode===!0:!1}function Ct(e,t){return e.type===t.type&&e.key===t.key}const hs="__vInternal",$r=({key:e})=>e!=null?e:null,Fn=({ref:e,ref_key:t,ref_for:n})=>e!=null?be(e)||Se(e)||ne(e)?{i:$e,r:e,k:t,f:!!n}:e:null;function v(e,t=null,n=null,s=0,o=null,i=e===ee?0:1,r=!1,l=!1){const c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&$r(t),ref:t&&Fn(t),scopeId:cs,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetAnchor:null,staticCount:0,shapeFlag:i,patchFlag:s,dynamicProps:o,dynamicChildren:null,appContext:null,ctx:$e};return l?(vo(c,n),i&128&&e.normalize(c)):n&&(c.shapeFlag|=be(n)?8:16),vn>0&&!r&&Ke&&(c.patchFlag>0||i&6)&&c.patchFlag!==32&&Ke.push(c),c}const M=Fc;function Fc(e,t=null,n=null,s=0,o=null,i=!1){if((!e||e===dr)&&(e=Fe),qn(e)){const l=gt(e,t,!0);return n&&vo(l,n),vn>0&&!i&&Ke&&(l.shapeFlag&6?Ke[Ke.indexOf(e)]=l:Ke.push(l)),l.patchFlag|=-2,l}if(Yc(e)&&(e=e.__vccOpts),t){t=Bc(t);let{class:l,style:c}=t;l&&!be(l)&&(t.class=_e(l)),ve(c)&&(Gi(c)&&!J(c)&&(c=Pe({},c)),t.style=es(c))}const r=be(e)?1:tc(e)?128:Mc(e)?64:ve(e)?4:ne(e)?2:0;return v(e,t,n,s,o,r,i,!0)}function Bc(e){return e?Gi(e)||hs in e?Pe({},e):e:null}function gt(e,t,n=!1){const{props:s,ref:o,patchFlag:i,children:r}=e,l=t?Bn(s||{},t):s;return{__v_isVNode:!0,__v_skip:!0,type:e.type,props:l,key:l&&$r(l),ref:t&&t.ref?n&&o?J(o)?o.concat(Fn(t)):[o,Fn(t)]:Fn(t):o,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:r,target:e.target,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==ee?i===-1?16:i|16:i,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:e.transition,component:e.component,suspense:e.suspense,ssContent:e.ssContent&>(e.ssContent),ssFallback:e.ssFallback&>(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx}}function Ee(e=" ",t=0){return M(Kt,null,e,t)}function Hc(e,t){const n=M(an,null,e);return n.staticCount=t,n}function q(e="",t=!1){return t?(_(),te(Fe,null,e)):M(Fe,null,e)}function je(e){return e==null||typeof e=="boolean"?M(Fe):J(e)?M(ee,null,e.slice()):typeof e=="object"?dt(e):M(Kt,null,String(e))}function dt(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:gt(e)}function vo(e,t){let n=0;const{shapeFlag:s}=e;if(t==null)t=null;else if(J(t))n=16;else if(typeof t=="object")if(s&65){const o=t.default;o&&(o._c&&(o._d=!1),vo(e,o()),o._c&&(o._d=!0));return}else{n=32;const o=t._;!o&&!(hs in t)?t._ctx=$e:o===3&&$e&&($e.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else ne(t)?(t={default:t,_ctx:$e},n=32):(t=String(t),s&64?(n=16,t=[Ee(t)]):n=8);e.children=t,e.shapeFlag|=n}function Bn(...e){const t={};for(let n=0;nwe||$e,qt=e=>{we=e,e.scope.on()},Lt=()=>{we&&we.scope.off(),we=null};function Cr(e){return e.vnode.shapeFlag&4}let yn=!1;function jc(e,t=!1){yn=t;const{props:n,children:s}=e.vnode,o=Cr(e);xc(e,n,o,t),$c(e,s);const i=o?Uc(e,t):void 0;return yn=!1,i}function Uc(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=rn(new Proxy(e.ctx,pc));const{setup:s}=n;if(s){const o=e.setupContext=s.length>1?qc(e):null;qt(e),Gt();const i=_t(s,e,0,[e.props,o]);if(Jt(),Lt(),Oi(i)){if(i.then(Lt,Lt),t)return i.then(r=>{Qo(e,r,t)}).catch(r=>{rs(r,e,0)});e.asyncDep=i}else Qo(e,i,t)}else Sr(e,t)}function Qo(e,t,n){ne(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:ve(t)&&(e.setupState=Zi(t)),Sr(e,n)}let Xo;function Sr(e,t,n){const s=e.type;if(!e.render){if(!t&&Xo&&!s.render){const o=s.template||po(e).template;if(o){const{isCustomElement:i,compilerOptions:r}=e.appContext.config,{delimiters:l,compilerOptions:c}=s,a=Pe(Pe({isCustomElement:i,delimiters:l},r),c);s.render=Xo(o,a)}}e.render=s.render||qe}qt(e),Gt(),gc(e),Jt(),Lt()}function Kc(e){return new Proxy(e.attrs,{get(t,n){return Be(e,"get","$attrs"),t[n]}})}function qc(e){const t=s=>{e.exposed=s||{}};let n;return{get attrs(){return n||(n=Kc(e))},slots:e.slots,emit:e.emit,expose:t}}function _s(e){if(e.exposed)return e.exposeProxy||(e.exposeProxy=new Proxy(Zi(rn(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in ln)return ln[n](e)},has(t,n){return n in t||n in ln}}))}function Wc(e,t=!0){return ne(e)?e.displayName||e.name:e.name||t&&e.__name}function Yc(e){return ne(e)&&"__vccOpts"in e}const le=(e,t)=>Ul(e,t,yn);function Wn(e,t,n){const s=arguments.length;return s===2?ve(t)&&!J(t)?qn(t)?M(e,null,[t]):M(e,t):M(e,null,t):(s>3?n=Array.prototype.slice.call(arguments,2):s===3&&qn(n)&&(n=[n]),M(e,t,n))}const Gc=Symbol(""),Jc=()=>We(Gc),Qc="3.2.45",Xc="http://www.w3.org/2000/svg",St=typeof document<"u"?document:null,Zo=St&&St.createElement("template"),Zc={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,s)=>{const o=t?St.createElementNS(Xc,e):St.createElement(e,n?{is:n}:void 0);return e==="select"&&s&&s.multiple!=null&&o.setAttribute("multiple",s.multiple),o},createText:e=>St.createTextNode(e),createComment:e=>St.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>St.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,s,o,i){const r=n?n.previousSibling:t.lastChild;if(o&&(o===i||o.nextSibling))for(;t.insertBefore(o.cloneNode(!0),n),!(o===i||!(o=o.nextSibling)););else{Zo.innerHTML=s?`${e}`:e;const l=Zo.content;if(s){const c=l.firstChild;for(;c.firstChild;)l.appendChild(c.firstChild);l.removeChild(c)}t.insertBefore(l,n)}return[r?r.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}};function ea(e,t,n){const s=e._vtc;s&&(t=(t?[t,...s]:[...s]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}function ta(e,t,n){const s=e.style,o=be(n);if(n&&!o){for(const i in n)Ks(s,i,n[i]);if(t&&!be(t))for(const i in t)n[i]==null&&Ks(s,i,"")}else{const i=s.display;o?t!==n&&(s.cssText=n):t&&e.removeAttribute("style"),"_vod"in e&&(s.display=i)}}const ei=/\s*!important$/;function Ks(e,t,n){if(J(n))n.forEach(s=>Ks(e,t,s));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const s=na(e,t);ei.test(n)?e.setProperty(Yt(s),n.replace(ei,""),"important"):e[s]=n}}const ti=["Webkit","Moz","ms"],Ps={};function na(e,t){const n=Ps[t];if(n)return n;let s=nt(t);if(s!=="filter"&&s in e)return Ps[t]=s;s=ss(s);for(let o=0;oCs||(ca.then(()=>Cs=0),Cs=Date.now());function ua(e,t){const n=s=>{if(!s._vts)s._vts=Date.now();else if(s._vts<=n.attached)return;Re(fa(s,n.value),t,5,[s])};return n.value=e,n.attached=aa(),n}function fa(e,t){if(J(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(s=>o=>!o._stopped&&s&&s(o))}else return t}const oi=/^on[a-z]/,da=(e,t,n,s,o=!1,i,r,l,c)=>{t==="class"?ea(e,s,o):t==="style"?ta(e,n,s):xn(t)?Js(t)||ra(e,t,n,s,r):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):ha(e,t,s,o))?oa(e,t,s,i,r,l,c):(t==="true-value"?e._trueValue=s:t==="false-value"&&(e._falseValue=s),sa(e,t,s,o))};function ha(e,t,n,s){return s?!!(t==="innerHTML"||t==="textContent"||t in e&&oi.test(t)&&ne(n)):t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA"||oi.test(t)&&be(n)?!1:t in e}const ut="transition",en="animation",ps=(e,{slots:t})=>Wn(lr,_a(e),t);ps.displayName="Transition";const Tr={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String};ps.props=Pe({},lr.props,Tr);const wt=(e,t=[])=>{J(e)?e.forEach(n=>n(...t)):e&&e(...t)},ii=e=>e?J(e)?e.some(t=>t.length>1):e.length>1:!1;function _a(e){const t={};for(const H in e)H in Tr||(t[H]=e[H]);if(e.css===!1)return t;const{name:n="v",type:s,duration:o,enterFromClass:i=`${n}-enter-from`,enterActiveClass:r=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:c=i,appearActiveClass:a=r,appearToClass:f=l,leaveFromClass:h=`${n}-leave-from`,leaveActiveClass:p=`${n}-leave-active`,leaveToClass:g=`${n}-leave-to`}=e,C=pa(o),L=C&&C[0],W=C&&C[1],{onBeforeEnter:y,onEnter:w,onEnterCancelled:S,onLeave:N,onLeaveCancelled:z,onBeforeAppear:Y=y,onAppear:X=w,onAppearCancelled:E=S}=t,G=(H,oe,j)=>{kt(H,oe?f:l),kt(H,oe?a:r),j&&j()},Q=(H,oe)=>{H._isLeaving=!1,kt(H,h),kt(H,g),kt(H,p),oe&&oe()},se=H=>(oe,j)=>{const Ie=H?X:w,de=()=>G(oe,H,j);wt(Ie,[oe,de]),ri(()=>{kt(oe,H?c:i),ft(oe,H?f:l),ii(Ie)||li(oe,s,L,de)})};return Pe(t,{onBeforeEnter(H){wt(y,[H]),ft(H,i),ft(H,r)},onBeforeAppear(H){wt(Y,[H]),ft(H,c),ft(H,a)},onEnter:se(!1),onAppear:se(!0),onLeave(H,oe){H._isLeaving=!0;const j=()=>Q(H,oe);ft(H,h),va(),ft(H,p),ri(()=>{!H._isLeaving||(kt(H,h),ft(H,g),ii(N)||li(H,s,W,j))}),wt(N,[H,j])},onEnterCancelled(H){G(H,!1),wt(S,[H])},onAppearCancelled(H){G(H,!0),wt(E,[H])},onLeaveCancelled(H){Q(H),wt(z,[H])}})}function pa(e){if(e==null)return null;if(ve(e))return[Ss(e.enter),Ss(e.leave)];{const t=Ss(e);return[t,t]}}function Ss(e){return _n(e)}function ft(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e._vtc||(e._vtc=new Set)).add(t)}function kt(e,t){t.split(/\s+/).forEach(s=>s&&e.classList.remove(s));const{_vtc:n}=e;n&&(n.delete(t),n.size||(e._vtc=void 0))}function ri(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let ga=0;function li(e,t,n,s){const o=e._endId=++ga,i=()=>{o===e._endId&&s()};if(n)return setTimeout(i,n);const{type:r,timeout:l,propCount:c}=ma(e,t);if(!r)return s();const a=r+"end";let f=0;const h=()=>{e.removeEventListener(a,p),i()},p=g=>{g.target===e&&++f>=c&&h()};setTimeout(()=>{f(n[C]||"").split(", "),o=s(`${ut}Delay`),i=s(`${ut}Duration`),r=ci(o,i),l=s(`${en}Delay`),c=s(`${en}Duration`),a=ci(l,c);let f=null,h=0,p=0;t===ut?r>0&&(f=ut,h=r,p=i.length):t===en?a>0&&(f=en,h=a,p=c.length):(h=Math.max(r,a),f=h>0?r>a?ut:en:null,p=f?f===ut?i.length:c.length:0);const g=f===ut&&/\b(transform|all)(,|$)/.test(s(`${ut}Property`).toString());return{type:f,timeout:h,propCount:p,hasTransform:g}}function ci(e,t){for(;e.lengthai(n)+ai(e[s])))}function ai(e){return Number(e.slice(0,-1).replace(",","."))*1e3}function va(){return document.body.offsetHeight}const ui=e=>{const t=e.props["onUpdate:modelValue"]||!1;return J(t)?n=>On(t,n):t};function ya(e){e.target.composing=!0}function fi(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const ba={created(e,{modifiers:{lazy:t,trim:n,number:s}},o){e._assign=ui(o);const i=s||o.props&&o.props.type==="number";Nt(e,t?"change":"input",r=>{if(r.target.composing)return;let l=e.value;n&&(l=l.trim()),i&&(l=_n(l)),e._assign(l)}),n&&Nt(e,"change",()=>{e.value=e.value.trim()}),t||(Nt(e,"compositionstart",ya),Nt(e,"compositionend",fi),Nt(e,"change",fi))},mounted(e,{value:t}){e.value=t==null?"":t},beforeUpdate(e,{value:t,modifiers:{lazy:n,trim:s,number:o}},i){if(e._assign=ui(i),e.composing||document.activeElement===e&&e.type!=="range"&&(n||s&&e.value.trim()===t||(o||e.type==="number")&&_n(e.value)===t))return;const r=t==null?"":t;e.value!==r&&(e.value=r)}},xa=["ctrl","shift","alt","meta"],wa={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>xa.some(n=>e[`${n}Key`]&&!t.includes(n))},Vr=(e,t)=>(n,...s)=>{for(let o=0;o{tn(e,!1)}):tn(e,t))},beforeUnmount(e,{value:t}){tn(e,t)}};function tn(e,t){e.style.display=t?e._vod:"none"}const $a=Pe({patchProp:da},Zc);let Ts,di=!1;function Pa(){return Ts=di?Ts:Vc($a),di=!0,Ts}const Ca=(...e)=>{const t=Pa().createApp(...e),{mount:n}=t;return t.mount=s=>{const o=Sa(s);if(o)return n(o,!0,o instanceof SVGElement)},t};function Sa(e){return be(e)?document.querySelector(e):e}const B=(e,t)=>{const n=e.__vccOpts||e;for(const[s,o]of t)n[s]=o;return n},Ta="modulepreload",Va=function(e){return"/regolith/"+e},hi={},Er=function(t,n,s){if(!n||n.length===0)return t();const o=document.getElementsByTagName("link");return Promise.all(n.map(i=>{if(i=Va(i),i in hi)return;hi[i]=!0;const r=i.endsWith(".css"),l=r?'[rel="stylesheet"]':"";if(!!s)for(let f=o.length-1;f>=0;f--){const h=o[f];if(h.href===i&&(!r||h.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${i}"]${l}`))return;const a=document.createElement("link");if(a.rel=r?"stylesheet":Ta,r||(a.as="script",a.crossOrigin=""),a.href=i,document.head.appendChild(a),r)return new Promise((f,h)=>{a.addEventListener("load",f),a.addEventListener("error",()=>h(new Error(`Unable to preload CSS for ${i}`)))})})).then(()=>t())};const Ea=R({__name:"VPBadge",props:{text:null,type:null},setup(e){return(t,n)=>{var s;return _(),x("span",{class:_e(["VPBadge",(s=e.type)!=null?s:"tip"])},[I(t.$slots,"default",{},()=>[Ee(ae(e.text),1)],!0)],2)}}});const La=B(Ea,[["__scopeId","data-v-8d21f6c9"]]),Ma=JSON.parse('{"lang":"en-US","title":"Regolith","description":"A flexible and language-agnostic addon-compiler for the Bedrock Edition of Minecraft.","base":"/regolith/","head":[],"appearance":true,"themeConfig":{"logo":"/logo.png","editLink":{"text":"Suggest changes to this page.","pattern":"https://github.com/Bedrock-OSS/regolith/edit/main/docs/docs/:path"},"socialLinks":[{"icon":"github","link":"https://github.com/Bedrock-OSS/regolith"},{"icon":"discord","link":"https://discord.gg/XjV87YN"}],"footer":{"message":"Released under the MIT license.","copyright":"Copyright \xA9 2024 Bedrock OSS."},"nav":[{"text":"Guide","link":"/guide/what-is-regolith","activeMatch":"/guide/"},{"text":"Standard Library","link":"/standard-library"},{"text":"Community Filters","link":"/community-filters"},{"text":"Resources","items":[{"text":"Project Config Standard","link":"https://github.com/Bedrock-OSS/project-config-standard"}]},{"text":"v1.2.0","items":[{"text":"Release Notes","link":"https://github.com/Bedrock-OSS/regolith/releases"}]}],"sidebar":{"/guide/":[{"text":"Introduction","collapsible":true,"items":[{"text":"What Is Regolith?","link":"/guide/what-is-regolith"},{"text":"Installing","link":"/guide/installing"},{"text":"Getting Started","link":"/guide/getting-started"},{"text":"Troubleshooting","link":"/guide/troubleshooting"}]},{"text":"Advanced","collapsible":true,"items":[{"text":"Configuration File","link":"/guide/configuration"},{"text":"User Configuration","link":"/guide/user-configuration"},{"text":"Data Folder","link":"/guide/data-folder"},{"text":"Export Targets","link":"/guide/export-targets"},{"text":"Profiles","link":"/guide/profiles"},{"text":"Experiments","link":"/guide/experiments"},{"text":"Safety","link":"/guide/safety"}]},{"text":"Filters","collapsible":true,"items":[{"text":"Introduction","link":"/guide/filters"},{"text":"Local Filters","link":"/guide/local-filters"},{"text":"Custom Filters","link":"/guide/custom-filters"},{"text":"Online Filters","link":"/guide/online-filters"},{"text":"Installing Filters","link":"/guide/installing-filters"},{"text":"Filter Run Modes","link":"/guide/filter-run-modes"},{"text":"Create a Filter","link":"/guide/create-a-filter"}]},{"text":"Filter Types","collapsible":true,"items":[{"text":"Java Filters","link":"/guide/java-filters"},{"text":".NET Filters","link":"/guide/dotnet-filters"},{"text":"Nim Filters","link":"/guide/nim-filters"},{"text":"Python Filters","link":"/guide/python-filters"},{"text":"Shell Filters","link":"/guide/shell-filters"},{"text":"NodeJS Filters","link":"/guide/node-filters"},{"text":"Deno Filters","link":"/guide/deno-filters"},{"text":"Profile Filters","link":"/guide/profile-filters"}]}]}},"locales":{},"langs":{},"scrollOffset":90,"cleanUrls":"with-subfolders"}'),gs=/^[a-z]+:/i,_i="vitepress-theme-appearance",Me=typeof window<"u",Lr={relativePath:"",title:"404",description:"Not Found",headers:[],frontmatter:{sidebar:!1,layout:"page"},lastUpdated:0};function Aa(e,t){t.sort((n,s)=>{const o=s.split("/").length-n.split("/").length;return o!==0?o:s.length-n.length});for(const n of t)if(e.startsWith(n))return n}function pi(e,t){const n=Aa(t,Object.keys(e));return n?e[n]:void 0}function Ia(e){const{locales:t}=e.themeConfig||{},n=e.locales;return t&&n?Object.keys(t).reduce((s,o)=>(s[o]={label:t[o].label,lang:n[o].lang},s),{}):{}}function Na(e,t){t=Fa(e,t);const n=pi(e.locales||{},t),s=pi(e.themeConfig.locales||{},t);return Object.assign({},e,n,{themeConfig:Object.assign({},e.themeConfig,s,{locales:{}}),lang:(n||e).lang,locales:{},langs:Ia(e)})}function Mr(e,t){var i;const n=t.title||e.title,s=(i=t.titleTemplate)!=null?i:e.titleTemplate;if(typeof s=="string"&&s.includes(":title"))return s.replace(/:title/g,n);const o=Oa(e.title,s);return`${n}${o}`}function Oa(e,t){return t===!1?"":t===!0||t===void 0?` | ${e}`:e===t?"":` | ${t}`}function Fa(e,t){if(!Me)return t;const n=e.base,s=n.endsWith("/")?n.slice(0,-1):n;return t.slice(s.length)}function Ba(e,t){const[n,s]=t;if(n!=="meta")return!1;const o=Object.entries(s)[0];return o==null?!1:e.some(([i,r])=>i===n&&r[o[0]]===o[1])}function Ha(e,t){return[...e.filter(n=>!Ba(t,n)),...t]}const Da=/[\u0000-\u001F"#$&*+,:;<=>?[\]^`{|}\u007F]/g,Ra=/^[a-z]:/i;function gi(e){const t=Ra.exec(e),n=t?t[0]:"";return n+e.slice(n.length).replace(Da,"_").replace(/(^|\/)_+(?=[^/]*$)/,"$1")}function za(e,t){return`${e}${t}`.replace(/\/+/g,"/")}function bn(e){return gs.test(e)?e:za(Wt.value.base,e)}function Ar(e){let t=e.replace(/\.html$/,"");if(t=decodeURIComponent(t),t.endsWith("/")&&(t+="index"),Me){const n="/regolith/";t=gi(t.slice(n.length).replace(/\//g,"_")||"index")+".md";const s=__VP_HASH_MAP__[t.toLowerCase()];t=`${n}assets/${t}.${s}.js`}else t=`./${gi(t.slice(1).replace(/\//g,"_"))}.md.js`;return t}const Ir=Symbol(),Wt=Dl(Ma);function ja(e){const t=le(()=>Na(Wt.value,e.path));return{site:t,theme:le(()=>t.value.themeConfig),page:le(()=>e.data),frontmatter:le(()=>e.data.frontmatter),lang:le(()=>t.value.lang),localePath:le(()=>{const{langs:n,lang:s}=t.value,o=Object.keys(n).find(i=>n[i].lang===s);return bn(o||"/")}),title:le(()=>Mr(t.value,e.data)),description:le(()=>e.data.description||t.value.description),isDark:re(!1)}}function ue(){const e=We(Ir);if(!e)throw new Error("vitepress data not properly injected in app");return e}const Nr=Symbol(),mi="http://a.com",Ua=()=>({path:"/",component:null,data:Lr});function Ka(e,t){const n=is(Ua()),s={route:n,go:o};async function o(l=Me?location.href:"/"){var a,f;await((a=s.onBeforeRouteChange)==null?void 0:a.call(s,l));const c=new URL(l,mi);Wt.value.cleanUrls==="disabled"&&!c.pathname.endsWith("/")&&!c.pathname.endsWith(".html")&&(c.pathname+=".html",l=c.pathname+c.search+c.hash),Me&&(history.replaceState({scrollPosition:window.scrollY},document.title),history.pushState(null,"",l)),await r(l),await((f=s.onAfterRouteChanged)==null?void 0:f.call(s,l))}let i=null;async function r(l,c=0,a=!1){const f=new URL(l,mi),h=i=f.pathname;try{let p=await e(h);if(i===h){i=null;const{default:g,__pageData:C}=p;if(!g)throw new Error(`Invalid route component: ${g}`);n.path=Me?h:bn(h),n.component=rn(g),n.data=rn(C),Me&&ao(()=>{if(f.hash&&!c){let L=null;try{L=document.querySelector(decodeURIComponent(f.hash))}catch(W){console.warn(W)}if(L){vi(L,f.hash);return}}window.scrollTo(0,c)})}}catch(p){if(!/fetch/.test(p.message)&&!/^\/404(\.html|\/)?$/.test(l)&&console.error(p),!a)try{const g=await fetch(Wt.value.base+"hashmap.json");window.__VP_HASH_MAP__=await g.json(),await r(l,c,!0);return}catch{}i===h&&(i=null,n.path=Me?h:bn(h),n.component=t?rn(t):null,n.data=Lr)}}return Me&&(window.addEventListener("click",l=>{if(l.target.closest("button"))return;const a=l.target.closest("a");if(a&&!a.closest(".vp-raw")&&!a.download){const{href:f,origin:h,pathname:p,hash:g,search:C,target:L}=a,W=window.location,y=p.match(/\.\w+$/);!l.ctrlKey&&!l.shiftKey&&!l.altKey&&!l.metaKey&&L!=="_blank"&&h===W.origin&&!(y&&y[0]!==".html")&&(l.preventDefault(),p===W.pathname&&C===W.search?g&&g!==W.hash&&(history.pushState(null,"",g),window.dispatchEvent(new Event("hashchange")),vi(a,g,a.classList.contains("header-anchor"))):o(f))}},{capture:!0}),window.addEventListener("popstate",l=>{r(location.href,l.state&&l.state.scrollPosition||0)}),window.addEventListener("hashchange",l=>{l.preventDefault()})),s}function qa(){const e=We(Nr);if(!e)throw new Error("useRouter() is called without provider.");return e}function vt(){return qa().route}function vi(e,t,n=!1){let s=null;try{s=e.classList.contains("header-anchor")?e:document.querySelector(decodeURIComponent(t))}catch(o){console.warn(o)}if(s){let o=Wt.value.scrollOffset;typeof o=="string"&&(o=document.querySelector(o).getBoundingClientRect().bottom+24);const i=parseInt(window.getComputedStyle(s).paddingTop,10),r=window.scrollY+s.getBoundingClientRect().top-o+i;!n||Math.abs(r-window.scrollY)>window.innerHeight?window.scrollTo(0,r):window.scrollTo({left:0,top:r,behavior:"smooth"})}}const Wa=R({name:"VitePressContent",props:{onContentUpdated:Function},setup(e){const t=vt();return fo(()=>{var n;(n=e.onContentUpdated)==null||n.call(e)}),()=>Wn("div",{style:{position:"relative"}},[t.component?Wn(t.component):null])}}),Or=/#.*$/,Ya=/(index)?\.(md|html)$/,Ga=typeof window<"u",Ja=re(Ga?location.hash:"");function Qa(e){return gs.test(e)}function Xa(e,t){let n,s=!1;return()=>{n&&clearTimeout(n),s?n=setTimeout(e,t):(e(),s=!0,setTimeout(()=>{s=!1},t))}}function Xt(e,t,n=!1){if(t===void 0)return!1;if(e=bi(`/${e}`),n)return new RegExp(t).test(e);if(bi(t)!==e)return!1;const s=t.match(Or);return s?Ja.value===s[0]:!0}function yi(e){return/^\//.test(e)?e:`/${e}`}function bi(e){return decodeURI(e).replace(Or,"").replace(Ya,"")}function Yn(e){if(Qa(e))return e;const{site:t}=ue(),{pathname:n,search:s,hash:o}=new URL(e,"http://example.com"),i=n.endsWith("/")||n.endsWith(".html")?e:`${n.replace(/(\.md)?$/,t.value.cleanUrls==="disabled"?".html":"")}${s}${o}`;return bn(i)}function Fr(e,t){if(Array.isArray(e))return e;if(e==null)return[];t=yi(t);const n=Object.keys(e).sort((s,o)=>o.split("/").length-s.split("/").length).find(s=>t.startsWith(yi(s)));return n?e[n]:[]}function Za(e){const t=[];function n(s){for(const o of s)o.link&&t.push({...o,link:o.link}),"items"in o&&n(o.items)}for(const s of e)n(s.items);return t}function st(){const e=vt(),{theme:t,frontmatter:n}=ue(),s=re(!1),o=le(()=>{const f=t.value.sidebar,h=e.data.relativePath;return f?Fr(f,h):[]}),i=le(()=>n.value.sidebar!==!1&&o.value.length>0&&n.value.layout!=="home"),r=le(()=>n.value.layout!=="home"&&n.value.aside!==!1);function l(){s.value=!0}function c(){s.value=!1}function a(){s.value?c():l()}return{isOpen:s,sidebar:o,hasSidebar:i,hasAside:r,open:l,close:c,toggle:a}}function eu(e,t){let n;Ut(()=>{n=e.value?document.activeElement:void 0}),Je(()=>{window.addEventListener("keyup",s)}),Qt(()=>{window.removeEventListener("keyup",s)});function s(o){o.key==="Escape"&&e.value&&(t(),n==null||n.focus())}}const tu=R({__name:"VPSkipLink",setup(e){const t=vt(),n=re();tt(()=>t.path,()=>n.value.focus());function s({target:o}){const i=document.querySelector(o.hash);if(i){const r=()=>{i.removeAttribute("tabindex"),i.removeEventListener("blur",r)};i.setAttribute("tabindex","-1"),i.addEventListener("blur",r),i.focus(),window.scrollTo(0,0)}}return(o,i)=>(_(),x(ee,null,[v("span",{ref_key:"backToTop",ref:n,tabindex:"-1"},null,512),v("a",{href:"#VPContent",class:"VPSkipLink visually-hidden",onClick:s}," Skip to content ")],64))}});const nu=B(tu,[["__scopeId","data-v-151f2593"]]),su={key:0,class:"VPBackdrop"},ou=R({__name:"VPBackdrop",props:{show:{type:Boolean}},setup(e){return(t,n)=>(_(),te(ps,{name:"fade"},{default:F(()=>[e.show?(_(),x("div",su)):q("",!0)]),_:1}))}});const iu=B(ou,[["__scopeId","data-v-0164f098"]]);function ru(){const e=re(!1);function t(){e.value=!0,window.addEventListener("resize",o)}function n(){e.value=!1,window.removeEventListener("resize",o)}function s(){e.value?n():t()}function o(){window.outerWidth>=768&&n()}const i=vt();return tt(()=>i.path,n),{isScreenOpen:e,openScreen:t,closeScreen:n,toggleScreen:s}}const lu=["src","alt"],cu={inheritAttrs:!1},au=R({...cu,__name:"VPImage",props:{image:null,alt:null},setup(e){return(t,n)=>{var o;const s=mt("VPImage",!0);return e.image?(_(),x(ee,{key:0},[typeof e.image=="string"||"src"in e.image?(_(),x("img",Bn({key:0,class:"VPImage"},typeof e.image=="string"?t.$attrs:{...e.image,...t.$attrs},{src:m(bn)(typeof e.image=="string"?e.image:e.image.src),alt:(o=e.alt)!=null?o:typeof e.image=="string"?"":e.image.alt||""}),null,16,lu)):(_(),x(ee,{key:1},[M(s,Bn({class:"dark",image:e.image.dark,alt:typeof e.image.dark=="string"?e.image.alt:e.image.dark.alt||e.image.alt},t.$attrs),null,16,["image","alt"]),M(s,Bn({class:"light",image:e.image.light,alt:typeof e.image.light=="string"?e.image.alt:e.image.light.alt||e.image.alt},t.$attrs),null,16,["image","alt"])],64))],64)):q("",!0)}}});const Br=B(au,[["__scopeId","data-v-b7ac6bd3"]]),uu=["href"],fu=R({__name:"VPNavBarTitle",setup(e){const{site:t,theme:n}=ue(),{hasSidebar:s}=st();return(o,i)=>(_(),x("div",{class:_e(["VPNavBarTitle",{"has-sidebar":m(s)}])},[v("a",{class:"title",href:m(t).base},[I(o.$slots,"nav-bar-title-before",{},void 0,!0),M(Br,{class:"logo",image:m(n).logo},null,8,["image"]),m(n).siteTitle?(_(),x(ee,{key:0},[Ee(ae(m(n).siteTitle),1)],64)):m(n).siteTitle===void 0?(_(),x(ee,{key:1},[Ee(ae(m(t).title),1)],64)):q("",!0),I(o.$slots,"nav-bar-title-after",{},void 0,!0)],8,uu)],2))}});const du=B(fu,[["__scopeId","data-v-d5925166"]]),hu="/regolith/assets/flex-logo.2489261b.svg";function Vs(e,t){return typeof e>"u"?t:e}function xi(e){const t=Array(e);for(let n=0;n=this.minlength&&(l||!r[f])){let p=In(c,o,a),g="";switch(this.tokenize){case"full":if(3C;L--)if(L-C>=this.minlength){const W=In(c,o,a,h,C);g=f.substring(C,L),this.push_index(r,g,W,e,n)}break}case"reverse":if(2=this.minlength){const L=In(c,o,a,h,C);this.push_index(r,g,L,e,n)}g=""}case"forward":if(1=this.minlength&&this.push_index(r,g,p,e,n);break}default:if(this.boost&&(p=Math.min(0|p/this.boost(t,f,a),c-1)),this.push_index(r,f,p,e,n),l&&1=this.minlength&&!C[f]){C[f]=1;const S=In(L+(o/2>L?0:1),o,a,y-1,w-1),N=this.bidirectional&&f>W;this.push_index(i,N?W:f,S,e,n,N?f:W)}}}}}this.fastupdate||(this.register[e]=1)}}return this};function In(e,t,n,s,o){return n&&1=this.minlength&&!h[g]){if(!this.optimize&&!i&&!this.map[g])return r;p[L++]=g,h[g]=1}e=p,s=e.length}if(!s)return r;t||(t=100);let c,a=this.depth&&1=n)))));g++);if(a)return o?$i(l,n,0):void(e[e.length]=l)}return!t&&l};function $i(e,t,n){return e=e.length===1?e[0]:pu(e),n||e.length>t?e.slice(n,n+t):e}function Pi(e,t,n,s){if(n){const o=s&&t>n;e=e[o?t:n],e=e&&e[o?n:t]}else e=e[t];return e}Ve.prototype.contain=function(e){return!!this.register[e]},Ve.prototype.update=function(e,t){return this.remove(e).add(e,t)},Ve.prototype.remove=function(e,t){const n=this.register[e];if(n){if(this.fastupdate)for(let s,o=0;o{if(o.value){for(var y=f.value.search(o.value,{enrich:!0}),w=[],S=0;S!y||!y.length?[]:y.reduce((S,N)=>(S[w(N)]||(S[w(N)]=[]),S[w(N)].push(N),S),{}),L=()=>{setTimeout(()=>{r.value&&r.value.focus()},100),W(),s.value=!0};Je(async()=>{var N,z;const y=await Er(()=>import("./chunks/virtual_search-data.3cda3011.js"),[]);l.value=y.default.INDEX_DATA,c.value=y.default.PREVIEW_LOOKUP,a.value=y.default.Options,i.value=window.location.origin+t.value,h.value=((N=a.value)==null?void 0:N.buttonLabel)||h.value,p.value=((z=a.value)==null?void 0:z.placeholder)||p.value;var w=new Ve(a.value);w.import("reg",l.value.reg),w.import("cfg",l.value.cfg),w.import("map",l.value.map),w.import("ctx",l.value.ctx),f.value=w,n.value.innerHTML=/(Mac|iPhone|iPod|iPad)/i.test(navigator.platform)?"\u2318":"Ctrl";const S=Y=>{Y.key==="k"&&(Y.ctrlKey||Y.metaKey)&&(Y.preventDefault(),L())};window.addEventListener("keydown",S)});function W(){s.value=!1,o.value=""}return(y,w)=>{const S=mt("ClientOnly");return _(),x("div",Nu,[M(S,null,{default:F(()=>[(_(),te(Nc,{to:"body"},[Ro(v("div",{class:"modal-back",onClick:w[2]||(w[2]=N=>s.value=!1)},[v("div",{class:"modal",onClick:w[1]||(w[1]=Vr(()=>{},["stop"]))},[v("form",Ou,[Fu,Ro(v("input",{class:"DocSearch-Input","aria-autocomplete":"both","aria-labelledby":"docsearch-label",id:"docsearch-input",autocomplete:"off",autocorrect:"off",autocapitalize:"off",enterkeyhint:"search",spellcheck:"false",autofocus:"true","onUpdate:modelValue":w[0]||(w[0]=N=>o.value=N),placeholder:p.value,maxlength:"64",type:"search",ref_key:"input",ref:r},null,8,Bu),[[ba,o.value]])]),v("div",Hu,[(_(!0),x(ee,null,ke(C(m(g),N=>N.link.split("/").slice(0,-1).join("-")),(N,z)=>(_(),x("div",{key:z},[v("span",Du,ae(z?z.toString()[0].toUpperCase()+z.toString().slice(1):"Home"),1),(_(!0),x(ee,null,ke(N,Y=>(_(),x("a",{href:i.value+Y.link,key:Y.id,onClick:W},[v("div",zu,[v("span",ju,ae(Y.link.includes("#")?"#":"\u25A4"),1),v("div",Uu,[v("h3",null,ae(Y.title),1),v("p",null,[v("div",{innerHTML:Y.preview},null,8,Ku)])]),qu])],8,Ru))),128))]))),128))]),Wu])],512),[[ka,s.value]])]))]),_:1}),v("div",{id:"docsearch",onClick:w[3]||(w[3]=N=>L())},[v("button",Yu,[v("span",Gu,[Ju,v("span",Qu,ae(h.value),1)]),v("span",Xu,[v("span",{class:"DocSearch-Button-Key",ref_key:"metaKey",ref:n},"Meta",512),Zu])])])])}}});const tf={},nf={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",height:"24px",viewBox:"0 0 24 24",width:"24px"},sf=v("path",{d:"M0 0h24v24H0V0z",fill:"none"},null,-1),of=v("path",{d:"M9 5v2h6.59L4 18.59 5.41 20 17 8.41V15h2V5H9z"},null,-1),rf=[sf,of];function lf(e,t){return _(),x("svg",nf,rf)}const cf=B(tf,[["render",lf]]),af=R({__name:"VPLink",props:{href:null,noIcon:{type:Boolean}},setup(e){const t=e,n=le(()=>t.href&&gs.test(t.href));return(s,o)=>(_(),te(_o(e.href?"a":"span"),{class:_e(["VPLink",{link:e.href}]),href:e.href?m(Yn)(e.href):void 0,target:m(n)?"_blank":void 0,rel:m(n)?"noreferrer":void 0},{default:F(()=>[I(s.$slots,"default",{},void 0,!0),m(n)&&!e.noIcon?(_(),te(cf,{key:0,class:"icon"})):q("",!0)]),_:3},8,["class","href","target","rel"]))}});const Mt=B(af,[["__scopeId","data-v-3c355974"]]),uf=R({__name:"VPNavBarMenuLink",props:{item:null},setup(e){const{page:t}=ue();return(n,s)=>(_(),te(Mt,{class:_e({VPNavBarMenuLink:!0,active:m(Xt)(m(t).relativePath,e.item.activeMatch||e.item.link,!!e.item.activeMatch)}),href:e.item.link,noIcon:!0},{default:F(()=>[Ee(ae(e.item.text),1)]),_:1},8,["class","href"]))}});const ff=B(uf,[["__scopeId","data-v-47a2263e"]]),yo=re();let Hr=!1,Ls=0;function df(e){const t=re(!1);if(typeof window<"u"){!Hr&&hf(),Ls++;const n=tt(yo,s=>{var o,i,r;s===e.el.value||((o=e.el.value)==null?void 0:o.contains(s))?(t.value=!0,(i=e.onFocus)==null||i.call(e)):(t.value=!1,(r=e.onBlur)==null||r.call(e))});Qt(()=>{n(),Ls--,Ls||_f()})}return io(t)}function hf(){document.addEventListener("focusin",Dr),Hr=!0,yo.value=document.activeElement}function _f(){document.removeEventListener("focusin",Dr)}function Dr(){yo.value=document.activeElement}const pf={},gf={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},mf=v("path",{d:"M12,16c-0.3,0-0.5-0.1-0.7-0.3l-6-6c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l5.3,5.3l5.3-5.3c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-6,6C12.5,15.9,12.3,16,12,16z"},null,-1),vf=[mf];function yf(e,t){return _(),x("svg",gf,vf)}const Rr=B(pf,[["render",yf]]),bf={},xf={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},wf=v("circle",{cx:"12",cy:"12",r:"2"},null,-1),kf=v("circle",{cx:"19",cy:"12",r:"2"},null,-1),$f=v("circle",{cx:"5",cy:"12",r:"2"},null,-1),Pf=[wf,kf,$f];function Cf(e,t){return _(),x("svg",xf,Pf)}const Sf=B(bf,[["render",Cf]]),Tf={class:"VPMenuLink"},Vf=R({__name:"VPMenuLink",props:{item:null},setup(e){const{page:t}=ue();return(n,s)=>(_(),x("div",Tf,[M(Mt,{class:_e({active:m(Xt)(m(t).relativePath,e.item.activeMatch||e.item.link)}),href:e.item.link},{default:F(()=>[Ee(ae(e.item.text),1)]),_:1},8,["class","href"])]))}});const ms=B(Vf,[["__scopeId","data-v-e8e0fb1d"]]),Ef={class:"VPMenuGroup"},Lf={key:0,class:"title"},Mf=R({__name:"VPMenuGroup",props:{text:null,items:null},setup(e){return(t,n)=>(_(),x("div",Ef,[e.text?(_(),x("p",Lf,ae(e.text),1)):q("",!0),(_(!0),x(ee,null,ke(e.items,s=>(_(),x(ee,null,["link"in s?(_(),te(ms,{key:0,item:s},null,8,["item"])):q("",!0)],64))),256))]))}});const Af=B(Mf,[["__scopeId","data-v-9ca52130"]]),If={class:"VPMenu"},Nf={key:0,class:"items"},Of=R({__name:"VPMenu",props:{items:null},setup(e){return(t,n)=>(_(),x("div",If,[e.items?(_(),x("div",Nf,[(_(!0),x(ee,null,ke(e.items,s=>(_(),x(ee,{key:s.text},["link"in s?(_(),te(ms,{key:0,item:s},null,8,["item"])):(_(),te(Af,{key:1,text:s.text,items:s.items},null,8,["text","items"]))],64))),128))])):q("",!0),I(t.$slots,"default",{},void 0,!0)]))}});const Ff=B(Of,[["__scopeId","data-v-1c5d0cfc"]]),Bf=["aria-expanded","aria-label"],Hf={key:0,class:"text"},Df={class:"menu"},Rf=R({__name:"VPFlyout",props:{icon:null,button:null,label:null,items:null},setup(e){const t=re(!1),n=re();df({el:n,onBlur:s});function s(){t.value=!1}return(o,i)=>(_(),x("div",{class:"VPFlyout",ref_key:"el",ref:n,onMouseenter:i[1]||(i[1]=r=>t.value=!0),onMouseleave:i[2]||(i[2]=r=>t.value=!1)},[v("button",{type:"button",class:"button","aria-haspopup":"true","aria-expanded":t.value,"aria-label":e.label,onClick:i[0]||(i[0]=r=>t.value=!t.value)},[e.button||e.icon?(_(),x("span",Hf,[e.icon?(_(),te(_o(e.icon),{key:0,class:"option-icon"})):q("",!0),Ee(" "+ae(e.button)+" ",1),M(Rr,{class:"text-icon"})])):(_(),te(Sf,{key:1,class:"icon"}))],8,Bf),v("div",Df,[M(Ff,{items:e.items},{default:F(()=>[I(o.$slots,"default",{},void 0,!0)]),_:3},8,["items"])])],544))}});const bo=B(Rf,[["__scopeId","data-v-6ffb57d3"]]),zf=R({__name:"VPNavBarMenuGroup",props:{item:null},setup(e){const{page:t}=ue();return(n,s)=>(_(),te(bo,{class:_e({VPNavBarMenuGroup:!0,active:m(Xt)(m(t).relativePath,e.item.activeMatch,!!e.item.activeMatch)}),button:e.item.text,items:e.item.items},null,8,["class","button","items"]))}}),jf=e=>(Ye("data-v-f83db6ba"),e=e(),Ge(),e),Uf={key:0,"aria-labelledby":"main-nav-aria-label",class:"VPNavBarMenu"},Kf=jf(()=>v("span",{id:"main-nav-aria-label",class:"visually-hidden"},"Main Navigation",-1)),qf=R({__name:"VPNavBarMenu",setup(e){const{theme:t}=ue();return(n,s)=>m(t).nav?(_(),x("nav",Uf,[Kf,(_(!0),x(ee,null,ke(m(t).nav,o=>(_(),x(ee,{key:o.text},["link"in o?(_(),te(ff,{key:0,item:o},null,8,["item"])):(_(),te(zf,{key:1,item:o},null,8,["item"]))],64))),128))])):q("",!0)}});const Wf=B(qf,[["__scopeId","data-v-f83db6ba"]]),Yf={},Gf={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Jf=v("path",{d:"M0 0h24v24H0z",fill:"none"},null,-1),Qf=v("path",{d:" M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z ",class:"css-c4d79v"},null,-1),Xf=[Jf,Qf];function Zf(e,t){return _(),x("svg",Gf,Xf)}const zr=B(Yf,[["render",Zf]]),ed={class:"items"},td={class:"title"},nd=R({__name:"VPNavBarTranslations",setup(e){const{theme:t}=ue();return(n,s)=>m(t).localeLinks?(_(),te(bo,{key:0,class:"VPNavBarTranslations",icon:zr},{default:F(()=>[v("div",ed,[v("p",td,ae(m(t).localeLinks.text),1),(_(!0),x(ee,null,ke(m(t).localeLinks.items,o=>(_(),te(ms,{key:o.link,item:o},null,8,["item"]))),128))])]),_:1})):q("",!0)}});const sd=B(nd,[["__scopeId","data-v-db824e91"]]);const od={},id={class:"VPSwitch",type:"button",role:"switch"},rd={class:"check"},ld={key:0,class:"icon"};function cd(e,t){return _(),x("button",id,[v("span",rd,[e.$slots.default?(_(),x("span",ld,[I(e.$slots,"default",{},void 0,!0)])):q("",!0)])])}const ad=B(od,[["render",cd],["__scopeId","data-v-eba7420e"]]),ud={},fd={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},dd=Hc('',9),hd=[dd];function _d(e,t){return _(),x("svg",fd,hd)}const pd=B(ud,[["render",_d]]),gd={},md={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},vd=v("path",{d:"M12.1,22c-0.3,0-0.6,0-0.9,0c-5.5-0.5-9.5-5.4-9-10.9c0.4-4.8,4.2-8.6,9-9c0.4,0,0.8,0.2,1,0.5c0.2,0.3,0.2,0.8-0.1,1.1c-2,2.7-1.4,6.4,1.3,8.4c2.1,1.6,5,1.6,7.1,0c0.3-0.2,0.7-0.3,1.1-0.1c0.3,0.2,0.5,0.6,0.5,1c-0.2,2.7-1.5,5.1-3.6,6.8C16.6,21.2,14.4,22,12.1,22zM9.3,4.4c-2.9,1-5,3.6-5.2,6.8c-0.4,4.4,2.8,8.3,7.2,8.7c2.1,0.2,4.2-0.4,5.8-1.8c1.1-0.9,1.9-2.1,2.4-3.4c-2.5,0.9-5.3,0.5-7.5-1.1C9.2,11.4,8.1,7.7,9.3,4.4z"},null,-1),yd=[vd];function bd(e,t){return _(),x("svg",md,yd)}const xd=B(gd,[["render",bd]]),wd=R({__name:"VPSwitchAppearance",setup(e){const{site:t,isDark:n}=ue(),s=re(!1),o=typeof localStorage<"u"?i():()=>{};Je(()=>{s.value=document.documentElement.classList.contains("dark")});function i(){const r=window.matchMedia("(prefers-color-scheme: dark)"),l=document.documentElement.classList;let c=localStorage.getItem(_i),a=t.value.appearance==="dark"&&c==null||(c==="auto"||c==null?r.matches:c==="dark");r.onchange=p=>{c==="auto"&&h(a=p.matches)};function f(){h(a=!a),c=a?r.matches?"auto":"dark":r.matches?"light":"auto",localStorage.setItem(_i,c)}function h(p){const g=document.createElement("style");g.type="text/css",g.appendChild(document.createTextNode(`:not(.VPSwitchAppearance):not(.VPSwitchAppearance *) { +function Gs(e,t){const n=Object.create(null),s=e.split(",");for(let o=0;o!!n[o.toLowerCase()]:o=>!!n[o]}function es(e){if(J(e)){const t={};for(let n=0;n{if(n){const s=n.split(Xr);s.length>1&&(t[s[0].trim()]=s[1].trim())}}),t}function _e(e){let t="";if(be(e))t=e;else if(J(e))for(let n=0;nbe(e)?e:e==null?"":J(e)||ve(e)&&(e.toString===Fi||!ne(e.toString))?JSON.stringify(e,Ii,2):String(e),Ii=(e,t)=>t&&t.__v_isRef?Ii(e,t.value):Ft(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[s,o])=>(n[`${s} =>`]=o,n),{})}:Ni(t)?{[`Set(${t.size})`]:[...t.values()]}:ve(t)&&!J(t)&&!Bi(t)?String(t):t,me={},Ot=[],qe=()=>{},sl=()=>!1,ol=/^on[^a-z]/,xn=e=>ol.test(e),Js=e=>e.startsWith("onUpdate:"),Pe=Object.assign,Qs=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},il=Object.prototype.hasOwnProperty,ce=(e,t)=>il.call(e,t),J=Array.isArray,Ft=e=>ts(e)==="[object Map]",Ni=e=>ts(e)==="[object Set]",ne=e=>typeof e=="function",be=e=>typeof e=="string",Xs=e=>typeof e=="symbol",ve=e=>e!==null&&typeof e=="object",Oi=e=>ve(e)&&ne(e.then)&&ne(e.catch),Fi=Object.prototype.toString,ts=e=>Fi.call(e),rl=e=>ts(e).slice(8,-1),Bi=e=>ts(e)==="[object Object]",Zs=e=>be(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,on=Gs(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),ns=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},ll=/-(\w)/g,nt=ns(e=>e.replace(ll,(t,n)=>n?n.toUpperCase():"")),cl=/\B([A-Z])/g,Yt=ns(e=>e.replace(cl,"-$1").toLowerCase()),ss=ns(e=>e.charAt(0).toUpperCase()+e.slice(1)),xs=ns(e=>e?`on${ss(e)}`:""),hn=(e,t)=>!Object.is(e,t),On=(e,t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value:n})},_n=e=>{const t=parseFloat(e);return isNaN(t)?e:t};let Eo;const al=()=>Eo||(Eo=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});let Oe;class ul{constructor(t=!1){this.detached=t,this.active=!0,this.effects=[],this.cleanups=[],this.parent=Oe,!t&&Oe&&(this.index=(Oe.scopes||(Oe.scopes=[])).push(this)-1)}run(t){if(this.active){const n=Oe;try{return Oe=this,t()}finally{Oe=n}}}on(){Oe=this}off(){Oe=this.parent}stop(t){if(this.active){let n,s;for(n=0,s=this.effects.length;n{const t=new Set(e);return t.w=0,t.n=0,t},Hi=e=>(e.w&pt)>0,Di=e=>(e.n&pt)>0,_l=({deps:e})=>{if(e.length)for(let t=0;t{const{deps:t}=e;if(t.length){let n=0;for(let s=0;s{(f==="length"||f>=c)&&l.push(a)})}else switch(n!==void 0&&l.push(r.get(n)),t){case"add":J(e)?Zs(n)&&l.push(r.get("length")):(l.push(r.get(Et)),Ft(e)&&l.push(r.get(Ns)));break;case"delete":J(e)||(l.push(r.get(Et)),Ft(e)&&l.push(r.get(Ns)));break;case"set":Ft(e)&&l.push(r.get(Et));break}if(l.length===1)l[0]&&Os(l[0]);else{const c=[];for(const a of l)a&&c.push(...a);Os(eo(c))}}function Os(e,t){const n=J(e)?e:[...e];for(const s of n)s.computed&&Mo(s);for(const s of n)s.computed||Mo(s)}function Mo(e,t){(e!==Ue||e.allowRecurse)&&(e.scheduler?e.scheduler():e.run())}const gl=Gs("__proto__,__v_isRef,__isVue"),ji=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(Xs)),ml=no(),vl=no(!1,!0),yl=no(!0),Ao=bl();function bl(){const e={};return["includes","indexOf","lastIndexOf"].forEach(t=>{e[t]=function(...n){const s=fe(this);for(let i=0,r=this.length;i{e[t]=function(...n){Gt();const s=fe(this)[t].apply(this,n);return Jt(),s}}),e}function no(e=!1,t=!1){return function(s,o,i){if(o==="__v_isReactive")return!e;if(o==="__v_isReadonly")return e;if(o==="__v_isShallow")return t;if(o==="__v_raw"&&i===(e?t?Ol:Yi:t?Wi:qi).get(s))return s;const r=J(s);if(!e&&r&&ce(Ao,o))return Reflect.get(Ao,o,i);const l=Reflect.get(s,o,i);return(Xs(o)?ji.has(o):gl(o))||(e||Be(s,"get",o),t)?l:Se(l)?r&&Zs(o)?l:l.value:ve(l)?e?io(l):is(l):l}}const xl=Ui(),wl=Ui(!0);function Ui(e=!1){return function(n,s,o,i){let r=n[s];if(jt(r)&&Se(r)&&!Se(o))return!1;if(!e&&(!Rn(o)&&!jt(o)&&(r=fe(r),o=fe(o)),!J(n)&&Se(r)&&!Se(o)))return r.value=o,!0;const l=J(n)&&Zs(s)?Number(s)e,os=e=>Reflect.getPrototypeOf(e);function Pn(e,t,n=!1,s=!1){e=e.__v_raw;const o=fe(e),i=fe(t);n||(t!==i&&Be(o,"get",t),Be(o,"get",i));const{has:r}=os(o),l=s?so:n?lo:pn;if(r.call(o,t))return l(e.get(t));if(r.call(o,i))return l(e.get(i));e!==o&&e.get(t)}function Cn(e,t=!1){const n=this.__v_raw,s=fe(n),o=fe(e);return t||(e!==o&&Be(s,"has",e),Be(s,"has",o)),e===o?n.has(e):n.has(e)||n.has(o)}function Sn(e,t=!1){return e=e.__v_raw,!t&&Be(fe(e),"iterate",Et),Reflect.get(e,"size",e)}function Io(e){e=fe(e);const t=fe(this);return os(t).has.call(t,e)||(t.add(e),rt(t,"add",e,e)),this}function No(e,t){t=fe(t);const n=fe(this),{has:s,get:o}=os(n);let i=s.call(n,e);i||(e=fe(e),i=s.call(n,e));const r=o.call(n,e);return n.set(e,t),i?hn(t,r)&&rt(n,"set",e,t):rt(n,"add",e,t),this}function Oo(e){const t=fe(this),{has:n,get:s}=os(t);let o=n.call(t,e);o||(e=fe(e),o=n.call(t,e)),s&&s.call(t,e);const i=t.delete(e);return o&&rt(t,"delete",e,void 0),i}function Fo(){const e=fe(this),t=e.size!==0,n=e.clear();return t&&rt(e,"clear",void 0,void 0),n}function Tn(e,t){return function(s,o){const i=this,r=i.__v_raw,l=fe(r),c=t?so:e?lo:pn;return!e&&Be(l,"iterate",Et),r.forEach((a,f)=>s.call(o,c(a),c(f),i))}}function Vn(e,t,n){return function(...s){const o=this.__v_raw,i=fe(o),r=Ft(i),l=e==="entries"||e===Symbol.iterator&&r,c=e==="keys"&&r,a=o[e](...s),f=n?so:t?lo:pn;return!t&&Be(i,"iterate",c?Ns:Et),{next(){const{value:h,done:p}=a.next();return p?{value:h,done:p}:{value:l?[f(h[0]),f(h[1])]:f(h),done:p}},[Symbol.iterator](){return this}}}}function ct(e){return function(...t){return e==="delete"?!1:this}}function Tl(){const e={get(i){return Pn(this,i)},get size(){return Sn(this)},has:Cn,add:Io,set:No,delete:Oo,clear:Fo,forEach:Tn(!1,!1)},t={get(i){return Pn(this,i,!1,!0)},get size(){return Sn(this)},has:Cn,add:Io,set:No,delete:Oo,clear:Fo,forEach:Tn(!1,!0)},n={get(i){return Pn(this,i,!0)},get size(){return Sn(this,!0)},has(i){return Cn.call(this,i,!0)},add:ct("add"),set:ct("set"),delete:ct("delete"),clear:ct("clear"),forEach:Tn(!0,!1)},s={get(i){return Pn(this,i,!0,!0)},get size(){return Sn(this,!0)},has(i){return Cn.call(this,i,!0)},add:ct("add"),set:ct("set"),delete:ct("delete"),clear:ct("clear"),forEach:Tn(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach(i=>{e[i]=Vn(i,!1,!1),n[i]=Vn(i,!0,!1),t[i]=Vn(i,!1,!0),s[i]=Vn(i,!0,!0)}),[e,n,t,s]}const[Vl,El,Ll,Ml]=Tl();function oo(e,t){const n=t?e?Ml:Ll:e?El:Vl;return(s,o,i)=>o==="__v_isReactive"?!e:o==="__v_isReadonly"?e:o==="__v_raw"?s:Reflect.get(ce(n,o)&&o in s?n:s,o,i)}const Al={get:oo(!1,!1)},Il={get:oo(!1,!0)},Nl={get:oo(!0,!1)},qi=new WeakMap,Wi=new WeakMap,Yi=new WeakMap,Ol=new WeakMap;function Fl(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function Bl(e){return e.__v_skip||!Object.isExtensible(e)?0:Fl(rl(e))}function is(e){return jt(e)?e:ro(e,!1,Ki,Al,qi)}function Hl(e){return ro(e,!1,Sl,Il,Wi)}function io(e){return ro(e,!0,Cl,Nl,Yi)}function ro(e,t,n,s,o){if(!ve(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const i=o.get(e);if(i)return i;const r=Bl(e);if(r===0)return e;const l=new Proxy(e,r===2?s:n);return o.set(e,l),l}function Bt(e){return jt(e)?Bt(e.__v_raw):!!(e&&e.__v_isReactive)}function jt(e){return!!(e&&e.__v_isReadonly)}function Rn(e){return!!(e&&e.__v_isShallow)}function Gi(e){return Bt(e)||jt(e)}function fe(e){const t=e&&e.__v_raw;return t?fe(t):e}function rn(e){return Dn(e,"__v_skip",!0),e}const pn=e=>ve(e)?is(e):e,lo=e=>ve(e)?io(e):e;function Ji(e){ht&&Ue&&(e=fe(e),zi(e.dep||(e.dep=eo())))}function Qi(e,t){e=fe(e),e.dep&&Os(e.dep)}function Se(e){return!!(e&&e.__v_isRef===!0)}function re(e){return Xi(e,!1)}function Dl(e){return Xi(e,!0)}function Xi(e,t){return Se(e)?e:new Rl(e,t)}class Rl{constructor(t,n){this.__v_isShallow=n,this.dep=void 0,this.__v_isRef=!0,this._rawValue=n?t:fe(t),this._value=n?t:pn(t)}get value(){return Ji(this),this._value}set value(t){const n=this.__v_isShallow||Rn(t)||jt(t);t=n?t:fe(t),hn(t,this._rawValue)&&(this._rawValue=t,this._value=n?t:pn(t),Qi(this))}}function m(e){return Se(e)?e.value:e}const zl={get:(e,t,n)=>m(Reflect.get(e,t,n)),set:(e,t,n,s)=>{const o=e[t];return Se(o)&&!Se(n)?(o.value=n,!0):Reflect.set(e,t,n,s)}};function Zi(e){return Bt(e)?e:new Proxy(e,zl)}var er;class jl{constructor(t,n,s,o){this._setter=n,this.dep=void 0,this.__v_isRef=!0,this[er]=!1,this._dirty=!0,this.effect=new to(t,()=>{this._dirty||(this._dirty=!0,Qi(this))}),this.effect.computed=this,this.effect.active=this._cacheable=!o,this.__v_isReadonly=s}get value(){const t=fe(this);return Ji(t),(t._dirty||!t._cacheable)&&(t._dirty=!1,t._value=t.effect.run()),t._value}set value(t){this._setter(t)}}er="__v_isReadonly";function Ul(e,t,n=!1){let s,o;const i=ne(e);return i?(s=e,o=qe):(s=e.get,o=e.set),new jl(s,o,i||!o,n)}function _t(e,t,n,s){let o;try{o=s?e(...s):e()}catch(i){rs(i,t,n)}return o}function Re(e,t,n,s){if(ne(e)){const i=_t(e,t,n,s);return i&&Oi(i)&&i.catch(r=>{rs(r,t,n)}),i}const o=[];for(let i=0;i>>1;mn(Ce[s])et&&Ce.splice(t,1)}function Yl(e){J(e)?Ht.push(...e):(!it||!it.includes(e,e.allowRecurse?Pt+1:Pt))&&Ht.push(e),nr()}function Bo(e,t=gn?et+1:0){for(;tmn(n)-mn(s)),Pt=0;Pte.id==null?1/0:e.id,Gl=(e,t)=>{const n=mn(e)-mn(t);if(n===0){if(e.pre&&!t.pre)return-1;if(t.pre&&!e.pre)return 1}return n};function sr(e){Fs=!1,gn=!0,Ce.sort(Gl);const t=qe;try{for(et=0;etbe(g)?g.trim():g)),h&&(o=n.map(_n))}let l,c=s[l=xs(t)]||s[l=xs(nt(t))];!c&&i&&(c=s[l=xs(Yt(t))]),c&&Re(c,e,6,o);const a=s[l+"Once"];if(a){if(!e.emitted)e.emitted={};else if(e.emitted[l])return;e.emitted[l]=!0,Re(a,e,6,o)}}function or(e,t,n=!1){const s=t.emitsCache,o=s.get(e);if(o!==void 0)return o;const i=e.emits;let r={},l=!1;if(!ne(e)){const c=a=>{const f=or(a,t,!0);f&&(l=!0,Pe(r,f))};!n&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}return!i&&!l?(ve(e)&&s.set(e,null),null):(J(i)?i.forEach(c=>r[c]=null):Pe(r,i),ve(e)&&s.set(e,r),r)}function ls(e,t){return!e||!xn(t)?!1:(t=t.slice(2).replace(/Once$/,""),ce(e,t[0].toLowerCase()+t.slice(1))||ce(e,Yt(t))||ce(e,t))}let $e=null,cs=null;function jn(e){const t=$e;return $e=e,cs=e&&e.type.__scopeId||null,t}function Ye(e){cs=e}function Ge(){cs=null}function F(e,t=$e,n){if(!t||e._n)return e;const s=(...o)=>{s._d&&Jo(-1);const i=jn(t);let r;try{r=e(...o)}finally{jn(i),s._d&&Jo(1)}return r};return s._n=!0,s._c=!0,s._d=!0,s}function ws(e){const{type:t,vnode:n,proxy:s,withProxy:o,props:i,propsOptions:[r],slots:l,attrs:c,emit:a,render:f,renderCache:h,data:p,setupState:g,ctx:C,inheritAttrs:L}=e;let W,y;const w=jn(e);try{if(n.shapeFlag&4){const N=o||s;W=je(f.call(N,N,h,i,g,p,C)),y=c}else{const N=t;W=je(N.length>1?N(i,{attrs:c,slots:l,emit:a}):N(i,null)),y=t.props?c:Ql(c)}}catch(N){un.length=0,rs(N,e,1),W=M(Fe)}let S=W;if(y&&L!==!1){const N=Object.keys(y),{shapeFlag:z}=S;N.length&&z&7&&(r&&N.some(Js)&&(y=Xl(y,r)),S=gt(S,y))}return n.dirs&&(S=gt(S),S.dirs=S.dirs?S.dirs.concat(n.dirs):n.dirs),n.transition&&(S.transition=n.transition),W=S,jn(w),W}const Ql=e=>{let t;for(const n in e)(n==="class"||n==="style"||xn(n))&&((t||(t={}))[n]=e[n]);return t},Xl=(e,t)=>{const n={};for(const s in e)(!Js(s)||!(s.slice(9)in t))&&(n[s]=e[s]);return n};function Zl(e,t,n){const{props:s,children:o,component:i}=e,{props:r,children:l,patchFlag:c}=t,a=i.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&c>=0){if(c&1024)return!0;if(c&16)return s?Ho(s,r,a):!!r;if(c&8){const f=t.dynamicProps;for(let h=0;he.__isSuspense;function ir(e,t){t&&t.pendingBranch?J(e)?t.effects.push(...e):t.effects.push(e):Yl(e)}function as(e,t){if(we){let n=we.provides;const s=we.parent&&we.parent.provides;s===n&&(n=we.provides=Object.create(s)),n[e]=t}}function We(e,t,n=!1){const s=we||$e;if(s){const o=s.parent==null?s.vnode.appContext&&s.vnode.appContext.provides:s.parent.provides;if(o&&e in o)return o[e];if(arguments.length>1)return n&&ne(t)?t.call(s.proxy):t}}function Ut(e,t){return us(e,null,t)}function nc(e,t){return us(e,null,{flush:"post"})}const En={};function tt(e,t,n){return us(e,t,n)}function us(e,t,{immediate:n,deep:s,flush:o,onTrack:i,onTrigger:r}=me){const l=we;let c,a=!1,f=!1;if(Se(e)?(c=()=>e.value,a=Rn(e)):Bt(e)?(c=()=>e,s=!0):J(e)?(f=!0,a=e.some(S=>Bt(S)||Rn(S)),c=()=>e.map(S=>{if(Se(S))return S.value;if(Bt(S))return Vt(S);if(ne(S))return _t(S,l,2)})):ne(e)?t?c=()=>_t(e,l,2):c=()=>{if(!(l&&l.isUnmounted))return h&&h(),Re(e,l,3,[p])}:c=qe,t&&s){const S=c;c=()=>Vt(S())}let h,p=S=>{h=y.onStop=()=>{_t(S,l,4)}},g;if(yn)if(p=qe,t?n&&Re(t,l,3,[c(),f?[]:void 0,p]):c(),o==="sync"){const S=Jc();g=S.__watcherHandles||(S.__watcherHandles=[])}else return qe;let C=f?new Array(e.length).fill(En):En;const L=()=>{if(!!y.active)if(t){const S=y.run();(s||a||(f?S.some((N,z)=>hn(N,C[z])):hn(S,C)))&&(h&&h(),Re(t,l,3,[S,C===En?void 0:f&&C[0]===En?[]:C,p]),C=S)}else y.run()};L.allowRecurse=!!t;let W;o==="sync"?W=L:o==="post"?W=()=>Le(L,l&&l.suspense):(L.pre=!0,l&&(L.id=l.uid),W=()=>uo(L));const y=new to(c,W);t?n?L():C=y.run():o==="post"?Le(y.run.bind(y),l&&l.suspense):y.run();const w=()=>{y.stop(),l&&l.scope&&Qs(l.scope.effects,y)};return g&&g.push(w),w}function sc(e,t,n){const s=this.proxy,o=be(e)?e.includes(".")?rr(s,e):()=>s[e]:e.bind(s,s);let i;ne(t)?i=t:(i=t.handler,n=t);const r=we;qt(this);const l=us(o,i.bind(s),n);return r?qt(r):Lt(),l}function rr(e,t){const n=t.split(".");return()=>{let s=e;for(let o=0;o{Vt(n,t)});else if(Bi(e))for(const n in e)Vt(e[n],t);return e}function oc(){const e={isMounted:!1,isLeaving:!1,isUnmounting:!1,leavingVNodes:new Map};return Je(()=>{e.isMounted=!0}),fr(()=>{e.isUnmounting=!0}),e}const He=[Function,Array],ic={name:"BaseTransition",props:{mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:He,onEnter:He,onAfterEnter:He,onEnterCancelled:He,onBeforeLeave:He,onLeave:He,onAfterLeave:He,onLeaveCancelled:He,onBeforeAppear:He,onAppear:He,onAfterAppear:He,onAppearCancelled:He},setup(e,{slots:t}){const n=Pr(),s=oc();let o;return()=>{const i=t.default&&ar(t.default(),!0);if(!i||!i.length)return;let r=i[0];if(i.length>1){for(const L of i)if(L.type!==Fe){r=L;break}}const l=fe(e),{mode:c}=l;if(s.isLeaving)return ks(r);const a=Do(r);if(!a)return ks(r);const f=Bs(a,l,s,n);Hs(a,f);const h=n.subTree,p=h&&Do(h);let g=!1;const{getTransitionKey:C}=a.type;if(C){const L=C();o===void 0?o=L:L!==o&&(o=L,g=!0)}if(p&&p.type!==Fe&&(!Ct(a,p)||g)){const L=Bs(p,l,s,n);if(Hs(p,L),c==="out-in")return s.isLeaving=!0,L.afterLeave=()=>{s.isLeaving=!1,n.update.active!==!1&&n.update()},ks(r);c==="in-out"&&a.type!==Fe&&(L.delayLeave=(W,y,w)=>{const S=cr(s,p);S[String(p.key)]=p,W._leaveCb=()=>{y(),W._leaveCb=void 0,delete f.delayedLeave},f.delayedLeave=w})}return r}}},lr=ic;function cr(e,t){const{leavingVNodes:n}=e;let s=n.get(t.type);return s||(s=Object.create(null),n.set(t.type,s)),s}function Bs(e,t,n,s){const{appear:o,mode:i,persisted:r=!1,onBeforeEnter:l,onEnter:c,onAfterEnter:a,onEnterCancelled:f,onBeforeLeave:h,onLeave:p,onAfterLeave:g,onLeaveCancelled:C,onBeforeAppear:L,onAppear:W,onAfterAppear:y,onAppearCancelled:w}=t,S=String(e.key),N=cr(n,e),z=(E,G)=>{E&&Re(E,s,9,G)},Y=(E,G)=>{const Q=G[1];z(E,G),J(E)?E.every(se=>se.length<=1)&&Q():E.length<=1&&Q()},X={mode:i,persisted:r,beforeEnter(E){let G=l;if(!n.isMounted)if(o)G=L||l;else return;E._leaveCb&&E._leaveCb(!0);const Q=N[S];Q&&Ct(e,Q)&&Q.el._leaveCb&&Q.el._leaveCb(),z(G,[E])},enter(E){let G=c,Q=a,se=f;if(!n.isMounted)if(o)G=W||c,Q=y||a,se=w||f;else return;let H=!1;const oe=E._enterCb=j=>{H||(H=!0,j?z(se,[E]):z(Q,[E]),X.delayedLeave&&X.delayedLeave(),E._enterCb=void 0)};G?Y(G,[E,oe]):oe()},leave(E,G){const Q=String(e.key);if(E._enterCb&&E._enterCb(!0),n.isUnmounting)return G();z(h,[E]);let se=!1;const H=E._leaveCb=oe=>{se||(se=!0,G(),oe?z(C,[E]):z(g,[E]),E._leaveCb=void 0,N[Q]===e&&delete N[Q])};N[Q]=e,p?Y(p,[E,H]):H()},clone(E){return Bs(E,t,n,s)}};return X}function ks(e){if(fs(e))return e=gt(e),e.children=null,e}function Do(e){return fs(e)?e.children?e.children[0]:void 0:e}function Hs(e,t){e.shapeFlag&6&&e.component?Hs(e.component.subTree,t):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function ar(e,t=!1,n){let s=[],o=0;for(let i=0;i1)for(let i=0;i!!e.type.__asyncLoader,fs=e=>e.type.__isKeepAlive;function rc(e,t){ur(e,"a",t)}function lc(e,t){ur(e,"da",t)}function ur(e,t,n=we){const s=e.__wdc||(e.__wdc=()=>{let o=n;for(;o;){if(o.isDeactivated)return;o=o.parent}return e()});if(ds(t,s,n),n){let o=n.parent;for(;o&&o.parent;)fs(o.parent.vnode)&&cc(s,t,n,o),o=o.parent}}function cc(e,t,n,s){const o=ds(t,e,s,!0);Qt(()=>{Qs(s[t],o)},n)}function ds(e,t,n=we,s=!1){if(n){const o=n[e]||(n[e]=[]),i=t.__weh||(t.__weh=(...r)=>{if(n.isUnmounted)return;Gt(),qt(n);const l=Re(t,n,e,r);return Lt(),Jt(),l});return s?o.unshift(i):o.push(i),i}}const lt=e=>(t,n=we)=>(!yn||e==="sp")&&ds(e,(...s)=>t(...s),n),ac=lt("bm"),Je=lt("m"),uc=lt("bu"),fo=lt("u"),fr=lt("bum"),Qt=lt("um"),fc=lt("sp"),dc=lt("rtg"),hc=lt("rtc");function _c(e,t=we){ds("ec",e,t)}function Ro(e,t){const n=$e;if(n===null)return e;const s=_s(n)||n.proxy,o=e.dirs||(e.dirs=[]);for(let i=0;it(r,l,void 0,i&&i[l]));else{const r=Object.keys(e);o=new Array(r.length);for(let l=0,c=r.length;lqn(t)?!(t.type===Fe||t.type===ee&&!_r(t.children)):!0)?e:null}const Ds=e=>e?Cr(e)?_s(e)||e.proxy:Ds(e.parent):null,ln=Pe(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>Ds(e.parent),$root:e=>Ds(e.root),$emit:e=>e.emit,$options:e=>po(e),$forceUpdate:e=>e.f||(e.f=()=>uo(e.update)),$nextTick:e=>e.n||(e.n=ao.bind(e.proxy)),$watch:e=>sc.bind(e)}),$s=(e,t)=>e!==me&&!e.__isScriptSetup&&ce(e,t),pc={get({_:e},t){const{ctx:n,setupState:s,data:o,props:i,accessCache:r,type:l,appContext:c}=e;let a;if(t[0]!=="$"){const g=r[t];if(g!==void 0)switch(g){case 1:return s[t];case 2:return o[t];case 4:return n[t];case 3:return i[t]}else{if($s(s,t))return r[t]=1,s[t];if(o!==me&&ce(o,t))return r[t]=2,o[t];if((a=e.propsOptions[0])&&ce(a,t))return r[t]=3,i[t];if(n!==me&&ce(n,t))return r[t]=4,n[t];Rs&&(r[t]=0)}}const f=ln[t];let h,p;if(f)return t==="$attrs"&&Be(e,"get",t),f(e);if((h=l.__cssModules)&&(h=h[t]))return h;if(n!==me&&ce(n,t))return r[t]=4,n[t];if(p=c.config.globalProperties,ce(p,t))return p[t]},set({_:e},t,n){const{data:s,setupState:o,ctx:i}=e;return $s(o,t)?(o[t]=n,!0):s!==me&&ce(s,t)?(s[t]=n,!0):ce(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(i[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:s,appContext:o,propsOptions:i}},r){let l;return!!n[r]||e!==me&&ce(e,r)||$s(t,r)||(l=i[0])&&ce(l,r)||ce(s,r)||ce(ln,r)||ce(o.config.globalProperties,r)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:ce(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};let Rs=!0;function gc(e){const t=po(e),n=e.proxy,s=e.ctx;Rs=!1,t.beforeCreate&&jo(t.beforeCreate,e,"bc");const{data:o,computed:i,methods:r,watch:l,provide:c,inject:a,created:f,beforeMount:h,mounted:p,beforeUpdate:g,updated:C,activated:L,deactivated:W,beforeDestroy:y,beforeUnmount:w,destroyed:S,unmounted:N,render:z,renderTracked:Y,renderTriggered:X,errorCaptured:E,serverPrefetch:G,expose:Q,inheritAttrs:se,components:H,directives:oe,filters:j}=t;if(a&&mc(a,s,null,e.appContext.config.unwrapInjectedRef),r)for(const ye in r){const pe=r[ye];ne(pe)&&(s[ye]=pe.bind(n))}if(o){const ye=o.call(n,n);ve(ye)&&(e.data=is(ye))}if(Rs=!0,i)for(const ye in i){const pe=i[ye],yt=ne(pe)?pe.bind(n,n):ne(pe.get)?pe.get.bind(n,n):qe,kn=!ne(pe)&&ne(pe.set)?pe.set.bind(n):qe,bt=le({get:yt,set:kn});Object.defineProperty(s,ye,{enumerable:!0,configurable:!0,get:()=>bt.value,set:Qe=>bt.value=Qe})}if(l)for(const ye in l)pr(l[ye],s,n,ye);if(c){const ye=ne(c)?c.call(n):c;Reflect.ownKeys(ye).forEach(pe=>{as(pe,ye[pe])})}f&&jo(f,e,"c");function de(ye,pe){J(pe)?pe.forEach(yt=>ye(yt.bind(n))):pe&&ye(pe.bind(n))}if(de(ac,h),de(Je,p),de(uc,g),de(fo,C),de(rc,L),de(lc,W),de(_c,E),de(hc,Y),de(dc,X),de(fr,w),de(Qt,N),de(fc,G),J(Q))if(Q.length){const ye=e.exposed||(e.exposed={});Q.forEach(pe=>{Object.defineProperty(ye,pe,{get:()=>n[pe],set:yt=>n[pe]=yt})})}else e.exposed||(e.exposed={});z&&e.render===qe&&(e.render=z),se!=null&&(e.inheritAttrs=se),H&&(e.components=H),oe&&(e.directives=oe)}function mc(e,t,n=qe,s=!1){J(e)&&(e=zs(e));for(const o in e){const i=e[o];let r;ve(i)?"default"in i?r=We(i.from||o,i.default,!0):r=We(i.from||o):r=We(i),Se(r)&&s?Object.defineProperty(t,o,{enumerable:!0,configurable:!0,get:()=>r.value,set:l=>r.value=l}):t[o]=r}}function jo(e,t,n){Re(J(e)?e.map(s=>s.bind(t.proxy)):e.bind(t.proxy),t,n)}function pr(e,t,n,s){const o=s.includes(".")?rr(n,s):()=>n[s];if(be(e)){const i=t[e];ne(i)&&tt(o,i)}else if(ne(e))tt(o,e.bind(n));else if(ve(e))if(J(e))e.forEach(i=>pr(i,t,n,s));else{const i=ne(e.handler)?e.handler.bind(n):t[e.handler];ne(i)&&tt(o,i,e)}}function po(e){const t=e.type,{mixins:n,extends:s}=t,{mixins:o,optionsCache:i,config:{optionMergeStrategies:r}}=e.appContext,l=i.get(t);let c;return l?c=l:!o.length&&!n&&!s?c=t:(c={},o.length&&o.forEach(a=>Un(c,a,r,!0)),Un(c,t,r)),ve(t)&&i.set(t,c),c}function Un(e,t,n,s=!1){const{mixins:o,extends:i}=t;i&&Un(e,i,n,!0),o&&o.forEach(r=>Un(e,r,n,!0));for(const r in t)if(!(s&&r==="expose")){const l=vc[r]||n&&n[r];e[r]=l?l(e[r],t[r]):t[r]}return e}const vc={data:Uo,props:$t,emits:$t,methods:$t,computed:$t,beforeCreate:Te,created:Te,beforeMount:Te,mounted:Te,beforeUpdate:Te,updated:Te,beforeDestroy:Te,beforeUnmount:Te,destroyed:Te,unmounted:Te,activated:Te,deactivated:Te,errorCaptured:Te,serverPrefetch:Te,components:$t,directives:$t,watch:bc,provide:Uo,inject:yc};function Uo(e,t){return t?e?function(){return Pe(ne(e)?e.call(this,this):e,ne(t)?t.call(this,this):t)}:t:e}function yc(e,t){return $t(zs(e),zs(t))}function zs(e){if(J(e)){const t={};for(let n=0;n0)&&!(r&16)){if(r&8){const f=e.vnode.dynamicProps;for(let h=0;h{c=!0;const[p,g]=mr(h,t,!0);Pe(r,p),g&&l.push(...g)};!n&&t.mixins.length&&t.mixins.forEach(f),e.extends&&f(e.extends),e.mixins&&e.mixins.forEach(f)}if(!i&&!c)return ve(e)&&s.set(e,Ot),Ot;if(J(i))for(let f=0;f-1,g[1]=L<0||C-1||ce(g,"default"))&&l.push(h)}}}const a=[r,l];return ve(e)&&s.set(e,a),a}function Ko(e){return e[0]!=="$"}function qo(e){const t=e&&e.toString().match(/^\s*function (\w+)/);return t?t[1]:e===null?"null":""}function Wo(e,t){return qo(e)===qo(t)}function Yo(e,t){return J(t)?t.findIndex(n=>Wo(n,e)):ne(t)&&Wo(t,e)?0:-1}const vr=e=>e[0]==="_"||e==="$stable",go=e=>J(e)?e.map(je):[je(e)],kc=(e,t,n)=>{if(t._n)return t;const s=F((...o)=>go(t(...o)),n);return s._c=!1,s},yr=(e,t,n)=>{const s=e._ctx;for(const o in e){if(vr(o))continue;const i=e[o];if(ne(i))t[o]=kc(o,i,s);else if(i!=null){const r=go(i);t[o]=()=>r}}},br=(e,t)=>{const n=go(t);e.slots.default=()=>n},$c=(e,t)=>{if(e.vnode.shapeFlag&32){const n=t._;n?(e.slots=fe(t),Dn(t,"_",n)):yr(t,e.slots={})}else e.slots={},t&&br(e,t);Dn(e.slots,hs,1)},Pc=(e,t,n)=>{const{vnode:s,slots:o}=e;let i=!0,r=me;if(s.shapeFlag&32){const l=t._;l?n&&l===1?i=!1:(Pe(o,t),!n&&l===1&&delete o._):(i=!t.$stable,yr(t,o)),r=t}else t&&(br(e,t),r={default:1});if(i)for(const l in o)!vr(l)&&!(l in r)&&delete o[l]};function xr(){return{app:null,config:{isNativeTag:sl,performance:!1,globalProperties:{},optionMergeStrategies:{},errorHandler:void 0,warnHandler:void 0,compilerOptions:{}},mixins:[],components:{},directives:{},provides:Object.create(null),optionsCache:new WeakMap,propsCache:new WeakMap,emitsCache:new WeakMap}}let Cc=0;function Sc(e,t){return function(s,o=null){ne(s)||(s=Object.assign({},s)),o!=null&&!ve(o)&&(o=null);const i=xr(),r=new Set;let l=!1;const c=i.app={_uid:Cc++,_component:s,_props:o,_container:null,_context:i,_instance:null,version:Qc,get config(){return i.config},set config(a){},use(a,...f){return r.has(a)||(a&&ne(a.install)?(r.add(a),a.install(c,...f)):ne(a)&&(r.add(a),a(c,...f))),c},mixin(a){return i.mixins.includes(a)||i.mixins.push(a),c},component(a,f){return f?(i.components[a]=f,c):i.components[a]},directive(a,f){return f?(i.directives[a]=f,c):i.directives[a]},mount(a,f,h){if(!l){const p=M(s,o);return p.appContext=i,f&&t?t(p,a):e(p,a,h),l=!0,c._container=a,a.__vue_app__=c,_s(p.component)||p.component.proxy}},unmount(){l&&(e(null,c._container),delete c._container.__vue_app__)},provide(a,f){return i.provides[a]=f,c}};return c}}function Kn(e,t,n,s,o=!1){if(J(e)){e.forEach((p,g)=>Kn(p,t&&(J(t)?t[g]:t),n,s,o));return}if(Dt(s)&&!o)return;const i=s.shapeFlag&4?_s(s.component)||s.component.proxy:s.el,r=o?null:i,{i:l,r:c}=e,a=t&&t.r,f=l.refs===me?l.refs={}:l.refs,h=l.setupState;if(a!=null&&a!==c&&(be(a)?(f[a]=null,ce(h,a)&&(h[a]=null)):Se(a)&&(a.value=null)),ne(c))_t(c,l,12,[r,f]);else{const p=be(c),g=Se(c);if(p||g){const C=()=>{if(e.f){const L=p?ce(h,c)?h[c]:f[c]:c.value;o?J(L)&&Qs(L,i):J(L)?L.includes(i)||L.push(i):p?(f[c]=[i],ce(h,c)&&(h[c]=f[c])):(c.value=[i],e.k&&(f[e.k]=c.value))}else p?(f[c]=r,ce(h,c)&&(h[c]=r)):g&&(c.value=r,e.k&&(f[e.k]=r))};r?(C.id=-1,Le(C,n)):C()}}}let at=!1;const Ln=e=>/svg/.test(e.namespaceURI)&&e.tagName!=="foreignObject",Mn=e=>e.nodeType===8;function Tc(e){const{mt:t,p:n,o:{patchProp:s,createText:o,nextSibling:i,parentNode:r,remove:l,insert:c,createComment:a}}=e,f=(y,w)=>{if(!w.hasChildNodes()){n(null,y,w),zn(),w._vnode=y;return}at=!1,h(w.firstChild,y,null,null,null),zn(),w._vnode=y,at&&console.error("Hydration completed but contains mismatches.")},h=(y,w,S,N,z,Y=!1)=>{const X=Mn(y)&&y.data==="[",E=()=>L(y,w,S,N,z,X),{type:G,ref:Q,shapeFlag:se,patchFlag:H}=w;let oe=y.nodeType;w.el=y,H===-2&&(Y=!1,w.dynamicChildren=null);let j=null;switch(G){case Kt:oe!==3?w.children===""?(c(w.el=o(""),r(y),y),j=y):j=E():(y.data!==w.children&&(at=!0,y.data=w.children),j=i(y));break;case Fe:oe!==8||X?j=E():j=i(y);break;case an:if(X&&(y=i(y),oe=y.nodeType),oe===1||oe===3){j=y;const Ie=!w.children.length;for(let de=0;de{Y=Y||!!w.dynamicChildren;const{type:X,props:E,patchFlag:G,shapeFlag:Q,dirs:se}=w,H=X==="input"&&se||X==="option";if(H||G!==-1){if(se&&Ze(w,null,S,"created"),E)if(H||!Y||G&48)for(const j in E)(H&&j.endsWith("value")||xn(j)&&!on(j))&&s(y,j,null,E[j],!1,void 0,S);else E.onClick&&s(y,"onClick",null,E.onClick,!1,void 0,S);let oe;if((oe=E&&E.onVnodeBeforeMount)&&De(oe,S,w),se&&Ze(w,null,S,"beforeMount"),((oe=E&&E.onVnodeMounted)||se)&&ir(()=>{oe&&De(oe,S,w),se&&Ze(w,null,S,"mounted")},N),Q&16&&!(E&&(E.innerHTML||E.textContent))){let j=g(y.firstChild,w,y,S,N,z,Y);for(;j;){at=!0;const Ie=j;j=j.nextSibling,l(Ie)}}else Q&8&&y.textContent!==w.children&&(at=!0,y.textContent=w.children)}return y.nextSibling},g=(y,w,S,N,z,Y,X)=>{X=X||!!w.dynamicChildren;const E=w.children,G=E.length;for(let Q=0;Q{const{slotScopeIds:X}=w;X&&(z=z?z.concat(X):X);const E=r(y),G=g(i(y),w,E,S,N,z,Y);return G&&Mn(G)&&G.data==="]"?i(w.anchor=G):(at=!0,c(w.anchor=a("]"),E,G),G)},L=(y,w,S,N,z,Y)=>{if(at=!0,w.el=null,Y){const G=W(y);for(;;){const Q=i(y);if(Q&&Q!==G)l(Q);else break}}const X=i(y),E=r(y);return l(y),n(null,w,E,X,S,N,Ln(E),z),X},W=y=>{let w=0;for(;y;)if(y=i(y),y&&Mn(y)&&(y.data==="["&&w++,y.data==="]")){if(w===0)return i(y);w--}return y};return[f,h]}const Le=ir;function Vc(e){return Ec(e,Tc)}function Ec(e,t){const n=al();n.__VUE__=!0;const{insert:s,remove:o,patchProp:i,createElement:r,createText:l,createComment:c,setText:a,setElementText:f,parentNode:h,nextSibling:p,setScopeId:g=qe,insertStaticContent:C}=e,L=(u,d,b,$=null,k=null,V=null,O=!1,T=null,A=!!d.dynamicChildren)=>{if(u===d)return;u&&!Ct(u,d)&&($=$n(u),Qe(u,k,V,!0),u=null),d.patchFlag===-2&&(A=!1,d.dynamicChildren=null);const{type:P,ref:U,shapeFlag:D}=d;switch(P){case Kt:W(u,d,b,$);break;case Fe:y(u,d,b,$);break;case an:u==null&&w(d,b,$,O);break;case ee:H(u,d,b,$,k,V,O,T,A);break;default:D&1?z(u,d,b,$,k,V,O,T,A):D&6?oe(u,d,b,$,k,V,O,T,A):(D&64||D&128)&&P.process(u,d,b,$,k,V,O,T,A,At)}U!=null&&k&&Kn(U,u&&u.ref,V,d||u,!d)},W=(u,d,b,$)=>{if(u==null)s(d.el=l(d.children),b,$);else{const k=d.el=u.el;d.children!==u.children&&a(k,d.children)}},y=(u,d,b,$)=>{u==null?s(d.el=c(d.children||""),b,$):d.el=u.el},w=(u,d,b,$)=>{[u.el,u.anchor]=C(u.children,d,b,$,u.el,u.anchor)},S=({el:u,anchor:d},b,$)=>{let k;for(;u&&u!==d;)k=p(u),s(u,b,$),u=k;s(d,b,$)},N=({el:u,anchor:d})=>{let b;for(;u&&u!==d;)b=p(u),o(u),u=b;o(d)},z=(u,d,b,$,k,V,O,T,A)=>{O=O||d.type==="svg",u==null?Y(d,b,$,k,V,O,T,A):G(u,d,k,V,O,T,A)},Y=(u,d,b,$,k,V,O,T)=>{let A,P;const{type:U,props:D,shapeFlag:K,transition:Z,dirs:ie}=u;if(A=u.el=r(u.type,V,D&&D.is,D),K&8?f(A,u.children):K&16&&E(u.children,A,null,$,k,V&&U!=="foreignObject",O,T),ie&&Ze(u,null,$,"created"),D){for(const he in D)he!=="value"&&!on(he)&&i(A,he,null,D[he],V,u.children,$,k,ot);"value"in D&&i(A,"value",null,D.value),(P=D.onVnodeBeforeMount)&&De(P,$,u)}X(A,u,u.scopeId,O,$),ie&&Ze(u,null,$,"beforeMount");const ge=(!k||k&&!k.pendingBranch)&&Z&&!Z.persisted;ge&&Z.beforeEnter(A),s(A,d,b),((P=D&&D.onVnodeMounted)||ge||ie)&&Le(()=>{P&&De(P,$,u),ge&&Z.enter(A),ie&&Ze(u,null,$,"mounted")},k)},X=(u,d,b,$,k)=>{if(b&&g(u,b),$)for(let V=0;V<$.length;V++)g(u,$[V]);if(k){let V=k.subTree;if(d===V){const O=k.vnode;X(u,O,O.scopeId,O.slotScopeIds,k.parent)}}},E=(u,d,b,$,k,V,O,T,A=0)=>{for(let P=A;P{const T=d.el=u.el;let{patchFlag:A,dynamicChildren:P,dirs:U}=d;A|=u.patchFlag&16;const D=u.props||me,K=d.props||me;let Z;b&&xt(b,!1),(Z=K.onVnodeBeforeUpdate)&&De(Z,b,d,u),U&&Ze(d,u,b,"beforeUpdate"),b&&xt(b,!0);const ie=k&&d.type!=="foreignObject";if(P?Q(u.dynamicChildren,P,T,b,$,ie,V):O||pe(u,d,T,null,b,$,ie,V,!1),A>0){if(A&16)se(T,d,D,K,b,$,k);else if(A&2&&D.class!==K.class&&i(T,"class",null,K.class,k),A&4&&i(T,"style",D.style,K.style,k),A&8){const ge=d.dynamicProps;for(let he=0;he{Z&&De(Z,b,d,u),U&&Ze(d,u,b,"updated")},$)},Q=(u,d,b,$,k,V,O)=>{for(let T=0;T{if(b!==$){if(b!==me)for(const T in b)!on(T)&&!(T in $)&&i(u,T,b[T],null,O,d.children,k,V,ot);for(const T in $){if(on(T))continue;const A=$[T],P=b[T];A!==P&&T!=="value"&&i(u,T,P,A,O,d.children,k,V,ot)}"value"in $&&i(u,"value",b.value,$.value)}},H=(u,d,b,$,k,V,O,T,A)=>{const P=d.el=u?u.el:l(""),U=d.anchor=u?u.anchor:l("");let{patchFlag:D,dynamicChildren:K,slotScopeIds:Z}=d;Z&&(T=T?T.concat(Z):Z),u==null?(s(P,b,$),s(U,b,$),E(d.children,b,U,k,V,O,T,A)):D>0&&D&64&&K&&u.dynamicChildren?(Q(u.dynamicChildren,K,b,k,V,O,T),(d.key!=null||k&&d===k.subTree)&&mo(u,d,!0)):pe(u,d,b,U,k,V,O,T,A)},oe=(u,d,b,$,k,V,O,T,A)=>{d.slotScopeIds=T,u==null?d.shapeFlag&512?k.ctx.activate(d,b,$,O,A):j(d,b,$,k,V,O,A):Ie(u,d,A)},j=(u,d,b,$,k,V,O)=>{const T=u.component=zc(u,$,k);if(fs(u)&&(T.ctx.renderer=At),jc(T),T.asyncDep){if(k&&k.registerDep(T,de),!u.el){const A=T.subTree=M(Fe);y(null,A,d,b)}return}de(T,u,d,b,k,V,O)},Ie=(u,d,b)=>{const $=d.component=u.component;if(Zl(u,d,b))if($.asyncDep&&!$.asyncResolved){ye($,d,b);return}else $.next=d,Wl($.update),$.update();else d.el=u.el,$.vnode=d},de=(u,d,b,$,k,V,O)=>{const T=()=>{if(u.isMounted){let{next:U,bu:D,u:K,parent:Z,vnode:ie}=u,ge=U,he;xt(u,!1),U?(U.el=ie.el,ye(u,U,O)):U=ie,D&&On(D),(he=U.props&&U.props.onVnodeBeforeUpdate)&&De(he,Z,U,ie),xt(u,!0);const xe=ws(u),ze=u.subTree;u.subTree=xe,L(ze,xe,h(ze.el),$n(ze),u,k,V),U.el=xe.el,ge===null&&ec(u,xe.el),K&&Le(K,k),(he=U.props&&U.props.onVnodeUpdated)&&Le(()=>De(he,Z,U,ie),k)}else{let U;const{el:D,props:K}=d,{bm:Z,m:ie,parent:ge}=u,he=Dt(d);if(xt(u,!1),Z&&On(Z),!he&&(U=K&&K.onVnodeBeforeMount)&&De(U,ge,d),xt(u,!0),D&&bs){const xe=()=>{u.subTree=ws(u),bs(D,u.subTree,u,k,null)};he?d.type.__asyncLoader().then(()=>!u.isUnmounted&&xe()):xe()}else{const xe=u.subTree=ws(u);L(null,xe,b,$,u,k,V),d.el=xe.el}if(ie&&Le(ie,k),!he&&(U=K&&K.onVnodeMounted)){const xe=d;Le(()=>De(U,ge,xe),k)}(d.shapeFlag&256||ge&&Dt(ge.vnode)&&ge.vnode.shapeFlag&256)&&u.a&&Le(u.a,k),u.isMounted=!0,d=b=$=null}},A=u.effect=new to(T,()=>uo(P),u.scope),P=u.update=()=>A.run();P.id=u.uid,xt(u,!0),P()},ye=(u,d,b)=>{d.component=u;const $=u.vnode.props;u.vnode=d,u.next=null,wc(u,d.props,$,b),Pc(u,d.children,b),Gt(),Bo(),Jt()},pe=(u,d,b,$,k,V,O,T,A=!1)=>{const P=u&&u.children,U=u?u.shapeFlag:0,D=d.children,{patchFlag:K,shapeFlag:Z}=d;if(K>0){if(K&128){kn(P,D,b,$,k,V,O,T,A);return}else if(K&256){yt(P,D,b,$,k,V,O,T,A);return}}Z&8?(U&16&&ot(P,k,V),D!==P&&f(b,D)):U&16?Z&16?kn(P,D,b,$,k,V,O,T,A):ot(P,k,V,!0):(U&8&&f(b,""),Z&16&&E(D,b,$,k,V,O,T,A))},yt=(u,d,b,$,k,V,O,T,A)=>{u=u||Ot,d=d||Ot;const P=u.length,U=d.length,D=Math.min(P,U);let K;for(K=0;KU?ot(u,k,V,!0,!1,D):E(d,b,$,k,V,O,T,A,D)},kn=(u,d,b,$,k,V,O,T,A)=>{let P=0;const U=d.length;let D=u.length-1,K=U-1;for(;P<=D&&P<=K;){const Z=u[P],ie=d[P]=A?dt(d[P]):je(d[P]);if(Ct(Z,ie))L(Z,ie,b,null,k,V,O,T,A);else break;P++}for(;P<=D&&P<=K;){const Z=u[D],ie=d[K]=A?dt(d[K]):je(d[K]);if(Ct(Z,ie))L(Z,ie,b,null,k,V,O,T,A);else break;D--,K--}if(P>D){if(P<=K){const Z=K+1,ie=ZK)for(;P<=D;)Qe(u[P],k,V,!0),P++;else{const Z=P,ie=P,ge=new Map;for(P=ie;P<=K;P++){const Ne=d[P]=A?dt(d[P]):je(d[P]);Ne.key!=null&&ge.set(Ne.key,P)}let he,xe=0;const ze=K-ie+1;let It=!1,So=0;const Zt=new Array(ze);for(P=0;P=ze){Qe(Ne,k,V,!0);continue}let Xe;if(Ne.key!=null)Xe=ge.get(Ne.key);else for(he=ie;he<=K;he++)if(Zt[he-ie]===0&&Ct(Ne,d[he])){Xe=he;break}Xe===void 0?Qe(Ne,k,V,!0):(Zt[Xe-ie]=P+1,Xe>=So?So=Xe:It=!0,L(Ne,d[Xe],b,null,k,V,O,T,A),xe++)}const To=It?Lc(Zt):Ot;for(he=To.length-1,P=ze-1;P>=0;P--){const Ne=ie+P,Xe=d[Ne],Vo=Ne+1{const{el:V,type:O,transition:T,children:A,shapeFlag:P}=u;if(P&6){bt(u.component.subTree,d,b,$);return}if(P&128){u.suspense.move(d,b,$);return}if(P&64){O.move(u,d,b,At);return}if(O===ee){s(V,d,b);for(let D=0;DT.enter(V),k);else{const{leave:D,delayLeave:K,afterLeave:Z}=T,ie=()=>s(V,d,b),ge=()=>{D(V,()=>{ie(),Z&&Z()})};K?K(V,ie,ge):ge()}else s(V,d,b)},Qe=(u,d,b,$=!1,k=!1)=>{const{type:V,props:O,ref:T,children:A,dynamicChildren:P,shapeFlag:U,patchFlag:D,dirs:K}=u;if(T!=null&&Kn(T,null,b,u,!0),U&256){d.ctx.deactivate(u);return}const Z=U&1&&K,ie=!Dt(u);let ge;if(ie&&(ge=O&&O.onVnodeBeforeUnmount)&&De(ge,d,u),U&6)Jr(u.component,b,$);else{if(U&128){u.suspense.unmount(b,$);return}Z&&Ze(u,null,d,"beforeUnmount"),U&64?u.type.remove(u,d,b,k,At,$):P&&(V!==ee||D>0&&D&64)?ot(P,d,b,!1,!0):(V===ee&&D&384||!k&&U&16)&&ot(A,d,b),$&&Po(u)}(ie&&(ge=O&&O.onVnodeUnmounted)||Z)&&Le(()=>{ge&&De(ge,d,u),Z&&Ze(u,null,d,"unmounted")},b)},Po=u=>{const{type:d,el:b,anchor:$,transition:k}=u;if(d===ee){Gr(b,$);return}if(d===an){N(u);return}const V=()=>{o(b),k&&!k.persisted&&k.afterLeave&&k.afterLeave()};if(u.shapeFlag&1&&k&&!k.persisted){const{leave:O,delayLeave:T}=k,A=()=>O(b,V);T?T(u.el,V,A):A()}else V()},Gr=(u,d)=>{let b;for(;u!==d;)b=p(u),o(u),u=b;o(d)},Jr=(u,d,b)=>{const{bum:$,scope:k,update:V,subTree:O,um:T}=u;$&&On($),k.stop(),V&&(V.active=!1,Qe(O,u,d,b)),T&&Le(T,d),Le(()=>{u.isUnmounted=!0},d),d&&d.pendingBranch&&!d.isUnmounted&&u.asyncDep&&!u.asyncResolved&&u.suspenseId===d.pendingId&&(d.deps--,d.deps===0&&d.resolve())},ot=(u,d,b,$=!1,k=!1,V=0)=>{for(let O=V;Ou.shapeFlag&6?$n(u.component.subTree):u.shapeFlag&128?u.suspense.next():p(u.anchor||u.el),Co=(u,d,b)=>{u==null?d._vnode&&Qe(d._vnode,null,null,!0):L(d._vnode||null,u,d,null,null,null,b),Bo(),zn(),d._vnode=u},At={p:L,um:Qe,m:bt,r:Po,mt:j,mc:E,pc:pe,pbc:Q,n:$n,o:e};let ys,bs;return t&&([ys,bs]=t(At)),{render:Co,hydrate:ys,createApp:Sc(Co,ys)}}function xt({effect:e,update:t},n){e.allowRecurse=t.allowRecurse=n}function mo(e,t,n=!1){const s=e.children,o=t.children;if(J(s)&&J(o))for(let i=0;i>1,e[n[l]]0&&(t[s]=n[i-1]),n[i]=s)}}for(i=n.length,r=n[i-1];i-- >0;)n[i]=r,r=t[r];return n}const Mc=e=>e.__isTeleport,cn=e=>e&&(e.disabled||e.disabled===""),Go=e=>typeof SVGElement<"u"&&e instanceof SVGElement,Us=(e,t)=>{const n=e&&e.to;return be(n)?t?t(n):null:n},Ac={__isTeleport:!0,process(e,t,n,s,o,i,r,l,c,a){const{mc:f,pc:h,pbc:p,o:{insert:g,querySelector:C,createText:L,createComment:W}}=a,y=cn(t.props);let{shapeFlag:w,children:S,dynamicChildren:N}=t;if(e==null){const z=t.el=L(""),Y=t.anchor=L("");g(z,n,s),g(Y,n,s);const X=t.target=Us(t.props,C),E=t.targetAnchor=L("");X&&(g(E,X),r=r||Go(X));const G=(Q,se)=>{w&16&&f(S,Q,se,o,i,r,l,c)};y?G(n,Y):X&&G(X,E)}else{t.el=e.el;const z=t.anchor=e.anchor,Y=t.target=e.target,X=t.targetAnchor=e.targetAnchor,E=cn(e.props),G=E?n:Y,Q=E?z:X;if(r=r||Go(Y),N?(p(e.dynamicChildren,N,G,o,i,r,l),mo(e,t,!0)):c||h(e,t,G,Q,o,i,r,l,!1),y)E||An(t,n,z,a,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const se=t.target=Us(t.props,C);se&&An(t,se,null,a,0)}else E&&An(t,Y,X,a,1)}wr(t)},remove(e,t,n,s,{um:o,o:{remove:i}},r){const{shapeFlag:l,children:c,anchor:a,targetAnchor:f,target:h,props:p}=e;if(h&&i(f),(r||!cn(p))&&(i(a),l&16))for(let g=0;g0?Ke||Ot:null,Oc(),vn>0&&Ke&&Ke.push(e),e}function x(e,t,n,s,o,i){return kr(v(e,t,n,s,o,i,!0))}function te(e,t,n,s,o){return kr(M(e,t,n,s,o,!0))}function qn(e){return e?e.__v_isVNode===!0:!1}function Ct(e,t){return e.type===t.type&&e.key===t.key}const hs="__vInternal",$r=({key:e})=>e!=null?e:null,Fn=({ref:e,ref_key:t,ref_for:n})=>e!=null?be(e)||Se(e)||ne(e)?{i:$e,r:e,k:t,f:!!n}:e:null;function v(e,t=null,n=null,s=0,o=null,i=e===ee?0:1,r=!1,l=!1){const c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&$r(t),ref:t&&Fn(t),scopeId:cs,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetAnchor:null,staticCount:0,shapeFlag:i,patchFlag:s,dynamicProps:o,dynamicChildren:null,appContext:null,ctx:$e};return l?(vo(c,n),i&128&&e.normalize(c)):n&&(c.shapeFlag|=be(n)?8:16),vn>0&&!r&&Ke&&(c.patchFlag>0||i&6)&&c.patchFlag!==32&&Ke.push(c),c}const M=Fc;function Fc(e,t=null,n=null,s=0,o=null,i=!1){if((!e||e===dr)&&(e=Fe),qn(e)){const l=gt(e,t,!0);return n&&vo(l,n),vn>0&&!i&&Ke&&(l.shapeFlag&6?Ke[Ke.indexOf(e)]=l:Ke.push(l)),l.patchFlag|=-2,l}if(Yc(e)&&(e=e.__vccOpts),t){t=Bc(t);let{class:l,style:c}=t;l&&!be(l)&&(t.class=_e(l)),ve(c)&&(Gi(c)&&!J(c)&&(c=Pe({},c)),t.style=es(c))}const r=be(e)?1:tc(e)?128:Mc(e)?64:ve(e)?4:ne(e)?2:0;return v(e,t,n,s,o,r,i,!0)}function Bc(e){return e?Gi(e)||hs in e?Pe({},e):e:null}function gt(e,t,n=!1){const{props:s,ref:o,patchFlag:i,children:r}=e,l=t?Bn(s||{},t):s;return{__v_isVNode:!0,__v_skip:!0,type:e.type,props:l,key:l&&$r(l),ref:t&&t.ref?n&&o?J(o)?o.concat(Fn(t)):[o,Fn(t)]:Fn(t):o,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:r,target:e.target,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==ee?i===-1?16:i|16:i,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:e.transition,component:e.component,suspense:e.suspense,ssContent:e.ssContent&>(e.ssContent),ssFallback:e.ssFallback&>(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx}}function Ee(e=" ",t=0){return M(Kt,null,e,t)}function Hc(e,t){const n=M(an,null,e);return n.staticCount=t,n}function q(e="",t=!1){return t?(_(),te(Fe,null,e)):M(Fe,null,e)}function je(e){return e==null||typeof e=="boolean"?M(Fe):J(e)?M(ee,null,e.slice()):typeof e=="object"?dt(e):M(Kt,null,String(e))}function dt(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:gt(e)}function vo(e,t){let n=0;const{shapeFlag:s}=e;if(t==null)t=null;else if(J(t))n=16;else if(typeof t=="object")if(s&65){const o=t.default;o&&(o._c&&(o._d=!1),vo(e,o()),o._c&&(o._d=!0));return}else{n=32;const o=t._;!o&&!(hs in t)?t._ctx=$e:o===3&&$e&&($e.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else ne(t)?(t={default:t,_ctx:$e},n=32):(t=String(t),s&64?(n=16,t=[Ee(t)]):n=8);e.children=t,e.shapeFlag|=n}function Bn(...e){const t={};for(let n=0;nwe||$e,qt=e=>{we=e,e.scope.on()},Lt=()=>{we&&we.scope.off(),we=null};function Cr(e){return e.vnode.shapeFlag&4}let yn=!1;function jc(e,t=!1){yn=t;const{props:n,children:s}=e.vnode,o=Cr(e);xc(e,n,o,t),$c(e,s);const i=o?Uc(e,t):void 0;return yn=!1,i}function Uc(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=rn(new Proxy(e.ctx,pc));const{setup:s}=n;if(s){const o=e.setupContext=s.length>1?qc(e):null;qt(e),Gt();const i=_t(s,e,0,[e.props,o]);if(Jt(),Lt(),Oi(i)){if(i.then(Lt,Lt),t)return i.then(r=>{Qo(e,r,t)}).catch(r=>{rs(r,e,0)});e.asyncDep=i}else Qo(e,i,t)}else Sr(e,t)}function Qo(e,t,n){ne(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:ve(t)&&(e.setupState=Zi(t)),Sr(e,n)}let Xo;function Sr(e,t,n){const s=e.type;if(!e.render){if(!t&&Xo&&!s.render){const o=s.template||po(e).template;if(o){const{isCustomElement:i,compilerOptions:r}=e.appContext.config,{delimiters:l,compilerOptions:c}=s,a=Pe(Pe({isCustomElement:i,delimiters:l},r),c);s.render=Xo(o,a)}}e.render=s.render||qe}qt(e),Gt(),gc(e),Jt(),Lt()}function Kc(e){return new Proxy(e.attrs,{get(t,n){return Be(e,"get","$attrs"),t[n]}})}function qc(e){const t=s=>{e.exposed=s||{}};let n;return{get attrs(){return n||(n=Kc(e))},slots:e.slots,emit:e.emit,expose:t}}function _s(e){if(e.exposed)return e.exposeProxy||(e.exposeProxy=new Proxy(Zi(rn(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in ln)return ln[n](e)},has(t,n){return n in t||n in ln}}))}function Wc(e,t=!0){return ne(e)?e.displayName||e.name:e.name||t&&e.__name}function Yc(e){return ne(e)&&"__vccOpts"in e}const le=(e,t)=>Ul(e,t,yn);function Wn(e,t,n){const s=arguments.length;return s===2?ve(t)&&!J(t)?qn(t)?M(e,null,[t]):M(e,t):M(e,null,t):(s>3?n=Array.prototype.slice.call(arguments,2):s===3&&qn(n)&&(n=[n]),M(e,t,n))}const Gc=Symbol(""),Jc=()=>We(Gc),Qc="3.2.45",Xc="http://www.w3.org/2000/svg",St=typeof document<"u"?document:null,Zo=St&&St.createElement("template"),Zc={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,s)=>{const o=t?St.createElementNS(Xc,e):St.createElement(e,n?{is:n}:void 0);return e==="select"&&s&&s.multiple!=null&&o.setAttribute("multiple",s.multiple),o},createText:e=>St.createTextNode(e),createComment:e=>St.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>St.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,s,o,i){const r=n?n.previousSibling:t.lastChild;if(o&&(o===i||o.nextSibling))for(;t.insertBefore(o.cloneNode(!0),n),!(o===i||!(o=o.nextSibling)););else{Zo.innerHTML=s?`${e}`:e;const l=Zo.content;if(s){const c=l.firstChild;for(;c.firstChild;)l.appendChild(c.firstChild);l.removeChild(c)}t.insertBefore(l,n)}return[r?r.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}};function ea(e,t,n){const s=e._vtc;s&&(t=(t?[t,...s]:[...s]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}function ta(e,t,n){const s=e.style,o=be(n);if(n&&!o){for(const i in n)Ks(s,i,n[i]);if(t&&!be(t))for(const i in t)n[i]==null&&Ks(s,i,"")}else{const i=s.display;o?t!==n&&(s.cssText=n):t&&e.removeAttribute("style"),"_vod"in e&&(s.display=i)}}const ei=/\s*!important$/;function Ks(e,t,n){if(J(n))n.forEach(s=>Ks(e,t,s));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const s=na(e,t);ei.test(n)?e.setProperty(Yt(s),n.replace(ei,""),"important"):e[s]=n}}const ti=["Webkit","Moz","ms"],Ps={};function na(e,t){const n=Ps[t];if(n)return n;let s=nt(t);if(s!=="filter"&&s in e)return Ps[t]=s;s=ss(s);for(let o=0;oCs||(ca.then(()=>Cs=0),Cs=Date.now());function ua(e,t){const n=s=>{if(!s._vts)s._vts=Date.now();else if(s._vts<=n.attached)return;Re(fa(s,n.value),t,5,[s])};return n.value=e,n.attached=aa(),n}function fa(e,t){if(J(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(s=>o=>!o._stopped&&s&&s(o))}else return t}const oi=/^on[a-z]/,da=(e,t,n,s,o=!1,i,r,l,c)=>{t==="class"?ea(e,s,o):t==="style"?ta(e,n,s):xn(t)?Js(t)||ra(e,t,n,s,r):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):ha(e,t,s,o))?oa(e,t,s,i,r,l,c):(t==="true-value"?e._trueValue=s:t==="false-value"&&(e._falseValue=s),sa(e,t,s,o))};function ha(e,t,n,s){return s?!!(t==="innerHTML"||t==="textContent"||t in e&&oi.test(t)&&ne(n)):t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA"||oi.test(t)&&be(n)?!1:t in e}const ut="transition",en="animation",ps=(e,{slots:t})=>Wn(lr,_a(e),t);ps.displayName="Transition";const Tr={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String};ps.props=Pe({},lr.props,Tr);const wt=(e,t=[])=>{J(e)?e.forEach(n=>n(...t)):e&&e(...t)},ii=e=>e?J(e)?e.some(t=>t.length>1):e.length>1:!1;function _a(e){const t={};for(const H in e)H in Tr||(t[H]=e[H]);if(e.css===!1)return t;const{name:n="v",type:s,duration:o,enterFromClass:i=`${n}-enter-from`,enterActiveClass:r=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:c=i,appearActiveClass:a=r,appearToClass:f=l,leaveFromClass:h=`${n}-leave-from`,leaveActiveClass:p=`${n}-leave-active`,leaveToClass:g=`${n}-leave-to`}=e,C=pa(o),L=C&&C[0],W=C&&C[1],{onBeforeEnter:y,onEnter:w,onEnterCancelled:S,onLeave:N,onLeaveCancelled:z,onBeforeAppear:Y=y,onAppear:X=w,onAppearCancelled:E=S}=t,G=(H,oe,j)=>{kt(H,oe?f:l),kt(H,oe?a:r),j&&j()},Q=(H,oe)=>{H._isLeaving=!1,kt(H,h),kt(H,g),kt(H,p),oe&&oe()},se=H=>(oe,j)=>{const Ie=H?X:w,de=()=>G(oe,H,j);wt(Ie,[oe,de]),ri(()=>{kt(oe,H?c:i),ft(oe,H?f:l),ii(Ie)||li(oe,s,L,de)})};return Pe(t,{onBeforeEnter(H){wt(y,[H]),ft(H,i),ft(H,r)},onBeforeAppear(H){wt(Y,[H]),ft(H,c),ft(H,a)},onEnter:se(!1),onAppear:se(!0),onLeave(H,oe){H._isLeaving=!0;const j=()=>Q(H,oe);ft(H,h),va(),ft(H,p),ri(()=>{!H._isLeaving||(kt(H,h),ft(H,g),ii(N)||li(H,s,W,j))}),wt(N,[H,j])},onEnterCancelled(H){G(H,!1),wt(S,[H])},onAppearCancelled(H){G(H,!0),wt(E,[H])},onLeaveCancelled(H){Q(H),wt(z,[H])}})}function pa(e){if(e==null)return null;if(ve(e))return[Ss(e.enter),Ss(e.leave)];{const t=Ss(e);return[t,t]}}function Ss(e){return _n(e)}function ft(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e._vtc||(e._vtc=new Set)).add(t)}function kt(e,t){t.split(/\s+/).forEach(s=>s&&e.classList.remove(s));const{_vtc:n}=e;n&&(n.delete(t),n.size||(e._vtc=void 0))}function ri(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let ga=0;function li(e,t,n,s){const o=e._endId=++ga,i=()=>{o===e._endId&&s()};if(n)return setTimeout(i,n);const{type:r,timeout:l,propCount:c}=ma(e,t);if(!r)return s();const a=r+"end";let f=0;const h=()=>{e.removeEventListener(a,p),i()},p=g=>{g.target===e&&++f>=c&&h()};setTimeout(()=>{f(n[C]||"").split(", "),o=s(`${ut}Delay`),i=s(`${ut}Duration`),r=ci(o,i),l=s(`${en}Delay`),c=s(`${en}Duration`),a=ci(l,c);let f=null,h=0,p=0;t===ut?r>0&&(f=ut,h=r,p=i.length):t===en?a>0&&(f=en,h=a,p=c.length):(h=Math.max(r,a),f=h>0?r>a?ut:en:null,p=f?f===ut?i.length:c.length:0);const g=f===ut&&/\b(transform|all)(,|$)/.test(s(`${ut}Property`).toString());return{type:f,timeout:h,propCount:p,hasTransform:g}}function ci(e,t){for(;e.lengthai(n)+ai(e[s])))}function ai(e){return Number(e.slice(0,-1).replace(",","."))*1e3}function va(){return document.body.offsetHeight}const ui=e=>{const t=e.props["onUpdate:modelValue"]||!1;return J(t)?n=>On(t,n):t};function ya(e){e.target.composing=!0}function fi(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const ba={created(e,{modifiers:{lazy:t,trim:n,number:s}},o){e._assign=ui(o);const i=s||o.props&&o.props.type==="number";Nt(e,t?"change":"input",r=>{if(r.target.composing)return;let l=e.value;n&&(l=l.trim()),i&&(l=_n(l)),e._assign(l)}),n&&Nt(e,"change",()=>{e.value=e.value.trim()}),t||(Nt(e,"compositionstart",ya),Nt(e,"compositionend",fi),Nt(e,"change",fi))},mounted(e,{value:t}){e.value=t==null?"":t},beforeUpdate(e,{value:t,modifiers:{lazy:n,trim:s,number:o}},i){if(e._assign=ui(i),e.composing||document.activeElement===e&&e.type!=="range"&&(n||s&&e.value.trim()===t||(o||e.type==="number")&&_n(e.value)===t))return;const r=t==null?"":t;e.value!==r&&(e.value=r)}},xa=["ctrl","shift","alt","meta"],wa={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>xa.some(n=>e[`${n}Key`]&&!t.includes(n))},Vr=(e,t)=>(n,...s)=>{for(let o=0;o{tn(e,!1)}):tn(e,t))},beforeUnmount(e,{value:t}){tn(e,t)}};function tn(e,t){e.style.display=t?e._vod:"none"}const $a=Pe({patchProp:da},Zc);let Ts,di=!1;function Pa(){return Ts=di?Ts:Vc($a),di=!0,Ts}const Ca=(...e)=>{const t=Pa().createApp(...e),{mount:n}=t;return t.mount=s=>{const o=Sa(s);if(o)return n(o,!0,o instanceof SVGElement)},t};function Sa(e){return be(e)?document.querySelector(e):e}const B=(e,t)=>{const n=e.__vccOpts||e;for(const[s,o]of t)n[s]=o;return n},Ta="modulepreload",Va=function(e){return"/regolith/"+e},hi={},Er=function(t,n,s){if(!n||n.length===0)return t();const o=document.getElementsByTagName("link");return Promise.all(n.map(i=>{if(i=Va(i),i in hi)return;hi[i]=!0;const r=i.endsWith(".css"),l=r?'[rel="stylesheet"]':"";if(!!s)for(let f=o.length-1;f>=0;f--){const h=o[f];if(h.href===i&&(!r||h.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${i}"]${l}`))return;const a=document.createElement("link");if(a.rel=r?"stylesheet":Ta,r||(a.as="script",a.crossOrigin=""),a.href=i,document.head.appendChild(a),r)return new Promise((f,h)=>{a.addEventListener("load",f),a.addEventListener("error",()=>h(new Error(`Unable to preload CSS for ${i}`)))})})).then(()=>t())};const Ea=R({__name:"VPBadge",props:{text:null,type:null},setup(e){return(t,n)=>{var s;return _(),x("span",{class:_e(["VPBadge",(s=e.type)!=null?s:"tip"])},[I(t.$slots,"default",{},()=>[Ee(ae(e.text),1)],!0)],2)}}});const La=B(Ea,[["__scopeId","data-v-8d21f6c9"]]),Ma=JSON.parse('{"lang":"en-US","title":"Regolith","description":"A flexible and language-agnostic addon-compiler for the Bedrock Edition of Minecraft.","base":"/regolith/","head":[],"appearance":true,"themeConfig":{"logo":"/logo.png","editLink":{"text":"Suggest changes to this page.","pattern":"https://github.com/Bedrock-OSS/regolith/edit/main/docs/docs/:path"},"socialLinks":[{"icon":"github","link":"https://github.com/Bedrock-OSS/regolith"},{"icon":"discord","link":"https://discord.gg/XjV87YN"}],"footer":{"message":"Released under the MIT license.","copyright":"Copyright \xA9 2024 Bedrock OSS."},"nav":[{"text":"Guide","link":"/guide/what-is-regolith","activeMatch":"/guide/"},{"text":"Standard Library","link":"/standard-library"},{"text":"Community Filters","link":"/community-filters"},{"text":"Resources","items":[{"text":"Project Config Standard","link":"https://github.com/Bedrock-OSS/project-config-standard"}]},{"text":"v1.4.0","items":[{"text":"Release Notes","link":"https://github.com/Bedrock-OSS/regolith/releases"}]}],"sidebar":{"/guide/":[{"text":"Introduction","collapsible":true,"items":[{"text":"What Is Regolith?","link":"/guide/what-is-regolith"},{"text":"Installing","link":"/guide/installing"},{"text":"Getting Started","link":"/guide/getting-started"},{"text":"Troubleshooting","link":"/guide/troubleshooting"}]},{"text":"Advanced","collapsible":true,"items":[{"text":"Configuration File","link":"/guide/configuration"},{"text":"User Configuration","link":"/guide/user-configuration"},{"text":"Data Folder","link":"/guide/data-folder"},{"text":"Export Targets","link":"/guide/export-targets"},{"text":"Profiles","link":"/guide/profiles"},{"text":"Experiments","link":"/guide/experiments"},{"text":"Safety","link":"/guide/safety"}]},{"text":"Filters","collapsible":true,"items":[{"text":"Introduction","link":"/guide/filters"},{"text":"Local Filters","link":"/guide/local-filters"},{"text":"Custom Filters","link":"/guide/custom-filters"},{"text":"Online Filters","link":"/guide/online-filters"},{"text":"Installing Filters","link":"/guide/installing-filters"},{"text":"Filter Run Modes","link":"/guide/filter-run-modes"},{"text":"Create a Filter","link":"/guide/create-a-filter"}]},{"text":"Filter Types","collapsible":true,"items":[{"text":"Java Filters","link":"/guide/java-filters"},{"text":".NET Filters","link":"/guide/dotnet-filters"},{"text":"Nim Filters","link":"/guide/nim-filters"},{"text":"Python Filters","link":"/guide/python-filters"},{"text":"Shell Filters","link":"/guide/shell-filters"},{"text":"NodeJS Filters","link":"/guide/node-filters"},{"text":"Deno Filters","link":"/guide/deno-filters"},{"text":"Profile Filters","link":"/guide/profile-filters"}]}]}},"locales":{},"langs":{},"scrollOffset":90,"cleanUrls":"with-subfolders"}'),gs=/^[a-z]+:/i,_i="vitepress-theme-appearance",Me=typeof window<"u",Lr={relativePath:"",title:"404",description:"Not Found",headers:[],frontmatter:{sidebar:!1,layout:"page"},lastUpdated:0};function Aa(e,t){t.sort((n,s)=>{const o=s.split("/").length-n.split("/").length;return o!==0?o:s.length-n.length});for(const n of t)if(e.startsWith(n))return n}function pi(e,t){const n=Aa(t,Object.keys(e));return n?e[n]:void 0}function Ia(e){const{locales:t}=e.themeConfig||{},n=e.locales;return t&&n?Object.keys(t).reduce((s,o)=>(s[o]={label:t[o].label,lang:n[o].lang},s),{}):{}}function Na(e,t){t=Fa(e,t);const n=pi(e.locales||{},t),s=pi(e.themeConfig.locales||{},t);return Object.assign({},e,n,{themeConfig:Object.assign({},e.themeConfig,s,{locales:{}}),lang:(n||e).lang,locales:{},langs:Ia(e)})}function Mr(e,t){var i;const n=t.title||e.title,s=(i=t.titleTemplate)!=null?i:e.titleTemplate;if(typeof s=="string"&&s.includes(":title"))return s.replace(/:title/g,n);const o=Oa(e.title,s);return`${n}${o}`}function Oa(e,t){return t===!1?"":t===!0||t===void 0?` | ${e}`:e===t?"":` | ${t}`}function Fa(e,t){if(!Me)return t;const n=e.base,s=n.endsWith("/")?n.slice(0,-1):n;return t.slice(s.length)}function Ba(e,t){const[n,s]=t;if(n!=="meta")return!1;const o=Object.entries(s)[0];return o==null?!1:e.some(([i,r])=>i===n&&r[o[0]]===o[1])}function Ha(e,t){return[...e.filter(n=>!Ba(t,n)),...t]}const Da=/[\u0000-\u001F"#$&*+,:;<=>?[\]^`{|}\u007F]/g,Ra=/^[a-z]:/i;function gi(e){const t=Ra.exec(e),n=t?t[0]:"";return n+e.slice(n.length).replace(Da,"_").replace(/(^|\/)_+(?=[^/]*$)/,"$1")}function za(e,t){return`${e}${t}`.replace(/\/+/g,"/")}function bn(e){return gs.test(e)?e:za(Wt.value.base,e)}function Ar(e){let t=e.replace(/\.html$/,"");if(t=decodeURIComponent(t),t.endsWith("/")&&(t+="index"),Me){const n="/regolith/";t=gi(t.slice(n.length).replace(/\//g,"_")||"index")+".md";const s=__VP_HASH_MAP__[t.toLowerCase()];t=`${n}assets/${t}.${s}.js`}else t=`./${gi(t.slice(1).replace(/\//g,"_"))}.md.js`;return t}const Ir=Symbol(),Wt=Dl(Ma);function ja(e){const t=le(()=>Na(Wt.value,e.path));return{site:t,theme:le(()=>t.value.themeConfig),page:le(()=>e.data),frontmatter:le(()=>e.data.frontmatter),lang:le(()=>t.value.lang),localePath:le(()=>{const{langs:n,lang:s}=t.value,o=Object.keys(n).find(i=>n[i].lang===s);return bn(o||"/")}),title:le(()=>Mr(t.value,e.data)),description:le(()=>e.data.description||t.value.description),isDark:re(!1)}}function ue(){const e=We(Ir);if(!e)throw new Error("vitepress data not properly injected in app");return e}const Nr=Symbol(),mi="http://a.com",Ua=()=>({path:"/",component:null,data:Lr});function Ka(e,t){const n=is(Ua()),s={route:n,go:o};async function o(l=Me?location.href:"/"){var a,f;await((a=s.onBeforeRouteChange)==null?void 0:a.call(s,l));const c=new URL(l,mi);Wt.value.cleanUrls==="disabled"&&!c.pathname.endsWith("/")&&!c.pathname.endsWith(".html")&&(c.pathname+=".html",l=c.pathname+c.search+c.hash),Me&&(history.replaceState({scrollPosition:window.scrollY},document.title),history.pushState(null,"",l)),await r(l),await((f=s.onAfterRouteChanged)==null?void 0:f.call(s,l))}let i=null;async function r(l,c=0,a=!1){const f=new URL(l,mi),h=i=f.pathname;try{let p=await e(h);if(i===h){i=null;const{default:g,__pageData:C}=p;if(!g)throw new Error(`Invalid route component: ${g}`);n.path=Me?h:bn(h),n.component=rn(g),n.data=rn(C),Me&&ao(()=>{if(f.hash&&!c){let L=null;try{L=document.querySelector(decodeURIComponent(f.hash))}catch(W){console.warn(W)}if(L){vi(L,f.hash);return}}window.scrollTo(0,c)})}}catch(p){if(!/fetch/.test(p.message)&&!/^\/404(\.html|\/)?$/.test(l)&&console.error(p),!a)try{const g=await fetch(Wt.value.base+"hashmap.json");window.__VP_HASH_MAP__=await g.json(),await r(l,c,!0);return}catch{}i===h&&(i=null,n.path=Me?h:bn(h),n.component=t?rn(t):null,n.data=Lr)}}return Me&&(window.addEventListener("click",l=>{if(l.target.closest("button"))return;const a=l.target.closest("a");if(a&&!a.closest(".vp-raw")&&!a.download){const{href:f,origin:h,pathname:p,hash:g,search:C,target:L}=a,W=window.location,y=p.match(/\.\w+$/);!l.ctrlKey&&!l.shiftKey&&!l.altKey&&!l.metaKey&&L!=="_blank"&&h===W.origin&&!(y&&y[0]!==".html")&&(l.preventDefault(),p===W.pathname&&C===W.search?g&&g!==W.hash&&(history.pushState(null,"",g),window.dispatchEvent(new Event("hashchange")),vi(a,g,a.classList.contains("header-anchor"))):o(f))}},{capture:!0}),window.addEventListener("popstate",l=>{r(location.href,l.state&&l.state.scrollPosition||0)}),window.addEventListener("hashchange",l=>{l.preventDefault()})),s}function qa(){const e=We(Nr);if(!e)throw new Error("useRouter() is called without provider.");return e}function vt(){return qa().route}function vi(e,t,n=!1){let s=null;try{s=e.classList.contains("header-anchor")?e:document.querySelector(decodeURIComponent(t))}catch(o){console.warn(o)}if(s){let o=Wt.value.scrollOffset;typeof o=="string"&&(o=document.querySelector(o).getBoundingClientRect().bottom+24);const i=parseInt(window.getComputedStyle(s).paddingTop,10),r=window.scrollY+s.getBoundingClientRect().top-o+i;!n||Math.abs(r-window.scrollY)>window.innerHeight?window.scrollTo(0,r):window.scrollTo({left:0,top:r,behavior:"smooth"})}}const Wa=R({name:"VitePressContent",props:{onContentUpdated:Function},setup(e){const t=vt();return fo(()=>{var n;(n=e.onContentUpdated)==null||n.call(e)}),()=>Wn("div",{style:{position:"relative"}},[t.component?Wn(t.component):null])}}),Or=/#.*$/,Ya=/(index)?\.(md|html)$/,Ga=typeof window<"u",Ja=re(Ga?location.hash:"");function Qa(e){return gs.test(e)}function Xa(e,t){let n,s=!1;return()=>{n&&clearTimeout(n),s?n=setTimeout(e,t):(e(),s=!0,setTimeout(()=>{s=!1},t))}}function Xt(e,t,n=!1){if(t===void 0)return!1;if(e=bi(`/${e}`),n)return new RegExp(t).test(e);if(bi(t)!==e)return!1;const s=t.match(Or);return s?Ja.value===s[0]:!0}function yi(e){return/^\//.test(e)?e:`/${e}`}function bi(e){return decodeURI(e).replace(Or,"").replace(Ya,"")}function Yn(e){if(Qa(e))return e;const{site:t}=ue(),{pathname:n,search:s,hash:o}=new URL(e,"http://example.com"),i=n.endsWith("/")||n.endsWith(".html")?e:`${n.replace(/(\.md)?$/,t.value.cleanUrls==="disabled"?".html":"")}${s}${o}`;return bn(i)}function Fr(e,t){if(Array.isArray(e))return e;if(e==null)return[];t=yi(t);const n=Object.keys(e).sort((s,o)=>o.split("/").length-s.split("/").length).find(s=>t.startsWith(yi(s)));return n?e[n]:[]}function Za(e){const t=[];function n(s){for(const o of s)o.link&&t.push({...o,link:o.link}),"items"in o&&n(o.items)}for(const s of e)n(s.items);return t}function st(){const e=vt(),{theme:t,frontmatter:n}=ue(),s=re(!1),o=le(()=>{const f=t.value.sidebar,h=e.data.relativePath;return f?Fr(f,h):[]}),i=le(()=>n.value.sidebar!==!1&&o.value.length>0&&n.value.layout!=="home"),r=le(()=>n.value.layout!=="home"&&n.value.aside!==!1);function l(){s.value=!0}function c(){s.value=!1}function a(){s.value?c():l()}return{isOpen:s,sidebar:o,hasSidebar:i,hasAside:r,open:l,close:c,toggle:a}}function eu(e,t){let n;Ut(()=>{n=e.value?document.activeElement:void 0}),Je(()=>{window.addEventListener("keyup",s)}),Qt(()=>{window.removeEventListener("keyup",s)});function s(o){o.key==="Escape"&&e.value&&(t(),n==null||n.focus())}}const tu=R({__name:"VPSkipLink",setup(e){const t=vt(),n=re();tt(()=>t.path,()=>n.value.focus());function s({target:o}){const i=document.querySelector(o.hash);if(i){const r=()=>{i.removeAttribute("tabindex"),i.removeEventListener("blur",r)};i.setAttribute("tabindex","-1"),i.addEventListener("blur",r),i.focus(),window.scrollTo(0,0)}}return(o,i)=>(_(),x(ee,null,[v("span",{ref_key:"backToTop",ref:n,tabindex:"-1"},null,512),v("a",{href:"#VPContent",class:"VPSkipLink visually-hidden",onClick:s}," Skip to content ")],64))}});const nu=B(tu,[["__scopeId","data-v-151f2593"]]),su={key:0,class:"VPBackdrop"},ou=R({__name:"VPBackdrop",props:{show:{type:Boolean}},setup(e){return(t,n)=>(_(),te(ps,{name:"fade"},{default:F(()=>[e.show?(_(),x("div",su)):q("",!0)]),_:1}))}});const iu=B(ou,[["__scopeId","data-v-0164f098"]]);function ru(){const e=re(!1);function t(){e.value=!0,window.addEventListener("resize",o)}function n(){e.value=!1,window.removeEventListener("resize",o)}function s(){e.value?n():t()}function o(){window.outerWidth>=768&&n()}const i=vt();return tt(()=>i.path,n),{isScreenOpen:e,openScreen:t,closeScreen:n,toggleScreen:s}}const lu=["src","alt"],cu={inheritAttrs:!1},au=R({...cu,__name:"VPImage",props:{image:null,alt:null},setup(e){return(t,n)=>{var o;const s=mt("VPImage",!0);return e.image?(_(),x(ee,{key:0},[typeof e.image=="string"||"src"in e.image?(_(),x("img",Bn({key:0,class:"VPImage"},typeof e.image=="string"?t.$attrs:{...e.image,...t.$attrs},{src:m(bn)(typeof e.image=="string"?e.image:e.image.src),alt:(o=e.alt)!=null?o:typeof e.image=="string"?"":e.image.alt||""}),null,16,lu)):(_(),x(ee,{key:1},[M(s,Bn({class:"dark",image:e.image.dark,alt:typeof e.image.dark=="string"?e.image.alt:e.image.dark.alt||e.image.alt},t.$attrs),null,16,["image","alt"]),M(s,Bn({class:"light",image:e.image.light,alt:typeof e.image.light=="string"?e.image.alt:e.image.light.alt||e.image.alt},t.$attrs),null,16,["image","alt"])],64))],64)):q("",!0)}}});const Br=B(au,[["__scopeId","data-v-b7ac6bd3"]]),uu=["href"],fu=R({__name:"VPNavBarTitle",setup(e){const{site:t,theme:n}=ue(),{hasSidebar:s}=st();return(o,i)=>(_(),x("div",{class:_e(["VPNavBarTitle",{"has-sidebar":m(s)}])},[v("a",{class:"title",href:m(t).base},[I(o.$slots,"nav-bar-title-before",{},void 0,!0),M(Br,{class:"logo",image:m(n).logo},null,8,["image"]),m(n).siteTitle?(_(),x(ee,{key:0},[Ee(ae(m(n).siteTitle),1)],64)):m(n).siteTitle===void 0?(_(),x(ee,{key:1},[Ee(ae(m(t).title),1)],64)):q("",!0),I(o.$slots,"nav-bar-title-after",{},void 0,!0)],8,uu)],2))}});const du=B(fu,[["__scopeId","data-v-d5925166"]]),hu="/regolith/assets/flex-logo.2489261b.svg";function Vs(e,t){return typeof e>"u"?t:e}function xi(e){const t=Array(e);for(let n=0;n=this.minlength&&(l||!r[f])){let p=In(c,o,a),g="";switch(this.tokenize){case"full":if(3C;L--)if(L-C>=this.minlength){const W=In(c,o,a,h,C);g=f.substring(C,L),this.push_index(r,g,W,e,n)}break}case"reverse":if(2=this.minlength){const L=In(c,o,a,h,C);this.push_index(r,g,L,e,n)}g=""}case"forward":if(1=this.minlength&&this.push_index(r,g,p,e,n);break}default:if(this.boost&&(p=Math.min(0|p/this.boost(t,f,a),c-1)),this.push_index(r,f,p,e,n),l&&1=this.minlength&&!C[f]){C[f]=1;const S=In(L+(o/2>L?0:1),o,a,y-1,w-1),N=this.bidirectional&&f>W;this.push_index(i,N?W:f,S,e,n,N?f:W)}}}}}this.fastupdate||(this.register[e]=1)}}return this};function In(e,t,n,s,o){return n&&1=this.minlength&&!h[g]){if(!this.optimize&&!i&&!this.map[g])return r;p[L++]=g,h[g]=1}e=p,s=e.length}if(!s)return r;t||(t=100);let c,a=this.depth&&1=n)))));g++);if(a)return o?$i(l,n,0):void(e[e.length]=l)}return!t&&l};function $i(e,t,n){return e=e.length===1?e[0]:pu(e),n||e.length>t?e.slice(n,n+t):e}function Pi(e,t,n,s){if(n){const o=s&&t>n;e=e[o?t:n],e=e&&e[o?n:t]}else e=e[t];return e}Ve.prototype.contain=function(e){return!!this.register[e]},Ve.prototype.update=function(e,t){return this.remove(e).add(e,t)},Ve.prototype.remove=function(e,t){const n=this.register[e];if(n){if(this.fastupdate)for(let s,o=0;o{if(o.value){for(var y=f.value.search(o.value,{enrich:!0}),w=[],S=0;S!y||!y.length?[]:y.reduce((S,N)=>(S[w(N)]||(S[w(N)]=[]),S[w(N)].push(N),S),{}),L=()=>{setTimeout(()=>{r.value&&r.value.focus()},100),W(),s.value=!0};Je(async()=>{var N,z;const y=await Er(()=>import("./chunks/virtual_search-data.3cda3011.js"),[]);l.value=y.default.INDEX_DATA,c.value=y.default.PREVIEW_LOOKUP,a.value=y.default.Options,i.value=window.location.origin+t.value,h.value=((N=a.value)==null?void 0:N.buttonLabel)||h.value,p.value=((z=a.value)==null?void 0:z.placeholder)||p.value;var w=new Ve(a.value);w.import("reg",l.value.reg),w.import("cfg",l.value.cfg),w.import("map",l.value.map),w.import("ctx",l.value.ctx),f.value=w,n.value.innerHTML=/(Mac|iPhone|iPod|iPad)/i.test(navigator.platform)?"\u2318":"Ctrl";const S=Y=>{Y.key==="k"&&(Y.ctrlKey||Y.metaKey)&&(Y.preventDefault(),L())};window.addEventListener("keydown",S)});function W(){s.value=!1,o.value=""}return(y,w)=>{const S=mt("ClientOnly");return _(),x("div",Nu,[M(S,null,{default:F(()=>[(_(),te(Nc,{to:"body"},[Ro(v("div",{class:"modal-back",onClick:w[2]||(w[2]=N=>s.value=!1)},[v("div",{class:"modal",onClick:w[1]||(w[1]=Vr(()=>{},["stop"]))},[v("form",Ou,[Fu,Ro(v("input",{class:"DocSearch-Input","aria-autocomplete":"both","aria-labelledby":"docsearch-label",id:"docsearch-input",autocomplete:"off",autocorrect:"off",autocapitalize:"off",enterkeyhint:"search",spellcheck:"false",autofocus:"true","onUpdate:modelValue":w[0]||(w[0]=N=>o.value=N),placeholder:p.value,maxlength:"64",type:"search",ref_key:"input",ref:r},null,8,Bu),[[ba,o.value]])]),v("div",Hu,[(_(!0),x(ee,null,ke(C(m(g),N=>N.link.split("/").slice(0,-1).join("-")),(N,z)=>(_(),x("div",{key:z},[v("span",Du,ae(z?z.toString()[0].toUpperCase()+z.toString().slice(1):"Home"),1),(_(!0),x(ee,null,ke(N,Y=>(_(),x("a",{href:i.value+Y.link,key:Y.id,onClick:W},[v("div",zu,[v("span",ju,ae(Y.link.includes("#")?"#":"\u25A4"),1),v("div",Uu,[v("h3",null,ae(Y.title),1),v("p",null,[v("div",{innerHTML:Y.preview},null,8,Ku)])]),qu])],8,Ru))),128))]))),128))]),Wu])],512),[[ka,s.value]])]))]),_:1}),v("div",{id:"docsearch",onClick:w[3]||(w[3]=N=>L())},[v("button",Yu,[v("span",Gu,[Ju,v("span",Qu,ae(h.value),1)]),v("span",Xu,[v("span",{class:"DocSearch-Button-Key",ref_key:"metaKey",ref:n},"Meta",512),Zu])])])])}}});const tf={},nf={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",height:"24px",viewBox:"0 0 24 24",width:"24px"},sf=v("path",{d:"M0 0h24v24H0V0z",fill:"none"},null,-1),of=v("path",{d:"M9 5v2h6.59L4 18.59 5.41 20 17 8.41V15h2V5H9z"},null,-1),rf=[sf,of];function lf(e,t){return _(),x("svg",nf,rf)}const cf=B(tf,[["render",lf]]),af=R({__name:"VPLink",props:{href:null,noIcon:{type:Boolean}},setup(e){const t=e,n=le(()=>t.href&&gs.test(t.href));return(s,o)=>(_(),te(_o(e.href?"a":"span"),{class:_e(["VPLink",{link:e.href}]),href:e.href?m(Yn)(e.href):void 0,target:m(n)?"_blank":void 0,rel:m(n)?"noreferrer":void 0},{default:F(()=>[I(s.$slots,"default",{},void 0,!0),m(n)&&!e.noIcon?(_(),te(cf,{key:0,class:"icon"})):q("",!0)]),_:3},8,["class","href","target","rel"]))}});const Mt=B(af,[["__scopeId","data-v-3c355974"]]),uf=R({__name:"VPNavBarMenuLink",props:{item:null},setup(e){const{page:t}=ue();return(n,s)=>(_(),te(Mt,{class:_e({VPNavBarMenuLink:!0,active:m(Xt)(m(t).relativePath,e.item.activeMatch||e.item.link,!!e.item.activeMatch)}),href:e.item.link,noIcon:!0},{default:F(()=>[Ee(ae(e.item.text),1)]),_:1},8,["class","href"]))}});const ff=B(uf,[["__scopeId","data-v-47a2263e"]]),yo=re();let Hr=!1,Ls=0;function df(e){const t=re(!1);if(typeof window<"u"){!Hr&&hf(),Ls++;const n=tt(yo,s=>{var o,i,r;s===e.el.value||((o=e.el.value)==null?void 0:o.contains(s))?(t.value=!0,(i=e.onFocus)==null||i.call(e)):(t.value=!1,(r=e.onBlur)==null||r.call(e))});Qt(()=>{n(),Ls--,Ls||_f()})}return io(t)}function hf(){document.addEventListener("focusin",Dr),Hr=!0,yo.value=document.activeElement}function _f(){document.removeEventListener("focusin",Dr)}function Dr(){yo.value=document.activeElement}const pf={},gf={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},mf=v("path",{d:"M12,16c-0.3,0-0.5-0.1-0.7-0.3l-6-6c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l5.3,5.3l5.3-5.3c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-6,6C12.5,15.9,12.3,16,12,16z"},null,-1),vf=[mf];function yf(e,t){return _(),x("svg",gf,vf)}const Rr=B(pf,[["render",yf]]),bf={},xf={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},wf=v("circle",{cx:"12",cy:"12",r:"2"},null,-1),kf=v("circle",{cx:"19",cy:"12",r:"2"},null,-1),$f=v("circle",{cx:"5",cy:"12",r:"2"},null,-1),Pf=[wf,kf,$f];function Cf(e,t){return _(),x("svg",xf,Pf)}const Sf=B(bf,[["render",Cf]]),Tf={class:"VPMenuLink"},Vf=R({__name:"VPMenuLink",props:{item:null},setup(e){const{page:t}=ue();return(n,s)=>(_(),x("div",Tf,[M(Mt,{class:_e({active:m(Xt)(m(t).relativePath,e.item.activeMatch||e.item.link)}),href:e.item.link},{default:F(()=>[Ee(ae(e.item.text),1)]),_:1},8,["class","href"])]))}});const ms=B(Vf,[["__scopeId","data-v-e8e0fb1d"]]),Ef={class:"VPMenuGroup"},Lf={key:0,class:"title"},Mf=R({__name:"VPMenuGroup",props:{text:null,items:null},setup(e){return(t,n)=>(_(),x("div",Ef,[e.text?(_(),x("p",Lf,ae(e.text),1)):q("",!0),(_(!0),x(ee,null,ke(e.items,s=>(_(),x(ee,null,["link"in s?(_(),te(ms,{key:0,item:s},null,8,["item"])):q("",!0)],64))),256))]))}});const Af=B(Mf,[["__scopeId","data-v-9ca52130"]]),If={class:"VPMenu"},Nf={key:0,class:"items"},Of=R({__name:"VPMenu",props:{items:null},setup(e){return(t,n)=>(_(),x("div",If,[e.items?(_(),x("div",Nf,[(_(!0),x(ee,null,ke(e.items,s=>(_(),x(ee,{key:s.text},["link"in s?(_(),te(ms,{key:0,item:s},null,8,["item"])):(_(),te(Af,{key:1,text:s.text,items:s.items},null,8,["text","items"]))],64))),128))])):q("",!0),I(t.$slots,"default",{},void 0,!0)]))}});const Ff=B(Of,[["__scopeId","data-v-1c5d0cfc"]]),Bf=["aria-expanded","aria-label"],Hf={key:0,class:"text"},Df={class:"menu"},Rf=R({__name:"VPFlyout",props:{icon:null,button:null,label:null,items:null},setup(e){const t=re(!1),n=re();df({el:n,onBlur:s});function s(){t.value=!1}return(o,i)=>(_(),x("div",{class:"VPFlyout",ref_key:"el",ref:n,onMouseenter:i[1]||(i[1]=r=>t.value=!0),onMouseleave:i[2]||(i[2]=r=>t.value=!1)},[v("button",{type:"button",class:"button","aria-haspopup":"true","aria-expanded":t.value,"aria-label":e.label,onClick:i[0]||(i[0]=r=>t.value=!t.value)},[e.button||e.icon?(_(),x("span",Hf,[e.icon?(_(),te(_o(e.icon),{key:0,class:"option-icon"})):q("",!0),Ee(" "+ae(e.button)+" ",1),M(Rr,{class:"text-icon"})])):(_(),te(Sf,{key:1,class:"icon"}))],8,Bf),v("div",Df,[M(Ff,{items:e.items},{default:F(()=>[I(o.$slots,"default",{},void 0,!0)]),_:3},8,["items"])])],544))}});const bo=B(Rf,[["__scopeId","data-v-6ffb57d3"]]),zf=R({__name:"VPNavBarMenuGroup",props:{item:null},setup(e){const{page:t}=ue();return(n,s)=>(_(),te(bo,{class:_e({VPNavBarMenuGroup:!0,active:m(Xt)(m(t).relativePath,e.item.activeMatch,!!e.item.activeMatch)}),button:e.item.text,items:e.item.items},null,8,["class","button","items"]))}}),jf=e=>(Ye("data-v-f83db6ba"),e=e(),Ge(),e),Uf={key:0,"aria-labelledby":"main-nav-aria-label",class:"VPNavBarMenu"},Kf=jf(()=>v("span",{id:"main-nav-aria-label",class:"visually-hidden"},"Main Navigation",-1)),qf=R({__name:"VPNavBarMenu",setup(e){const{theme:t}=ue();return(n,s)=>m(t).nav?(_(),x("nav",Uf,[Kf,(_(!0),x(ee,null,ke(m(t).nav,o=>(_(),x(ee,{key:o.text},["link"in o?(_(),te(ff,{key:0,item:o},null,8,["item"])):(_(),te(zf,{key:1,item:o},null,8,["item"]))],64))),128))])):q("",!0)}});const Wf=B(qf,[["__scopeId","data-v-f83db6ba"]]),Yf={},Gf={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Jf=v("path",{d:"M0 0h24v24H0z",fill:"none"},null,-1),Qf=v("path",{d:" M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z ",class:"css-c4d79v"},null,-1),Xf=[Jf,Qf];function Zf(e,t){return _(),x("svg",Gf,Xf)}const zr=B(Yf,[["render",Zf]]),ed={class:"items"},td={class:"title"},nd=R({__name:"VPNavBarTranslations",setup(e){const{theme:t}=ue();return(n,s)=>m(t).localeLinks?(_(),te(bo,{key:0,class:"VPNavBarTranslations",icon:zr},{default:F(()=>[v("div",ed,[v("p",td,ae(m(t).localeLinks.text),1),(_(!0),x(ee,null,ke(m(t).localeLinks.items,o=>(_(),te(ms,{key:o.link,item:o},null,8,["item"]))),128))])]),_:1})):q("",!0)}});const sd=B(nd,[["__scopeId","data-v-db824e91"]]);const od={},id={class:"VPSwitch",type:"button",role:"switch"},rd={class:"check"},ld={key:0,class:"icon"};function cd(e,t){return _(),x("button",id,[v("span",rd,[e.$slots.default?(_(),x("span",ld,[I(e.$slots,"default",{},void 0,!0)])):q("",!0)])])}const ad=B(od,[["render",cd],["__scopeId","data-v-eba7420e"]]),ud={},fd={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},dd=Hc('',9),hd=[dd];function _d(e,t){return _(),x("svg",fd,hd)}const pd=B(ud,[["render",_d]]),gd={},md={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},vd=v("path",{d:"M12.1,22c-0.3,0-0.6,0-0.9,0c-5.5-0.5-9.5-5.4-9-10.9c0.4-4.8,4.2-8.6,9-9c0.4,0,0.8,0.2,1,0.5c0.2,0.3,0.2,0.8-0.1,1.1c-2,2.7-1.4,6.4,1.3,8.4c2.1,1.6,5,1.6,7.1,0c0.3-0.2,0.7-0.3,1.1-0.1c0.3,0.2,0.5,0.6,0.5,1c-0.2,2.7-1.5,5.1-3.6,6.8C16.6,21.2,14.4,22,12.1,22zM9.3,4.4c-2.9,1-5,3.6-5.2,6.8c-0.4,4.4,2.8,8.3,7.2,8.7c2.1,0.2,4.2-0.4,5.8-1.8c1.1-0.9,1.9-2.1,2.4-3.4c-2.5,0.9-5.3,0.5-7.5-1.1C9.2,11.4,8.1,7.7,9.3,4.4z"},null,-1),yd=[vd];function bd(e,t){return _(),x("svg",md,yd)}const xd=B(gd,[["render",bd]]),wd=R({__name:"VPSwitchAppearance",setup(e){const{site:t,isDark:n}=ue(),s=re(!1),o=typeof localStorage<"u"?i():()=>{};Je(()=>{s.value=document.documentElement.classList.contains("dark")});function i(){const r=window.matchMedia("(prefers-color-scheme: dark)"),l=document.documentElement.classList;let c=localStorage.getItem(_i),a=t.value.appearance==="dark"&&c==null||(c==="auto"||c==null?r.matches:c==="dark");r.onchange=p=>{c==="auto"&&h(a=p.matches)};function f(){h(a=!a),c=a?r.matches?"auto":"dark":r.matches?"light":"auto",localStorage.setItem(_i,c)}function h(p){const g=document.createElement("style");g.type="text/css",g.appendChild(document.createTextNode(`:not(.VPSwitchAppearance):not(.VPSwitchAppearance *) { -webkit-transition: none !important; -moz-transition: none !important; -o-transition: none !important; diff --git a/assets/community-filters.md.d8e67601.js b/assets/community-filters.md.c4e1ae5e.js similarity index 98% rename from assets/community-filters.md.d8e67601.js rename to assets/community-filters.md.c4e1ae5e.js index 3b8bb23b..8ea011c7 100644 --- a/assets/community-filters.md.d8e67601.js +++ b/assets/community-filters.md.c4e1ae5e.js @@ -1 +1 @@ -import{_ as t,c as e,o as r,a as i}from"./app.aed23105.js";const u=JSON.parse('{"title":"Community Filters","description":"","frontmatter":{"title":"Community Filters"},"headers":[{"level":2,"title":"Installing Community Filters","slug":"installing-community-filters","link":"#installing-community-filters","children":[]},{"level":2,"title":"Filters","slug":"filters","link":"#filters","children":[]}],"relativePath":"community-filters.md","lastUpdated":1709465436000}'),a={name:"community-filters.md"},d=i('

Community Filters

The beauty of Regolith is that filters can be written and shared by anyone! This page contains an uncurated list of community filters. If your filter doesn't appear here, let us know!

Installing Community Filters

Community filters are installed via a URL-like resource definition: github.com/<username>/<repository>/<folder>.

For example github.com/SirLich/echo-npc-regolith/echo.

WARNING

Please use extreme caution when running unknown code. Regolith and its maintainers take no responsibility for any damages incurred by using the filters on this page. To learn more, please read our safety page.

TIP

Having trouble? You can learn more about online filters here.

Filters

NameAuthorLanguageDescription
esbuild_executorMajestikButternodejsA regolith filter for using esbuild
js_formatterMajestikButternodejsA regolith filter for formatting JavaScript files
json_formatterMajestikButternodejsA regolith filter for formatting JSON files
ts_transpilerMajestikButternodejsA regolith filter for transpiling Typescript files
NBTEnchantSmokeyStackpythonThis script is used to generate .mcstructure files containing edited nbt data that is currently not possible to do ingame
file_freedomHatchibombotarnodejsThis filter allows you to place bedrock addon file anywhere within the addon directories.
functionerHatchibombotarnodejsA filter for regolith that adds more syntax to function files.
init-fullHatchibombotarnodejsFilter that creates bedrock manifest files on install
link_manifestsHatchibombotarnodejsLinks uuid's from the resource and behaviour pack manifests in the dependencies section.
molang_insertHatchibombotarnodejsA filter for regolith that allows you to insert molang.
pack_commonsHatchibombotarnodejsIntended to allow copying of files into both the resource and behaviour packs
simple_blocksHatchibombotarnodejsA filter that creates blocks from one file.
templaterHatchibombotarnodejsA templater filter for regolith.
item_scaleMedicalJewel105pythonThis filter generates render_offsets for 1.16.100+ items.
custom_projectNusiqexeNo description.
debug_say_function_nameNusiqpythonNo description.
pytemplateNusiqpythonNo description.
run_counterNusiqpythonA pointless filter for counting the number of uses of the 'regolith run' command.
subfunctionsNusiqpythonNo description.
system_templateNusiqpythonNo description.
extend-vanilla-entitieslittlechestnutgamespythonA JSON partials system.
digger_genSirLichpythonThe digger_gen filter allows you to quickly and easily generate the minecraft:digger component, to satisfy your tool-building needs.
e-backupcda94581nodejsBackups your export target in case you made a mistake.
exportcda94581nodejsExports your add-on into a ".mcaddon" automatically.
minimizecda94581nodejsMinimize all file JSONs. Can save a tiny bit of space. Also kinda pointless but whatever.
namespacecda94581nodejsAutomatically apply and replace namespaces to each block, item, entity, recipe, attachable, particle, and fog. Useful for temporary namespaces before deployment.
exportMakercamp-SRLsnodejsExports your add-on into a ".mcaddon", ".mcworld", ".mctemplate" automatically.
module_importerShiCheng-LunodejsA regolith filter for import
command_langMCDevKitshellCompiles the CommandLang programming language into .mcfunction files.
json_templating_engineMCDevKitjavaCompiles JSON templates into JSON files. Especially useful for making reusable pieces of content or large amounts of JSON files.
jsonteMCDevKitexeNo description.
classesevilguy50nimfilter for adding OOP class like structure to functions
dashevilguy50nimNo description.
ds_storeevilguy50nimfilter for removing .DS_Store files
new_execevilguy50nodejsfilter for converting old execute commands to the 1.19.10 format
shorthandevilguy50pythonfilter for having shorthand syntax inside of functions
stripevilguy50nimfilter for striping comments from json, mcfunction, and lang files
style_lintevilguy50pythonfilter for automatic project styling
title_uievilguy50nimfilter for generating title ui bindings
echoSirLichpythonNo description.
scalable-teamscda94581nodejsGenerates a pre-made teams add-on, scalable and customizable. Appends itself to developed packs.
',9),o=[d];function n(l,s,h,m,c,f){return r(),e("div",null,o)}const p=t(a,[["render",n]]);export{u as __pageData,p as default}; +import{_ as t,c as e,o as r,a as i}from"./app.1d293fe1.js";const u=JSON.parse('{"title":"Community Filters","description":"","frontmatter":{"title":"Community Filters"},"headers":[{"level":2,"title":"Installing Community Filters","slug":"installing-community-filters","link":"#installing-community-filters","children":[]},{"level":2,"title":"Filters","slug":"filters","link":"#filters","children":[]}],"relativePath":"community-filters.md","lastUpdated":1724328020000}'),a={name:"community-filters.md"},d=i('

Community Filters

The beauty of Regolith is that filters can be written and shared by anyone! This page contains an uncurated list of community filters. If your filter doesn't appear here, let us know!

Installing Community Filters

Community filters are installed via a URL-like resource definition: github.com/<username>/<repository>/<folder>.

For example github.com/SirLich/echo-npc-regolith/echo.

WARNING

Please use extreme caution when running unknown code. Regolith and its maintainers take no responsibility for any damages incurred by using the filters on this page. To learn more, please read our safety page.

TIP

Having trouble? You can learn more about online filters here.

Filters

NameAuthorLanguageDescription
esbuild_executorMajestikButternodejsA regolith filter for using esbuild
js_formatterMajestikButternodejsA regolith filter for formatting JavaScript files
json_formatterMajestikButternodejsA regolith filter for formatting JSON files
ts_transpilerMajestikButternodejsA regolith filter for transpiling Typescript files
NBTEnchantSmokeyStackpythonThis script is used to generate .mcstructure files containing edited nbt data that is currently not possible to do ingame
file_freedomHatchibombotarnodejsThis filter allows you to place bedrock addon file anywhere within the addon directories.
functionerHatchibombotarnodejsA filter for regolith that adds more syntax to function files.
init-fullHatchibombotarnodejsFilter that creates bedrock manifest files on install
link_manifestsHatchibombotarnodejsLinks uuid's from the resource and behaviour pack manifests in the dependencies section.
molang_insertHatchibombotarnodejsA filter for regolith that allows you to insert molang.
pack_commonsHatchibombotarnodejsIntended to allow copying of files into both the resource and behaviour packs
simple_blocksHatchibombotarnodejsA filter that creates blocks from one file.
templaterHatchibombotarnodejsA templater filter for regolith.
item_scaleMedicalJewel105pythonThis filter generates render_offsets for 1.16.100+ items.
custom_projectNusiqexeNo description.
debug_say_function_nameNusiqpythonNo description.
pytemplateNusiqpythonNo description.
run_counterNusiqpythonA pointless filter for counting the number of uses of the 'regolith run' command.
subfunctionsNusiqpythonNo description.
system_templateNusiqpythonNo description.
extend-vanilla-entitieslittlechestnutgamespythonA JSON partials system.
digger_genSirLichpythonThe digger_gen filter allows you to quickly and easily generate the minecraft:digger component, to satisfy your tool-building needs.
e-backupcda94581nodejsBackups your export target in case you made a mistake.
exportcda94581nodejsExports your add-on into a ".mcaddon" automatically.
minimizecda94581nodejsMinimize all file JSONs. Can save a tiny bit of space. Also kinda pointless but whatever.
namespacecda94581nodejsAutomatically apply and replace namespaces to each block, item, entity, recipe, attachable, particle, and fog. Useful for temporary namespaces before deployment.
exportMakercamp-SRLsnodejsExports your add-on into a ".mcaddon", ".mcworld", ".mctemplate" automatically.
module_importerShiCheng-LunodejsA regolith filter for import
command_langMCDevKitshellCompiles the CommandLang programming language into .mcfunction files.
json_templating_engineMCDevKitjavaCompiles JSON templates into JSON files. Especially useful for making reusable pieces of content or large amounts of JSON files.
jsonteMCDevKitexeNo description.
classesevilguy50nimfilter for adding OOP class like structure to functions
dashevilguy50nimNo description.
ds_storeevilguy50nimfilter for removing .DS_Store files
new_execevilguy50nodejsfilter for converting old execute commands to the 1.19.10 format
shorthandevilguy50pythonfilter for having shorthand syntax inside of functions
stripevilguy50nimfilter for striping comments from json, mcfunction, and lang files
style_lintevilguy50pythonfilter for automatic project styling
title_uievilguy50nimfilter for generating title ui bindings
echoSirLichpythonNo description.
scalable-teamscda94581nodejsGenerates a pre-made teams add-on, scalable and customizable. Appends itself to developed packs.
',9),o=[d];function n(l,s,h,m,c,f){return r(),e("div",null,o)}const p=t(a,[["render",n]]);export{u as __pageData,p as default}; diff --git a/assets/community-filters.md.d8e67601.lean.js b/assets/community-filters.md.c4e1ae5e.lean.js similarity index 79% rename from assets/community-filters.md.d8e67601.lean.js rename to assets/community-filters.md.c4e1ae5e.lean.js index 3842497b..033c289f 100644 --- a/assets/community-filters.md.d8e67601.lean.js +++ b/assets/community-filters.md.c4e1ae5e.lean.js @@ -1 +1 @@ -import{_ as t,c as e,o as r,a as i}from"./app.aed23105.js";const u=JSON.parse('{"title":"Community Filters","description":"","frontmatter":{"title":"Community Filters"},"headers":[{"level":2,"title":"Installing Community Filters","slug":"installing-community-filters","link":"#installing-community-filters","children":[]},{"level":2,"title":"Filters","slug":"filters","link":"#filters","children":[]}],"relativePath":"community-filters.md","lastUpdated":1709465436000}'),a={name:"community-filters.md"},d=i("",9),o=[d];function n(l,s,h,m,c,f){return r(),e("div",null,o)}const p=t(a,[["render",n]]);export{u as __pageData,p as default}; +import{_ as t,c as e,o as r,a as i}from"./app.1d293fe1.js";const u=JSON.parse('{"title":"Community Filters","description":"","frontmatter":{"title":"Community Filters"},"headers":[{"level":2,"title":"Installing Community Filters","slug":"installing-community-filters","link":"#installing-community-filters","children":[]},{"level":2,"title":"Filters","slug":"filters","link":"#filters","children":[]}],"relativePath":"community-filters.md","lastUpdated":1724328020000}'),a={name:"community-filters.md"},d=i("",9),o=[d];function n(l,s,h,m,c,f){return r(),e("div",null,o)}const p=t(a,[["render",n]]);export{u as __pageData,p as default}; diff --git a/assets/guide_configuration.md.459ca06d.js b/assets/guide_configuration.md.b637cb4a.js similarity index 96% rename from assets/guide_configuration.md.459ca06d.js rename to assets/guide_configuration.md.b637cb4a.js index 818722f9..20819522 100644 --- a/assets/guide_configuration.md.459ca06d.js +++ b/assets/guide_configuration.md.b637cb4a.js @@ -1,4 +1,4 @@ -import{_ as s,c as n,o as a,a as o}from"./app.aed23105.js";const u=JSON.parse('{"title":"Project Configuration File","description":"","frontmatter":{"title":"Project Configuration File"},"headers":[{"level":2,"title":"Project Config Standard","slug":"project-config-standard","link":"#project-config-standard","children":[]},{"level":2,"title":"Regolith Configuration","slug":"regolith-configuration","link":"#regolith-configuration","children":[]}],"relativePath":"guide/configuration.md","lastUpdated":1709465436000}'),l={name:"guide/configuration.md"},p=o(`

Configuration File

The configuration of Regolith project is stored inside of config.json, at the top level of your Regolith project. This file will be created when you run regolith init.

Project Config Standard

Regolith follows the Project Config Standard. This config is a shared format, used by programs that interact with Minecraft projects, such as bridge.

Regolith Configuration

Regolith builds on this standard with the addition of the regolith namespace, which is where all regolith-specific information is stored.

WARNING

This page only shows an example configuration. There are other documentation pages to fully explain concepts such as filters and profiles.

Example config, with many options explained:

json
{
+import{_ as s,c as n,o as a,a as o}from"./app.1d293fe1.js";const u=JSON.parse('{"title":"Project Configuration File","description":"","frontmatter":{"title":"Project Configuration File"},"headers":[{"level":2,"title":"Project Config Standard","slug":"project-config-standard","link":"#project-config-standard","children":[]},{"level":2,"title":"Regolith Configuration","slug":"regolith-configuration","link":"#regolith-configuration","children":[]}],"relativePath":"guide/configuration.md","lastUpdated":1724328020000}'),l={name:"guide/configuration.md"},p=o(`

Configuration File

The configuration of Regolith project is stored inside of config.json, at the top level of your Regolith project. This file will be created when you run regolith init.

Project Config Standard

Regolith follows the Project Config Standard. This config is a shared format, used by programs that interact with Minecraft projects, such as bridge.

Regolith Configuration

Regolith builds on this standard with the addition of the regolith namespace, which is where all regolith-specific information is stored.

WARNING

This page only shows an example configuration. There are other documentation pages to fully explain concepts such as filters and profiles.

Example config, with many options explained:

json
{
   // These fields come from project standard
   "name": "Project Name",
   "author": "Author Name",
@@ -53,6 +53,7 @@ import{_ as s,c as n,o as a,a as o}from"./app.aed23105.js";const u=JSON.parse('{
         // Export target defines where your files will be exported
         "export": {
           "target": "development",
+          "build": "standard",
           "readOnly": false
         }
       }
diff --git a/assets/guide_configuration.md.459ca06d.lean.js b/assets/guide_configuration.md.b637cb4a.lean.js
similarity index 72%
rename from assets/guide_configuration.md.459ca06d.lean.js
rename to assets/guide_configuration.md.b637cb4a.lean.js
index f1c327ab..0f465287 100644
--- a/assets/guide_configuration.md.459ca06d.lean.js
+++ b/assets/guide_configuration.md.b637cb4a.lean.js
@@ -1 +1 @@
-import{_ as s,c as n,o as a,a as o}from"./app.aed23105.js";const u=JSON.parse('{"title":"Project Configuration File","description":"","frontmatter":{"title":"Project Configuration File"},"headers":[{"level":2,"title":"Project Config Standard","slug":"project-config-standard","link":"#project-config-standard","children":[]},{"level":2,"title":"Regolith Configuration","slug":"regolith-configuration","link":"#regolith-configuration","children":[]}],"relativePath":"guide/configuration.md","lastUpdated":1709465436000}'),l={name:"guide/configuration.md"},p=o("",9),e=[p];function t(r,c,D,i,y,F){return a(),n("div",null,e)}const A=s(l,[["render",t]]);export{u as __pageData,A as default};
+import{_ as s,c as n,o as a,a as o}from"./app.1d293fe1.js";const u=JSON.parse('{"title":"Project Configuration File","description":"","frontmatter":{"title":"Project Configuration File"},"headers":[{"level":2,"title":"Project Config Standard","slug":"project-config-standard","link":"#project-config-standard","children":[]},{"level":2,"title":"Regolith Configuration","slug":"regolith-configuration","link":"#regolith-configuration","children":[]}],"relativePath":"guide/configuration.md","lastUpdated":1724328020000}'),l={name:"guide/configuration.md"},p=o("",9),e=[p];function t(r,c,D,i,y,F){return a(),n("div",null,e)}const A=s(l,[["render",t]]);export{u as __pageData,A as default};
diff --git a/assets/guide_create-a-filter.md.e4b14fe1.js b/assets/guide_create-a-filter.md.01f3e00d.js
similarity index 96%
rename from assets/guide_create-a-filter.md.e4b14fe1.js
rename to assets/guide_create-a-filter.md.01f3e00d.js
index 333dd13f..d9edfdc3 100644
--- a/assets/guide_create-a-filter.md.e4b14fe1.js
+++ b/assets/guide_create-a-filter.md.01f3e00d.js
@@ -1,4 +1,4 @@
-import{_ as s,c as n,o as a,a as o}from"./app.aed23105.js";const u=JSON.parse('{"title":"Create a Filter","description":"","frontmatter":{"title":"Create a Filter"},"headers":[{"level":2,"title":"Installing Python","slug":"installing-python","link":"#installing-python","children":[]},{"level":2,"title":"Getting Started","slug":"getting-started","link":"#getting-started","children":[{"level":3,"title":"Testing your Filter","slug":"testing-your-filter","link":"#testing-your-filter","children":[]}]},{"level":2,"title":"Understanding Regolith","slug":"understanding-regolith","link":"#understanding-regolith","children":[]},{"level":2,"title":"Filter Goal","slug":"filter-goal","link":"#filter-goal","children":[]}],"relativePath":"guide/create-a-filter.md","lastUpdated":1709465436000}'),l={name:"guide/create-a-filter.md"},e=o(`

Create a Filter

This step-by-step tutorial will guide you through the creation of your first Regolith filter, in the Python programming language. If you're new to Regolith, you may enjoy trying out some of our standard filters first.

WARNING

This page is an in-depth tutorial for Regolith filter creation, including detailed information about data-flow and semantics. If you just want to get started programming, you may consider checking out the documentation on custom filters.

Installing Python

Before you can begin, you need to ensure that Python is installed on your system. There are download instructions on our Python Filter page.

Getting Started

If you don't have one yet, you should create a new Regolith project by navigating to a blank folder, and typing regolith init.

TIP

During this tutorial, project refers to the project folder you just created!

The first step is creating a new python file in project/filters/giant_mobs.py. Our first step will be simply printing hello world!, so add print("hello world!") into your new filter file.

You can also create a small addon in RP and BP. For this tutorial, you need at least a working manifest.json, and a single working behavior entity, such as one copied from the vanilla files.

Testing your Filter

At this point, you need to edit your config.json so that giant_mobs is registered as a local filter. Your config should look something like this:

json
{
+import{_ as s,c as n,o as a,a as o}from"./app.1d293fe1.js";const u=JSON.parse('{"title":"Create a Filter","description":"","frontmatter":{"title":"Create a Filter"},"headers":[{"level":2,"title":"Installing Python","slug":"installing-python","link":"#installing-python","children":[]},{"level":2,"title":"Getting Started","slug":"getting-started","link":"#getting-started","children":[{"level":3,"title":"Testing your Filter","slug":"testing-your-filter","link":"#testing-your-filter","children":[]}]},{"level":2,"title":"Understanding Regolith","slug":"understanding-regolith","link":"#understanding-regolith","children":[]},{"level":2,"title":"Filter Goal","slug":"filter-goal","link":"#filter-goal","children":[]}],"relativePath":"guide/create-a-filter.md","lastUpdated":1724328020000}'),l={name:"guide/create-a-filter.md"},e=o(`

Create a Filter

This step-by-step tutorial will guide you through the creation of your first Regolith filter, in the Python programming language. If you're new to Regolith, you may enjoy trying out some of our standard filters first.

WARNING

This page is an in-depth tutorial for Regolith filter creation, including detailed information about data-flow and semantics. If you just want to get started programming, you may consider checking out the documentation on custom filters.

Installing Python

Before you can begin, you need to ensure that Python is installed on your system. There are download instructions on our Python Filter page.

Getting Started

If you don't have one yet, you should create a new Regolith project by navigating to a blank folder, and typing regolith init.

TIP

During this tutorial, project refers to the project folder you just created!

The first step is creating a new python file in project/filters/giant_mobs.py. Our first step will be simply printing hello world!, so add print("hello world!") into your new filter file.

You can also create a small addon in RP and BP. For this tutorial, you need at least a working manifest.json, and a single working behavior entity, such as one copied from the vanilla files.

Testing your Filter

At this point, you need to edit your config.json so that giant_mobs is registered as a local filter. Your config should look something like this:

json
{
   "name": "Giant Mobs",
   "author": "Your Name",
   "packs": {
@@ -15,6 +15,7 @@ import{_ as s,c as n,o as a,a as o}from"./app.aed23105.js";const u=JSON.parse('{
         ],
         "export": {
           "target": "development",
+          "build": "standard",
           "readOnly": true
         }
       }
diff --git a/assets/guide_create-a-filter.md.e4b14fe1.lean.js b/assets/guide_create-a-filter.md.01f3e00d.lean.js
similarity index 86%
rename from assets/guide_create-a-filter.md.e4b14fe1.lean.js
rename to assets/guide_create-a-filter.md.01f3e00d.lean.js
index adfebbd9..73c27d91 100644
--- a/assets/guide_create-a-filter.md.e4b14fe1.lean.js
+++ b/assets/guide_create-a-filter.md.01f3e00d.lean.js
@@ -1 +1 @@
-import{_ as s,c as n,o as a,a as o}from"./app.aed23105.js";const u=JSON.parse('{"title":"Create a Filter","description":"","frontmatter":{"title":"Create a Filter"},"headers":[{"level":2,"title":"Installing Python","slug":"installing-python","link":"#installing-python","children":[]},{"level":2,"title":"Getting Started","slug":"getting-started","link":"#getting-started","children":[{"level":3,"title":"Testing your Filter","slug":"testing-your-filter","link":"#testing-your-filter","children":[]}]},{"level":2,"title":"Understanding Regolith","slug":"understanding-regolith","link":"#understanding-regolith","children":[]},{"level":2,"title":"Filter Goal","slug":"filter-goal","link":"#filter-goal","children":[]}],"relativePath":"guide/create-a-filter.md","lastUpdated":1709465436000}'),l={name:"guide/create-a-filter.md"},e=o("",23),t=[e];function p(r,c,i,D,y,F){return a(),n("div",null,t)}const C=s(l,[["render",p]]);export{u as __pageData,C as default};
+import{_ as s,c as n,o as a,a as o}from"./app.1d293fe1.js";const u=JSON.parse('{"title":"Create a Filter","description":"","frontmatter":{"title":"Create a Filter"},"headers":[{"level":2,"title":"Installing Python","slug":"installing-python","link":"#installing-python","children":[]},{"level":2,"title":"Getting Started","slug":"getting-started","link":"#getting-started","children":[{"level":3,"title":"Testing your Filter","slug":"testing-your-filter","link":"#testing-your-filter","children":[]}]},{"level":2,"title":"Understanding Regolith","slug":"understanding-regolith","link":"#understanding-regolith","children":[]},{"level":2,"title":"Filter Goal","slug":"filter-goal","link":"#filter-goal","children":[]}],"relativePath":"guide/create-a-filter.md","lastUpdated":1724328020000}'),l={name:"guide/create-a-filter.md"},e=o("",23),t=[e];function p(r,c,i,D,y,F){return a(),n("div",null,t)}const C=s(l,[["render",p]]);export{u as __pageData,C as default};
diff --git a/assets/guide_custom-filters.md.d6d4910e.js b/assets/guide_custom-filters.md.e7230af9.js
similarity index 99%
rename from assets/guide_custom-filters.md.d6d4910e.js
rename to assets/guide_custom-filters.md.e7230af9.js
index e475694e..b8fa06b4 100644
--- a/assets/guide_custom-filters.md.d6d4910e.js
+++ b/assets/guide_custom-filters.md.e7230af9.js
@@ -1,4 +1,4 @@
-import{_ as s,c as a,o as n,a as l}from"./app.aed23105.js";const d=JSON.parse('{"title":"Custom Filters","description":"","frontmatter":{"title":"Custom Filters"},"headers":[{"level":2,"title":"Creating Scripts","slug":"creating-scripts","link":"#creating-scripts","children":[]},{"level":2,"title":"Filter Data","slug":"filter-data","link":"#filter-data","children":[]},{"level":2,"title":"Registering Custom Filter","slug":"registering-custom-filter","link":"#registering-custom-filter","children":[]},{"level":2,"title":"Filter Arguments","slug":"filter-arguments","link":"#filter-arguments","children":[]},{"level":2,"title":"Filter Settings","slug":"filter-settings","link":"#filter-settings","children":[]},{"level":2,"title":"Filter Environment Variables","slug":"filter-environment-variables","link":"#filter-environment-variables","children":[]}],"relativePath":"guide/custom-filters.md","lastUpdated":1709465436000}'),o={name:"guide/custom-filters.md"},e=l(`

Custom Filters

Regolith allows you to write your own local files, and register them directly as filters. Special support is provided for filters written with Python, Node JS, and other languages.

To start writing a custom filter, you first need a script to run. We will use hello_world.py as an example:

python
print("Hello world!")
+import{_ as s,c as a,o as n,a as l}from"./app.1d293fe1.js";const d=JSON.parse('{"title":"Custom Filters","description":"","frontmatter":{"title":"Custom Filters"},"headers":[{"level":2,"title":"Creating Scripts","slug":"creating-scripts","link":"#creating-scripts","children":[]},{"level":2,"title":"Filter Data","slug":"filter-data","link":"#filter-data","children":[]},{"level":2,"title":"Registering Custom Filter","slug":"registering-custom-filter","link":"#registering-custom-filter","children":[]},{"level":2,"title":"Filter Arguments","slug":"filter-arguments","link":"#filter-arguments","children":[]},{"level":2,"title":"Filter Settings","slug":"filter-settings","link":"#filter-settings","children":[]},{"level":2,"title":"Filter Environment Variables","slug":"filter-environment-variables","link":"#filter-environment-variables","children":[]}],"relativePath":"guide/custom-filters.md","lastUpdated":1724328020000}'),o={name:"guide/custom-filters.md"},e=l(`

Custom Filters

Regolith allows you to write your own local files, and register them directly as filters. Special support is provided for filters written with Python, Node JS, and other languages.

To start writing a custom filter, you first need a script to run. We will use hello_world.py as an example:

python
print("Hello world!")
 

Creating Scripts

New filters can be defined anywhere, but the suggested location is in filters folder, at the top level of the Regolith project. This folder isn't created for you, so you need to create it yourself.

Once this folder is created, you can add your scripts here. You can organize with sub-folders if desired.

Filter Data

The accepted flow for Regolith is to store configuration scripts and configs inside of the data folder. This folder has special support that makes it easy to access during compilation. Read more about the data folder here.

Registering Custom Filter

Now you can register your script by placing the filter into filterDefinitions. Here is a full example, which defines a new filter named "test", and runs it in the "default" profile.

json
{
   "name": "example",
   "author": "example",
diff --git a/assets/guide_custom-filters.md.d6d4910e.lean.js b/assets/guide_custom-filters.md.e7230af9.lean.js
similarity index 88%
rename from assets/guide_custom-filters.md.d6d4910e.lean.js
rename to assets/guide_custom-filters.md.e7230af9.lean.js
index 6867b1bf..8a63ffbd 100644
--- a/assets/guide_custom-filters.md.d6d4910e.lean.js
+++ b/assets/guide_custom-filters.md.e7230af9.lean.js
@@ -1 +1 @@
-import{_ as s,c as a,o as n,a as l}from"./app.aed23105.js";const d=JSON.parse('{"title":"Custom Filters","description":"","frontmatter":{"title":"Custom Filters"},"headers":[{"level":2,"title":"Creating Scripts","slug":"creating-scripts","link":"#creating-scripts","children":[]},{"level":2,"title":"Filter Data","slug":"filter-data","link":"#filter-data","children":[]},{"level":2,"title":"Registering Custom Filter","slug":"registering-custom-filter","link":"#registering-custom-filter","children":[]},{"level":2,"title":"Filter Arguments","slug":"filter-arguments","link":"#filter-arguments","children":[]},{"level":2,"title":"Filter Settings","slug":"filter-settings","link":"#filter-settings","children":[]},{"level":2,"title":"Filter Environment Variables","slug":"filter-environment-variables","link":"#filter-environment-variables","children":[]}],"relativePath":"guide/custom-filters.md","lastUpdated":1709465436000}'),o={name:"guide/custom-filters.md"},e=l("",31),t=[e];function p(r,c,i,D,F,y){return n(),a("div",null,t)}const C=s(o,[["render",p]]);export{d as __pageData,C as default};
+import{_ as s,c as a,o as n,a as l}from"./app.1d293fe1.js";const d=JSON.parse('{"title":"Custom Filters","description":"","frontmatter":{"title":"Custom Filters"},"headers":[{"level":2,"title":"Creating Scripts","slug":"creating-scripts","link":"#creating-scripts","children":[]},{"level":2,"title":"Filter Data","slug":"filter-data","link":"#filter-data","children":[]},{"level":2,"title":"Registering Custom Filter","slug":"registering-custom-filter","link":"#registering-custom-filter","children":[]},{"level":2,"title":"Filter Arguments","slug":"filter-arguments","link":"#filter-arguments","children":[]},{"level":2,"title":"Filter Settings","slug":"filter-settings","link":"#filter-settings","children":[]},{"level":2,"title":"Filter Environment Variables","slug":"filter-environment-variables","link":"#filter-environment-variables","children":[]}],"relativePath":"guide/custom-filters.md","lastUpdated":1724328020000}'),o={name:"guide/custom-filters.md"},e=l("",31),t=[e];function p(r,c,i,D,F,y){return n(),a("div",null,t)}const C=s(o,[["render",p]]);export{d as __pageData,C as default};
diff --git a/assets/guide_data-folder.md.1391dd31.js b/assets/guide_data-folder.md.a7e4c196.js
similarity index 98%
rename from assets/guide_data-folder.md.1391dd31.js
rename to assets/guide_data-folder.md.a7e4c196.js
index 4e3b2763..d896f25f 100644
--- a/assets/guide_data-folder.md.1391dd31.js
+++ b/assets/guide_data-folder.md.a7e4c196.js
@@ -1,4 +1,4 @@
-import{_ as s,c as a,o,a as e}from"./app.aed23105.js";const h=JSON.parse('{"title":"Data Folder","description":"","frontmatter":{"title":"Data Folder"},"headers":[{"level":2,"title":"Location","slug":"location","link":"#location","children":[]},{"level":2,"title":"Remote Filter Installation","slug":"remote-filter-installation","link":"#remote-filter-installation","children":[]},{"level":2,"title":"Accessing the Data Folder","slug":"accessing-the-data-folder","link":"#accessing-the-data-folder","children":[]},{"level":2,"title":"Saving Data","slug":"saving-data","link":"#saving-data","children":[]}],"relativePath":"guide/data-folder.md","lastUpdated":1709465436000}'),n={name:"guide/data-folder.md"},l=e(`

Data Folder

The Regolith data folder is a special folder where configuration files can be stored.

Location

By default, the data folder is stored in ./packs/data. This folder will be created for you when you run regolith init.

If you would like to change the data folder location, you may do so by editing "dataPath": "./packs/data". Please be aware you will need to create the folder yourself!

Remote Filter Installation

When a remote filter is installed, it has the opportunity to place some files into your data folder.

If the remote filter repository contains a data folder, at the same level as filter.json, the contents will be moved into data/filter_name/*. This is our supported "first time setup" flow. If you're developing a remote filter, you are encouraged to use the data folder, and create configuration files with sensible defaults.

WARNING

Don't worry! Your data won't be lost. regolith install will never overwrite your data files. If the folder is already in use during installation, a warning will be logged and the step will be skipped.

Accessing the Data Folder

When Regolith runs, it will move the data folder into the tmp directory, along with the RP and BP folders. You can access the files here directly, just as you do the pack files.

For example:

python
with open('./data/bump_manifest/version.json', 'r') as f:
+import{_ as s,c as a,o,a as e}from"./app.1d293fe1.js";const h=JSON.parse('{"title":"Data Folder","description":"","frontmatter":{"title":"Data Folder"},"headers":[{"level":2,"title":"Location","slug":"location","link":"#location","children":[]},{"level":2,"title":"Remote Filter Installation","slug":"remote-filter-installation","link":"#remote-filter-installation","children":[]},{"level":2,"title":"Accessing the Data Folder","slug":"accessing-the-data-folder","link":"#accessing-the-data-folder","children":[]},{"level":2,"title":"Saving Data","slug":"saving-data","link":"#saving-data","children":[]}],"relativePath":"guide/data-folder.md","lastUpdated":1724328020000}'),n={name:"guide/data-folder.md"},l=e(`

Data Folder

The Regolith data folder is a special folder where configuration files can be stored.

Location

By default, the data folder is stored in ./packs/data. This folder will be created for you when you run regolith init.

If you would like to change the data folder location, you may do so by editing "dataPath": "./packs/data". Please be aware you will need to create the folder yourself!

Remote Filter Installation

When a remote filter is installed, it has the opportunity to place some files into your data folder.

If the remote filter repository contains a data folder, at the same level as filter.json, the contents will be moved into data/filter_name/*. This is our supported "first time setup" flow. If you're developing a remote filter, you are encouraged to use the data folder, and create configuration files with sensible defaults.

WARNING

Don't worry! Your data won't be lost. regolith install will never overwrite your data files. If the folder is already in use during installation, a warning will be logged and the step will be skipped.

Accessing the Data Folder

When Regolith runs, it will move the data folder into the tmp directory, along with the RP and BP folders. You can access the files here directly, just as you do the pack files.

For example:

python
with open('./data/bump_manifest/version.json', 'r') as f:
   print(json.load(f))
 

Saving Data

To save data, you will need to add "exportData": true, to your filter.json definition. This is opt-in, to avoid slow copying of large data folders.

When regolith is finished running, data folders marked with exportData will be moved from the temporary location, back into the normal location. This flow allows you to store persistent data, by editing or creating new files.

For example if your filter is called hello_world, with exportData set to true, then you would be expected to store data into data/hello_world/*.

WARNING

This stands in contrast to the RP and BP folders, which will not be saved back into the project!

For example:

filter.json

json
{
     "description": "An example of using export data",
diff --git a/assets/guide_data-folder.md.1391dd31.lean.js b/assets/guide_data-folder.md.a7e4c196.lean.js
similarity index 84%
rename from assets/guide_data-folder.md.1391dd31.lean.js
rename to assets/guide_data-folder.md.a7e4c196.lean.js
index 729b0847..5ac599c8 100644
--- a/assets/guide_data-folder.md.1391dd31.lean.js
+++ b/assets/guide_data-folder.md.a7e4c196.lean.js
@@ -1 +1 @@
-import{_ as s,c as a,o,a as e}from"./app.aed23105.js";const h=JSON.parse('{"title":"Data Folder","description":"","frontmatter":{"title":"Data Folder"},"headers":[{"level":2,"title":"Location","slug":"location","link":"#location","children":[]},{"level":2,"title":"Remote Filter Installation","slug":"remote-filter-installation","link":"#remote-filter-installation","children":[]},{"level":2,"title":"Accessing the Data Folder","slug":"accessing-the-data-folder","link":"#accessing-the-data-folder","children":[]},{"level":2,"title":"Saving Data","slug":"saving-data","link":"#saving-data","children":[]}],"relativePath":"guide/data-folder.md","lastUpdated":1709465436000}'),n={name:"guide/data-folder.md"},l=e("",23),t=[l];function p(r,c,i,d,D,F){return o(),a("div",null,t)}const u=s(n,[["render",p]]);export{h as __pageData,u as default};
+import{_ as s,c as a,o,a as e}from"./app.1d293fe1.js";const h=JSON.parse('{"title":"Data Folder","description":"","frontmatter":{"title":"Data Folder"},"headers":[{"level":2,"title":"Location","slug":"location","link":"#location","children":[]},{"level":2,"title":"Remote Filter Installation","slug":"remote-filter-installation","link":"#remote-filter-installation","children":[]},{"level":2,"title":"Accessing the Data Folder","slug":"accessing-the-data-folder","link":"#accessing-the-data-folder","children":[]},{"level":2,"title":"Saving Data","slug":"saving-data","link":"#saving-data","children":[]}],"relativePath":"guide/data-folder.md","lastUpdated":1724328020000}'),n={name:"guide/data-folder.md"},l=e("",23),t=[l];function p(r,c,i,d,D,F){return o(),a("div",null,t)}const u=s(n,[["render",p]]);export{h as __pageData,u as default};
diff --git a/assets/guide_deno-filters.md.10212684.js b/assets/guide_deno-filters.md.baefd136.js
similarity index 95%
rename from assets/guide_deno-filters.md.10212684.js
rename to assets/guide_deno-filters.md.baefd136.js
index cbd1b43f..fb21f38b 100644
--- a/assets/guide_deno-filters.md.10212684.js
+++ b/assets/guide_deno-filters.md.baefd136.js
@@ -1,4 +1,4 @@
-import{_ as e,c as n,o as s,a}from"./app.aed23105.js";const F=JSON.parse('{"title":"Deno Filters","description":"","frontmatter":{"title":"Deno Filters"},"headers":[{"level":2,"title":"Installing Deno","slug":"installing-deno","link":"#installing-deno","children":[]},{"level":2,"title":"Running Deno code as Filter","slug":"running-deno-code-as-filter","link":"#running-deno-code-as-filter","children":[]},{"level":2,"title":"Requirements and Dependencies","slug":"requirements-and-dependencies","link":"#requirements-and-dependencies","children":[]}],"relativePath":"guide/deno-filters.md","lastUpdated":1709465436000}'),t={name:"guide/deno-filters.md"},l=a(`

Deno Filters

Deno is a new age javascript/typescript runtime with first class typescript support.

Installing Deno

Before you can run deno filters, you will need to install Deno.

Running Deno code as Filter

The syntax for running a deno filter is this:

json
{
+import{_ as e,c as n,o as s,a}from"./app.1d293fe1.js";const F=JSON.parse('{"title":"Deno Filters","description":"","frontmatter":{"title":"Deno Filters"},"headers":[{"level":2,"title":"Installing Deno","slug":"installing-deno","link":"#installing-deno","children":[]},{"level":2,"title":"Running Deno code as Filter","slug":"running-deno-code-as-filter","link":"#running-deno-code-as-filter","children":[]},{"level":2,"title":"Requirements and Dependencies","slug":"requirements-and-dependencies","link":"#requirements-and-dependencies","children":[]}],"relativePath":"guide/deno-filters.md","lastUpdated":1724328020000}'),t={name:"guide/deno-filters.md"},l=a(`

Deno Filters

Deno is a new age javascript/typescript runtime with first class typescript support.

Installing Deno

Before you can run deno filters, you will need to install Deno.

Running Deno code as Filter

The syntax for running a deno filter is this:

json
{
   "runWith": "deno",
   "script": "./filters/example.ts"
 }
diff --git a/assets/guide_deno-filters.md.10212684.lean.js b/assets/guide_deno-filters.md.baefd136.lean.js
similarity index 83%
rename from assets/guide_deno-filters.md.10212684.lean.js
rename to assets/guide_deno-filters.md.baefd136.lean.js
index fb804347..9c156a3b 100644
--- a/assets/guide_deno-filters.md.10212684.lean.js
+++ b/assets/guide_deno-filters.md.baefd136.lean.js
@@ -1 +1 @@
-import{_ as e,c as n,o as s,a}from"./app.aed23105.js";const F=JSON.parse('{"title":"Deno Filters","description":"","frontmatter":{"title":"Deno Filters"},"headers":[{"level":2,"title":"Installing Deno","slug":"installing-deno","link":"#installing-deno","children":[]},{"level":2,"title":"Running Deno code as Filter","slug":"running-deno-code-as-filter","link":"#running-deno-code-as-filter","children":[]},{"level":2,"title":"Requirements and Dependencies","slug":"requirements-and-dependencies","link":"#requirements-and-dependencies","children":[]}],"relativePath":"guide/deno-filters.md","lastUpdated":1709465436000}'),t={name:"guide/deno-filters.md"},l=a("",9),o=[l];function r(i,p,d,c,u,D){return s(),n("div",null,o)}const y=e(t,[["render",r]]);export{F as __pageData,y as default};
+import{_ as e,c as n,o as s,a}from"./app.1d293fe1.js";const F=JSON.parse('{"title":"Deno Filters","description":"","frontmatter":{"title":"Deno Filters"},"headers":[{"level":2,"title":"Installing Deno","slug":"installing-deno","link":"#installing-deno","children":[]},{"level":2,"title":"Running Deno code as Filter","slug":"running-deno-code-as-filter","link":"#running-deno-code-as-filter","children":[]},{"level":2,"title":"Requirements and Dependencies","slug":"requirements-and-dependencies","link":"#requirements-and-dependencies","children":[]}],"relativePath":"guide/deno-filters.md","lastUpdated":1724328020000}'),t={name:"guide/deno-filters.md"},l=a("",9),o=[l];function r(i,p,d,c,u,D){return s(),n("div",null,o)}const y=e(t,[["render",r]]);export{F as __pageData,y as default};
diff --git a/assets/guide_dotnet-filters.md.ede8a1bd.js b/assets/guide_dotnet-filters.md.50872909.js
similarity index 95%
rename from assets/guide_dotnet-filters.md.ede8a1bd.js
rename to assets/guide_dotnet-filters.md.50872909.js
index 15f644d0..4368d7ab 100644
--- a/assets/guide_dotnet-filters.md.ede8a1bd.js
+++ b/assets/guide_dotnet-filters.md.50872909.js
@@ -1,4 +1,4 @@
-import{_ as n,c as s,o as a,a as t}from"./app.aed23105.js";const F=JSON.parse('{"title":".NET Filters","description":"","frontmatter":{"title":".NET Filters"},"headers":[{"level":2,"title":"Installing .NET","slug":"installing-net","link":"#installing-net","children":[]},{"level":2,"title":"Running .NET applications as Filter","slug":"running-net-applications-as-filter","link":"#running-net-applications-as-filter","children":[]}],"relativePath":"guide/dotnet-filters.md","lastUpdated":1709465436000}'),e={name:"guide/dotnet-filters.md"},l=t(`

.NET Filters

.NET filters run programs written in the .NET framework using dotnet command.

Installing .NET

Before you can run .NET filters, you will need to install .NET Runtime.

Running .NET applications as Filter

The syntax for running a .NET filter is this:

json
{
+import{_ as n,c as s,o as a,a as t}from"./app.1d293fe1.js";const F=JSON.parse('{"title":".NET Filters","description":"","frontmatter":{"title":".NET Filters"},"headers":[{"level":2,"title":"Installing .NET","slug":"installing-net","link":"#installing-net","children":[]},{"level":2,"title":"Running .NET applications as Filter","slug":"running-net-applications-as-filter","link":"#running-net-applications-as-filter","children":[]}],"relativePath":"guide/dotnet-filters.md","lastUpdated":1724328020000}'),e={name:"guide/dotnet-filters.md"},l=t(`

.NET Filters

.NET filters run programs written in the .NET framework using dotnet command.

Installing .NET

Before you can run .NET filters, you will need to install .NET Runtime.

Running .NET applications as Filter

The syntax for running a .NET filter is this:

json
{
   "runWith": "dotnet",
   "path": "./filters/example.dll"
 }
diff --git a/assets/guide_dotnet-filters.md.ede8a1bd.lean.js b/assets/guide_dotnet-filters.md.50872909.lean.js
similarity index 80%
rename from assets/guide_dotnet-filters.md.ede8a1bd.lean.js
rename to assets/guide_dotnet-filters.md.50872909.lean.js
index 9526ad8a..f3e238b3 100644
--- a/assets/guide_dotnet-filters.md.ede8a1bd.lean.js
+++ b/assets/guide_dotnet-filters.md.50872909.lean.js
@@ -1 +1 @@
-import{_ as n,c as s,o as a,a as t}from"./app.aed23105.js";const F=JSON.parse('{"title":".NET Filters","description":"","frontmatter":{"title":".NET Filters"},"headers":[{"level":2,"title":"Installing .NET","slug":"installing-net","link":"#installing-net","children":[]},{"level":2,"title":"Running .NET applications as Filter","slug":"running-net-applications-as-filter","link":"#running-net-applications-as-filter","children":[]}],"relativePath":"guide/dotnet-filters.md","lastUpdated":1709465436000}'),e={name:"guide/dotnet-filters.md"},l=t("",7),o=[l];function i(r,p,c,d,u,D){return a(),s("div",null,o)}const f=n(e,[["render",i]]);export{F as __pageData,f as default};
+import{_ as n,c as s,o as a,a as t}from"./app.1d293fe1.js";const F=JSON.parse('{"title":".NET Filters","description":"","frontmatter":{"title":".NET Filters"},"headers":[{"level":2,"title":"Installing .NET","slug":"installing-net","link":"#installing-net","children":[]},{"level":2,"title":"Running .NET applications as Filter","slug":"running-net-applications-as-filter","link":"#running-net-applications-as-filter","children":[]}],"relativePath":"guide/dotnet-filters.md","lastUpdated":1724328020000}'),e={name:"guide/dotnet-filters.md"},l=t("",7),o=[l];function i(r,p,c,d,u,D){return a(),s("div",null,o)}const f=n(e,[["render",i]]);export{F as __pageData,f as default};
diff --git a/assets/guide_exe-filters.md.975a7d24.js b/assets/guide_exe-filters.md.fc547724.js
similarity index 98%
rename from assets/guide_exe-filters.md.975a7d24.js
rename to assets/guide_exe-filters.md.fc547724.js
index 2bce67f4..715aa116 100644
--- a/assets/guide_exe-filters.md.975a7d24.js
+++ b/assets/guide_exe-filters.md.fc547724.js
@@ -1,4 +1,4 @@
-import{_ as s,c as n,o as a,a as o}from"./app.aed23105.js";const C=JSON.parse('{"title":"Executable Filters","description":"","frontmatter":{"title":"Executable Filters"},"headers":[{"level":2,"title":"Running executable as a Filter","slug":"running-executable-as-a-filter","link":"#running-executable-as-a-filter","children":[]}],"relativePath":"guide/exe-filters.md","lastUpdated":1709465436000}'),l={name:"guide/exe-filters.md"},e=o(`

Executable Filters

Exe filters allow the usage of executables.

Running executable as a Filter

If you have have achieved the feat of having one executable for all platforms (or only care about one platform), you can simply do the following:

json
{
+import{_ as s,c as n,o as a,a as o}from"./app.1d293fe1.js";const C=JSON.parse('{"title":"Executable Filters","description":"","frontmatter":{"title":"Executable Filters"},"headers":[{"level":2,"title":"Running executable as a Filter","slug":"running-executable-as-a-filter","link":"#running-executable-as-a-filter","children":[]}],"relativePath":"guide/exe-filters.md","lastUpdated":1724328020000}'),l={name:"guide/exe-filters.md"},e=o(`

Executable Filters

Exe filters allow the usage of executables.

Running executable as a Filter

If you have have achieved the feat of having one executable for all platforms (or only care about one platform), you can simply do the following:

json
{
   "runWith": "exe",
   "exe": "path/to/your/executable"
 }
diff --git a/assets/guide_exe-filters.md.975a7d24.lean.js b/assets/guide_exe-filters.md.fc547724.lean.js
similarity index 77%
rename from assets/guide_exe-filters.md.975a7d24.lean.js
rename to assets/guide_exe-filters.md.fc547724.lean.js
index d51f7274..ef662c5a 100644
--- a/assets/guide_exe-filters.md.975a7d24.lean.js
+++ b/assets/guide_exe-filters.md.fc547724.lean.js
@@ -1 +1 @@
-import{_ as s,c as n,o as a,a as o}from"./app.aed23105.js";const C=JSON.parse('{"title":"Executable Filters","description":"","frontmatter":{"title":"Executable Filters"},"headers":[{"level":2,"title":"Running executable as a Filter","slug":"running-executable-as-a-filter","link":"#running-executable-as-a-filter","children":[]}],"relativePath":"guide/exe-filters.md","lastUpdated":1709465436000}'),l={name:"guide/exe-filters.md"},e=o("",8),p=[e];function t(c,r,D,F,y,i){return a(),n("div",null,p)}const A=s(l,[["render",t]]);export{C as __pageData,A as default};
+import{_ as s,c as n,o as a,a as o}from"./app.1d293fe1.js";const C=JSON.parse('{"title":"Executable Filters","description":"","frontmatter":{"title":"Executable Filters"},"headers":[{"level":2,"title":"Running executable as a Filter","slug":"running-executable-as-a-filter","link":"#running-executable-as-a-filter","children":[]}],"relativePath":"guide/exe-filters.md","lastUpdated":1724328020000}'),l={name:"guide/exe-filters.md"},e=o("",8),p=[e];function t(c,r,D,F,y,i){return a(),n("div",null,p)}const A=s(l,[["render",t]]);export{C as __pageData,A as default};
diff --git a/assets/guide_experiments.md.0525a91a.js b/assets/guide_experiments.md.d230b08f.js
similarity index 94%
rename from assets/guide_experiments.md.0525a91a.js
rename to assets/guide_experiments.md.d230b08f.js
index fc46bdec..316d91e9 100644
--- a/assets/guide_experiments.md.0525a91a.js
+++ b/assets/guide_experiments.md.d230b08f.js
@@ -1,3 +1,3 @@
-import{_ as e,c as t,o as i,a as s}from"./app.aed23105.js";const _=JSON.parse('{"title":"Experiments","description":"","frontmatter":{"title":"Experiments"},"headers":[{"level":2,"title":"Currently Available Experiments","slug":"currently-available-experiments","link":"#currently-available-experiments","children":[{"level":3,"title":"size_time_check","slug":"size-time-check","link":"#size-time-check","children":[]}]}],"relativePath":"guide/experiments.md","lastUpdated":1709465436000}'),a={name:"guide/experiments.md"},n=s(`

Experiments

Experiments are new experimental features of Regolith to be released in the future versions, once proven to be stable and useful. The experiments can be enabled with the --experiments flag.

Currently Available Experiments

size_time_check

The size_time_check is an experiment that aims to speed up regolith run and regolith watch commands. It achieves this by checking the size and modification time of the files before moving them between working and output directories. If the source file is the same size and has the same modification time as the destination file, the target file will remain untouched (Regolith assumes that the files are the same).

The size_time_check should greatly speed up the exports of large projects.

The downside of this approach is that on the first run, the export will be slower, but on subsequent runs, the export will be much faster. This means that the size_time_check is not recommended for CI where Regolith is run only once.

Usage:

regolith run --experiments size_time_check
+import{_ as e,c as t,o as i,a as s}from"./app.1d293fe1.js";const _=JSON.parse('{"title":"Experiments","description":"","frontmatter":{"title":"Experiments"},"headers":[{"level":2,"title":"Currently Available Experiments","slug":"currently-available-experiments","link":"#currently-available-experiments","children":[{"level":3,"title":"size_time_check","slug":"size-time-check","link":"#size-time-check","children":[]}]}],"relativePath":"guide/experiments.md","lastUpdated":1724328020000}'),a={name:"guide/experiments.md"},n=s(`

Experiments

Experiments are new experimental features of Regolith to be released in the future versions, once proven to be stable and useful. The experiments can be enabled with the --experiments flag.

Currently Available Experiments

size_time_check

The size_time_check is an experiment that aims to speed up regolith run and regolith watch commands. It achieves this by checking the size and modification time of the files before moving them between working and output directories. If the source file is the same size and has the same modification time as the destination file, the target file will remain untouched (Regolith assumes that the files are the same).

The size_time_check should greatly speed up the exports of large projects.

The downside of this approach is that on the first run, the export will be slower, but on subsequent runs, the export will be much faster. This means that the size_time_check is not recommended for CI where Regolith is run only once.

Usage:

regolith run --experiments size_time_check
 regolith watch --experiments size_time_check
 
`,9),r=[n];function c(o,l,h,p,d,m){return i(),t("div",null,r)}const f=e(a,[["render",c]]);export{_ as __pageData,f as default}; diff --git a/assets/guide_experiments.md.0525a91a.lean.js b/assets/guide_experiments.md.d230b08f.lean.js similarity index 80% rename from assets/guide_experiments.md.0525a91a.lean.js rename to assets/guide_experiments.md.d230b08f.lean.js index b72d12c2..65ce83bc 100644 --- a/assets/guide_experiments.md.0525a91a.lean.js +++ b/assets/guide_experiments.md.d230b08f.lean.js @@ -1 +1 @@ -import{_ as e,c as t,o as i,a as s}from"./app.aed23105.js";const _=JSON.parse('{"title":"Experiments","description":"","frontmatter":{"title":"Experiments"},"headers":[{"level":2,"title":"Currently Available Experiments","slug":"currently-available-experiments","link":"#currently-available-experiments","children":[{"level":3,"title":"size_time_check","slug":"size-time-check","link":"#size-time-check","children":[]}]}],"relativePath":"guide/experiments.md","lastUpdated":1709465436000}'),a={name:"guide/experiments.md"},n=s("",9),r=[n];function c(o,l,h,p,d,m){return i(),t("div",null,r)}const f=e(a,[["render",c]]);export{_ as __pageData,f as default}; +import{_ as e,c as t,o as i,a as s}from"./app.1d293fe1.js";const _=JSON.parse('{"title":"Experiments","description":"","frontmatter":{"title":"Experiments"},"headers":[{"level":2,"title":"Currently Available Experiments","slug":"currently-available-experiments","link":"#currently-available-experiments","children":[{"level":3,"title":"size_time_check","slug":"size-time-check","link":"#size-time-check","children":[]}]}],"relativePath":"guide/experiments.md","lastUpdated":1724328020000}'),a={name:"guide/experiments.md"},n=s("",9),r=[n];function c(o,l,h,p,d,m){return i(),t("div",null,r)}const f=e(a,[["render",c]]);export{_ as __pageData,f as default}; diff --git a/assets/guide_export-targets.md.3b0cbc83.js b/assets/guide_export-targets.md.0af28945.js similarity index 67% rename from assets/guide_export-targets.md.3b0cbc83.js rename to assets/guide_export-targets.md.0af28945.js index 34661dc4..6ab8b9b9 100644 --- a/assets/guide_export-targets.md.3b0cbc83.js +++ b/assets/guide_export-targets.md.0af28945.js @@ -1,8 +1,10 @@ -import{_ as s,c as o,o as e,a}from"./app.aed23105.js";const u=JSON.parse('{"title":"Export Targets","description":"","frontmatter":{"title":"Export Targets"},"headers":[{"level":2,"title":"readOnly","slug":"readonly","link":"#readonly","children":[]},{"level":2,"title":"Additional Configuration for Non-Windows Users","slug":"additional-configuration-for-non-windows-users","link":"#additional-configuration-for-non-windows-users","children":[]},{"level":2,"title":"Development","slug":"development","link":"#development","children":[]},{"level":2,"title":"Local","slug":"local","link":"#local","children":[]},{"level":2,"title":"Exact","slug":"exact","link":"#exact","children":[]},{"level":2,"title":"World","slug":"world","link":"#world","children":[]},{"level":2,"title":"Preview","slug":"preview","link":"#preview","children":[]}],"relativePath":"guide/export-targets.md","lastUpdated":1709465436000}'),n={name:"guide/export-targets.md"},l=a(`

Export Targets

Export Targets determine where your generated files will go, after Regolith is finished compiling. You can set this target at the top level of Regolith, but it can be overridden inside individual profiles, if needed.

Export is an object, and the keys inside determine how it will function. The target key is required, but some export targets require additional keys.

Configuration

Some configuration properties may be used with all export targets.

readOnly

readOnly changes the permissions of exported files to read-only. The default value is false. This property can be used to protect against accidental editing of files that should only be edited by Regolith!

Additional Configuration for Non-Windows Users

Some of the export targets listed below wouldn't make sense on systems other than Windows with Minecraft installed. They often rely on finding the com.mojang path first, and then placing the files in a path relative to that. This problem can be solved by setting environment variables that Regolith will use instead of the com.mojang path.

  • COM_MOJANG_PREVIEW - A fake path to the com.mojang folder in Minecraft preview releases. This is used by the preview export target.
  • COM_MOJANG - A fake path to the com.mojang folder in regular Minecraft releases.

Export Targets

These are the export targets that Regolith offers.

Development

The development export target will place the compiled packs into your com.mojang development_*_packs folders.

json
"export": {
-    "target": "development"
+import{_ as s,c as o,o as a,a as e}from"./app.1d293fe1.js";const u=JSON.parse('{"title":"Export Targets","description":"","frontmatter":{"title":"Export Targets"},"headers":[{"level":2,"title":"readOnly","slug":"readonly","link":"#readonly","children":[]},{"level":2,"title":"Additional Configuration for Non-Windows Users","slug":"additional-configuration-for-non-windows-users","link":"#additional-configuration-for-non-windows-users","children":[]},{"level":2,"title":"Development","slug":"development","link":"#development","children":[]},{"level":2,"title":"Local","slug":"local","link":"#local","children":[]},{"level":2,"title":"Exact","slug":"exact","link":"#exact","children":[]},{"level":2,"title":"World","slug":"world","link":"#world","children":[]}],"relativePath":"guide/export-targets.md","lastUpdated":1724328020000}'),n={name:"guide/export-targets.md"},l=e(`

Export Targets

Export Targets determine where your generated files will go, after Regolith is finished compiling. You can set this target at the top level of Regolith, but it can be overridden inside individual profiles, if needed.

Export is an object, and the keys inside determine how it will function. The target key is required, but some export targets require additional keys.

Configuration

Some configuration properties may be used with all export targets.

readOnly

readOnly changes the permissions of exported files to read-only. The default value is false. This property can be used to protect against accidental editing of files that should only be edited by Regolith!

Additional Configuration for Non-Windows Users

Some of the export targets listed below wouldn't make sense on systems other than Windows with Minecraft installed. They often rely on finding the com.mojang path first, and then placing the files in a path relative to that. This problem can be solved by setting environment variables that Regolith will use instead of the com.mojang path.

  • COM_MOJANG_PREVIEW - A fake path to the com.mojang folder in Minecraft preview releases. This is used by the preview export target.
  • COM_MOJANG - A fake path to the com.mojang folder in regular Minecraft releases.

Export Targets

These are the export targets that Regolith offers.

Development

The development export target will place the compiled packs into your com.mojang development_*_packs folders of the specified Minecraft build (standard, preview or education endition).

json
"export": {
+    "target": "development",
+    "build": "standard" // or "preview" or "education"
 }
 

Optionally, you can use rpName and bpName to specify the names of the folders that will be created in the development_*_packs folders. You can read more about these options at the end of this page of the documentation.

json
"export": {
     "target": "development",
+    "build": "standard",
     "rpName": "'my_rp'",
     "bpName": "'my_bp'"
 }
@@ -19,8 +21,9 @@ import{_ as s,c as o,o as e,a}from"./app.aed23105.js";const u=JSON.parse('{"titl
     "rpPath": "...",
     "bpPath": "...
 }
-

The exact export target doesn't support using rpName and bpName. The rpPath and bpPath should provide full paths to the desired locations.

World

The World export target will place the compiled files into a specific world. This is useful for teams that prefer working in-world, as opposed to in the development pack folders.

You need to use either worldName or worldPath to select the world. worldPath supports environment variables by using the %VARIABLE_NAME% syntax.

Example:

json
"export": {
+

The exact export target doesn't support using rpName and bpName. The rpPath and bpPath should provide full paths to the desired locations.

World

The World export target will place the compiled files into a specific world. This is useful for teams that prefer working in-world, as opposed to in the development pack folders.

You need to use either worldName or worldPath to select the world. worldPath supports environment variables by using the %VARIABLE_NAME% syntax. If you use worldName, you have to specify the Minecraft build you're using - standard, preview or education.

Example:

json
"export": {
     "target": "world",
+    "build": "standard",
     "worldName": "..."  // This
     // "worldPath": "..."   // OR this
 }
@@ -30,12 +33,4 @@ import{_ as s,c as o,o as e,a}from"./app.aed23105.js";const u=JSON.parse('{"titl
     "rpName": "'my_rp'",
     "bpName": "'my_bp'"
 }
-

Preview

The development export target will place the compiled packs into your (minecraft preview) com.mojang development_*_packs folder.

json
"export": {
-    "target": "preview"
-}
-

Optionally, you can use rpName and bpName to specify the names of the folders that will be created in the development_*_packs folders. You can read more about these options at the end of this page of the documentation.

json
"export": {
-    "target": "preview",
-    "rpName": "'my_rp'",
-    "bpName": "'my_bp'"
-}
-

The rpName and bpName expressions

The rpName and bpName are expressions evaulated using the go-simple-eval library. They let you specify the names of the folders of the exported packs in some of the export targets.

The go-simple-eval library allows you to use simple expressions to generate the names of the folders. The expressions can use the following variables:

  • project.name - The name of the project.
  • project.author - The author of the project.
  • os - The host operating system.
  • arch - The host architecture.
  • debug - whether regolith is running in debug mode or not.
  • version - The version of regolith.
  • profile - The name of the profile being run.

Go-simple-eval can concatenate strings using the + operator. The strings must be enclosed in single quotes.

`,45),p=[l];function t(r,c,i,D,d,y){return e(),o("div",null,p)}const h=s(n,[["render",t]]);export{u as __pageData,h as default}; +

The rpName and bpName expressions

The rpName and bpName are expressions evaulated using the go-simple-eval library. They let you specify the names of the folders of the exported packs in some of the export targets.

The go-simple-eval library allows you to use simple expressions to generate the names of the folders. The expressions can use the following variables:

  • project.name - The name of the project.
  • project.author - The author of the project.
  • os - The host operating system.
  • arch - The host architecture.
  • debug - whether regolith is running in debug mode or not.
  • version - The version of regolith.
  • profile - The name of the profile being run.

Go-simple-eval can concatenate strings using the + operator. The strings must be enclosed in single quotes.

`,40),t=[l];function p(r,c,i,d,D,y){return a(),o("div",null,t)}const h=s(n,[["render",p]]);export{u as __pageData,h as default}; diff --git a/assets/guide_export-targets.md.0af28945.lean.js b/assets/guide_export-targets.md.0af28945.lean.js new file mode 100644 index 00000000..44ee984c --- /dev/null +++ b/assets/guide_export-targets.md.0af28945.lean.js @@ -0,0 +1 @@ +import{_ as s,c as o,o as a,a as e}from"./app.1d293fe1.js";const u=JSON.parse('{"title":"Export Targets","description":"","frontmatter":{"title":"Export Targets"},"headers":[{"level":2,"title":"readOnly","slug":"readonly","link":"#readonly","children":[]},{"level":2,"title":"Additional Configuration for Non-Windows Users","slug":"additional-configuration-for-non-windows-users","link":"#additional-configuration-for-non-windows-users","children":[]},{"level":2,"title":"Development","slug":"development","link":"#development","children":[]},{"level":2,"title":"Local","slug":"local","link":"#local","children":[]},{"level":2,"title":"Exact","slug":"exact","link":"#exact","children":[]},{"level":2,"title":"World","slug":"world","link":"#world","children":[]}],"relativePath":"guide/export-targets.md","lastUpdated":1724328020000}'),n={name:"guide/export-targets.md"},l=e("",40),t=[l];function p(r,c,i,d,D,y){return a(),o("div",null,t)}const h=s(n,[["render",p]]);export{u as __pageData,h as default}; diff --git a/assets/guide_export-targets.md.3b0cbc83.lean.js b/assets/guide_export-targets.md.3b0cbc83.lean.js deleted file mode 100644 index 9fda21f9..00000000 --- a/assets/guide_export-targets.md.3b0cbc83.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as s,c as o,o as e,a}from"./app.aed23105.js";const u=JSON.parse('{"title":"Export Targets","description":"","frontmatter":{"title":"Export Targets"},"headers":[{"level":2,"title":"readOnly","slug":"readonly","link":"#readonly","children":[]},{"level":2,"title":"Additional Configuration for Non-Windows Users","slug":"additional-configuration-for-non-windows-users","link":"#additional-configuration-for-non-windows-users","children":[]},{"level":2,"title":"Development","slug":"development","link":"#development","children":[]},{"level":2,"title":"Local","slug":"local","link":"#local","children":[]},{"level":2,"title":"Exact","slug":"exact","link":"#exact","children":[]},{"level":2,"title":"World","slug":"world","link":"#world","children":[]},{"level":2,"title":"Preview","slug":"preview","link":"#preview","children":[]}],"relativePath":"guide/export-targets.md","lastUpdated":1709465436000}'),n={name:"guide/export-targets.md"},l=a("",45),p=[l];function t(r,c,i,D,d,y){return e(),o("div",null,p)}const h=s(n,[["render",t]]);export{u as __pageData,h as default}; diff --git a/assets/guide_filter-run-modes.md.642fffbe.js b/assets/guide_filter-run-modes.md.224efeb8.js similarity index 95% rename from assets/guide_filter-run-modes.md.642fffbe.js rename to assets/guide_filter-run-modes.md.224efeb8.js index bc4e3c5d..838fb579 100644 --- a/assets/guide_filter-run-modes.md.642fffbe.js +++ b/assets/guide_filter-run-modes.md.224efeb8.js @@ -1,4 +1,4 @@ -import{_ as e,c as o,o as t,a}from"./app.aed23105.js";const m=JSON.parse('{"title":"Filter Run Modes","description":"","frontmatter":{"title":"Filter Run Modes"},"headers":[{"level":2,"title":"Run and Watch Commands","slug":"run-and-watch-commands","link":"#run-and-watch-commands","children":[]},{"level":2,"title":"Apply-Filter Command - Running Regolith Destructively","slug":"apply-filter-command-running-regolith-destructively","link":"#apply-filter-command-running-regolith-destructively","children":[]}],"relativePath":"guide/filter-run-modes.md","lastUpdated":1709465436000}'),n={name:"guide/filter-run-modes.md"},i=a(`

Filter Run Modes

There are 3 ways of running Regolith:

  • regolith run
  • regolith watch
  • regolith apply-filter

Run and Watch Commands

Regolith run and watch are very similar to each other. They run a profile. The difference is that the watch command will watch for changes in the RP, BP and data folders and rerun the profile when they change. The run command will run the profile only once.

The syntax for run and watch command is:

regolith run [profile-name]
+import{_ as e,c as o,o as t,a}from"./app.1d293fe1.js";const m=JSON.parse('{"title":"Filter Run Modes","description":"","frontmatter":{"title":"Filter Run Modes"},"headers":[{"level":2,"title":"Run and Watch Commands","slug":"run-and-watch-commands","link":"#run-and-watch-commands","children":[]},{"level":2,"title":"Apply-Filter Command - Running Regolith Destructively","slug":"apply-filter-command-running-regolith-destructively","link":"#apply-filter-command-running-regolith-destructively","children":[]}],"relativePath":"guide/filter-run-modes.md","lastUpdated":1724328020000}'),n={name:"guide/filter-run-modes.md"},i=a(`

Filter Run Modes

There are 3 ways of running Regolith:

  • regolith run
  • regolith watch
  • regolith apply-filter

Run and Watch Commands

Regolith run and watch are very similar to each other. They run a profile. The difference is that the watch command will watch for changes in the RP, BP and data folders and rerun the profile when they change. The run command will run the profile only once.

The syntax for run and watch command is:

regolith run [profile-name]
 
regolith watch [profile-name]
 

Where [profile-name] is the name of the profile defined your "config.json" file you want to run. The [profile-name] is optional. If you don't specify it, the "default" profile will be run.

A single run performs the following steps:

  1. Copy your source files into a temporary folder.
  2. Runs all of the filters of the profile.
  3. Moves the files to the target location defined in the "export" property of the profile.

Filters work on the copies of RP, BP, and data. Thanks to the use of copies, RP and BP cannot be modified by the filters. The data folder can be modified because after a successful run Regolith moves the files of the copy to the the original data folder (this is useful for the filters so that they can store some data between runs).

Apply-Filter Command - Running Regolith Destructively

Running Regolith with regolith run or regolith watch is a safe operation because the filters can only modify the data folder but not RP and BP. Sometimes you want to modify the RP and BP directly in a destructive way. This is where the apply-filter command come in handy. You can apply any filter by running the regolith apply-filter command. Unlike the regolith run command, the regolith apply-filter command runs only one filter instead of running entire profile.

The command is used like this:

regolith apply-filter <filter-name> [args...]
 

The filter-name is the name of one of the filters installed in your project. The args is a list of arguments passed to the filter.

`,17),l=[i];function s(r,d,c,h,p,u){return t(),o("div",null,l)}const g=e(n,[["render",s]]);export{m as __pageData,g as default}; diff --git a/assets/guide_filter-run-modes.md.642fffbe.lean.js b/assets/guide_filter-run-modes.md.224efeb8.lean.js similarity index 74% rename from assets/guide_filter-run-modes.md.642fffbe.lean.js rename to assets/guide_filter-run-modes.md.224efeb8.lean.js index 23ed4226..d4cc36a0 100644 --- a/assets/guide_filter-run-modes.md.642fffbe.lean.js +++ b/assets/guide_filter-run-modes.md.224efeb8.lean.js @@ -1 +1 @@ -import{_ as e,c as o,o as t,a}from"./app.aed23105.js";const m=JSON.parse('{"title":"Filter Run Modes","description":"","frontmatter":{"title":"Filter Run Modes"},"headers":[{"level":2,"title":"Run and Watch Commands","slug":"run-and-watch-commands","link":"#run-and-watch-commands","children":[]},{"level":2,"title":"Apply-Filter Command - Running Regolith Destructively","slug":"apply-filter-command-running-regolith-destructively","link":"#apply-filter-command-running-regolith-destructively","children":[]}],"relativePath":"guide/filter-run-modes.md","lastUpdated":1709465436000}'),n={name:"guide/filter-run-modes.md"},i=a("",17),l=[i];function s(r,d,c,h,p,u){return t(),o("div",null,l)}const g=e(n,[["render",s]]);export{m as __pageData,g as default}; +import{_ as e,c as o,o as t,a}from"./app.1d293fe1.js";const m=JSON.parse('{"title":"Filter Run Modes","description":"","frontmatter":{"title":"Filter Run Modes"},"headers":[{"level":2,"title":"Run and Watch Commands","slug":"run-and-watch-commands","link":"#run-and-watch-commands","children":[]},{"level":2,"title":"Apply-Filter Command - Running Regolith Destructively","slug":"apply-filter-command-running-regolith-destructively","link":"#apply-filter-command-running-regolith-destructively","children":[]}],"relativePath":"guide/filter-run-modes.md","lastUpdated":1724328020000}'),n={name:"guide/filter-run-modes.md"},i=a("",17),l=[i];function s(r,d,c,h,p,u){return t(),o("div",null,l)}const g=e(n,[["render",s]]);export{m as __pageData,g as default}; diff --git a/assets/guide_filters.md.51e1a196.js b/assets/guide_filters.md.7fe7484f.js similarity index 89% rename from assets/guide_filters.md.51e1a196.js rename to assets/guide_filters.md.7fe7484f.js index 71be7165..e94a0d79 100644 --- a/assets/guide_filters.md.51e1a196.js +++ b/assets/guide_filters.md.7fe7484f.js @@ -1 +1 @@ -import{_ as t,c as e,o as a,a as r}from"./app.aed23105.js";const m=JSON.parse('{"title":"Filters","description":"","frontmatter":{"title":"Filters"},"headers":[],"relativePath":"guide/filters.md","lastUpdated":1709465436000}'),i={name:"guide/filters.md"},o=r('

Filters Introduction

A filter is any program or script that takes the files inside of your RP and BP and transforms them in some way. Many of these filters have already been written, and are included as part of the standard library. You may also be interested in community filters

At it's core, you can think of a filter as the ability to run arbitrary code during the compilation process. This allows you to accomplish a number of tasks:

  • Linting and error checking
  • Code generation/automation
  • Interpreting custom syntax
',4),n=[o];function s(l,d,c,f,h,_){return a(),e("div",null,n)}const p=t(i,[["render",s]]);export{m as __pageData,p as default}; +import{_ as t,c as e,o as a,a as r}from"./app.1d293fe1.js";const m=JSON.parse('{"title":"Filters","description":"","frontmatter":{"title":"Filters"},"headers":[],"relativePath":"guide/filters.md","lastUpdated":1724328020000}'),i={name:"guide/filters.md"},o=r('

Filters Introduction

A filter is any program or script that takes the files inside of your RP and BP and transforms them in some way. Many of these filters have already been written, and are included as part of the standard library. You may also be interested in community filters

At it's core, you can think of a filter as the ability to run arbitrary code during the compilation process. This allows you to accomplish a number of tasks:

  • Linting and error checking
  • Code generation/automation
  • Interpreting custom syntax
',4),n=[o];function s(l,d,c,f,h,_){return a(),e("div",null,n)}const p=t(i,[["render",s]]);export{m as __pageData,p as default}; diff --git a/assets/guide_filters.md.51e1a196.lean.js b/assets/guide_filters.md.7fe7484f.lean.js similarity index 67% rename from assets/guide_filters.md.51e1a196.lean.js rename to assets/guide_filters.md.7fe7484f.lean.js index 139e6518..60067103 100644 --- a/assets/guide_filters.md.51e1a196.lean.js +++ b/assets/guide_filters.md.7fe7484f.lean.js @@ -1 +1 @@ -import{_ as t,c as e,o as a,a as r}from"./app.aed23105.js";const m=JSON.parse('{"title":"Filters","description":"","frontmatter":{"title":"Filters"},"headers":[],"relativePath":"guide/filters.md","lastUpdated":1709465436000}'),i={name:"guide/filters.md"},o=r("",4),n=[o];function s(l,d,c,f,h,_){return a(),e("div",null,n)}const p=t(i,[["render",s]]);export{m as __pageData,p as default}; +import{_ as t,c as e,o as a,a as r}from"./app.1d293fe1.js";const m=JSON.parse('{"title":"Filters","description":"","frontmatter":{"title":"Filters"},"headers":[],"relativePath":"guide/filters.md","lastUpdated":1724328020000}'),i={name:"guide/filters.md"},o=r("",4),n=[o];function s(l,d,c,f,h,_){return a(),e("div",null,n)}const p=t(i,[["render",s]]);export{m as __pageData,p as default}; diff --git a/assets/guide_getting-started.md.c4c0e323.js b/assets/guide_getting-started.md.5146c5e8.js similarity index 86% rename from assets/guide_getting-started.md.c4c0e323.js rename to assets/guide_getting-started.md.5146c5e8.js index 53248802..ab26ec04 100644 --- a/assets/guide_getting-started.md.c4c0e323.js +++ b/assets/guide_getting-started.md.5146c5e8.js @@ -1,4 +1,4 @@ -import{_ as e}from"./chunks/project_folder.ffe44ce8.js";import{_ as s,c as o,o as a,a as n}from"./app.aed23105.js";const l="/regolith/introduction/project_folder2.png",f=JSON.parse('{"title":"Getting Started","description":"Learn how to use Regolith.","frontmatter":{"title":"Getting Started","description":"Learn how to use Regolith."},"headers":[{"level":2,"title":"Creating a new Project","slug":"creating-a-new-project","link":"#creating-a-new-project","children":[]},{"level":2,"title":"Config file","slug":"config-file","link":"#config-file","children":[]},{"level":2,"title":"Creating your Addon","slug":"creating-your-addon","link":"#creating-your-addon","children":[]},{"level":2,"title":"Running Regolith","slug":"running-regolith","link":"#running-regolith","children":[]},{"level":2,"title":"Adding your first Filter","slug":"adding-your-first-filter","link":"#adding-your-first-filter","children":[{"level":3,"title":"Installing","slug":"installing","link":"#installing","children":[]},{"level":3,"title":"Running","slug":"running","link":"#running","children":[]}]},{"level":2,"title":"Whats Next","slug":"whats-next","link":"#whats-next","children":[]}],"relativePath":"guide/getting-started.md","lastUpdated":1709465436000}'),t={name:"guide/getting-started.md"},r=n('

Getting Started

INFO

To get started with Regolith, you should first read our introduction page, and the installation page.

You can test for installation by running regolith inside of a terminal. This guide will assume you have installed regolith directly, but you can follow along with a stand-alone build. Just ensure that the executable is placed inside of your project folder.

If you run into issues installing, you can check our troubleshooting guide for tips.

WARNING

Regolith is a command line application. It assumes some familiarity with how to navigate and use the command line. You can get a refresher here.

Creating a new Project

To create a new project, navigate to a blank folder, and run regolith init. This will create a few files:

In short:

  • .regolith is a special folder that regolith uses to store data. You don't need to look here.
  • packs/BP stores your behavior pack.
  • packs/RP stores your resource pack.
  • packs/data is a special folder that filters can use to store data.
  • config.json is the configuration file for Regolith.
  • .gitignore is a file which tells Git source control to ignore certain files. It's not a partof of Regolith but we highly recommend using Git to manage your projects.

Config file

Next, open up config.json. We will be configuring a few fields here, for your addon.

json
{
+import{_ as s}from"./chunks/project_folder.ffe44ce8.js";import{_ as e,c as o,o as a,a as n}from"./app.1d293fe1.js";const l="/regolith/introduction/project_folder2.png",f=JSON.parse('{"title":"Getting Started","description":"Learn how to use Regolith.","frontmatter":{"title":"Getting Started","description":"Learn how to use Regolith."},"headers":[{"level":2,"title":"Creating a new Project","slug":"creating-a-new-project","link":"#creating-a-new-project","children":[]},{"level":2,"title":"Config file","slug":"config-file","link":"#config-file","children":[]},{"level":2,"title":"Creating your Addon","slug":"creating-your-addon","link":"#creating-your-addon","children":[]},{"level":2,"title":"Running Regolith","slug":"running-regolith","link":"#running-regolith","children":[]},{"level":2,"title":"Adding your first Filter","slug":"adding-your-first-filter","link":"#adding-your-first-filter","children":[{"level":3,"title":"Installing","slug":"installing","link":"#installing","children":[]},{"level":3,"title":"Running","slug":"running","link":"#running","children":[]}]},{"level":2,"title":"Whats Next","slug":"whats-next","link":"#whats-next","children":[]}],"relativePath":"guide/getting-started.md","lastUpdated":1724328020000}'),t={name:"guide/getting-started.md"},r=n('

Getting Started

INFO

To get started with Regolith, you should first read our introduction page, and the installation page.

You can test for installation by running regolith inside of a terminal. This guide will assume you have installed regolith directly, but you can follow along with a stand-alone build. Just ensure that the executable is placed inside of your project folder.

If you run into issues installing, you can check our troubleshooting guide for tips.

WARNING

Regolith is a command line application. It assumes some familiarity with how to navigate and use the command line. You can get a refresher here.

Creating a new Project

To create a new project, navigate to a blank folder, and run regolith init. This will create a few files:

In short:

  • .regolith is a special folder that regolith uses to store data. You don't need to look here.
  • packs/BP stores your behavior pack.
  • packs/RP stores your resource pack.
  • packs/data is a special folder that filters can use to store data.
  • config.json is the configuration file for Regolith.
  • .gitignore is a file which tells Git source control to ignore certain files. It's not a partof of Regolith but we highly recommend using Git to manage your projects.

Config file

Next, open up config.json. We will be configuring a few fields here, for your addon.

json
{
   "name": "Project name", // Enter your pack name here. (Example: spooky_gravestones)
   "author": "Your name",  // Enter your author name here. (example: SirLich)
   "packs": {
@@ -11,6 +11,7 @@ import{_ as e}from"./chunks/project_folder.ffe44ce8.js";import{_ as s,c as o,o a
         "filters": [],
         "export": {
           "target": "development",
+          "build": "standard",
           "readOnly": false
         }
       }
@@ -22,7 +23,8 @@ import{_ as e}from"./chunks/project_folder.ffe44ce8.js";import{_ as s,c as o,o a
 

Later on you can play with the additional configuration options, but for now, just set a project name, and author name.

TIP

We suggest using a name like dragons or cars for the project name, as opposed to My Dragon Adventure Map, since the project name will be used as the folder name for the final export if you're using the "development" export target.

Creating your Addon

At this point, you will want to add some files into your regolith project. If you have an existing project, you can copy/paste the files into the RP (resource pack) and BP (behavior pack) folders.

If you don't have an addon prepared, you may also create a fresh one directly in your project folder, following the normal rules. Add a manifest.json, a pack_icon.png, and any other files you want. The files should go directly into the RP and BP folders, like this:

Running Regolith

There are two ways of running Regolith profiles regolith run and regolith watch. They both run a profile defined in config.json file.

The regolith run [profile-name] command runs provided profile once. If you don't specify a profile, it will run the profile named "default".

The regolith watch [profile-name] command works the same as regolith run, but it will watch your source files and rerun the profile when they change. If you're using regolith run you have to do it manually every time.

By default the export is set to "development", which means that the files will be copied to the development_behavior_packs and development_resource_packs folders of com.mojang. The names of folders created in this export mode are based on the name of the project like project_name_bp and project_name_rp.

Adding your first Filter

Regolith contains a very powerful filter system, that allows you to write filters in many languages, as well as running existing filters from the internet. For now, we will simply use the standard library, which is a set of approved filters that we maintain.

As an example, we will use the texture_list filter, which automatically creates the texture_list.json file for you. To learn more about this file, and why automating it is helpful, read here.

Installing

WARNING

The install command relies on git. You may download git here.

You can install this filter by running regolith install texture_list, which will make the filter available for use.

The last step is selecting where/when the filter will run. In our case, we want to run the filter every time we export using the default default profile.

You should adjust the default profile in config.json to look like this:

json
"default": {
   "export": {
     "readOnly": false,
-    "target": "development"
+    "target": "development",
+    "build": "standard"
   },
   "filters": [
     {
@@ -30,4 +32,4 @@ import{_ as e}from"./chunks/project_folder.ffe44ce8.js";import{_ as s,c as o,o a
     }
   ]
 }
-

Running

Now, you can re-run regolith run.

Check com.mojang, and open the new texture_list.json file in RP/textures/texture_list.json. Every time you run regolith, this file will be re-created, based on your current textures. No need to manually edit it ever again!

{: .notice--warning} Warning: If your resource pack already contains texture_list.json, you should delete it. You don't need to manually worry about it anymore - Regolith will handle it!

{: .notice--warning} Warning: If your project doesn't have any textures, than texture_list.json will simply create a blank file []. Consider adding some textures to see the filter at work!

Whats Next

Now that you've created your first Regolith project, and installed your first filters, you are well on your way to being a Regolith expert! You should check out the standard library, to see if additional filters might be useful for you.

Otherwise, you can learn about writing custom filters or dive deeper into Regolith commands by reading about Filter Run Modes and Installing and Updating Filters.

`,41),p=[r];function i(c,d,u,y,D,h){return a(),o("div",null,p)}const C=s(t,[["render",i]]);export{f as __pageData,C as default}; +

Running

Now, you can re-run regolith run.

Check com.mojang, and open the new texture_list.json file in RP/textures/texture_list.json. Every time you run regolith, this file will be re-created, based on your current textures. No need to manually edit it ever again!

WARNING

Warning: If your resource pack already contains texture_list.json, you should delete it. You don't need to manually worry about it anymore - Regolith will handle it!

WARNING

Warning: If your project doesn't have any textures, than texture_list.json will simply create a blank file []. Consider adding some textures to see the filter at work!

Whats Next

Now that you've created your first Regolith project, and installed your first filters, you are well on your way to being a Regolith expert! You should check out the standard library, to see if additional filters might be useful for you.

Otherwise, you can learn about writing custom filters or dive deeper into Regolith commands by reading about Filter Run Modes and Installing and Updating Filters.

`,41),p=[r];function c(i,d,u,y,D,h){return a(),o("div",null,p)}const C=e(t,[["render",c]]);export{f as __pageData,C as default}; diff --git a/assets/guide_getting-started.md.c4c0e323.lean.js b/assets/guide_getting-started.md.5146c5e8.lean.js similarity index 77% rename from assets/guide_getting-started.md.c4c0e323.lean.js rename to assets/guide_getting-started.md.5146c5e8.lean.js index ee00d84e..80aeff58 100644 --- a/assets/guide_getting-started.md.c4c0e323.lean.js +++ b/assets/guide_getting-started.md.5146c5e8.lean.js @@ -1 +1 @@ -import{_ as e}from"./chunks/project_folder.ffe44ce8.js";import{_ as s,c as o,o as a,a as n}from"./app.aed23105.js";const l="/regolith/introduction/project_folder2.png",f=JSON.parse('{"title":"Getting Started","description":"Learn how to use Regolith.","frontmatter":{"title":"Getting Started","description":"Learn how to use Regolith."},"headers":[{"level":2,"title":"Creating a new Project","slug":"creating-a-new-project","link":"#creating-a-new-project","children":[]},{"level":2,"title":"Config file","slug":"config-file","link":"#config-file","children":[]},{"level":2,"title":"Creating your Addon","slug":"creating-your-addon","link":"#creating-your-addon","children":[]},{"level":2,"title":"Running Regolith","slug":"running-regolith","link":"#running-regolith","children":[]},{"level":2,"title":"Adding your first Filter","slug":"adding-your-first-filter","link":"#adding-your-first-filter","children":[{"level":3,"title":"Installing","slug":"installing","link":"#installing","children":[]},{"level":3,"title":"Running","slug":"running","link":"#running","children":[]}]},{"level":2,"title":"Whats Next","slug":"whats-next","link":"#whats-next","children":[]}],"relativePath":"guide/getting-started.md","lastUpdated":1709465436000}'),t={name:"guide/getting-started.md"},r=n("",41),p=[r];function i(c,d,u,y,D,h){return a(),o("div",null,p)}const C=s(t,[["render",i]]);export{f as __pageData,C as default}; +import{_ as s}from"./chunks/project_folder.ffe44ce8.js";import{_ as e,c as o,o as a,a as n}from"./app.1d293fe1.js";const l="/regolith/introduction/project_folder2.png",f=JSON.parse('{"title":"Getting Started","description":"Learn how to use Regolith.","frontmatter":{"title":"Getting Started","description":"Learn how to use Regolith."},"headers":[{"level":2,"title":"Creating a new Project","slug":"creating-a-new-project","link":"#creating-a-new-project","children":[]},{"level":2,"title":"Config file","slug":"config-file","link":"#config-file","children":[]},{"level":2,"title":"Creating your Addon","slug":"creating-your-addon","link":"#creating-your-addon","children":[]},{"level":2,"title":"Running Regolith","slug":"running-regolith","link":"#running-regolith","children":[]},{"level":2,"title":"Adding your first Filter","slug":"adding-your-first-filter","link":"#adding-your-first-filter","children":[{"level":3,"title":"Installing","slug":"installing","link":"#installing","children":[]},{"level":3,"title":"Running","slug":"running","link":"#running","children":[]}]},{"level":2,"title":"Whats Next","slug":"whats-next","link":"#whats-next","children":[]}],"relativePath":"guide/getting-started.md","lastUpdated":1724328020000}'),t={name:"guide/getting-started.md"},r=n("",41),p=[r];function c(i,d,u,y,D,h){return a(),o("div",null,p)}const C=e(t,[["render",c]]);export{f as __pageData,C as default}; diff --git a/assets/guide_installing-filters.md.c714d1ea.js b/assets/guide_installing-filters.md.bc241757.js similarity index 62% rename from assets/guide_installing-filters.md.c714d1ea.js rename to assets/guide_installing-filters.md.bc241757.js index 1ddc6bba..91a6465c 100644 --- a/assets/guide_installing-filters.md.c714d1ea.js +++ b/assets/guide_installing-filters.md.bc241757.js @@ -1,9 +1,10 @@ -import{_ as e,c as l,o as n,a as s}from"./app.aed23105.js";const g=JSON.parse('{"title":"Installing and Updating Filters","description":"","frontmatter":{"title":"Installing and Updating Filters"},"headers":[{"level":2,"title":"Filter Dependencies","slug":"filter-dependencies","link":"#filter-dependencies","children":[]},{"level":2,"title":"Installing a Filter","slug":"installing-a-filter","link":"#installing-a-filter","children":[]},{"level":2,"title":"Adding Filter to Profile","slug":"adding-filter-to-profile","link":"#adding-filter-to-profile","children":[]},{"level":2,"title":"Install All","slug":"install-all","link":"#install-all","children":[]},{"level":2,"title":"Filter Versioning","slug":"filter-versioning","link":"#filter-versioning","children":[{"level":3,"title":"Installing a Specific Version","slug":"installing-a-specific-version","link":"#installing-a-specific-version","children":[]},{"level":3,"title":"Pinned Versions","slug":"pinned-versions","link":"#pinned-versions","children":[]},{"level":3,"title":"Updating your Filters","slug":"updating-your-filters","link":"#updating-your-filters","children":[]},{"level":3,"title":"Updating resolvers","slug":"updating-resolvers","link":"#updating-resolvers","children":[]},{"level":3,"title":"Updating filter cache","slug":"updating-filter-cache","link":"#updating-filter-cache","children":[]}]}],"relativePath":"guide/installing-filters.md","lastUpdated":1709465436000}'),a={name:"guide/installing-filters.md"},t=s(`

Installing and Updating Filters

To start using a filter, you need to do four things:

  1. Ensure you can run the filter
  2. Install the filter
  3. Add the filter to the profile which you would like to use it.
  4. Run your profile, to test it out!

Filter Dependencies

Filters are written in programming languages. These languages may not be installed on your computer by default. Before installing a filter, you should ensure you have the proper programming language installed. The "Filter Types" documentation has detailed installation instructions for every regolith-supported language!

For example, if the filter relies on Python, you can find installation instructions here.

Installing a Filter

Regolith contains a powerful installation command, which will download a filter from GitHub, and install any required libraries for you. In general, the format is like this: regolith install <filter_identifier>

The value of filter_identifier will depend on where the filter is hosted. Filters listed on the Bedrock-OSS/regolith-filter-resolver repository can be installed by their name. For example, to install the name_ninja filter, you would run the:

regolith install name_ninja
+import{_ as e,c as l,o as s,a as n}from"./app.1d293fe1.js";const g=JSON.parse('{"title":"Installing and Updating Filters","description":"","frontmatter":{"title":"Installing and Updating Filters"},"headers":[{"level":2,"title":"Filter Dependencies","slug":"filter-dependencies","link":"#filter-dependencies","children":[]},{"level":2,"title":"Installing a Filter","slug":"installing-a-filter","link":"#installing-a-filter","children":[]},{"level":2,"title":"Adding Filter to Profile","slug":"adding-filter-to-profile","link":"#adding-filter-to-profile","children":[]},{"level":2,"title":"Install All","slug":"install-all","link":"#install-all","children":[]},{"level":2,"title":"Filter Versioning","slug":"filter-versioning","link":"#filter-versioning","children":[{"level":3,"title":"Installing a Specific Version","slug":"installing-a-specific-version","link":"#installing-a-specific-version","children":[]},{"level":3,"title":"Pinned Versions","slug":"pinned-versions","link":"#pinned-versions","children":[]},{"level":3,"title":"Updating your Filters","slug":"updating-your-filters","link":"#updating-your-filters","children":[]},{"level":3,"title":"Updating resolvers","slug":"updating-resolvers","link":"#updating-resolvers","children":[]},{"level":3,"title":"Updating filter cache","slug":"updating-filter-cache","link":"#updating-filter-cache","children":[]}]}],"relativePath":"guide/installing-filters.md","lastUpdated":1724328020000}'),a={name:"guide/installing-filters.md"},t=n(`

Installing and Updating Filters

To start using a filter, you need to do four things:

  1. Ensure you can run the filter
  2. Install the filter
  3. Add the filter to the profile which you would like to use it.
  4. Run your profile, to test it out!

Filter Dependencies

Filters are written in programming languages. These languages may not be installed on your computer by default. Before installing a filter, you should ensure you have the proper programming language installed. The "Filter Types" documentation has detailed installation instructions for every regolith-supported language!

For example, if the filter relies on Python, you can find installation instructions here.

Installing a Filter

Regolith contains a powerful installation command, which will download a filter from GitHub, and install any required libraries for you. In general, the format is like this: regolith install <filter_identifier>

The value of filter_identifier will depend on where the filter is hosted. Filters listed on the Bedrock-OSS/regolith-filter-resolver repository can be installed by their name. For example, to install the name_ninja filter, you would run the:

regolith install name_ninja
 

If the filter is not listed on the resolver repository, you will need to use the following format: github.com/<user>/<repository>/<folder>.

For example, to install name_ninja using the full format, you would run:

regolith install github.com/Bedrock-OSS/regolith-filters/name_ninja
 

The longer form can be used to install filters from private repositories.

WARNING

The install command relies on git. You may download git here.

Adding Filter to Profile

After installing, the filter will appear inside of filter_definitions of config.json. You can now add this filter to a profile like this:

json
"default": {
   "export": {
     "readOnly": false,
-    "target": "development"
+    "target": "development",
+    "build": "standard"
   },
   "filters": [
     {
@@ -11,9 +12,10 @@ import{_ as e,c as l,o as n,a as s}from"./app.aed23105.js";const g=JSON.parse('{
     }
   ]
 }
-

Install All

Regolith is intended to be used with git version control, and by default the .regolith folder is ignored. That means that when you collaborate on a project, or simply re-clone your existing projects, you will need an easy way to download all the filters again!

You may use the command regolith install-all, which will check config.json, and install every filter in the filterDefinitions.

{: .notice--warning} This is only intended to be used with existing projects. To install new filters, use regolith install.

Filter Versioning

Filters in Regolith are optionally versioned with a semantic version. As filters get updated, new versions will be released, and you can optionally update.

{: .notice--warning} If you don't specify a version, the install command will pick a sensible default. First, it will search for the latest release. If that doesn't exist (such as a filter that has no versions), it will select the latest commit in the repository. In both cases, the installed version will be pinned.

Installing a Specific Version

When installing, you can optionally include a version key after two equals signs (==):

  • \u2B50 Version: regolith install name_ninja==1.2.8
  • Unpinned Head: regolith install name_ninja==HEAD
  • Unpinned Latest: regolith install name_ninja==latest
  • SHA: regolith install name_ninja==adf506df267d10189b6edcdfeec6c560247b823f

Pinned Versions

In your config.json, every filter will include a version field, which specifies which version of the filter to use. By default, this version will be pinned, meaning that it won't be updated, even if new versions release. This provides you safety, and ensures that your projects will continue to operate without interruption even if filters release breaking changes.

Optionally, you may mark filters as unpinned, which signifies that your project wants the latest version of the filter, no questions asked. There are two available unpinned versions:

  • latest points to the latest released version tag.
  • HEAD points to the latest commit of the repository, regardless of release tags.

Updating your Filters

If you want to update the version of the filter used in your project, you can use the regolith install command again. By default, the install command is not allowed to update existing filters, but you can use the --update or --force flag to change this behavior. The flag must be used after the install arguments.

regolith install name_ninja --update
-

Alternatively, you can modify the version field in config.json and run regolith install-all. Regolith install-all is useful for working in a team, when other team members may have to update or add filters to the project.

Updating resolvers

When using short names for filters, Regolith uses a resolver file from a remote repository to determine the URL of the filter. By default, this remote repository is cached and only updated after 5 minutes since last update. If you want to update the resolver file immediately, you can use the regolith update-resolver command.

Alternatively, you can use the --force-resolver-update flag to force the resolvers to update when installing a filter.

regolith install name_ninja --force-resolver-update
+

Install All

Regolith is intended to be used with git version control, and by default the .regolith folder is ignored. That means that when you collaborate on a project, or simply re-clone your existing projects, you will need an easy way to download all the filters again!

You may use the command regolith install-all, which will check config.json, and install every filter in the filterDefinitions.

WARNING

This is only intended to be used with existing projects. To install new filters, use regolith install.

Filter Versioning

Filters in Regolith are optionally versioned with a semantic version. As filters get updated, new versions will be released, and you can optionally update.

WARNING

If you don't specify a version, the install command will pick a sensible default. First, it will search for the latest release. If that doesn't exist (such as a filter that has no versions), it will select the latest commit in the repository. In both cases, the installed version will be pinned.

Installing a Specific Version

When installing, you can optionally include a version key after two equals signs (==):

  • \u2B50 Version: regolith install name_ninja==1.2.8
  • Unpinned Head: regolith install name_ninja==HEAD
  • Unpinned Latest: regolith install name_ninja==latest
  • SHA: regolith install name_ninja==adf506df267d10189b6edcdfeec6c560247b823f

Pinned Versions

In your config.json, every filter will include a version field, which specifies which version of the filter to use. By default, this version will be pinned, meaning that it won't be updated, even if new versions release. This provides you safety, and ensures that your projects will continue to operate without interruption even if filters release breaking changes.

Optionally, you may mark filters as unpinned, which signifies that your project wants the latest version of the filter, no questions asked. There are two available unpinned versions:

  • latest points to the latest released version tag.
  • HEAD points to the latest commit of the repository, regardless of release tags.

Updating your Filters

If you want to update the version of the filter used in your project, you can use the regolith install command again. By default, the install command is not allowed to update existing filters, but you can use the --update or --force flag to change this behavior. The flag must be used after the install arguments.

regolith install name_ninja --update
+

Alternatively, you can modify the version field in config.json and run regolith install-all. Regolith install-all is useful for working in a team, when other team members may have to update or add filters to the project.

If you want to update all filters in your project, you can use the --update flag with the install-all command.

regolith install-all --update
+

Updating resolvers

When using short names for filters, Regolith uses a resolver file from a remote repository to determine the URL of the filter. By default, this remote repository is cached and only updated after 5 minutes since last update. If you want to update the resolver file immediately, you can use the regolith update-resolver command.

Alternatively, you can use the --force-resolver-update flag to force the resolvers to update when installing a filter.

regolith install name_ninja --force-resolver-update
 

Updating filter cache

Regolith caches the filter repository when you install online filters. To avoid unnecessary frequent updates, Regolith skips them for installations that occur less than 5 minutes after the last update. However, if you need to update the cache immediately, you can use the --force-filter-update flag while installing a filter.

bash
regolith install name_ninja --force-filter-update
 # OR
 regolith install-all --force-filter-update
-
`,43),i=[t];function o(r,p,c,d,h,u){return n(),l("div",null,i)}const y=e(a,[["render",o]]);export{g as __pageData,y as default}; +
`,45),o=[t];function i(r,p,c,d,h,u){return s(),l("div",null,o)}const y=e(a,[["render",i]]);export{g as __pageData,y as default}; diff --git a/assets/guide_installing-filters.md.c714d1ea.lean.js b/assets/guide_installing-filters.md.bc241757.lean.js similarity index 84% rename from assets/guide_installing-filters.md.c714d1ea.lean.js rename to assets/guide_installing-filters.md.bc241757.lean.js index 46773e12..ed564c5f 100644 --- a/assets/guide_installing-filters.md.c714d1ea.lean.js +++ b/assets/guide_installing-filters.md.bc241757.lean.js @@ -1 +1 @@ -import{_ as e,c as l,o as n,a as s}from"./app.aed23105.js";const g=JSON.parse('{"title":"Installing and Updating Filters","description":"","frontmatter":{"title":"Installing and Updating Filters"},"headers":[{"level":2,"title":"Filter Dependencies","slug":"filter-dependencies","link":"#filter-dependencies","children":[]},{"level":2,"title":"Installing a Filter","slug":"installing-a-filter","link":"#installing-a-filter","children":[]},{"level":2,"title":"Adding Filter to Profile","slug":"adding-filter-to-profile","link":"#adding-filter-to-profile","children":[]},{"level":2,"title":"Install All","slug":"install-all","link":"#install-all","children":[]},{"level":2,"title":"Filter Versioning","slug":"filter-versioning","link":"#filter-versioning","children":[{"level":3,"title":"Installing a Specific Version","slug":"installing-a-specific-version","link":"#installing-a-specific-version","children":[]},{"level":3,"title":"Pinned Versions","slug":"pinned-versions","link":"#pinned-versions","children":[]},{"level":3,"title":"Updating your Filters","slug":"updating-your-filters","link":"#updating-your-filters","children":[]},{"level":3,"title":"Updating resolvers","slug":"updating-resolvers","link":"#updating-resolvers","children":[]},{"level":3,"title":"Updating filter cache","slug":"updating-filter-cache","link":"#updating-filter-cache","children":[]}]}],"relativePath":"guide/installing-filters.md","lastUpdated":1709465436000}'),a={name:"guide/installing-filters.md"},t=s("",43),i=[t];function o(r,p,c,d,h,u){return n(),l("div",null,i)}const y=e(a,[["render",o]]);export{g as __pageData,y as default}; +import{_ as e,c as l,o as s,a as n}from"./app.1d293fe1.js";const g=JSON.parse('{"title":"Installing and Updating Filters","description":"","frontmatter":{"title":"Installing and Updating Filters"},"headers":[{"level":2,"title":"Filter Dependencies","slug":"filter-dependencies","link":"#filter-dependencies","children":[]},{"level":2,"title":"Installing a Filter","slug":"installing-a-filter","link":"#installing-a-filter","children":[]},{"level":2,"title":"Adding Filter to Profile","slug":"adding-filter-to-profile","link":"#adding-filter-to-profile","children":[]},{"level":2,"title":"Install All","slug":"install-all","link":"#install-all","children":[]},{"level":2,"title":"Filter Versioning","slug":"filter-versioning","link":"#filter-versioning","children":[{"level":3,"title":"Installing a Specific Version","slug":"installing-a-specific-version","link":"#installing-a-specific-version","children":[]},{"level":3,"title":"Pinned Versions","slug":"pinned-versions","link":"#pinned-versions","children":[]},{"level":3,"title":"Updating your Filters","slug":"updating-your-filters","link":"#updating-your-filters","children":[]},{"level":3,"title":"Updating resolvers","slug":"updating-resolvers","link":"#updating-resolvers","children":[]},{"level":3,"title":"Updating filter cache","slug":"updating-filter-cache","link":"#updating-filter-cache","children":[]}]}],"relativePath":"guide/installing-filters.md","lastUpdated":1724328020000}'),a={name:"guide/installing-filters.md"},t=n("",45),o=[t];function i(r,p,c,d,h,u){return s(),l("div",null,o)}const y=e(a,[["render",i]]);export{g as __pageData,y as default}; diff --git a/assets/guide_installing.md.8bfe7d87.js b/assets/guide_installing.md.4fa9e584.js similarity index 97% rename from assets/guide_installing.md.8bfe7d87.js rename to assets/guide_installing.md.4fa9e584.js index 085bc542..6abdc84f 100644 --- a/assets/guide_installing.md.8bfe7d87.js +++ b/assets/guide_installing.md.4fa9e584.js @@ -1,4 +1,4 @@ -import{_ as e,c as n,o as i,a as t}from"./app.aed23105.js";const a="/regolith/installing/msi_download.png",l="/regolith/installing/regolith_msi.png",s="/regolith/installing/exe_download.png",o="/regolith/installing/regolith_help.png",y=JSON.parse('{"title":"Installing","description":"","frontmatter":{"title":"Installing"},"headers":[{"level":2,"title":"Windows Installation Using winget","slug":"windows-installation-using-winget","link":"#windows-installation-using-winget","children":[]},{"level":2,"title":"Windows Installation Using an .msi File","slug":"windows-installation-using-an-msi-file","link":"#windows-installation-using-an-msi-file","children":[{"level":3,"title":"Installation","slug":"installation","link":"#installation","children":[]}]},{"level":2,"title":"Linux, Mac, and Windows (stand-alone)","slug":"linux-mac-and-windows-stand-alone","link":"#linux-mac-and-windows-stand-alone","children":[]},{"level":2,"title":"Checking Installation","slug":"checking-installation","link":"#checking-installation","children":[]}],"relativePath":"guide/installing.md","lastUpdated":1709465436000}'),d={name:"guide/installing.md"},c=t(`

Installing

Windows Installation Using winget

INFO

Not every Windows computer has winget installed. If this is the case for your computer, you can install Regolith using the MSI file available on GitHub (see next section for instructions).

To install the application "Regolith" using winget, follow these steps:

  1. Open a command prompt or terminal window and enter the following command:
winget install Bedrock-OSS.regolith
+import{_ as e,c as n,o as i,a as t}from"./app.1d293fe1.js";const a="/regolith/installing/msi_download.png",l="/regolith/installing/regolith_msi.png",s="/regolith/installing/exe_download.png",o="/regolith/installing/regolith_help.png",y=JSON.parse('{"title":"Installing","description":"","frontmatter":{"title":"Installing"},"headers":[{"level":2,"title":"Windows Installation Using winget","slug":"windows-installation-using-winget","link":"#windows-installation-using-winget","children":[]},{"level":2,"title":"Windows Installation Using an .msi File","slug":"windows-installation-using-an-msi-file","link":"#windows-installation-using-an-msi-file","children":[{"level":3,"title":"Installation","slug":"installation","link":"#installation","children":[]}]},{"level":2,"title":"Linux, Mac, and Windows (stand-alone)","slug":"linux-mac-and-windows-stand-alone","link":"#linux-mac-and-windows-stand-alone","children":[]},{"level":2,"title":"Checking Installation","slug":"checking-installation","link":"#checking-installation","children":[]}],"relativePath":"guide/installing.md","lastUpdated":1724328020000}'),d={name:"guide/installing.md"},c=t(`

Installing

Windows Installation Using winget

INFO

Not every Windows computer has winget installed. If this is the case for your computer, you can install Regolith using the MSI file available on GitHub (see next section for instructions).

To install the application "Regolith" using winget, follow these steps:

  1. Open a command prompt or terminal window and enter the following command:
winget install Bedrock-OSS.regolith
 

This will search the winget repository for the package "Bedrock-OSS.regolith" and install it on your system.

  1. If the installation is successful, you should see a message indicating that the package has been installed.

To update Regolith in the future, simply run the following command:

winget upgrade Bedrock-OSS.regolith
 

This will check for any available updates to the Regolith package and install them on your system.

Windows Installation Using an .msi File

Installation

Alternatively, you can install Regolith using the MSI file available on GitHub at the following link: https://github.com/Bedrock-OSS/regolith/releases/latest. The file will be named using the pattern regolith-x.x.x.msi, where x.x.x is the version number. To install Regolith using the MSI file, follow these steps:

Download the MSI file from the link above.

Run the MSI file to begin the installation process. Follow the prompts to complete the installation.

Updates

To update Regolith after installation, you can use the "regolith-update.ps1" PowerShell script that is included with the installation. To run the script, follow these steps:

  1. Open a PowerShell window.
  2. Run the following command:
regolith-update.ps1
 

This will check for any available updates to Regolith and install them on your system.

Linux, Mac, and Windows (stand-alone)

Regolith can also be installed stand-alone. Simply install the correct zip for your operating system. For Windows, this is most likely regolith_x.x.x_Windows_x86_64.zip.

You may unzip this package, and place the regolith.exe file somewhere convenient. In stand-alone mode, you will need a copy of the regolith executable in every project that you intend to use Regolith with. Or, you can add the executable to your PATH environment variable.

Checking Installation

After installing, Regolith can be used in any command-prompt by typing regolith. You should see something like this:

',30),r=[c];function h(p,g,u,w,m,f){return i(),n("div",null,r)}const b=e(d,[["render",h]]);export{y as __pageData,b as default}; diff --git a/assets/guide_installing.md.8bfe7d87.lean.js b/assets/guide_installing.md.4fa9e584.lean.js similarity index 89% rename from assets/guide_installing.md.8bfe7d87.lean.js rename to assets/guide_installing.md.4fa9e584.lean.js index 003b9203..e7cceed7 100644 --- a/assets/guide_installing.md.8bfe7d87.lean.js +++ b/assets/guide_installing.md.4fa9e584.lean.js @@ -1 +1 @@ -import{_ as e,c as n,o as i,a as t}from"./app.aed23105.js";const a="/regolith/installing/msi_download.png",l="/regolith/installing/regolith_msi.png",s="/regolith/installing/exe_download.png",o="/regolith/installing/regolith_help.png",y=JSON.parse('{"title":"Installing","description":"","frontmatter":{"title":"Installing"},"headers":[{"level":2,"title":"Windows Installation Using winget","slug":"windows-installation-using-winget","link":"#windows-installation-using-winget","children":[]},{"level":2,"title":"Windows Installation Using an .msi File","slug":"windows-installation-using-an-msi-file","link":"#windows-installation-using-an-msi-file","children":[{"level":3,"title":"Installation","slug":"installation","link":"#installation","children":[]}]},{"level":2,"title":"Linux, Mac, and Windows (stand-alone)","slug":"linux-mac-and-windows-stand-alone","link":"#linux-mac-and-windows-stand-alone","children":[]},{"level":2,"title":"Checking Installation","slug":"checking-installation","link":"#checking-installation","children":[]}],"relativePath":"guide/installing.md","lastUpdated":1709465436000}'),d={name:"guide/installing.md"},c=t("",30),r=[c];function h(p,g,u,w,m,f){return i(),n("div",null,r)}const b=e(d,[["render",h]]);export{y as __pageData,b as default}; +import{_ as e,c as n,o as i,a as t}from"./app.1d293fe1.js";const a="/regolith/installing/msi_download.png",l="/regolith/installing/regolith_msi.png",s="/regolith/installing/exe_download.png",o="/regolith/installing/regolith_help.png",y=JSON.parse('{"title":"Installing","description":"","frontmatter":{"title":"Installing"},"headers":[{"level":2,"title":"Windows Installation Using winget","slug":"windows-installation-using-winget","link":"#windows-installation-using-winget","children":[]},{"level":2,"title":"Windows Installation Using an .msi File","slug":"windows-installation-using-an-msi-file","link":"#windows-installation-using-an-msi-file","children":[{"level":3,"title":"Installation","slug":"installation","link":"#installation","children":[]}]},{"level":2,"title":"Linux, Mac, and Windows (stand-alone)","slug":"linux-mac-and-windows-stand-alone","link":"#linux-mac-and-windows-stand-alone","children":[]},{"level":2,"title":"Checking Installation","slug":"checking-installation","link":"#checking-installation","children":[]}],"relativePath":"guide/installing.md","lastUpdated":1724328020000}'),d={name:"guide/installing.md"},c=t("",30),r=[c];function h(p,g,u,w,m,f){return i(),n("div",null,r)}const b=e(d,[["render",h]]);export{y as __pageData,b as default}; diff --git a/assets/guide_java-filters.md.f4796a6f.js b/assets/guide_java-filters.md.d2627c90.js similarity index 96% rename from assets/guide_java-filters.md.f4796a6f.js rename to assets/guide_java-filters.md.d2627c90.js index ae43c7c8..0eacca47 100644 --- a/assets/guide_java-filters.md.f4796a6f.js +++ b/assets/guide_java-filters.md.d2627c90.js @@ -1,4 +1,4 @@ -import{_ as a,c as e,o as n,a as s}from"./app.aed23105.js";const v=JSON.parse('{"title":"Java Filters","description":"","frontmatter":{"title":"Java Filters"},"headers":[{"level":2,"title":"Installing Java","slug":"installing-java","link":"#installing-java","children":[]},{"level":2,"title":"Running Java applications as Filter","slug":"running-java-applications-as-filter","link":"#running-java-applications-as-filter","children":[]},{"level":2,"title":"Dependencies","slug":"dependencies","link":"#dependencies","children":[]}],"relativePath":"guide/java-filters.md","lastUpdated":1709465436000}'),l={name:"guide/java-filters.md"},t=s(`

Java Filters

Java is a high-level compiled language, that runs inside the Java Virtual Machine.

Installing Java

Before you can run Java filters, you will need to install Java Development Kit.

There are many available JDKs to choose from. Few recommended are:

Running Java applications as Filter

The syntax for running a java jar is this:

json
{
+import{_ as a,c as e,o as n,a as s}from"./app.1d293fe1.js";const v=JSON.parse('{"title":"Java Filters","description":"","frontmatter":{"title":"Java Filters"},"headers":[{"level":2,"title":"Installing Java","slug":"installing-java","link":"#installing-java","children":[]},{"level":2,"title":"Running Java applications as Filter","slug":"running-java-applications-as-filter","link":"#running-java-applications-as-filter","children":[]},{"level":2,"title":"Dependencies","slug":"dependencies","link":"#dependencies","children":[]}],"relativePath":"guide/java-filters.md","lastUpdated":1724328020000}'),l={name:"guide/java-filters.md"},t=s(`

Java Filters

Java is a high-level compiled language, that runs inside the Java Virtual Machine.

Installing Java

Before you can run Java filters, you will need to install Java Development Kit.

There are many available JDKs to choose from. Few recommended are:

Running Java applications as Filter

The syntax for running a java jar is this:

json
{
   "runWith": "java",
   "script": "./filters/example.jar"
 }
diff --git a/assets/guide_java-filters.md.f4796a6f.lean.js b/assets/guide_java-filters.md.d2627c90.lean.js
similarity index 83%
rename from assets/guide_java-filters.md.f4796a6f.lean.js
rename to assets/guide_java-filters.md.d2627c90.lean.js
index ff711af9..1ed2f8e4 100644
--- a/assets/guide_java-filters.md.f4796a6f.lean.js
+++ b/assets/guide_java-filters.md.d2627c90.lean.js
@@ -1 +1 @@
-import{_ as a,c as e,o as n,a as s}from"./app.aed23105.js";const v=JSON.parse('{"title":"Java Filters","description":"","frontmatter":{"title":"Java Filters"},"headers":[{"level":2,"title":"Installing Java","slug":"installing-java","link":"#installing-java","children":[]},{"level":2,"title":"Running Java applications as Filter","slug":"running-java-applications-as-filter","link":"#running-java-applications-as-filter","children":[]},{"level":2,"title":"Dependencies","slug":"dependencies","link":"#dependencies","children":[]}],"relativePath":"guide/java-filters.md","lastUpdated":1709465436000}'),l={name:"guide/java-filters.md"},t=s("",11),i=[t];function r(o,p,c,d,h,u){return n(),e("div",null,i)}const f=a(l,[["render",r]]);export{v as __pageData,f as default};
+import{_ as a,c as e,o as n,a as s}from"./app.1d293fe1.js";const v=JSON.parse('{"title":"Java Filters","description":"","frontmatter":{"title":"Java Filters"},"headers":[{"level":2,"title":"Installing Java","slug":"installing-java","link":"#installing-java","children":[]},{"level":2,"title":"Running Java applications as Filter","slug":"running-java-applications-as-filter","link":"#running-java-applications-as-filter","children":[]},{"level":2,"title":"Dependencies","slug":"dependencies","link":"#dependencies","children":[]}],"relativePath":"guide/java-filters.md","lastUpdated":1724328020000}'),l={name:"guide/java-filters.md"},t=s("",11),i=[t];function r(o,p,c,d,h,u){return n(),e("div",null,i)}const f=a(l,[["render",r]]);export{v as __pageData,f as default};
diff --git a/assets/guide_local-filters.md.45f46edd.js b/assets/guide_local-filters.md.cef79b3a.js
similarity index 93%
rename from assets/guide_local-filters.md.45f46edd.js
rename to assets/guide_local-filters.md.cef79b3a.js
index 5d22475c..fb0039c4 100644
--- a/assets/guide_local-filters.md.45f46edd.js
+++ b/assets/guide_local-filters.md.cef79b3a.js
@@ -1,4 +1,4 @@
-import{_ as s,c as a,o,a as l}from"./app.aed23105.js";const _=JSON.parse('{"title":"Local Filters","description":"","frontmatter":{"title":"Local Filters"},"headers":[],"relativePath":"guide/local-filters.md","lastUpdated":1709465436000}'),t={name:"guide/local-filters.md"},e=l(`

Local Filters

Local filters are great for quickly prototyping, or for personal filters that you do not want to share with anyone. In this case, you can simply run a local file:

json
{
+import{_ as s,c as a,o,a as l}from"./app.1d293fe1.js";const _=JSON.parse('{"title":"Local Filters","description":"","frontmatter":{"title":"Local Filters"},"headers":[],"relativePath":"guide/local-filters.md","lastUpdated":1724328020000}'),t={name:"guide/local-filters.md"},e=l(`

Local Filters

Local filters are great for quickly prototyping, or for personal filters that you do not want to share with anyone. In this case, you can simply run a local file:

json
{
     "runWith": "python",
     "script": "./filters/example.py"
 }
diff --git a/assets/guide_local-filters.md.45f46edd.lean.js b/assets/guide_local-filters.md.cef79b3a.lean.js
similarity index 68%
rename from assets/guide_local-filters.md.45f46edd.lean.js
rename to assets/guide_local-filters.md.cef79b3a.lean.js
index a017a29c..7f5036e7 100644
--- a/assets/guide_local-filters.md.45f46edd.lean.js
+++ b/assets/guide_local-filters.md.cef79b3a.lean.js
@@ -1 +1 @@
-import{_ as s,c as a,o,a as l}from"./app.aed23105.js";const _=JSON.parse('{"title":"Local Filters","description":"","frontmatter":{"title":"Local Filters"},"headers":[],"relativePath":"guide/local-filters.md","lastUpdated":1709465436000}'),t={name:"guide/local-filters.md"},e=l("",4),n=[e];function p(c,r,i,D,y,F){return o(),a("div",null,n)}const u=s(t,[["render",p]]);export{_ as __pageData,u as default};
+import{_ as s,c as a,o,a as l}from"./app.1d293fe1.js";const _=JSON.parse('{"title":"Local Filters","description":"","frontmatter":{"title":"Local Filters"},"headers":[],"relativePath":"guide/local-filters.md","lastUpdated":1724328020000}'),t={name:"guide/local-filters.md"},e=l("",4),n=[e];function p(c,r,i,D,y,F){return o(),a("div",null,n)}const u=s(t,[["render",p]]);export{_ as __pageData,u as default};
diff --git a/assets/guide_nim-filters.md.46fd9cd8.js b/assets/guide_nim-filters.md.718757c4.js
similarity index 96%
rename from assets/guide_nim-filters.md.46fd9cd8.js
rename to assets/guide_nim-filters.md.718757c4.js
index a1b7d1fe..4a2cb872 100644
--- a/assets/guide_nim-filters.md.46fd9cd8.js
+++ b/assets/guide_nim-filters.md.718757c4.js
@@ -1,4 +1,4 @@
-import{_ as e,c as n,o as s,a}from"./app.aed23105.js";const D=JSON.parse('{"title":"Nim Filters","description":"","frontmatter":{"title":"Nim Filters"},"headers":[{"level":2,"title":"Installing Nim","slug":"installing-nim","link":"#installing-nim","children":[]},{"level":2,"title":"Running Nim code as Filter","slug":"running-nim-code-as-filter","link":"#running-nim-code-as-filter","children":[]},{"level":2,"title":"Requirements and Dependencies","slug":"requirements-and-dependencies","link":"#requirements-and-dependencies","children":[]}],"relativePath":"guide/nim-filters.md","lastUpdated":1709465436000}'),l={name:"guide/nim-filters.md"},t=a(`

Nim Filters

Nim is a statically typed compiled systems programming language. It combines successful concepts from mature languages like Python, Ada and Modula.

Installing Nim

  1. Download the newest version of choosenim.
  2. Open a terminal in the same directory that you downloaded choosenim.
  3. Run choosenim --firstInstall

Running Nim code as Filter

The syntax for running a nim filter is this:

json
{
+import{_ as e,c as n,o as s,a}from"./app.1d293fe1.js";const D=JSON.parse('{"title":"Nim Filters","description":"","frontmatter":{"title":"Nim Filters"},"headers":[{"level":2,"title":"Installing Nim","slug":"installing-nim","link":"#installing-nim","children":[]},{"level":2,"title":"Running Nim code as Filter","slug":"running-nim-code-as-filter","link":"#running-nim-code-as-filter","children":[]},{"level":2,"title":"Requirements and Dependencies","slug":"requirements-and-dependencies","link":"#requirements-and-dependencies","children":[]}],"relativePath":"guide/nim-filters.md","lastUpdated":1724328020000}'),l={name:"guide/nim-filters.md"},t=a(`

Nim Filters

Nim is a statically typed compiled systems programming language. It combines successful concepts from mature languages like Python, Ada and Modula.

Installing Nim

  1. Download the newest version of choosenim.
  2. Open a terminal in the same directory that you downloaded choosenim.
  3. Run choosenim --firstInstall

Running Nim code as Filter

The syntax for running a nim filter is this:

json
{
   "runWith": "nim",
   "script": "./filters/example.nim",
 
diff --git a/assets/guide_nim-filters.md.46fd9cd8.lean.js b/assets/guide_nim-filters.md.718757c4.lean.js
similarity index 83%
rename from assets/guide_nim-filters.md.46fd9cd8.lean.js
rename to assets/guide_nim-filters.md.718757c4.lean.js
index 0a059017..12538339 100644
--- a/assets/guide_nim-filters.md.46fd9cd8.lean.js
+++ b/assets/guide_nim-filters.md.718757c4.lean.js
@@ -1 +1 @@
-import{_ as e,c as n,o as s,a}from"./app.aed23105.js";const D=JSON.parse('{"title":"Nim Filters","description":"","frontmatter":{"title":"Nim Filters"},"headers":[{"level":2,"title":"Installing Nim","slug":"installing-nim","link":"#installing-nim","children":[]},{"level":2,"title":"Running Nim code as Filter","slug":"running-nim-code-as-filter","link":"#running-nim-code-as-filter","children":[]},{"level":2,"title":"Requirements and Dependencies","slug":"requirements-and-dependencies","link":"#requirements-and-dependencies","children":[]}],"relativePath":"guide/nim-filters.md","lastUpdated":1709465436000}'),l={name:"guide/nim-filters.md"},t=a("",10),i=[t];function o(r,p,c,d,m,h){return s(),n("div",null,i)}const y=e(l,[["render",o]]);export{D as __pageData,y as default};
+import{_ as e,c as n,o as s,a}from"./app.1d293fe1.js";const D=JSON.parse('{"title":"Nim Filters","description":"","frontmatter":{"title":"Nim Filters"},"headers":[{"level":2,"title":"Installing Nim","slug":"installing-nim","link":"#installing-nim","children":[]},{"level":2,"title":"Running Nim code as Filter","slug":"running-nim-code-as-filter","link":"#running-nim-code-as-filter","children":[]},{"level":2,"title":"Requirements and Dependencies","slug":"requirements-and-dependencies","link":"#requirements-and-dependencies","children":[]}],"relativePath":"guide/nim-filters.md","lastUpdated":1724328020000}'),l={name:"guide/nim-filters.md"},t=a("",10),i=[t];function o(r,p,c,d,m,h){return s(),n("div",null,i)}const y=e(l,[["render",o]]);export{D as __pageData,y as default};
diff --git a/assets/guide_node-filters.md.eac9db64.js b/assets/guide_node-filters.md.27170d12.js
similarity index 96%
rename from assets/guide_node-filters.md.eac9db64.js
rename to assets/guide_node-filters.md.27170d12.js
index abfd293f..aca17c5a 100644
--- a/assets/guide_node-filters.md.eac9db64.js
+++ b/assets/guide_node-filters.md.27170d12.js
@@ -1,4 +1,4 @@
-import{_ as e,c as s,o as n,a}from"./app.aed23105.js";const y=JSON.parse('{"title":"NodeJS Filters","description":"","frontmatter":{"title":"NodeJS Filters"},"headers":[{"level":2,"title":"Installing NodeJS","slug":"installing-nodejs","link":"#installing-nodejs","children":[]},{"level":2,"title":"Running NodeJS code as Filter","slug":"running-nodejs-code-as-filter","link":"#running-nodejs-code-as-filter","children":[]},{"level":2,"title":"Requirements and Dependencies","slug":"requirements-and-dependencies","link":"#requirements-and-dependencies","children":[]}],"relativePath":"guide/node-filters.md","lastUpdated":1709465436000}'),o={name:"guide/node-filters.md"},l=a(`

NodeJS Filters

As an asynchronous event-driven JavaScript runtime, Node.js is designed to build scalable network applications.

Installing NodeJS

Before you can run Node filters, you will need to install NodeJS.

Running NodeJS code as Filter

The syntax for running a nodejs filter is this:

json
{
+import{_ as e,c as s,o as n,a}from"./app.1d293fe1.js";const y=JSON.parse('{"title":"NodeJS Filters","description":"","frontmatter":{"title":"NodeJS Filters"},"headers":[{"level":2,"title":"Installing NodeJS","slug":"installing-nodejs","link":"#installing-nodejs","children":[]},{"level":2,"title":"Running NodeJS code as Filter","slug":"running-nodejs-code-as-filter","link":"#running-nodejs-code-as-filter","children":[]},{"level":2,"title":"Requirements and Dependencies","slug":"requirements-and-dependencies","link":"#requirements-and-dependencies","children":[]}],"relativePath":"guide/node-filters.md","lastUpdated":1724328020000}'),o={name:"guide/node-filters.md"},l=a(`

NodeJS Filters

As an asynchronous event-driven JavaScript runtime, Node.js is designed to build scalable network applications.

Installing NodeJS

Before you can run Node filters, you will need to install NodeJS.

Running NodeJS code as Filter

The syntax for running a nodejs filter is this:

json
{
   "runWith": "nodejs",
   "script": "./filters/example.js",
 
diff --git a/assets/guide_node-filters.md.eac9db64.lean.js b/assets/guide_node-filters.md.27170d12.lean.js
similarity index 84%
rename from assets/guide_node-filters.md.eac9db64.lean.js
rename to assets/guide_node-filters.md.27170d12.lean.js
index c4c7205a..0e372827 100644
--- a/assets/guide_node-filters.md.eac9db64.lean.js
+++ b/assets/guide_node-filters.md.27170d12.lean.js
@@ -1 +1 @@
-import{_ as e,c as s,o as n,a}from"./app.aed23105.js";const y=JSON.parse('{"title":"NodeJS Filters","description":"","frontmatter":{"title":"NodeJS Filters"},"headers":[{"level":2,"title":"Installing NodeJS","slug":"installing-nodejs","link":"#installing-nodejs","children":[]},{"level":2,"title":"Running NodeJS code as Filter","slug":"running-nodejs-code-as-filter","link":"#running-nodejs-code-as-filter","children":[]},{"level":2,"title":"Requirements and Dependencies","slug":"requirements-and-dependencies","link":"#requirements-and-dependencies","children":[]}],"relativePath":"guide/node-filters.md","lastUpdated":1709465436000}'),o={name:"guide/node-filters.md"},l=a("",10),t=[l];function r(i,p,d,c,h,u){return n(),s("div",null,t)}const F=e(o,[["render",r]]);export{y as __pageData,F as default};
+import{_ as e,c as s,o as n,a}from"./app.1d293fe1.js";const y=JSON.parse('{"title":"NodeJS Filters","description":"","frontmatter":{"title":"NodeJS Filters"},"headers":[{"level":2,"title":"Installing NodeJS","slug":"installing-nodejs","link":"#installing-nodejs","children":[]},{"level":2,"title":"Running NodeJS code as Filter","slug":"running-nodejs-code-as-filter","link":"#running-nodejs-code-as-filter","children":[]},{"level":2,"title":"Requirements and Dependencies","slug":"requirements-and-dependencies","link":"#requirements-and-dependencies","children":[]}],"relativePath":"guide/node-filters.md","lastUpdated":1724328020000}'),o={name:"guide/node-filters.md"},l=a("",10),t=[l];function r(i,p,d,c,h,u){return n(),s("div",null,t)}const F=e(o,[["render",r]]);export{y as __pageData,F as default};
diff --git a/assets/guide_online-filters.md.e514d346.js b/assets/guide_online-filters.md.349a6667.js
similarity index 98%
rename from assets/guide_online-filters.md.e514d346.js
rename to assets/guide_online-filters.md.349a6667.js
index 50fe288c..91100a5a 100644
--- a/assets/guide_online-filters.md.e514d346.js
+++ b/assets/guide_online-filters.md.349a6667.js
@@ -1,4 +1,4 @@
-import{_ as e,c as s,o as a,a as t}from"./app.aed23105.js";const u=JSON.parse('{"title":"Online Filters","description":"","frontmatter":{"title":"Online Filters"},"headers":[{"level":2,"title":"Creating Online Filter","slug":"creating-online-filter","link":"#creating-online-filter","children":[{"level":3,"title":"filter.json","slug":"filter-json","link":"#filter-json","children":[]}]},{"level":2,"title":"Data Folder","slug":"data-folder","link":"#data-folder","children":[]},{"level":2,"title":"Test Folder","slug":"test-folder","link":"#test-folder","children":[]}],"relativePath":"guide/online-filters.md","lastUpdated":1709465436000}'),o={name:"guide/online-filters.md"},n=t(`

Online Filters

Regolith allows custom filters to be placed on GitHub. This is perfect for a filter that you want to make public, or potentially share internally in a team.

The standard filters library is a good reference for how to structure an online filter, but we will also explain here.

Creating Online Filter

To create an online filter, your github project needs to be structured in a certain way. For starters, every filter needs its own folder, at the top of the github project. This folder name is very important, as it will be the name of the filter.

You should move your programs and scripts into this folder. When your filter is installed, everything in this folder will be downloaded.

filter.json

filter.json is a special file, which you should place at the top level of your filters folder. Once again, check out the standard-library for examples of a property structured regolith filter.

json
{
+import{_ as e,c as s,o as a,a as t}from"./app.1d293fe1.js";const u=JSON.parse('{"title":"Online Filters","description":"","frontmatter":{"title":"Online Filters"},"headers":[{"level":2,"title":"Creating Online Filter","slug":"creating-online-filter","link":"#creating-online-filter","children":[{"level":3,"title":"filter.json","slug":"filter-json","link":"#filter-json","children":[]}]},{"level":2,"title":"Data Folder","slug":"data-folder","link":"#data-folder","children":[]},{"level":2,"title":"Test Folder","slug":"test-folder","link":"#test-folder","children":[]}],"relativePath":"guide/online-filters.md","lastUpdated":1724328020000}'),o={name:"guide/online-filters.md"},n=t(`

Online Filters

Regolith allows custom filters to be placed on GitHub. This is perfect for a filter that you want to make public, or potentially share internally in a team.

The standard filters library is a good reference for how to structure an online filter, but we will also explain here.

Creating Online Filter

To create an online filter, your github project needs to be structured in a certain way. For starters, every filter needs its own folder, at the top of the github project. This folder name is very important, as it will be the name of the filter.

You should move your programs and scripts into this folder. When your filter is installed, everything in this folder will be downloaded.

filter.json

filter.json is a special file, which you should place at the top level of your filters folder. Once again, check out the standard-library for examples of a property structured regolith filter.

json
{
   // Description is a property which currently is not used by Regolith itself, but the web scraper uses
   // it to add descriptions to the filters page of the documentation website.
   "description": "A Hello World Filter - this will be displayed as a description on website pages.",
diff --git a/assets/guide_online-filters.md.e514d346.lean.js b/assets/guide_online-filters.md.349a6667.lean.js
similarity index 84%
rename from assets/guide_online-filters.md.e514d346.lean.js
rename to assets/guide_online-filters.md.349a6667.lean.js
index 763fec43..439e6a4b 100644
--- a/assets/guide_online-filters.md.e514d346.lean.js
+++ b/assets/guide_online-filters.md.349a6667.lean.js
@@ -1 +1 @@
-import{_ as e,c as s,o as a,a as t}from"./app.aed23105.js";const u=JSON.parse('{"title":"Online Filters","description":"","frontmatter":{"title":"Online Filters"},"headers":[{"level":2,"title":"Creating Online Filter","slug":"creating-online-filter","link":"#creating-online-filter","children":[{"level":3,"title":"filter.json","slug":"filter-json","link":"#filter-json","children":[]}]},{"level":2,"title":"Data Folder","slug":"data-folder","link":"#data-folder","children":[]},{"level":2,"title":"Test Folder","slug":"test-folder","link":"#test-folder","children":[]}],"relativePath":"guide/online-filters.md","lastUpdated":1709465436000}'),o={name:"guide/online-filters.md"},n=t("",16),l=[n];function r(i,p,c,d,h,f){return a(),s("div",null,l)}const D=e(o,[["render",r]]);export{u as __pageData,D as default};
+import{_ as e,c as s,o as a,a as t}from"./app.1d293fe1.js";const u=JSON.parse('{"title":"Online Filters","description":"","frontmatter":{"title":"Online Filters"},"headers":[{"level":2,"title":"Creating Online Filter","slug":"creating-online-filter","link":"#creating-online-filter","children":[{"level":3,"title":"filter.json","slug":"filter-json","link":"#filter-json","children":[]}]},{"level":2,"title":"Data Folder","slug":"data-folder","link":"#data-folder","children":[]},{"level":2,"title":"Test Folder","slug":"test-folder","link":"#test-folder","children":[]}],"relativePath":"guide/online-filters.md","lastUpdated":1724328020000}'),o={name:"guide/online-filters.md"},n=t("",16),l=[n];function r(i,p,c,d,h,f){return a(),s("div",null,l)}const D=e(o,[["render",r]]);export{u as __pageData,D as default};
diff --git a/assets/guide_profile-filters.md.85ba9276.js b/assets/guide_profile-filters.md.8e24024b.js
similarity index 99%
rename from assets/guide_profile-filters.md.85ba9276.js
rename to assets/guide_profile-filters.md.8e24024b.js
index 737cb381..35aff067 100644
--- a/assets/guide_profile-filters.md.85ba9276.js
+++ b/assets/guide_profile-filters.md.8e24024b.js
@@ -1,4 +1,4 @@
-import{_ as s,c as n,o as a,a as l}from"./app.aed23105.js";const A=JSON.parse('{"title":"Profile Filters","description":"","frontmatter":{"title":"Profile Filters"},"headers":[{"level":2,"title":"Running profile filter","slug":"running-profile-filter","link":"#running-profile-filter","children":[]}],"relativePath":"guide/profile-filters.md","lastUpdated":1709465436000}'),o={name:"guide/profile-filters.md"},p=l(`

Profile Filters

Profile filters are a convinient way of working with multiple profiles on one project. They save you from writing repetitive code by letting you run one filter from another. Recursive dependencies are not allowed.

Running profile filter

Unlike other filters, the profile filter doesn't need to have a filter definition. You can always use it as long as you have multiple profiles.

The syntax for running a profile is this:

json
{
+import{_ as s,c as n,o as a,a as l}from"./app.1d293fe1.js";const A=JSON.parse('{"title":"Profile Filters","description":"","frontmatter":{"title":"Profile Filters"},"headers":[{"level":2,"title":"Running profile filter","slug":"running-profile-filter","link":"#running-profile-filter","children":[]}],"relativePath":"guide/profile-filters.md","lastUpdated":1724328020000}'),o={name:"guide/profile-filters.md"},p=l(`

Profile Filters

Profile filters are a convinient way of working with multiple profiles on one project. They save you from writing repetitive code by letting you run one filter from another. Recursive dependencies are not allowed.

Running profile filter

Unlike other filters, the profile filter doesn't need to have a filter definition. You can always use it as long as you have multiple profiles.

The syntax for running a profile is this:

json
{
   "profile": "my_profile"
 }
 

Simply add that to the filters list of a profile.

Here is a complete config.json example:

json
{
diff --git a/assets/guide_profile-filters.md.85ba9276.lean.js b/assets/guide_profile-filters.md.8e24024b.lean.js
similarity index 76%
rename from assets/guide_profile-filters.md.85ba9276.lean.js
rename to assets/guide_profile-filters.md.8e24024b.lean.js
index e842eec0..9b9f3e9b 100644
--- a/assets/guide_profile-filters.md.85ba9276.lean.js
+++ b/assets/guide_profile-filters.md.8e24024b.lean.js
@@ -1 +1 @@
-import{_ as s,c as n,o as a,a as l}from"./app.aed23105.js";const A=JSON.parse('{"title":"Profile Filters","description":"","frontmatter":{"title":"Profile Filters"},"headers":[{"level":2,"title":"Running profile filter","slug":"running-profile-filter","link":"#running-profile-filter","children":[]}],"relativePath":"guide/profile-filters.md","lastUpdated":1709465436000}'),o={name:"guide/profile-filters.md"},p=l("",10),e=[p];function t(D,r,c,F,y,C){return a(),n("div",null,e)}const u=s(o,[["render",t]]);export{A as __pageData,u as default};
+import{_ as s,c as n,o as a,a as l}from"./app.1d293fe1.js";const A=JSON.parse('{"title":"Profile Filters","description":"","frontmatter":{"title":"Profile Filters"},"headers":[{"level":2,"title":"Running profile filter","slug":"running-profile-filter","link":"#running-profile-filter","children":[]}],"relativePath":"guide/profile-filters.md","lastUpdated":1724328020000}'),o={name:"guide/profile-filters.md"},p=l("",10),e=[p];function t(D,r,c,F,y,C){return a(),n("div",null,e)}const u=s(o,[["render",t]]);export{A as __pageData,u as default};
diff --git a/assets/guide_profiles.md.578dca21.js b/assets/guide_profiles.md.21650e48.js
similarity index 92%
rename from assets/guide_profiles.md.578dca21.js
rename to assets/guide_profiles.md.21650e48.js
index 7535e19d..b7b05a3e 100644
--- a/assets/guide_profiles.md.578dca21.js
+++ b/assets/guide_profiles.md.21650e48.js
@@ -1,4 +1,4 @@
-import{_ as s,c as n,o as a,a as o}from"./app.aed23105.js";const C=JSON.parse('{"title":"Profiles","description":"","frontmatter":{"title":"Profiles"},"headers":[{"level":2,"title":"Running Profiles","slug":"running-profiles","link":"#running-profiles","children":[]},{"level":2,"title":"Why Profiles?","slug":"why-profiles","link":"#why-profiles","children":[]},{"level":2,"title":"Profile Customization","slug":"profile-customization","link":"#profile-customization","children":[]}],"relativePath":"guide/profiles.md","lastUpdated":1709465436000}'),l={name:"guide/profiles.md"},p=o(`

Profiles

A profile is a collection of filters, settings, and export information. By default, a Regolith project will be initialized with a single profile, called default. You can add additional profiles, as you need them.

Running Profiles

You can use regolith run to run the default profile (default), or use regolith run <profile name> to run a specific profile

Why Profiles?

Profiles are useful for creating different run-targets.

For example, default profile may contain development focused filters, which are not desired for a final build. You can create a build or package profile, potentially with a different export target to fill this need.

You can now run regolith run default normally, and then sometimes regolith run build when you need a new final build.

Here is an example config.json with a second profile called package.

json
{
+import{_ as s,c as n,o as a,a as o}from"./app.1d293fe1.js";const C=JSON.parse('{"title":"Profiles","description":"","frontmatter":{"title":"Profiles"},"headers":[{"level":2,"title":"Running Profiles","slug":"running-profiles","link":"#running-profiles","children":[]},{"level":2,"title":"Why Profiles?","slug":"why-profiles","link":"#why-profiles","children":[]},{"level":2,"title":"Profile Customization","slug":"profile-customization","link":"#profile-customization","children":[]}],"relativePath":"guide/profiles.md","lastUpdated":1724328020000}'),l={name:"guide/profiles.md"},p=o(`

Profiles

A profile is a collection of filters, settings, and export information. By default, a Regolith project will be initialized with a single profile, called default. You can add additional profiles, as you need them.

Running Profiles

You can use regolith run to run the default profile (default), or use regolith run <profile name> to run a specific profile

Why Profiles?

Profiles are useful for creating different run-targets.

For example, default profile may contain development focused filters, which are not desired for a final build. You can create a build or package profile, potentially with a different export target to fill this need.

You can now run regolith run default normally, and then sometimes regolith run build when you need a new final build.

Here is an example config.json with a second profile called package.

json
{
   "name": "moondust",
   "author": "Regolith Gang",
   "packs": {
@@ -17,6 +17,7 @@ import{_ as s,c as n,o as a,a as o}from"./app.aed23105.js";const C=JSON.parse('{
         ],
         "export": {
           "target": "development",
+          "build": "standard"
         }
       },
 
@@ -27,6 +28,7 @@ import{_ as s,c as n,o as a,a as o}from"./app.aed23105.js";const C=JSON.parse('{
         ],
         "export": {
           "target": "development",
+          "build": "standard"
         }
       }
     },
diff --git a/assets/guide_profiles.md.578dca21.lean.js b/assets/guide_profiles.md.21650e48.lean.js
similarity index 82%
rename from assets/guide_profiles.md.578dca21.lean.js
rename to assets/guide_profiles.md.21650e48.lean.js
index c3fc43c8..0837fbc0 100644
--- a/assets/guide_profiles.md.578dca21.lean.js
+++ b/assets/guide_profiles.md.21650e48.lean.js
@@ -1 +1 @@
-import{_ as s,c as n,o as a,a as o}from"./app.aed23105.js";const C=JSON.parse('{"title":"Profiles","description":"","frontmatter":{"title":"Profiles"},"headers":[{"level":2,"title":"Running Profiles","slug":"running-profiles","link":"#running-profiles","children":[]},{"level":2,"title":"Why Profiles?","slug":"why-profiles","link":"#why-profiles","children":[]},{"level":2,"title":"Profile Customization","slug":"profile-customization","link":"#profile-customization","children":[]}],"relativePath":"guide/profiles.md","lastUpdated":1709465436000}'),l={name:"guide/profiles.md"},p=o("",14),e=[p];function t(r,c,D,i,F,y){return a(),n("div",null,e)}const d=s(l,[["render",t]]);export{C as __pageData,d as default};
+import{_ as s,c as n,o as a,a as o}from"./app.1d293fe1.js";const C=JSON.parse('{"title":"Profiles","description":"","frontmatter":{"title":"Profiles"},"headers":[{"level":2,"title":"Running Profiles","slug":"running-profiles","link":"#running-profiles","children":[]},{"level":2,"title":"Why Profiles?","slug":"why-profiles","link":"#why-profiles","children":[]},{"level":2,"title":"Profile Customization","slug":"profile-customization","link":"#profile-customization","children":[]}],"relativePath":"guide/profiles.md","lastUpdated":1724328020000}'),l={name:"guide/profiles.md"},p=o("",14),e=[p];function t(r,c,D,i,F,y){return a(),n("div",null,e)}const d=s(l,[["render",t]]);export{C as __pageData,d as default};
diff --git a/assets/guide_python-filters.md.a7312df1.js b/assets/guide_python-filters.md.53ad81bf.js
similarity index 96%
rename from assets/guide_python-filters.md.a7312df1.js
rename to assets/guide_python-filters.md.53ad81bf.js
index 6885f4c9..bc273f3a 100644
--- a/assets/guide_python-filters.md.a7312df1.js
+++ b/assets/guide_python-filters.md.53ad81bf.js
@@ -1,4 +1,4 @@
-import{_ as e,c as n,o as t,a as s}from"./app.aed23105.js";const l="/regolith/installing/python.png",f=JSON.parse('{"title":"Python Filters","description":"","frontmatter":{"title":"Python Filters"},"headers":[{"level":2,"title":"Installing Python","slug":"installing-python","link":"#installing-python","children":[]},{"level":2,"title":"Running Python code as Filter","slug":"running-python-code-as-filter","link":"#running-python-code-as-filter","children":[]},{"level":2,"title":"Requirements and Dependencies","slug":"requirements-and-dependencies","link":"#requirements-and-dependencies","children":[]},{"level":2,"title":"Venv Handling","slug":"venv-handling","link":"#venv-handling","children":[]}],"relativePath":"guide/python-filters.md","lastUpdated":1709465436000}'),a={name:"guide/python-filters.md"},o=s('

Python Filters

Python is an interpreted high-level general-purpose programming language.

Installing Python

Before you can run Python filters, you will need to install python.

Please ensure that you add python to your path:

We recommend that you download more or less recent versions of Python.

WARNING

It's generally not acceptable to install python via the Microsoft Store. Python installed from here is not available on the path. If you have trouble running Python filters with Regolith, please reinstall using the link above.

Running Python code as Filter

The syntax for running a python script is this:

json
{
+import{_ as e,c as n,o as t,a as s}from"./app.1d293fe1.js";const l="/regolith/installing/python.png",f=JSON.parse('{"title":"Python Filters","description":"","frontmatter":{"title":"Python Filters"},"headers":[{"level":2,"title":"Installing Python","slug":"installing-python","link":"#installing-python","children":[]},{"level":2,"title":"Running Python code as Filter","slug":"running-python-code-as-filter","link":"#running-python-code-as-filter","children":[]},{"level":2,"title":"Requirements and Dependencies","slug":"requirements-and-dependencies","link":"#requirements-and-dependencies","children":[]},{"level":2,"title":"Venv Handling","slug":"venv-handling","link":"#venv-handling","children":[]}],"relativePath":"guide/python-filters.md","lastUpdated":1724328020000}'),a={name:"guide/python-filters.md"},o=s('

Python Filters

Python is an interpreted high-level general-purpose programming language.

Installing Python

Before you can run Python filters, you will need to install python.

Please ensure that you add python to your path:

We recommend that you download more or less recent versions of Python.

WARNING

It's generally not acceptable to install python via the Microsoft Store. Python installed from here is not available on the path. If you have trouble running Python filters with Regolith, please reinstall using the link above.

Running Python code as Filter

The syntax for running a python script is this:

json
{
   "runWith": "python",
   "script": "./filters/example.py",
 
diff --git a/assets/guide_python-filters.md.a7312df1.lean.js b/assets/guide_python-filters.md.53ad81bf.lean.js
similarity index 79%
rename from assets/guide_python-filters.md.a7312df1.lean.js
rename to assets/guide_python-filters.md.53ad81bf.lean.js
index 0b62157a..b06f7653 100644
--- a/assets/guide_python-filters.md.a7312df1.lean.js
+++ b/assets/guide_python-filters.md.53ad81bf.lean.js
@@ -1 +1 @@
-import{_ as e,c as n,o as t,a as s}from"./app.aed23105.js";const l="/regolith/installing/python.png",f=JSON.parse('{"title":"Python Filters","description":"","frontmatter":{"title":"Python Filters"},"headers":[{"level":2,"title":"Installing Python","slug":"installing-python","link":"#installing-python","children":[]},{"level":2,"title":"Running Python code as Filter","slug":"running-python-code-as-filter","link":"#running-python-code-as-filter","children":[]},{"level":2,"title":"Requirements and Dependencies","slug":"requirements-and-dependencies","link":"#requirements-and-dependencies","children":[]},{"level":2,"title":"Venv Handling","slug":"venv-handling","link":"#venv-handling","children":[]}],"relativePath":"guide/python-filters.md","lastUpdated":1709465436000}'),a={name:"guide/python-filters.md"},o=s("",19),i=[o];function r(p,c,h,d,y,u){return t(),n("div",null,i)}const D=e(a,[["render",r]]);export{f as __pageData,D as default};
+import{_ as e,c as n,o as t,a as s}from"./app.1d293fe1.js";const l="/regolith/installing/python.png",f=JSON.parse('{"title":"Python Filters","description":"","frontmatter":{"title":"Python Filters"},"headers":[{"level":2,"title":"Installing Python","slug":"installing-python","link":"#installing-python","children":[]},{"level":2,"title":"Running Python code as Filter","slug":"running-python-code-as-filter","link":"#running-python-code-as-filter","children":[]},{"level":2,"title":"Requirements and Dependencies","slug":"requirements-and-dependencies","link":"#requirements-and-dependencies","children":[]},{"level":2,"title":"Venv Handling","slug":"venv-handling","link":"#venv-handling","children":[]}],"relativePath":"guide/python-filters.md","lastUpdated":1724328020000}'),a={name:"guide/python-filters.md"},o=s("",19),i=[o];function r(p,c,h,d,y,u){return t(),n("div",null,i)}const D=e(a,[["render",r]]);export{f as __pageData,D as default};
diff --git a/assets/guide_safety.md.a0dd3e68.js b/assets/guide_safety.md.5a45aa68.js
similarity index 94%
rename from assets/guide_safety.md.a0dd3e68.js
rename to assets/guide_safety.md.5a45aa68.js
index 89d56d14..6ee26518 100644
--- a/assets/guide_safety.md.a0dd3e68.js
+++ b/assets/guide_safety.md.5a45aa68.js
@@ -1 +1 @@
-import{_ as e,c as t,o as i,a}from"./app.aed23105.js";const p=JSON.parse(`{"title":"Safety","description":"","frontmatter":{"title":"Safety"},"headers":[{"level":2,"title":"Why is Regolith Unsafe?","slug":"why-is-regolith-unsafe","link":"#why-is-regolith-unsafe","children":[]},{"level":2,"title":"Why isn't Regolith Sandboxed?","slug":"why-isn-t-regolith-sandboxed","link":"#why-isn-t-regolith-sandboxed","children":[]}],"relativePath":"guide/safety.md","lastUpdated":1709465436000}`),o={name:"guide/safety.md"},s=a('

Safety

Please be aware that Regolith is only intended to be used by users experienced with working inside command prompt. Due to the extreme power and flexibility that Regolith offers, there is an increased chance of harm to your system, if used improperly. We cannot accept any liability. You are fully responsible for the safety of your system.

Why is Regolith Unsafe?

Regolith has the ability to run arbitrary code. This code is not sandboxed, and could damage your system. When writing your own filters, you are responsible to write safe code!

Regolith also comes with the ability to download third-party filters from the internet. Regolith does not check these filters for safety. Only download and run internet filters if you are absolutely positive the author is trustworthy.

A compromised filter is able to completely destroy your system.

Why isn't Regolith Sandboxed?

Software sandboxing is extremely difficult, especially since Regolith offers run targets in multiple languages, as well as a native shell integration.

Sandboxing would also limit the things our users can do. Currently, anything possible with programming can be integrated with Regolith! Sandboxing would limit this.

Additionally, we believe sandboxing may give our users a false sense of security. Since no sandbox is foolproof, we prefer our users to operate with full caution, rather than trust an imperfect solution to guard them.

',10),r=[s];function n(l,h,d,y,f,u){return i(),t("div",null,r)}const g=e(o,[["render",n]]);export{p as __pageData,g as default}; +import{_ as e,c as t,o as i,a}from"./app.1d293fe1.js";const p=JSON.parse(`{"title":"Safety","description":"","frontmatter":{"title":"Safety"},"headers":[{"level":2,"title":"Why is Regolith Unsafe?","slug":"why-is-regolith-unsafe","link":"#why-is-regolith-unsafe","children":[]},{"level":2,"title":"Why isn't Regolith Sandboxed?","slug":"why-isn-t-regolith-sandboxed","link":"#why-isn-t-regolith-sandboxed","children":[]}],"relativePath":"guide/safety.md","lastUpdated":1724328020000}`),o={name:"guide/safety.md"},s=a('

Safety

Please be aware that Regolith is only intended to be used by users experienced with working inside command prompt. Due to the extreme power and flexibility that Regolith offers, there is an increased chance of harm to your system, if used improperly. We cannot accept any liability. You are fully responsible for the safety of your system.

Why is Regolith Unsafe?

Regolith has the ability to run arbitrary code. This code is not sandboxed, and could damage your system. When writing your own filters, you are responsible to write safe code!

Regolith also comes with the ability to download third-party filters from the internet. Regolith does not check these filters for safety. Only download and run internet filters if you are absolutely positive the author is trustworthy.

A compromised filter is able to completely destroy your system.

Why isn't Regolith Sandboxed?

Software sandboxing is extremely difficult, especially since Regolith offers run targets in multiple languages, as well as a native shell integration.

Sandboxing would also limit the things our users can do. Currently, anything possible with programming can be integrated with Regolith! Sandboxing would limit this.

Additionally, we believe sandboxing may give our users a false sense of security. Since no sandbox is foolproof, we prefer our users to operate with full caution, rather than trust an imperfect solution to guard them.

',10),r=[s];function n(l,h,d,y,f,u){return i(),t("div",null,r)}const g=e(o,[["render",n]]);export{p as __pageData,g as default}; diff --git a/assets/guide_safety.md.a0dd3e68.lean.js b/assets/guide_safety.md.5a45aa68.lean.js similarity index 80% rename from assets/guide_safety.md.a0dd3e68.lean.js rename to assets/guide_safety.md.5a45aa68.lean.js index c5060896..eb13352c 100644 --- a/assets/guide_safety.md.a0dd3e68.lean.js +++ b/assets/guide_safety.md.5a45aa68.lean.js @@ -1 +1 @@ -import{_ as e,c as t,o as i,a}from"./app.aed23105.js";const p=JSON.parse(`{"title":"Safety","description":"","frontmatter":{"title":"Safety"},"headers":[{"level":2,"title":"Why is Regolith Unsafe?","slug":"why-is-regolith-unsafe","link":"#why-is-regolith-unsafe","children":[]},{"level":2,"title":"Why isn't Regolith Sandboxed?","slug":"why-isn-t-regolith-sandboxed","link":"#why-isn-t-regolith-sandboxed","children":[]}],"relativePath":"guide/safety.md","lastUpdated":1709465436000}`),o={name:"guide/safety.md"},s=a("",10),r=[s];function n(l,h,d,y,f,u){return i(),t("div",null,r)}const g=e(o,[["render",n]]);export{p as __pageData,g as default}; +import{_ as e,c as t,o as i,a}from"./app.1d293fe1.js";const p=JSON.parse(`{"title":"Safety","description":"","frontmatter":{"title":"Safety"},"headers":[{"level":2,"title":"Why is Regolith Unsafe?","slug":"why-is-regolith-unsafe","link":"#why-is-regolith-unsafe","children":[]},{"level":2,"title":"Why isn't Regolith Sandboxed?","slug":"why-isn-t-regolith-sandboxed","link":"#why-isn-t-regolith-sandboxed","children":[]}],"relativePath":"guide/safety.md","lastUpdated":1724328020000}`),o={name:"guide/safety.md"},s=a("",10),r=[s];function n(l,h,d,y,f,u){return i(),t("div",null,r)}const g=e(o,[["render",n]]);export{p as __pageData,g as default}; diff --git a/assets/guide_shell-filters.md.9b00b69c.js b/assets/guide_shell-filters.md.fcf3cf3a.js similarity index 96% rename from assets/guide_shell-filters.md.9b00b69c.js rename to assets/guide_shell-filters.md.fcf3cf3a.js index 10639757..56575848 100644 --- a/assets/guide_shell-filters.md.9b00b69c.js +++ b/assets/guide_shell-filters.md.fcf3cf3a.js @@ -1,4 +1,4 @@ -import{_ as s,c as a,o as n,a as l}from"./app.aed23105.js";const d=JSON.parse('{"title":"Shell Filters","description":"","frontmatter":{"title":"Shell Filters"},"headers":[{"level":2,"title":"Running arbitrary Shell command as Filter","slug":"running-arbitrary-shell-command-as-filter","link":"#running-arbitrary-shell-command-as-filter","children":[]}],"relativePath":"guide/shell-filters.md","lastUpdated":1709465436000}'),e={name:"guide/shell-filters.md"},o=l(`

Shell Filters

Shell Filters allow you to run arbitrary shell commands. This is useful for running scripts that are not natively supported in Regolith.

Running arbitrary Shell command as Filter

The syntax for running a shell script is this:

json
{
+import{_ as s,c as a,o as n,a as l}from"./app.1d293fe1.js";const d=JSON.parse('{"title":"Shell Filters","description":"","frontmatter":{"title":"Shell Filters"},"headers":[{"level":2,"title":"Running arbitrary Shell command as Filter","slug":"running-arbitrary-shell-command-as-filter","link":"#running-arbitrary-shell-command-as-filter","children":[]}],"relativePath":"guide/shell-filters.md","lastUpdated":1724328020000}'),e={name:"guide/shell-filters.md"},o=l(`

Shell Filters

Shell Filters allow you to run arbitrary shell commands. This is useful for running scripts that are not natively supported in Regolith.

Running arbitrary Shell command as Filter

The syntax for running a shell script is this:

json
{
   "runWith": "shell",
   "command": "echo 'hello world'"
 }
diff --git a/assets/guide_shell-filters.md.9b00b69c.lean.js b/assets/guide_shell-filters.md.fcf3cf3a.lean.js
similarity index 78%
rename from assets/guide_shell-filters.md.9b00b69c.lean.js
rename to assets/guide_shell-filters.md.fcf3cf3a.lean.js
index d921ed43..8fdb373f 100644
--- a/assets/guide_shell-filters.md.9b00b69c.lean.js
+++ b/assets/guide_shell-filters.md.fcf3cf3a.lean.js
@@ -1 +1 @@
-import{_ as s,c as a,o as n,a as l}from"./app.aed23105.js";const d=JSON.parse('{"title":"Shell Filters","description":"","frontmatter":{"title":"Shell Filters"},"headers":[{"level":2,"title":"Running arbitrary Shell command as Filter","slug":"running-arbitrary-shell-command-as-filter","link":"#running-arbitrary-shell-command-as-filter","children":[]}],"relativePath":"guide/shell-filters.md","lastUpdated":1709465436000}'),e={name:"guide/shell-filters.md"},o=l("",7),t=[o];function p(r,c,i,D,y,F){return n(),a("div",null,t)}const u=s(e,[["render",p]]);export{d as __pageData,u as default};
+import{_ as s,c as a,o as n,a as l}from"./app.1d293fe1.js";const d=JSON.parse('{"title":"Shell Filters","description":"","frontmatter":{"title":"Shell Filters"},"headers":[{"level":2,"title":"Running arbitrary Shell command as Filter","slug":"running-arbitrary-shell-command-as-filter","link":"#running-arbitrary-shell-command-as-filter","children":[]}],"relativePath":"guide/shell-filters.md","lastUpdated":1724328020000}'),e={name:"guide/shell-filters.md"},o=l("",7),t=[o];function p(r,c,i,D,y,F){return n(),a("div",null,t)}const u=s(e,[["render",p]]);export{d as __pageData,u as default};
diff --git a/assets/guide_troubleshooting.md.55fc26d8.js b/assets/guide_troubleshooting.md.8211e747.js
similarity index 97%
rename from assets/guide_troubleshooting.md.55fc26d8.js
rename to assets/guide_troubleshooting.md.8211e747.js
index 9981a87a..8a52787b 100644
--- a/assets/guide_troubleshooting.md.55fc26d8.js
+++ b/assets/guide_troubleshooting.md.8211e747.js
@@ -1,4 +1,4 @@
-import{_ as e,c as o,o as i,a as n}from"./app.aed23105.js";const m=JSON.parse('{"title":"Troubleshooting","description":"","frontmatter":{"title":"Troubleshooting"},"headers":[{"level":2,"title":"General Debugging Tips","slug":"general-debugging-tips","link":"#general-debugging-tips","children":[{"level":3,"title":"Reading the Console","slug":"reading-the-console","link":"#reading-the-console","children":[]},{"level":3,"title":"Check your Version","slug":"check-your-version","link":"#check-your-version","children":[]}]},{"level":2,"title":"Common Issues","slug":"common-issues","link":"#common-issues","children":[{"level":3,"title":"Regolith is not Recognized","slug":"regolith-is-not-recognized","link":"#regolith-is-not-recognized","children":[]},{"level":3,"title":"Crash when Running","slug":"crash-when-running","link":"#crash-when-running","children":[]},{"level":3,"title":"Python Not Found","slug":"python-not-found","link":"#python-not-found","children":[]}]}],"relativePath":"guide/troubleshooting.md","lastUpdated":1709465436000}'),t={name:"guide/troubleshooting.md"},a=n(`

Troubleshooting

Regolith is a useful tool, but its somewhat complex compilation flow leaves room for user error. This page will explain solutions to common mistakes, as well as guide you through more complex debugging strategies.

General Debugging Tips

Reading the Console

Regolith is a console application, which means that you will need to interact with it via the terminal. When Regolith runs, it will print information into the same log. This information is very useful in debugging, as Regolith will print as much useful information as it can during failure states.

Please get comfortable reading the console output, and try to become familiar with the syntax. Warnings and errors will be printed clearly.

Check your Version

Regolith is a living, breathing application, which is receiving numerous updates. You can directly install the latest version of Regolith, or watch out for the "A new Version is Available" messages in the console output.

Common Issues

Regolith is not Recognized

When first installing Regolith, you may get an error message like this:

regolith : The term 'regolith' is not recognized as the name of a cmdlet, function, script file, or operable program. 
+import{_ as e,c as o,o as i,a as n}from"./app.1d293fe1.js";const m=JSON.parse('{"title":"Troubleshooting","description":"","frontmatter":{"title":"Troubleshooting"},"headers":[{"level":2,"title":"General Debugging Tips","slug":"general-debugging-tips","link":"#general-debugging-tips","children":[{"level":3,"title":"Reading the Console","slug":"reading-the-console","link":"#reading-the-console","children":[]},{"level":3,"title":"Check your Version","slug":"check-your-version","link":"#check-your-version","children":[]}]},{"level":2,"title":"Common Issues","slug":"common-issues","link":"#common-issues","children":[{"level":3,"title":"Regolith is not Recognized","slug":"regolith-is-not-recognized","link":"#regolith-is-not-recognized","children":[]},{"level":3,"title":"Crash when Running","slug":"crash-when-running","link":"#crash-when-running","children":[]},{"level":3,"title":"Python Not Found","slug":"python-not-found","link":"#python-not-found","children":[]}]}],"relativePath":"guide/troubleshooting.md","lastUpdated":1724328020000}'),t={name:"guide/troubleshooting.md"},a=n(`

Troubleshooting

Regolith is a useful tool, but its somewhat complex compilation flow leaves room for user error. This page will explain solutions to common mistakes, as well as guide you through more complex debugging strategies.

General Debugging Tips

Reading the Console

Regolith is a console application, which means that you will need to interact with it via the terminal. When Regolith runs, it will print information into the same log. This information is very useful in debugging, as Regolith will print as much useful information as it can during failure states.

Please get comfortable reading the console output, and try to become familiar with the syntax. Warnings and errors will be printed clearly.

Check your Version

Regolith is a living, breathing application, which is receiving numerous updates. You can directly install the latest version of Regolith, or watch out for the "A new Version is Available" messages in the console output.

Common Issues

Regolith is not Recognized

When first installing Regolith, you may get an error message like this:

regolith : The term 'regolith' is not recognized as the name of a cmdlet, function, script file, or operable program. 
 
 Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
 

The most common cause of this issue is incorrect installation. Here are some troubleshooting tips:

  • 1: First, try closing your shell, and opening a new one. Then rerun the regolith command.
  • 2: Try a different shell. For example gitbash or vscode instead of powershell.
  • 3: Try reinstalling Regolith
  • 4: If you cannot get Regolith installed, you may download the stand-alone .exe, and place this in your project

Crash when Running

The most common reason Regolith will crash is from a broken filter. The first step in debugging, is identifying which filter is failing. You can do so by navigating to the Regolith output log, and finding which filter caused the crash.

Filter errors will be printed like [error][filter] ... .

Python Not Found

If you get a message like [+]: Python not found, download and install it from https://www.python.org/downloads/, this means that Python either not installed, or is not available on the path.

We provide installation instructions, to help you get Python installed correctly on your system. Please be aware that Python installed via the Microsoft Store will not work with Regolith, as it generally doesn't add itself to path.

`,20),s=[a];function l(r,h,d,c,g,u){return i(),o("div",null,s)}const f=e(t,[["render",l]]);export{m as __pageData,f as default}; diff --git a/assets/guide_troubleshooting.md.55fc26d8.lean.js b/assets/guide_troubleshooting.md.8211e747.lean.js similarity index 89% rename from assets/guide_troubleshooting.md.55fc26d8.lean.js rename to assets/guide_troubleshooting.md.8211e747.lean.js index b3bef858..e81f9ec1 100644 --- a/assets/guide_troubleshooting.md.55fc26d8.lean.js +++ b/assets/guide_troubleshooting.md.8211e747.lean.js @@ -1 +1 @@ -import{_ as e,c as o,o as i,a as n}from"./app.aed23105.js";const m=JSON.parse('{"title":"Troubleshooting","description":"","frontmatter":{"title":"Troubleshooting"},"headers":[{"level":2,"title":"General Debugging Tips","slug":"general-debugging-tips","link":"#general-debugging-tips","children":[{"level":3,"title":"Reading the Console","slug":"reading-the-console","link":"#reading-the-console","children":[]},{"level":3,"title":"Check your Version","slug":"check-your-version","link":"#check-your-version","children":[]}]},{"level":2,"title":"Common Issues","slug":"common-issues","link":"#common-issues","children":[{"level":3,"title":"Regolith is not Recognized","slug":"regolith-is-not-recognized","link":"#regolith-is-not-recognized","children":[]},{"level":3,"title":"Crash when Running","slug":"crash-when-running","link":"#crash-when-running","children":[]},{"level":3,"title":"Python Not Found","slug":"python-not-found","link":"#python-not-found","children":[]}]}],"relativePath":"guide/troubleshooting.md","lastUpdated":1709465436000}'),t={name:"guide/troubleshooting.md"},a=n("",20),s=[a];function l(r,h,d,c,g,u){return i(),o("div",null,s)}const f=e(t,[["render",l]]);export{m as __pageData,f as default}; +import{_ as e,c as o,o as i,a as n}from"./app.1d293fe1.js";const m=JSON.parse('{"title":"Troubleshooting","description":"","frontmatter":{"title":"Troubleshooting"},"headers":[{"level":2,"title":"General Debugging Tips","slug":"general-debugging-tips","link":"#general-debugging-tips","children":[{"level":3,"title":"Reading the Console","slug":"reading-the-console","link":"#reading-the-console","children":[]},{"level":3,"title":"Check your Version","slug":"check-your-version","link":"#check-your-version","children":[]}]},{"level":2,"title":"Common Issues","slug":"common-issues","link":"#common-issues","children":[{"level":3,"title":"Regolith is not Recognized","slug":"regolith-is-not-recognized","link":"#regolith-is-not-recognized","children":[]},{"level":3,"title":"Crash when Running","slug":"crash-when-running","link":"#crash-when-running","children":[]},{"level":3,"title":"Python Not Found","slug":"python-not-found","link":"#python-not-found","children":[]}]}],"relativePath":"guide/troubleshooting.md","lastUpdated":1724328020000}'),t={name:"guide/troubleshooting.md"},a=n("",20),s=[a];function l(r,h,d,c,g,u){return i(),o("div",null,s)}const f=e(t,[["render",l]]);export{m as __pageData,f as default}; diff --git a/assets/guide_user-configuration.md.3ab08eb3.js b/assets/guide_user-configuration.md.40ce24ea.js similarity index 98% rename from assets/guide_user-configuration.md.3ab08eb3.js rename to assets/guide_user-configuration.md.40ce24ea.js index d3e5996e..adfa5391 100644 --- a/assets/guide_user-configuration.md.3ab08eb3.js +++ b/assets/guide_user-configuration.md.40ce24ea.js @@ -1,4 +1,4 @@ -import{_ as e,c as o,o as t,a}from"./app.aed23105.js";const f=JSON.parse('{"title":"User Configuration","description":"","frontmatter":{"title":"User Configuration"},"headers":[{"level":2,"title":"Available Options","slug":"available-options","link":"#available-options","children":[{"level":3,"title":"use_project_app_data_storage: bool","slug":"use-project-app-data-storage-bool","link":"#use-project-app-data-storage-bool","children":[]},{"level":3,"title":"username: string","slug":"username-string","link":"#username-string","children":[]},{"level":3,"title":"resolvers: list[string]","slug":"resolvers-list-string","link":"#resolvers-list-string","children":[]},{"level":3,"title":"resolver_cache_update_cooldown: string","slug":"resolver-cache-update-cooldown-string","link":"#resolver-cache-update-cooldown-string","children":[]},{"level":3,"title":"filter_cache_update_cooldown: string","slug":"filter-cache-update-cooldown-string","link":"#filter-cache-update-cooldown-string","children":[]}]},{"level":2,"title":"The regolith config command","slug":"the-regolith-config-command","link":"#the-regolith-config-command","children":[]},{"level":2,"title":"The structure of the user configuration file","slug":"the-structure-of-the-user-configuration-file","link":"#the-structure-of-the-user-configuration-file","children":[]},{"level":2,"title":"Example config file","slug":"example-config-file","link":"#example-config-file","children":[]}],"relativePath":"guide/user-configuration.md","lastUpdated":1709465436000}'),s={name:"guide/user-configuration.md"},r=a(`

User Configuration

User configuration file is stored in the Regolith app data folder. On Windows, it's %localappdata%\\regolith\\user_config.json*. The file is used to store the user preferences for Regolith.

Available Options

use_project_app_data_storage: bool

Default: false

If set to true, the Regolith projects will store their cache (filters, their dependencies, etc.) in the app data folder, instead of the .regolith folder in the project folder.

username: string

Default: "Your name"

The username of the user, which will be used in the author field of the manifest.json file when creating a new project.

resolvers: list[string]

Default: ["github.com/Bedrock-OSS/regolith-filter-resolver/resolver.json"]

A list of resolvers, which will be used to resolve filter names to URLs for downloding when using the regolith install command. The default URL is always added to the end of the list. Note that the "URLs" used by the resolvers are not actual URLs. They have two parts, separated by /. The first part is an url to a repository on GitHub, and the second part is a path to the resolver file relative to the root of the repository. For example, the default resolver is on the github.com/Bedrock-OSS/regolith-filter-resolver repository, in the resolver.json file, but github.com/Bedrock-OSS/regolith-filter-resolver/resolver.json is not a valid URL.

resolver_cache_update_cooldown: string

Default: "5m"

The cooldown between cache updates for the resolvers. The cooldown is specified in the Go duration format.

filter_cache_update_cooldown: string

Default: "5m"

The cooldown between cache updates for the filters. The cooldown is specified in the Go duration format.

The regolith config command

The regolith config command is used to manage the user configuration of Regolith. It can access and modify the user configuration file. The data is stored in the application data folder in the "user_config.json" file.

The behavior of the command changes based on the used flags and the number of provided arguments. The cheetsheet below shows the possible combinations of flags and arguments and what they do:

  • regolith config - printing all properties
  • regolith config <key> - printing specified property
  • regolith config <key> <value> - setting property value
  • regolith config <key> --delete - deleting a property
  • regolith config <key> <value> --append - appending to a list proeprty
  • regolith config <key> <value> --index <index> - replacing item in a list property
  • regolith config <key> --index <index> --delete - deleting item in a list property

The commands that print text can take the --full flag to print configuration with the default values included (if they're not defined in the config file). Without the flag, the undefined properties will be printed as null or empty list.

The structure of the user configuration file

The user_config.json file is just a regular JSON file without any nesting. You can edit it manually if you want to but you don't have to because everything can be done with the regolith config command.

Example config file

json
{
+import{_ as e,c as o,o as t,a}from"./app.1d293fe1.js";const f=JSON.parse('{"title":"User Configuration","description":"","frontmatter":{"title":"User Configuration"},"headers":[{"level":2,"title":"Available Options","slug":"available-options","link":"#available-options","children":[{"level":3,"title":"use_project_app_data_storage: bool","slug":"use-project-app-data-storage-bool","link":"#use-project-app-data-storage-bool","children":[]},{"level":3,"title":"username: string","slug":"username-string","link":"#username-string","children":[]},{"level":3,"title":"resolvers: list[string]","slug":"resolvers-list-string","link":"#resolvers-list-string","children":[]},{"level":3,"title":"resolver_cache_update_cooldown: string","slug":"resolver-cache-update-cooldown-string","link":"#resolver-cache-update-cooldown-string","children":[]},{"level":3,"title":"filter_cache_update_cooldown: string","slug":"filter-cache-update-cooldown-string","link":"#filter-cache-update-cooldown-string","children":[]}]},{"level":2,"title":"The regolith config command","slug":"the-regolith-config-command","link":"#the-regolith-config-command","children":[]},{"level":2,"title":"The structure of the user configuration file","slug":"the-structure-of-the-user-configuration-file","link":"#the-structure-of-the-user-configuration-file","children":[]},{"level":2,"title":"Example config file","slug":"example-config-file","link":"#example-config-file","children":[]}],"relativePath":"guide/user-configuration.md","lastUpdated":1724328020000}'),s={name:"guide/user-configuration.md"},r=a(`

User Configuration

User configuration file is stored in the Regolith app data folder. On Windows, it's %localappdata%\\regolith\\user_config.json*. The file is used to store the user preferences for Regolith.

Available Options

use_project_app_data_storage: bool

Default: false

If set to true, the Regolith projects will store their cache (filters, their dependencies, etc.) in the app data folder, instead of the .regolith folder in the project folder.

username: string

Default: "Your name"

The username of the user, which will be used in the author field of the manifest.json file when creating a new project.

resolvers: list[string]

Default: ["github.com/Bedrock-OSS/regolith-filter-resolver/resolver.json"]

A list of resolvers, which will be used to resolve filter names to URLs for downloding when using the regolith install command. The default URL is always added to the end of the list. Note that the "URLs" used by the resolvers are not actual URLs. They have two parts, separated by /. The first part is an url to a repository on GitHub, and the second part is a path to the resolver file relative to the root of the repository. For example, the default resolver is on the github.com/Bedrock-OSS/regolith-filter-resolver repository, in the resolver.json file, but github.com/Bedrock-OSS/regolith-filter-resolver/resolver.json is not a valid URL.

resolver_cache_update_cooldown: string

Default: "5m"

The cooldown between cache updates for the resolvers. The cooldown is specified in the Go duration format.

filter_cache_update_cooldown: string

Default: "5m"

The cooldown between cache updates for the filters. The cooldown is specified in the Go duration format.

The regolith config command

The regolith config command is used to manage the user configuration of Regolith. It can access and modify the user configuration file. The data is stored in the application data folder in the "user_config.json" file.

The behavior of the command changes based on the used flags and the number of provided arguments. The cheetsheet below shows the possible combinations of flags and arguments and what they do:

  • regolith config - printing all properties
  • regolith config <key> - printing specified property
  • regolith config <key> <value> - setting property value
  • regolith config <key> --delete - deleting a property
  • regolith config <key> <value> --append - appending to a list proeprty
  • regolith config <key> <value> --index <index> - replacing item in a list property
  • regolith config <key> --index <index> --delete - deleting item in a list property

The commands that print text can take the --full flag to print configuration with the default values included (if they're not defined in the config file). Without the flag, the undefined properties will be printed as null or empty list.

The structure of the user configuration file

The user_config.json file is just a regular JSON file without any nesting. You can edit it manually if you want to but you don't have to because everything can be done with the regolith config command.

Example config file

json
{
 	"use_project_app_data_storage": false,
 	"username": "Bedrock-OSS",
 	"resolvers": [
diff --git a/assets/guide_user-configuration.md.3ab08eb3.lean.js b/assets/guide_user-configuration.md.40ce24ea.lean.js
similarity index 92%
rename from assets/guide_user-configuration.md.3ab08eb3.lean.js
rename to assets/guide_user-configuration.md.40ce24ea.lean.js
index 803e1998..f2d60b50 100644
--- a/assets/guide_user-configuration.md.3ab08eb3.lean.js
+++ b/assets/guide_user-configuration.md.40ce24ea.lean.js
@@ -1 +1 @@
-import{_ as e,c as o,o as t,a}from"./app.aed23105.js";const f=JSON.parse('{"title":"User Configuration","description":"","frontmatter":{"title":"User Configuration"},"headers":[{"level":2,"title":"Available Options","slug":"available-options","link":"#available-options","children":[{"level":3,"title":"use_project_app_data_storage: bool","slug":"use-project-app-data-storage-bool","link":"#use-project-app-data-storage-bool","children":[]},{"level":3,"title":"username: string","slug":"username-string","link":"#username-string","children":[]},{"level":3,"title":"resolvers: list[string]","slug":"resolvers-list-string","link":"#resolvers-list-string","children":[]},{"level":3,"title":"resolver_cache_update_cooldown: string","slug":"resolver-cache-update-cooldown-string","link":"#resolver-cache-update-cooldown-string","children":[]},{"level":3,"title":"filter_cache_update_cooldown: string","slug":"filter-cache-update-cooldown-string","link":"#filter-cache-update-cooldown-string","children":[]}]},{"level":2,"title":"The regolith config command","slug":"the-regolith-config-command","link":"#the-regolith-config-command","children":[]},{"level":2,"title":"The structure of the user configuration file","slug":"the-structure-of-the-user-configuration-file","link":"#the-structure-of-the-user-configuration-file","children":[]},{"level":2,"title":"Example config file","slug":"example-config-file","link":"#example-config-file","children":[]}],"relativePath":"guide/user-configuration.md","lastUpdated":1709465436000}'),s={name:"guide/user-configuration.md"},r=a("",29),n=[r];function l(i,c,d,p,h,u){return t(),o("div",null,n)}const m=e(s,[["render",l]]);export{f as __pageData,m as default};
+import{_ as e,c as o,o as t,a}from"./app.1d293fe1.js";const f=JSON.parse('{"title":"User Configuration","description":"","frontmatter":{"title":"User Configuration"},"headers":[{"level":2,"title":"Available Options","slug":"available-options","link":"#available-options","children":[{"level":3,"title":"use_project_app_data_storage: bool","slug":"use-project-app-data-storage-bool","link":"#use-project-app-data-storage-bool","children":[]},{"level":3,"title":"username: string","slug":"username-string","link":"#username-string","children":[]},{"level":3,"title":"resolvers: list[string]","slug":"resolvers-list-string","link":"#resolvers-list-string","children":[]},{"level":3,"title":"resolver_cache_update_cooldown: string","slug":"resolver-cache-update-cooldown-string","link":"#resolver-cache-update-cooldown-string","children":[]},{"level":3,"title":"filter_cache_update_cooldown: string","slug":"filter-cache-update-cooldown-string","link":"#filter-cache-update-cooldown-string","children":[]}]},{"level":2,"title":"The regolith config command","slug":"the-regolith-config-command","link":"#the-regolith-config-command","children":[]},{"level":2,"title":"The structure of the user configuration file","slug":"the-structure-of-the-user-configuration-file","link":"#the-structure-of-the-user-configuration-file","children":[]},{"level":2,"title":"Example config file","slug":"example-config-file","link":"#example-config-file","children":[]}],"relativePath":"guide/user-configuration.md","lastUpdated":1724328020000}'),s={name:"guide/user-configuration.md"},r=a("",29),n=[r];function l(i,c,d,p,h,u){return t(),o("div",null,n)}const m=e(s,[["render",l]]);export{f as __pageData,m as default};
diff --git a/assets/guide_what-is-regolith.md.39f99884.js b/assets/guide_what-is-regolith.md.faca7388.js
similarity index 98%
rename from assets/guide_what-is-regolith.md.39f99884.js
rename to assets/guide_what-is-regolith.md.faca7388.js
index 0c8790c5..b91b494f 100644
--- a/assets/guide_what-is-regolith.md.39f99884.js
+++ b/assets/guide_what-is-regolith.md.faca7388.js
@@ -1,4 +1,4 @@
-import{_ as e}from"./chunks/project_folder.ffe44ce8.js";import{_ as t,c as o,o as i,a as n}from"./app.aed23105.js";const y=JSON.parse('{"title":"What is Regolith?","description":"","frontmatter":{"title":"What is Regolith?"},"headers":[{"level":2,"title":"Compiling","slug":"compiling","link":"#compiling","children":[]},{"level":2,"title":"Filters","slug":"filters","link":"#filters","children":[{"level":3,"title":"Creating your own Filters","slug":"creating-your-own-filters","link":"#creating-your-own-filters","children":[]}]},{"level":2,"title":"Why Regolith?","slug":"why-regolith","link":"#why-regolith","children":[{"level":3,"title":"Extending the Addon Syntax","slug":"extending-the-addon-syntax","link":"#extending-the-addon-syntax","children":[]},{"level":3,"title":"Non-Destructive Editing","slug":"non-destructive-editing","link":"#non-destructive-editing","children":[]}]}],"relativePath":"guide/what-is-regolith.md","lastUpdated":1709465436000}'),a={name:"guide/what-is-regolith.md"},r=n('

What is Regolith?

Regolith is an Addon Compiler for the Bedrock Edition of Minecraft.

WARNING

This page introduces Regolith at a conceptual level. If you prefer, you can jump to the installation instructions.

Regolith introduces the concept of a "project folder", where your addons are written, including the Resource Pack, Behavior Pack, and any models, textures or configuration files. This single-folder-structure is great for version control, and allows you to keep your "source-of-truth" outside of com.mojang!

Here is what a newly initialized Regolith project looks like:

Compiling

In the simplest case, Regolith can be used to move your packs from the project folder, into your target location (usually the development folders in com.mojang). Each time you run regolith, the packs will be moved over, and updated.

However, Regoliths real value preposition is the ability to run arbitrary code during this copy.

We refer to these scripts and programs as filters. Here is the flow:

  • RP, BP and data folder are copied into a tmp folder
  • Every filter is executed in-order, editing the tmp folder in-place
  • The contents of RP and BP are moved into your export location
  • If configured, subfolders within data can be moved back into your data location

This compilation flow allows you to make programmatic changes to your compiled addon, without effecting your source files.

Since the data folder can be saved back to your project, it's possible to store persistant data there.

Filters

A filter is any program or script that takes the files inside of your RP and BP and transforms them in some way. Many of these filters have already been written, and are included as part of the standard library.

For example, one of our standard filters is called texture_convert, which filters image formats for photo editing programs, and converts them into .png files.

With this filter turned on, you can place Photoshop, Krita, or Gimp files directly into RP/textures/* folder! By the time your files reach com.mojang, the .psd files will be replaced by a normal .png -Minecraft won't know the difference!

Creating your own Filters

You can write filters in Python, JavaScript, Java, or any other language, using our shell integration. You can learn more about creating custom filters here.

Why Regolith?

Extending the Addon Syntax

Regolith allows you to create and extend addon-syntax. As long as you can write a filter to interpret the new syntax, and compile it into valid addon-syntax, then anything goes!

For example, the subfunctions community filter allows you to define functions within functions, without creating an additional file:

# Some code
+import{_ as e}from"./chunks/project_folder.ffe44ce8.js";import{_ as t,c as o,o as i,a as n}from"./app.1d293fe1.js";const y=JSON.parse('{"title":"What is Regolith?","description":"","frontmatter":{"title":"What is Regolith?"},"headers":[{"level":2,"title":"Compiling","slug":"compiling","link":"#compiling","children":[]},{"level":2,"title":"Filters","slug":"filters","link":"#filters","children":[{"level":3,"title":"Creating your own Filters","slug":"creating-your-own-filters","link":"#creating-your-own-filters","children":[]}]},{"level":2,"title":"Why Regolith?","slug":"why-regolith","link":"#why-regolith","children":[{"level":3,"title":"Extending the Addon Syntax","slug":"extending-the-addon-syntax","link":"#extending-the-addon-syntax","children":[]},{"level":3,"title":"Non-Destructive Editing","slug":"non-destructive-editing","link":"#non-destructive-editing","children":[]}]}],"relativePath":"guide/what-is-regolith.md","lastUpdated":1724328020000}'),a={name:"guide/what-is-regolith.md"},r=n('

What is Regolith?

Regolith is an Addon Compiler for the Bedrock Edition of Minecraft.

WARNING

This page introduces Regolith at a conceptual level. If you prefer, you can jump to the installation instructions.

Regolith introduces the concept of a "project folder", where your addons are written, including the Resource Pack, Behavior Pack, and any models, textures or configuration files. This single-folder-structure is great for version control, and allows you to keep your "source-of-truth" outside of com.mojang!

Here is what a newly initialized Regolith project looks like:

Compiling

In the simplest case, Regolith can be used to move your packs from the project folder, into your target location (usually the development folders in com.mojang). Each time you run regolith, the packs will be moved over, and updated.

However, Regoliths real value preposition is the ability to run arbitrary code during this copy.

We refer to these scripts and programs as filters. Here is the flow:

  • RP, BP and data folder are copied into a tmp folder
  • Every filter is executed in-order, editing the tmp folder in-place
  • The contents of RP and BP are moved into your export location
  • If configured, subfolders within data can be moved back into your data location

This compilation flow allows you to make programmatic changes to your compiled addon, without effecting your source files.

Since the data folder can be saved back to your project, it's possible to store persistant data there.

Filters

A filter is any program or script that takes the files inside of your RP and BP and transforms them in some way. Many of these filters have already been written, and are included as part of the standard library.

For example, one of our standard filters is called texture_convert, which filters image formats for photo editing programs, and converts them into .png files.

With this filter turned on, you can place Photoshop, Krita, or Gimp files directly into RP/textures/* folder! By the time your files reach com.mojang, the .psd files will be replaced by a normal .png -Minecraft won't know the difference!

Creating your own Filters

You can write filters in Python, JavaScript, Java, or any other language, using our shell integration. You can learn more about creating custom filters here.

Why Regolith?

Extending the Addon Syntax

Regolith allows you to create and extend addon-syntax. As long as you can write a filter to interpret the new syntax, and compile it into valid addon-syntax, then anything goes!

For example, the subfunctions community filter allows you to define functions within functions, without creating an additional file:

# Some code
 function <aaa>:
     # The code of the subfunction
     execute @a ~ ~ ~ function <bbb>:
diff --git a/assets/guide_what-is-regolith.md.39f99884.lean.js b/assets/guide_what-is-regolith.md.faca7388.lean.js
similarity index 88%
rename from assets/guide_what-is-regolith.md.39f99884.lean.js
rename to assets/guide_what-is-regolith.md.faca7388.lean.js
index 827d240e..a1044eea 100644
--- a/assets/guide_what-is-regolith.md.39f99884.lean.js
+++ b/assets/guide_what-is-regolith.md.faca7388.lean.js
@@ -1 +1 @@
-import{_ as e}from"./chunks/project_folder.ffe44ce8.js";import{_ as t,c as o,o as i,a as n}from"./app.aed23105.js";const y=JSON.parse('{"title":"What is Regolith?","description":"","frontmatter":{"title":"What is Regolith?"},"headers":[{"level":2,"title":"Compiling","slug":"compiling","link":"#compiling","children":[]},{"level":2,"title":"Filters","slug":"filters","link":"#filters","children":[{"level":3,"title":"Creating your own Filters","slug":"creating-your-own-filters","link":"#creating-your-own-filters","children":[]}]},{"level":2,"title":"Why Regolith?","slug":"why-regolith","link":"#why-regolith","children":[{"level":3,"title":"Extending the Addon Syntax","slug":"extending-the-addon-syntax","link":"#extending-the-addon-syntax","children":[]},{"level":3,"title":"Non-Destructive Editing","slug":"non-destructive-editing","link":"#non-destructive-editing","children":[]}]}],"relativePath":"guide/what-is-regolith.md","lastUpdated":1709465436000}'),a={name:"guide/what-is-regolith.md"},r=n("",35),s=[r];function l(d,c,h,p,u,g){return i(),o("div",null,s)}const w=t(a,[["render",l]]);export{y as __pageData,w as default};
+import{_ as e}from"./chunks/project_folder.ffe44ce8.js";import{_ as t,c as o,o as i,a as n}from"./app.1d293fe1.js";const y=JSON.parse('{"title":"What is Regolith?","description":"","frontmatter":{"title":"What is Regolith?"},"headers":[{"level":2,"title":"Compiling","slug":"compiling","link":"#compiling","children":[]},{"level":2,"title":"Filters","slug":"filters","link":"#filters","children":[{"level":3,"title":"Creating your own Filters","slug":"creating-your-own-filters","link":"#creating-your-own-filters","children":[]}]},{"level":2,"title":"Why Regolith?","slug":"why-regolith","link":"#why-regolith","children":[{"level":3,"title":"Extending the Addon Syntax","slug":"extending-the-addon-syntax","link":"#extending-the-addon-syntax","children":[]},{"level":3,"title":"Non-Destructive Editing","slug":"non-destructive-editing","link":"#non-destructive-editing","children":[]}]}],"relativePath":"guide/what-is-regolith.md","lastUpdated":1724328020000}'),a={name:"guide/what-is-regolith.md"},r=n("",35),s=[r];function l(d,c,h,p,u,g){return i(),o("div",null,s)}const w=t(a,[["render",l]]);export{y as __pageData,w as default};
diff --git a/assets/index.md.510adbdb.js b/assets/index.md.5d9135f1.js
similarity index 91%
rename from assets/index.md.510adbdb.js
rename to assets/index.md.5d9135f1.js
index d4795e10..8210bfa7 100644
--- a/assets/index.md.510adbdb.js
+++ b/assets/index.md.5d9135f1.js
@@ -1 +1 @@
-import{_ as e,c as t,o}from"./app.aed23105.js";const f=JSON.parse('{"title":"Addon Compiler","description":"A flexible and language-agnostic addon-compiler for the Bedrock Edition of Minecraft.","frontmatter":{"layout":"home","sidebar":false,"title":"Addon Compiler","description":"A flexible and language-agnostic addon-compiler for the Bedrock Edition of Minecraft.","hero":{"name":"Regolith","text":"Addon Compiler for the Bedrock Edition of Minecraft","tagline":"Fast, flexible, and easy to use. Meet the modern Minecraft Bedrock tooling.","image":{"src":"/logo.png","alt":"Regolith logo"},"actions":[{"theme":"brand","text":"Get Started","link":"/guide/what-is-regolith"}]},"features":[{"icon":"\u26A1\uFE0F","title":"Blazingly Fast","details":"Regolith can improve your productivity by automating away boring or repetitive tasks."},{"icon":"\u{1F9E9}","title":"Flexible","details":"Regolith is designed with a language-agnostic, tool-agnostic feature set. The flexibility of Regolith allows you to bring all scripts and tools under a single, unified workflow."},{"icon":"\u{1F3F7}\uFE0F","title":"Version Control Friendly","details":"Regolith keeps the \u2018source of truth\u2019 out of your com.mojang folder, allowing for seamless git integration."}]},"headers":[],"relativePath":"index.md","lastUpdated":1709465436000}'),i={name:"index.md"};function a(n,l,r,d,s,c){return o(),t("div")}const p=e(i,[["render",a]]);export{f as __pageData,p as default};
+import{_ as e,c as t,o}from"./app.1d293fe1.js";const f=JSON.parse('{"title":"Addon Compiler","description":"A flexible and language-agnostic addon-compiler for the Bedrock Edition of Minecraft.","frontmatter":{"layout":"home","sidebar":false,"title":"Addon Compiler","description":"A flexible and language-agnostic addon-compiler for the Bedrock Edition of Minecraft.","hero":{"name":"Regolith","text":"Addon Compiler for the Bedrock Edition of Minecraft","tagline":"Fast, flexible, and easy to use. Meet the modern Minecraft Bedrock tooling.","image":{"src":"/logo.png","alt":"Regolith logo"},"actions":[{"theme":"brand","text":"Get Started","link":"/guide/what-is-regolith"}]},"features":[{"icon":"\u26A1\uFE0F","title":"Blazingly Fast","details":"Regolith can improve your productivity by automating away boring or repetitive tasks."},{"icon":"\u{1F9E9}","title":"Flexible","details":"Regolith is designed with a language-agnostic, tool-agnostic feature set. The flexibility of Regolith allows you to bring all scripts and tools under a single, unified workflow."},{"icon":"\u{1F3F7}\uFE0F","title":"Version Control Friendly","details":"Regolith keeps the \u2018source of truth\u2019 out of your com.mojang folder, allowing for seamless git integration."}]},"headers":[],"relativePath":"index.md","lastUpdated":1724328020000}'),i={name:"index.md"};function a(n,l,r,d,s,c){return o(),t("div")}const p=e(i,[["render",a]]);export{f as __pageData,p as default};
diff --git a/assets/index.md.510adbdb.lean.js b/assets/index.md.5d9135f1.lean.js
similarity index 91%
rename from assets/index.md.510adbdb.lean.js
rename to assets/index.md.5d9135f1.lean.js
index d4795e10..8210bfa7 100644
--- a/assets/index.md.510adbdb.lean.js
+++ b/assets/index.md.5d9135f1.lean.js
@@ -1 +1 @@
-import{_ as e,c as t,o}from"./app.aed23105.js";const f=JSON.parse('{"title":"Addon Compiler","description":"A flexible and language-agnostic addon-compiler for the Bedrock Edition of Minecraft.","frontmatter":{"layout":"home","sidebar":false,"title":"Addon Compiler","description":"A flexible and language-agnostic addon-compiler for the Bedrock Edition of Minecraft.","hero":{"name":"Regolith","text":"Addon Compiler for the Bedrock Edition of Minecraft","tagline":"Fast, flexible, and easy to use. Meet the modern Minecraft Bedrock tooling.","image":{"src":"/logo.png","alt":"Regolith logo"},"actions":[{"theme":"brand","text":"Get Started","link":"/guide/what-is-regolith"}]},"features":[{"icon":"\u26A1\uFE0F","title":"Blazingly Fast","details":"Regolith can improve your productivity by automating away boring or repetitive tasks."},{"icon":"\u{1F9E9}","title":"Flexible","details":"Regolith is designed with a language-agnostic, tool-agnostic feature set. The flexibility of Regolith allows you to bring all scripts and tools under a single, unified workflow."},{"icon":"\u{1F3F7}\uFE0F","title":"Version Control Friendly","details":"Regolith keeps the \u2018source of truth\u2019 out of your com.mojang folder, allowing for seamless git integration."}]},"headers":[],"relativePath":"index.md","lastUpdated":1709465436000}'),i={name:"index.md"};function a(n,l,r,d,s,c){return o(),t("div")}const p=e(i,[["render",a]]);export{f as __pageData,p as default};
+import{_ as e,c as t,o}from"./app.1d293fe1.js";const f=JSON.parse('{"title":"Addon Compiler","description":"A flexible and language-agnostic addon-compiler for the Bedrock Edition of Minecraft.","frontmatter":{"layout":"home","sidebar":false,"title":"Addon Compiler","description":"A flexible and language-agnostic addon-compiler for the Bedrock Edition of Minecraft.","hero":{"name":"Regolith","text":"Addon Compiler for the Bedrock Edition of Minecraft","tagline":"Fast, flexible, and easy to use. Meet the modern Minecraft Bedrock tooling.","image":{"src":"/logo.png","alt":"Regolith logo"},"actions":[{"theme":"brand","text":"Get Started","link":"/guide/what-is-regolith"}]},"features":[{"icon":"\u26A1\uFE0F","title":"Blazingly Fast","details":"Regolith can improve your productivity by automating away boring or repetitive tasks."},{"icon":"\u{1F9E9}","title":"Flexible","details":"Regolith is designed with a language-agnostic, tool-agnostic feature set. The flexibility of Regolith allows you to bring all scripts and tools under a single, unified workflow."},{"icon":"\u{1F3F7}\uFE0F","title":"Version Control Friendly","details":"Regolith keeps the \u2018source of truth\u2019 out of your com.mojang folder, allowing for seamless git integration."}]},"headers":[],"relativePath":"index.md","lastUpdated":1724328020000}'),i={name:"index.md"};function a(n,l,r,d,s,c){return o(),t("div")}const p=e(i,[["render",a]]);export{f as __pageData,p as default};
diff --git a/assets/standard-library.md.cf5061e2.js b/assets/standard-library.md.7f587c26.js
similarity index 97%
rename from assets/standard-library.md.cf5061e2.js
rename to assets/standard-library.md.7f587c26.js
index 357c3d66..97229dd5 100644
--- a/assets/standard-library.md.cf5061e2.js
+++ b/assets/standard-library.md.7f587c26.js
@@ -1,4 +1,4 @@
-import{_ as e,c as t,o as r,a}from"./app.aed23105.js";const m=JSON.parse('{"title":"Standard Library","description":"","frontmatter":{"title":"Standard Library"},"headers":[{"level":2,"title":"Standard Filters","slug":"standard-filters","link":"#standard-filters","children":[]},{"level":2,"title":"Using a Standard Filter","slug":"using-a-standard-filter","link":"#using-a-standard-filter","children":[]}],"relativePath":"standard-library.md","lastUpdated":1709465436000}'),s={name:"standard-library.md"},n=a(`

Standard Library

The Standard Library is a special set of filters, written by the Regolith maintainers. Standard Filters offers the safest, easiest, and best support.

Standard Filters

FilterDescription
blockbench_convertConverts blockbench models into .geometry.json files.
bump_manifestBumps the manifest version in your RP and BP. Good for multiplayer testing where you need to avoid pack-caching issues.
filter_testerMeant to be used by the filter developers to test other filters. It compares the expected results with the files generated by Regolith.
fix_emissiveFixes emissive issues in your textures, by removing the color data from fully transparent pixels.
gametestsCompiles gametests into pack.
json_cleanerRemoves comments from all json files in the project. Useful, since some filters cannot understand files with comments.
name_ninjaAutomatically generates entity, block, spawn egg, and item names, based on a custom 'name' field, or on the entities identifier.
texture_convertConverts popular image editor file formats, such as .psd to .png.
texture_listAutomatically creates the texture_list.json file, based on the images you've added into your resource pack.

The full, up to date list of filters can be found on our github. We are looking into maintaining a list here, but for now please visit our GitHub.

Using a Standard Filter

You may install standard filters by name. For example: regolith install name_ninja.

The syntax for standard filters usage is like this:

json
{
+import{_ as e,c as t,o as r,a}from"./app.1d293fe1.js";const m=JSON.parse('{"title":"Standard Library","description":"","frontmatter":{"title":"Standard Library"},"headers":[{"level":2,"title":"Standard Filters","slug":"standard-filters","link":"#standard-filters","children":[]},{"level":2,"title":"Using a Standard Filter","slug":"using-a-standard-filter","link":"#using-a-standard-filter","children":[]}],"relativePath":"standard-library.md","lastUpdated":1724328020000}'),s={name:"standard-library.md"},n=a(`

Standard Library

The Standard Library is a special set of filters, written by the Regolith maintainers. Standard Filters offers the safest, easiest, and best support.

Standard Filters

FilterDescription
blockbench_convertConverts blockbench models into .geometry.json files.
bump_manifestBumps the manifest version in your RP and BP. Good for multiplayer testing where you need to avoid pack-caching issues.
filter_testerMeant to be used by the filter developers to test other filters. It compares the expected results with the files generated by Regolith.
fix_emissiveFixes emissive issues in your textures, by removing the color data from fully transparent pixels.
gametestsCompiles gametests into pack.
json_cleanerRemoves comments from all json files in the project. Useful, since some filters cannot understand files with comments.
name_ninjaAutomatically generates entity, block, spawn egg, and item names, based on a custom 'name' field, or on the entities identifier.
texture_convertConverts popular image editor file formats, such as .psd to .png.
texture_listAutomatically creates the texture_list.json file, based on the images you've added into your resource pack.

The full, up to date list of filters can be found on our github. We are looking into maintaining a list here, but for now please visit our GitHub.

Using a Standard Filter

You may install standard filters by name. For example: regolith install name_ninja.

The syntax for standard filters usage is like this:

json
{
   "filter": "<filter_name>",
   "settings" { ... } // Optional
 }
diff --git a/assets/standard-library.md.cf5061e2.lean.js b/assets/standard-library.md.7f587c26.lean.js
similarity index 79%
rename from assets/standard-library.md.cf5061e2.lean.js
rename to assets/standard-library.md.7f587c26.lean.js
index 40c67bc0..8b73b7e4 100644
--- a/assets/standard-library.md.cf5061e2.lean.js
+++ b/assets/standard-library.md.7f587c26.lean.js
@@ -1 +1 @@
-import{_ as e,c as t,o as r,a}from"./app.aed23105.js";const m=JSON.parse('{"title":"Standard Library","description":"","frontmatter":{"title":"Standard Library"},"headers":[{"level":2,"title":"Standard Filters","slug":"standard-filters","link":"#standard-filters","children":[]},{"level":2,"title":"Using a Standard Filter","slug":"using-a-standard-filter","link":"#using-a-standard-filter","children":[]}],"relativePath":"standard-library.md","lastUpdated":1709465436000}'),s={name:"standard-library.md"},n=a("",9),o=[n];function l(i,d,c,p,h,f){return r(),t("div",null,o)}const g=e(s,[["render",l]]);export{m as __pageData,g as default};
+import{_ as e,c as t,o as r,a}from"./app.1d293fe1.js";const m=JSON.parse('{"title":"Standard Library","description":"","frontmatter":{"title":"Standard Library"},"headers":[{"level":2,"title":"Standard Filters","slug":"standard-filters","link":"#standard-filters","children":[]},{"level":2,"title":"Using a Standard Filter","slug":"using-a-standard-filter","link":"#using-a-standard-filter","children":[]}],"relativePath":"standard-library.md","lastUpdated":1724328020000}'),s={name:"standard-library.md"},n=a("",9),o=[n];function l(i,d,c,p,h,f){return r(),t("div",null,o)}const g=e(s,[["render",l]]);export{m as __pageData,g as default};
diff --git a/community-filters/index.html b/community-filters/index.html
index 21030b93..8d79f106 100644
--- a/community-filters/index.html
+++ b/community-filters/index.html
@@ -7,8 +7,8 @@
     
     
     
-    
-    
+    
+    
     
     
   
@@ -21,9 +21,9 @@
   
   
   
-    
Skip to content
On this page

Community Filters

The beauty of Regolith is that filters can be written and shared by anyone! This page contains an uncurated list of community filters. If your filter doesn't appear here, let us know!

Installing Community Filters

Community filters are installed via a URL-like resource definition: github.com/<username>/<repository>/<folder>.

For example github.com/SirLich/echo-npc-regolith/echo.

WARNING

Please use extreme caution when running unknown code. Regolith and its maintainers take no responsibility for any damages incurred by using the filters on this page. To learn more, please read our safety page.

TIP

Having trouble? You can learn more about online filters here.

Filters

NameAuthorLanguageDescription
esbuild_executorMajestikButternodejsA regolith filter for using esbuild
js_formatterMajestikButternodejsA regolith filter for formatting JavaScript files
json_formatterMajestikButternodejsA regolith filter for formatting JSON files
ts_transpilerMajestikButternodejsA regolith filter for transpiling Typescript files
NBTEnchantSmokeyStackpythonThis script is used to generate .mcstructure files containing edited nbt data that is currently not possible to do ingame
file_freedomHatchibombotarnodejsThis filter allows you to place bedrock addon file anywhere within the addon directories.
functionerHatchibombotarnodejsA filter for regolith that adds more syntax to function files.
init-fullHatchibombotarnodejsFilter that creates bedrock manifest files on install
link_manifestsHatchibombotarnodejsLinks uuid's from the resource and behaviour pack manifests in the dependencies section.
molang_insertHatchibombotarnodejsA filter for regolith that allows you to insert molang.
pack_commonsHatchibombotarnodejsIntended to allow copying of files into both the resource and behaviour packs
simple_blocksHatchibombotarnodejsA filter that creates blocks from one file.
templaterHatchibombotarnodejsA templater filter for regolith.
item_scaleMedicalJewel105pythonThis filter generates render_offsets for 1.16.100+ items.
custom_projectNusiqexeNo description.
debug_say_function_nameNusiqpythonNo description.
pytemplateNusiqpythonNo description.
run_counterNusiqpythonA pointless filter for counting the number of uses of the 'regolith run' command.
subfunctionsNusiqpythonNo description.
system_templateNusiqpythonNo description.
extend-vanilla-entitieslittlechestnutgamespythonA JSON partials system.
digger_genSirLichpythonThe digger_gen filter allows you to quickly and easily generate the minecraft:digger component, to satisfy your tool-building needs.
e-backupcda94581nodejsBackups your export target in case you made a mistake.
exportcda94581nodejsExports your add-on into a ".mcaddon" automatically.
minimizecda94581nodejsMinimize all file JSONs. Can save a tiny bit of space. Also kinda pointless but whatever.
namespacecda94581nodejsAutomatically apply and replace namespaces to each block, item, entity, recipe, attachable, particle, and fog. Useful for temporary namespaces before deployment.
exportMakercamp-SRLsnodejsExports your add-on into a ".mcaddon", ".mcworld", ".mctemplate" automatically.
module_importerShiCheng-LunodejsA regolith filter for import
command_langMCDevKitshellCompiles the CommandLang programming language into .mcfunction files.
json_templating_engineMCDevKitjavaCompiles JSON templates into JSON files. Especially useful for making reusable pieces of content or large amounts of JSON files.
jsonteMCDevKitexeNo description.
classesevilguy50nimfilter for adding OOP class like structure to functions
dashevilguy50nimNo description.
ds_storeevilguy50nimfilter for removing .DS_Store files
new_execevilguy50nodejsfilter for converting old execute commands to the 1.19.10 format
shorthandevilguy50pythonfilter for having shorthand syntax inside of functions
stripevilguy50nimfilter for striping comments from json, mcfunction, and lang files
style_lintevilguy50pythonfilter for automatic project styling
title_uievilguy50nimfilter for generating title ui bindings
echoSirLichpythonNo description.
scalable-teamscda94581nodejsGenerates a pre-made teams add-on, scalable and customizable. Appends itself to developed packs.

Released under the MIT license.

- - +
Skip to content
On this page

Community Filters

The beauty of Regolith is that filters can be written and shared by anyone! This page contains an uncurated list of community filters. If your filter doesn't appear here, let us know!

Installing Community Filters

Community filters are installed via a URL-like resource definition: github.com/<username>/<repository>/<folder>.

For example github.com/SirLich/echo-npc-regolith/echo.

WARNING

Please use extreme caution when running unknown code. Regolith and its maintainers take no responsibility for any damages incurred by using the filters on this page. To learn more, please read our safety page.

TIP

Having trouble? You can learn more about online filters here.

Filters

NameAuthorLanguageDescription
esbuild_executorMajestikButternodejsA regolith filter for using esbuild
js_formatterMajestikButternodejsA regolith filter for formatting JavaScript files
json_formatterMajestikButternodejsA regolith filter for formatting JSON files
ts_transpilerMajestikButternodejsA regolith filter for transpiling Typescript files
NBTEnchantSmokeyStackpythonThis script is used to generate .mcstructure files containing edited nbt data that is currently not possible to do ingame
file_freedomHatchibombotarnodejsThis filter allows you to place bedrock addon file anywhere within the addon directories.
functionerHatchibombotarnodejsA filter for regolith that adds more syntax to function files.
init-fullHatchibombotarnodejsFilter that creates bedrock manifest files on install
link_manifestsHatchibombotarnodejsLinks uuid's from the resource and behaviour pack manifests in the dependencies section.
molang_insertHatchibombotarnodejsA filter for regolith that allows you to insert molang.
pack_commonsHatchibombotarnodejsIntended to allow copying of files into both the resource and behaviour packs
simple_blocksHatchibombotarnodejsA filter that creates blocks from one file.
templaterHatchibombotarnodejsA templater filter for regolith.
item_scaleMedicalJewel105pythonThis filter generates render_offsets for 1.16.100+ items.
custom_projectNusiqexeNo description.
debug_say_function_nameNusiqpythonNo description.
pytemplateNusiqpythonNo description.
run_counterNusiqpythonA pointless filter for counting the number of uses of the 'regolith run' command.
subfunctionsNusiqpythonNo description.
system_templateNusiqpythonNo description.
extend-vanilla-entitieslittlechestnutgamespythonA JSON partials system.
digger_genSirLichpythonThe digger_gen filter allows you to quickly and easily generate the minecraft:digger component, to satisfy your tool-building needs.
e-backupcda94581nodejsBackups your export target in case you made a mistake.
exportcda94581nodejsExports your add-on into a ".mcaddon" automatically.
minimizecda94581nodejsMinimize all file JSONs. Can save a tiny bit of space. Also kinda pointless but whatever.
namespacecda94581nodejsAutomatically apply and replace namespaces to each block, item, entity, recipe, attachable, particle, and fog. Useful for temporary namespaces before deployment.
exportMakercamp-SRLsnodejsExports your add-on into a ".mcaddon", ".mcworld", ".mctemplate" automatically.
module_importerShiCheng-LunodejsA regolith filter for import
command_langMCDevKitshellCompiles the CommandLang programming language into .mcfunction files.
json_templating_engineMCDevKitjavaCompiles JSON templates into JSON files. Especially useful for making reusable pieces of content or large amounts of JSON files.
jsonteMCDevKitexeNo description.
classesevilguy50nimfilter for adding OOP class like structure to functions
dashevilguy50nimNo description.
ds_storeevilguy50nimfilter for removing .DS_Store files
new_execevilguy50nodejsfilter for converting old execute commands to the 1.19.10 format
shorthandevilguy50pythonfilter for having shorthand syntax inside of functions
stripevilguy50nimfilter for striping comments from json, mcfunction, and lang files
style_lintevilguy50pythonfilter for automatic project styling
title_uievilguy50nimfilter for generating title ui bindings
echoSirLichpythonNo description.
scalable-teamscda94581nodejsGenerates a pre-made teams add-on, scalable and customizable. Appends itself to developed packs.

Released under the MIT license.

+ + \ No newline at end of file diff --git a/guide/configuration/index.html b/guide/configuration/index.html index 333ed322..b22c7df5 100644 --- a/guide/configuration/index.html +++ b/guide/configuration/index.html @@ -7,8 +7,8 @@ - - + + @@ -21,7 +21,7 @@ -
Skip to content
On this page

Configuration File

The configuration of Regolith project is stored inside of config.json, at the top level of your Regolith project. This file will be created when you run regolith init.

Project Config Standard

Regolith follows the Project Config Standard. This config is a shared format, used by programs that interact with Minecraft projects, such as bridge.

Regolith Configuration

Regolith builds on this standard with the addition of the regolith namespace, which is where all regolith-specific information is stored.

WARNING

This page only shows an example configuration. There are other documentation pages to fully explain concepts such as filters and profiles.

Example config, with many options explained:

json
{
+    
Skip to content
On this page

Configuration File

The configuration of Regolith project is stored inside of config.json, at the top level of your Regolith project. This file will be created when you run regolith init.

Project Config Standard

Regolith follows the Project Config Standard. This config is a shared format, used by programs that interact with Minecraft projects, such as bridge.

Regolith Configuration

Regolith builds on this standard with the addition of the regolith namespace, which is where all regolith-specific information is stored.

WARNING

This page only shows an example configuration. There are other documentation pages to fully explain concepts such as filters and profiles.

Example config, with many options explained:

json
{
   // These fields come from project standard
   "name": "Project Name",
   "author": "Author Name",
@@ -76,6 +76,7 @@
         // Export target defines where your files will be exported
         "export": {
           "target": "development",
+          "build": "standard",
           "readOnly": false
         }
       }
@@ -96,9 +97,9 @@
     "dataPath": "./packs/data"
   }
 }
-

Released under the MIT license.

- - +

Released under the MIT license.

+ + \ No newline at end of file diff --git a/guide/create-a-filter/index.html b/guide/create-a-filter/index.html index cf820d7b..9369bac9 100644 --- a/guide/create-a-filter/index.html +++ b/guide/create-a-filter/index.html @@ -7,8 +7,8 @@ - - + + @@ -21,7 +21,7 @@ -
Skip to content
On this page

Create a Filter

This step-by-step tutorial will guide you through the creation of your first Regolith filter, in the Python programming language. If you're new to Regolith, you may enjoy trying out some of our standard filters first.

WARNING

This page is an in-depth tutorial for Regolith filter creation, including detailed information about data-flow and semantics. If you just want to get started programming, you may consider checking out the documentation on custom filters.

Installing Python

Before you can begin, you need to ensure that Python is installed on your system. There are download instructions on our Python Filter page.

Getting Started

If you don't have one yet, you should create a new Regolith project by navigating to a blank folder, and typing regolith init.

TIP

During this tutorial, project refers to the project folder you just created!

The first step is creating a new python file in project/filters/giant_mobs.py. Our first step will be simply printing hello world!, so add print("hello world!") into your new filter file.

You can also create a small addon in RP and BP. For this tutorial, you need at least a working manifest.json, and a single working behavior entity, such as one copied from the vanilla files.

Testing your Filter

At this point, you need to edit your config.json so that giant_mobs is registered as a local filter. Your config should look something like this:

json
{
+    
Skip to content
On this page

Create a Filter

This step-by-step tutorial will guide you through the creation of your first Regolith filter, in the Python programming language. If you're new to Regolith, you may enjoy trying out some of our standard filters first.

WARNING

This page is an in-depth tutorial for Regolith filter creation, including detailed information about data-flow and semantics. If you just want to get started programming, you may consider checking out the documentation on custom filters.

Installing Python

Before you can begin, you need to ensure that Python is installed on your system. There are download instructions on our Python Filter page.

Getting Started

If you don't have one yet, you should create a new Regolith project by navigating to a blank folder, and typing regolith init.

TIP

During this tutorial, project refers to the project folder you just created!

The first step is creating a new python file in project/filters/giant_mobs.py. Our first step will be simply printing hello world!, so add print("hello world!") into your new filter file.

You can also create a small addon in RP and BP. For this tutorial, you need at least a working manifest.json, and a single working behavior entity, such as one copied from the vanilla files.

Testing your Filter

At this point, you need to edit your config.json so that giant_mobs is registered as a local filter. Your config should look something like this:

json
{
   "name": "Giant Mobs",
   "author": "Your Name",
   "packs": {
@@ -38,6 +38,7 @@
         ],
         "export": {
           "target": "development",
+          "build": "standard",
           "readOnly": true
         }
       }
@@ -66,9 +67,9 @@
   print("put code here!")
 
 main()
-

Released under the MIT license.

- - +

Released under the MIT license.

+ + \ No newline at end of file diff --git a/guide/custom-filters/index.html b/guide/custom-filters/index.html index 85d11c35..a32e3b54 100644 --- a/guide/custom-filters/index.html +++ b/guide/custom-filters/index.html @@ -7,8 +7,8 @@ - - + + @@ -21,7 +21,7 @@ -
Skip to content
On this page

Custom Filters

Regolith allows you to write your own local files, and register them directly as filters. Special support is provided for filters written with Python, Node JS, and other languages.

To start writing a custom filter, you first need a script to run. We will use hello_world.py as an example:

python
print("Hello world!")
+    
Skip to content
On this page

Custom Filters

Regolith allows you to write your own local files, and register them directly as filters. Special support is provided for filters written with Python, Node JS, and other languages.

To start writing a custom filter, you first need a script to run. We will use hello_world.py as an example:

python
print("Hello world!")
 

Creating Scripts

New filters can be defined anywhere, but the suggested location is in filters folder, at the top level of the Regolith project. This folder isn't created for you, so you need to create it yourself.

Once this folder is created, you can add your scripts here. You can organize with sub-folders if desired.

Filter Data

The accepted flow for Regolith is to store configuration scripts and configs inside of the data folder. This folder has special support that makes it easy to access during compilation. Read more about the data folder here.

Registering Custom Filter

Now you can register your script by placing the filter into filterDefinitions. Here is a full example, which defines a new filter named "test", and runs it in the "default" profile.

json
{
   "name": "example",
   "author": "example",
@@ -63,9 +63,9 @@
     "message": "Hello World!"
   }
 }
-

This will generate: python ./filters/message.py {'message':'Hello World!'}

This is useful for passing user-defined settings into your filter. Simply handle the first argument in the argument array, and interpret it as json!

Filter Environment Variables

Every filter process ran by regolith has following additional environment variables:

  • FILTER_DIR - This environment variable contains an absolute path to the cache directory, where currently ran filter is.
  • ROOT_DIR - This environemnt variable contains an absolute path to the project root directory, where config.json file is.

Released under the MIT license.

- - +

This will generate: python ./filters/message.py {'message':'Hello World!'}

This is useful for passing user-defined settings into your filter. Simply handle the first argument in the argument array, and interpret it as json!

Filter Environment Variables

Every filter process ran by regolith has following additional environment variables:

  • FILTER_DIR - This environment variable contains an absolute path to the cache directory, where currently ran filter is.
  • ROOT_DIR - This environemnt variable contains an absolute path to the project root directory, where config.json file is.

Released under the MIT license.

+ + \ No newline at end of file diff --git a/guide/data-folder/index.html b/guide/data-folder/index.html index 455395e7..2705c8f8 100644 --- a/guide/data-folder/index.html +++ b/guide/data-folder/index.html @@ -7,8 +7,8 @@ - - + + @@ -21,7 +21,7 @@ -
Skip to content
On this page

Data Folder

The Regolith data folder is a special folder where configuration files can be stored.

Location

By default, the data folder is stored in ./packs/data. This folder will be created for you when you run regolith init.

If you would like to change the data folder location, you may do so by editing "dataPath": "./packs/data". Please be aware you will need to create the folder yourself!

Remote Filter Installation

When a remote filter is installed, it has the opportunity to place some files into your data folder.

If the remote filter repository contains a data folder, at the same level as filter.json, the contents will be moved into data/filter_name/*. This is our supported "first time setup" flow. If you're developing a remote filter, you are encouraged to use the data folder, and create configuration files with sensible defaults.

WARNING

Don't worry! Your data won't be lost. regolith install will never overwrite your data files. If the folder is already in use during installation, a warning will be logged and the step will be skipped.

Accessing the Data Folder

When Regolith runs, it will move the data folder into the tmp directory, along with the RP and BP folders. You can access the files here directly, just as you do the pack files.

For example:

python
with open('./data/bump_manifest/version.json', 'r') as f:
+    
Skip to content
On this page

Data Folder

The Regolith data folder is a special folder where configuration files can be stored.

Location

By default, the data folder is stored in ./packs/data. This folder will be created for you when you run regolith init.

If you would like to change the data folder location, you may do so by editing "dataPath": "./packs/data". Please be aware you will need to create the folder yourself!

Remote Filter Installation

When a remote filter is installed, it has the opportunity to place some files into your data folder.

If the remote filter repository contains a data folder, at the same level as filter.json, the contents will be moved into data/filter_name/*. This is our supported "first time setup" flow. If you're developing a remote filter, you are encouraged to use the data folder, and create configuration files with sensible defaults.

WARNING

Don't worry! Your data won't be lost. regolith install will never overwrite your data files. If the folder is already in use during installation, a warning will be logged and the step will be skipped.

Accessing the Data Folder

When Regolith runs, it will move the data folder into the tmp directory, along with the RP and BP folders. You can access the files here directly, just as you do the pack files.

For example:

python
with open('./data/bump_manifest/version.json', 'r') as f:
   print(json.load(f))
 

Saving Data

To save data, you will need to add "exportData": true, to your filter.json definition. This is opt-in, to avoid slow copying of large data folders.

When regolith is finished running, data folders marked with exportData will be moved from the temporary location, back into the normal location. This flow allows you to store persistent data, by editing or creating new files.

For example if your filter is called hello_world, with exportData set to true, then you would be expected to store data into data/hello_world/*.

WARNING

This stands in contrast to the RP and BP folders, which will not be saved back into the project!

For example:

filter.json

json
{
     "description": "An example of using export data",
@@ -36,9 +36,9 @@
 }
 

filter

python
with open('./data/bump_manifest/version.json', 'w') as f:
   json.dump({'version': '1.0'}, f)
-

Released under the MIT license.

- - +

Released under the MIT license.

+ + \ No newline at end of file diff --git a/guide/deno-filters/index.html b/guide/deno-filters/index.html index 213ce8ba..55183507 100644 --- a/guide/deno-filters/index.html +++ b/guide/deno-filters/index.html @@ -7,8 +7,8 @@ - - + + @@ -21,13 +21,13 @@ -
Skip to content
On this page

Deno Filters

Deno is a new age javascript/typescript runtime with first class typescript support.

Installing Deno

Before you can run deno filters, you will need to install Deno.

Running Deno code as Filter

The syntax for running a deno filter is this:

json
{
+    
Skip to content
On this page

Deno Filters

Deno is a new age javascript/typescript runtime with first class typescript support.

Installing Deno

Before you can run deno filters, you will need to install Deno.

Running Deno code as Filter

The syntax for running a deno filter is this:

json
{
   "runWith": "deno",
   "script": "./filters/example.ts"
 }
-

Requirements and Dependencies

Deno manages and installs dependencies on runtime. So no additional setup required.

Released under the MIT license.

- - +

Requirements and Dependencies

Deno manages and installs dependencies on runtime. So no additional setup required.

Released under the MIT license.

+ + \ No newline at end of file diff --git a/guide/dotnet-filters/index.html b/guide/dotnet-filters/index.html index d81a641c..445b4791 100644 --- a/guide/dotnet-filters/index.html +++ b/guide/dotnet-filters/index.html @@ -7,8 +7,8 @@ - - + + @@ -21,13 +21,13 @@ -
Skip to content
On this page

.NET Filters

.NET filters run programs written in the .NET framework using dotnet command.

Installing .NET

Before you can run .NET filters, you will need to install .NET Runtime.

Running .NET applications as Filter

The syntax for running a .NET filter is this:

json
{
+    
Skip to content
On this page

.NET Filters

.NET filters run programs written in the .NET framework using dotnet command.

Installing .NET

Before you can run .NET filters, you will need to install .NET Runtime.

Running .NET applications as Filter

The syntax for running a .NET filter is this:

json
{
   "runWith": "dotnet",
   "path": "./filters/example.dll"
 }
-

Released under the MIT license.

- - +

Released under the MIT license.

+ + \ No newline at end of file diff --git a/guide/exe-filters/index.html b/guide/exe-filters/index.html index dc909974..a2e3b1c5 100644 --- a/guide/exe-filters/index.html +++ b/guide/exe-filters/index.html @@ -7,8 +7,8 @@ - - + + @@ -21,7 +21,7 @@ -
Skip to content
On this page

Executable Filters

Exe filters allow the usage of executables.

Running executable as a Filter

If you have have achieved the feat of having one executable for all platforms (or only care about one platform), you can simply do the following:

json
{
+    
Skip to content
On this page

Executable Filters

Exe filters allow the usage of executables.

Running executable as a Filter

If you have have achieved the feat of having one executable for all platforms (or only care about one platform), you can simply do the following:

json
{
   "runWith": "exe",
   "exe": "path/to/your/executable"
 }
@@ -40,9 +40,9 @@
   "exe": "coolThingMac",
   "when": "os == \"darwin\""
 },
-

You can learn more about the when property on in the documentation of the "config.json" file here.

Released under the MIT license.

- - +

You can learn more about the when property on in the documentation of the "config.json" file here.

Released under the MIT license.

+ + \ No newline at end of file diff --git a/guide/experiments/index.html b/guide/experiments/index.html index dab29d48..aa3c9bba 100644 --- a/guide/experiments/index.html +++ b/guide/experiments/index.html @@ -7,8 +7,8 @@ - - + + @@ -21,11 +21,11 @@ -
Skip to content
On this page

Experiments

Experiments are new experimental features of Regolith to be released in the future versions, once proven to be stable and useful. The experiments can be enabled with the --experiments flag.

Currently Available Experiments

size_time_check

The size_time_check is an experiment that aims to speed up regolith run and regolith watch commands. It achieves this by checking the size and modification time of the files before moving them between working and output directories. If the source file is the same size and has the same modification time as the destination file, the target file will remain untouched (Regolith assumes that the files are the same).

The size_time_check should greatly speed up the exports of large projects.

The downside of this approach is that on the first run, the export will be slower, but on subsequent runs, the export will be much faster. This means that the size_time_check is not recommended for CI where Regolith is run only once.

Usage:

regolith run --experiments size_time_check
+    
Skip to content
On this page

Experiments

Experiments are new experimental features of Regolith to be released in the future versions, once proven to be stable and useful. The experiments can be enabled with the --experiments flag.

Currently Available Experiments

size_time_check

The size_time_check is an experiment that aims to speed up regolith run and regolith watch commands. It achieves this by checking the size and modification time of the files before moving them between working and output directories. If the source file is the same size and has the same modification time as the destination file, the target file will remain untouched (Regolith assumes that the files are the same).

The size_time_check should greatly speed up the exports of large projects.

The downside of this approach is that on the first run, the export will be slower, but on subsequent runs, the export will be much faster. This means that the size_time_check is not recommended for CI where Regolith is run only once.

Usage:

regolith run --experiments size_time_check
 regolith watch --experiments size_time_check
-

Released under the MIT license.

- - +

Released under the MIT license.

+ + \ No newline at end of file diff --git a/guide/export-targets/index.html b/guide/export-targets/index.html index 020b2d81..3c50a855 100644 --- a/guide/export-targets/index.html +++ b/guide/export-targets/index.html @@ -7,8 +7,8 @@ - - + + @@ -21,11 +21,13 @@ -
Skip to content
On this page

Export Targets

Export Targets determine where your generated files will go, after Regolith is finished compiling. You can set this target at the top level of Regolith, but it can be overridden inside individual profiles, if needed.

Export is an object, and the keys inside determine how it will function. The target key is required, but some export targets require additional keys.

Configuration

Some configuration properties may be used with all export targets.

readOnly

readOnly changes the permissions of exported files to read-only. The default value is false. This property can be used to protect against accidental editing of files that should only be edited by Regolith!

Additional Configuration for Non-Windows Users

Some of the export targets listed below wouldn't make sense on systems other than Windows with Minecraft installed. They often rely on finding the com.mojang path first, and then placing the files in a path relative to that. This problem can be solved by setting environment variables that Regolith will use instead of the com.mojang path.

  • COM_MOJANG_PREVIEW - A fake path to the com.mojang folder in Minecraft preview releases. This is used by the preview export target.
  • COM_MOJANG - A fake path to the com.mojang folder in regular Minecraft releases.

Export Targets

These are the export targets that Regolith offers.

Development

The development export target will place the compiled packs into your com.mojang development_*_packs folders.

json
"export": {
-    "target": "development"
+    
Skip to content
On this page

Export Targets

Export Targets determine where your generated files will go, after Regolith is finished compiling. You can set this target at the top level of Regolith, but it can be overridden inside individual profiles, if needed.

Export is an object, and the keys inside determine how it will function. The target key is required, but some export targets require additional keys.

Configuration

Some configuration properties may be used with all export targets.

readOnly

readOnly changes the permissions of exported files to read-only. The default value is false. This property can be used to protect against accidental editing of files that should only be edited by Regolith!

Additional Configuration for Non-Windows Users

Some of the export targets listed below wouldn't make sense on systems other than Windows with Minecraft installed. They often rely on finding the com.mojang path first, and then placing the files in a path relative to that. This problem can be solved by setting environment variables that Regolith will use instead of the com.mojang path.

  • COM_MOJANG_PREVIEW - A fake path to the com.mojang folder in Minecraft preview releases. This is used by the preview export target.
  • COM_MOJANG - A fake path to the com.mojang folder in regular Minecraft releases.

Export Targets

These are the export targets that Regolith offers.

Development

The development export target will place the compiled packs into your com.mojang development_*_packs folders of the specified Minecraft build (standard, preview or education endition).

json
"export": {
+    "target": "development",
+    "build": "standard" // or "preview" or "education"
 }
 

Optionally, you can use rpName and bpName to specify the names of the folders that will be created in the development_*_packs folders. You can read more about these options at the end of this page of the documentation.

json
"export": {
     "target": "development",
+    "build": "standard",
     "rpName": "'my_rp'",
     "bpName": "'my_bp'"
 }
@@ -42,8 +44,9 @@
     "rpPath": "...",
     "bpPath": "...
 }
-

The exact export target doesn't support using rpName and bpName. The rpPath and bpPath should provide full paths to the desired locations.

World

The World export target will place the compiled files into a specific world. This is useful for teams that prefer working in-world, as opposed to in the development pack folders.

You need to use either worldName or worldPath to select the world. worldPath supports environment variables by using the %VARIABLE_NAME% syntax.

Example:

json
"export": {
+

The exact export target doesn't support using rpName and bpName. The rpPath and bpPath should provide full paths to the desired locations.

World

The World export target will place the compiled files into a specific world. This is useful for teams that prefer working in-world, as opposed to in the development pack folders.

You need to use either worldName or worldPath to select the world. worldPath supports environment variables by using the %VARIABLE_NAME% syntax. If you use worldName, you have to specify the Minecraft build you're using - standard, preview or education.

Example:

json
"export": {
     "target": "world",
+    "build": "standard",
     "worldName": "..."  // This
     // "worldPath": "..."   // OR this
 }
@@ -53,17 +56,9 @@
     "rpName": "'my_rp'",
     "bpName": "'my_bp'"
 }
-

Preview

The development export target will place the compiled packs into your (minecraft preview) com.mojang development_*_packs folder.

json
"export": {
-    "target": "preview"
-}
-

Optionally, you can use rpName and bpName to specify the names of the folders that will be created in the development_*_packs folders. You can read more about these options at the end of this page of the documentation.

json
"export": {
-    "target": "preview",
-    "rpName": "'my_rp'",
-    "bpName": "'my_bp'"
-}
-

The rpName and bpName expressions

The rpName and bpName are expressions evaulated using the go-simple-eval library. They let you specify the names of the folders of the exported packs in some of the export targets.

The go-simple-eval library allows you to use simple expressions to generate the names of the folders. The expressions can use the following variables:

  • project.name - The name of the project.
  • project.author - The author of the project.
  • os - The host operating system.
  • arch - The host architecture.
  • debug - whether regolith is running in debug mode or not.
  • version - The version of regolith.
  • profile - The name of the profile being run.

Go-simple-eval can concatenate strings using the + operator. The strings must be enclosed in single quotes.

Released under the MIT license.

- - +

The rpName and bpName expressions

The rpName and bpName are expressions evaulated using the go-simple-eval library. They let you specify the names of the folders of the exported packs in some of the export targets.

The go-simple-eval library allows you to use simple expressions to generate the names of the folders. The expressions can use the following variables:

  • project.name - The name of the project.
  • project.author - The author of the project.
  • os - The host operating system.
  • arch - The host architecture.
  • debug - whether regolith is running in debug mode or not.
  • version - The version of regolith.
  • profile - The name of the profile being run.

Go-simple-eval can concatenate strings using the + operator. The strings must be enclosed in single quotes.

Released under the MIT license.

+ + \ No newline at end of file diff --git a/guide/filter-run-modes/index.html b/guide/filter-run-modes/index.html index e0ebc407..a0aa9056 100644 --- a/guide/filter-run-modes/index.html +++ b/guide/filter-run-modes/index.html @@ -7,8 +7,8 @@ - - + + @@ -21,12 +21,12 @@ -
Skip to content
On this page

Filter Run Modes

There are 3 ways of running Regolith:

  • regolith run
  • regolith watch
  • regolith apply-filter

Run and Watch Commands

Regolith run and watch are very similar to each other. They run a profile. The difference is that the watch command will watch for changes in the RP, BP and data folders and rerun the profile when they change. The run command will run the profile only once.

The syntax for run and watch command is:

regolith run [profile-name]
+    
Skip to content
On this page

Filter Run Modes

There are 3 ways of running Regolith:

  • regolith run
  • regolith watch
  • regolith apply-filter

Run and Watch Commands

Regolith run and watch are very similar to each other. They run a profile. The difference is that the watch command will watch for changes in the RP, BP and data folders and rerun the profile when they change. The run command will run the profile only once.

The syntax for run and watch command is:

regolith run [profile-name]
 
regolith watch [profile-name]
 

Where [profile-name] is the name of the profile defined your "config.json" file you want to run. The [profile-name] is optional. If you don't specify it, the "default" profile will be run.

A single run performs the following steps:

  1. Copy your source files into a temporary folder.
  2. Runs all of the filters of the profile.
  3. Moves the files to the target location defined in the "export" property of the profile.

Filters work on the copies of RP, BP, and data. Thanks to the use of copies, RP and BP cannot be modified by the filters. The data folder can be modified because after a successful run Regolith moves the files of the copy to the the original data folder (this is useful for the filters so that they can store some data between runs).

Apply-Filter Command - Running Regolith Destructively

Running Regolith with regolith run or regolith watch is a safe operation because the filters can only modify the data folder but not RP and BP. Sometimes you want to modify the RP and BP directly in a destructive way. This is where the apply-filter command come in handy. You can apply any filter by running the regolith apply-filter command. Unlike the regolith run command, the regolith apply-filter command runs only one filter instead of running entire profile.

The command is used like this:

regolith apply-filter <filter-name> [args...]
-

The filter-name is the name of one of the filters installed in your project. The args is a list of arguments passed to the filter.

Released under the MIT license.

- - +

The filter-name is the name of one of the filters installed in your project. The args is a list of arguments passed to the filter.

Released under the MIT license.

+ + \ No newline at end of file diff --git a/guide/filters/index.html b/guide/filters/index.html index dd6a8da5..7a869a08 100644 --- a/guide/filters/index.html +++ b/guide/filters/index.html @@ -7,8 +7,8 @@ - - + + @@ -21,9 +21,9 @@ -
Skip to content
On this page

Filters Introduction

A filter is any program or script that takes the files inside of your RP and BP and transforms them in some way. Many of these filters have already been written, and are included as part of the standard library. You may also be interested in community filters

At it's core, you can think of a filter as the ability to run arbitrary code during the compilation process. This allows you to accomplish a number of tasks:

  • Linting and error checking
  • Code generation/automation
  • Interpreting custom syntax

Released under the MIT license.

- - +
Skip to content
On this page

Filters Introduction

A filter is any program or script that takes the files inside of your RP and BP and transforms them in some way. Many of these filters have already been written, and are included as part of the standard library. You may also be interested in community filters

At it's core, you can think of a filter as the ability to run arbitrary code during the compilation process. This allows you to accomplish a number of tasks:

  • Linting and error checking
  • Code generation/automation
  • Interpreting custom syntax

Released under the MIT license.

+ + \ No newline at end of file diff --git a/guide/getting-started/index.html b/guide/getting-started/index.html index 890d1bba..e5069ecf 100644 --- a/guide/getting-started/index.html +++ b/guide/getting-started/index.html @@ -8,8 +8,8 @@ - - + + @@ -22,7 +22,7 @@ -
Skip to content
On this page

Getting Started

INFO

To get started with Regolith, you should first read our introduction page, and the installation page.

You can test for installation by running regolith inside of a terminal. This guide will assume you have installed regolith directly, but you can follow along with a stand-alone build. Just ensure that the executable is placed inside of your project folder.

If you run into issues installing, you can check our troubleshooting guide for tips.

WARNING

Regolith is a command line application. It assumes some familiarity with how to navigate and use the command line. You can get a refresher here.

Creating a new Project

To create a new project, navigate to a blank folder, and run regolith init. This will create a few files:

In short:

  • .regolith is a special folder that regolith uses to store data. You don't need to look here.
  • packs/BP stores your behavior pack.
  • packs/RP stores your resource pack.
  • packs/data is a special folder that filters can use to store data.
  • config.json is the configuration file for Regolith.
  • .gitignore is a file which tells Git source control to ignore certain files. It's not a partof of Regolith but we highly recommend using Git to manage your projects.

Config file

Next, open up config.json. We will be configuring a few fields here, for your addon.

json
{
+    
Skip to content
On this page

Getting Started

INFO

To get started with Regolith, you should first read our introduction page, and the installation page.

You can test for installation by running regolith inside of a terminal. This guide will assume you have installed regolith directly, but you can follow along with a stand-alone build. Just ensure that the executable is placed inside of your project folder.

If you run into issues installing, you can check our troubleshooting guide for tips.

WARNING

Regolith is a command line application. It assumes some familiarity with how to navigate and use the command line. You can get a refresher here.

Creating a new Project

To create a new project, navigate to a blank folder, and run regolith init. This will create a few files:

In short:

  • .regolith is a special folder that regolith uses to store data. You don't need to look here.
  • packs/BP stores your behavior pack.
  • packs/RP stores your resource pack.
  • packs/data is a special folder that filters can use to store data.
  • config.json is the configuration file for Regolith.
  • .gitignore is a file which tells Git source control to ignore certain files. It's not a partof of Regolith but we highly recommend using Git to manage your projects.

Config file

Next, open up config.json. We will be configuring a few fields here, for your addon.

json
{
   "name": "Project name", // Enter your pack name here. (Example: spooky_gravestones)
   "author": "Your name",  // Enter your author name here. (example: SirLich)
   "packs": {
@@ -35,6 +35,7 @@
         "filters": [],
         "export": {
           "target": "development",
+          "build": "standard",
           "readOnly": false
         }
       }
@@ -46,7 +47,8 @@
 

Later on you can play with the additional configuration options, but for now, just set a project name, and author name.

TIP

We suggest using a name like dragons or cars for the project name, as opposed to My Dragon Adventure Map, since the project name will be used as the folder name for the final export if you're using the "development" export target.

Creating your Addon

At this point, you will want to add some files into your regolith project. If you have an existing project, you can copy/paste the files into the RP (resource pack) and BP (behavior pack) folders.

If you don't have an addon prepared, you may also create a fresh one directly in your project folder, following the normal rules. Add a manifest.json, a pack_icon.png, and any other files you want. The files should go directly into the RP and BP folders, like this:

Running Regolith

There are two ways of running Regolith profiles regolith run and regolith watch. They both run a profile defined in config.json file.

The regolith run [profile-name] command runs provided profile once. If you don't specify a profile, it will run the profile named "default".

The regolith watch [profile-name] command works the same as regolith run, but it will watch your source files and rerun the profile when they change. If you're using regolith run you have to do it manually every time.

By default the export is set to "development", which means that the files will be copied to the development_behavior_packs and development_resource_packs folders of com.mojang. The names of folders created in this export mode are based on the name of the project like project_name_bp and project_name_rp.

Adding your first Filter

Regolith contains a very powerful filter system, that allows you to write filters in many languages, as well as running existing filters from the internet. For now, we will simply use the standard library, which is a set of approved filters that we maintain.

As an example, we will use the texture_list filter, which automatically creates the texture_list.json file for you. To learn more about this file, and why automating it is helpful, read here.

Installing

WARNING

The install command relies on git. You may download git here.

You can install this filter by running regolith install texture_list, which will make the filter available for use.

The last step is selecting where/when the filter will run. In our case, we want to run the filter every time we export using the default default profile.

You should adjust the default profile in config.json to look like this:

json
"default": {
   "export": {
     "readOnly": false,
-    "target": "development"
+    "target": "development",
+    "build": "standard"
   },
   "filters": [
     {
@@ -54,9 +56,9 @@
     }
   ]
 }
-

Running

Now, you can re-run regolith run.

Check com.mojang, and open the new texture_list.json file in RP/textures/texture_list.json. Every time you run regolith, this file will be re-created, based on your current textures. No need to manually edit it ever again!

{: .notice--warning} Warning: If your resource pack already contains texture_list.json, you should delete it. You don't need to manually worry about it anymore - Regolith will handle it!

{: .notice--warning} Warning: If your project doesn't have any textures, than texture_list.json will simply create a blank file []. Consider adding some textures to see the filter at work!

Whats Next

Now that you've created your first Regolith project, and installed your first filters, you are well on your way to being a Regolith expert! You should check out the standard library, to see if additional filters might be useful for you.

Otherwise, you can learn about writing custom filters or dive deeper into Regolith commands by reading about Filter Run Modes and Installing and Updating Filters.

Released under the MIT license.

- - +

Running

Now, you can re-run regolith run.

Check com.mojang, and open the new texture_list.json file in RP/textures/texture_list.json. Every time you run regolith, this file will be re-created, based on your current textures. No need to manually edit it ever again!

WARNING

Warning: If your resource pack already contains texture_list.json, you should delete it. You don't need to manually worry about it anymore - Regolith will handle it!

WARNING

Warning: If your project doesn't have any textures, than texture_list.json will simply create a blank file []. Consider adding some textures to see the filter at work!

Whats Next

Now that you've created your first Regolith project, and installed your first filters, you are well on your way to being a Regolith expert! You should check out the standard library, to see if additional filters might be useful for you.

Otherwise, you can learn about writing custom filters or dive deeper into Regolith commands by reading about Filter Run Modes and Installing and Updating Filters.

Released under the MIT license.

+ + \ No newline at end of file diff --git a/guide/installing-filters/index.html b/guide/installing-filters/index.html index f74eee2d..dc4daaf0 100644 --- a/guide/installing-filters/index.html +++ b/guide/installing-filters/index.html @@ -7,8 +7,8 @@ - - + + @@ -21,12 +21,13 @@ -
Skip to content
On this page

Installing and Updating Filters

To start using a filter, you need to do four things:

  1. Ensure you can run the filter
  2. Install the filter
  3. Add the filter to the profile which you would like to use it.
  4. Run your profile, to test it out!

Filter Dependencies

Filters are written in programming languages. These languages may not be installed on your computer by default. Before installing a filter, you should ensure you have the proper programming language installed. The "Filter Types" documentation has detailed installation instructions for every regolith-supported language!

For example, if the filter relies on Python, you can find installation instructions here.

Installing a Filter

Regolith contains a powerful installation command, which will download a filter from GitHub, and install any required libraries for you. In general, the format is like this: regolith install <filter_identifier>

The value of filter_identifier will depend on where the filter is hosted. Filters listed on the Bedrock-OSS/regolith-filter-resolver repository can be installed by their name. For example, to install the name_ninja filter, you would run the:

regolith install name_ninja
+    
Skip to content
On this page

Installing and Updating Filters

To start using a filter, you need to do four things:

  1. Ensure you can run the filter
  2. Install the filter
  3. Add the filter to the profile which you would like to use it.
  4. Run your profile, to test it out!

Filter Dependencies

Filters are written in programming languages. These languages may not be installed on your computer by default. Before installing a filter, you should ensure you have the proper programming language installed. The "Filter Types" documentation has detailed installation instructions for every regolith-supported language!

For example, if the filter relies on Python, you can find installation instructions here.

Installing a Filter

Regolith contains a powerful installation command, which will download a filter from GitHub, and install any required libraries for you. In general, the format is like this: regolith install <filter_identifier>

The value of filter_identifier will depend on where the filter is hosted. Filters listed on the Bedrock-OSS/regolith-filter-resolver repository can be installed by their name. For example, to install the name_ninja filter, you would run the:

regolith install name_ninja
 

If the filter is not listed on the resolver repository, you will need to use the following format: github.com/<user>/<repository>/<folder>.

For example, to install name_ninja using the full format, you would run:

regolith install github.com/Bedrock-OSS/regolith-filters/name_ninja
 

The longer form can be used to install filters from private repositories.

WARNING

The install command relies on git. You may download git here.

Adding Filter to Profile

After installing, the filter will appear inside of filter_definitions of config.json. You can now add this filter to a profile like this:

json
"default": {
   "export": {
     "readOnly": false,
-    "target": "development"
+    "target": "development",
+    "build": "standard"
   },
   "filters": [
     {
@@ -34,14 +35,15 @@
     }
   ]
 }
-

Install All

Regolith is intended to be used with git version control, and by default the .regolith folder is ignored. That means that when you collaborate on a project, or simply re-clone your existing projects, you will need an easy way to download all the filters again!

You may use the command regolith install-all, which will check config.json, and install every filter in the filterDefinitions.

{: .notice--warning} This is only intended to be used with existing projects. To install new filters, use regolith install.

Filter Versioning

Filters in Regolith are optionally versioned with a semantic version. As filters get updated, new versions will be released, and you can optionally update.

{: .notice--warning} If you don't specify a version, the install command will pick a sensible default. First, it will search for the latest release. If that doesn't exist (such as a filter that has no versions), it will select the latest commit in the repository. In both cases, the installed version will be pinned.

Installing a Specific Version

When installing, you can optionally include a version key after two equals signs (==):

  • ⭐ Version: regolith install name_ninja==1.2.8
  • Unpinned Head: regolith install name_ninja==HEAD
  • Unpinned Latest: regolith install name_ninja==latest
  • SHA: regolith install name_ninja==adf506df267d10189b6edcdfeec6c560247b823f

Pinned Versions

In your config.json, every filter will include a version field, which specifies which version of the filter to use. By default, this version will be pinned, meaning that it won't be updated, even if new versions release. This provides you safety, and ensures that your projects will continue to operate without interruption even if filters release breaking changes.

Optionally, you may mark filters as unpinned, which signifies that your project wants the latest version of the filter, no questions asked. There are two available unpinned versions:

  • latest points to the latest released version tag.
  • HEAD points to the latest commit of the repository, regardless of release tags.

Updating your Filters

If you want to update the version of the filter used in your project, you can use the regolith install command again. By default, the install command is not allowed to update existing filters, but you can use the --update or --force flag to change this behavior. The flag must be used after the install arguments.

regolith install name_ninja --update
-

Alternatively, you can modify the version field in config.json and run regolith install-all. Regolith install-all is useful for working in a team, when other team members may have to update or add filters to the project.

Updating resolvers

When using short names for filters, Regolith uses a resolver file from a remote repository to determine the URL of the filter. By default, this remote repository is cached and only updated after 5 minutes since last update. If you want to update the resolver file immediately, you can use the regolith update-resolver command.

Alternatively, you can use the --force-resolver-update flag to force the resolvers to update when installing a filter.

regolith install name_ninja --force-resolver-update
+

Install All

Regolith is intended to be used with git version control, and by default the .regolith folder is ignored. That means that when you collaborate on a project, or simply re-clone your existing projects, you will need an easy way to download all the filters again!

You may use the command regolith install-all, which will check config.json, and install every filter in the filterDefinitions.

WARNING

This is only intended to be used with existing projects. To install new filters, use regolith install.

Filter Versioning

Filters in Regolith are optionally versioned with a semantic version. As filters get updated, new versions will be released, and you can optionally update.

WARNING

If you don't specify a version, the install command will pick a sensible default. First, it will search for the latest release. If that doesn't exist (such as a filter that has no versions), it will select the latest commit in the repository. In both cases, the installed version will be pinned.

Installing a Specific Version

When installing, you can optionally include a version key after two equals signs (==):

  • ⭐ Version: regolith install name_ninja==1.2.8
  • Unpinned Head: regolith install name_ninja==HEAD
  • Unpinned Latest: regolith install name_ninja==latest
  • SHA: regolith install name_ninja==adf506df267d10189b6edcdfeec6c560247b823f

Pinned Versions

In your config.json, every filter will include a version field, which specifies which version of the filter to use. By default, this version will be pinned, meaning that it won't be updated, even if new versions release. This provides you safety, and ensures that your projects will continue to operate without interruption even if filters release breaking changes.

Optionally, you may mark filters as unpinned, which signifies that your project wants the latest version of the filter, no questions asked. There are two available unpinned versions:

  • latest points to the latest released version tag.
  • HEAD points to the latest commit of the repository, regardless of release tags.

Updating your Filters

If you want to update the version of the filter used in your project, you can use the regolith install command again. By default, the install command is not allowed to update existing filters, but you can use the --update or --force flag to change this behavior. The flag must be used after the install arguments.

regolith install name_ninja --update
+

Alternatively, you can modify the version field in config.json and run regolith install-all. Regolith install-all is useful for working in a team, when other team members may have to update or add filters to the project.

If you want to update all filters in your project, you can use the --update flag with the install-all command.

regolith install-all --update
+

Updating resolvers

When using short names for filters, Regolith uses a resolver file from a remote repository to determine the URL of the filter. By default, this remote repository is cached and only updated after 5 minutes since last update. If you want to update the resolver file immediately, you can use the regolith update-resolver command.

Alternatively, you can use the --force-resolver-update flag to force the resolvers to update when installing a filter.

regolith install name_ninja --force-resolver-update
 

Updating filter cache

Regolith caches the filter repository when you install online filters. To avoid unnecessary frequent updates, Regolith skips them for installations that occur less than 5 minutes after the last update. However, if you need to update the cache immediately, you can use the --force-filter-update flag while installing a filter.

bash
regolith install name_ninja --force-filter-update
 # OR
 regolith install-all --force-filter-update
-

Released under the MIT license.

- - +

Released under the MIT license.

+ + \ No newline at end of file diff --git a/guide/installing/index.html b/guide/installing/index.html index 38c50c5a..a7feb5d5 100644 --- a/guide/installing/index.html +++ b/guide/installing/index.html @@ -7,8 +7,8 @@ - - + + @@ -21,12 +21,12 @@ -
Skip to content
On this page

Installing

Windows Installation Using winget

INFO

Not every Windows computer has winget installed. If this is the case for your computer, you can install Regolith using the MSI file available on GitHub (see next section for instructions).

To install the application "Regolith" using winget, follow these steps:

  1. Open a command prompt or terminal window and enter the following command:
winget install Bedrock-OSS.regolith
+    
Skip to content
On this page

Installing

Windows Installation Using winget

INFO

Not every Windows computer has winget installed. If this is the case for your computer, you can install Regolith using the MSI file available on GitHub (see next section for instructions).

To install the application "Regolith" using winget, follow these steps:

  1. Open a command prompt or terminal window and enter the following command:
winget install Bedrock-OSS.regolith
 

This will search the winget repository for the package "Bedrock-OSS.regolith" and install it on your system.

  1. If the installation is successful, you should see a message indicating that the package has been installed.

To update Regolith in the future, simply run the following command:

winget upgrade Bedrock-OSS.regolith
 

This will check for any available updates to the Regolith package and install them on your system.

Windows Installation Using an .msi File

Installation

Alternatively, you can install Regolith using the MSI file available on GitHub at the following link: https://github.com/Bedrock-OSS/regolith/releases/latest. The file will be named using the pattern regolith-x.x.x.msi, where x.x.x is the version number. To install Regolith using the MSI file, follow these steps:

Download the MSI file from the link above.

Run the MSI file to begin the installation process. Follow the prompts to complete the installation.

Updates

To update Regolith after installation, you can use the "regolith-update.ps1" PowerShell script that is included with the installation. To run the script, follow these steps:

  1. Open a PowerShell window.
  2. Run the following command:
regolith-update.ps1
-

This will check for any available updates to Regolith and install them on your system.

Linux, Mac, and Windows (stand-alone)

Regolith can also be installed stand-alone. Simply install the correct zip for your operating system. For Windows, this is most likely regolith_x.x.x_Windows_x86_64.zip.

You may unzip this package, and place the regolith.exe file somewhere convenient. In stand-alone mode, you will need a copy of the regolith executable in every project that you intend to use Regolith with. Or, you can add the executable to your PATH environment variable.

Checking Installation

After installing, Regolith can be used in any command-prompt by typing regolith. You should see something like this:

Released under the MIT license.

- - +

This will check for any available updates to Regolith and install them on your system.

Linux, Mac, and Windows (stand-alone)

Regolith can also be installed stand-alone. Simply install the correct zip for your operating system. For Windows, this is most likely regolith_x.x.x_Windows_x86_64.zip.

You may unzip this package, and place the regolith.exe file somewhere convenient. In stand-alone mode, you will need a copy of the regolith executable in every project that you intend to use Regolith with. Or, you can add the executable to your PATH environment variable.

Checking Installation

After installing, Regolith can be used in any command-prompt by typing regolith. You should see something like this:

Released under the MIT license.

+ + \ No newline at end of file diff --git a/guide/java-filters/index.html b/guide/java-filters/index.html index 6bc49dd4..cd0e4109 100644 --- a/guide/java-filters/index.html +++ b/guide/java-filters/index.html @@ -7,8 +7,8 @@ - - + + @@ -21,13 +21,13 @@ -
Skip to content
On this page

Java Filters

Java is a high-level compiled language, that runs inside the Java Virtual Machine.

Installing Java

Before you can run Java filters, you will need to install Java Development Kit.

There are many available JDKs to choose from. Few recommended are:

Running Java applications as Filter

The syntax for running a java jar is this:

json
{
+    
Skip to content
On this page

Java Filters

Java is a high-level compiled language, that runs inside the Java Virtual Machine.

Installing Java

Before you can run Java filters, you will need to install Java Development Kit.

There are many available JDKs to choose from. Few recommended are:

Running Java applications as Filter

The syntax for running a java jar is this:

json
{
   "runWith": "java",
   "script": "./filters/example.jar"
 }
-

Dependencies

All dependencies should be bundled into a "fat JAR" as this filter type does not have an automatic dependency fetching.

Released under the MIT license.

- - +

Dependencies

All dependencies should be bundled into a "fat JAR" as this filter type does not have an automatic dependency fetching.

Released under the MIT license.

+ + \ No newline at end of file diff --git a/guide/local-filters/index.html b/guide/local-filters/index.html index 0de35398..56591738 100644 --- a/guide/local-filters/index.html +++ b/guide/local-filters/index.html @@ -7,8 +7,8 @@ - - + + @@ -21,13 +21,13 @@ -
Skip to content
On this page

Local Filters

Local filters are great for quickly prototyping, or for personal filters that you do not want to share with anyone. In this case, you can simply run a local file:

json
{
+    
Skip to content
On this page

Local Filters

Local filters are great for quickly prototyping, or for personal filters that you do not want to share with anyone. In this case, you can simply run a local file:

json
{
     "runWith": "python",
     "script": "./filters/example.py"
 }
-

The . path will be local to the root of the regolith project.

Released under the MIT license.

- - +

The . path will be local to the root of the regolith project.

Released under the MIT license.

+ + \ No newline at end of file diff --git a/guide/nim-filters/index.html b/guide/nim-filters/index.html index 9faa8e94..1193a80e 100644 --- a/guide/nim-filters/index.html +++ b/guide/nim-filters/index.html @@ -7,8 +7,8 @@ - - + + @@ -21,16 +21,16 @@ -
Skip to content
On this page

Nim Filters

Nim is a statically typed compiled systems programming language. It combines successful concepts from mature languages like Python, Ada and Modula.

Installing Nim

  1. Download the newest version of choosenim.
  2. Open a terminal in the same directory that you downloaded choosenim.
  3. Run choosenim --firstInstall

Running Nim code as Filter

The syntax for running a nim filter is this:

json
{
+    
Skip to content
On this page

Nim Filters

Nim is a statically typed compiled systems programming language. It combines successful concepts from mature languages like Python, Ada and Modula.

Installing Nim

  1. Download the newest version of choosenim.
  2. Open a terminal in the same directory that you downloaded choosenim.
  3. Run choosenim --firstInstall

Running Nim code as Filter

The syntax for running a nim filter is this:

json
{
   "runWith": "nim",
   "script": "./filters/example.nim",
 
   // Optional property that defines the path to the folder with the *.nimble file
   "requirements": "./filters"
 }
-

Requirements and Dependencies

If your filter has dependencies, put a .nimble file in the same directory as your .nim file, alternatively you can specify different path using the "requirements" property. Regolith will look for the nimble file in the folder specified by "requirements" or if it's not defined in the same folder as the script.

Documentation on how to make a .nimble file is located here.

Released under the MIT license.

- - +

Requirements and Dependencies

If your filter has dependencies, put a .nimble file in the same directory as your .nim file, alternatively you can specify different path using the "requirements" property. Regolith will look for the nimble file in the folder specified by "requirements" or if it's not defined in the same folder as the script.

Documentation on how to make a .nimble file is located here.

Released under the MIT license.

+ + \ No newline at end of file diff --git a/guide/node-filters/index.html b/guide/node-filters/index.html index 413ebee3..3efda451 100644 --- a/guide/node-filters/index.html +++ b/guide/node-filters/index.html @@ -7,8 +7,8 @@ - - + + @@ -21,16 +21,16 @@ -
Skip to content
On this page

NodeJS Filters

As an asynchronous event-driven JavaScript runtime, Node.js is designed to build scalable network applications.

Installing NodeJS

Before you can run Node filters, you will need to install NodeJS.

Running NodeJS code as Filter

The syntax for running a nodejs filter is this:

json
{
+    
Skip to content
On this page

NodeJS Filters

As an asynchronous event-driven JavaScript runtime, Node.js is designed to build scalable network applications.

Installing NodeJS

Before you can run Node filters, you will need to install NodeJS.

Running NodeJS code as Filter

The syntax for running a nodejs filter is this:

json
{
   "runWith": "nodejs",
   "script": "./filters/example.js",
 
   // Optional property that defines the path to the folder with the package.json file
   "requirements": "./filters"
 }
-

Requirements and Dependencies

When installing, regolith will check for a package.json file. If requirements property is specified reqolith will look in that folder, otherwise it will look in the folder with the script.

When developing a Node filter with dependencies, you must create this file. You can create a package.json file yourself by using npm init.

Released under the MIT license.

- - +

Requirements and Dependencies

When installing, regolith will check for a package.json file. If requirements property is specified reqolith will look in that folder, otherwise it will look in the folder with the script.

When developing a Node filter with dependencies, you must create this file. You can create a package.json file yourself by using npm init.

Released under the MIT license.

+ + \ No newline at end of file diff --git a/guide/online-filters/index.html b/guide/online-filters/index.html index 85e08c1a..2a66d2f2 100644 --- a/guide/online-filters/index.html +++ b/guide/online-filters/index.html @@ -7,8 +7,8 @@ - - + + @@ -21,7 +21,7 @@ -
Skip to content
On this page

Online Filters

Regolith allows custom filters to be placed on GitHub. This is perfect for a filter that you want to make public, or potentially share internally in a team.

The standard filters library is a good reference for how to structure an online filter, but we will also explain here.

Creating Online Filter

To create an online filter, your github project needs to be structured in a certain way. For starters, every filter needs its own folder, at the top of the github project. This folder name is very important, as it will be the name of the filter.

You should move your programs and scripts into this folder. When your filter is installed, everything in this folder will be downloaded.

filter.json

filter.json is a special file, which you should place at the top level of your filters folder. Once again, check out the standard-library for examples of a property structured regolith filter.

json
{
+    
Skip to content
On this page

Online Filters

Regolith allows custom filters to be placed on GitHub. This is perfect for a filter that you want to make public, or potentially share internally in a team.

The standard filters library is a good reference for how to structure an online filter, but we will also explain here.

Creating Online Filter

To create an online filter, your github project needs to be structured in a certain way. For starters, every filter needs its own folder, at the top of the github project. This folder name is very important, as it will be the name of the filter.

You should move your programs and scripts into this folder. When your filter is installed, everything in this folder will be downloaded.

filter.json

filter.json is a special file, which you should place at the top level of your filters folder. Once again, check out the standard-library for examples of a property structured regolith filter.

json
{
   // Description is a property which currently is not used by Regolith itself, but the web scraper uses
   // it to add descriptions to the filters page of the documentation website.
   "description": "A Hello World Filter - this will be displayed as a description on website pages.",
@@ -37,9 +37,9 @@
     }
   ]
 }
-

The exportData property

This option lets you create remote filters that can modify their data folder. The older versions of Regolith like 0.0.18 used to always export the entire filter data folder back to the source files making the regolith run command destructive. This feature was added to let the filters remember their state between runs. Most of the filters don't need this feature, so moving the files back and forth was a waste of processing time. The exportData property is now disabled by default, but it can be enabled for filters that need it. The exportData property causes Regolith to export the folder named the same as the filter back to the source files. This way you can have both filters that can modify their data folder and filters that can't.

Data Folder

If you need some default configuration files for your remote filter, you can create a folder called data in your filter folder. Here, you can store your default configuration files. When a user runs regolith install, this data folder will be moved into their data folder, namespaced under the name of the filter.

You can learn more about this flow here.

Test Folder

It may be useful to you to include a test project, or test files, which are useful for development, but don't need to be downloaded by the end user. Anything placed in the test folder will not be installed by Regolith, and you can use this space for your own development.

Released under the MIT license.

- - +

The exportData property

This option lets you create remote filters that can modify their data folder. The older versions of Regolith like 0.0.18 used to always export the entire filter data folder back to the source files making the regolith run command destructive. This feature was added to let the filters remember their state between runs. Most of the filters don't need this feature, so moving the files back and forth was a waste of processing time. The exportData property is now disabled by default, but it can be enabled for filters that need it. The exportData property causes Regolith to export the folder named the same as the filter back to the source files. This way you can have both filters that can modify their data folder and filters that can't.

Data Folder

If you need some default configuration files for your remote filter, you can create a folder called data in your filter folder. Here, you can store your default configuration files. When a user runs regolith install, this data folder will be moved into their data folder, namespaced under the name of the filter.

You can learn more about this flow here.

Test Folder

It may be useful to you to include a test project, or test files, which are useful for development, but don't need to be downloaded by the end user. Anything placed in the test folder will not be installed by Regolith, and you can use this space for your own development.

Released under the MIT license.

+ + \ No newline at end of file diff --git a/guide/profile-filters/index.html b/guide/profile-filters/index.html index 9628e652..230f437c 100644 --- a/guide/profile-filters/index.html +++ b/guide/profile-filters/index.html @@ -7,8 +7,8 @@ - - + + @@ -21,7 +21,7 @@ -
Skip to content
On this page

Profile Filters

Profile filters are a convinient way of working with multiple profiles on one project. They save you from writing repetitive code by letting you run one filter from another. Recursive dependencies are not allowed.

Running profile filter

Unlike other filters, the profile filter doesn't need to have a filter definition. You can always use it as long as you have multiple profiles.

The syntax for running a profile is this:

json
{
+    
Skip to content
On this page

Profile Filters

Profile filters are a convinient way of working with multiple profiles on one project. They save you from writing repetitive code by letting you run one filter from another. Recursive dependencies are not allowed.

Running profile filter

Unlike other filters, the profile filter doesn't need to have a filter definition. You can always use it as long as you have multiple profiles.

The syntax for running a profile is this:

json
{
   "profile": "my_profile"
 }
 

Simply add that to the filters list of a profile.

Here is a complete config.json example:

json
{
@@ -72,9 +72,9 @@
     "dataPath": "./packs/data"
   }
 }
-

In this example extended_default profile runs the default profile and then it runs additional filter called example_2.

Released under the MIT license.

- - +

In this example extended_default profile runs the default profile and then it runs additional filter called example_2.

Released under the MIT license.

+ + \ No newline at end of file diff --git a/guide/profiles/index.html b/guide/profiles/index.html index 1386be3c..8d4a336c 100644 --- a/guide/profiles/index.html +++ b/guide/profiles/index.html @@ -7,8 +7,8 @@ - - + + @@ -21,7 +21,7 @@ -
Skip to content
On this page

Profiles

A profile is a collection of filters, settings, and export information. By default, a Regolith project will be initialized with a single profile, called default. You can add additional profiles, as you need them.

Running Profiles

You can use regolith run to run the default profile (default), or use regolith run <profile name> to run a specific profile

Why Profiles?

Profiles are useful for creating different run-targets.

For example, default profile may contain development focused filters, which are not desired for a final build. You can create a build or package profile, potentially with a different export target to fill this need.

You can now run regolith run default normally, and then sometimes regolith run build when you need a new final build.

Here is an example config.json with a second profile called package.

json
{
+    
Skip to content
On this page

Profiles

A profile is a collection of filters, settings, and export information. By default, a Regolith project will be initialized with a single profile, called default. You can add additional profiles, as you need them.

Running Profiles

You can use regolith run to run the default profile (default), or use regolith run <profile name> to run a specific profile

Why Profiles?

Profiles are useful for creating different run-targets.

For example, default profile may contain development focused filters, which are not desired for a final build. You can create a build or package profile, potentially with a different export target to fill this need.

You can now run regolith run default normally, and then sometimes regolith run build when you need a new final build.

Here is an example config.json with a second profile called package.

json
{
   "name": "moondust",
   "author": "Regolith Gang",
   "packs": {
@@ -40,6 +40,7 @@
         ],
         "export": {
           "target": "development",
+          "build": "standard"
         }
       },
 
@@ -50,6 +51,7 @@
         ],
         "export": {
           "target": "development",
+          "build": "standard"
         }
       }
     },
@@ -57,9 +59,9 @@
     "dataPath": "./packs/data"
   }
 }
-

Profile Customization

For the most part, any setting inside of the Regolith config can be overridden inside of a particular profile.

For example, dataPath can be defined at the top level, but customized per-profile if desired, by placing the key again inside of the profile: This path will be used when running this filter.

TIP

You can learn more about the configuration options available in Regolith here.

Released under the MIT license.

- - +

Profile Customization

For the most part, any setting inside of the Regolith config can be overridden inside of a particular profile.

For example, dataPath can be defined at the top level, but customized per-profile if desired, by placing the key again inside of the profile: This path will be used when running this filter.

TIP

You can learn more about the configuration options available in Regolith here.

Released under the MIT license.

+ + \ No newline at end of file diff --git a/guide/python-filters/index.html b/guide/python-filters/index.html index c5fd49c0..d3ba9699 100644 --- a/guide/python-filters/index.html +++ b/guide/python-filters/index.html @@ -7,8 +7,8 @@ - - + + @@ -21,16 +21,16 @@ -
Skip to content
On this page

Python Filters

Python is an interpreted high-level general-purpose programming language.

Installing Python

Before you can run Python filters, you will need to install python.

Please ensure that you add python to your path:

We recommend that you download more or less recent versions of Python.

WARNING

It's generally not acceptable to install python via the Microsoft Store. Python installed from here is not available on the path. If you have trouble running Python filters with Regolith, please reinstall using the link above.

Running Python code as Filter

The syntax for running a python script is this:

json
{
+    
Skip to content
On this page

Python Filters

Python is an interpreted high-level general-purpose programming language.

Installing Python

Before you can run Python filters, you will need to install python.

Please ensure that you add python to your path:

We recommend that you download more or less recent versions of Python.

WARNING

It's generally not acceptable to install python via the Microsoft Store. Python installed from here is not available on the path. If you have trouble running Python filters with Regolith, please reinstall using the link above.

Running Python code as Filter

The syntax for running a python script is this:

json
{
   "runWith": "python",
   "script": "./filters/example.py",
 
   // Optional property that defines the path to the file with the requirements
   "requirements": "./filters/requirements.txt
 }
-

Requirements and Dependencies

When installing, Regolith will check if the filter has any requirements. If the "requirements" property is set, Regolith will use the file specified in the property to install the dependencies. If the property is not set, Regolith will look for a file named "requirements.txt" in the same directory as the script. If requirements file exits, Regolith will attempt to install these dependencies into a venv, as described below.

When developing a Python filter with dependencies, you must create this file. You can create a requirements.txt file yourself by using pip freeze.

Venv Handling

Python Venvs are flexible, lightweight "virtual environments".

Regolith uses venvs to install dependencies, since it will prevent your global installation space from becoming polluted. When you install a python filter with dependencies, they will be installed into a venv, stored in .regolith/cache/venvs/.

By default, all filters will share a single venv.

In case of collision, you may use "venvSlot": <int> property in the filter, to claim a unique venv id. You will need to reinstall the filter.

Released under the MIT license.

- - +

Requirements and Dependencies

When installing, Regolith will check if the filter has any requirements. If the "requirements" property is set, Regolith will use the file specified in the property to install the dependencies. If the property is not set, Regolith will look for a file named "requirements.txt" in the same directory as the script. If requirements file exits, Regolith will attempt to install these dependencies into a venv, as described below.

When developing a Python filter with dependencies, you must create this file. You can create a requirements.txt file yourself by using pip freeze.

Venv Handling

Python Venvs are flexible, lightweight "virtual environments".

Regolith uses venvs to install dependencies, since it will prevent your global installation space from becoming polluted. When you install a python filter with dependencies, they will be installed into a venv, stored in .regolith/cache/venvs/.

By default, all filters will share a single venv.

In case of collision, you may use "venvSlot": <int> property in the filter, to claim a unique venv id. You will need to reinstall the filter.

Released under the MIT license.

+ + \ No newline at end of file diff --git a/guide/safety/index.html b/guide/safety/index.html index b1dba1b4..6163f0d3 100644 --- a/guide/safety/index.html +++ b/guide/safety/index.html @@ -7,8 +7,8 @@ - - + + @@ -21,9 +21,9 @@ -
Skip to content
On this page

Safety

Please be aware that Regolith is only intended to be used by users experienced with working inside command prompt. Due to the extreme power and flexibility that Regolith offers, there is an increased chance of harm to your system, if used improperly. We cannot accept any liability. You are fully responsible for the safety of your system.

Why is Regolith Unsafe?

Regolith has the ability to run arbitrary code. This code is not sandboxed, and could damage your system. When writing your own filters, you are responsible to write safe code!

Regolith also comes with the ability to download third-party filters from the internet. Regolith does not check these filters for safety. Only download and run internet filters if you are absolutely positive the author is trustworthy.

A compromised filter is able to completely destroy your system.

Why isn't Regolith Sandboxed?

Software sandboxing is extremely difficult, especially since Regolith offers run targets in multiple languages, as well as a native shell integration.

Sandboxing would also limit the things our users can do. Currently, anything possible with programming can be integrated with Regolith! Sandboxing would limit this.

Additionally, we believe sandboxing may give our users a false sense of security. Since no sandbox is foolproof, we prefer our users to operate with full caution, rather than trust an imperfect solution to guard them.

Released under the MIT license.

- - +
Skip to content
On this page

Safety

Please be aware that Regolith is only intended to be used by users experienced with working inside command prompt. Due to the extreme power and flexibility that Regolith offers, there is an increased chance of harm to your system, if used improperly. We cannot accept any liability. You are fully responsible for the safety of your system.

Why is Regolith Unsafe?

Regolith has the ability to run arbitrary code. This code is not sandboxed, and could damage your system. When writing your own filters, you are responsible to write safe code!

Regolith also comes with the ability to download third-party filters from the internet. Regolith does not check these filters for safety. Only download and run internet filters if you are absolutely positive the author is trustworthy.

A compromised filter is able to completely destroy your system.

Why isn't Regolith Sandboxed?

Software sandboxing is extremely difficult, especially since Regolith offers run targets in multiple languages, as well as a native shell integration.

Sandboxing would also limit the things our users can do. Currently, anything possible with programming can be integrated with Regolith! Sandboxing would limit this.

Additionally, we believe sandboxing may give our users a false sense of security. Since no sandbox is foolproof, we prefer our users to operate with full caution, rather than trust an imperfect solution to guard them.

Released under the MIT license.

+ + \ No newline at end of file diff --git a/guide/shell-filters/index.html b/guide/shell-filters/index.html index 58f677b5..6f2058e3 100644 --- a/guide/shell-filters/index.html +++ b/guide/shell-filters/index.html @@ -7,8 +7,8 @@ - - + + @@ -21,7 +21,7 @@ -
Skip to content
On this page

Shell Filters

Shell Filters allow you to run arbitrary shell commands. This is useful for running scripts that are not natively supported in Regolith.

Running arbitrary Shell command as Filter

The syntax for running a shell script is this:

json
{
+    
Skip to content
On this page

Shell Filters

Shell Filters allow you to run arbitrary shell commands. This is useful for running scripts that are not natively supported in Regolith.

Running arbitrary Shell command as Filter

The syntax for running a shell script is this:

json
{
   "runWith": "shell",
   "command": "echo 'hello world'"
 }
@@ -29,9 +29,9 @@
   "runWith": "shell",
   "command": "python -u ./filters/my_filter.py"
 }
-

Released under the MIT license.

- - +

Released under the MIT license.

+ + \ No newline at end of file diff --git a/guide/troubleshooting/index.html b/guide/troubleshooting/index.html index e2dd1a85..e41a3548 100644 --- a/guide/troubleshooting/index.html +++ b/guide/troubleshooting/index.html @@ -7,8 +7,8 @@ - - + + @@ -21,12 +21,12 @@ -
Skip to content
On this page

Troubleshooting

Regolith is a useful tool, but its somewhat complex compilation flow leaves room for user error. This page will explain solutions to common mistakes, as well as guide you through more complex debugging strategies.

General Debugging Tips

Reading the Console

Regolith is a console application, which means that you will need to interact with it via the terminal. When Regolith runs, it will print information into the same log. This information is very useful in debugging, as Regolith will print as much useful information as it can during failure states.

Please get comfortable reading the console output, and try to become familiar with the syntax. Warnings and errors will be printed clearly.

Check your Version

Regolith is a living, breathing application, which is receiving numerous updates. You can directly install the latest version of Regolith, or watch out for the "A new Version is Available" messages in the console output.

Common Issues

Regolith is not Recognized

When first installing Regolith, you may get an error message like this:

regolith : The term 'regolith' is not recognized as the name of a cmdlet, function, script file, or operable program. 
+    
Skip to content
On this page

Troubleshooting

Regolith is a useful tool, but its somewhat complex compilation flow leaves room for user error. This page will explain solutions to common mistakes, as well as guide you through more complex debugging strategies.

General Debugging Tips

Reading the Console

Regolith is a console application, which means that you will need to interact with it via the terminal. When Regolith runs, it will print information into the same log. This information is very useful in debugging, as Regolith will print as much useful information as it can during failure states.

Please get comfortable reading the console output, and try to become familiar with the syntax. Warnings and errors will be printed clearly.

Check your Version

Regolith is a living, breathing application, which is receiving numerous updates. You can directly install the latest version of Regolith, or watch out for the "A new Version is Available" messages in the console output.

Common Issues

Regolith is not Recognized

When first installing Regolith, you may get an error message like this:

regolith : The term 'regolith' is not recognized as the name of a cmdlet, function, script file, or operable program. 
 
 Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
-

The most common cause of this issue is incorrect installation. Here are some troubleshooting tips:

  • 1: First, try closing your shell, and opening a new one. Then rerun the regolith command.
  • 2: Try a different shell. For example gitbash or vscode instead of powershell.
  • 3: Try reinstalling Regolith
  • 4: If you cannot get Regolith installed, you may download the stand-alone .exe, and place this in your project

Crash when Running

The most common reason Regolith will crash is from a broken filter. The first step in debugging, is identifying which filter is failing. You can do so by navigating to the Regolith output log, and finding which filter caused the crash.

Filter errors will be printed like [error][filter] ... .

Python Not Found

If you get a message like [+]: Python not found, download and install it from https://www.python.org/downloads/, this means that Python either not installed, or is not available on the path.

We provide installation instructions, to help you get Python installed correctly on your system. Please be aware that Python installed via the Microsoft Store will not work with Regolith, as it generally doesn't add itself to path.

Released under the MIT license.

- - +

The most common cause of this issue is incorrect installation. Here are some troubleshooting tips:

  • 1: First, try closing your shell, and opening a new one. Then rerun the regolith command.
  • 2: Try a different shell. For example gitbash or vscode instead of powershell.
  • 3: Try reinstalling Regolith
  • 4: If you cannot get Regolith installed, you may download the stand-alone .exe, and place this in your project

Crash when Running

The most common reason Regolith will crash is from a broken filter. The first step in debugging, is identifying which filter is failing. You can do so by navigating to the Regolith output log, and finding which filter caused the crash.

Filter errors will be printed like [error][filter] ... .

Python Not Found

If you get a message like [+]: Python not found, download and install it from https://www.python.org/downloads/, this means that Python either not installed, or is not available on the path.

We provide installation instructions, to help you get Python installed correctly on your system. Please be aware that Python installed via the Microsoft Store will not work with Regolith, as it generally doesn't add itself to path.

Released under the MIT license.

+ + \ No newline at end of file diff --git a/guide/user-configuration/index.html b/guide/user-configuration/index.html index 0d5cd3c9..bac9ce62 100644 --- a/guide/user-configuration/index.html +++ b/guide/user-configuration/index.html @@ -7,8 +7,8 @@ - - + + @@ -21,16 +21,16 @@ -
Skip to content
On this page

User Configuration

User configuration file is stored in the Regolith app data folder. On Windows, it's %localappdata%\regolith\user_config.json*. The file is used to store the user preferences for Regolith.

Available Options

use_project_app_data_storage: bool

Default: false

If set to true, the Regolith projects will store their cache (filters, their dependencies, etc.) in the app data folder, instead of the .regolith folder in the project folder.

username: string

Default: "Your name"

The username of the user, which will be used in the author field of the manifest.json file when creating a new project.

resolvers: list[string]

Default: ["github.com/Bedrock-OSS/regolith-filter-resolver/resolver.json"]

A list of resolvers, which will be used to resolve filter names to URLs for downloding when using the regolith install command. The default URL is always added to the end of the list. Note that the "URLs" used by the resolvers are not actual URLs. They have two parts, separated by /. The first part is an url to a repository on GitHub, and the second part is a path to the resolver file relative to the root of the repository. For example, the default resolver is on the github.com/Bedrock-OSS/regolith-filter-resolver repository, in the resolver.json file, but github.com/Bedrock-OSS/regolith-filter-resolver/resolver.json is not a valid URL.

resolver_cache_update_cooldown: string

Default: "5m"

The cooldown between cache updates for the resolvers. The cooldown is specified in the Go duration format.

filter_cache_update_cooldown: string

Default: "5m"

The cooldown between cache updates for the filters. The cooldown is specified in the Go duration format.

The regolith config command

The regolith config command is used to manage the user configuration of Regolith. It can access and modify the user configuration file. The data is stored in the application data folder in the "user_config.json" file.

The behavior of the command changes based on the used flags and the number of provided arguments. The cheetsheet below shows the possible combinations of flags and arguments and what they do:

  • regolith config - printing all properties
  • regolith config <key> - printing specified property
  • regolith config <key> <value> - setting property value
  • regolith config <key> --delete - deleting a property
  • regolith config <key> <value> --append - appending to a list proeprty
  • regolith config <key> <value> --index <index> - replacing item in a list property
  • regolith config <key> --index <index> --delete - deleting item in a list property

The commands that print text can take the --full flag to print configuration with the default values included (if they're not defined in the config file). Without the flag, the undefined properties will be printed as null or empty list.

The structure of the user configuration file

The user_config.json file is just a regular JSON file without any nesting. You can edit it manually if you want to but you don't have to because everything can be done with the regolith config command.

Example config file

json
{
+    
Skip to content
On this page

User Configuration

User configuration file is stored in the Regolith app data folder. On Windows, it's %localappdata%\regolith\user_config.json*. The file is used to store the user preferences for Regolith.

Available Options

use_project_app_data_storage: bool

Default: false

If set to true, the Regolith projects will store their cache (filters, their dependencies, etc.) in the app data folder, instead of the .regolith folder in the project folder.

username: string

Default: "Your name"

The username of the user, which will be used in the author field of the manifest.json file when creating a new project.

resolvers: list[string]

Default: ["github.com/Bedrock-OSS/regolith-filter-resolver/resolver.json"]

A list of resolvers, which will be used to resolve filter names to URLs for downloding when using the regolith install command. The default URL is always added to the end of the list. Note that the "URLs" used by the resolvers are not actual URLs. They have two parts, separated by /. The first part is an url to a repository on GitHub, and the second part is a path to the resolver file relative to the root of the repository. For example, the default resolver is on the github.com/Bedrock-OSS/regolith-filter-resolver repository, in the resolver.json file, but github.com/Bedrock-OSS/regolith-filter-resolver/resolver.json is not a valid URL.

resolver_cache_update_cooldown: string

Default: "5m"

The cooldown between cache updates for the resolvers. The cooldown is specified in the Go duration format.

filter_cache_update_cooldown: string

Default: "5m"

The cooldown between cache updates for the filters. The cooldown is specified in the Go duration format.

The regolith config command

The regolith config command is used to manage the user configuration of Regolith. It can access and modify the user configuration file. The data is stored in the application data folder in the "user_config.json" file.

The behavior of the command changes based on the used flags and the number of provided arguments. The cheetsheet below shows the possible combinations of flags and arguments and what they do:

  • regolith config - printing all properties
  • regolith config <key> - printing specified property
  • regolith config <key> <value> - setting property value
  • regolith config <key> --delete - deleting a property
  • regolith config <key> <value> --append - appending to a list proeprty
  • regolith config <key> <value> --index <index> - replacing item in a list property
  • regolith config <key> --index <index> --delete - deleting item in a list property

The commands that print text can take the --full flag to print configuration with the default values included (if they're not defined in the config file). Without the flag, the undefined properties will be printed as null or empty list.

The structure of the user configuration file

The user_config.json file is just a regular JSON file without any nesting. You can edit it manually if you want to but you don't have to because everything can be done with the regolith config command.

Example config file

json
{
 	"use_project_app_data_storage": false,
 	"username": "Bedrock-OSS",
 	"resolvers": [
 		"github.com/Bedrock-OSS/regolith-filter-resolver/resolver.json"
 	]
 }
-

INFO

On other platforms you can refer to Go's os.UserCacheDir documentation. It's in "regolith" subdirectory of the path returned by this function.

Released under the MIT license.

- - +

INFO

On other platforms you can refer to Go's os.UserCacheDir documentation. It's in "regolith" subdirectory of the path returned by this function.

Released under the MIT license.

+ + \ No newline at end of file diff --git a/guide/what-is-regolith/index.html b/guide/what-is-regolith/index.html index 65a6a99e..2969b4dc 100644 --- a/guide/what-is-regolith/index.html +++ b/guide/what-is-regolith/index.html @@ -8,8 +8,8 @@ - - + + @@ -22,15 +22,15 @@ -
Skip to content
On this page

What is Regolith?

Regolith is an Addon Compiler for the Bedrock Edition of Minecraft.

WARNING

This page introduces Regolith at a conceptual level. If you prefer, you can jump to the installation instructions.

Regolith introduces the concept of a "project folder", where your addons are written, including the Resource Pack, Behavior Pack, and any models, textures or configuration files. This single-folder-structure is great for version control, and allows you to keep your "source-of-truth" outside of com.mojang!

Here is what a newly initialized Regolith project looks like:

Compiling

In the simplest case, Regolith can be used to move your packs from the project folder, into your target location (usually the development folders in com.mojang). Each time you run regolith, the packs will be moved over, and updated.

However, Regoliths real value preposition is the ability to run arbitrary code during this copy.

We refer to these scripts and programs as filters. Here is the flow:

  • RP, BP and data folder are copied into a tmp folder
  • Every filter is executed in-order, editing the tmp folder in-place
  • The contents of RP and BP are moved into your export location
  • If configured, subfolders within data can be moved back into your data location

This compilation flow allows you to make programmatic changes to your compiled addon, without effecting your source files.

Since the data folder can be saved back to your project, it's possible to store persistant data there.

Filters

A filter is any program or script that takes the files inside of your RP and BP and transforms them in some way. Many of these filters have already been written, and are included as part of the standard library.

For example, one of our standard filters is called texture_convert, which filters image formats for photo editing programs, and converts them into .png files.

With this filter turned on, you can place Photoshop, Krita, or Gimp files directly into RP/textures/* folder! By the time your files reach com.mojang, the .psd files will be replaced by a normal .png -Minecraft won't know the difference!

Creating your own Filters

You can write filters in Python, JavaScript, Java, or any other language, using our shell integration. You can learn more about creating custom filters here.

Why Regolith?

Extending the Addon Syntax

Regolith allows you to create and extend addon-syntax. As long as you can write a filter to interpret the new syntax, and compile it into valid addon-syntax, then anything goes!

For example, the subfunctions community filter allows you to define functions within functions, without creating an additional file:

# Some code
+    
Skip to content
On this page

What is Regolith?

Regolith is an Addon Compiler for the Bedrock Edition of Minecraft.

WARNING

This page introduces Regolith at a conceptual level. If you prefer, you can jump to the installation instructions.

Regolith introduces the concept of a "project folder", where your addons are written, including the Resource Pack, Behavior Pack, and any models, textures or configuration files. This single-folder-structure is great for version control, and allows you to keep your "source-of-truth" outside of com.mojang!

Here is what a newly initialized Regolith project looks like:

Compiling

In the simplest case, Regolith can be used to move your packs from the project folder, into your target location (usually the development folders in com.mojang). Each time you run regolith, the packs will be moved over, and updated.

However, Regoliths real value preposition is the ability to run arbitrary code during this copy.

We refer to these scripts and programs as filters. Here is the flow:

  • RP, BP and data folder are copied into a tmp folder
  • Every filter is executed in-order, editing the tmp folder in-place
  • The contents of RP and BP are moved into your export location
  • If configured, subfolders within data can be moved back into your data location

This compilation flow allows you to make programmatic changes to your compiled addon, without effecting your source files.

Since the data folder can be saved back to your project, it's possible to store persistant data there.

Filters

A filter is any program or script that takes the files inside of your RP and BP and transforms them in some way. Many of these filters have already been written, and are included as part of the standard library.

For example, one of our standard filters is called texture_convert, which filters image formats for photo editing programs, and converts them into .png files.

With this filter turned on, you can place Photoshop, Krita, or Gimp files directly into RP/textures/* folder! By the time your files reach com.mojang, the .psd files will be replaced by a normal .png -Minecraft won't know the difference!

Creating your own Filters

You can write filters in Python, JavaScript, Java, or any other language, using our shell integration. You can learn more about creating custom filters here.

Why Regolith?

Extending the Addon Syntax

Regolith allows you to create and extend addon-syntax. As long as you can write a filter to interpret the new syntax, and compile it into valid addon-syntax, then anything goes!

For example, the subfunctions community filter allows you to define functions within functions, without creating an additional file:

# Some code
 function <aaa>:
     # The code of the subfunction
     execute @a ~ ~ ~ function <bbb>:
         # The code of the nested subfunction
 # Some other code
-

With Regolith, you are empowered to write addons with an extended syntax - and Bedrock won't even know the difference!

Non-Destructive Editing

Imagine you have a script that loops over every entity, and creates some language-code translation for it.

Lets say your entity regolith:big_zombie becomes named Big Zombie.

If you run this script, and copy the files into your en_US.lang, you've saved yourself a lot of time, but you've also introduced a problem: You've destructively edited your addon. What this means, is that you have mixed up your tool-generated content, with your hand-written content.

Imagine you add more entities, and run your script again: Now you are in the painful position of "merging" the new tool generated content, with your addons en_US.lang file, which you may have edited in the interim.

This is called destructive editing, and Regolith fixes it!

A comparable Regolith filter would not suffer from this problem, because you never directly edit tool generated content. Your Regolith project folder contains only human written content, and your com.mojang folder contains only tool-generated content.

This means as you add new entities, the names will be handled for you, without you ever seeing the names in en_US.lang, or needing to re-run the script!

In other words, Regolith adds compiled content on top of your hand written content, leaving you free to create your content, without working around tool-generated content.

TIP

If this sounds interesting to you, you might be interested in the name ninja filter.

Released under the MIT license.

- - +

With Regolith, you are empowered to write addons with an extended syntax - and Bedrock won't even know the difference!

Non-Destructive Editing

Imagine you have a script that loops over every entity, and creates some language-code translation for it.

Lets say your entity regolith:big_zombie becomes named Big Zombie.

If you run this script, and copy the files into your en_US.lang, you've saved yourself a lot of time, but you've also introduced a problem: You've destructively edited your addon. What this means, is that you have mixed up your tool-generated content, with your hand-written content.

Imagine you add more entities, and run your script again: Now you are in the painful position of "merging" the new tool generated content, with your addons en_US.lang file, which you may have edited in the interim.

This is called destructive editing, and Regolith fixes it!

A comparable Regolith filter would not suffer from this problem, because you never directly edit tool generated content. Your Regolith project folder contains only human written content, and your com.mojang folder contains only tool-generated content.

This means as you add new entities, the names will be handled for you, without you ever seeing the names in en_US.lang, or needing to re-run the script!

In other words, Regolith adds compiled content on top of your hand written content, leaving you free to create your content, without working around tool-generated content.

TIP

If this sounds interesting to you, you might be interested in the name ninja filter.

Released under the MIT license.

+ + \ No newline at end of file diff --git a/hashmap.json b/hashmap.json index e282055e..2f9edc65 100644 --- a/hashmap.json +++ b/hashmap.json @@ -1 +1 @@ -{"community-filters.md":"d8e67601","guide_configuration.md":"459ca06d","guide_create-a-filter.md":"e4b14fe1","guide_custom-filters.md":"d6d4910e","guide_data-folder.md":"1391dd31","guide_deno-filters.md":"10212684","guide_dotnet-filters.md":"ede8a1bd","guide_exe-filters.md":"975a7d24","guide_experiments.md":"0525a91a","guide_export-targets.md":"3b0cbc83","guide_filter-run-modes.md":"642fffbe","guide_filters.md":"51e1a196","guide_getting-started.md":"c4c0e323","guide_installing-filters.md":"c714d1ea","guide_installing.md":"8bfe7d87","guide_java-filters.md":"f4796a6f","guide_local-filters.md":"45f46edd","guide_nim-filters.md":"46fd9cd8","guide_node-filters.md":"eac9db64","guide_online-filters.md":"e514d346","guide_profile-filters.md":"85ba9276","guide_profiles.md":"578dca21","guide_python-filters.md":"a7312df1","guide_safety.md":"a0dd3e68","guide_shell-filters.md":"9b00b69c","guide_troubleshooting.md":"55fc26d8","guide_user-configuration.md":"3ab08eb3","guide_what-is-regolith.md":"39f99884","index.md":"510adbdb","standard-library.md":"cf5061e2"} +{"community-filters.md":"c4e1ae5e","guide_configuration.md":"b637cb4a","guide_create-a-filter.md":"01f3e00d","guide_custom-filters.md":"e7230af9","guide_data-folder.md":"a7e4c196","guide_deno-filters.md":"baefd136","guide_dotnet-filters.md":"50872909","guide_exe-filters.md":"fc547724","guide_experiments.md":"d230b08f","guide_export-targets.md":"0af28945","guide_filter-run-modes.md":"224efeb8","guide_filters.md":"7fe7484f","guide_getting-started.md":"5146c5e8","guide_installing-filters.md":"bc241757","guide_installing.md":"4fa9e584","guide_java-filters.md":"d2627c90","guide_local-filters.md":"cef79b3a","guide_nim-filters.md":"718757c4","guide_node-filters.md":"27170d12","guide_online-filters.md":"349a6667","guide_profile-filters.md":"8e24024b","guide_profiles.md":"21650e48","guide_python-filters.md":"53ad81bf","guide_safety.md":"5a45aa68","guide_shell-filters.md":"fcf3cf3a","guide_troubleshooting.md":"8211e747","guide_user-configuration.md":"40ce24ea","guide_what-is-regolith.md":"faca7388","index.md":"5d9135f1","standard-library.md":"7f587c26"} diff --git a/index.html b/index.html index 1b32b814..9b024939 100644 --- a/index.html +++ b/index.html @@ -7,8 +7,8 @@ - - + + @@ -21,9 +21,9 @@ -
Skip to content

Regolith

Addon Compiler for the Bedrock Edition of Minecraft

Fast, flexible, and easy to use. Meet the modern Minecraft Bedrock tooling.

Regolith logo
⚡️

Blazingly Fast

Regolith can improve your productivity by automating away boring or repetitive tasks.

🧩

Flexible

Regolith is designed with a language-agnostic, tool-agnostic feature set. The flexibility of Regolith allows you to bring all scripts and tools under a single, unified workflow.

🏷️

Version Control Friendly

Regolith keeps the ‘source of truth’ out of your com.mojang folder, allowing for seamless git integration.

Released under the MIT license.

- - +
Skip to content

Regolith

Addon Compiler for the Bedrock Edition of Minecraft

Fast, flexible, and easy to use. Meet the modern Minecraft Bedrock tooling.

Regolith logo
⚡️

Blazingly Fast

Regolith can improve your productivity by automating away boring or repetitive tasks.

🧩

Flexible

Regolith is designed with a language-agnostic, tool-agnostic feature set. The flexibility of Regolith allows you to bring all scripts and tools under a single, unified workflow.

🏷️

Version Control Friendly

Regolith keeps the ‘source of truth’ out of your com.mojang folder, allowing for seamless git integration.

Released under the MIT license.

+ + \ No newline at end of file diff --git a/standard-library/index.html b/standard-library/index.html index fb0dd2d6..24281e66 100644 --- a/standard-library/index.html +++ b/standard-library/index.html @@ -7,8 +7,8 @@ - - + + @@ -21,13 +21,13 @@ -
Skip to content
On this page

Standard Library

The Standard Library is a special set of filters, written by the Regolith maintainers. Standard Filters offers the safest, easiest, and best support.

Standard Filters

FilterDescription
blockbench_convertConverts blockbench models into .geometry.json files.
bump_manifestBumps the manifest version in your RP and BP. Good for multiplayer testing where you need to avoid pack-caching issues.
filter_testerMeant to be used by the filter developers to test other filters. It compares the expected results with the files generated by Regolith.
fix_emissiveFixes emissive issues in your textures, by removing the color data from fully transparent pixels.
gametestsCompiles gametests into pack.
json_cleanerRemoves comments from all json files in the project. Useful, since some filters cannot understand files with comments.
name_ninjaAutomatically generates entity, block, spawn egg, and item names, based on a custom 'name' field, or on the entities identifier.
texture_convertConverts popular image editor file formats, such as .psd to .png.
texture_listAutomatically creates the texture_list.json file, based on the images you've added into your resource pack.

The full, up to date list of filters can be found on our github. We are looking into maintaining a list here, but for now please visit our GitHub.

Using a Standard Filter

You may install standard filters by name. For example: regolith install name_ninja.

The syntax for standard filters usage is like this:

json
{
+    
Skip to content
On this page

Standard Library

The Standard Library is a special set of filters, written by the Regolith maintainers. Standard Filters offers the safest, easiest, and best support.

Standard Filters

FilterDescription
blockbench_convertConverts blockbench models into .geometry.json files.
bump_manifestBumps the manifest version in your RP and BP. Good for multiplayer testing where you need to avoid pack-caching issues.
filter_testerMeant to be used by the filter developers to test other filters. It compares the expected results with the files generated by Regolith.
fix_emissiveFixes emissive issues in your textures, by removing the color data from fully transparent pixels.
gametestsCompiles gametests into pack.
json_cleanerRemoves comments from all json files in the project. Useful, since some filters cannot understand files with comments.
name_ninjaAutomatically generates entity, block, spawn egg, and item names, based on a custom 'name' field, or on the entities identifier.
texture_convertConverts popular image editor file formats, such as .psd to .png.
texture_listAutomatically creates the texture_list.json file, based on the images you've added into your resource pack.

The full, up to date list of filters can be found on our github. We are looking into maintaining a list here, but for now please visit our GitHub.

Using a Standard Filter

You may install standard filters by name. For example: regolith install name_ninja.

The syntax for standard filters usage is like this:

json
{
   "filter": "<filter_name>",
   "settings" { ... } // Optional
 }
-

Released under the MIT license.

- - +

Released under the MIT license.

+ + \ No newline at end of file