@gjsify/cli 0.26.0 → 0.26.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.gjs.mjs +47 -47
- package/lib/commands/affected.js +146 -15
- package/lib/utils/build-cache.js +7 -2
- package/lib/utils/dir-link.d.ts +58 -0
- package/lib/utils/dir-link.js +126 -0
- package/lib/utils/dlx-cache.d.ts +30 -3
- package/lib/utils/dlx-cache.js +61 -7
- package/lib/utils/install-packument-cache.d.ts +23 -0
- package/lib/utils/install-packument-cache.js +45 -10
- package/package.json +17 -17
package/dist/cli.gjs.mjs
CHANGED
|
@@ -34,8 +34,8 @@ function tokenizeArgString(n){if(Array.isArray(n))return n.map(n=>typeof n==`str
|
|
|
34
34
|
* Copyright (c) 2016, Contributors
|
|
35
35
|
* SPDX-License-Identifier: ISC
|
|
36
36
|
*/
|
|
37
|
-
function combineAliases(n){let a=[],S=Object.create(null),C=!0;for(Object.keys(n).forEach(function(S){a.push([].concat(n[S],S))});C;){C=!1;for(let n=0;n<a.length;n++)for(let S=n+1;S<a.length;S++)if(a[n].filter(function(n){return a[S].indexOf(n)!==-1}).length){a[n]=a[n].concat(a[S]),a.splice(S,1),C=!0;break}}return a.forEach(function(n){n=n.filter(function(n,a,S){return S.indexOf(n)===a});let a=n.pop();a!==void 0&&typeof a==`string`&&(S[a]=n)}),S}function increment$1(n){return n===void 0?1:n+1}function sanitizeKey(n){return n===`__proto__`?`___proto___`:n}function stripQuotes$1(n){return typeof n==`string`&&(n[0]===`'`||n[0]===`"`)&&n[n.length-1]===n[0]?n.substring(1,n.length-1):n}var vc,YargsParser,yc=__esmMin(()=>{hc(),_c(),mc(),YargsParser=class{constructor(n){vc=n}parse(n,a){let S=Object.assign({alias:void 0,array:void 0,boolean:void 0,config:void 0,configObjects:void 0,configuration:void 0,coerce:void 0,count:void 0,default:void 0,envPrefix:void 0,narg:void 0,normalize:void 0,string:void 0,number:void 0,__:void 0,key:void 0},a),C=tokenizeArgString(n),N=typeof n==`string`,F=combineAliases(Object.assign(Object.create(null),S.alias)),I=Object.assign({"boolean-negation":!0,"camel-case-expansion":!0,"combine-arrays":!1,"dot-notation":!0,"duplicate-arguments-array":!0,"flatten-duplicate-arrays":!0,"greedy-arrays":!0,"halt-at-non-option":!1,"nargs-eats-options":!1,"negation-prefix":`no-`,"parse-numbers":!0,"parse-positional-numbers":!0,"populate--":!1,"set-placeholder-key":!1,"short-option-groups":!0,"strip-aliased":!1,"strip-dashed":!1,"unknown-options-as-args":!1},S.configuration),H=Object.assign(Object.create(null),S.default),W=S.configObjects||[],K=S.envPrefix,q=I[`populate--`],Y=q?`--`:`_`,X=Object.create(null),te=Object.create(null),ne=S.__||vc.format,re={aliases:Object.create(null),arrays:Object.create(null),bools:Object.create(null),strings:Object.create(null),numbers:Object.create(null),counts:Object.create(null),normalize:Object.create(null),configs:Object.create(null),nargs:Object.create(null),coercions:Object.create(null),keys:[]},ie=/^-([0-9]+(\.[0-9]+)?|\.[0-9]+)$/,ae=RegExp(`^--`+I[`negation-prefix`]+`(.+)`);[].concat(S.array||[]).filter(Boolean).forEach(function(n){let a=typeof n==`object`?n.key:n,S=Object.keys(n).map(function(n){return{boolean:`bools`,string:`strings`,number:`numbers`}[n]}).filter(Boolean).pop();S&&(re[S][a]=!0),re.arrays[a]=!0,re.keys.push(a)}),[].concat(S.boolean||[]).filter(Boolean).forEach(function(n){re.bools[n]=!0,re.keys.push(n)}),[].concat(S.string||[]).filter(Boolean).forEach(function(n){re.strings[n]=!0,re.keys.push(n)}),[].concat(S.number||[]).filter(Boolean).forEach(function(n){re.numbers[n]=!0,re.keys.push(n)}),[].concat(S.count||[]).filter(Boolean).forEach(function(n){re.counts[n]=!0,re.keys.push(n)}),[].concat(S.normalize||[]).filter(Boolean).forEach(function(n){re.normalize[n]=!0,re.keys.push(n)}),typeof S.narg==`object`&&Object.entries(S.narg).forEach(([n,a])=>{typeof a==`number`&&(re.nargs[n]=a,re.keys.push(n))}),typeof S.coerce==`object`&&Object.entries(S.coerce).forEach(([n,a])=>{typeof a==`function`&&(re.coercions[n]=a,re.keys.push(n))}),S.config!==void 0&&(Array.isArray(S.config)||typeof S.config==`string`?[].concat(S.config).filter(Boolean).forEach(function(n){re.configs[n]=!0}):typeof S.config==`object`&&Object.entries(S.config).forEach(([n,a])=>{(typeof a==`boolean`||typeof a==`function`)&&(re.configs[n]=a)})),extendAliases(S.key,F,S.default,re.arrays),Object.keys(H).forEach(function(n){(re.aliases[n]||[]).forEach(function(a){H[a]=H[n]})});let oe=null;checkConfiguration();let Z=[],se=Object.assign(Object.create(null),{_:[]}),ce={};for(let n=0;n<C.length;n++){let a=C[n],S=a.replace(/^-{3,}/,`---`),N,F,H,W,K,q;if(a!==`--`&&/^-/.test(a)&&isUnknownOptionAsArg(a))pushPositional(a);else if(S.match(/^---+(=|$)/)){pushPositional(a);continue}else if(a.match(/^--.+=/)||!I[`short-option-groups`]&&a.match(/^-.+=/))W=a.match(/^--?([^=]+)=([\s\S]*)$/),W!==null&&Array.isArray(W)&&W.length>=3&&(checkAllAliases(W[1],re.arrays)?n=eatArray(n,W[1],C,W[2]):checkAllAliases(W[1],re.nargs)===!1?setArg(W[1],W[2],!0):n=eatNargs(n,W[1],C,W[2]));else if(a.match(ae)&&I[`boolean-negation`])W=a.match(ae),W!==null&&Array.isArray(W)&&W.length>=2&&(F=W[1],setArg(F,checkAllAliases(F,re.arrays)?[!1]:!1));else if(a.match(/^--.+/)||!I[`short-option-groups`]&&a.match(/^-[^-]+/))W=a.match(/^--?(.+)/),W!==null&&Array.isArray(W)&&W.length>=2&&(F=W[1],checkAllAliases(F,re.arrays)?n=eatArray(n,F,C):checkAllAliases(F,re.nargs)===!1?(K=C[n+1],K!==void 0&&(!K.match(/^-/)||K.match(ie))&&!checkAllAliases(F,re.bools)&&!checkAllAliases(F,re.counts)||/^(true|false)$/.test(K)?(setArg(F,K),n++):setArg(F,defaultValue(F))):n=eatNargs(n,F,C));else if(a.match(/^-.\..+=/))W=a.match(/^-([^=]+)=([\s\S]*)$/),W!==null&&Array.isArray(W)&&W.length>=3&&setArg(W[1],W[2]);else if(a.match(/^-.\..+/)&&!a.match(ie))K=C[n+1],W=a.match(/^-(.\..+)/),W!==null&&Array.isArray(W)&&W.length>=2&&(F=W[1],K!==void 0&&!K.match(/^-/)&&!checkAllAliases(F,re.bools)&&!checkAllAliases(F,re.counts)?(setArg(F,K),n++):setArg(F,defaultValue(F)));else if(a.match(/^-[^-]+/)&&!a.match(ie)){H=a.slice(1,-1).split(``),N=!1;for(let S=0;S<H.length;S++){if(K=a.slice(S+2),H[S+1]&&H[S+1]===`=`){q=a.slice(S+3),F=H[S],checkAllAliases(F,re.arrays)?n=eatArray(n,F,C,q):checkAllAliases(F,re.nargs)===!1?setArg(F,q):n=eatNargs(n,F,C,q),N=!0;break}if(K===`-`){setArg(H[S],K);continue}if(/[A-Za-z]/.test(H[S])&&/^-?\d+(\.\d*)?(e-?\d+)?$/.test(K)&&checkAllAliases(K,re.bools)===!1){setArg(H[S],K),N=!0;break}if(H[S+1]&&H[S+1].match(/\W/)){setArg(H[S],K),N=!0;break}else setArg(H[S],defaultValue(H[S]))}F=a.slice(-1)[0],!N&&F!==`-`&&(checkAllAliases(F,re.arrays)?n=eatArray(n,F,C):checkAllAliases(F,re.nargs)===!1?(K=C[n+1],K!==void 0&&(!/^(-|--)[^-]/.test(K)||K.match(ie))&&!checkAllAliases(F,re.bools)&&!checkAllAliases(F,re.counts)||/^(true|false)$/.test(K)?(setArg(F,K),n++):setArg(F,defaultValue(F))):n=eatNargs(n,F,C))}else if(a.match(/^-[0-9]$/)&&a.match(ie)&&checkAllAliases(a.slice(1),re.bools))F=a.slice(1),setArg(F,defaultValue(F));else if(a===`--`){Z=C.slice(n+1);break}else if(I[`halt-at-non-option`]){Z=C.slice(n);break}else pushPositional(a)}applyEnvVars(se,!0),applyEnvVars(se,!1),setConfig(se),setConfigObjects(),applyDefaultsAndAliases(se,re.aliases,H,!0),applyCoercions(se),I[`set-placeholder-key`]&&setPlaceholderKeys(se),Object.keys(re.counts).forEach(function(n){hasKey(se,n.split(`.`))||setArg(n,0)}),q&&Z.length&&(se[Y]=[]),Z.forEach(function(n){se[Y].push(n)}),I[`camel-case-expansion`]&&I[`strip-dashed`]&&Object.keys(se).filter(n=>n!==`--`&&n.includes(`-`)).forEach(n=>{delete se[n]}),I[`strip-aliased`]&&[].concat(...Object.keys(F).map(n=>F[n])).forEach(n=>{I[`camel-case-expansion`]&&n.includes(`-`)&&delete se[n.split(`.`).map(n=>camelCase(n)).join(`.`)],delete se[n]});function pushPositional(n){let a=maybeCoerceNumber(`_`,n);(typeof a==`string`||typeof a==`number`)&&se._.push(a)}function eatNargs(n,a,S,C){let N,F=checkAllAliases(a,re.nargs);if(F=typeof F!=`number`||isNaN(F)?1:F,F===0)return isUndefined(C)||(oe=Error(ne(`Argument unexpected for: %s`,a))),setArg(a,defaultValue(a)),n;let H=+!isUndefined(C);if(I[`nargs-eats-options`])S.length-(n+1)+H<F&&(oe=Error(ne(`Not enough arguments following: %s`,a))),H=F;else{for(N=n+1;N<S.length&&(!S[N].match(/^-[^0-9]/)||S[N].match(ie)||isUnknownOptionAsArg(S[N]));N++)H++;H<F&&(oe=Error(ne(`Not enough arguments following: %s`,a)))}let W=Math.min(H,F);for(!isUndefined(C)&&W>0&&(setArg(a,C),W--),N=n+1;N<W+n+1;N++)setArg(a,S[N]);return n+W}function eatArray(n,a,S,C){let F=[],W=C||S[n+1],K=checkAllAliases(a,re.nargs);if(checkAllAliases(a,re.bools)&&!/^(true|false)$/.test(W))F.push(!0);else if(isUndefined(W)||isUndefined(C)&&/^-/.test(W)&&!ie.test(W)&&!isUnknownOptionAsArg(W)){if(H[a]!==void 0){let n=H[a];F=Array.isArray(n)?n:[n]}}else{isUndefined(C)||F.push(processValue(a,C,!0));for(let C=n+1;C<S.length&&!(!I[`greedy-arrays`]&&F.length>0||K&&typeof K==`number`&&F.length>=K||(W=S[C],/^-/.test(W)&&!ie.test(W)&&!isUnknownOptionAsArg(W)));C++)n=C,F.push(processValue(a,W,N))}return typeof K==`number`&&(K&&F.length<K||isNaN(K)&&F.length===0)&&(oe=Error(ne(`Not enough arguments following: %s`,a))),setArg(a,F),n}function setArg(n,a,S=N){/-/.test(n)&&I[`camel-case-expansion`]&&addNewAlias(n,n.split(`.`).map(function(n){return camelCase(n)}).join(`.`));let C=processValue(n,a,S),F=n.split(`.`);setKey(se,F,C),re.aliases[n]&&re.aliases[n].forEach(function(n){let a=n.split(`.`);setKey(se,a,C)}),F.length>1&&I[`dot-notation`]&&(re.aliases[F[0]]||[]).forEach(function(a){let S=a.split(`.`),N=[].concat(F);N.shift(),S=S.concat(N),(re.aliases[n]||[]).includes(S.join(`.`))||setKey(se,S,C)}),checkAllAliases(n,re.normalize)&&!checkAllAliases(n,re.arrays)&&[n].concat(re.aliases[n]||[]).forEach(function(n){Object.defineProperty(ce,n,{enumerable:!0,get(){return a},set(n){a=typeof n==`string`?vc.normalize(n):n}})})}function addNewAlias(n,a){re.aliases[n]&&re.aliases[n].length||(re.aliases[n]=[a],X[a]=!0),re.aliases[a]&&re.aliases[a].length||addNewAlias(a,n)}function processValue(n,a,S){S&&(a=stripQuotes$1(a)),(checkAllAliases(n,re.bools)||checkAllAliases(n,re.counts))&&typeof a==`string`&&(a=a===`true`);let C=Array.isArray(a)?a.map(function(a){return maybeCoerceNumber(n,a)}):maybeCoerceNumber(n,a);return checkAllAliases(n,re.counts)&&(isUndefined(C)||typeof C==`boolean`)&&(C=increment$1()),checkAllAliases(n,re.normalize)&&checkAllAliases(n,re.arrays)&&(C=Array.isArray(a)?a.map(n=>vc.normalize(n)):vc.normalize(a)),C}function maybeCoerceNumber(n,a){return!I[`parse-positional-numbers`]&&n===`_`||!checkAllAliases(n,re.strings)&&!checkAllAliases(n,re.bools)&&!Array.isArray(a)&&(looksLikeNumber(a)&&I[`parse-numbers`]&&Number.isSafeInteger(Math.floor(parseFloat(`${a}`)))||!isUndefined(a)&&checkAllAliases(n,re.numbers))&&(a=Number(a)),a}function setConfig(n){let a=Object.create(null);applyDefaultsAndAliases(a,re.aliases,H),Object.keys(re.configs).forEach(function(S){let C=n[S]||a[S];if(C)try{let n=null,a=vc.resolve(vc.cwd(),C),N=re.configs[S];if(typeof N==`function`){try{n=N(a)}catch(a){n=a}if(n instanceof Error){oe=n;return}}else n=vc.require(a);setConfigObject(n)}catch(a){a.name===`PermissionDenied`?oe=a:n[S]&&(oe=Error(ne(`Invalid JSON config file: %s`,C)))}})}function setConfigObject(n,a){Object.keys(n).forEach(function(S){let C=n[S],N=a?a+`.`+S:S;typeof C==`object`&&C&&!Array.isArray(C)&&I[`dot-notation`]?setConfigObject(C,N):(!hasKey(se,N.split(`.`))||checkAllAliases(N,re.arrays)&&I[`combine-arrays`])&&setArg(N,C)})}function setConfigObjects(){W!==void 0&&W.forEach(function(n){setConfigObject(n)})}function applyEnvVars(n,a){if(K===void 0)return;let S=typeof K==`string`?K:``,C=vc.env();Object.keys(C).forEach(function(N){if(S===``||N.lastIndexOf(S,0)===0){let F=N.split(`__`).map(function(n,a){return a===0&&(n=n.substring(S.length)),camelCase(n)});(a&&re.configs[F.join(`.`)]||!a)&&!hasKey(n,F)&&setArg(F.join(`.`),C[N])}})}function applyCoercions(n){let a,S=new Set;Object.keys(n).forEach(function(C){if(!S.has(C)&&(a=checkAllAliases(C,re.coercions),typeof a==`function`))try{let N=maybeCoerceNumber(C,a(n[C]));[].concat(re.aliases[C]||[],C).forEach(a=>{S.add(a),n[a]=N})}catch(n){oe=n}})}function setPlaceholderKeys(n){return re.keys.forEach(a=>{~a.indexOf(`.`)||n[a]===void 0&&(n[a]=void 0)}),n}function applyDefaultsAndAliases(n,a,S,C=!1){Object.keys(S).forEach(function(N){hasKey(n,N.split(`.`))||(setKey(n,N.split(`.`),S[N]),C&&(te[N]=!0),(a[N]||[]).forEach(function(a){hasKey(n,a.split(`.`))||setKey(n,a.split(`.`),S[N])}))})}function hasKey(n,a){let S=n;I[`dot-notation`]||(a=[a.join(`.`)]),a.slice(0,-1).forEach(function(n){S=S[n]||{}});let C=a[a.length-1];return typeof S==`object`?C in S:!1}function setKey(n,a,S){let C=n;I[`dot-notation`]||(a=[a.join(`.`)]),a.slice(0,-1).forEach(function(n){n=sanitizeKey(n),typeof C==`object`&&C[n]===void 0&&(C[n]={}),typeof C[n]!=`object`||Array.isArray(C[n])?(Array.isArray(C[n])?C[n].push({}):C[n]=[C[n],{}],C=C[n][C[n].length-1]):C=C[n]});let N=sanitizeKey(a[a.length-1]),F=checkAllAliases(a.join(`.`),re.arrays),H=Array.isArray(S),W=I[`duplicate-arguments-array`];!W&&checkAllAliases(N,re.nargs)&&(W=!0,(!isUndefined(C[N])&&re.nargs[N]===1||Array.isArray(C[N])&&C[N].length===re.nargs[N])&&(C[N]=void 0)),S===increment$1()?C[N]=increment$1(C[N]):Array.isArray(C[N])?W&&F&&H?C[N]=I[`flatten-duplicate-arrays`]?C[N].concat(S):(Array.isArray(C[N][0])?C[N]:[C[N]]).concat([S]):!W&&!!F==!!H?C[N]=S:C[N]=C[N].concat([S]):C[N]===void 0&&F?C[N]=H?S:[S]:W&&!(C[N]===void 0||checkAllAliases(N,re.counts)||checkAllAliases(N,re.bools))?C[N]=[C[N],S]:C[N]=S}function extendAliases(...n){n.forEach(function(n){Object.keys(n||{}).forEach(function(n){re.aliases[n]||(re.aliases[n]=[].concat(F[n]||[]),re.aliases[n].concat(n).forEach(function(a){if(/-/.test(a)&&I[`camel-case-expansion`]){let S=camelCase(a);S!==n&&re.aliases[n].indexOf(S)===-1&&(re.aliases[n].push(S),X[S]=!0)}}),re.aliases[n].concat(n).forEach(function(a){if(a.length>1&&/[A-Z]/.test(a)&&I[`camel-case-expansion`]){let S=decamelize(a,`-`);S!==n&&re.aliases[n].indexOf(S)===-1&&(re.aliases[n].push(S),X[S]=!0)}}),re.aliases[n].forEach(function(a){re.aliases[a]=[n].concat(re.aliases[n].filter(function(n){return a!==n}))}))})})}function checkAllAliases(n,a){let S=[].concat(re.aliases[n]||[],n),C=Object.keys(a),N=S.find(n=>C.includes(n));return N?a[N]:!1}function hasAnyFlag(n){let a=Object.keys(re);return[].concat(a.map(n=>re[n])).some(function(a){return Array.isArray(a)?a.includes(n):a[n]})}function hasFlagsMatching(n,...a){return[].concat(...a).some(function(a){let S=n.match(a);return S&&hasAnyFlag(S[1])})}function hasAllShortFlags(n){if(n.match(ie)||!n.match(/^-[^-]+/))return!1;let a=!0,S,C=n.slice(1).split(``);for(let N=0;N<C.length;N++){if(S=n.slice(N+2),!hasAnyFlag(C[N])){a=!1;break}if(C[N+1]&&C[N+1]===`=`||S===`-`||/[A-Za-z]/.test(C[N])&&/^-?\d+(\.\d*)?(e-?\d+)?$/.test(S)||C[N+1]&&C[N+1].match(/\W/))break}return a}function isUnknownOptionAsArg(n){return I[`unknown-options-as-args`]&&isUnknownOption(n)}function isUnknownOption(n){return n=n.replace(/^-{3,}/,`--`),n.match(ie)||hasAllShortFlags(n)?!1:!hasFlagsMatching(n,/^-+([^=]+?)=[\s\S]*$/,ae,/^-+([^=]+?)$/,/^-+([^=]+?)-$/,/^-+([^=]+?\d+)$/,/^-+([^=]+?)\W+.*$/)}function defaultValue(n){return!checkAllAliases(n,re.bools)&&!checkAllAliases(n,re.counts)&&`${n}`in H?H[n]:defaultForType(guessType(n))}function defaultForType(n){return{[gc.BOOLEAN]:!0,[gc.STRING]:``,[gc.NUMBER]:void 0,[gc.ARRAY]:[]}[n]}function guessType(n){let a=gc.BOOLEAN;return checkAllAliases(n,re.strings)?a=gc.STRING:checkAllAliases(n,re.numbers)?a=gc.NUMBER:checkAllAliases(n,re.bools)?a=gc.BOOLEAN:checkAllAliases(n,re.arrays)&&(a=gc.ARRAY),a}function isUndefined(n){return n===void 0}function checkConfiguration(){Object.keys(re.counts).find(n=>checkAllAliases(n,re.arrays)?(oe=Error(ne(`Invalid configuration: %s, opts.count excludes opts.array.`,n)),!0):checkAllAliases(n,re.nargs)?(oe=Error(ne(`Invalid configuration: %s, opts.count excludes opts.narg.`,n)),!0):!1)}return{aliases:Object.assign({},re.aliases),argv:Object.assign(ce,se),configuration:I,defaulted:Object.assign({},te),error:oe,newAliases:Object.assign({},X)}}},__name$1(increment$1,`increment`),__name$1(stripQuotes$1,`stripQuotes`)}),bc,xc,Sc=__esmMin(()=>{bc=Object.defineProperty,xc=__name$1((n,a)=>{let S={};for(var C in n)bc(S,C,{get:n[C],enumerable:!0});return a||bc(S,Symbol.toStringTag,{value:`Module`}),S},`__exportAll`)});function getEncodingFromOptions(n={encoding:null,flag:`r`},a=`utf8`){return n===null?a:typeof n==`string`?n:typeof n==`object`&&typeof n.encoding==`string`?n.encoding:a}function encodeUint8Array(n,a){return n===`buffer`?Ge.from(a):new TextDecoder(n).decode(a)}function decode(n,a){if(a){let S=new TextDecoder(a),C=new TextEncoder;return S.decode(C.encode(n))}else return n}var Cc=__esmMin(()=>{et()}),Dirent,wc=__esmMin(()=>{Tr(),Ts(),Dirent=class{name;parentPath;_isFile=!1;_isDirectory=!1;_isBlockDevice=!1;_isCharacterDevice=!1;_isSymbolicLink=!1;_isFIFO=!1;_isSocket=!1;_file;constructor(n,a,S){switch(a||=vs(n),this.name=a,this.parentPath=_s(n),this._file=wr.File.new_for_path(n),S??this._file.query_file_type(wr.FileQueryInfoFlags.NONE,null)){case wr.FileType.DIRECTORY:this._isDirectory=!0;break;case wr.FileType.MOUNTABLE:break;case wr.FileType.REGULAR:this._isFile=!0;break;case wr.FileType.SYMBOLIC_LINK:case wr.FileType.SHORTCUT:this._isSymbolicLink=!0;break;case wr.FileType.SPECIAL:this._classifySpecialFile(n);break}}_classifySpecialFile(n){try{let a=wr.File.new_for_path(n).query_info(`unix::mode`,wr.FileQueryInfoFlags.NOFOLLOW_SYMLINKS,null).get_attribute_uint32(`unix::mode`);if(a===0)return;switch(a&61440){case 24576:this._isBlockDevice=!0;break;case 8192:this._isCharacterDevice=!0;break;case 49152:this._isSocket=!0;break;case 4096:this._isFIFO=!0;break}}catch{}}isFile(){return this._isFile}isDirectory(){return this._isDirectory}isBlockDevice(){return this._isBlockDevice}isCharacterDevice(){return this._isCharacterDevice}isSymbolicLink(){return this._isSymbolicLink}isFIFO(){return this._isFIFO}isSocket(){return this._isSocket}}});function populateFromInfo(n){let a=n.get_attribute_uint64(`time::access`),S=n.get_attribute_uint32(`time::access-usec`)||0,C=n.get_attribute_uint64(`time::modified`),N=n.get_attribute_uint32(`time::modified-usec`)||0,F=n.get_attribute_uint64(`time::changed`),I=n.get_attribute_uint32(`time::changed-usec`)||0,H=n.get_attribute_uint64(`time::created`),W=n.get_attribute_uint32(`time::created-usec`)||0,K=a*1e3+S/1e3,q=C*1e3+N/1e3,Y=F?F*1e3+I/1e3:q,X=H?H*1e3+W/1e3:Y;return{dev:n.get_attribute_uint32(`unix::device`)||0,ino:Number(n.get_attribute_uint64(`unix::inode`)||0),mode:n.get_attribute_uint32(`unix::mode`)||0,nlink:n.get_attribute_uint32(`unix::nlink`)||0,uid:n.get_attribute_uint32(`unix::uid`)||0,gid:n.get_attribute_uint32(`unix::gid`)||0,rdev:n.get_attribute_uint32(`unix::rdev`)||0,size:Number(n.get_size()||0),blksize:n.get_attribute_uint32(`unix::block-size`)||4096,blocks:Number(n.get_attribute_uint64(`unix::blocks`)||0),atimeMs:K,mtimeMs:q,ctimeMs:Y,birthtimeMs:X,atime:new Date(K),mtime:new Date(q),ctime:new Date(Y),birthtime:new Date(X)}}var Tc,Stats,BigIntStats,Ec=__esmMin(()=>{wc(),Tr(),Ts(),Tc=`standard::*,time::*,unix::*`,Stats=class extends Dirent{dev;ino;mode;nlink;uid;gid;rdev;size;blksize;blocks;atimeMs;mtimeMs;ctimeMs;birthtimeMs;atime;mtime;ctime;birthtime;_info;constructor(n,a,S){let C,N;n instanceof wr.FileInfo?(C=n,N=a.toString(),S||=vs(N)):(N=n.toString(),typeof a==`string`&&(S=a),S||=vs(N),C=wr.File.new_for_path(N).query_info(Tc,wr.FileQueryInfoFlags.NOFOLLOW_SYMLINKS,null)),super(N,S,C.get_file_type()),this._info=C;let F=populateFromInfo(C);this.dev=F.dev,this.ino=F.ino,this.mode=F.mode,this.nlink=F.nlink,this.uid=F.uid,this.gid=F.gid,this.rdev=F.rdev,this.size=F.size,this.blksize=F.blksize,this.blocks=F.blocks,this.atimeMs=F.atimeMs,this.mtimeMs=F.mtimeMs,this.ctimeMs=F.ctimeMs,this.birthtimeMs=F.birthtimeMs,this.atime=F.atime,this.mtime=F.mtime,this.ctime=F.ctime,this.birthtime=F.birthtime}},BigIntStats=class extends Dirent{dev;ino;mode;nlink;uid;gid;rdev;size;blksize;blocks;atimeMs;mtimeMs;ctimeMs;birthtimeMs;atimeNs;mtimeNs;ctimeNs;birthtimeNs;atime;mtime;ctime;birthtime;_info;constructor(n,a,S){let C,N;n instanceof wr.FileInfo?(C=n,N=a.toString(),S||=vs(N)):(N=n.toString(),typeof a==`string`&&(S=a),S||=vs(N),C=wr.File.new_for_path(N).query_info(Tc,wr.FileQueryInfoFlags.NOFOLLOW_SYMLINKS,null)),super(N,S,C.get_file_type()),this._info=C;let F=populateFromInfo(C);this.dev=BigInt(F.dev),this.ino=BigInt(F.ino),this.mode=BigInt(F.mode),this.nlink=BigInt(F.nlink),this.uid=BigInt(F.uid),this.gid=BigInt(F.gid),this.rdev=BigInt(F.rdev),this.size=BigInt(F.size),this.blksize=BigInt(F.blksize),this.blocks=BigInt(F.blocks),this.atimeMs=BigInt(Math.trunc(F.atimeMs)),this.mtimeMs=BigInt(Math.trunc(F.mtimeMs)),this.ctimeMs=BigInt(Math.trunc(F.ctimeMs)),this.birthtimeMs=BigInt(Math.trunc(F.birthtimeMs)),this.atimeNs=this.atimeMs*1000000n,this.mtimeNs=this.mtimeMs*1000000n,this.ctimeNs=this.ctimeMs*1000000n,this.birthtimeNs=this.birthtimeMs*1000000n,this.atime=F.atime,this.mtime=F.mtime,this.ctime=F.ctime,this.birthtime=F.birthtime}}});function createReadStream(n,a){return new ReadStream$1(n,a)}var ReadStream$1,Dc=__esmMin(()=>{nl(),it(),Tr(),et(),ni(),ReadStream$1=class extends Xr{static{__name$1(this,`ReadStream`)}bytesRead=0;path;pending=!0;fd=null;_gioFile;_inputStream=null;_cancellable=new wr.Cancellable;_start;_end;_pos;close(n){this._cancellable.cancel(),this._inputStream&&=(this._inputStream.close_async(rt.PRIORITY_DEFAULT,null,()=>{}),null),this.destroy(),n&&n(null)}constructor(n,a){let S=normalizePath(n);super({highWaterMark:a?.highWaterMark??64*1024,encoding:a?.encoding,objectMode:!1}),this.path=S,this._gioFile=wr.File.new_for_path(S),this._start=a?.start??0,this._end=a?.end??1/0,this._pos=this._start}_construct(n){this._gioFile.read_async(rt.PRIORITY_DEFAULT,this._cancellable,(a,S)=>{if(this.destroyed){n();return}try{this._inputStream=this._gioFile.read_finish(S),this.pending=!1,this.emit(`open`,0),this.emit(`ready`),this._start>0&&this._inputStream.can_seek()&&this._inputStream.seek(this._start,rt.SeekType.SET,null),n()}catch(a){this._cancellable.is_cancelled()||n(a)}})}_read(n){this._doRead(n)}_doRead(n){let a=n;if(this._end!==1/0){let S=this._end-this._pos+1;if(S<=0){this.push(null);return}a=Math.min(n,S)}let S=this._inputStream;S.read_bytes_async(a,rt.PRIORITY_DEFAULT,this._cancellable,(n,a)=>{try{let n=S.read_bytes_finish(a).get_data();if(!n||n.length===0){this.push(null);return}this.bytesRead+=n.length,this._pos+=n.length,this.push(Ge.from(n))}catch(n){this._cancellable.is_cancelled()||this.destroy(n)}})}_destroy(n,a){this._cancellable.cancel(),this._inputStream&&=(this._inputStream.close_async(rt.PRIORITY_DEFAULT,null,()=>{}),null),a(n)}}});function createNodeError(n,a,S,C){return createNodeError$1(n,a,{path:S.toString(),dest:C?.toString()})}var Oc=__esmMin(()=>{Ae()});function makeEEXIST(n){let a=Error(`ERR_FS_CP_EEXIST: file already exists, copyfile '${n}'`);return a.code=`ERR_FS_CP_EEXIST`,a.syscall=`copyfile`,a.path=n,a}function makeEISDIR(n){let a=Error(`ERR_FS_EISDIR: illegal operation on a directory, copyfile '${n}'`);return a.code=`ERR_FS_EISDIR`,a.syscall=`copyfile`,a.path=n,a}function makeENOTDIR(n,a){let S=Error(`ENOTDIR: not a directory, copyfile '${n}' -> '${a}'`);return S.code=`ENOTDIR`,S.syscall=`copyfile`,S.path=n,S.dest=a,S}function makeSYMLINKLOOP(n,a){let S=Error(`ELOOP: too many levels of symbolic links, copyfile '${n}' -> '${a}'`);return S.code=`ELOOP`,S.syscall=`copyfile`,S.path=n,S.dest=a,S}function queryCopyFlags(n){let a=n.force??!0,S=wr.FileCopyFlags.NONE;return a&&(S|=wr.FileCopyFlags.OVERWRITE),n.preserveTimestamps&&(S|=wr.FileCopyFlags.TARGET_DEFAULT_MODIFIED_TIME),n.dereference||(S|=wr.FileCopyFlags.NOFOLLOW_SYMLINKS),S}function copyOneSyncFile(n,a,S,C,N){let F=N.force??!0;try{if(a.query_info(`standard::type`,wr.FileQueryInfoFlags.NONE,null).get_file_type()===wr.FileType.DIRECTORY)throw makeENOTDIR(S,C);if(!F){if(N.errorOnExist)throw makeEEXIST(C);return}}catch(n){if(typeof n.code==`string`)throw n}let I=queryCopyFlags(N);try{n.copy(a,I,null,null)}catch(n){throw createNodeError(n,`copyfile`,S,C)}}function cpOneDirSync(n,a,S,C,N){let F=S.endsWith(`/`)?``:`/`;if(C.startsWith(S+F)&&C!==S)throw makeSYMLINKLOOP(S,C);if(a.query_exists(null))try{if(a.query_info(`standard::type`,wr.FileQueryInfoFlags.NONE,null).get_file_type()!==wr.FileType.DIRECTORY)throw makeENOTDIR(C,S)}catch(n){if(typeof n.code==`string`)throw n}else try{a.make_directory_with_parents(null)}catch(n){throw createNodeError(n,`mkdir`,C)}let I;try{I=n.enumerate_children(`standard::name,standard::type,standard::is-symlink`,N.dereference?wr.FileQueryInfoFlags.NONE:wr.FileQueryInfoFlags.NOFOLLOW_SYMLINKS,null)}catch(n){throw createNodeError(n,`scandir`,S)}let H=I.next_file(null);for(;H!==null;){let n=H.get_name(),a=ms(S,n),F=ms(C,n),W=N.filter;if(W&&!W(a,F)){H=I.next_file(null);continue}cpSyncInternal(a,F,N),H=I.next_file(null)}}function cpSyncInternal(n,a,S){let C=wr.File.new_for_path(n),N=wr.File.new_for_path(a),F;try{F=C.query_info(`standard::type,standard::is-symlink`,S.dereference?wr.FileQueryInfoFlags.NONE:wr.FileQueryInfoFlags.NOFOLLOW_SYMLINKS,null)}catch(a){throw createNodeError(a,`stat`,n)}if(F.get_file_type()===wr.FileType.DIRECTORY){if(!S.recursive)throw makeEISDIR(n);cpOneDirSync(C,N,n,a,S)}else copyOneSyncFile(C,N,n,a,S)}function cpSync(n,a,S){let C=normalizePath(n),N=normalizePath(a),F=S??{},I=wr.File.new_for_path(C),H=F.filter;if(!(H&&!H(C,N))){try{if(I.query_info(`standard::type`,F.dereference?wr.FileQueryInfoFlags.NONE:wr.FileQueryInfoFlags.NOFOLLOW_SYMLINKS,null).get_file_type()===wr.FileType.DIRECTORY&&!F.recursive)throw makeEISDIR(C)}catch(n){throw typeof n.code==`string`?n:createNodeError(n,`stat`,C)}cpSyncInternal(C,N,F)}}function cp(n,a,S,C){let N,F;typeof S==`function`?(F=S,N={}):(F=C,N=S);let I=N.filter;if(I){Promise.resolve(I(normalizePath(n),normalizePath(a))).then(S=>{if(!S){F(null);return}try{cpPromises(n,a,N).then(()=>F(null)).catch(F)}catch(n){F(n)}}).catch(F);return}Promise.resolve().then(()=>{try{cpSync(n,a,N),F(null)}catch(n){F(n)}})}async function cpPromisesDir(n,a,S){let C=n.endsWith(`/`)?``:`/`;if(a.startsWith(n+C)&&a!==n)throw makeSYMLINKLOOP(n,a);let N=wr.File.new_for_path(a);if(!N.query_exists(null))try{N.make_directory_with_parents(null)}catch(n){throw createNodeError(n,`mkdir`,a)}let F=wr.File.new_for_path(n),I;try{I=F.enumerate_children(`standard::name,standard::type`,S.dereference?wr.FileQueryInfoFlags.NONE:wr.FileQueryInfoFlags.NOFOLLOW_SYMLINKS,null)}catch(a){throw createNodeError(a,`scandir`,n)}let H=I.next_file(null);for(;H!==null;){let C=H.get_name(),N=ms(n,C),F=ms(a,C),W=S.filter;if(W&&!await Promise.resolve(W(N,F))){H=I.next_file(null);continue}await cpPromises(N,F,S),H=I.next_file(null)}}async function cpPromises(n,a,S={}){let C=normalizePath(n),N=normalizePath(a),F=wr.File.new_for_path(C),I;try{I=F.query_info(`standard::type`,S.dereference?wr.FileQueryInfoFlags.NONE:wr.FileQueryInfoFlags.NOFOLLOW_SYMLINKS,null)}catch(n){throw createNodeError(n,`stat`,C)}if(I.get_file_type()===wr.FileType.DIRECTORY){if(!S.recursive)throw makeEISDIR(C);await cpPromisesDir(C,N,S)}else copyOneSyncFile(F,wr.File.new_for_path(N),C,N,S)}var kc=__esmMin(()=>{nl(),Oc(),Tr(),Ts()});function _openDir(n){let a=wr.File.new_for_path(n),S;try{S=a.enumerate_children(Ac,wr.FileQueryInfoFlags.NOFOLLOW_SYMLINKS,null)}catch(a){throw createNodeError(a,`opendir`,n)}return new Dir(n,S)}function opendirSync(n){return _openDir(normalizePath(n))}function opendir(n,a,S){let C;if(C=typeof a==`function`?a:S,typeof C!=`function`)throw TypeError(`The "callback" argument must be of type function`);Promise.resolve().then(()=>{try{let a=opendirSync(n);C(null,a)}catch(n){C(n,null)}})}async function opendirAsync(n,a){return new Promise((a,S)=>{let C=normalizePath(n),N=wr.File.new_for_path(C);N.enumerate_children_async(Ac,wr.FileQueryInfoFlags.NOFOLLOW_SYMLINKS,rt.PRIORITY_DEFAULT,null,(n,F)=>{try{let n=N.enumerate_children_finish(F);a(new Dir(C,n))}catch(n){S(createNodeError(n,`opendir`,C))}})})}var Ac,Dir,jc=__esmMin(()=>{nl(),wc(),Oc(),it(),Tr(),Ac=`standard::name,standard::type,standard::is-symlink,standard::size,standard::symlink-target,unix::uid,unix::gid,unix::mode,time::modified,time::access,time::created`,Dir=class{path;_enumerator;_closed=!1;constructor(n,a){this.path=n,this._enumerator=a}_assertOpen(){if(this._closed){let n=Error(`Directory handle was closed`);throw n.code=`ERR_DIR_CLOSED`,n}}readSync(){this._assertOpen();try{let n=this._enumerator.next_file(null);if(n===null)return null;let a=n.get_name(),S=n.get_file_type();return new Dirent(this.path.endsWith(`/`)?this.path+a:this.path+`/`+a,a,S)}catch(n){throw createNodeError(n,`readdir`,this.path)}}read(n){if(n!==void 0){if(typeof n!=`function`)throw TypeError(`The "callback" argument must be of type function`);try{this._assertOpen();let a=this.readSync();Promise.resolve().then(()=>n(null,a))}catch(a){Promise.resolve().then(()=>n(a,null))}return}return new Promise((n,a)=>{try{this._assertOpen(),n(this.readSync())}catch(n){a(n)}})}closeSync(){this._assertOpen(),this._closed=!0;try{this._enumerator.close(null)}catch{}this._enumerator=null}close(n){if(n!==void 0){if(typeof n!=`function`)throw TypeError(`The "callback" argument must be of type function`);try{this.closeSync(),Promise.resolve().then(()=>n(null))}catch(a){Promise.resolve().then(()=>n(a))}return}return new Promise((n,a)=>{try{this.closeSync(),n()}catch(n){a(n)}})}async*[Symbol.asyncIterator](){try{for(;;){let n=await this.read();if(n===null)break;yield n}}finally{this._closed||await this.close()}}}});function segmentToRegexSrc(n){let a=/^([!*+?@])\((.+)\)$/.exec(n);if(a){let[,n,S]=a,C=S.split(`|`).map(n=>segmentToRegexSrc(n)),N=`(?:`+C.join(`|`)+`)`;switch(n){case`!`:return`(?!(?:`+C.join(`|`)+`))[^/]*`;case`*`:return N+`*`;case`+`:return N+`+`;case`?`:return N+`?`;case`@`:return N}}let S=``,C=0;for(;C<n.length;){let a=n[C];if(a===`*`){S+=`[^/]*`,C++;continue}if(a===`?`){S+=`[^/]`,C++;continue}if(a===`[`){let a=n.indexOf(`]`,C+1);if(a===-1){S+=`\\[`,C++;continue}S+=n.slice(C,a+1),C=a+1;continue}if(a===`{`){let a=n.indexOf(`}`,C+1);if(a===-1){S+=`\\{`,C++;continue}let N=n.slice(C+1,a).split(`,`).map(n=>segmentToRegexSrc(n.trim()));S+=`(?:`+N.join(`|`)+`)`,C=a+1;continue}`.+^$|()[]{}`.includes(a)?S+=`\\`+a:S+=a,C++}return S}function globToRegex$2(n){n=n.replace(/\/+/g,`/`).replace(/^\.\//,``);let a=n.split(`/`),S=[];for(let n=0;n<a.length;n++){let C=a[n],N=n===a.length-1;C===`**`?N?S.length>0&&S[S.length-1]===`/`?(S.pop(),S.push(`(?:/.+)?`)):S.push(`(?:.+)?`):S.push(`(?:[^/]+/)*`):(S.push(segmentToRegexSrc(C)),N||S.push(`/`))}return RegExp(`^(?:`+S.join(``)+`)$`)}function buildExcludePredicate(n){if(!n)return null;if(typeof n==`function`)return n;let a=(Array.isArray(n)?n:[n]).map(n=>globToRegex$2(n));return n=>a.some(a=>a.test(n))}function matchAll(n,a,S){let C=globToRegex$2(n),N=buildExcludePredicate(S),F;try{F=readdirSync(a,{recursive:!0})}catch{return[]}let I=[`.`,...F],H=[];for(let n of I){let a=n.replace(/\\/g,`/`);C.test(a)&&(N&&N(a)||H.push(n))}return H}function globSync(n,a){let S=Array.isArray(n)?n:[n],C=a?.cwd?normalizePath(a.cwd):globalThis.process?.cwd?.()??`/`,N=a?.exclude,F=new Set,I=[];for(let n of S)for(let a of matchAll(n,C,N))F.has(a)||(F.add(a),I.push(a));return I}function glob(n,a,S){let C,N;typeof a==`function`?(N=a,C={}):(N=S,C=a||{}),Promise.resolve().then(()=>{try{let a=globSync(n,C);N(null,a)}catch(n){N(n,[])}})}async function*globAsync(n,a){let S=globSync(n,a);for(let n of S)yield n}var Mc=__esmMin(()=>{nl(),tl(),__name$1(globToRegex$2,`globToRegex`)});function buildStatFs(n){let a=Number(n.get_attribute_uint64(`filesystem::size`)??0),S=Number(n.get_attribute_uint64(`filesystem::free`)??0),C=Math.floor(a/Pc),N=Math.floor(S/Pc);return{type:0,bsize:Pc,blocks:C,bfree:N,bavail:N,files:0,ffree:0}}function buildBigIntStatFs(n){let a=BigInt(n.get_attribute_uint64(`filesystem::size`)??0),S=BigInt(n.get_attribute_uint64(`filesystem::free`)??0),C=BigInt(Pc),N=a/C,F=S/C;return{type:0n,bsize:C,blocks:N,bfree:F,bavail:F,files:0n,ffree:0n}}function statfsSync(n,a){let S=wr.File.new_for_path(normalizePath(n)).query_filesystem_info(Nc,null);return a?.bigint===!0?buildBigIntStatFs(S):buildStatFs(S)}function queryFsInfoAsync(n,a){return new Promise((S,C)=>{let N=wr.File.new_for_path(normalizePath(n));N.query_filesystem_info_async(Nc,rt.PRIORITY_DEFAULT,null,(n,F)=>{try{let n=N.query_filesystem_info_finish(F);S(a?buildBigIntStatFs(n):buildStatFs(n))}catch(n){C(n)}})})}function statfs(n,a,S){let C=typeof a==`function`?a:S;queryFsInfoAsync(n,(typeof a==`function`?{}:a)?.bigint===!0).then(n=>C(null,n),n=>C(n,null))}async function statfsAsync(n,a){return queryFsInfoAsync(n,a?.bigint===!0)}var Nc,Pc,Fc=__esmMin(()=>{nl(),it(),Tr(),Nc=[`filesystem::size`,`filesystem::free`].join(`,`),Pc=4096}),Ic=__exportAll$4({lchmod:()=>lchmod,lchmodAsync:()=>lchmodAsync,lchmodSync:()=>lchmodSync,lchown:()=>lchown,lchownAsync:()=>lchownAsync,lchownSync:()=>lchownSync,lutimes:()=>lutimes,lutimesAsync:()=>lutimesAsync,lutimesSync:()=>lutimesSync,utimes:()=>utimes,utimesAsync:()=>utimesAsync,utimesSync:()=>utimesSync});function toGLibDateTime(n){let a=n instanceof Date?n.getTime():typeof n==`bigint`?Number(n):typeof n==`string`?Date.parse(n):n*1e3;return rt.DateTime.new_from_unix_utc(Math.floor(a/1e3))}function setTimestamps(n,a,S,C){let N=wr.File.new_for_path(n),F=new wr.FileInfo;F.set_modification_date_time(toGLibDateTime(S)),F.set_access_date_time(toGLibDateTime(a)),N.set_attributes_from_info(F,C,null)}function utimesSync(n,a,S){setTimestamps(normalizePath(n),a,S,wr.FileQueryInfoFlags.NONE)}function utimes(n,a,S,C){Promise.resolve().then(()=>utimesSync(n,a,S)).then(()=>C(null),C)}async function utimesAsync(n,a,S){utimesSync(n,a,S)}function lutimesSync(n,a,S){setTimestamps(normalizePath(n),a,S,wr.FileQueryInfoFlags.NOFOLLOW_SYMLINKS)}function lutimes(n,a,S,C){Promise.resolve().then(()=>lutimesSync(n,a,S)).then(()=>C(null),C)}async function lutimesAsync(n,a,S){lutimesSync(n,a,S)}function lchownSync(n,a,S){rt.spawn_command_line_sync(`chown -h ${a}:${S} ${normalizePath(n)}`)}function lchown(n,a,S,C){Promise.resolve().then(()=>lchownSync(n,a,S)).then(()=>C(null),C)}async function lchownAsync(n,a,S){lchownSync(n,a,S)}function lchmodSync(n,a){}function lchmod(n,a,S){S(null)}async function lchmodAsync(n,a){}var Lc=__esmMin(()=>{nl(),it(),Tr()});function getFH(n){return n instanceof $c?$c.getInstance(n.fd):$c.getInstance(n)}function fstatSync(n,a){return statSync(normalizePath(getFH(n).options.path),a)}function fstat(n,a,S){let C=typeof a==`function`?a:S;fstatAsync(n,typeof a==`function`?{}:a).then(n=>C(null,n),n=>C(n,void 0))}async function fstatAsync(n,a){return a?.bigint,fstatSync(n,a)}function ftruncateSync(n,a=0){truncateSync(normalizePath(getFH(n).options.path),a)}function ftruncate(n,a,S){let C=typeof a==`function`?a:S;ftruncateAsync(n,typeof a==`function`?0:a).then(()=>C(null),C)}async function ftruncateAsync(n,a=0){ftruncateSync(n,a)}function fdatasyncSync(n){getFH(n)._flushSync()}function fdatasync(n,a){Promise.resolve().then(()=>fdatasyncSync(n)).then(()=>a(null),a)}async function fdatasyncAsync(n){fdatasyncSync(n)}function fsyncSync(n){getFH(n)._flushSync()}function fsync(n,a){Promise.resolve().then(()=>fsyncSync(n)).then(()=>a(null),a)}async function fsyncAsync(n){fsyncSync(n)}function fchmodSync(n,a){chmodSync(normalizePath(getFH(n).options.path),a)}function fchmod(n,a,S){Promise.resolve().then(()=>fchmodSync(n,a)).then(()=>S(null),S)}async function fchmodAsync(n,a){fchmodSync(n,a)}function fchownSync(n,a,S){chownSync(normalizePath(getFH(n).options.path),a,S)}function fchown(n,a,S,C){Promise.resolve().then(()=>fchownSync(n,a,S)).then(()=>C(null),C)}async function fchownAsync(n,a,S){fchownSync(n,a,S)}function futimesSync(n,a,S){utimesSync(normalizePath(getFH(n).options.path),a,S)}function futimes(n,a,S,C){Promise.resolve().then(()=>futimesSync(n,a,S)).then(()=>C(null),C)}async function futimesAsync(n,a,S){futimesSync(n,a,S)}function closeSync(n){getFH(n)._closeSync()}function readSync(n,a,S,C,N){let F=0;return typeof S==`object`&&S?(F=S.offset??0,C=S.length??a.byteLength,N=S.position??null):(F=S??0,C??=a.byteLength-F),getFH(n)._readSync(a,F,C,N??null)}function writeSync(n,a,S,C,N){let F;if(typeof a==`string`)F=new TextEncoder().encode(a),typeof S==`number`&&(N=S);else{let n=typeof S==`number`?S:0,N=typeof C==`number`?C:a.byteLength-n;F=new Uint8Array(a.buffer,a.byteOffset+n,N)}return getFH(n)._writeSync(F,N??null)}function readvSync(n,a,S){let C=0;for(let N of a){let a=readSync(n,N,0,N.byteLength,S==null?null:S+C);if(C+=a,a<N.byteLength)break}return C}function readv(n,a,S,C){let N=typeof S==`function`?S:C;readvAsync(n,a,typeof S==`function`?null:S).then(n=>N(null,n.bytesRead,n.buffers),n=>N(n,0,a))}async function readvAsync(n,a,S){return{bytesRead:readvSync(n,a,S),buffers:a}}function writevSync(n,a,S){let C=0;for(let N of a){let a=writeSync(n,N,0,N.byteLength,S==null?null:S+C);C+=a}return C}function writev(n,a,S,C){let N=typeof S==`function`?S:C;writevAsync(n,a,typeof S==`function`?null:S).then(n=>N(null,n.bytesWritten,n.buffers),n=>N(n,0,a))}async function writevAsync(n,a,S){return{bytesWritten:writevSync(n,a,S),buffers:a}}function exists(n,a){try{statSync(normalizePath(n)),a(!0)}catch{a(!1)}}async function openAsBlob(n,a){let S=readFileSync(normalizePath(n));return new Blob([S],{type:a?.type??``})}var Rc=__esmMin(()=>{nl(),el(),tl(),Lc()}),zc=__exportAll$4({access:()=>access$1,appendFile:()=>appendFile$1,chmod:()=>chmod$1,chown:()=>chown$1,copyFile:()=>copyFile$1,cp:()=>cpPromises,default:()=>Vc,fchmod:()=>fchmodAsync,fchown:()=>fchownAsync,fdatasync:()=>fdatasyncAsync,fstat:()=>fstatAsync,fsync:()=>fsyncAsync,ftruncate:()=>ftruncateAsync,futimes:()=>futimesAsync,glob:()=>globAsync,lchmod:()=>lchmodAsync,lchown:()=>lchownAsync,link:()=>link$1,lstat:()=>lstat$1,lutimes:()=>lutimesAsync,mkdir:()=>mkdir$1,mkdtemp:()=>mkdtemp,open:()=>open$2,openAsBlob:()=>openAsBlob,opendir:()=>opendirAsync,promises_exports:()=>Bc,readFile:()=>readFile$1,readdir:()=>readdir$1,readlink:()=>readlink$1,readv:()=>readvAsync,realpath:()=>realpath$1,rename:()=>rename$1,rm:()=>rm$1,rmdir:()=>rmdir$1,stat:()=>stat$1,statfs:()=>statfsAsync,symlink:()=>symlink$1,truncate:()=>truncate$1,unlink:()=>unlink$1,utimes:()=>utimesAsync,watch:()=>watchAsync,write:()=>write$1,writeFile:()=>writeFile$1,writev:()=>writevAsync});async function mkdir$1(n,a){let S;typeof a==`object`&&(a.recursive&&(S=a.recursive),a.mode&&a.mode);let C=normalizePath(n);if(S)return mkdirRecursiveAsync(C);let N=wr.File.new_for_path(C);return new Promise((n,a)=>{N.make_directory_async(rt.PRIORITY_DEFAULT,null,(S,F)=>{try{N.make_directory_finish(F),n(void 0)}catch(n){a(createNodeError(n,`mkdir`,C))}})})}async function mkdirRecursiveAsync(n){let a=wr.File.new_for_path(n);try{return await new Promise((n,S)=>{a.make_directory_async(rt.PRIORITY_DEFAULT,null,(C,N)=>{try{a.make_directory_finish(N),n()}catch(n){S(n)}})}),n}catch(a){let S=a;if(S.code===wr.IOErrorEnum.EXISTS)return;if(S.code===wr.IOErrorEnum.NOT_FOUND){let S=_s(n);if(S===n)throw createNodeError(a,`mkdir`,n);let C=await mkdirRecursiveAsync(S),N=wr.File.new_for_path(n);return await new Promise((a,S)=>{N.make_directory_async(rt.PRIORITY_DEFAULT,null,(C,F)=>{try{N.make_directory_finish(F),a()}catch(a){S(createNodeError(a,`mkdir`,n))}})}),C??n}throw createNodeError(a,`mkdir`,n)}}async function readFile$1(n,a={encoding:null,flag:`r`}){let S=normalizePath(n),C=wr.File.new_for_path(S),N,F;try{[N,F]=await new Promise((n,a)=>{C.load_contents_async(null,(S,N)=>{try{n(C.load_contents_finish(N))}catch(n){a(n)}})})}catch(n){throw createNodeError(n,`open`,S)}if(!N)throw createNodeError(Error(`failed to read file`),`open`,S);return encodeUint8Array(getEncodingFromOptions(a,`buffer`),F)}async function mkdtemp(n,a){let S=getEncodingFromOptions(a),C=tempDirPath(n);return await mkdir$1(C,{recursive:!1,mode:448}),decode(C,S)}async function writeFile$1(n,a){let S=normalizePath(n),C=wr.File.new_for_path(S),N;N=typeof a==`string`?new TextEncoder().encode(a):a instanceof Uint8Array?a:new TextEncoder().encode(String(a));let F=await new Promise((n,a)=>{C.replace_async(null,!1,wr.FileCreateFlags.REPLACE_DESTINATION,rt.PRIORITY_DEFAULT,null,(N,F)=>{try{n(C.replace_finish(F))}catch(n){a(createNodeError(n,`open`,S))}})});if(N.length>0){let n=new rt.Bytes(N);await new Promise((a,C)=>{F.write_bytes_async(n,rt.PRIORITY_DEFAULT,null,(n,N)=>{try{F.write_bytes_finish(N),a()}catch(n){C(createNodeError(n,`write`,S))}})})}await new Promise((n,a)=>{F.close_async(rt.PRIORITY_DEFAULT,null,(C,N)=>{try{F.close_finish(N),n()}catch(n){a(createNodeError(n,`close`,S))}})})}async function rmdir$1(n,a){let S=normalizePath(n),C=wr.File.new_for_path(S);if((await new Promise((n,a)=>{C.query_info_async(`standard::type`,wr.FileQueryInfoFlags.NONE,rt.PRIORITY_DEFAULT,null,(N,F)=>{try{n(C.query_info_finish(F))}catch(n){a(createNodeError(n,`rmdir`,S))}})})).get_file_type()!==wr.FileType.DIRECTORY)throw createNodeError(Object.assign(Error(),{code:4}),`rmdir`,S);if((await new Promise((n,a)=>{C.enumerate_children_async(`standard::name`,wr.FileQueryInfoFlags.NONE,rt.PRIORITY_DEFAULT,null,(N,F)=>{try{n(C.enumerate_children_finish(F))}catch(n){a(createNodeError(n,`rmdir`,S))}})})).next_file(null)!==null)throw createNodeError(Object.assign(Error(),{code:5}),`rmdir`,S);await new Promise((n,a)=>{C.delete_async(rt.PRIORITY_DEFAULT,null,(N,F)=>{try{C.delete_finish(F),n()}catch(n){a(createNodeError(n,`rmdir`,S))}})})}async function unlink$1(n){let a=normalizePath(n),S=wr.File.new_for_path(a);await new Promise((n,C)=>{S.delete_async(rt.PRIORITY_DEFAULT,null,(N,F)=>{try{S.delete_finish(F),n()}catch(n){C(createNodeError(n,`unlink`,a))}})})}async function open$2(n,a,S){return new $c({path:n,flags:a,mode:S})}async function write$1(n,a,S,C,N){return typeof a==`string`?_writeStr(n,a,S,C):_writeBuf(n,a,S,C,N)}async function _writeBuf(n,a,S,C,N){return{bytesWritten:(await $c.getInstance(n).write(a,S,C,N)).bytesWritten,buffer:a}}async function _writeStr(n,a,S,C){return{bytesWritten:(await $c.getInstance(n).write(a,S,C)).bytesWritten,buffer:a}}function queryInfoAsync(n,a,S,C){let N=normalizePath(n);return new Promise((n,F)=>{let I=wr.File.new_for_path(N);I.query_info_async(Tc,a,rt.PRIORITY_DEFAULT,null,(a,H)=>{try{let a=I.query_info_finish(H);n(C?.bigint?new BigIntStats(a,N):new Stats(a,N))}catch(n){F(createNodeError(n,S,N))}})})}async function stat$1(n,a){return queryInfoAsync(n,wr.FileQueryInfoFlags.NONE,`stat`,a)}async function lstat$1(n,a){return queryInfoAsync(n,wr.FileQueryInfoFlags.NOFOLLOW_SYMLINKS,`lstat`,a)}async function readdir$1(n,a){try{return readdirSync(n,a)}catch(a){throw createNodeError(a,`scandir`,n)}}async function realpath$1(n){return realpathSync(n)}async function symlink$1(n,a,S){let C=normalizePath(a),N=normalizePath(n);return new Promise((n,a)=>{let S=wr.File.new_for_path(C);S.make_symbolic_link_async(N,rt.PRIORITY_DEFAULT,null,(F,I)=>{try{S.make_symbolic_link_finish(I),n()}catch(n){a(createNodeError(n,`symlink`,N,C))}})})}async function rm$1(n,a){let S=normalizePath(n),C=wr.File.new_for_path(S),N=a?.recursive||!1,F=a?.force||!1,I;try{I=C.query_file_type(wr.FileQueryInfoFlags.NOFOLLOW_SYMLINKS,null)}catch(a){if(F)return;throw createNodeError(a,`rm`,n)}if(I===wr.FileType.SYMBOLIC_LINK){await new Promise((a,S)=>{C.delete_async(rt.PRIORITY_DEFAULT,null,(N,I)=>{try{C.delete_finish(I),a()}catch(C){if(F){a();return}S(createNodeError(C,`rm`,n))}})});return}if(I===wr.FileType.DIRECTORY){let C=await readdir$1(n,{withFileTypes:!0});if(!N&&C.length)throw createNodeError(Object.assign(Error(),{code:5}),`rm`,n);for(let n of C)typeof n!=`string`&&await rm$1(ms(S,n.name),a)}await new Promise((a,S)=>{C.delete_async(rt.PRIORITY_DEFAULT,null,(N,I)=>{try{C.delete_finish(I),a()}catch(C){if(F){a();return}S(createNodeError(C,`rm`,n))}})})}async function rename$1(n,a){renameSync(n,a)}async function copyFile$1(n,a,S){copyFileSync(n,a,S)}async function access$1(n,a){accessSync(n,a)}async function appendFile$1(n,a,S){appendFileSync(n,a,S)}async function readlink$1(n,a){return readlinkSync(n,a)}async function truncate$1(n,a){truncateSync(n,a)}async function chmod$1(n,a){chmodSync(n,a)}async function chown$1(n,a,S){chownSync(n,a,S)}async function link$1(n,a){linkSync(n,a)}var Bc,Vc,Hc=__esmMin(()=>{Sc(),Cc(),nl(),il(),Ec(),el(),Oc(),tl(),kc(),jc(),Mc(),Fc(),Lc(),Rc(),it(),Tr(),Ts(),Bc=xc({access:()=>access$1,appendFile:()=>appendFile$1,chmod:()=>chmod$1,chown:()=>chown$1,copyFile:()=>copyFile$1,cp:()=>cpPromises,default:()=>Vc,fchmod:()=>fchmodAsync,fchown:()=>fchownAsync,fdatasync:()=>fdatasyncAsync,fstat:()=>fstatAsync,fsync:()=>fsyncAsync,ftruncate:()=>ftruncateAsync,futimes:()=>futimesAsync,glob:()=>globAsync,lchmod:()=>lchmodAsync,lchown:()=>lchownAsync,link:()=>link$1,lstat:()=>lstat$1,lutimes:()=>lutimesAsync,mkdir:()=>mkdir$1,mkdtemp:()=>mkdtemp,open:()=>open$2,openAsBlob:()=>openAsBlob,opendir:()=>opendirAsync,readFile:()=>readFile$1,readdir:()=>readdir$1,readlink:()=>readlink$1,readv:()=>readvAsync,realpath:()=>realpath$1,rename:()=>rename$1,rm:()=>rm$1,rmdir:()=>rmdir$1,stat:()=>stat$1,statfs:()=>statfsAsync,symlink:()=>symlink$1,truncate:()=>truncate$1,unlink:()=>unlink$1,utimes:()=>utimesAsync,watch:()=>watchAsync,write:()=>write$1,writeFile:()=>writeFile$1,writev:()=>writevAsync}),__name$1(mkdir$1,`mkdir`),__name$1(readFile$1,`readFile`),__name$1(writeFile$1,`writeFile`),__name$1(rmdir$1,`rmdir`),__name$1(unlink$1,`unlink`),__name$1(open$2,`open`),__name$1(write$1,`write`),__name$1(stat$1,`stat`),__name$1(lstat$1,`lstat`),__name$1(readdir$1,`readdir`),__name$1(realpath$1,`realpath`),__name$1(symlink$1,`symlink`),__name$1(rm$1,`rm`),__name$1(rename$1,`rename`),__name$1(copyFile$1,`copyFile`),__name$1(access$1,`access`),__name$1(appendFile$1,`appendFile`),__name$1(readlink$1,`readlink`),__name$1(truncate$1,`truncate`),__name$1(chmod$1,`chmod`),__name$1(chown$1,`chown`),__name$1(link$1,`link`),Vc={readFile:readFile$1,mkdir:mkdir$1,mkdtemp,realpath:realpath$1,readdir:readdir$1,writeFile:writeFile$1,rmdir:rmdir$1,unlink:unlink$1,open:open$2,write:write$1,rm:rm$1,lstat:lstat$1,symlink:symlink$1,stat:stat$1,rename:rename$1,copyFile:copyFile$1,access:access$1,appendFile:appendFile$1,readlink:readlink$1,truncate:truncate$1,chmod:chmod$1,chown:chown$1,link:link$1,cp:cpPromises,opendir:opendirAsync,glob:globAsync,watch:watchAsync,statfs:statfsAsync,utimes:utimesAsync,lutimes:lutimesAsync,lchown:lchownAsync,lchmod:lchmodAsync,fstat:fstatAsync,ftruncate:ftruncateAsync,fdatasync:fdatasyncAsync,fsync:fsyncAsync,fchmod:fchmodAsync,fchown:fchownAsync,futimes:futimesAsync,readv:readvAsync,writev:writevAsync,openAsBlob}});function parseOptsCb(n,a){return typeof n==`function`?{options:{},callback:n}:{options:n??{},callback:a}}function statImpl(n,a,S,C,N){let F=normalizePath(n),I=wr.File.new_for_path(F);I.query_info_async(Tc,a,rt.PRIORITY_DEFAULT,null,(n,a)=>{try{let n=I.query_info_finish(a);N(null,C?.bigint?new BigIntStats(n,F):new Stats(n,F))}catch(n){N(createNodeError(n,S,F))}})}function stat(n,a,S){let{options:C,callback:N}=parseOptsCb(a,S);statImpl(n,wr.FileQueryInfoFlags.NONE,`stat`,C,N)}function lstat(n,a,S){let{options:C,callback:N}=parseOptsCb(a,S);statImpl(n,wr.FileQueryInfoFlags.NOFOLLOW_SYMLINKS,`lstat`,C,N)}function readdir(n,a,S){let{options:C,callback:N}=parseOptsCb(a,S);Promise.resolve().then(()=>{try{N(null,readdirSync(n,C))}catch(a){N(createNodeError(a,`readdir`,n))}})}function realpath(n,a,S){let{callback:C}=parseOptsCb(a,S);Promise.resolve().then(()=>{try{C(null,realpathSync(n))}catch(n){C(n)}})}function symlink(n,a,S,C){let N=typeof S==`function`?S:C;if(typeof N!=`function`)throw TypeError(`Callback must be a function. Received `+typeof N);let F=normalizePath(a),I=normalizePath(n),H=wr.File.new_for_path(F);H.make_symbolic_link_async(I,rt.PRIORITY_DEFAULT,null,(n,a)=>{try{H.make_symbolic_link_finish(a),N(null)}catch(n){N(createNodeError(n,`symlink`,I,F))}})}function open$1(n,...a){let S,C,N;switch(a.length){case 1:N=a[0];break;case 2:S=a[0],N=a[1];break;case 3:S=a[0],C=a[1],N=a[2];break;default:break}open$2(n,S,C).then(n=>{N(null,n.fd)}).catch(n=>{N(n,-1)})}function write(n,a,...S){let C=$c.getInstance(n);if(typeof a==`string`){let n=S.pop(),N=S[0],F=S[1];C.write(a,N,F).then(a=>{n(null,a.bytesWritten,a.buffer)}).catch(a=>{n(a,0,``)});return}let N=S[S.length-1],F=S[0],I=S[1],H=S[2];C.write(a,F,I,H).then(n=>{N(null,n.bytesWritten,n.buffer)}).catch(n=>{N(n,0,Ge.from([]))})}function read$1(n,...a){let S=$c.getInstance(n),C=a[a.length-1],N,F,I,H;if(!(a.length<=1))if(typeof a[0]==`object`&&!ArrayBuffer.isView(a[0])){let n=a[0];N=n.buffer,F=n.offset,I=n.length,H=n.position}else N=a[0],F=a[1],I=a[2],H=a[3];S.read(N,F,I,H).then(n=>{C(null,n.bytesRead,n.buffer)}).catch(n=>{C(n,0,Ge.from([]))})}function close$1(n,a){$c.getInstance(n).close().then(()=>{a(null)}).catch(n=>a(n))}function rm(n,...a){let S={},C=a[a.length-1];a.length>=2&&(S=a[0]),rm$1(n,S).then(()=>{C(null)}).catch(n=>{C(n)})}function rename(n,a,S){Promise.resolve().then(()=>{try{renameSync(n,a),S(null)}catch(n){S(n)}})}function copyFile(n,a,S,C){let N=typeof S==`function`?0:S,F=typeof S==`function`?S:C;Promise.resolve().then(()=>{try{copyFileSync(n,a,N),F(null)}catch(n){F(n)}})}function access(n,a,S){let C=typeof a==`function`?void 0:a,N=typeof a==`function`?a:S;Promise.resolve().then(()=>{try{accessSync(n,C),N(null)}catch(n){N(n)}})}function appendFile(n,a,S,C){let N=typeof S==`function`?S:C,F=typeof S==`function`?void 0:S;Promise.resolve().then(()=>{try{appendFileSync(n,a,F),N(null)}catch(n){N(n)}})}function readlink(n,a,S){let C=typeof a==`function`?a:S,N=typeof a==`function`?void 0:a;Promise.resolve().then(()=>{try{C(null,readlinkSync(n,N))}catch(n){C(n,``)}})}function truncate(n,a,S){let C=typeof a==`function`?0:a,N=typeof a==`function`?a:S;Promise.resolve().then(()=>{try{truncateSync(n,C),N(null)}catch(n){N(n)}})}function chmod(n,a,S){Promise.resolve().then(()=>{try{chmodSync(n,a),S(null)}catch(n){S(n)}})}function chown(n,a,S,C){Promise.resolve().then(()=>{try{chownSync(n,a,S),C(null)}catch(n){C(n)}})}function mkdir(n,a,S){let C=typeof a==`function`?a:S,N=typeof a==`function`?void 0:a;Promise.resolve().then(()=>{try{mkdirSync(n,N),C(null)}catch(n){C(n)}})}function rmdir(n,a,S){let C=typeof a==`function`?a:S,N=typeof a==`function`?void 0:a;Promise.resolve().then(()=>{try{rmdirSync(n,N),C(null)}catch(n){C(n)}})}function readFile(n,a,S){let C=typeof a==`function`?a:S,N=typeof a==`function`?void 0:a,F=normalizePath(n);Promise.resolve().then(()=>{try{let n=typeof N==`string`?{encoding:N,flag:`r`}:{encoding:N?.encoding??null,flag:N?.flag??`r`};C(null,readFileSync(F,n))}catch(n){C(n,null)}})}function writeFile(n,a,S,C){let N=typeof S==`function`?S:C,F=normalizePath(n);Promise.resolve().then(()=>{try{writeFileSync(F,a),N(null)}catch(n){N(n)}})}function link(n,a,S){let C=normalizePath(n),N=normalizePath(a);Promise.resolve().then(()=>{try{if(!rt.spawn_command_line_sync(`ln ${C} ${N}`)[0])throw Object.assign(Error(`EPERM: operation not permitted, link '${C}' -> '${N}'`),{code:`EPERM`,errno:-1,syscall:`link`,path:C,dest:N});S(null)}catch(n){S(n)}})}function unlink(n,a){let S=normalizePath(n);Promise.resolve().then(()=>{rt.unlink(S),a(null)})}var Uc=__esmMin(()=>{nl(),Ec(),el(),Oc(),tl(),Hc(),it(),Tr(),et(),__name$1(open$1,`open`),__name$1(read$1,`read`),__name$1(close$1,`close`)});function toPathIfFileURL(n){return normalizePath(n)}function createWriteStream(n,a){return new WriteStream$1(n,a)}var Wc,Gc,WriteStream$1,Kc=__esmMin(()=>{nl(),Uc(),ni(),Wc=Symbol(`kIsPerformingIO`),Gc=Symbol(`kIoDone`),WriteStream$1=class extends Zr{static{__name$1(this,`WriteStream`)}close(n,a=null){this.fd?(close$1(this.fd,S=>{n(S||a)}),this.fd=null):n(a)}bytesWritten=0;path;pending;fd=null;flags=`w`;mode=438;pos=0;[Wc]=!1;constructor(n,a={}){super(a),this.path=toPathIfFileURL(n),a.encoding&&this.setDefaultEncoding(a.encoding)}_construct(n){open$1(this.path.toString(),this.flags,this.mode,(a,S)=>{if(a){n(a);return}this.fd=S,n(),this.emit(`open`,this.fd),this.emit(`ready`)})}_write(n,a,S){this[Wc]=!0,write(this.fd,n,0,n.length,this.pos,(n,a)=>{if(this[Wc]=!1,this.destroyed)return S(n),this.emit(Gc,n);if(n)return S(n);this.bytesWritten+=a,S()}),this.pos!==void 0&&(this.pos+=n.length)}_destroy(n,a){this[Wc]?this.once(Gc,S=>this.close(a,n||S)):this.close(a,n)}}});function resolveIOMode(n){if(n==null)return`r`;if(typeof n==`number`){let a=(n&2)!=0,S=(n&1)!=0,C=(n&1024)!=0,N=(n&512)!=0;return a?N?`w+`:`r+`:S?C?`a`:`w`:`r`}switch(n){case`ax`:case`wx`:return`w`;case`ax+`:case`wx+`:return`w+`;case`as`:case`rs+`:return`r+`;case`as+`:return`a+`;default:return n}}function shouldCreate(n){return typeof n==`number`?(n&64)!=0:typeof n==`string`?n===`w`||n===`w+`||n===`wx`||n===`wx+`||n===`a`||n===`a+`||n===`ax`||n===`ax+`||n===`as`||n===`as+`:!1}function openIOChannel(n,a,S){try{return rt.IOChannel.new_file(n,a)}catch(C){if(S&&a===`r+`&&C?.code===rt.FileError.NOENT)return rt.file_set_contents(n,new Uint8Array),rt.IOChannel.new_file(n,a);throw C}}function mapOpenError(n,a){return createGLibFileError(n,`open`,{path:a})}var qc=__esmMin(()=>{it(),Ae()});function createInterface$1(n,a,S,C){return typeof n==`object`&&n&&!(`read`in n&&typeof n.read==`function`)?new Interface$1(n):new Interface$1({input:n,output:a,completer:S,terminal:C})}function*emitKeys(n){for(;;){let a=yield,S=a,C=!1,N={sequence:``,name:void 0,ctrl:!1,meta:!1,shift:!1};if(a===`\x1B`&&(C=!0,S+=a=yield,a===`\x1B`&&(S+=a=yield)),C&&(a===`O`||a===`[`)){let n=a,C=0;if(a===`O`)S+=a=yield,a>=`0`&&a<=`9`&&(C=a.charCodeAt(0)-1,S+=a=yield),n+=a;else if(a===`[`){S+=a=yield,a===`[`&&(n+=a,S+=a=yield);let N=S.length-1;a>=`0`&&a<=`9`&&(S+=a=yield,a>=`0`&&a<=`9`&&(S+=a=yield,a>=`0`&&a<=`9`&&(S+=a=yield))),a===`;`&&(S+=a=yield,a>=`0`&&a<=`9`&&(S+=yield));let F=S.slice(N),I;(I=/^(?:(\d\d?)(?:;(\d))?([~^$])|(\d{3}~))$/.exec(F))?I[4]?n+=I[4]:(n+=I[1]+I[3],C=(parseInt(I[2]??`1`,10)||1)-1):(I=/^((\d;)?(\d))?([A-Za-z])$/.exec(F))?(n+=I[4],C=(parseInt(I[3]??`1`,10)||1)-1):n+=F}switch(N.ctrl=!!(C&4),N.meta=!!(C&10),N.shift=!!(C&1),N.code=n,n){case`[P`:case`OP`:case`[11~`:case`[[A`:N.name=`f1`;break;case`[Q`:case`OQ`:case`[12~`:case`[[B`:N.name=`f2`;break;case`[R`:case`OR`:case`[13~`:case`[[C`:N.name=`f3`;break;case`[S`:case`OS`:case`[14~`:case`[[D`:N.name=`f4`;break;case`[15~`:case`[[E`:N.name=`f5`;break;case`[17~`:N.name=`f6`;break;case`[18~`:N.name=`f7`;break;case`[19~`:N.name=`f8`;break;case`[20~`:N.name=`f9`;break;case`[21~`:N.name=`f10`;break;case`[23~`:N.name=`f11`;break;case`[24~`:N.name=`f12`;break;case`[200~`:N.name=`paste-start`;break;case`[201~`:N.name=`paste-end`;break;case`[A`:case`OA`:N.name=`up`;break;case`[B`:case`OB`:N.name=`down`;break;case`[C`:case`OC`:N.name=`right`;break;case`[D`:case`OD`:N.name=`left`;break;case`[E`:case`OE`:N.name=`clear`;break;case`[F`:case`OF`:N.name=`end`;break;case`[H`:case`OH`:N.name=`home`;break;case`[1~`:N.name=`home`;break;case`[2~`:N.name=`insert`;break;case`[3~`:N.name=`delete`;break;case`[4~`:N.name=`end`;break;case`[5~`:case`[[5~`:N.name=`pageup`;break;case`[6~`:case`[[6~`:N.name=`pagedown`;break;case`[7~`:N.name=`home`;break;case`[8~`:N.name=`end`;break;case`[a`:N.name=`up`,N.shift=!0;break;case`[b`:N.name=`down`,N.shift=!0;break;case`[c`:N.name=`right`,N.shift=!0;break;case`[d`:N.name=`left`,N.shift=!0;break;case`[2$`:N.name=`insert`,N.shift=!0;break;case`[3$`:N.name=`delete`,N.shift=!0;break;case`[5$`:N.name=`pageup`,N.shift=!0;break;case`[6$`:N.name=`pagedown`,N.shift=!0;break;case`[7$`:N.name=`home`,N.shift=!0;break;case`[8$`:N.name=`end`,N.shift=!0;break;case`Oa`:N.name=`up`,N.ctrl=!0;break;case`Ob`:N.name=`down`,N.ctrl=!0;break;case`Oc`:N.name=`right`,N.ctrl=!0;break;case`Od`:N.name=`left`,N.ctrl=!0;break;case`[2^`:N.name=`insert`,N.ctrl=!0;break;case`[3^`:N.name=`delete`,N.ctrl=!0;break;case`[5^`:N.name=`pageup`,N.ctrl=!0;break;case`[6^`:N.name=`pagedown`,N.ctrl=!0;break;case`[7^`:N.name=`home`,N.ctrl=!0;break;case`[8^`:N.name=`end`,N.ctrl=!0;break;case`[Z`:N.name=`tab`,N.shift=!0;break;default:N.name=`undefined`;break}}else a===`\r`?(N.name=`return`,N.meta=C):a===`
|
|
38
|
-
`?(N.name=`enter`,N.meta=C):a===` `?(N.name=`tab`,N.meta=C):a===`\b`||a===``?(N.name=`backspace`,N.meta=C):a===`\x1B`?(N.name=`escape`,N.meta=C):a===` `?(N.name=`space`,N.meta=C):!C&&a<=``?(N.name=String.fromCharCode(a.charCodeAt(0)+97-1),N.ctrl=!0):/^[0-9A-Za-z]$/.test(a)?(N.name=a.toLowerCase(),N.shift=/^[A-Z]$/.test(a),N.meta=C):C&&(N.name=a.length?void 0:`escape`,N.meta=!0);N.sequence=S,S.length!==0&&(N.name!==void 0||C)?n.emit(`keypress`,C?void 0:S,N):S.length===1&&n.emit(`keypress`,S,N)}}function emitKeypressEvents(n,a={}){let S=n;if(S[Xc])return;S[Xc]=new It(`utf8`),S[Zc]=emitKeys(n),S[Zc].next();let C=a.escapeCodeTimeout??500,N,triggerEscape=()=>S[Zc].next(``);function onData(a){if(n.listenerCount(`keypress`)>0){let F=S[Xc].write(typeof a==`string`?Buffer.from(a):a);if(F){clearTimeout(N);for(let a of F)try{S[Zc].next(a),a===`\x1B`&&(N=setTimeout(triggerEscape,C))}catch{S[Zc]=emitKeys(n),S[Zc].next()}}}else n.removeListener(`data`,onData),delete S[Xc],delete S[Zc]}n.on(`data`,onData)}var Jc,Interface$1,Yc,Xc,Zc,Qc=__esmMin(()=>{Ft(),Lt(),Jc=/\r\n|\r|\n/,Interface$1=class extends wt{static{__name$1(this,`Interface`)}terminal;line=``;cursor=0;escapeCodeTimeout;_input;_output;get input(){return this._input}get output(){return this._output}_prompt;_closed=!1;_paused=!1;history;_historySize;_crlfDelay;_lineBuffer=``;_questionCallback=null;_boundOnData=null;_boundOnEnd=null;_boundOnError=null;_boundOnKeypress=null;constructor(n,a){super();let S;if(S=n&&typeof n==`object`&&!(`read`in n&&typeof n.read==`function`)?n:{input:n,output:a},this._input=S.input||null,this._output=S.output||null,this._prompt=S.prompt||`> `,this.terminal=S.terminal??this._output!==null,this._historySize=S.historySize??30,this.history=[],this._crlfDelay=S.crlfDelay??100,this.escapeCodeTimeout=S.escapeCodeTimeout,this._input&&(this._boundOnData=n=>this._onData(n),this._boundOnEnd=()=>this._onEnd(),this._boundOnError=n=>this.emit(`error`,n),this._input.on(`data`,this._boundOnData),this._input.on(`end`,this._boundOnEnd),this._input.on(`error`,this._boundOnError),`setEncoding`in this._input&&typeof this._input.setEncoding==`function`&&this._input.setEncoding(`utf8`),this.terminal)){emitKeypressEvents(this._input,this);let n=this._input;typeof n.setRawMode==`function`&&(n.isRaw||n.setRawMode(!0)),typeof this._input.resume==`function`&&this._input.resume(),this._boundOnKeypress=(n,a)=>{a&&(a.name===`backspace`||a.name===`delete`?this.cursor>0&&(this.line=this.line.slice(0,this.cursor-1)+this.line.slice(this.cursor),this.cursor--):n&&n.length===1&&!a.ctrl&&!a.meta&&a.name!==`return`&&a.name!==`enter`&&a.name!==`escape`&&(this.line=this.line.slice(0,this.cursor)+n+this.line.slice(this.cursor),this.cursor++))},this._input.on(`keypress`,this._boundOnKeypress)}}_onData(n){if(this._closed||this._paused)return;let a=typeof n==`string`?n:n.toString(`utf8`);this._lineBuffer+=a;let S;for(;(S=Jc.exec(this._lineBuffer))!==null;){let n=this._lineBuffer.substring(0,S.index);this._lineBuffer=this._lineBuffer.substring(S.index+S[0].length),this._onLine(n)}}_onLine(n){if(n.length>0&&this._historySize>0&&(this.history.length===0||this.history[0]!==n)&&(this.history.unshift(n),this.history.length>this._historySize&&this.history.pop()),this._questionCallback){let a=this._questionCallback;this._questionCallback=null,a(n)}this.emit(`line`,n)}_onEnd(){this._lineBuffer.length>0&&(this._onLine(this._lineBuffer),this._lineBuffer=``),this.close()}setPrompt(n){this._prompt=n}getPrompt(){return this._prompt}prompt(n){if(this._closed)throw Error(`readline was closed`);this._output?.write(this._prompt)}question(n,a,S){if(this._closed)throw Error(`readline was closed`);let C=typeof a==`function`?a:S;this._questionCallback=C,this._output?.write(n)}clearLine(n,a){return this.line=``,this.cursor=0,a&&a(),!0}write(n,a){if(!this._closed){if(a){this._input&&this._input.emit(`keypress`,n??``,a);return}if(n!=null){let a=typeof n==`string`?n:n.toString(`utf8`);a&&(this.line=this.line.slice(0,this.cursor)+a+this.line.slice(this.cursor),this.cursor+=a.length),this._output?.write(n)}}}close(){if(!this._closed){if(this._closed=!0,this._input){this._boundOnData&&this._input.removeListener(`data`,this._boundOnData),this._boundOnEnd&&this._input.removeListener(`end`,this._boundOnEnd),this._boundOnError&&this._input.removeListener(`error`,this._boundOnError),this._boundOnKeypress&&this._input.removeListener(`keypress`,this._boundOnKeypress),this._boundOnData=null,this._boundOnEnd=null,this._boundOnError=null,this._boundOnKeypress=null;let n=this._input;this.terminal&&n.isRaw&&typeof n.setRawMode==`function`&&n.setRawMode(!1),typeof this._input.pause==`function`&&this._input.pause()}this.emit(`close`)}}pause(){return this._closed?this:(this._paused=!0,this._input&&`pause`in this._input&&typeof this._input.pause==`function`&&this._input.pause(),this.emit(`pause`),this)}resume(){return this._closed?this:(this._paused=!1,this._input&&`resume`in this._input&&typeof this._input.resume==`function`&&this._input.resume(),this.emit(`resume`),this)}getCursorPos(){let n=this._output?.columns??80,a=this._prompt.length+this.cursor;return{rows:Math.floor(a/n),cols:a%n}}[Symbol.asyncIterator](){let n=[],a=null,S=!1,onLine=S=>{if(a){let n=a;a=null,n({value:S,done:!1})}else n.push(S)},onClose=()=>{if(S=!0,a){let n=a;a=null,n({value:void 0,done:!0})}};return this.on(`line`,onLine),this.on(`close`,onClose),{next:()=>n.length>0?Promise.resolve({value:n.shift(),done:!1}):S?Promise.resolve({value:void 0,done:!0}):new Promise(n=>{a=n}),return:()=>(S=!0,this.removeListener(`line`,onLine),this.removeListener(`close`,onClose),Promise.resolve({value:void 0,done:!0})),[Symbol.asyncIterator](){return this}}}},Yc=Symbol.dispose??Symbol.for(`Symbol.dispose`),Interface$1.prototype[Yc]=function(){this.close()},__name$1(createInterface$1,`createInterface`),Xc=Symbol(`keypress-decoder`),Zc=Symbol(`escape-decoder`)}),$c,el=__esmMin(()=>{Cc(),nl(),Dc(),Kc(),Ec(),qc(),tl(),it(),Tr(),et(),Qc(),$c=class FileHandle{options;_file;_ioStream=null;_readStream=null;_gFile;_ioMode;_readPos=0;_ioLock=Promise.resolve();static instances={};constructor(n){this.options=n,this.options.flags||=`r`,this.options.mode||=438;let a=normalizePath(n.path),S=shouldCreate(n.flags),C=resolveIOMode(n.flags);try{this._file=openIOChannel(a,C,S)}catch(n){throw mapOpenError(n,a)}return this._file.set_encoding(null),this.fd=this._file.unix_get_fd(),this._gFile=wr.File.new_for_path(a),this._ioMode=C,FileHandle.instances[this.fd]=this,FileHandle.getInstance(this.fd)}_getReadStream(){return this._ioStream?{input:this._ioStream.get_input_stream(),seekable:this._ioStream}:this._ioMode===`r`?(this._readStream||=this._gFile.read(null),{input:this._readStream,seekable:this._readStream}):(this._ioStream=this._gFile.open_readwrite(null),{input:this._ioStream.get_input_stream(),seekable:this._ioStream})}_getWriteStream(){if(this._ioStream)return this._ioStream;if(this._ioMode===`r`)throw Error(`FileHandle opened read-only; cannot write`);return this._ioStream=this._gFile.open_readwrite(null),this._ioStream}_serialize(n){let a=this._ioLock.catch(()=>{}).then(n);return this._ioLock=a,a}fd;static getInstance(n){if(!FileHandle.instances[n])throw Error(`No instance found for fd!`);return FileHandle.instances[n]}async appendFile(n,a){let S=getEncodingFromOptions(a);typeof n==`string`&&(n=Ge.from(n)),S&&this._file.set_encoding(S);let[C,N]=this._file.write_chars(n,n.length);if(C===rt.IOStatus.ERROR)throw Error(`Error on append to file!`)}async chown(n,a){chownSync(normalizePath(this.options.path),n,a)}async chmod(n){chmodSync(normalizePath(this.options.path),n)}createReadStream(n){return new ReadStream$1(this.options.path,n)}createWriteStream(n){return new WriteStream$1(this.options.path,n)}async datasync(){this._file.flush()}async sync(){this._file.flush()}async read(...n){let a,S,C,N;if(typeof n[0]==`object`&&!(n[0]instanceof Uint8Array)&&!(n[0]instanceof Ge)){let F=n[0];a=F.buffer,S=F.offset,C=F.length,N=F.position}else a=n[0],S=n[1],C=n[2],N=n[3];let F=a,I=S??0,H=C??F?.byteLength??65536,W=N??0;return this._serialize(async()=>{let{input:n,seekable:S}=this._getReadStream();S.seek(BigInt(W),rt.SeekType.SET,null);let C=n.read_bytes(H,null).get_data(),N=C?.length??0;return F&&C&&N>0&&F.set(C,I),{bytesRead:N,buffer:a}})}readableWebStream(){let n=globalThis.ReadableStream;if(typeof n!=`function`)throw Error(`readableWebStream() requires a global ReadableStream. Import "node:stream/web" or "@gjsify/streams" before calling this method.`);return new n}async readFile(n){let a=getEncodingFromOptions(n,`buffer`);a&&this._file.set_encoding(a);let[S,C]=this._file.read_to_end();if(S===rt.IOStatus.ERROR)throw Error(`Error on read from file!`);return encodeUint8Array(a,C)}readLines(n){return createInterface$1({input:this.createReadStream(n),crlfDelay:1/0})}async stat(n){let a=await new Promise((n,a)=>{this._gFile.query_info_async(Tc,wr.FileQueryInfoFlags.NONE,rt.PRIORITY_DEFAULT,null,(S,C)=>{try{n(this._gFile.query_info_finish(C))}catch(n){a(n)}})}),S=normalizePath(this.options.path);return n?.bigint?new BigIntStats(a,S):new Stats(a,S)}async truncate(n=0){let a=Math.max(0,n);this._file.flush(),this._getWriteStream().get_output_stream().truncate(a,null)}async utimes(n,a){let{utimesSync:S}=await Promise.resolve().then(()=>(Lc(),Ic));S(normalizePath(this.options.path),n,a)}async writeFile(n,a){let S=getEncodingFromOptions(a),C;C=typeof n==`string`?Ge.from(n,S||`utf8`):n,this._file.seek_position(0,rt.SeekType.SET);let[N]=this._file.write_chars(C,C.length);if(N===rt.IOStatus.ERROR)throw Error(`Error writing to file!`);this._file.flush()}async write(n,...a){let S=null,C=null,N=null,F=null;typeof n==`string`?(S=a[0],C=a[1]):(N=a[0],F=a[1],S=a[2]),C=getEncodingFromOptions(C,typeof n==`string`?`utf8`:null);let I;I=typeof n==`string`?new TextEncoder().encode(n):n;let H=N??0,W=F??I.byteLength-H,K=I.slice(H,H+W),q=S??0;return{bytesWritten:await this._serialize(async()=>{let n=this._getWriteStream();n.seek(BigInt(q),rt.SeekType.SET,null);let a=n.get_output_stream(),S=await new Promise((n,S)=>{a.write_bytes_async(new rt.Bytes(K),rt.PRIORITY_DEFAULT,null,(C,N)=>{try{n(a.write_bytes_finish(N))}catch(n){S(n)}})});return await new Promise((n,S)=>{a.flush_async(rt.PRIORITY_DEFAULT,null,(C,N)=>{try{a.flush_finish(N),n()}catch(n){S(n)}})}),S}),buffer:n}}async writev(n,a){let S=0;for(let C of n){let n=Ge.from(C.buffer,C.byteOffset,C.byteLength),N=await this.write(n,0,n.byteLength,a==null?null:a+S);S+=N.bytesWritten}return{bytesWritten:S,buffers:n}}async readv(n,a){let S=0;for(let C of n){let n=await this.read({buffer:Ge.from(C.buffer,C.byteOffset,C.byteLength),position:a==null?null:a+S});if(S+=n.bytesRead,n.bytesRead<C.byteLength)break}return{bytesRead:S,buffers:n}}_flushSync(){this._file.flush()}_closeSync(){try{this._ioStream?.close(null)}catch{}try{this._readStream?.close(null)}catch{}this._ioStream=null,this._readStream=null;try{this._file.shutdown(!0)}catch{}let n=FileHandle;delete n.instances[this.fd]}_readSync(n,a,S,C){let N=this._gFile.read(null);try{let F=C!==null&&C>=0,I=F?C:this._readPos;I>0&&N.seek(I,rt.SeekType.SET,null);let H=N.read_bytes(S,null).get_data()??new Uint8Array;return new Uint8Array(n.buffer,n.byteOffset+a).set(H.subarray(0,H.length)),F||(this._readPos+=H.length),H.length}finally{N.close(null)}}_writeSync(n,a){let S=this._gFile.open_readwrite(null);try{return a!==null&&a>=0&&S.seek(a,rt.SeekType.SET,null),S.get_output_stream().write_bytes(rt.Bytes.new(n),null)}finally{S.close(null)}}async close(){try{this._ioStream?.close(null)}catch{}try{this._readStream?.close(null)}catch{}this._ioStream=null,this._readStream=null;try{this._file.shutdown(!0)}catch{}}async[Symbol.asyncDispose](){await this.close()}pull(...n){throw Error('FileHandle.pull() is not implemented in @gjsify/fs yet — requires `node:stream/iter` (Node 25.9+) which @gjsify/stream has not ported. Track gjsify Open TODO "Node 25 stream/iter integration".')}writer(n){throw Error('FileHandle.writer() is not implemented in @gjsify/fs yet — requires `node:stream/iter` (Node 25.9+) which @gjsify/stream has not ported. Track gjsify Open TODO "Node 25 stream/iter integration".')}}});function statSync(n,a){let S=normalizePath(n);try{let n=wr.File.new_for_path(S).query_info(Tc,wr.FileQueryInfoFlags.NONE,null);return a?.bigint?new BigIntStats(n,S):new Stats(n,S)}catch(n){if(a?.throwIfNoEntry===!1&&isNotFoundError(n))return;throw createNodeError(n,`stat`,S)}}function lstatSync(n,a){let S=normalizePath(n);try{let n=wr.File.new_for_path(S).query_info(Tc,wr.FileQueryInfoFlags.NOFOLLOW_SYMLINKS,null);return a?.bigint?new BigIntStats(n,S):new Stats(n,S)}catch(n){if(a?.throwIfNoEntry===!1&&isNotFoundError(n))return;throw createNodeError(n,`lstat`,S)}}function readdirSync(n,a){let S=normalizePath(n),C=wr.File.new_for_path(S).enumerate_children(`standard::name,standard::type`,wr.FileQueryInfoFlags.NOFOLLOW_SYMLINKS,null),N=[];try{let n=C.next_file(null);for(;n!==null;)N.push({name:n.get_name(),type:n.get_file_type()}),n=C.next_file(null)}finally{try{C.close(null)}catch{}}let F=[];for(let n of N){let C=ms(S,n.name);if(a?.withFileTypes?F.push(new Dirent(C,n.name,n.type)):F.push(n.name),a?.recursive&&n.type===wr.FileType.DIRECTORY){let S=readdirSync(C,a);for(let a of S)typeof a==`string`?F.push(ms(n.name,a)):F.push(a)}}return F}function realpathSync(n){let a=normalizePath(n),S=wr.File.new_for_path(a),C=0;for(;;){let n=S.query_info(`standard::is-symlink,standard::symlink-target`,wr.FileQueryInfoFlags.NOFOLLOW_SYMLINKS,null);if(!n.get_is_symlink())return S.get_path();let N=n.get_symlink_target(),F=S.get_parent();if(S=F?F.resolve_relative_path(N):wr.File.new_for_path(N),++C>40)throw Error(`ELOOP: too many levels of symbolic links, realpath '${a}'`)}}function symlinkSync(n,a,S){let C=normalizePath(a),N=normalizePath(n);wr.File.new_for_path(C).make_symbolic_link(N,null)}function readFileSync(n,a={encoding:null,flag:`r`}){let S=normalizePath(n),C=wr.File.new_for_path(S);try{let[n,N]=C.load_contents(null);if(!n)throw createNodeError(Error(`failed to read file`),`read`,S);return encodeUint8Array(getEncodingFromOptions(a,`buffer`),N)}catch(n){throw n.code&&typeof n.code==`string`?n:createNodeError(n,`read`,S)}}function mkdirSync(n,a){let S=!1,C=511;if(typeof a==`object`?(a?.recursive&&(S=a.recursive),a?.mode&&(C=a.mode)):C=a||511,n=normalizePath(n),typeof C==`string`)throw TypeError(`mode as string is currently not supported!`);if(S)return mkdirSyncRecursive(n);let N=wr.File.new_for_path(n);try{N.make_directory(null)}catch(a){throw createNodeError(a,`mkdir`,n)}}function mkdirSyncRecursive(n){let a=wr.File.new_for_path(n);try{return a.make_directory(null),n}catch(a){let S=a;if(S.code===wr.IOErrorEnum.EXISTS)return;if(S.code===wr.IOErrorEnum.NOT_FOUND){let S=ms(n,`..`),C=wr.File.new_for_path(S).get_path();if(C===n)throw createNodeError(a,`mkdir`,n);let N=mkdirSyncRecursive(C),F=wr.File.new_for_path(n);try{F.make_directory(null)}catch(a){throw createNodeError(a,`mkdir`,n)}return N??n}throw createNodeError(a,`mkdir`,n)}}function rmdirSync(n,a){let S=normalizePath(n),C=wr.File.new_for_path(S);try{if(C.query_info(`standard::type`,wr.FileQueryInfoFlags.NONE,null).get_file_type()!==wr.FileType.DIRECTORY)throw createNodeError(Object.assign(Error(),{code:4}),`rmdir`,S);if(C.enumerate_children(`standard::name`,wr.FileQueryInfoFlags.NONE,null).next_file(null)!==null)throw createNodeError(Object.assign(Error(),{code:5}),`rmdir`,S);C.delete(null)}catch(n){throw n.code&&typeof n.code==`string`?n:createNodeError(n,`rmdir`,S)}}function unlinkSync(n){let a=normalizePath(n),S=wr.File.new_for_path(a);try{S.delete(null)}catch(n){throw createNodeError(n,`unlink`,a)}}function writeFileSync(n,a){rt.file_set_contents(normalizePath(n),a)}function renameSync(n,a){let S=normalizePath(n),C=normalizePath(a),N=wr.File.new_for_path(S),F=wr.File.new_for_path(C);try{N.move(F,wr.FileCopyFlags.OVERWRITE,null,null)}catch(n){throw createNodeError(n,`rename`,S,C)}}function copyFileSync(n,a,S){let C=normalizePath(n),N=normalizePath(a),F=wr.File.new_for_path(C),I=wr.File.new_for_path(N),H=wr.FileCopyFlags.NONE;S&&!(S&1)?H=wr.FileCopyFlags.OVERWRITE:S||(H=wr.FileCopyFlags.OVERWRITE);try{F.copy(I,H,null,null)}catch(n){throw createNodeError(n,`copyfile`,C,N)}}function accessSync(n,a){let S=normalizePath(n),C=wr.File.new_for_path(S);try{let n=C.query_info(`access::*`,wr.FileQueryInfoFlags.NONE,null);if(a!==void 0&&a!==0){let C={code:14,message:`permission denied, access '${S}'`};if(a&4&&!n.get_attribute_boolean(`access::can-read`)||a&2&&!n.get_attribute_boolean(`access::can-write`)||a&1&&!n.get_attribute_boolean(`access::can-execute`))throw createNodeError(C,`access`,S)}}catch(n){throw n.code&&typeof n.code==`string`?n:createNodeError(n,`access`,S)}}function appendFileSync(n,a,S){let C=normalizePath(n),N=wr.File.new_for_path(C),F;F=typeof a==`string`?new TextEncoder().encode(a):a;try{let n=N.append_to(wr.FileCreateFlags.NONE,null);F.length>0&&n.write_bytes(new rt.Bytes(F),null),n.close(null)}catch(n){throw createNodeError(n,`appendfile`,C)}}function readlinkSync(n,a){let S=normalizePath(n),C=wr.File.new_for_path(S);try{let n=C.query_info(`standard::symlink-target`,wr.FileQueryInfoFlags.NOFOLLOW_SYMLINKS,null).get_symlink_target();if(!n)throw Object.assign(Error(`EINVAL: invalid argument, readlink '${S}'`),{code:`EINVAL`,errno:-22,syscall:`readlink`,path:S});return(typeof a==`string`?a:a?.encoding)===`buffer`?Ge.from(n):n}catch(n){throw typeof n.code==`string`?n:createNodeError(n,`readlink`,S)}}function linkSync(n,a){let S=normalizePath(n),C=normalizePath(a);if(!rt.spawn_command_line_sync(`ln ${S} ${C}`)[0])throw Object.assign(Error(`EPERM: operation not permitted, link '${S}' -> '${C}'`),{code:`EPERM`,errno:-1,syscall:`link`,path:S,dest:C})}function truncateSync(n,a){let S=normalizePath(n),C=wr.File.new_for_path(S);try{let n=C.replace(null,!1,wr.FileCreateFlags.NONE,null);if(a&&a>0){let[,S]=C.load_contents(null),N=S.slice(0,a);N.length>0&&n.write_bytes(new rt.Bytes(N),null)}n.close(null)}catch(n){throw createNodeError(n,`truncate`,S)}}function chmodSync(n,a){let S=normalizePath(n),C=typeof a==`string`?parseInt(a,8):a;if(!rt.spawn_command_line_sync(`chmod ${C.toString(8)} ${S}`)[0])throw Object.assign(Error(`EPERM: operation not permitted, chmod '${S}'`),{code:`EPERM`,errno:-1,syscall:`chmod`,path:S})}function chownSync(n,a,S){let C=normalizePath(n);if(!rt.spawn_command_line_sync(`chown ${a}:${S} ${C}`)[0])throw Object.assign(Error(`EPERM: operation not permitted, chown '${C}'`),{code:`EPERM`,errno:-1,syscall:`chown`,path:C})}function watch(n,a,S){return new FSWatcher(normalizePath(n),a,S)}function openSync(n,a,S){return new $c({path:n,flags:a,mode:S})}function mkdtempSync(n,a){let S=getEncodingFromOptions(a),C=tempDirPath(n);return mkdirSync(C,{recursive:!1,mode:511}),decode(C,S)}function rmSync(n,a){let S=normalizePath(n),C=wr.File.new_for_path(S),N=a?.recursive||!1,F=a?.force||!1,I;try{I=C.query_file_type(wr.FileQueryInfoFlags.NOFOLLOW_SYMLINKS,null)}catch(a){if(F&&isNotFoundError(a))return;throw createNodeError(a,`rm`,n)}if(I===wr.FileType.SYMBOLIC_LINK){try{C.delete(null)}catch(a){if(F&&isNotFoundError(a))return;throw createNodeError(a,`rm`,n)}return}if(I===wr.FileType.DIRECTORY){let C=readdirSync(n);if(!N&&C.length)throw createNodeError(Object.assign(Error(),{code:5}),`rm`,n);for(let n of C)rmSync(ms(S,n),a)}try{C.delete(null)}catch(a){if(F&&isNotFoundError(a))return;throw createNodeError(a,`rm`,n)}}var tl=__esmMin(()=>{Cc(),nl(),il(),wc(),Ec(),el(),Oc(),it(),Tr(),Ts(),et(),ia(),realpathSync.native=realpathSync});function normalizePath(n){return n instanceof URL||n instanceof en?fileURLToPath(n):typeof n==`string`?n:n.toString()}function randomName(){return[...[,,,,,,]].map(()=>`0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ`[Math.floor(Math.random()*62)]).join(``)}function tempDirPath(n){let a;do a=n+randomName();while(existsSync(a));return a}var nl=__esmMin(()=>{tl(),nn()});function changed(n,a,S,C){switch(C){case wr.FileMonitorEvent.CHANGES_DONE_HINT:this.emit(`change`,`change`,a.get_basename());break;case wr.FileMonitorEvent.DELETED:case wr.FileMonitorEvent.CREATED:case wr.FileMonitorEvent.RENAMED:case wr.FileMonitorEvent.MOVED_IN:case wr.FileMonitorEvent.MOVED_OUT:this.emit(`change`,`rename`,a.get_basename());break}}function gioEventToNodeType(n){switch(n){case wr.FileMonitorEvent.CHANGES_DONE_HINT:return`change`;case wr.FileMonitorEvent.DELETED:case wr.FileMonitorEvent.CREATED:case wr.FileMonitorEvent.RENAMED:case wr.FileMonitorEvent.MOVED_IN:case wr.FileMonitorEvent.MOVED_OUT:return`rename`;default:return null}}async function*watchAsync(n,a){let S=a?.signal;if(S?.aborted)return;let C=normalizePath(n),N=wr.File.new_for_path(C),F=wr.Cancellable.new(),I;try{I=N.monitor(wr.FileMonitorFlags.NONE,F)}catch{return}let H=[],W=[],K=!1;function enqueue(n){K||(W.length>0?W.shift().resolve({value:n,done:!1}):H.push(n))}function terminate(){if(!K)for(K=!0,F.is_cancelled()||F.cancel();W.length>0;)W.shift().resolve({value:void 0,done:!0})}let q=I.connect(`changed`,(n,a,S,C)=>{let N=gioEventToNodeType(C);N!==null&&enqueue({eventType:N,filename:a?.get_basename()??null})}),abortHandler=()=>terminate();S?.addEventListener(`abort`,abortHandler);try{for(;!K;){if(H.length>0){yield H.shift();continue}let n=await new Promise(n=>{W.push({resolve:n})});if(n.done)break;yield n.value}}finally{S?.removeEventListener(`abort`,abortHandler),I.disconnect(q),F.is_cancelled()||F.cancel()}}var rl,FSWatcher,il=__esmMin(()=>{nl(),it(),Tr(),Ft(),rl=new WeakMap,FSWatcher=class extends wt{constructor(n,a,S){super(),(!a||typeof a!=`object`)&&(a={persistent:!0});let C=a.persistent!==!1,N=wr.Cancellable.new(),F=normalizePath(n),I=wr.File.new_for_path(F).monitor(wr.FileMonitorFlags.NONE,N);I.connect(`changed`,changed.bind(this));let H=null;C&&(H=rt.timeout_add(rt.PRIORITY_LOW,2147483647,()=>rt.SOURCE_CONTINUE)),rl.set(this,{persistent:C,cancellable:N,sourceId:H,watcher:I}),S&&this.on(`change`,S)}close(){let n=rl.get(this);n.cancellable.is_cancelled()||(n.cancellable.cancel(),n.sourceId!==null&&(rt.source_remove(n.sourceId),n.sourceId=null))}ref(){let n=rl.get(this);return!n.persistent&&!n.cancellable.is_cancelled()&&(n.persistent=!0,n.sourceId=rt.timeout_add(rt.PRIORITY_LOW,2147483647,()=>rt.SOURCE_CONTINUE)),this}unref(){let n=rl.get(this);return n.persistent&&(n.persistent=!1,n.sourceId!==null&&(rt.source_remove(n.sourceId),n.sourceId=null)),this}}});function zeroedStat(){return{dev:0,ino:0,mode:0,nlink:0,uid:0,gid:0,rdev:0,size:0,blksize:0,blocks:0,atimeMs:0,mtimeMs:0,ctimeMs:0,birthtimeMs:0,atime:new Date(0),mtime:new Date(0),ctime:new Date(0),birthtime:new Date(0),isFile:()=>!1,isDirectory:()=>!1,isBlockDevice:()=>!1,isCharacterDevice:()=>!1,isSymbolicLink:()=>!1,isFIFO:()=>!1,isSocket:()=>!1}}function watchFile(n,a,S){typeof a==`function`&&(S=a,a={});let C=a.interval??5007,N=n.toString(),F=al.get(N);return F||(F=new StatWatcher(N,C),F.start(),al.set(N,F)),S&&F.addChangeListener(S),F}function unwatchFile(n,a){let S=n.toString(),C=al.get(S);C&&(a?C.removeChangeListener(a):C.removeAllChangeListeners(),C.changeListenerCount===0&&(C.stop(),al.delete(S)))}var StatWatcher,al,ol=__esmMin(()=>{tl(),Ft(),StatWatcher=class extends wt{_path;_interval;_timerId=null;_prev;_changeCount=0;constructor(n,a){super(),this._path=n,this._interval=a,this._prev=zeroedStat()}start(){try{this._prev=statSync(this._path)}catch{}this._timerId=setInterval(()=>{let n;try{n=statSync(this._path)}catch{n=zeroedStat()}let a=this._prev;(n.mtimeMs!==a.mtimeMs||n.size!==a.size||n.ino!==a.ino)&&(this._prev=n,this.emit(`change`,n,a))},this._interval)}stop(){this._timerId!==null&&(clearInterval(this._timerId),this._timerId=null),this.emit(`stop`)}addChangeListener(n){this._changeCount++,this.on(`change`,n)}removeChangeListener(n){this._changeCount--,this.removeListener(`change`,n)}removeAllChangeListeners(){this._changeCount=0,this.removeAllListeners(`change`)}get changeListenerCount(){return this._changeCount}},al=new Map}),sl=__exportAll$4({BigIntStats:()=>BigIntStats,Dir:()=>Dir,Dirent:()=>Dirent,FSWatcher:()=>FSWatcher,ReadStream:()=>ReadStream$1,StatWatcher:()=>StatWatcher,Stats:()=>Stats,WriteStream:()=>WriteStream$1,access:()=>access,accessSync:()=>accessSync,appendFile:()=>appendFile,appendFileSync:()=>appendFileSync,chmod:()=>chmod,chmodSync:()=>chmodSync,chown:()=>chown,chownSync:()=>chownSync,close:()=>close$1,closeSync:()=>closeSync,constants:()=>cl,copyFile:()=>copyFile,copyFileSync:()=>copyFileSync,cp:()=>cp,cpSync:()=>cpSync,createReadStream:()=>createReadStream,createWriteStream:()=>createWriteStream,default:()=>ll,exists:()=>exists,existsSync:()=>existsSync,fchmod:()=>fchmod,fchmodSync:()=>fchmodSync,fchown:()=>fchown,fchownSync:()=>fchownSync,fdatasync:()=>fdatasync,fdatasyncSync:()=>fdatasyncSync,fstat:()=>fstat,fstatSync:()=>fstatSync,fsync:()=>fsync,fsyncSync:()=>fsyncSync,ftruncate:()=>ftruncate,ftruncateSync:()=>ftruncateSync,futimes:()=>futimes,futimesSync:()=>futimesSync,glob:()=>glob,globSync:()=>globSync,lchmod:()=>lchmod,lchmodSync:()=>lchmodSync,lchown:()=>lchown,lchownSync:()=>lchownSync,link:()=>link,linkSync:()=>linkSync,lstat:()=>lstat,lstatSync:()=>lstatSync,lutimes:()=>lutimes,lutimesSync:()=>lutimesSync,mkdir:()=>mkdir,mkdirSync:()=>mkdirSync,mkdtempSync:()=>mkdtempSync,open:()=>open$1,openAsBlob:()=>openAsBlob,openSync:()=>openSync,opendir:()=>opendir,opendirSync:()=>opendirSync,promises:()=>Bc,read:()=>read$1,readFile:()=>readFile,readFileSync:()=>readFileSync,readSync:()=>readSync,readdir:()=>readdir,readdirSync:()=>readdirSync,readlink:()=>readlink,readlinkSync:()=>readlinkSync,readv:()=>readv,readvSync:()=>readvSync,realpath:()=>realpath,realpathSync:()=>realpathSync,rename:()=>rename,renameSync:()=>renameSync,rm:()=>rm,rmSync:()=>rmSync,rmdir:()=>rmdir,rmdirSync:()=>rmdirSync,stat:()=>stat,statSync:()=>statSync,statfs:()=>statfs,statfsSync:()=>statfsSync,symlink:()=>symlink,symlinkSync:()=>symlinkSync,truncate:()=>truncate,truncateSync:()=>truncateSync,unlink:()=>unlink,unlinkSync:()=>unlinkSync,unwatchFile:()=>unwatchFile,utimes:()=>utimes,utimesSync:()=>utimesSync,watch:()=>watch,watchFile:()=>watchFile,write:()=>write,writeFile:()=>writeFile,writeFileSync:()=>writeFileSync,writeSync:()=>writeSync,writev:()=>writev,writevSync:()=>writevSync}),cl,ll,ul=__esmMin(()=>{il(),Dc(),Kc(),wc(),Ec(),tl(),kc(),jc(),Mc(),Fc(),Lc(),Rc(),Hc(),Uc(),ol(),cl={F_OK:0,R_OK:4,W_OK:2,X_OK:1,COPYFILE_EXCL:1,COPYFILE_FICLONE:2,COPYFILE_FICLONE_FORCE:4,O_RDONLY:0,O_WRONLY:1,O_RDWR:2,O_CREAT:64,O_EXCL:128,O_TRUNC:512,O_APPEND:1024,O_SYNC:1052672,O_NONBLOCK:2048,O_DIRECTORY:65536,O_NOFOLLOW:131072,S_IFMT:61440,S_IFREG:32768,S_IFDIR:16384,S_IFCHR:8192,S_IFBLK:24576,S_IFIFO:4096,S_IFLNK:40960,S_IFSOCK:49152,S_IRWXU:448,S_IRUSR:256,S_IWUSR:128,S_IXUSR:64,S_IRWXG:56,S_IRGRP:32,S_IWGRP:16,S_IXGRP:8,S_IRWXO:7,S_IROTH:4,S_IWOTH:2,S_IXOTH:1},ll={FSWatcher,StatWatcher,Stats,BigIntStats,Dirent,Dir,constants:cl,existsSync,readdirSync,readFileSync,writeFileSync,mkdirSync,rmdirSync,unlinkSync,mkdtempSync,rmSync,statSync,openSync,realpathSync,symlinkSync,lstatSync,renameSync,copyFileSync,accessSync,appendFileSync,readlinkSync,linkSync,truncateSync,chmodSync,chownSync,cpSync,opendirSync,globSync,glob,watch,watchFile,unwatchFile,statfsSync,statfs,utimesSync,utimes,lutimesSync,lutimes,lchownSync,lchown,lchmodSync,lchmod,fstatSync,fstat,ftruncateSync,ftruncate,fdatasyncSync,fdatasync,fsyncSync,fsync,fchmodSync,fchmod,fchownSync,fchown,futimesSync,futimes,closeSync,readSync,writeSync,readvSync,readv,writevSync,writev,exists,openAsBlob,createReadStream,ReadStream:ReadStream$1,createWriteStream,WriteStream:WriteStream$1,promises:Bc,open:open$1,close:close$1,read:read$1,write,rm,realpath,readdir,symlink,lstat,stat,rename,copyFile,cp,access,appendFile,readlink,truncate,chmod,chown,mkdir,rmdir,readFile,writeFile,unlink,link,opendir}}),dl,fl,pl,ml,hl,gl,_l=__esmMin(()=>{
|
|
37
|
+
function combineAliases(n){let a=[],S=Object.create(null),C=!0;for(Object.keys(n).forEach(function(S){a.push([].concat(n[S],S))});C;){C=!1;for(let n=0;n<a.length;n++)for(let S=n+1;S<a.length;S++)if(a[n].filter(function(n){return a[S].indexOf(n)!==-1}).length){a[n]=a[n].concat(a[S]),a.splice(S,1),C=!0;break}}return a.forEach(function(n){n=n.filter(function(n,a,S){return S.indexOf(n)===a});let a=n.pop();a!==void 0&&typeof a==`string`&&(S[a]=n)}),S}function increment$1(n){return n===void 0?1:n+1}function sanitizeKey(n){return n===`__proto__`?`___proto___`:n}function stripQuotes$1(n){return typeof n==`string`&&(n[0]===`'`||n[0]===`"`)&&n[n.length-1]===n[0]?n.substring(1,n.length-1):n}var vc,YargsParser,yc=__esmMin(()=>{hc(),_c(),mc(),YargsParser=class{constructor(n){vc=n}parse(n,a){let S=Object.assign({alias:void 0,array:void 0,boolean:void 0,config:void 0,configObjects:void 0,configuration:void 0,coerce:void 0,count:void 0,default:void 0,envPrefix:void 0,narg:void 0,normalize:void 0,string:void 0,number:void 0,__:void 0,key:void 0},a),C=tokenizeArgString(n),N=typeof n==`string`,F=combineAliases(Object.assign(Object.create(null),S.alias)),I=Object.assign({"boolean-negation":!0,"camel-case-expansion":!0,"combine-arrays":!1,"dot-notation":!0,"duplicate-arguments-array":!0,"flatten-duplicate-arrays":!0,"greedy-arrays":!0,"halt-at-non-option":!1,"nargs-eats-options":!1,"negation-prefix":`no-`,"parse-numbers":!0,"parse-positional-numbers":!0,"populate--":!1,"set-placeholder-key":!1,"short-option-groups":!0,"strip-aliased":!1,"strip-dashed":!1,"unknown-options-as-args":!1},S.configuration),H=Object.assign(Object.create(null),S.default),W=S.configObjects||[],K=S.envPrefix,q=I[`populate--`],Y=q?`--`:`_`,X=Object.create(null),te=Object.create(null),ne=S.__||vc.format,re={aliases:Object.create(null),arrays:Object.create(null),bools:Object.create(null),strings:Object.create(null),numbers:Object.create(null),counts:Object.create(null),normalize:Object.create(null),configs:Object.create(null),nargs:Object.create(null),coercions:Object.create(null),keys:[]},ie=/^-([0-9]+(\.[0-9]+)?|\.[0-9]+)$/,ae=RegExp(`^--`+I[`negation-prefix`]+`(.+)`);[].concat(S.array||[]).filter(Boolean).forEach(function(n){let a=typeof n==`object`?n.key:n,S=Object.keys(n).map(function(n){return{boolean:`bools`,string:`strings`,number:`numbers`}[n]}).filter(Boolean).pop();S&&(re[S][a]=!0),re.arrays[a]=!0,re.keys.push(a)}),[].concat(S.boolean||[]).filter(Boolean).forEach(function(n){re.bools[n]=!0,re.keys.push(n)}),[].concat(S.string||[]).filter(Boolean).forEach(function(n){re.strings[n]=!0,re.keys.push(n)}),[].concat(S.number||[]).filter(Boolean).forEach(function(n){re.numbers[n]=!0,re.keys.push(n)}),[].concat(S.count||[]).filter(Boolean).forEach(function(n){re.counts[n]=!0,re.keys.push(n)}),[].concat(S.normalize||[]).filter(Boolean).forEach(function(n){re.normalize[n]=!0,re.keys.push(n)}),typeof S.narg==`object`&&Object.entries(S.narg).forEach(([n,a])=>{typeof a==`number`&&(re.nargs[n]=a,re.keys.push(n))}),typeof S.coerce==`object`&&Object.entries(S.coerce).forEach(([n,a])=>{typeof a==`function`&&(re.coercions[n]=a,re.keys.push(n))}),S.config!==void 0&&(Array.isArray(S.config)||typeof S.config==`string`?[].concat(S.config).filter(Boolean).forEach(function(n){re.configs[n]=!0}):typeof S.config==`object`&&Object.entries(S.config).forEach(([n,a])=>{(typeof a==`boolean`||typeof a==`function`)&&(re.configs[n]=a)})),extendAliases(S.key,F,S.default,re.arrays),Object.keys(H).forEach(function(n){(re.aliases[n]||[]).forEach(function(a){H[a]=H[n]})});let oe=null;checkConfiguration();let Z=[],se=Object.assign(Object.create(null),{_:[]}),ce={};for(let n=0;n<C.length;n++){let a=C[n],S=a.replace(/^-{3,}/,`---`),N,F,H,W,K,q;if(a!==`--`&&/^-/.test(a)&&isUnknownOptionAsArg(a))pushPositional(a);else if(S.match(/^---+(=|$)/)){pushPositional(a);continue}else if(a.match(/^--.+=/)||!I[`short-option-groups`]&&a.match(/^-.+=/))W=a.match(/^--?([^=]+)=([\s\S]*)$/),W!==null&&Array.isArray(W)&&W.length>=3&&(checkAllAliases(W[1],re.arrays)?n=eatArray(n,W[1],C,W[2]):checkAllAliases(W[1],re.nargs)===!1?setArg(W[1],W[2],!0):n=eatNargs(n,W[1],C,W[2]));else if(a.match(ae)&&I[`boolean-negation`])W=a.match(ae),W!==null&&Array.isArray(W)&&W.length>=2&&(F=W[1],setArg(F,checkAllAliases(F,re.arrays)?[!1]:!1));else if(a.match(/^--.+/)||!I[`short-option-groups`]&&a.match(/^-[^-]+/))W=a.match(/^--?(.+)/),W!==null&&Array.isArray(W)&&W.length>=2&&(F=W[1],checkAllAliases(F,re.arrays)?n=eatArray(n,F,C):checkAllAliases(F,re.nargs)===!1?(K=C[n+1],K!==void 0&&(!K.match(/^-/)||K.match(ie))&&!checkAllAliases(F,re.bools)&&!checkAllAliases(F,re.counts)||/^(true|false)$/.test(K)?(setArg(F,K),n++):setArg(F,defaultValue(F))):n=eatNargs(n,F,C));else if(a.match(/^-.\..+=/))W=a.match(/^-([^=]+)=([\s\S]*)$/),W!==null&&Array.isArray(W)&&W.length>=3&&setArg(W[1],W[2]);else if(a.match(/^-.\..+/)&&!a.match(ie))K=C[n+1],W=a.match(/^-(.\..+)/),W!==null&&Array.isArray(W)&&W.length>=2&&(F=W[1],K!==void 0&&!K.match(/^-/)&&!checkAllAliases(F,re.bools)&&!checkAllAliases(F,re.counts)?(setArg(F,K),n++):setArg(F,defaultValue(F)));else if(a.match(/^-[^-]+/)&&!a.match(ie)){H=a.slice(1,-1).split(``),N=!1;for(let S=0;S<H.length;S++){if(K=a.slice(S+2),H[S+1]&&H[S+1]===`=`){q=a.slice(S+3),F=H[S],checkAllAliases(F,re.arrays)?n=eatArray(n,F,C,q):checkAllAliases(F,re.nargs)===!1?setArg(F,q):n=eatNargs(n,F,C,q),N=!0;break}if(K===`-`){setArg(H[S],K);continue}if(/[A-Za-z]/.test(H[S])&&/^-?\d+(\.\d*)?(e-?\d+)?$/.test(K)&&checkAllAliases(K,re.bools)===!1){setArg(H[S],K),N=!0;break}if(H[S+1]&&H[S+1].match(/\W/)){setArg(H[S],K),N=!0;break}else setArg(H[S],defaultValue(H[S]))}F=a.slice(-1)[0],!N&&F!==`-`&&(checkAllAliases(F,re.arrays)?n=eatArray(n,F,C):checkAllAliases(F,re.nargs)===!1?(K=C[n+1],K!==void 0&&(!/^(-|--)[^-]/.test(K)||K.match(ie))&&!checkAllAliases(F,re.bools)&&!checkAllAliases(F,re.counts)||/^(true|false)$/.test(K)?(setArg(F,K),n++):setArg(F,defaultValue(F))):n=eatNargs(n,F,C))}else if(a.match(/^-[0-9]$/)&&a.match(ie)&&checkAllAliases(a.slice(1),re.bools))F=a.slice(1),setArg(F,defaultValue(F));else if(a===`--`){Z=C.slice(n+1);break}else if(I[`halt-at-non-option`]){Z=C.slice(n);break}else pushPositional(a)}applyEnvVars(se,!0),applyEnvVars(se,!1),setConfig(se),setConfigObjects(),applyDefaultsAndAliases(se,re.aliases,H,!0),applyCoercions(se),I[`set-placeholder-key`]&&setPlaceholderKeys(se),Object.keys(re.counts).forEach(function(n){hasKey(se,n.split(`.`))||setArg(n,0)}),q&&Z.length&&(se[Y]=[]),Z.forEach(function(n){se[Y].push(n)}),I[`camel-case-expansion`]&&I[`strip-dashed`]&&Object.keys(se).filter(n=>n!==`--`&&n.includes(`-`)).forEach(n=>{delete se[n]}),I[`strip-aliased`]&&[].concat(...Object.keys(F).map(n=>F[n])).forEach(n=>{I[`camel-case-expansion`]&&n.includes(`-`)&&delete se[n.split(`.`).map(n=>camelCase(n)).join(`.`)],delete se[n]});function pushPositional(n){let a=maybeCoerceNumber(`_`,n);(typeof a==`string`||typeof a==`number`)&&se._.push(a)}function eatNargs(n,a,S,C){let N,F=checkAllAliases(a,re.nargs);if(F=typeof F!=`number`||isNaN(F)?1:F,F===0)return isUndefined(C)||(oe=Error(ne(`Argument unexpected for: %s`,a))),setArg(a,defaultValue(a)),n;let H=+!isUndefined(C);if(I[`nargs-eats-options`])S.length-(n+1)+H<F&&(oe=Error(ne(`Not enough arguments following: %s`,a))),H=F;else{for(N=n+1;N<S.length&&(!S[N].match(/^-[^0-9]/)||S[N].match(ie)||isUnknownOptionAsArg(S[N]));N++)H++;H<F&&(oe=Error(ne(`Not enough arguments following: %s`,a)))}let W=Math.min(H,F);for(!isUndefined(C)&&W>0&&(setArg(a,C),W--),N=n+1;N<W+n+1;N++)setArg(a,S[N]);return n+W}function eatArray(n,a,S,C){let F=[],W=C||S[n+1],K=checkAllAliases(a,re.nargs);if(checkAllAliases(a,re.bools)&&!/^(true|false)$/.test(W))F.push(!0);else if(isUndefined(W)||isUndefined(C)&&/^-/.test(W)&&!ie.test(W)&&!isUnknownOptionAsArg(W)){if(H[a]!==void 0){let n=H[a];F=Array.isArray(n)?n:[n]}}else{isUndefined(C)||F.push(processValue(a,C,!0));for(let C=n+1;C<S.length&&!(!I[`greedy-arrays`]&&F.length>0||K&&typeof K==`number`&&F.length>=K||(W=S[C],/^-/.test(W)&&!ie.test(W)&&!isUnknownOptionAsArg(W)));C++)n=C,F.push(processValue(a,W,N))}return typeof K==`number`&&(K&&F.length<K||isNaN(K)&&F.length===0)&&(oe=Error(ne(`Not enough arguments following: %s`,a))),setArg(a,F),n}function setArg(n,a,S=N){/-/.test(n)&&I[`camel-case-expansion`]&&addNewAlias(n,n.split(`.`).map(function(n){return camelCase(n)}).join(`.`));let C=processValue(n,a,S),F=n.split(`.`);setKey(se,F,C),re.aliases[n]&&re.aliases[n].forEach(function(n){let a=n.split(`.`);setKey(se,a,C)}),F.length>1&&I[`dot-notation`]&&(re.aliases[F[0]]||[]).forEach(function(a){let S=a.split(`.`),N=[].concat(F);N.shift(),S=S.concat(N),(re.aliases[n]||[]).includes(S.join(`.`))||setKey(se,S,C)}),checkAllAliases(n,re.normalize)&&!checkAllAliases(n,re.arrays)&&[n].concat(re.aliases[n]||[]).forEach(function(n){Object.defineProperty(ce,n,{enumerable:!0,get(){return a},set(n){a=typeof n==`string`?vc.normalize(n):n}})})}function addNewAlias(n,a){re.aliases[n]&&re.aliases[n].length||(re.aliases[n]=[a],X[a]=!0),re.aliases[a]&&re.aliases[a].length||addNewAlias(a,n)}function processValue(n,a,S){S&&(a=stripQuotes$1(a)),(checkAllAliases(n,re.bools)||checkAllAliases(n,re.counts))&&typeof a==`string`&&(a=a===`true`);let C=Array.isArray(a)?a.map(function(a){return maybeCoerceNumber(n,a)}):maybeCoerceNumber(n,a);return checkAllAliases(n,re.counts)&&(isUndefined(C)||typeof C==`boolean`)&&(C=increment$1()),checkAllAliases(n,re.normalize)&&checkAllAliases(n,re.arrays)&&(C=Array.isArray(a)?a.map(n=>vc.normalize(n)):vc.normalize(a)),C}function maybeCoerceNumber(n,a){return!I[`parse-positional-numbers`]&&n===`_`||!checkAllAliases(n,re.strings)&&!checkAllAliases(n,re.bools)&&!Array.isArray(a)&&(looksLikeNumber(a)&&I[`parse-numbers`]&&Number.isSafeInteger(Math.floor(parseFloat(`${a}`)))||!isUndefined(a)&&checkAllAliases(n,re.numbers))&&(a=Number(a)),a}function setConfig(n){let a=Object.create(null);applyDefaultsAndAliases(a,re.aliases,H),Object.keys(re.configs).forEach(function(S){let C=n[S]||a[S];if(C)try{let n=null,a=vc.resolve(vc.cwd(),C),N=re.configs[S];if(typeof N==`function`){try{n=N(a)}catch(a){n=a}if(n instanceof Error){oe=n;return}}else n=vc.require(a);setConfigObject(n)}catch(a){a.name===`PermissionDenied`?oe=a:n[S]&&(oe=Error(ne(`Invalid JSON config file: %s`,C)))}})}function setConfigObject(n,a){Object.keys(n).forEach(function(S){let C=n[S],N=a?a+`.`+S:S;typeof C==`object`&&C&&!Array.isArray(C)&&I[`dot-notation`]?setConfigObject(C,N):(!hasKey(se,N.split(`.`))||checkAllAliases(N,re.arrays)&&I[`combine-arrays`])&&setArg(N,C)})}function setConfigObjects(){W!==void 0&&W.forEach(function(n){setConfigObject(n)})}function applyEnvVars(n,a){if(K===void 0)return;let S=typeof K==`string`?K:``,C=vc.env();Object.keys(C).forEach(function(N){if(S===``||N.lastIndexOf(S,0)===0){let F=N.split(`__`).map(function(n,a){return a===0&&(n=n.substring(S.length)),camelCase(n)});(a&&re.configs[F.join(`.`)]||!a)&&!hasKey(n,F)&&setArg(F.join(`.`),C[N])}})}function applyCoercions(n){let a,S=new Set;Object.keys(n).forEach(function(C){if(!S.has(C)&&(a=checkAllAliases(C,re.coercions),typeof a==`function`))try{let N=maybeCoerceNumber(C,a(n[C]));[].concat(re.aliases[C]||[],C).forEach(a=>{S.add(a),n[a]=N})}catch(n){oe=n}})}function setPlaceholderKeys(n){return re.keys.forEach(a=>{~a.indexOf(`.`)||n[a]===void 0&&(n[a]=void 0)}),n}function applyDefaultsAndAliases(n,a,S,C=!1){Object.keys(S).forEach(function(N){hasKey(n,N.split(`.`))||(setKey(n,N.split(`.`),S[N]),C&&(te[N]=!0),(a[N]||[]).forEach(function(a){hasKey(n,a.split(`.`))||setKey(n,a.split(`.`),S[N])}))})}function hasKey(n,a){let S=n;I[`dot-notation`]||(a=[a.join(`.`)]),a.slice(0,-1).forEach(function(n){S=S[n]||{}});let C=a[a.length-1];return typeof S==`object`?C in S:!1}function setKey(n,a,S){let C=n;I[`dot-notation`]||(a=[a.join(`.`)]),a.slice(0,-1).forEach(function(n){n=sanitizeKey(n),typeof C==`object`&&C[n]===void 0&&(C[n]={}),typeof C[n]!=`object`||Array.isArray(C[n])?(Array.isArray(C[n])?C[n].push({}):C[n]=[C[n],{}],C=C[n][C[n].length-1]):C=C[n]});let N=sanitizeKey(a[a.length-1]),F=checkAllAliases(a.join(`.`),re.arrays),H=Array.isArray(S),W=I[`duplicate-arguments-array`];!W&&checkAllAliases(N,re.nargs)&&(W=!0,(!isUndefined(C[N])&&re.nargs[N]===1||Array.isArray(C[N])&&C[N].length===re.nargs[N])&&(C[N]=void 0)),S===increment$1()?C[N]=increment$1(C[N]):Array.isArray(C[N])?W&&F&&H?C[N]=I[`flatten-duplicate-arrays`]?C[N].concat(S):(Array.isArray(C[N][0])?C[N]:[C[N]]).concat([S]):!W&&!!F==!!H?C[N]=S:C[N]=C[N].concat([S]):C[N]===void 0&&F?C[N]=H?S:[S]:W&&!(C[N]===void 0||checkAllAliases(N,re.counts)||checkAllAliases(N,re.bools))?C[N]=[C[N],S]:C[N]=S}function extendAliases(...n){n.forEach(function(n){Object.keys(n||{}).forEach(function(n){re.aliases[n]||(re.aliases[n]=[].concat(F[n]||[]),re.aliases[n].concat(n).forEach(function(a){if(/-/.test(a)&&I[`camel-case-expansion`]){let S=camelCase(a);S!==n&&re.aliases[n].indexOf(S)===-1&&(re.aliases[n].push(S),X[S]=!0)}}),re.aliases[n].concat(n).forEach(function(a){if(a.length>1&&/[A-Z]/.test(a)&&I[`camel-case-expansion`]){let S=decamelize(a,`-`);S!==n&&re.aliases[n].indexOf(S)===-1&&(re.aliases[n].push(S),X[S]=!0)}}),re.aliases[n].forEach(function(a){re.aliases[a]=[n].concat(re.aliases[n].filter(function(n){return a!==n}))}))})})}function checkAllAliases(n,a){let S=[].concat(re.aliases[n]||[],n),C=Object.keys(a),N=S.find(n=>C.includes(n));return N?a[N]:!1}function hasAnyFlag(n){let a=Object.keys(re);return[].concat(a.map(n=>re[n])).some(function(a){return Array.isArray(a)?a.includes(n):a[n]})}function hasFlagsMatching(n,...a){return[].concat(...a).some(function(a){let S=n.match(a);return S&&hasAnyFlag(S[1])})}function hasAllShortFlags(n){if(n.match(ie)||!n.match(/^-[^-]+/))return!1;let a=!0,S,C=n.slice(1).split(``);for(let N=0;N<C.length;N++){if(S=n.slice(N+2),!hasAnyFlag(C[N])){a=!1;break}if(C[N+1]&&C[N+1]===`=`||S===`-`||/[A-Za-z]/.test(C[N])&&/^-?\d+(\.\d*)?(e-?\d+)?$/.test(S)||C[N+1]&&C[N+1].match(/\W/))break}return a}function isUnknownOptionAsArg(n){return I[`unknown-options-as-args`]&&isUnknownOption(n)}function isUnknownOption(n){return n=n.replace(/^-{3,}/,`--`),n.match(ie)||hasAllShortFlags(n)?!1:!hasFlagsMatching(n,/^-+([^=]+?)=[\s\S]*$/,ae,/^-+([^=]+?)$/,/^-+([^=]+?)-$/,/^-+([^=]+?\d+)$/,/^-+([^=]+?)\W+.*$/)}function defaultValue(n){return!checkAllAliases(n,re.bools)&&!checkAllAliases(n,re.counts)&&`${n}`in H?H[n]:defaultForType(guessType(n))}function defaultForType(n){return{[gc.BOOLEAN]:!0,[gc.STRING]:``,[gc.NUMBER]:void 0,[gc.ARRAY]:[]}[n]}function guessType(n){let a=gc.BOOLEAN;return checkAllAliases(n,re.strings)?a=gc.STRING:checkAllAliases(n,re.numbers)?a=gc.NUMBER:checkAllAliases(n,re.bools)?a=gc.BOOLEAN:checkAllAliases(n,re.arrays)&&(a=gc.ARRAY),a}function isUndefined(n){return n===void 0}function checkConfiguration(){Object.keys(re.counts).find(n=>checkAllAliases(n,re.arrays)?(oe=Error(ne(`Invalid configuration: %s, opts.count excludes opts.array.`,n)),!0):checkAllAliases(n,re.nargs)?(oe=Error(ne(`Invalid configuration: %s, opts.count excludes opts.narg.`,n)),!0):!1)}return{aliases:Object.assign({},re.aliases),argv:Object.assign(ce,se),configuration:I,defaulted:Object.assign({},te),error:oe,newAliases:Object.assign({},X)}}},__name$1(increment$1,`increment`),__name$1(stripQuotes$1,`stripQuotes`)}),bc,xc,Sc=__esmMin(()=>{bc=Object.defineProperty,xc=__name$1((n,a)=>{let S={};for(var C in n)bc(S,C,{get:n[C],enumerable:!0});return a||bc(S,Symbol.toStringTag,{value:`Module`}),S},`__exportAll`)});function getEncodingFromOptions(n={encoding:null,flag:`r`},a=`utf8`){return n===null?a:typeof n==`string`?n:typeof n==`object`&&typeof n.encoding==`string`?n.encoding:a}function encodeUint8Array(n,a){return n===`buffer`?Ge.from(a):new TextDecoder(n).decode(a)}function decode(n,a){if(a){let S=new TextDecoder(a),C=new TextEncoder;return S.decode(C.encode(n))}else return n}var Cc=__esmMin(()=>{et()}),Dirent,wc=__esmMin(()=>{Tr(),Ts(),Dirent=class{name;parentPath;_isFile=!1;_isDirectory=!1;_isBlockDevice=!1;_isCharacterDevice=!1;_isSymbolicLink=!1;_isFIFO=!1;_isSocket=!1;_file;constructor(n,a,S){switch(a||=vs(n),this.name=a,this.parentPath=_s(n),this._file=wr.File.new_for_path(n),S??this._file.query_file_type(wr.FileQueryInfoFlags.NONE,null)){case wr.FileType.DIRECTORY:this._isDirectory=!0;break;case wr.FileType.MOUNTABLE:break;case wr.FileType.REGULAR:this._isFile=!0;break;case wr.FileType.SYMBOLIC_LINK:case wr.FileType.SHORTCUT:this._isSymbolicLink=!0;break;case wr.FileType.SPECIAL:this._classifySpecialFile(n);break}}_classifySpecialFile(n){try{let a=wr.File.new_for_path(n).query_info(`unix::mode`,wr.FileQueryInfoFlags.NOFOLLOW_SYMLINKS,null).get_attribute_uint32(`unix::mode`);if(a===0)return;switch(a&61440){case 24576:this._isBlockDevice=!0;break;case 8192:this._isCharacterDevice=!0;break;case 49152:this._isSocket=!0;break;case 4096:this._isFIFO=!0;break}}catch{}}isFile(){return this._isFile}isDirectory(){return this._isDirectory}isBlockDevice(){return this._isBlockDevice}isCharacterDevice(){return this._isCharacterDevice}isSymbolicLink(){return this._isSymbolicLink}isFIFO(){return this._isFIFO}isSocket(){return this._isSocket}}});function populateFromInfo(n){let a=n.get_attribute_uint64(`time::access`),S=n.get_attribute_uint32(`time::access-usec`)||0,C=n.get_attribute_uint64(`time::modified`),N=n.get_attribute_uint32(`time::modified-usec`)||0,F=n.get_attribute_uint64(`time::changed`),I=n.get_attribute_uint32(`time::changed-usec`)||0,H=n.get_attribute_uint64(`time::created`),W=n.get_attribute_uint32(`time::created-usec`)||0,K=a*1e3+S/1e3,q=C*1e3+N/1e3,Y=F?F*1e3+I/1e3:q,X=H?H*1e3+W/1e3:Y;return{dev:n.get_attribute_uint32(`unix::device`)||0,ino:Number(n.get_attribute_uint64(`unix::inode`)||0),mode:n.get_attribute_uint32(`unix::mode`)||0,nlink:n.get_attribute_uint32(`unix::nlink`)||0,uid:n.get_attribute_uint32(`unix::uid`)||0,gid:n.get_attribute_uint32(`unix::gid`)||0,rdev:n.get_attribute_uint32(`unix::rdev`)||0,size:Number(n.get_size()||0),blksize:n.get_attribute_uint32(`unix::block-size`)||4096,blocks:Number(n.get_attribute_uint64(`unix::blocks`)||0),atimeMs:K,mtimeMs:q,ctimeMs:Y,birthtimeMs:X,atime:new Date(K),mtime:new Date(q),ctime:new Date(Y),birthtime:new Date(X)}}var Tc,Stats,BigIntStats,Ec=__esmMin(()=>{wc(),Tr(),Ts(),Tc=`standard::*,time::*,unix::*`,Stats=class extends Dirent{dev;ino;mode;nlink;uid;gid;rdev;size;blksize;blocks;atimeMs;mtimeMs;ctimeMs;birthtimeMs;atime;mtime;ctime;birthtime;_info;constructor(n,a,S){let C,N;n instanceof wr.FileInfo?(C=n,N=a.toString(),S||=vs(N)):(N=n.toString(),typeof a==`string`&&(S=a),S||=vs(N),C=wr.File.new_for_path(N).query_info(Tc,wr.FileQueryInfoFlags.NOFOLLOW_SYMLINKS,null)),super(N,S,C.get_file_type()),this._info=C;let F=populateFromInfo(C);this.dev=F.dev,this.ino=F.ino,this.mode=F.mode,this.nlink=F.nlink,this.uid=F.uid,this.gid=F.gid,this.rdev=F.rdev,this.size=F.size,this.blksize=F.blksize,this.blocks=F.blocks,this.atimeMs=F.atimeMs,this.mtimeMs=F.mtimeMs,this.ctimeMs=F.ctimeMs,this.birthtimeMs=F.birthtimeMs,this.atime=F.atime,this.mtime=F.mtime,this.ctime=F.ctime,this.birthtime=F.birthtime}},BigIntStats=class extends Dirent{dev;ino;mode;nlink;uid;gid;rdev;size;blksize;blocks;atimeMs;mtimeMs;ctimeMs;birthtimeMs;atimeNs;mtimeNs;ctimeNs;birthtimeNs;atime;mtime;ctime;birthtime;_info;constructor(n,a,S){let C,N;n instanceof wr.FileInfo?(C=n,N=a.toString(),S||=vs(N)):(N=n.toString(),typeof a==`string`&&(S=a),S||=vs(N),C=wr.File.new_for_path(N).query_info(Tc,wr.FileQueryInfoFlags.NOFOLLOW_SYMLINKS,null)),super(N,S,C.get_file_type()),this._info=C;let F=populateFromInfo(C);this.dev=BigInt(F.dev),this.ino=BigInt(F.ino),this.mode=BigInt(F.mode),this.nlink=BigInt(F.nlink),this.uid=BigInt(F.uid),this.gid=BigInt(F.gid),this.rdev=BigInt(F.rdev),this.size=BigInt(F.size),this.blksize=BigInt(F.blksize),this.blocks=BigInt(F.blocks),this.atimeMs=BigInt(Math.trunc(F.atimeMs)),this.mtimeMs=BigInt(Math.trunc(F.mtimeMs)),this.ctimeMs=BigInt(Math.trunc(F.ctimeMs)),this.birthtimeMs=BigInt(Math.trunc(F.birthtimeMs)),this.atimeNs=this.atimeMs*1000000n,this.mtimeNs=this.mtimeMs*1000000n,this.ctimeNs=this.ctimeMs*1000000n,this.birthtimeNs=this.birthtimeMs*1000000n,this.atime=F.atime,this.mtime=F.mtime,this.ctime=F.ctime,this.birthtime=F.birthtime}}});function createReadStream(n,a){return new ReadStream$1(n,a)}var ReadStream$1,Dc=__esmMin(()=>{nl(),it(),Tr(),et(),ni(),ReadStream$1=class extends Xr{static{__name$1(this,`ReadStream`)}bytesRead=0;path;pending=!0;fd=null;_gioFile;_inputStream=null;_cancellable=new wr.Cancellable;_start;_end;_pos;close(n){this._cancellable.cancel(),this._inputStream&&=(this._inputStream.close_async(rt.PRIORITY_DEFAULT,null,()=>{}),null),this.destroy(),n&&n(null)}constructor(n,a){let S=normalizePath(n);super({highWaterMark:a?.highWaterMark??64*1024,encoding:a?.encoding,objectMode:!1}),this.path=S,this._gioFile=wr.File.new_for_path(S),this._start=a?.start??0,this._end=a?.end??1/0,this._pos=this._start}_construct(n){this._gioFile.read_async(rt.PRIORITY_DEFAULT,this._cancellable,(a,S)=>{if(this.destroyed){n();return}try{this._inputStream=this._gioFile.read_finish(S),this.pending=!1,this.emit(`open`,0),this.emit(`ready`),this._start>0&&this._inputStream.can_seek()&&this._inputStream.seek(this._start,rt.SeekType.SET,null),n()}catch(a){this._cancellable.is_cancelled()||n(a)}})}_read(n){this._doRead(n)}_doRead(n){let a=n;if(this._end!==1/0){let S=this._end-this._pos+1;if(S<=0){this.push(null);return}a=Math.min(n,S)}let S=this._inputStream;S.read_bytes_async(a,rt.PRIORITY_DEFAULT,this._cancellable,(n,a)=>{try{let n=S.read_bytes_finish(a).get_data();if(!n||n.length===0){this.push(null);return}this.bytesRead+=n.length,this._pos+=n.length,this.push(Ge.from(n))}catch(n){this._cancellable.is_cancelled()||this.destroy(n)}})}_destroy(n,a){this._cancellable.cancel(),this._inputStream&&=(this._inputStream.close_async(rt.PRIORITY_DEFAULT,null,()=>{}),null),a(n)}}});function createNodeError(n,a,S,C){return createNodeError$1(n,a,{path:S.toString(),dest:C?.toString()})}var Oc=__esmMin(()=>{Ae()});function makeEEXIST(n){let a=Error(`ERR_FS_CP_EEXIST: file already exists, copyfile '${n}'`);return a.code=`ERR_FS_CP_EEXIST`,a.syscall=`copyfile`,a.path=n,a}function makeEISDIR(n){let a=Error(`ERR_FS_EISDIR: illegal operation on a directory, copyfile '${n}'`);return a.code=`ERR_FS_EISDIR`,a.syscall=`copyfile`,a.path=n,a}function makeENOTDIR(n,a){let S=Error(`ENOTDIR: not a directory, copyfile '${n}' -> '${a}'`);return S.code=`ENOTDIR`,S.syscall=`copyfile`,S.path=n,S.dest=a,S}function makeSYMLINKLOOP(n,a){let S=Error(`ELOOP: too many levels of symbolic links, copyfile '${n}' -> '${a}'`);return S.code=`ELOOP`,S.syscall=`copyfile`,S.path=n,S.dest=a,S}function queryCopyFlags(n){let a=n.force??!0,S=wr.FileCopyFlags.NONE;return a&&(S|=wr.FileCopyFlags.OVERWRITE),n.preserveTimestamps&&(S|=wr.FileCopyFlags.TARGET_DEFAULT_MODIFIED_TIME),n.dereference||(S|=wr.FileCopyFlags.NOFOLLOW_SYMLINKS),S}function copyOneSyncFile(n,a,S,C,N){let F=N.force??!0;try{if(a.query_info(`standard::type`,wr.FileQueryInfoFlags.NONE,null).get_file_type()===wr.FileType.DIRECTORY)throw makeENOTDIR(S,C);if(!F){if(N.errorOnExist)throw makeEEXIST(C);return}}catch(n){if(typeof n.code==`string`)throw n}let I=queryCopyFlags(N);try{n.copy(a,I,null,null)}catch(n){throw createNodeError(n,`copyfile`,S,C)}}function cpOneDirSync(n,a,S,C,N){let F=S.endsWith(`/`)?``:`/`;if(C.startsWith(S+F)&&C!==S)throw makeSYMLINKLOOP(S,C);if(a.query_exists(null))try{if(a.query_info(`standard::type`,wr.FileQueryInfoFlags.NONE,null).get_file_type()!==wr.FileType.DIRECTORY)throw makeENOTDIR(C,S)}catch(n){if(typeof n.code==`string`)throw n}else try{a.make_directory_with_parents(null)}catch(n){throw createNodeError(n,`mkdir`,C)}let I;try{I=n.enumerate_children(`standard::name,standard::type,standard::is-symlink`,N.dereference?wr.FileQueryInfoFlags.NONE:wr.FileQueryInfoFlags.NOFOLLOW_SYMLINKS,null)}catch(n){throw createNodeError(n,`scandir`,S)}let H=I.next_file(null);for(;H!==null;){let n=H.get_name(),a=ms(S,n),F=ms(C,n),W=N.filter;if(W&&!W(a,F)){H=I.next_file(null);continue}cpSyncInternal(a,F,N),H=I.next_file(null)}}function cpSyncInternal(n,a,S){let C=wr.File.new_for_path(n),N=wr.File.new_for_path(a),F;try{F=C.query_info(`standard::type,standard::is-symlink`,S.dereference?wr.FileQueryInfoFlags.NONE:wr.FileQueryInfoFlags.NOFOLLOW_SYMLINKS,null)}catch(a){throw createNodeError(a,`stat`,n)}if(F.get_file_type()===wr.FileType.DIRECTORY){if(!S.recursive)throw makeEISDIR(n);cpOneDirSync(C,N,n,a,S)}else copyOneSyncFile(C,N,n,a,S)}function cpSync(n,a,S){let C=normalizePath(n),N=normalizePath(a),F=S??{},I=wr.File.new_for_path(C),H=F.filter;if(!(H&&!H(C,N))){try{if(I.query_info(`standard::type`,F.dereference?wr.FileQueryInfoFlags.NONE:wr.FileQueryInfoFlags.NOFOLLOW_SYMLINKS,null).get_file_type()===wr.FileType.DIRECTORY&&!F.recursive)throw makeEISDIR(C)}catch(n){throw typeof n.code==`string`?n:createNodeError(n,`stat`,C)}cpSyncInternal(C,N,F)}}function cp(n,a,S,C){let N,F;typeof S==`function`?(F=S,N={}):(F=C,N=S);let I=N.filter;if(I){Promise.resolve(I(normalizePath(n),normalizePath(a))).then(S=>{if(!S){F(null);return}try{cpPromises(n,a,N).then(()=>F(null)).catch(F)}catch(n){F(n)}}).catch(F);return}Promise.resolve().then(()=>{try{cpSync(n,a,N),F(null)}catch(n){F(n)}})}async function cpPromisesDir(n,a,S){let C=n.endsWith(`/`)?``:`/`;if(a.startsWith(n+C)&&a!==n)throw makeSYMLINKLOOP(n,a);let N=wr.File.new_for_path(a);if(!N.query_exists(null))try{N.make_directory_with_parents(null)}catch(n){throw createNodeError(n,`mkdir`,a)}let F=wr.File.new_for_path(n),I;try{I=F.enumerate_children(`standard::name,standard::type`,S.dereference?wr.FileQueryInfoFlags.NONE:wr.FileQueryInfoFlags.NOFOLLOW_SYMLINKS,null)}catch(a){throw createNodeError(a,`scandir`,n)}let H=I.next_file(null);for(;H!==null;){let C=H.get_name(),N=ms(n,C),F=ms(a,C),W=S.filter;if(W&&!await Promise.resolve(W(N,F))){H=I.next_file(null);continue}await cpPromises(N,F,S),H=I.next_file(null)}}async function cpPromises(n,a,S={}){let C=normalizePath(n),N=normalizePath(a),F=wr.File.new_for_path(C),I;try{I=F.query_info(`standard::type`,S.dereference?wr.FileQueryInfoFlags.NONE:wr.FileQueryInfoFlags.NOFOLLOW_SYMLINKS,null)}catch(n){throw createNodeError(n,`stat`,C)}if(I.get_file_type()===wr.FileType.DIRECTORY){if(!S.recursive)throw makeEISDIR(C);await cpPromisesDir(C,N,S)}else copyOneSyncFile(F,wr.File.new_for_path(N),C,N,S)}var kc=__esmMin(()=>{nl(),Oc(),Tr(),Ts()});function _openDir(n){let a=wr.File.new_for_path(n),S;try{S=a.enumerate_children(Ac,wr.FileQueryInfoFlags.NOFOLLOW_SYMLINKS,null)}catch(a){throw createNodeError(a,`opendir`,n)}return new Dir(n,S)}function opendirSync(n){return _openDir(normalizePath(n))}function opendir(n,a,S){let C;if(C=typeof a==`function`?a:S,typeof C!=`function`)throw TypeError(`The "callback" argument must be of type function`);Promise.resolve().then(()=>{try{let a=opendirSync(n);C(null,a)}catch(n){C(n,null)}})}async function opendirAsync(n,a){return new Promise((a,S)=>{let C=normalizePath(n),N=wr.File.new_for_path(C);N.enumerate_children_async(Ac,wr.FileQueryInfoFlags.NOFOLLOW_SYMLINKS,rt.PRIORITY_DEFAULT,null,(n,F)=>{try{let n=N.enumerate_children_finish(F);a(new Dir(C,n))}catch(n){S(createNodeError(n,`opendir`,C))}})})}var Ac,Dir,jc=__esmMin(()=>{nl(),wc(),Oc(),it(),Tr(),Ac=`standard::name,standard::type,standard::is-symlink,standard::size,standard::symlink-target,unix::uid,unix::gid,unix::mode,time::modified,time::access,time::created`,Dir=class{path;_enumerator;_closed=!1;constructor(n,a){this.path=n,this._enumerator=a}_assertOpen(){if(this._closed){let n=Error(`Directory handle was closed`);throw n.code=`ERR_DIR_CLOSED`,n}}readSync(){this._assertOpen();try{let n=this._enumerator.next_file(null);if(n===null)return null;let a=n.get_name(),S=n.get_file_type();return new Dirent(this.path.endsWith(`/`)?this.path+a:this.path+`/`+a,a,S)}catch(n){throw createNodeError(n,`readdir`,this.path)}}read(n){if(n!==void 0){if(typeof n!=`function`)throw TypeError(`The "callback" argument must be of type function`);try{this._assertOpen();let a=this.readSync();Promise.resolve().then(()=>n(null,a))}catch(a){Promise.resolve().then(()=>n(a,null))}return}return new Promise((n,a)=>{try{this._assertOpen(),n(this.readSync())}catch(n){a(n)}})}closeSync(){this._assertOpen(),this._closed=!0;try{this._enumerator.close(null)}catch{}this._enumerator=null}close(n){if(n!==void 0){if(typeof n!=`function`)throw TypeError(`The "callback" argument must be of type function`);try{this.closeSync(),Promise.resolve().then(()=>n(null))}catch(a){Promise.resolve().then(()=>n(a))}return}return new Promise((n,a)=>{try{this.closeSync(),n()}catch(n){a(n)}})}async*[Symbol.asyncIterator](){try{for(;;){let n=await this.read();if(n===null)break;yield n}}finally{this._closed||await this.close()}}}});function segmentToRegexSrc(n){let a=/^([!*+?@])\((.+)\)$/.exec(n);if(a){let[,n,S]=a,C=S.split(`|`).map(n=>segmentToRegexSrc(n)),N=`(?:`+C.join(`|`)+`)`;switch(n){case`!`:return`(?!(?:`+C.join(`|`)+`))[^/]*`;case`*`:return N+`*`;case`+`:return N+`+`;case`?`:return N+`?`;case`@`:return N}}let S=``,C=0;for(;C<n.length;){let a=n[C];if(a===`*`){S+=`[^/]*`,C++;continue}if(a===`?`){S+=`[^/]`,C++;continue}if(a===`[`){let a=n.indexOf(`]`,C+1);if(a===-1){S+=`\\[`,C++;continue}S+=n.slice(C,a+1),C=a+1;continue}if(a===`{`){let a=n.indexOf(`}`,C+1);if(a===-1){S+=`\\{`,C++;continue}let N=n.slice(C+1,a).split(`,`).map(n=>segmentToRegexSrc(n.trim()));S+=`(?:`+N.join(`|`)+`)`,C=a+1;continue}`.+^$|()[]{}`.includes(a)?S+=`\\`+a:S+=a,C++}return S}function globToRegex$2(n){n=n.replace(/\/+/g,`/`).replace(/^\.\//,``);let a=n.split(`/`),S=[];for(let n=0;n<a.length;n++){let C=a[n],N=n===a.length-1;C===`**`?N?S.length>0&&S[S.length-1]===`/`?(S.pop(),S.push(`(?:/.+)?`)):S.push(`(?:.+)?`):S.push(`(?:[^/]+/)*`):(S.push(segmentToRegexSrc(C)),N||S.push(`/`))}return RegExp(`^(?:`+S.join(``)+`)$`)}function buildExcludePredicate(n){if(!n)return null;if(typeof n==`function`)return n;let a=(Array.isArray(n)?n:[n]).map(n=>globToRegex$2(n));return n=>a.some(a=>a.test(n))}function matchAll(n,a,S){let C=globToRegex$2(n),N=buildExcludePredicate(S),F;try{F=readdirSync(a,{recursive:!0})}catch{return[]}let I=[`.`,...F],H=[];for(let n of I){let a=n.replace(/\\/g,`/`);C.test(a)&&(N&&N(a)||H.push(n))}return H}function globSync(n,a){let S=Array.isArray(n)?n:[n],C=a?.cwd?normalizePath(a.cwd):globalThis.process?.cwd?.()??`/`,N=a?.exclude,F=new Set,I=[];for(let n of S)for(let a of matchAll(n,C,N))F.has(a)||(F.add(a),I.push(a));return I}function glob(n,a,S){let C,N;typeof a==`function`?(N=a,C={}):(N=S,C=a||{}),Promise.resolve().then(()=>{try{let a=globSync(n,C);N(null,a)}catch(n){N(n,[])}})}async function*globAsync(n,a){let S=globSync(n,a);for(let n of S)yield n}var Mc=__esmMin(()=>{nl(),tl(),__name$1(globToRegex$2,`globToRegex`)});function buildStatFs(n){let a=Number(n.get_attribute_uint64(`filesystem::size`)??0),S=Number(n.get_attribute_uint64(`filesystem::free`)??0),C=Math.floor(a/Pc),N=Math.floor(S/Pc);return{type:0,bsize:Pc,blocks:C,bfree:N,bavail:N,files:0,ffree:0}}function buildBigIntStatFs(n){let a=BigInt(n.get_attribute_uint64(`filesystem::size`)??0),S=BigInt(n.get_attribute_uint64(`filesystem::free`)??0),C=BigInt(Pc),N=a/C,F=S/C;return{type:0n,bsize:C,blocks:N,bfree:F,bavail:F,files:0n,ffree:0n}}function statfsSync(n,a){let S=wr.File.new_for_path(normalizePath(n)).query_filesystem_info(Nc,null);return a?.bigint===!0?buildBigIntStatFs(S):buildStatFs(S)}function queryFsInfoAsync(n,a){return new Promise((S,C)=>{let N=wr.File.new_for_path(normalizePath(n));N.query_filesystem_info_async(Nc,rt.PRIORITY_DEFAULT,null,(n,F)=>{try{let n=N.query_filesystem_info_finish(F);S(a?buildBigIntStatFs(n):buildStatFs(n))}catch(n){C(n)}})})}function statfs(n,a,S){let C=typeof a==`function`?a:S;queryFsInfoAsync(n,(typeof a==`function`?{}:a)?.bigint===!0).then(n=>C(null,n),n=>C(n,null))}async function statfsAsync(n,a){return queryFsInfoAsync(n,a?.bigint===!0)}var Nc,Pc,Fc=__esmMin(()=>{nl(),it(),Tr(),Nc=[`filesystem::size`,`filesystem::free`].join(`,`),Pc=4096}),Ic=__exportAll$4({lchmod:()=>lchmod,lchmodAsync:()=>lchmodAsync,lchmodSync:()=>lchmodSync,lchown:()=>lchown,lchownAsync:()=>lchownAsync,lchownSync:()=>lchownSync,lutimes:()=>lutimes,lutimesAsync:()=>lutimesAsync,lutimesSync:()=>lutimesSync,utimes:()=>utimes,utimesAsync:()=>utimesAsync,utimesSync:()=>utimesSync});function toGLibDateTime(n){let a=n instanceof Date?n.getTime():typeof n==`bigint`?Number(n):typeof n==`string`?Date.parse(n):n*1e3;return rt.DateTime.new_from_unix_utc(Math.floor(a/1e3))}function setTimestamps(n,a,S,C){let N=wr.File.new_for_path(n),F=new wr.FileInfo;F.set_modification_date_time(toGLibDateTime(S)),F.set_access_date_time(toGLibDateTime(a)),N.set_attributes_from_info(F,C,null)}function utimesSync(n,a,S){setTimestamps(normalizePath(n),a,S,wr.FileQueryInfoFlags.NONE)}function utimes(n,a,S,C){Promise.resolve().then(()=>utimesSync(n,a,S)).then(()=>C(null),C)}async function utimesAsync(n,a,S){utimesSync(n,a,S)}function lutimesSync(n,a,S){setTimestamps(normalizePath(n),a,S,wr.FileQueryInfoFlags.NOFOLLOW_SYMLINKS)}function lutimes(n,a,S,C){Promise.resolve().then(()=>lutimesSync(n,a,S)).then(()=>C(null),C)}async function lutimesAsync(n,a,S){lutimesSync(n,a,S)}function lchownSync(n,a,S){let C=normalizePath(n),N=wr.File.new_for_path(C),F=new wr.FileInfo;a!==-1&&F.set_attribute_uint32(`unix::uid`,a),S!==-1&&F.set_attribute_uint32(`unix::gid`,S),N.set_attributes_from_info(F,wr.FileQueryInfoFlags.NOFOLLOW_SYMLINKS,null)}function lchown(n,a,S,C){Promise.resolve().then(()=>lchownSync(n,a,S)).then(()=>C(null),C)}async function lchownAsync(n,a,S){lchownSync(n,a,S)}function lchmodSync(n,a){}function lchmod(n,a,S){S(null)}async function lchmodAsync(n,a){}var Lc=__esmMin(()=>{nl(),it(),Tr()});function getFH(n){return n instanceof $c?$c.getInstance(n.fd):$c.getInstance(n)}function fstatSync(n,a){return statSync(normalizePath(getFH(n).options.path),a)}function fstat(n,a,S){let C=typeof a==`function`?a:S;fstatAsync(n,typeof a==`function`?{}:a).then(n=>C(null,n),n=>C(n,void 0))}async function fstatAsync(n,a){return a?.bigint,fstatSync(n,a)}function ftruncateSync(n,a=0){truncateSync(normalizePath(getFH(n).options.path),a)}function ftruncate(n,a,S){let C=typeof a==`function`?a:S;ftruncateAsync(n,typeof a==`function`?0:a).then(()=>C(null),C)}async function ftruncateAsync(n,a=0){ftruncateSync(n,a)}function fdatasyncSync(n){getFH(n)._flushSync()}function fdatasync(n,a){Promise.resolve().then(()=>fdatasyncSync(n)).then(()=>a(null),a)}async function fdatasyncAsync(n){fdatasyncSync(n)}function fsyncSync(n){getFH(n)._flushSync()}function fsync(n,a){Promise.resolve().then(()=>fsyncSync(n)).then(()=>a(null),a)}async function fsyncAsync(n){fsyncSync(n)}function fchmodSync(n,a){chmodSync(normalizePath(getFH(n).options.path),a)}function fchmod(n,a,S){Promise.resolve().then(()=>fchmodSync(n,a)).then(()=>S(null),S)}async function fchmodAsync(n,a){fchmodSync(n,a)}function fchownSync(n,a,S){chownSync(normalizePath(getFH(n).options.path),a,S)}function fchown(n,a,S,C){Promise.resolve().then(()=>fchownSync(n,a,S)).then(()=>C(null),C)}async function fchownAsync(n,a,S){fchownSync(n,a,S)}function futimesSync(n,a,S){utimesSync(normalizePath(getFH(n).options.path),a,S)}function futimes(n,a,S,C){Promise.resolve().then(()=>futimesSync(n,a,S)).then(()=>C(null),C)}async function futimesAsync(n,a,S){futimesSync(n,a,S)}function closeSync(n){getFH(n)._closeSync()}function readSync(n,a,S,C,N){let F=0;return typeof S==`object`&&S?(F=S.offset??0,C=S.length??a.byteLength,N=S.position??null):(F=S??0,C??=a.byteLength-F),getFH(n)._readSync(a,F,C,N??null)}function writeSync(n,a,S,C,N){let F;if(typeof a==`string`)F=new TextEncoder().encode(a),typeof S==`number`&&(N=S);else{let n=typeof S==`number`?S:0,N=typeof C==`number`?C:a.byteLength-n;F=new Uint8Array(a.buffer,a.byteOffset+n,N)}return getFH(n)._writeSync(F,N??null)}function readvSync(n,a,S){let C=0;for(let N of a){let a=readSync(n,N,0,N.byteLength,S==null?null:S+C);if(C+=a,a<N.byteLength)break}return C}function readv(n,a,S,C){let N=typeof S==`function`?S:C;readvAsync(n,a,typeof S==`function`?null:S).then(n=>N(null,n.bytesRead,n.buffers),n=>N(n,0,a))}async function readvAsync(n,a,S){return{bytesRead:readvSync(n,a,S),buffers:a}}function writevSync(n,a,S){let C=0;for(let N of a){let a=writeSync(n,N,0,N.byteLength,S==null?null:S+C);C+=a}return C}function writev(n,a,S,C){let N=typeof S==`function`?S:C;writevAsync(n,a,typeof S==`function`?null:S).then(n=>N(null,n.bytesWritten,n.buffers),n=>N(n,0,a))}async function writevAsync(n,a,S){return{bytesWritten:writevSync(n,a,S),buffers:a}}function exists(n,a){try{statSync(normalizePath(n)),a(!0)}catch{a(!1)}}async function openAsBlob(n,a){let S=readFileSync(normalizePath(n));return new Blob([S],{type:a?.type??``})}var Rc=__esmMin(()=>{nl(),el(),tl(),Lc()}),zc=__exportAll$4({access:()=>access$1,appendFile:()=>appendFile$1,chmod:()=>chmod$1,chown:()=>chown$1,copyFile:()=>copyFile$1,cp:()=>cpPromises,default:()=>Vc,fchmod:()=>fchmodAsync,fchown:()=>fchownAsync,fdatasync:()=>fdatasyncAsync,fstat:()=>fstatAsync,fsync:()=>fsyncAsync,ftruncate:()=>ftruncateAsync,futimes:()=>futimesAsync,glob:()=>globAsync,lchmod:()=>lchmodAsync,lchown:()=>lchownAsync,link:()=>link$1,lstat:()=>lstat$1,lutimes:()=>lutimesAsync,mkdir:()=>mkdir$1,mkdtemp:()=>mkdtemp,open:()=>open$2,openAsBlob:()=>openAsBlob,opendir:()=>opendirAsync,promises_exports:()=>Bc,readFile:()=>readFile$1,readdir:()=>readdir$1,readlink:()=>readlink$1,readv:()=>readvAsync,realpath:()=>realpath$1,rename:()=>rename$1,rm:()=>rm$1,rmdir:()=>rmdir$1,stat:()=>stat$1,statfs:()=>statfsAsync,symlink:()=>symlink$1,truncate:()=>truncate$1,unlink:()=>unlink$1,utimes:()=>utimesAsync,watch:()=>watchAsync,write:()=>write$1,writeFile:()=>writeFile$1,writev:()=>writevAsync});async function mkdir$1(n,a){let S;typeof a==`object`&&(a.recursive&&(S=a.recursive),a.mode&&a.mode);let C=normalizePath(n);if(S)return mkdirRecursiveAsync(C);let N=wr.File.new_for_path(C);return new Promise((n,a)=>{N.make_directory_async(rt.PRIORITY_DEFAULT,null,(S,F)=>{try{N.make_directory_finish(F),n(void 0)}catch(n){a(createNodeError(n,`mkdir`,C))}})})}async function mkdirRecursiveAsync(n){let a=wr.File.new_for_path(n);try{return await new Promise((n,S)=>{a.make_directory_async(rt.PRIORITY_DEFAULT,null,(C,N)=>{try{a.make_directory_finish(N),n()}catch(n){S(n)}})}),n}catch(a){let S=a;if(S.code===wr.IOErrorEnum.EXISTS)return;if(S.code===wr.IOErrorEnum.NOT_FOUND){let S=_s(n);if(S===n)throw createNodeError(a,`mkdir`,n);let C=await mkdirRecursiveAsync(S),N=wr.File.new_for_path(n);return await new Promise((a,S)=>{N.make_directory_async(rt.PRIORITY_DEFAULT,null,(C,F)=>{try{N.make_directory_finish(F),a()}catch(a){S(createNodeError(a,`mkdir`,n))}})}),C??n}throw createNodeError(a,`mkdir`,n)}}async function readFile$1(n,a={encoding:null,flag:`r`}){let S=normalizePath(n),C=wr.File.new_for_path(S),N,F;try{[N,F]=await new Promise((n,a)=>{C.load_contents_async(null,(S,N)=>{try{n(C.load_contents_finish(N))}catch(n){a(n)}})})}catch(n){throw createNodeError(n,`open`,S)}if(!N)throw createNodeError(Error(`failed to read file`),`open`,S);return encodeUint8Array(getEncodingFromOptions(a,`buffer`),F)}async function mkdtemp(n,a){let S=getEncodingFromOptions(a),C=tempDirPath(n);return await mkdir$1(C,{recursive:!1,mode:448}),decode(C,S)}async function writeFile$1(n,a){let S=normalizePath(n),C=wr.File.new_for_path(S),N;N=typeof a==`string`?new TextEncoder().encode(a):a instanceof Uint8Array?a:new TextEncoder().encode(String(a));let F=await new Promise((n,a)=>{C.replace_async(null,!1,wr.FileCreateFlags.REPLACE_DESTINATION,rt.PRIORITY_DEFAULT,null,(N,F)=>{try{n(C.replace_finish(F))}catch(n){a(createNodeError(n,`open`,S))}})});if(N.length>0){let n=new rt.Bytes(N);await new Promise((a,C)=>{F.write_bytes_async(n,rt.PRIORITY_DEFAULT,null,(n,N)=>{try{F.write_bytes_finish(N),a()}catch(n){C(createNodeError(n,`write`,S))}})})}await new Promise((n,a)=>{F.close_async(rt.PRIORITY_DEFAULT,null,(C,N)=>{try{F.close_finish(N),n()}catch(n){a(createNodeError(n,`close`,S))}})})}async function rmdir$1(n,a){let S=normalizePath(n),C=wr.File.new_for_path(S);if((await new Promise((n,a)=>{C.query_info_async(`standard::type`,wr.FileQueryInfoFlags.NONE,rt.PRIORITY_DEFAULT,null,(N,F)=>{try{n(C.query_info_finish(F))}catch(n){a(createNodeError(n,`rmdir`,S))}})})).get_file_type()!==wr.FileType.DIRECTORY)throw createNodeError(Object.assign(Error(),{code:4}),`rmdir`,S);if((await new Promise((n,a)=>{C.enumerate_children_async(`standard::name`,wr.FileQueryInfoFlags.NONE,rt.PRIORITY_DEFAULT,null,(N,F)=>{try{n(C.enumerate_children_finish(F))}catch(n){a(createNodeError(n,`rmdir`,S))}})})).next_file(null)!==null)throw createNodeError(Object.assign(Error(),{code:5}),`rmdir`,S);await new Promise((n,a)=>{C.delete_async(rt.PRIORITY_DEFAULT,null,(N,F)=>{try{C.delete_finish(F),n()}catch(n){a(createNodeError(n,`rmdir`,S))}})})}async function unlink$1(n){let a=normalizePath(n),S=wr.File.new_for_path(a);await new Promise((n,C)=>{S.delete_async(rt.PRIORITY_DEFAULT,null,(N,F)=>{try{S.delete_finish(F),n()}catch(n){C(createNodeError(n,`unlink`,a))}})})}async function open$2(n,a,S){return new $c({path:n,flags:a,mode:S})}async function write$1(n,a,S,C,N){return typeof a==`string`?_writeStr(n,a,S,C):_writeBuf(n,a,S,C,N)}async function _writeBuf(n,a,S,C,N){return{bytesWritten:(await $c.getInstance(n).write(a,S,C,N)).bytesWritten,buffer:a}}async function _writeStr(n,a,S,C){return{bytesWritten:(await $c.getInstance(n).write(a,S,C)).bytesWritten,buffer:a}}function queryInfoAsync(n,a,S,C){let N=normalizePath(n);return new Promise((n,F)=>{let I=wr.File.new_for_path(N);I.query_info_async(Tc,a,rt.PRIORITY_DEFAULT,null,(a,H)=>{try{let a=I.query_info_finish(H);n(C?.bigint?new BigIntStats(a,N):new Stats(a,N))}catch(n){F(createNodeError(n,S,N))}})})}async function stat$1(n,a){return queryInfoAsync(n,wr.FileQueryInfoFlags.NONE,`stat`,a)}async function lstat$1(n,a){return queryInfoAsync(n,wr.FileQueryInfoFlags.NOFOLLOW_SYMLINKS,`lstat`,a)}async function readdir$1(n,a){try{return readdirSync(n,a)}catch(a){throw createNodeError(a,`scandir`,n)}}async function realpath$1(n){return realpathSync(n)}async function symlink$1(n,a,S){let C=normalizePath(a),N=normalizePath(n);return new Promise((n,a)=>{let S=wr.File.new_for_path(C);S.make_symbolic_link_async(N,rt.PRIORITY_DEFAULT,null,(F,I)=>{try{S.make_symbolic_link_finish(I),n()}catch(n){a(createNodeError(n,`symlink`,N,C))}})})}async function rm$1(n,a){let S=normalizePath(n),C=wr.File.new_for_path(S),N=a?.recursive||!1,F=a?.force||!1,I;try{I=C.query_file_type(wr.FileQueryInfoFlags.NOFOLLOW_SYMLINKS,null)}catch(a){if(F)return;throw createNodeError(a,`rm`,n)}if(I===wr.FileType.SYMBOLIC_LINK){await new Promise((a,S)=>{C.delete_async(rt.PRIORITY_DEFAULT,null,(N,I)=>{try{C.delete_finish(I),a()}catch(C){if(F){a();return}S(createNodeError(C,`rm`,n))}})});return}if(I===wr.FileType.DIRECTORY){let C=await readdir$1(n,{withFileTypes:!0});if(!N&&C.length)throw createNodeError(Object.assign(Error(),{code:5}),`rm`,n);for(let n of C)typeof n!=`string`&&await rm$1(ms(S,n.name),a)}await new Promise((a,S)=>{C.delete_async(rt.PRIORITY_DEFAULT,null,(N,I)=>{try{C.delete_finish(I),a()}catch(C){if(F){a();return}S(createNodeError(C,`rm`,n))}})})}async function rename$1(n,a){renameSync(n,a)}async function copyFile$1(n,a,S){copyFileSync(n,a,S)}async function access$1(n,a){accessSync(n,a)}async function appendFile$1(n,a,S){appendFileSync(n,a,S)}async function readlink$1(n,a){return readlinkSync(n,a)}async function truncate$1(n,a){truncateSync(n,a)}async function chmod$1(n,a){chmodSync(n,a)}async function chown$1(n,a,S){chownSync(n,a,S)}async function link$1(n,a){linkSync(n,a)}var Bc,Vc,Hc=__esmMin(()=>{Sc(),Cc(),nl(),il(),Ec(),el(),Oc(),tl(),kc(),jc(),Mc(),Fc(),Lc(),Rc(),it(),Tr(),Ts(),Bc=xc({access:()=>access$1,appendFile:()=>appendFile$1,chmod:()=>chmod$1,chown:()=>chown$1,copyFile:()=>copyFile$1,cp:()=>cpPromises,default:()=>Vc,fchmod:()=>fchmodAsync,fchown:()=>fchownAsync,fdatasync:()=>fdatasyncAsync,fstat:()=>fstatAsync,fsync:()=>fsyncAsync,ftruncate:()=>ftruncateAsync,futimes:()=>futimesAsync,glob:()=>globAsync,lchmod:()=>lchmodAsync,lchown:()=>lchownAsync,link:()=>link$1,lstat:()=>lstat$1,lutimes:()=>lutimesAsync,mkdir:()=>mkdir$1,mkdtemp:()=>mkdtemp,open:()=>open$2,openAsBlob:()=>openAsBlob,opendir:()=>opendirAsync,readFile:()=>readFile$1,readdir:()=>readdir$1,readlink:()=>readlink$1,readv:()=>readvAsync,realpath:()=>realpath$1,rename:()=>rename$1,rm:()=>rm$1,rmdir:()=>rmdir$1,stat:()=>stat$1,statfs:()=>statfsAsync,symlink:()=>symlink$1,truncate:()=>truncate$1,unlink:()=>unlink$1,utimes:()=>utimesAsync,watch:()=>watchAsync,write:()=>write$1,writeFile:()=>writeFile$1,writev:()=>writevAsync}),__name$1(mkdir$1,`mkdir`),__name$1(readFile$1,`readFile`),__name$1(writeFile$1,`writeFile`),__name$1(rmdir$1,`rmdir`),__name$1(unlink$1,`unlink`),__name$1(open$2,`open`),__name$1(write$1,`write`),__name$1(stat$1,`stat`),__name$1(lstat$1,`lstat`),__name$1(readdir$1,`readdir`),__name$1(realpath$1,`realpath`),__name$1(symlink$1,`symlink`),__name$1(rm$1,`rm`),__name$1(rename$1,`rename`),__name$1(copyFile$1,`copyFile`),__name$1(access$1,`access`),__name$1(appendFile$1,`appendFile`),__name$1(readlink$1,`readlink`),__name$1(truncate$1,`truncate`),__name$1(chmod$1,`chmod`),__name$1(chown$1,`chown`),__name$1(link$1,`link`),Vc={readFile:readFile$1,mkdir:mkdir$1,mkdtemp,realpath:realpath$1,readdir:readdir$1,writeFile:writeFile$1,rmdir:rmdir$1,unlink:unlink$1,open:open$2,write:write$1,rm:rm$1,lstat:lstat$1,symlink:symlink$1,stat:stat$1,rename:rename$1,copyFile:copyFile$1,access:access$1,appendFile:appendFile$1,readlink:readlink$1,truncate:truncate$1,chmod:chmod$1,chown:chown$1,link:link$1,cp:cpPromises,opendir:opendirAsync,glob:globAsync,watch:watchAsync,statfs:statfsAsync,utimes:utimesAsync,lutimes:lutimesAsync,lchown:lchownAsync,lchmod:lchmodAsync,fstat:fstatAsync,ftruncate:ftruncateAsync,fdatasync:fdatasyncAsync,fsync:fsyncAsync,fchmod:fchmodAsync,fchown:fchownAsync,futimes:futimesAsync,readv:readvAsync,writev:writevAsync,openAsBlob}});function parseOptsCb(n,a){return typeof n==`function`?{options:{},callback:n}:{options:n??{},callback:a}}function statImpl(n,a,S,C,N){let F=normalizePath(n),I=wr.File.new_for_path(F);I.query_info_async(Tc,a,rt.PRIORITY_DEFAULT,null,(n,a)=>{try{let n=I.query_info_finish(a);N(null,C?.bigint?new BigIntStats(n,F):new Stats(n,F))}catch(n){N(createNodeError(n,S,F))}})}function stat(n,a,S){let{options:C,callback:N}=parseOptsCb(a,S);statImpl(n,wr.FileQueryInfoFlags.NONE,`stat`,C,N)}function lstat(n,a,S){let{options:C,callback:N}=parseOptsCb(a,S);statImpl(n,wr.FileQueryInfoFlags.NOFOLLOW_SYMLINKS,`lstat`,C,N)}function readdir(n,a,S){let{options:C,callback:N}=parseOptsCb(a,S);Promise.resolve().then(()=>{try{N(null,readdirSync(n,C))}catch(a){N(createNodeError(a,`readdir`,n))}})}function realpath(n,a,S){let{callback:C}=parseOptsCb(a,S);Promise.resolve().then(()=>{try{C(null,realpathSync(n))}catch(n){C(n)}})}function symlink(n,a,S,C){let N=typeof S==`function`?S:C;if(typeof N!=`function`)throw TypeError(`Callback must be a function. Received `+typeof N);let F=normalizePath(a),I=normalizePath(n),H=wr.File.new_for_path(F);H.make_symbolic_link_async(I,rt.PRIORITY_DEFAULT,null,(n,a)=>{try{H.make_symbolic_link_finish(a),N(null)}catch(n){N(createNodeError(n,`symlink`,I,F))}})}function open$1(n,...a){let S,C,N;switch(a.length){case 1:N=a[0];break;case 2:S=a[0],N=a[1];break;case 3:S=a[0],C=a[1],N=a[2];break;default:break}open$2(n,S,C).then(n=>{N(null,n.fd)}).catch(n=>{N(n,-1)})}function write(n,a,...S){let C=$c.getInstance(n);if(typeof a==`string`){let n=S.pop(),N=S[0],F=S[1];C.write(a,N,F).then(a=>{n(null,a.bytesWritten,a.buffer)}).catch(a=>{n(a,0,``)});return}let N=S[S.length-1],F=S[0],I=S[1],H=S[2];C.write(a,F,I,H).then(n=>{N(null,n.bytesWritten,n.buffer)}).catch(n=>{N(n,0,Ge.from([]))})}function read$1(n,...a){let S=$c.getInstance(n),C=a[a.length-1],N,F,I,H;if(!(a.length<=1))if(typeof a[0]==`object`&&!ArrayBuffer.isView(a[0])){let n=a[0];N=n.buffer,F=n.offset,I=n.length,H=n.position}else N=a[0],F=a[1],I=a[2],H=a[3];S.read(N,F,I,H).then(n=>{C(null,n.bytesRead,n.buffer)}).catch(n=>{C(n,0,Ge.from([]))})}function close$1(n,a){$c.getInstance(n).close().then(()=>{a(null)}).catch(n=>a(n))}function rm(n,...a){let S={},C=a[a.length-1];a.length>=2&&(S=a[0]),rm$1(n,S).then(()=>{C(null)}).catch(n=>{C(n)})}function rename(n,a,S){Promise.resolve().then(()=>{try{renameSync(n,a),S(null)}catch(n){S(n)}})}function copyFile(n,a,S,C){let N=typeof S==`function`?0:S,F=typeof S==`function`?S:C;Promise.resolve().then(()=>{try{copyFileSync(n,a,N),F(null)}catch(n){F(n)}})}function access(n,a,S){let C=typeof a==`function`?void 0:a,N=typeof a==`function`?a:S;Promise.resolve().then(()=>{try{accessSync(n,C),N(null)}catch(n){N(n)}})}function appendFile(n,a,S,C){let N=typeof S==`function`?S:C,F=typeof S==`function`?void 0:S;Promise.resolve().then(()=>{try{appendFileSync(n,a,F),N(null)}catch(n){N(n)}})}function readlink(n,a,S){let C=typeof a==`function`?a:S,N=typeof a==`function`?void 0:a;Promise.resolve().then(()=>{try{C(null,readlinkSync(n,N))}catch(n){C(n,``)}})}function truncate(n,a,S){let C=typeof a==`function`?0:a,N=typeof a==`function`?a:S;Promise.resolve().then(()=>{try{truncateSync(n,C),N(null)}catch(n){N(n)}})}function chmod(n,a,S){Promise.resolve().then(()=>{try{chmodSync(n,a),S(null)}catch(n){S(n)}})}function chown(n,a,S,C){Promise.resolve().then(()=>{try{chownSync(n,a,S),C(null)}catch(n){C(n)}})}function mkdir(n,a,S){let C=typeof a==`function`?a:S,N=typeof a==`function`?void 0:a;Promise.resolve().then(()=>{try{mkdirSync(n,N),C(null)}catch(n){C(n)}})}function rmdir(n,a,S){let C=typeof a==`function`?a:S,N=typeof a==`function`?void 0:a;Promise.resolve().then(()=>{try{rmdirSync(n,N),C(null)}catch(n){C(n)}})}function readFile(n,a,S){let C=typeof a==`function`?a:S,N=typeof a==`function`?void 0:a,F=normalizePath(n);Promise.resolve().then(()=>{try{let n=typeof N==`string`?{encoding:N,flag:`r`}:{encoding:N?.encoding??null,flag:N?.flag??`r`};C(null,readFileSync(F,n))}catch(n){C(n,null)}})}function writeFile(n,a,S,C){let N=typeof S==`function`?S:C,F=normalizePath(n);Promise.resolve().then(()=>{try{writeFileSync(F,a),N(null)}catch(n){N(n)}})}function link(n,a,S){Promise.resolve().then(()=>{try{linkSync(n,a),S(null)}catch(n){S(n)}})}function unlink(n,a){let S=normalizePath(n);Promise.resolve().then(()=>{rt.unlink(S),a(null)})}var Uc=__esmMin(()=>{nl(),Ec(),el(),Oc(),tl(),Hc(),it(),Tr(),et(),__name$1(open$1,`open`),__name$1(read$1,`read`),__name$1(close$1,`close`)});function toPathIfFileURL(n){return normalizePath(n)}function createWriteStream(n,a){return new WriteStream$1(n,a)}var Wc,Gc,WriteStream$1,Kc=__esmMin(()=>{nl(),Uc(),ni(),Wc=Symbol(`kIsPerformingIO`),Gc=Symbol(`kIoDone`),WriteStream$1=class extends Zr{static{__name$1(this,`WriteStream`)}close(n,a=null){this.fd?(close$1(this.fd,S=>{n(S||a)}),this.fd=null):n(a)}bytesWritten=0;path;pending;fd=null;flags=`w`;mode=438;pos=0;[Wc]=!1;constructor(n,a={}){super(a),this.path=toPathIfFileURL(n),a.encoding&&this.setDefaultEncoding(a.encoding)}_construct(n){open$1(this.path.toString(),this.flags,this.mode,(a,S)=>{if(a){n(a);return}this.fd=S,n(),this.emit(`open`,this.fd),this.emit(`ready`)})}_write(n,a,S){this[Wc]=!0,write(this.fd,n,0,n.length,this.pos,(n,a)=>{if(this[Wc]=!1,this.destroyed)return S(n),this.emit(Gc,n);if(n)return S(n);this.bytesWritten+=a,S()}),this.pos!==void 0&&(this.pos+=n.length)}_destroy(n,a){this[Wc]?this.once(Gc,S=>this.close(a,n||S)):this.close(a,n)}}});function resolveIOMode(n){if(n==null)return`r`;if(typeof n==`number`){let a=(n&2)!=0,S=(n&1)!=0,C=(n&1024)!=0,N=(n&512)!=0;return a?N?`w+`:`r+`:S?C?`a`:`w`:`r`}switch(n){case`ax`:case`wx`:return`w`;case`ax+`:case`wx+`:return`w+`;case`as`:case`rs+`:return`r+`;case`as+`:return`a+`;default:return n}}function shouldCreate(n){return typeof n==`number`?(n&64)!=0:typeof n==`string`?n===`w`||n===`w+`||n===`wx`||n===`wx+`||n===`a`||n===`a+`||n===`ax`||n===`ax+`||n===`as`||n===`as+`:!1}function openIOChannel(n,a,S){try{return rt.IOChannel.new_file(n,a)}catch(C){if(S&&a===`r+`&&C?.code===rt.FileError.NOENT)return rt.file_set_contents(n,new Uint8Array),rt.IOChannel.new_file(n,a);throw C}}function mapOpenError(n,a){return createGLibFileError(n,`open`,{path:a})}var qc=__esmMin(()=>{it(),Ae()});function createInterface$1(n,a,S,C){return typeof n==`object`&&n&&!(`read`in n&&typeof n.read==`function`)?new Interface$1(n):new Interface$1({input:n,output:a,completer:S,terminal:C})}function*emitKeys(n){for(;;){let a=yield,S=a,C=!1,N={sequence:``,name:void 0,ctrl:!1,meta:!1,shift:!1};if(a===`\x1B`&&(C=!0,S+=a=yield,a===`\x1B`&&(S+=a=yield)),C&&(a===`O`||a===`[`)){let n=a,C=0;if(a===`O`)S+=a=yield,a>=`0`&&a<=`9`&&(C=a.charCodeAt(0)-1,S+=a=yield),n+=a;else if(a===`[`){S+=a=yield,a===`[`&&(n+=a,S+=a=yield);let N=S.length-1;a>=`0`&&a<=`9`&&(S+=a=yield,a>=`0`&&a<=`9`&&(S+=a=yield,a>=`0`&&a<=`9`&&(S+=a=yield))),a===`;`&&(S+=a=yield,a>=`0`&&a<=`9`&&(S+=yield));let F=S.slice(N),I;(I=/^(?:(\d\d?)(?:;(\d))?([~^$])|(\d{3}~))$/.exec(F))?I[4]?n+=I[4]:(n+=I[1]+I[3],C=(parseInt(I[2]??`1`,10)||1)-1):(I=/^((\d;)?(\d))?([A-Za-z])$/.exec(F))?(n+=I[4],C=(parseInt(I[3]??`1`,10)||1)-1):n+=F}switch(N.ctrl=!!(C&4),N.meta=!!(C&10),N.shift=!!(C&1),N.code=n,n){case`[P`:case`OP`:case`[11~`:case`[[A`:N.name=`f1`;break;case`[Q`:case`OQ`:case`[12~`:case`[[B`:N.name=`f2`;break;case`[R`:case`OR`:case`[13~`:case`[[C`:N.name=`f3`;break;case`[S`:case`OS`:case`[14~`:case`[[D`:N.name=`f4`;break;case`[15~`:case`[[E`:N.name=`f5`;break;case`[17~`:N.name=`f6`;break;case`[18~`:N.name=`f7`;break;case`[19~`:N.name=`f8`;break;case`[20~`:N.name=`f9`;break;case`[21~`:N.name=`f10`;break;case`[23~`:N.name=`f11`;break;case`[24~`:N.name=`f12`;break;case`[200~`:N.name=`paste-start`;break;case`[201~`:N.name=`paste-end`;break;case`[A`:case`OA`:N.name=`up`;break;case`[B`:case`OB`:N.name=`down`;break;case`[C`:case`OC`:N.name=`right`;break;case`[D`:case`OD`:N.name=`left`;break;case`[E`:case`OE`:N.name=`clear`;break;case`[F`:case`OF`:N.name=`end`;break;case`[H`:case`OH`:N.name=`home`;break;case`[1~`:N.name=`home`;break;case`[2~`:N.name=`insert`;break;case`[3~`:N.name=`delete`;break;case`[4~`:N.name=`end`;break;case`[5~`:case`[[5~`:N.name=`pageup`;break;case`[6~`:case`[[6~`:N.name=`pagedown`;break;case`[7~`:N.name=`home`;break;case`[8~`:N.name=`end`;break;case`[a`:N.name=`up`,N.shift=!0;break;case`[b`:N.name=`down`,N.shift=!0;break;case`[c`:N.name=`right`,N.shift=!0;break;case`[d`:N.name=`left`,N.shift=!0;break;case`[2$`:N.name=`insert`,N.shift=!0;break;case`[3$`:N.name=`delete`,N.shift=!0;break;case`[5$`:N.name=`pageup`,N.shift=!0;break;case`[6$`:N.name=`pagedown`,N.shift=!0;break;case`[7$`:N.name=`home`,N.shift=!0;break;case`[8$`:N.name=`end`,N.shift=!0;break;case`Oa`:N.name=`up`,N.ctrl=!0;break;case`Ob`:N.name=`down`,N.ctrl=!0;break;case`Oc`:N.name=`right`,N.ctrl=!0;break;case`Od`:N.name=`left`,N.ctrl=!0;break;case`[2^`:N.name=`insert`,N.ctrl=!0;break;case`[3^`:N.name=`delete`,N.ctrl=!0;break;case`[5^`:N.name=`pageup`,N.ctrl=!0;break;case`[6^`:N.name=`pagedown`,N.ctrl=!0;break;case`[7^`:N.name=`home`,N.ctrl=!0;break;case`[8^`:N.name=`end`,N.ctrl=!0;break;case`[Z`:N.name=`tab`,N.shift=!0;break;default:N.name=`undefined`;break}}else a===`\r`?(N.name=`return`,N.meta=C):a===`
|
|
38
|
+
`?(N.name=`enter`,N.meta=C):a===` `?(N.name=`tab`,N.meta=C):a===`\b`||a===``?(N.name=`backspace`,N.meta=C):a===`\x1B`?(N.name=`escape`,N.meta=C):a===` `?(N.name=`space`,N.meta=C):!C&&a<=``?(N.name=String.fromCharCode(a.charCodeAt(0)+97-1),N.ctrl=!0):/^[0-9A-Za-z]$/.test(a)?(N.name=a.toLowerCase(),N.shift=/^[A-Z]$/.test(a),N.meta=C):C&&(N.name=a.length?void 0:`escape`,N.meta=!0);N.sequence=S,S.length!==0&&(N.name!==void 0||C)?n.emit(`keypress`,C?void 0:S,N):S.length===1&&n.emit(`keypress`,S,N)}}function emitKeypressEvents(n,a={}){let S=n;if(S[Xc])return;S[Xc]=new It(`utf8`),S[Zc]=emitKeys(n),S[Zc].next();let C=a.escapeCodeTimeout??500,N,triggerEscape=()=>S[Zc].next(``);function onData(a){if(n.listenerCount(`keypress`)>0){let F=S[Xc].write(typeof a==`string`?Buffer.from(a):a);if(F){clearTimeout(N);for(let a of F)try{S[Zc].next(a),a===`\x1B`&&(N=setTimeout(triggerEscape,C))}catch{S[Zc]=emitKeys(n),S[Zc].next()}}}else n.removeListener(`data`,onData),delete S[Xc],delete S[Zc]}n.on(`data`,onData)}var Jc,Interface$1,Yc,Xc,Zc,Qc=__esmMin(()=>{Ft(),Lt(),Jc=/\r\n|\r|\n/,Interface$1=class extends wt{static{__name$1(this,`Interface`)}terminal;line=``;cursor=0;escapeCodeTimeout;_input;_output;get input(){return this._input}get output(){return this._output}_prompt;_closed=!1;_paused=!1;history;_historySize;_crlfDelay;_lineBuffer=``;_questionCallback=null;_boundOnData=null;_boundOnEnd=null;_boundOnError=null;_boundOnKeypress=null;constructor(n,a){super();let S;if(S=n&&typeof n==`object`&&!(`read`in n&&typeof n.read==`function`)?n:{input:n,output:a},this._input=S.input||null,this._output=S.output||null,this._prompt=S.prompt||`> `,this.terminal=S.terminal??this._output!==null,this._historySize=S.historySize??30,this.history=[],this._crlfDelay=S.crlfDelay??100,this.escapeCodeTimeout=S.escapeCodeTimeout,this._input&&(this._boundOnData=n=>this._onData(n),this._boundOnEnd=()=>this._onEnd(),this._boundOnError=n=>this.emit(`error`,n),this._input.on(`data`,this._boundOnData),this._input.on(`end`,this._boundOnEnd),this._input.on(`error`,this._boundOnError),`setEncoding`in this._input&&typeof this._input.setEncoding==`function`&&this._input.setEncoding(`utf8`),this.terminal)){emitKeypressEvents(this._input,this);let n=this._input;typeof n.setRawMode==`function`&&(n.isRaw||n.setRawMode(!0)),typeof this._input.resume==`function`&&this._input.resume(),this._boundOnKeypress=(n,a)=>{a&&(a.name===`backspace`||a.name===`delete`?this.cursor>0&&(this.line=this.line.slice(0,this.cursor-1)+this.line.slice(this.cursor),this.cursor--):n&&n.length===1&&!a.ctrl&&!a.meta&&a.name!==`return`&&a.name!==`enter`&&a.name!==`escape`&&(this.line=this.line.slice(0,this.cursor)+n+this.line.slice(this.cursor),this.cursor++))},this._input.on(`keypress`,this._boundOnKeypress)}}_onData(n){if(this._closed||this._paused)return;let a=typeof n==`string`?n:n.toString(`utf8`);this._lineBuffer+=a;let S;for(;(S=Jc.exec(this._lineBuffer))!==null;){let n=this._lineBuffer.substring(0,S.index);this._lineBuffer=this._lineBuffer.substring(S.index+S[0].length),this._onLine(n)}}_onLine(n){if(n.length>0&&this._historySize>0&&(this.history.length===0||this.history[0]!==n)&&(this.history.unshift(n),this.history.length>this._historySize&&this.history.pop()),this._questionCallback){let a=this._questionCallback;this._questionCallback=null,a(n)}this.emit(`line`,n)}_onEnd(){this._lineBuffer.length>0&&(this._onLine(this._lineBuffer),this._lineBuffer=``),this.close()}setPrompt(n){this._prompt=n}getPrompt(){return this._prompt}prompt(n){if(this._closed)throw Error(`readline was closed`);this._output?.write(this._prompt)}question(n,a,S){if(this._closed)throw Error(`readline was closed`);let C=typeof a==`function`?a:S;this._questionCallback=C,this._output?.write(n)}clearLine(n,a){return this.line=``,this.cursor=0,a&&a(),!0}write(n,a){if(!this._closed){if(a){this._input&&this._input.emit(`keypress`,n??``,a);return}if(n!=null){let a=typeof n==`string`?n:n.toString(`utf8`);a&&(this.line=this.line.slice(0,this.cursor)+a+this.line.slice(this.cursor),this.cursor+=a.length),this._output?.write(n)}}}close(){if(!this._closed){if(this._closed=!0,this._input){this._boundOnData&&this._input.removeListener(`data`,this._boundOnData),this._boundOnEnd&&this._input.removeListener(`end`,this._boundOnEnd),this._boundOnError&&this._input.removeListener(`error`,this._boundOnError),this._boundOnKeypress&&this._input.removeListener(`keypress`,this._boundOnKeypress),this._boundOnData=null,this._boundOnEnd=null,this._boundOnError=null,this._boundOnKeypress=null;let n=this._input;this.terminal&&n.isRaw&&typeof n.setRawMode==`function`&&n.setRawMode(!1),typeof this._input.pause==`function`&&this._input.pause()}this.emit(`close`)}}pause(){return this._closed?this:(this._paused=!0,this._input&&`pause`in this._input&&typeof this._input.pause==`function`&&this._input.pause(),this.emit(`pause`),this)}resume(){return this._closed?this:(this._paused=!1,this._input&&`resume`in this._input&&typeof this._input.resume==`function`&&this._input.resume(),this.emit(`resume`),this)}getCursorPos(){let n=this._output?.columns??80,a=this._prompt.length+this.cursor;return{rows:Math.floor(a/n),cols:a%n}}[Symbol.asyncIterator](){let n=[],a=null,S=!1,onLine=S=>{if(a){let n=a;a=null,n({value:S,done:!1})}else n.push(S)},onClose=()=>{if(S=!0,a){let n=a;a=null,n({value:void 0,done:!0})}};return this.on(`line`,onLine),this.on(`close`,onClose),{next:()=>n.length>0?Promise.resolve({value:n.shift(),done:!1}):S?Promise.resolve({value:void 0,done:!0}):new Promise(n=>{a=n}),return:()=>(S=!0,this.removeListener(`line`,onLine),this.removeListener(`close`,onClose),Promise.resolve({value:void 0,done:!0})),[Symbol.asyncIterator](){return this}}}},Yc=Symbol.dispose??Symbol.for(`Symbol.dispose`),Interface$1.prototype[Yc]=function(){this.close()},__name$1(createInterface$1,`createInterface`),Xc=Symbol(`keypress-decoder`),Zc=Symbol(`escape-decoder`)}),$c,el=__esmMin(()=>{Cc(),nl(),Dc(),Kc(),Ec(),qc(),tl(),it(),Tr(),et(),Qc(),$c=class FileHandle{options;_file;_ioStream=null;_readStream=null;_gFile;_ioMode;_readPos=0;_ioLock=Promise.resolve();static instances={};constructor(n){this.options=n,this.options.flags||=`r`,this.options.mode||=438;let a=normalizePath(n.path),S=shouldCreate(n.flags),C=resolveIOMode(n.flags);try{this._file=openIOChannel(a,C,S)}catch(n){throw mapOpenError(n,a)}return this._file.set_encoding(null),this.fd=this._file.unix_get_fd(),this._gFile=wr.File.new_for_path(a),this._ioMode=C,FileHandle.instances[this.fd]=this,FileHandle.getInstance(this.fd)}_getReadStream(){return this._ioStream?{input:this._ioStream.get_input_stream(),seekable:this._ioStream}:this._ioMode===`r`?(this._readStream||=this._gFile.read(null),{input:this._readStream,seekable:this._readStream}):(this._ioStream=this._gFile.open_readwrite(null),{input:this._ioStream.get_input_stream(),seekable:this._ioStream})}_getWriteStream(){if(this._ioStream)return this._ioStream;if(this._ioMode===`r`)throw Error(`FileHandle opened read-only; cannot write`);return this._ioStream=this._gFile.open_readwrite(null),this._ioStream}_serialize(n){let a=this._ioLock.catch(()=>{}).then(n);return this._ioLock=a,a}fd;static getInstance(n){if(!FileHandle.instances[n])throw Error(`No instance found for fd!`);return FileHandle.instances[n]}async appendFile(n,a){let S=getEncodingFromOptions(a);typeof n==`string`&&(n=Ge.from(n)),S&&this._file.set_encoding(S);let[C,N]=this._file.write_chars(n,n.length);if(C===rt.IOStatus.ERROR)throw Error(`Error on append to file!`)}async chown(n,a){chownSync(normalizePath(this.options.path),n,a)}async chmod(n){chmodSync(normalizePath(this.options.path),n)}createReadStream(n){return new ReadStream$1(this.options.path,n)}createWriteStream(n){return new WriteStream$1(this.options.path,n)}async datasync(){this._file.flush()}async sync(){this._file.flush()}async read(...n){let a,S,C,N;if(typeof n[0]==`object`&&!(n[0]instanceof Uint8Array)&&!(n[0]instanceof Ge)){let F=n[0];a=F.buffer,S=F.offset,C=F.length,N=F.position}else a=n[0],S=n[1],C=n[2],N=n[3];let F=a,I=S??0,H=C??F?.byteLength??65536,W=N??0;return this._serialize(async()=>{let{input:n,seekable:S}=this._getReadStream();S.seek(BigInt(W),rt.SeekType.SET,null);let C=n.read_bytes(H,null).get_data(),N=C?.length??0;return F&&C&&N>0&&F.set(C,I),{bytesRead:N,buffer:a}})}readableWebStream(){let n=globalThis.ReadableStream;if(typeof n!=`function`)throw Error(`readableWebStream() requires a global ReadableStream. Import "node:stream/web" or "@gjsify/streams" before calling this method.`);return new n}async readFile(n){let a=getEncodingFromOptions(n,`buffer`);a&&this._file.set_encoding(a);let[S,C]=this._file.read_to_end();if(S===rt.IOStatus.ERROR)throw Error(`Error on read from file!`);return encodeUint8Array(a,C)}readLines(n){return createInterface$1({input:this.createReadStream(n),crlfDelay:1/0})}async stat(n){let a=await new Promise((n,a)=>{this._gFile.query_info_async(Tc,wr.FileQueryInfoFlags.NONE,rt.PRIORITY_DEFAULT,null,(S,C)=>{try{n(this._gFile.query_info_finish(C))}catch(n){a(n)}})}),S=normalizePath(this.options.path);return n?.bigint?new BigIntStats(a,S):new Stats(a,S)}async truncate(n=0){let a=Math.max(0,n);this._file.flush(),this._getWriteStream().get_output_stream().truncate(a,null)}async utimes(n,a){let{utimesSync:S}=await Promise.resolve().then(()=>(Lc(),Ic));S(normalizePath(this.options.path),n,a)}async writeFile(n,a){let S=getEncodingFromOptions(a),C;C=typeof n==`string`?Ge.from(n,S||`utf8`):n,this._file.seek_position(0,rt.SeekType.SET);let[N]=this._file.write_chars(C,C.length);if(N===rt.IOStatus.ERROR)throw Error(`Error writing to file!`);this._file.flush()}async write(n,...a){let S=null,C=null,N=null,F=null;typeof n==`string`?(S=a[0],C=a[1]):(N=a[0],F=a[1],S=a[2]),C=getEncodingFromOptions(C,typeof n==`string`?`utf8`:null);let I;I=typeof n==`string`?new TextEncoder().encode(n):n;let H=N??0,W=F??I.byteLength-H,K=I.slice(H,H+W),q=S??0;return{bytesWritten:await this._serialize(async()=>{let n=this._getWriteStream();n.seek(BigInt(q),rt.SeekType.SET,null);let a=n.get_output_stream(),S=await new Promise((n,S)=>{a.write_bytes_async(new rt.Bytes(K),rt.PRIORITY_DEFAULT,null,(C,N)=>{try{n(a.write_bytes_finish(N))}catch(n){S(n)}})});return await new Promise((n,S)=>{a.flush_async(rt.PRIORITY_DEFAULT,null,(C,N)=>{try{a.flush_finish(N),n()}catch(n){S(n)}})}),S}),buffer:n}}async writev(n,a){let S=0;for(let C of n){let n=Ge.from(C.buffer,C.byteOffset,C.byteLength),N=await this.write(n,0,n.byteLength,a==null?null:a+S);S+=N.bytesWritten}return{bytesWritten:S,buffers:n}}async readv(n,a){let S=0;for(let C of n){let n=await this.read({buffer:Ge.from(C.buffer,C.byteOffset,C.byteLength),position:a==null?null:a+S});if(S+=n.bytesRead,n.bytesRead<C.byteLength)break}return{bytesRead:S,buffers:n}}_flushSync(){this._file.flush()}_closeSync(){try{this._ioStream?.close(null)}catch{}try{this._readStream?.close(null)}catch{}this._ioStream=null,this._readStream=null;try{this._file.shutdown(!0)}catch{}let n=FileHandle;delete n.instances[this.fd]}_readSync(n,a,S,C){let N=this._gFile.read(null);try{let F=C!==null&&C>=0,I=F?C:this._readPos;I>0&&N.seek(I,rt.SeekType.SET,null);let H=N.read_bytes(S,null).get_data()??new Uint8Array;return new Uint8Array(n.buffer,n.byteOffset+a).set(H.subarray(0,H.length)),F||(this._readPos+=H.length),H.length}finally{N.close(null)}}_writeSync(n,a){let S=this._gFile.open_readwrite(null);try{return a!==null&&a>=0&&S.seek(a,rt.SeekType.SET,null),S.get_output_stream().write_bytes(rt.Bytes.new(n),null)}finally{S.close(null)}}async close(){try{this._ioStream?.close(null)}catch{}try{this._readStream?.close(null)}catch{}this._ioStream=null,this._readStream=null;try{this._file.shutdown(!0)}catch{}}async[Symbol.asyncDispose](){await this.close()}pull(...n){throw Error('FileHandle.pull() is not implemented in @gjsify/fs yet — requires `node:stream/iter` (Node 25.9+) which @gjsify/stream has not ported. Track gjsify Open TODO "Node 25 stream/iter integration".')}writer(n){throw Error('FileHandle.writer() is not implemented in @gjsify/fs yet — requires `node:stream/iter` (Node 25.9+) which @gjsify/stream has not ported. Track gjsify Open TODO "Node 25 stream/iter integration".')}}});function statSync(n,a){let S=normalizePath(n);try{let n=wr.File.new_for_path(S).query_info(Tc,wr.FileQueryInfoFlags.NONE,null);return a?.bigint?new BigIntStats(n,S):new Stats(n,S)}catch(n){if(a?.throwIfNoEntry===!1&&isNotFoundError(n))return;throw createNodeError(n,`stat`,S)}}function lstatSync(n,a){let S=normalizePath(n);try{let n=wr.File.new_for_path(S).query_info(Tc,wr.FileQueryInfoFlags.NOFOLLOW_SYMLINKS,null);return a?.bigint?new BigIntStats(n,S):new Stats(n,S)}catch(n){if(a?.throwIfNoEntry===!1&&isNotFoundError(n))return;throw createNodeError(n,`lstat`,S)}}function readdirSync(n,a){let S=normalizePath(n),C=wr.File.new_for_path(S).enumerate_children(`standard::name,standard::type`,wr.FileQueryInfoFlags.NOFOLLOW_SYMLINKS,null),N=[];try{let n=C.next_file(null);for(;n!==null;)N.push({name:n.get_name(),type:n.get_file_type()}),n=C.next_file(null)}finally{try{C.close(null)}catch{}}let F=[];for(let n of N){let C=ms(S,n.name);if(a?.withFileTypes?F.push(new Dirent(C,n.name,n.type)):F.push(n.name),a?.recursive&&n.type===wr.FileType.DIRECTORY){let S=readdirSync(C,a);for(let a of S)typeof a==`string`?F.push(ms(n.name,a)):F.push(a)}}return F}function realpathSync(n){let a=normalizePath(n),S=wr.File.new_for_path(a),C=0;for(;;){let n=S.query_info(`standard::is-symlink,standard::symlink-target`,wr.FileQueryInfoFlags.NOFOLLOW_SYMLINKS,null);if(!n.get_is_symlink())return S.get_path();let N=n.get_symlink_target(),F=S.get_parent();if(S=F?F.resolve_relative_path(N):wr.File.new_for_path(N),++C>40)throw Error(`ELOOP: too many levels of symbolic links, realpath '${a}'`)}}function symlinkSync(n,a,S){let C=normalizePath(a),N=normalizePath(n);wr.File.new_for_path(C).make_symbolic_link(N,null)}function readFileSync(n,a={encoding:null,flag:`r`}){let S=normalizePath(n),C=wr.File.new_for_path(S);try{let[n,N]=C.load_contents(null);if(!n)throw createNodeError(Error(`failed to read file`),`read`,S);return encodeUint8Array(getEncodingFromOptions(a,`buffer`),N)}catch(n){throw n.code&&typeof n.code==`string`?n:createNodeError(n,`read`,S)}}function mkdirSync(n,a){let S=!1,C=511;if(typeof a==`object`?(a?.recursive&&(S=a.recursive),a?.mode&&(C=a.mode)):C=a||511,n=normalizePath(n),typeof C==`string`)throw TypeError(`mode as string is currently not supported!`);if(S)return mkdirSyncRecursive(n);let N=wr.File.new_for_path(n);try{N.make_directory(null)}catch(a){throw createNodeError(a,`mkdir`,n)}}function mkdirSyncRecursive(n){let a=wr.File.new_for_path(n);try{return a.make_directory(null),n}catch(a){let S=a;if(S.code===wr.IOErrorEnum.EXISTS)return;if(S.code===wr.IOErrorEnum.NOT_FOUND){let S=ms(n,`..`),C=wr.File.new_for_path(S).get_path();if(C===n)throw createNodeError(a,`mkdir`,n);let N=mkdirSyncRecursive(C),F=wr.File.new_for_path(n);try{F.make_directory(null)}catch(a){throw createNodeError(a,`mkdir`,n)}return N??n}throw createNodeError(a,`mkdir`,n)}}function rmdirSync(n,a){let S=normalizePath(n),C=wr.File.new_for_path(S);try{if(C.query_info(`standard::type`,wr.FileQueryInfoFlags.NONE,null).get_file_type()!==wr.FileType.DIRECTORY)throw createNodeError(Object.assign(Error(),{code:4}),`rmdir`,S);if(C.enumerate_children(`standard::name`,wr.FileQueryInfoFlags.NONE,null).next_file(null)!==null)throw createNodeError(Object.assign(Error(),{code:5}),`rmdir`,S);C.delete(null)}catch(n){throw n.code&&typeof n.code==`string`?n:createNodeError(n,`rmdir`,S)}}function unlinkSync(n){let a=normalizePath(n),S=wr.File.new_for_path(a);try{S.delete(null)}catch(n){throw createNodeError(n,`unlink`,a)}}function writeFileSync(n,a){rt.file_set_contents(normalizePath(n),a)}function renameSync(n,a){let S=normalizePath(n),C=normalizePath(a),N=wr.File.new_for_path(S),F=wr.File.new_for_path(C);try{N.move(F,wr.FileCopyFlags.OVERWRITE,null,null)}catch(n){throw createNodeError(n,`rename`,S,C)}}function copyFileSync(n,a,S){let C=normalizePath(n),N=normalizePath(a),F=wr.File.new_for_path(C),I=wr.File.new_for_path(N),H=wr.FileCopyFlags.NONE;S&&!(S&1)?H=wr.FileCopyFlags.OVERWRITE:S||(H=wr.FileCopyFlags.OVERWRITE);try{F.copy(I,H,null,null)}catch(n){throw createNodeError(n,`copyfile`,C,N)}}function accessSync(n,a){let S=normalizePath(n),C=wr.File.new_for_path(S);try{let n=C.query_info(`access::*`,wr.FileQueryInfoFlags.NONE,null);if(a!==void 0&&a!==0){let C={code:14,message:`permission denied, access '${S}'`};if(a&4&&!n.get_attribute_boolean(`access::can-read`)||a&2&&!n.get_attribute_boolean(`access::can-write`)||a&1&&!n.get_attribute_boolean(`access::can-execute`))throw createNodeError(C,`access`,S)}}catch(n){throw n.code&&typeof n.code==`string`?n:createNodeError(n,`access`,S)}}function appendFileSync(n,a,S){let C=normalizePath(n),N=wr.File.new_for_path(C),F;F=typeof a==`string`?new TextEncoder().encode(a):a;try{let n=N.append_to(wr.FileCreateFlags.NONE,null);F.length>0&&n.write_bytes(new rt.Bytes(F),null),n.close(null)}catch(n){throw createNodeError(n,`appendfile`,C)}}function readlinkSync(n,a){let S=normalizePath(n),C=wr.File.new_for_path(S);try{let n=C.query_info(`standard::symlink-target`,wr.FileQueryInfoFlags.NOFOLLOW_SYMLINKS,null).get_symlink_target();if(!n)throw Object.assign(Error(`EINVAL: invalid argument, readlink '${S}'`),{code:`EINVAL`,errno:-22,syscall:`readlink`,path:S});return(typeof a==`string`?a:a?.encoding)===`buffer`?Ge.from(n):n}catch(n){throw typeof n.code==`string`?n:createNodeError(n,`readlink`,S)}}function linkSync(n,a){let S=normalizePath(n),C=normalizePath(a);if(wr.File.new_for_path(S).query_file_type(wr.FileQueryInfoFlags.NOFOLLOW_SYMLINKS,null)===wr.FileType.UNKNOWN)throw Object.assign(Error(`ENOENT: no such file or directory, link '${S}' -> '${C}'`),{code:`ENOENT`,errno:-2,syscall:`link`,path:S,dest:C});if(wr.File.new_for_path(C).query_file_type(wr.FileQueryInfoFlags.NOFOLLOW_SYMLINKS,null)!==wr.FileType.UNKNOWN)throw Object.assign(Error(`EEXIST: file already exists, link '${S}' -> '${C}'`),{code:`EEXIST`,errno:-17,syscall:`link`,path:S,dest:C});let N=``;try{let[,,n,a]=rt.spawn_sync(null,[`ln`,`--`,S,C],null,rt.SpawnFlags.SEARCH_PATH,null);if(N=n?new TextDecoder().decode(n).trim():``,!rt.spawn_check_wait_status(a))throw Error(`ln exited non-zero (${a})`);return}catch(n){throw N===``&&n instanceof Error&&(N=n.message),Object.assign(Error(`EPERM: operation not permitted, link '${S}' -> '${C}'`+(N?` (${N})`:``)),{code:`EPERM`,errno:-1,syscall:`link`,path:S,dest:C})}}function truncateSync(n,a){let S=normalizePath(n),C=wr.File.new_for_path(S);try{let n=C.replace(null,!1,wr.FileCreateFlags.NONE,null);if(a&&a>0){let[,S]=C.load_contents(null),N=S.slice(0,a);N.length>0&&n.write_bytes(new rt.Bytes(N),null)}n.close(null)}catch(n){throw createNodeError(n,`truncate`,S)}}function chmodSync(n,a){let S=normalizePath(n),C=typeof a==`string`?parseInt(a,8):a;try{wr.File.new_for_path(S).set_attribute_uint32(`unix::mode`,C,wr.FileQueryInfoFlags.NONE,null)}catch(n){throw createNodeError(n,`chmod`,S)}}function chownSync(n,a,S){let C=normalizePath(n);try{let n=wr.File.new_for_path(C),N=new wr.FileInfo;a!==-1&&N.set_attribute_uint32(`unix::uid`,a),S!==-1&&N.set_attribute_uint32(`unix::gid`,S),n.set_attributes_from_info(N,wr.FileQueryInfoFlags.NONE,null)}catch(n){throw createNodeError(n,`chown`,C)}}function watch(n,a,S){return new FSWatcher(normalizePath(n),a,S)}function openSync(n,a,S){return new $c({path:n,flags:a,mode:S})}function mkdtempSync(n,a){let S=getEncodingFromOptions(a),C=tempDirPath(n);return mkdirSync(C,{recursive:!1,mode:511}),decode(C,S)}function rmSync(n,a){let S=normalizePath(n),C=wr.File.new_for_path(S),N=a?.recursive||!1,F=a?.force||!1,I;try{I=C.query_file_type(wr.FileQueryInfoFlags.NOFOLLOW_SYMLINKS,null)}catch(a){if(F&&isNotFoundError(a))return;throw createNodeError(a,`rm`,n)}if(I===wr.FileType.SYMBOLIC_LINK){try{C.delete(null)}catch(a){if(F&&isNotFoundError(a))return;throw createNodeError(a,`rm`,n)}return}if(I===wr.FileType.DIRECTORY){let C=readdirSync(n);if(!N&&C.length)throw createNodeError(Object.assign(Error(),{code:5}),`rm`,n);for(let n of C)rmSync(ms(S,n),a)}try{C.delete(null)}catch(a){if(F&&isNotFoundError(a))return;throw createNodeError(a,`rm`,n)}}var tl=__esmMin(()=>{Cc(),nl(),il(),wc(),Ec(),el(),Oc(),it(),Tr(),Ts(),et(),ia(),realpathSync.native=realpathSync});function normalizePath(n){return n instanceof URL||n instanceof en?fileURLToPath(n):typeof n==`string`?n:n.toString()}function randomName(){return[...[,,,,,,]].map(()=>`0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ`[Math.floor(Math.random()*62)]).join(``)}function tempDirPath(n){let a;do a=n+randomName();while(existsSync(a));return a}var nl=__esmMin(()=>{tl(),nn()});function changed(n,a,S,C){switch(C){case wr.FileMonitorEvent.CHANGES_DONE_HINT:this.emit(`change`,`change`,a.get_basename());break;case wr.FileMonitorEvent.DELETED:case wr.FileMonitorEvent.CREATED:case wr.FileMonitorEvent.RENAMED:case wr.FileMonitorEvent.MOVED_IN:case wr.FileMonitorEvent.MOVED_OUT:this.emit(`change`,`rename`,a.get_basename());break}}function gioEventToNodeType(n){switch(n){case wr.FileMonitorEvent.CHANGES_DONE_HINT:return`change`;case wr.FileMonitorEvent.DELETED:case wr.FileMonitorEvent.CREATED:case wr.FileMonitorEvent.RENAMED:case wr.FileMonitorEvent.MOVED_IN:case wr.FileMonitorEvent.MOVED_OUT:return`rename`;default:return null}}async function*watchAsync(n,a){let S=a?.signal;if(S?.aborted)return;let C=normalizePath(n),N=wr.File.new_for_path(C),F=wr.Cancellable.new(),I;try{I=N.monitor(wr.FileMonitorFlags.NONE,F)}catch{return}let H=[],W=[],K=!1;function enqueue(n){K||(W.length>0?W.shift().resolve({value:n,done:!1}):H.push(n))}function terminate(){if(!K)for(K=!0,F.is_cancelled()||F.cancel();W.length>0;)W.shift().resolve({value:void 0,done:!0})}let q=I.connect(`changed`,(n,a,S,C)=>{let N=gioEventToNodeType(C);N!==null&&enqueue({eventType:N,filename:a?.get_basename()??null})}),abortHandler=()=>terminate();S?.addEventListener(`abort`,abortHandler);try{for(;!K;){if(H.length>0){yield H.shift();continue}let n=await new Promise(n=>{W.push({resolve:n})});if(n.done)break;yield n.value}}finally{S?.removeEventListener(`abort`,abortHandler),I.disconnect(q),F.is_cancelled()||F.cancel()}}var rl,FSWatcher,il=__esmMin(()=>{nl(),it(),Tr(),Ft(),rl=new WeakMap,FSWatcher=class extends wt{constructor(n,a,S){super(),(!a||typeof a!=`object`)&&(a={persistent:!0});let C=a.persistent!==!1,N=wr.Cancellable.new(),F=normalizePath(n),I=wr.File.new_for_path(F).monitor(wr.FileMonitorFlags.NONE,N);I.connect(`changed`,changed.bind(this));let H=null;C&&(H=rt.timeout_add(rt.PRIORITY_LOW,2147483647,()=>rt.SOURCE_CONTINUE)),rl.set(this,{persistent:C,cancellable:N,sourceId:H,watcher:I}),S&&this.on(`change`,S)}close(){let n=rl.get(this);n.cancellable.is_cancelled()||(n.cancellable.cancel(),n.sourceId!==null&&(rt.source_remove(n.sourceId),n.sourceId=null))}ref(){let n=rl.get(this);return!n.persistent&&!n.cancellable.is_cancelled()&&(n.persistent=!0,n.sourceId=rt.timeout_add(rt.PRIORITY_LOW,2147483647,()=>rt.SOURCE_CONTINUE)),this}unref(){let n=rl.get(this);return n.persistent&&(n.persistent=!1,n.sourceId!==null&&(rt.source_remove(n.sourceId),n.sourceId=null)),this}}});function zeroedStat(){return{dev:0,ino:0,mode:0,nlink:0,uid:0,gid:0,rdev:0,size:0,blksize:0,blocks:0,atimeMs:0,mtimeMs:0,ctimeMs:0,birthtimeMs:0,atime:new Date(0),mtime:new Date(0),ctime:new Date(0),birthtime:new Date(0),isFile:()=>!1,isDirectory:()=>!1,isBlockDevice:()=>!1,isCharacterDevice:()=>!1,isSymbolicLink:()=>!1,isFIFO:()=>!1,isSocket:()=>!1}}function watchFile(n,a,S){typeof a==`function`&&(S=a,a={});let C=a.interval??5007,N=n.toString(),F=al.get(N);return F||(F=new StatWatcher(N,C),F.start(),al.set(N,F)),S&&F.addChangeListener(S),F}function unwatchFile(n,a){let S=n.toString(),C=al.get(S);C&&(a?C.removeChangeListener(a):C.removeAllChangeListeners(),C.changeListenerCount===0&&(C.stop(),al.delete(S)))}var StatWatcher,al,ol=__esmMin(()=>{tl(),Ft(),StatWatcher=class extends wt{_path;_interval;_timerId=null;_prev;_changeCount=0;constructor(n,a){super(),this._path=n,this._interval=a,this._prev=zeroedStat()}start(){try{this._prev=statSync(this._path)}catch{}this._timerId=setInterval(()=>{let n;try{n=statSync(this._path)}catch{n=zeroedStat()}let a=this._prev;(n.mtimeMs!==a.mtimeMs||n.size!==a.size||n.ino!==a.ino)&&(this._prev=n,this.emit(`change`,n,a))},this._interval)}stop(){this._timerId!==null&&(clearInterval(this._timerId),this._timerId=null),this.emit(`stop`)}addChangeListener(n){this._changeCount++,this.on(`change`,n)}removeChangeListener(n){this._changeCount--,this.removeListener(`change`,n)}removeAllChangeListeners(){this._changeCount=0,this.removeAllListeners(`change`)}get changeListenerCount(){return this._changeCount}},al=new Map}),sl=__exportAll$4({BigIntStats:()=>BigIntStats,Dir:()=>Dir,Dirent:()=>Dirent,FSWatcher:()=>FSWatcher,ReadStream:()=>ReadStream$1,StatWatcher:()=>StatWatcher,Stats:()=>Stats,WriteStream:()=>WriteStream$1,access:()=>access,accessSync:()=>accessSync,appendFile:()=>appendFile,appendFileSync:()=>appendFileSync,chmod:()=>chmod,chmodSync:()=>chmodSync,chown:()=>chown,chownSync:()=>chownSync,close:()=>close$1,closeSync:()=>closeSync,constants:()=>cl,copyFile:()=>copyFile,copyFileSync:()=>copyFileSync,cp:()=>cp,cpSync:()=>cpSync,createReadStream:()=>createReadStream,createWriteStream:()=>createWriteStream,default:()=>ll,exists:()=>exists,existsSync:()=>existsSync,fchmod:()=>fchmod,fchmodSync:()=>fchmodSync,fchown:()=>fchown,fchownSync:()=>fchownSync,fdatasync:()=>fdatasync,fdatasyncSync:()=>fdatasyncSync,fstat:()=>fstat,fstatSync:()=>fstatSync,fsync:()=>fsync,fsyncSync:()=>fsyncSync,ftruncate:()=>ftruncate,ftruncateSync:()=>ftruncateSync,futimes:()=>futimes,futimesSync:()=>futimesSync,glob:()=>glob,globSync:()=>globSync,lchmod:()=>lchmod,lchmodSync:()=>lchmodSync,lchown:()=>lchown,lchownSync:()=>lchownSync,link:()=>link,linkSync:()=>linkSync,lstat:()=>lstat,lstatSync:()=>lstatSync,lutimes:()=>lutimes,lutimesSync:()=>lutimesSync,mkdir:()=>mkdir,mkdirSync:()=>mkdirSync,mkdtempSync:()=>mkdtempSync,open:()=>open$1,openAsBlob:()=>openAsBlob,openSync:()=>openSync,opendir:()=>opendir,opendirSync:()=>opendirSync,promises:()=>Bc,read:()=>read$1,readFile:()=>readFile,readFileSync:()=>readFileSync,readSync:()=>readSync,readdir:()=>readdir,readdirSync:()=>readdirSync,readlink:()=>readlink,readlinkSync:()=>readlinkSync,readv:()=>readv,readvSync:()=>readvSync,realpath:()=>realpath,realpathSync:()=>realpathSync,rename:()=>rename,renameSync:()=>renameSync,rm:()=>rm,rmSync:()=>rmSync,rmdir:()=>rmdir,rmdirSync:()=>rmdirSync,stat:()=>stat,statSync:()=>statSync,statfs:()=>statfs,statfsSync:()=>statfsSync,symlink:()=>symlink,symlinkSync:()=>symlinkSync,truncate:()=>truncate,truncateSync:()=>truncateSync,unlink:()=>unlink,unlinkSync:()=>unlinkSync,unwatchFile:()=>unwatchFile,utimes:()=>utimes,utimesSync:()=>utimesSync,watch:()=>watch,watchFile:()=>watchFile,write:()=>write,writeFile:()=>writeFile,writeFileSync:()=>writeFileSync,writeSync:()=>writeSync,writev:()=>writev,writevSync:()=>writevSync}),cl,ll,ul=__esmMin(()=>{il(),Dc(),Kc(),wc(),Ec(),tl(),kc(),jc(),Mc(),Fc(),Lc(),Rc(),Hc(),Uc(),ol(),cl={F_OK:0,R_OK:4,W_OK:2,X_OK:1,COPYFILE_EXCL:1,COPYFILE_FICLONE:2,COPYFILE_FICLONE_FORCE:4,O_RDONLY:0,O_WRONLY:1,O_RDWR:2,O_CREAT:64,O_EXCL:128,O_TRUNC:512,O_APPEND:1024,O_SYNC:1052672,O_NONBLOCK:2048,O_DIRECTORY:65536,O_NOFOLLOW:131072,S_IFMT:61440,S_IFREG:32768,S_IFDIR:16384,S_IFCHR:8192,S_IFBLK:24576,S_IFIFO:4096,S_IFLNK:40960,S_IFSOCK:49152,S_IRWXU:448,S_IRUSR:256,S_IWUSR:128,S_IXUSR:64,S_IRWXG:56,S_IRGRP:32,S_IWGRP:16,S_IXGRP:8,S_IRWXO:7,S_IROTH:4,S_IWOTH:2,S_IXOTH:1},ll={FSWatcher,StatWatcher,Stats,BigIntStats,Dirent,Dir,constants:cl,existsSync,readdirSync,readFileSync,writeFileSync,mkdirSync,rmdirSync,unlinkSync,mkdtempSync,rmSync,statSync,openSync,realpathSync,symlinkSync,lstatSync,renameSync,copyFileSync,accessSync,appendFileSync,readlinkSync,linkSync,truncateSync,chmodSync,chownSync,cpSync,opendirSync,globSync,glob,watch,watchFile,unwatchFile,statfsSync,statfs,utimesSync,utimes,lutimesSync,lutimes,lchownSync,lchown,lchmodSync,lchmod,fstatSync,fstat,ftruncateSync,ftruncate,fdatasyncSync,fdatasync,fsyncSync,fsync,fchmodSync,fchmod,fchownSync,fchown,futimesSync,futimes,closeSync,readSync,writeSync,readvSync,readv,writevSync,writev,exists,openAsBlob,createReadStream,ReadStream:ReadStream$1,createWriteStream,WriteStream:WriteStream$1,promises:Bc,open:open$1,close:close$1,read:read$1,write,rm,realpath,readdir,symlink,lstat,stat,rename,copyFile,cp,access,appendFile,readlink,truncate,chmod,chown,mkdir,rmdir,readFile,writeFile,unlink,link,opendir}}),dl,fl,pl,ml,hl,gl,_l=__esmMin(()=>{
|
|
39
39
|
/**
|
|
40
40
|
* @fileoverview Main entrypoint for libraries using yargs-parser in Node.js
|
|
41
41
|
*
|
|
@@ -758,7 +758,7 @@ function load() {
|
|
|
758
758
|
Add @gjsify/node-gi as a dependency to run the storybook on Node, e.g.:
|
|
759
759
|
"devDependencies": { "@gjsify/node-gi": "^0.13.0" }`);let{env:N,envPrefix:F}=computeNativeEnvForBundle(n,C),I={...process.env,...N},H=nodeBinary(),W=[n,...a],K=[H,...W.map(n=>n.includes(` `)?`"${n}"`:n)].join(` `);he.error(`$ ${F?`${F} `:``}${K}`);let q=spawn(H,W,{env:I,stdio:`inherit`});await new Promise((n,a)=>{q.on(`close`,S=>{S===0?n():a(Error(`node exited with code ${S}`))}),q.on(`error`,a)}).catch(n=>{he.error(n.message),process.exit(1)}),S.exitOnSuccess&&process.exit(0)}function bundleRequiresNodeGi(n){try{return readFileSync(n,`utf-8`).includes(`@gjsify/node-gi`)}catch{return!1}}async function runRuntimeBundle(n,a,S=[],C={}){let N=process.cwd(),F=ds(a);if(bundleRequiresNodeGi(F)&&!resolveNodeGiForBundle(F,N))throw Error(`Cannot run this bundle on ${n}: it uses gi:// via \`@gjsify/node-gi\`, which is not installed.\nAdd @gjsify/node-gi as a dependency to run gi:// code off GJS, e.g.:
|
|
760
760
|
"dependencies": { "@gjsify/node-gi": "^0.13.0" }`);let{env:I,envPrefix:H}=computeNativeEnvForBundle(F,N),W={...process.env,...I},[,K]=Jm[n].launch(F,S),q=n===`node`?nodeBinary():Jm[n].probe,Y=[q,...K.map(n=>n.includes(` `)?`"${n}"`:n)].join(` `);he.error(`$ ${H?`${H} `:``}${Y}`);let X=spawn(q,K,{env:W,stdio:`inherit`});await new Promise((a,S)=>{X.on(`close`,C=>{C===0?a():S(Error(`${n} exited with code ${C}`))}),X.on(`error`,S)}).catch(n=>{he.error(n.message),process.exit(1)}),C.exitOnSuccess&&process.exit(0)}var gM=__esmMin(()=>{ge(),Gm(),ul(),Ts(),bm(),fM(),Ym()});function readPackageJson$1(n){if(!existsSync(n))return null;let a=readFileSync(n,`utf-8`);try{return JSON.parse(a)}catch(a){throw Error(`gjsify install: ${n} is not valid JSON: ${a.message}`)}}function writePackageJson(n,a){let S=sortKnownDepFields(a);writeFileSync(n,JSON.stringify(S,null,2)+`
|
|
761
|
-
`,`utf-8`)}function parseSpec$2(n){if(n.startsWith(`@`)){let a=n.indexOf(`/`);if(a===-1)return{name:n};let S=n.indexOf(`@`,a+1);return S===-1?{name:n}:{name:n.slice(0,S),range:n.slice(S+1)}}let a=n.indexOf(`@`);return a===-1?{name:n}:{name:n.slice(0,a),range:n.slice(a+1)}}function projectSpecsFromPackageJson(n){let a=[];for(let S of[`dependencies`,`devDependencies`,`optionalDependencies`]){let C=n[S];if(C)for(let[n,S]of Object.entries(C))typeof S==`string`&&(/^(workspace|link|file|portal|git\+|https?):/.test(S)||a.push(`${n}@${S}`))}return a}function addDependencyEntry(n,a,S,C){n[C]===void 0&&(n[C]={}),n[C][a]=S}function defaultRangeFromVersion(n){return`^${n}`}function sortKnownDepFields(n){let a={...n};for(let n of[`dependencies`,`devDependencies`,`peerDependencies`,`optionalDependencies`]){let S=a[n];S&&(a[n]=Object.fromEntries(Object.entries(S).sort(([n],[a])=>n<a?-1:+(n>a))))}return a}var _M=__esmMin(()=>{ul(),__name$1(readPackageJson$1,`readPackageJson`),__name$1(parseSpec$2,`parseSpec`)});async function runTargetOnRuntime(n,a,S){if(!looksLikeFile(a))return he.error(`gjsify run: --runtime ${n} needs a bundle FILE, but "${a}" is not a path.\n Build first (e.g. \`gjsify build src/app.ts --app ${n===`gjs`?`gjs`:`node`} --outfile dist/app.${n===`gjs`?`gjs`:`node`}.mjs\`), then run the output file.`),process.exit(1);let C=readPackageJson$1(ms(process.cwd(),`package.json`)),N=checkRuntimeSupported(n,readDeclaredRuntimes(C),C?.name??a);if(!N.ok)return he.error(`gjsify run: ${N.message}`),process.exit(1);let F=ds(a);n===`gjs`?await runGjsBundle(F,S,{exitOnSuccess:!0}):await runRuntimeBundle(n,F,S,{exitOnSuccess:!0})}function isLikelyGjsBundle(n){if(/\.gjs\.[mc]?js$/.test(n))return!0;try{let a=readFileSync(n,`utf-8`).slice(0,65536);return a.startsWith(`#!/usr/bin/env -S gjs`)||/(?:from|import)\s*["']gi:\/\//.test(a)||/\bimports\.(?:gi|system)\b/.test(a)}catch{return!1}}function looksLikeFile(n){if(n.startsWith(`./`)||n.startsWith(`../`)||n.startsWith(`/`)||n.includes(`/`)||n.includes(`\\`)||/\.(c?js|mjs|cjs|gjs)$/.test(n))return!0;try{return statSync(n).isFile()}catch{return!1}}async function runScriptInWorkspace(n,a,S){let C=findWorkspaceRoot(process.cwd())??process.cwd(),N;try{N=discoverWorkspaces(C)}catch(n){return he.error(`gjsify run: could not read workspaces at ${C}: ${n.message}`),process.exit(1)}let F=N.find(a=>a.name===n||a.relativeLocation===n||vs(a.location)===n);if(!F){let a=N.map(n=>n.relativeLocation).join(`, `)||`<none>`;return he.error(`gjsify run: no workspace "${n}" under ${C} (available: ${a})`),process.exit(1)}await runScript(a,S,F.location)}async function runScript(n,a,S=process.cwd()){let C=ms(S,`package.json`),N=readPackageJson$1(C);if(!N)return he.error(`gjsify run: no package.json in ${S}`),process.exit(1);let F=N.scripts??{},I=F[n];if(typeof I!=`string`){let a=Object.keys(F).join(`, `)||`<none>`;return he.error(`gjsify run: no script "${n}" in ${C} (available: ${a})`),process.exit(1)}let H=findWorkspaceRoot(S),W=[ms(S,`node_modules`,`.bin`)];H&&H!==S&&W.push(ms(H,`node_modules`,`.bin`)),process.env.GJSIFY_SHIM_DIR&&W.unshift(process.env.GJSIFY_SHIM_DIR);let K=process.env.FORCE_COLOR!==void 0||process.env.NO_COLOR!==void 0?{}:{FORCE_COLOR:`1`},q={...process.env,...K,PATH:[...W,process.env.PATH??``].filter(Boolean).join(Cs),npm_lifecycle_event:n,npm_package_name:N.name??``,npm_package_version:N.version??``},Y=isGjs()?gjsifyInProcessArgv(I,a):null;if(Y){process.env.PATH=q.PATH,process.env.npm_lifecycle_event=q.npm_lifecycle_event,process.env.npm_package_name=q.npm_package_name,process.env.npm_package_version=q.npm_package_version,q.FORCE_COLOR!==void 0&&(process.env.FORCE_COLOR=q.FORCE_COLOR);let n=!1;try{let{runCli:n}=await Promise.resolve().then(()=>(
|
|
761
|
+
`,`utf-8`)}function parseSpec$2(n){if(n.startsWith(`@`)){let a=n.indexOf(`/`);if(a===-1)return{name:n};let S=n.indexOf(`@`,a+1);return S===-1?{name:n}:{name:n.slice(0,S),range:n.slice(S+1)}}let a=n.indexOf(`@`);return a===-1?{name:n}:{name:n.slice(0,a),range:n.slice(a+1)}}function projectSpecsFromPackageJson(n){let a=[];for(let S of[`dependencies`,`devDependencies`,`optionalDependencies`]){let C=n[S];if(C)for(let[n,S]of Object.entries(C))typeof S==`string`&&(/^(workspace|link|file|portal|git\+|https?):/.test(S)||a.push(`${n}@${S}`))}return a}function addDependencyEntry(n,a,S,C){n[C]===void 0&&(n[C]={}),n[C][a]=S}function defaultRangeFromVersion(n){return`^${n}`}function sortKnownDepFields(n){let a={...n};for(let n of[`dependencies`,`devDependencies`,`peerDependencies`,`optionalDependencies`]){let S=a[n];S&&(a[n]=Object.fromEntries(Object.entries(S).sort(([n],[a])=>n<a?-1:+(n>a))))}return a}var _M=__esmMin(()=>{ul(),__name$1(readPackageJson$1,`readPackageJson`),__name$1(parseSpec$2,`parseSpec`)});async function runTargetOnRuntime(n,a,S){if(!looksLikeFile(a))return he.error(`gjsify run: --runtime ${n} needs a bundle FILE, but "${a}" is not a path.\n Build first (e.g. \`gjsify build src/app.ts --app ${n===`gjs`?`gjs`:`node`} --outfile dist/app.${n===`gjs`?`gjs`:`node`}.mjs\`), then run the output file.`),process.exit(1);let C=readPackageJson$1(ms(process.cwd(),`package.json`)),N=checkRuntimeSupported(n,readDeclaredRuntimes(C),C?.name??a);if(!N.ok)return he.error(`gjsify run: ${N.message}`),process.exit(1);let F=ds(a);n===`gjs`?await runGjsBundle(F,S,{exitOnSuccess:!0}):await runRuntimeBundle(n,F,S,{exitOnSuccess:!0})}function isLikelyGjsBundle(n){if(/\.gjs\.[mc]?js$/.test(n))return!0;try{let a=readFileSync(n,`utf-8`).slice(0,65536);return a.startsWith(`#!/usr/bin/env -S gjs`)||/(?:from|import)\s*["']gi:\/\//.test(a)||/\bimports\.(?:gi|system)\b/.test(a)}catch{return!1}}function looksLikeFile(n){if(n.startsWith(`./`)||n.startsWith(`../`)||n.startsWith(`/`)||n.includes(`/`)||n.includes(`\\`)||/\.(c?js|mjs|cjs|gjs)$/.test(n))return!0;try{return statSync(n).isFile()}catch{return!1}}async function runScriptInWorkspace(n,a,S){let C=findWorkspaceRoot(process.cwd())??process.cwd(),N;try{N=discoverWorkspaces(C)}catch(n){return he.error(`gjsify run: could not read workspaces at ${C}: ${n.message}`),process.exit(1)}let F=N.find(a=>a.name===n||a.relativeLocation===n||vs(a.location)===n);if(!F){let a=N.map(n=>n.relativeLocation).join(`, `)||`<none>`;return he.error(`gjsify run: no workspace "${n}" under ${C} (available: ${a})`),process.exit(1)}await runScript(a,S,F.location)}async function runScript(n,a,S=process.cwd()){let C=ms(S,`package.json`),N=readPackageJson$1(C);if(!N)return he.error(`gjsify run: no package.json in ${S}`),process.exit(1);let F=N.scripts??{},I=F[n];if(typeof I!=`string`){let a=Object.keys(F).join(`, `)||`<none>`;return he.error(`gjsify run: no script "${n}" in ${C} (available: ${a})`),process.exit(1)}let H=findWorkspaceRoot(S),W=[ms(S,`node_modules`,`.bin`)];H&&H!==S&&W.push(ms(H,`node_modules`,`.bin`)),process.env.GJSIFY_SHIM_DIR&&W.unshift(process.env.GJSIFY_SHIM_DIR);let K=process.env.FORCE_COLOR!==void 0||process.env.NO_COLOR!==void 0?{}:{FORCE_COLOR:`1`},q={...process.env,...K,PATH:[...W,process.env.PATH??``].filter(Boolean).join(Cs),npm_lifecycle_event:n,npm_package_name:N.name??``,npm_package_version:N.version??``},Y=isGjs()?gjsifyInProcessArgv(I,a):null;if(Y){process.env.PATH=q.PATH,process.env.npm_lifecycle_event=q.npm_lifecycle_event,process.env.npm_package_name=q.npm_package_name,process.env.npm_package_version=q.npm_package_version,q.FORCE_COLOR!==void 0&&(process.env.FORCE_COLOR=q.FORCE_COLOR);let n=!1;try{let{runCli:n}=await Promise.resolve().then(()=>(FI(),PI));await n(Y)}catch(a){he.error(a.message),n=!0}let a=n?1:process.exitCode==null?0:Number(process.exitCode);return process.exit(a)}let X=a.length>0?`${I} ${a.map(shellEscape).join(` `)}`:I;await new Promise((a,C)=>{let N=spawn(X,[],{cwd:S,env:q,stdio:`inherit`,shell:!0});N.on(`close`,S=>{S===0?a():C(Error(`script "${n}" exited with code ${S}`))}),N.on(`error`,C)}).catch(n=>{he.error(n.message),process.exit(1)}),process.exit(0)}function shellEscape(n){return/^[a-zA-Z0-9_\-./=:@,]+$/.test(n)?n:`'${n.replace(/'/g,`'\\''`)}'`}function gjsifyInProcessArgv(n,a){let S=tokenizeSimpleCommand(n);return!S||S.length<2||S[0]!==`gjsify`?null:[...S.slice(1),...a]}function tokenizeSimpleCommand(n){let a=[],S=``,C=!1,N=null;for(let F=0;F<n.length;F++){let I=n[F];if(N===`'`){I===`'`?N=null:S+=I;continue}if(N===`"`){if(I===`"`)N=null;else if(I===`\\`&&(n[F+1]===`"`||n[F+1]===`\\`))S+=n[++F];else if(I===`$`||I==="`")return null;else S+=I;continue}if(I===`'`||I===`"`){N=I,C=!0;continue}if(I===` `||I===` `){C&&=(a.push(S),S=``,!1);continue}if(`|&;<>\`$()\\
|
|
762
762
|
\r*?{}[]~#!`.includes(I))return null;S+=I,C=!0}return N?null:(C&&a.push(S),a)}var vM,yM=__esmMin(()=>{ge(),ul(),Ts(),Gm(),fM(),gM(),_M(),F_(),N_(),bm(),Ym(),vM={command:`run <target> [args..]`,description:"Run a script from package.json (yarn-run-style) or a GJS bundle file. If <target> resolves to a file on disk (or has a path-like prefix), it is launched via gjs with LD_LIBRARY_PATH + GI_TYPELIB_PATH set for native packages. Otherwise it is looked up in the current package.json `scripts`.",builder:n=>n.positional(`target`,{description:"Either a script name (looked up in package.json `scripts`) or a path to a GJS bundle (e.g. dist/gjs.js).",type:`string`,demandOption:!0}).positional(`args`,{description:`Extra arguments passed through to the script / gjs.`,type:`string`,array:!0,default:[]}).option(`workspace`,{alias:`w`,type:`string`,description:"Run <target> as a script in the named workspace (by name or path), like `npm run <script> -w <name>`."}).option(`runtime`,{type:`string`,choices:qm,description:"Runtime to launch a bundle FILE on: gjs (default, `--app gjs` bundle) | node | bun | deno (the `--app node` bundle). Forces file mode."}).version(!1).help(!1).parserConfiguration({"populate--":!0,"unknown-options-as-args":!0}),handler:async n=>{let a=n.target,S=n.args??[],C=(n[`--`]??[]).filter(n=>typeof n==`string`),N=[...S,...C],F=n.runtime;if(typeof F==`string`&&F.length>0){if(typeof n.workspace==`string`&&n.workspace.length>0)return he.error(`gjsify run: --runtime cannot be combined with --workspace (file mode vs script mode).`),process.exit(1);if(!isExampleRuntime(F))return he.error(`gjsify run: unknown --runtime "${F}" (expected: ${qm.join(`, `)}).`),process.exit(1);await runTargetOnRuntime(F,a,N);return}if(typeof n.workspace==`string`&&n.workspace.length>0){await runScriptInWorkspace(n.workspace,a,N);return}let I=readPackageJson$1(ms(process.cwd(),`package.json`));if(!(I?.scripts&&typeof I.scripts[a]==`string`)&&looksLikeFile(a)){let n=ds(a),S=hostRuntime(),C=S===`gjs`||isLikelyGjsBundle(n)?`gjs`:S;C===`gjs`?await runGjsBundle(n,N,{exitOnSuccess:!0}):await runRuntimeBundle(C,n,N,{exitOnSuccess:!0});return}await runScript(a,N)}}}),bM,xM=__esmMin(()=>{ge(),Ts(),uM(),bM={command:`info [file]`,description:`Show native gjsify packages detected in node_modules and the env vars needed to run a GJS bundle directly with gjs.`,builder:n=>n.positional(`file`,{description:`Optional: the GJS bundle path to include in the example command (e.g. dist/gjs.js)`,type:`string`,normalize:!0}).option(`export`,{description:`Output only shell export statements suitable for eval (eval $(gjsify info --export))`,type:`boolean`,default:!1}),handler:async n=>{let a=process.cwd(),S=n.file?ds(n.file):null,C=detectNativePackages(a),N=buildNativeEnv(C),F=Object.entries(N).filter(([,n])=>n!==void 0);if(n.export){for(let[n,a]of F)he.log(`export ${n}="${a}"`);return}if(C.length===0){he.log(`No native gjsify packages detected in node_modules.`),he.log(`Native packages declare "gjsify": { "prebuilds": "<dir>" } in their package.json.`);return}he.log(`Native packages detected:`);for(let n of C)he.log(` ${n.name} → ${n.prebuildsDir}`);he.log(``),he.log(`To run your app directly with gjs, set:`);for(let[n,a]of F)he.log(` export ${n}="${a}"`);S?he.log(` gjs -m ${S}`):he.log(` gjs -m <your-bundle.js>`),he.log(``),he.log(`Or use gjsify run to handle this automatically:`),S?he.log(` gjsify run ${n.file}`):he.log(` gjsify run <your-bundle.js>`)}}});function tryExecFile(n,a){try{return execFileSync(n,a,{encoding:`utf-8`,stdio:[`ignore`,`pipe`,`ignore`]}).trim()}catch{return null}}function checkBinary(n,a,S,C,N,F,I){let H=tryExecFile(S,C);return H===null?{id:n,name:a,found:!1,severity:N,requiredBy:I}:{id:n,name:a,found:!0,version:F?F(H):H.split(`
|
|
763
763
|
`)[0]??H,severity:N,requiredBy:I}}function checkPkgConfig(n,a,S,C,N){let F=tryExecFile(`pkg-config`,[`--modversion`,S]);return F===null?{id:n,name:a,found:!1,severity:C,requiredBy:N}:{id:n,name:a,found:!0,version:F.split(`
|
|
764
764
|
`)[0],severity:C,requiredBy:N}}function checkNpmPackage(n,a,S,C,N,F){try{return createRequire(pathToFileURL(ms(C,`_check_.js`)).href).resolve(S),{id:n,name:a,found:!0,severity:N,requiredBy:F}}catch{}try{return createRequire(import.meta.url).resolve(S),{id:n,name:a,found:!0,severity:N,requiredBy:F}}catch{return{id:n,name:a,found:!1,severity:N,requiredBy:F}}}function detectPackageManager$2(){for(let n of[`apt`,`dnf`,`pacman`,`zypper`,`apk`])if(tryExecFile(`which`,[n])!==null)return n;return`unknown`}function findProjectRoot(n){let a=ds(n);for(;;){if(existsSync(ms(a,`package.json`)))return a;let n=ds(a,`..`);if(n===a)return null;a=n}}function discoverGjsifyPackages(n){let a=findProjectRoot(n);if(!a)return null;let S=ms(a,`node_modules`,`@gjsify`);if(!existsSync(S))return new Set;let C=ms(a,`package.json`),N={};try{N=JSON.parse(readFileSync(C,`utf-8`))}catch{}let F={...N.dependencies,...N.devDependencies},I=new Set;try{for(let n of readdirSync(S,{withFileTypes:!0}))(n.isDirectory()||n.isSymbolicLink())&&I.add(`@gjsify/${n.name}`)}catch{}for(let n of Object.keys(F))n.startsWith(`@gjsify/`)&&I.add(n);return I}function computeNeededOptionalDeps(n){let a=discoverGjsifyPackages(n);if(a===null)return null;let S=new Set;for(let n of a){let a=CM[n];if(a)for(let n of a)S.add(n)}return S}function runAllChecks(n){let a=computeNeededOptionalDeps(n);return[...runMinimalChecks(),...runRequiredChecks(n),...runOptionalChecks(a,n)]}function runMinimalChecks(){let n=[];return n.push({id:`nodejs`,name:`Node.js`,found:!0,version:process.version,severity:`required`}),n.push(checkBinary(`gjs`,`GJS`,`gjs`,[`--version`],`required`,n=>n.replace(/^GJS\s+/i,``).split(`
|
|
@@ -769,18 +769,18 @@ Optional:`);for(let n of H){let a=n.found?`✓`:`⚠`,S=n.version?` (${n.versio
|
|
|
769
769
|
All dependencies found.`);return}C.length>0&&he.log(`\nMissing required: ${C.map(n=>n.name).join(`, `)}`),N.length>0&&he.log(`Missing optional: ${N.map(n=>n.name).join(`, `)}`);let W=buildInstallCommand(S,F);W?he.log(`\nTo install:\n ${W}`):he.log(`
|
|
770
770
|
No install command available for your package manager. Install manually.`),process.exit(+(C.length>0))}}});function prefixLines(n,a,S,C){let N=``,F=``,emit=n=>{C?F+=n:a.write(n)};return n.setEncoding(`utf-8`),n.on(`data`,n=>{N+=n;let a;for(;(a=N.indexOf(`
|
|
771
771
|
`))!==-1;)emit(S+N.slice(0,a+1)),N=N.slice(a+1)}),n.on(`end`,()=>{N.length>0&&emit(S+N+`
|
|
772
|
-
`)}),()=>{F.length>0&&(a.write(F),F=``)}}var kM=__esmMin(()=>{});function resolveEnv(n){if(!n.color)return n.env;let a=n.env??process.env,S=process.env.FORCE_COLOR!==void 0||process.env.NO_COLOR!==void 0?{}:{FORCE_COLOR:`1`};return{...a,...S}}function mapSpawnError(n,a){return n.code===`ENOENT`&&a.notFound?a.notFound(n):n}function mustBlock(n){return isGjs()&&n.completion===`return`}function spawnToCompletion(n,a,S){let C=resolveEnv(S);if(mustBlock(S)){let N=spawnSync(n,[...a],{stdio:[`inherit`,`pipe`,`pipe`],cwd:S.cwd,env:C,maxBuffer:S.maxBuffer??AM});return N.error?Promise.reject(mapSpawnError(N.error,S)):(N.stdout&&N.stdout.length>0&&process.stdout.write(N.stdout),N.stderr&&N.stderr.length>0&&process.stderr.write(N.stderr),Promise.resolve({code:N.status,signal:N.signal??null}))}return new Promise((N,F)=>{let I={cwd:S.cwd,stdio:S.stdio===`pipe`?[`ignore`,`pipe`,`pipe`]:`inherit`};C&&(I.env=C);let H=spawn(n,[...a],I);S.onSpawn?.(H),H.on(`close`,(n,a)=>{N({code:n,signal:a})}),H.on(`error`,n=>{F(mapSpawnError(n,S))})})}var AM,jM=__esmMin(()=>{Gm(),bm(),AM=64*1024*1024});async function runCheck(n,a){let S=[];try{let{code:C}=await spawnToCompletion(`npm`,[`run`,`check`,`--if-present`],{completion:`exit`,cwd:n.location,stdio:a===null?`inherit`:`pipe`,onSpawn:n=>{let C=!process.stdout.isTTY;if(a!==null&&n.stdout&&n.stderr){let N=`[${a}] `;S.push(prefixLines(n.stdout,process.stdout,N,C)),S.push(prefixLines(n.stderr,process.stderr,N,C))}}});for(let n of S)n();return C??1}catch{for(let n of S)n();return 1}}var MM,NM=__esmMin(()=>{ge(),Gm(),kM(),jM(),P_(),Ts(),am(),N_(),F_(),MM={command:`check`,description:"Run `npm run check` (TypeScript type-check) across the current workspace. In a workspace root: walks every package with a `check` script (excludes @girs/*; honours --include/--exclude). In a single package: runs the local `check` script directly. Symmetric peer of `gjsify format` / `lint` / `fix`. (Legacy system-dep `gjsify check` is now `gjsify system-check` — see #254.)",builder:n=>n.option(`include`,{description:`Only run in workspaces matching these glob patterns (repeatable).`,type:`string`,array:!0}).option(`exclude`,{description:`Skip workspaces matching these glob patterns (repeatable). Always excludes @girs/*.`,type:`string`,array:!0}).option(`parallel`,{description:`Run workspace checks in parallel (default). Use --no-parallel to run them sequentially with full per-workspace output.`,type:`boolean`,alias:`p`,default:!0}).option(`jobs`,{description:`Max parallel workers (when --parallel). Default: os.cpus().length.`,type:`number`,alias:`j`}).option(`verbose`,{description:`Log the per-workspace command before spawning.`,type:`boolean`,default:!1}),handler:async n=>{let a=process.cwd(),S=findWorkspaceRoot(a);if(S&&a!==S&&readPackageJson$2(ms(a,`package.json`))?.scripts?.check){n.verbose&&he.log(`[check] cwd=${a} → npm run check`);let S=spawnSync(`npm`,[`run`,`check`],{cwd:a,stdio:`inherit`});return process.exit(S.status??1)}if(!S)return he.error("gjsify check: no workspace root found from cwd. Run inside a workspace (or a package within one) with `npm run check` defined."),process.exit(1);let C=discoverWorkspaces(S),N=[`@girs/*`,...n.exclude??[]],F=filterWorkspaces(C,{include:n.include,exclude:N}).filter(n=>n.manifest.scripts?.check!==void 0);if(F.length===0)return he.error("gjsify check: no workspaces with a `check` script found."),process.exit(1);if(n.verbose&&he.log(`[check] root=${S} workspaces=${F.length} parallel=${n.parallel?`yes`:`no`}`),!n.parallel){let a=0,S=0;for(let C of F){n.verbose&&he.log(`[check] → ${C.name}`);let N=await runCheck(C,null);N!==0&&(S++,a===0&&(a=N))}return a!==0&&he.error(`gjsify check: failures in ${S} workspace(s)`),process.exit(a)}let I=n.jobs??Math.max(1,cpus().length),H=[],W=0,K=[];for(let n=0;n<I;n++)K.push((async()=>{for(;;){let n=W++;if(n>=F.length)return;let a=F[n],S=await runCheck(a,a.name);S!==0&&H.push({name:a.name,code:S})}})());if(await Promise.all(K),H.length>0){he.error(`\ngjsify check: ${H.length} of ${F.length} workspace(s) failed:`);for(let n of H)he.error(` ✗ ${n.name} (exit ${n.code})`);return process.exit(1)}n.verbose&&he.log(`\ngjsify check: ${F.length} workspace(s) green.`),process.exit(0)}}});function manifestPath(){let n=_s(fileURLToPath(import.meta.url)),a=[ms(n,`..`,`..`,`showcases.json`),ms(n,`..`,`showcases.json`)];return a.find(n=>existsSync(n))??a[0]}function discoverShowcases(){let n=manifestPath();if(!existsSync(n))return[];let a;try{a=JSON.parse(readFileSync(n,`utf-8`))}catch{return[]}if(!Array.isArray(a.showcases))return[];let S=a.showcases.map(n=>({name:n.name,packageName:n.package,category:n.category,description:n.description??``,needsWebgl:!!n.needsWebgl}));return S.sort((n,a)=>n.category.localeCompare(a.category)||n.name.localeCompare(a.name)),S}function findShowcase(n){return discoverShowcases().find(a=>a.name===n)}var PM=__esmMin(()=>{ul(),Ts(),nn()});function parseSpec$1(n){if(!n)throw Error(`dlx: empty package spec`);if(n.startsWith(`./`)||n.startsWith(`../`)||ps(n)||existsSync(n))return{kind:`local`,path:ds(n)};let a=n,S,C=n.lastIndexOf(`@`);if(C>0&&(a=n.slice(0,C),S=n.slice(C+1)),!FM.test(a))throw Error(`dlx: invalid package name "${a}"`);return{kind:`registry`,name:a,version:S,spec:n}}var FM,IM=__esmMin(()=>{ul(),Ts(),FM=/^(?:@[a-z0-9-~][a-z0-9-._~]*\/)?[a-z0-9-~][a-z0-9-._~]*$/,__name$1(parseSpec$1,`parseSpec`)});function resolveGjsEntry(n,a){let S=ms(n,`package.json`);if(!existsSync(S))throw Error(`dlx: no package.json found at ${n}`);let C=JSON.parse(readFileSync(S,`utf-8`)),N=C.gjsify?.bin,F=C.gjsify?.main,I=C.main,H,W=null,K=!1;if(a!==null){if(!N||!N[a]){let S=N?Object.keys(N).join(`, `):`(none)`;throw Error(`dlx: package "${C.name??n}" has no GJS bin named "${a}" — known: ${S}`)}H=N[a],W=a}else if(N&&Object.keys(N).length===1){let n=Object.keys(N)[0];H=N[n],W=n}else F?H=F:I&&(H=I,K=!0);if(N&&Object.keys(N).length>1&&a===null){let a=Object.keys(N).join(`, `);throw Error(`dlx: package "${C.name??n}" defines multiple GJS bins — pass one of: ${a}`)}if(!H)throw Error(`dlx: package "${C.name??n}" has no GJS entry — set \`gjsify.main\` (or \`gjsify.bin\`) in its package.json`);let q=ds(n,H);if(!existsSync(q))throw Error(`dlx: GJS entry not found: ${q}`);return{bundlePath:q,binName:W,fromFallback:K}}function resolveNodeEntry(n){let a=ms(n,`package.json`);if(!existsSync(a))throw Error(`no package.json found at ${n}`);let S=JSON.parse(readFileSync(a,`utf-8`)),C=S.gjsify?.example?.node;if(C){let a=ds(n,C);if(!existsSync(a))throw Error(`declared node entry not found: ${a} (gjsify.example.node)`);return a}let N=S.gjsify?.main??(S.gjsify?.bin?Object.values(S.gjsify.bin)[0]:void 0)??S.main;if(!N)throw Error(`package "${S.name??n}" has no entry to derive a node bundle from — set \`gjsify.example.node\` to its \`--app node\` bundle path.`);let F=N.replace(/\.gjs\.(js|mjs|cjs)$/,``).replace(/\.(js|mjs|cjs)$/,``),I=[`${F}.node.mjs`,`${F}.node.js`,`${F}.node.cjs`];for(let a of I){let S=ds(n,a);if(existsSync(S))return S}throw Error(`package "${S.name??n}" has no \`--app node\` bundle — looked for ${I.join(`, `)}.\n Build one (e.g. \`gjsify build src/app.ts --app node --outfile dist/app.node.mjs\`) or set \`gjsify.example.node\` to its path.`)}var LM=__esmMin(()=>{ul(),Ts()});function lexCompare(n,a){return n<a?-1:+(n>a)}function createCacheKey(n){let a=[...n.packages].sort(lexCompare),S=Object.entries(n.registries??{}).sort(([n],[a])=>lexCompare(n,a)),C=JSON.stringify([a,S]);return createHash(`sha256`).update(C).digest(`hex`)}function dlxCacheRoot(){let n=process.env.XDG_CACHE_HOME,a=ms(n&&n.length>0?n:ms(homedir(),`.cache`),`gjsify`,`dlx`);return mkdirSync(a,{recursive:!0}),a}function cacheDirFor(n){let a=ms(dlxCacheRoot(),n);return mkdirSync(a,{recursive:!0}),a}function makePrepareDir(n){let a=ms(n,`${Date.now().toString(16)}-${process.pid.toString(16)}`);return mkdirSync(a,{recursive:!0}),a}function getValidCachedPkg(n,a=zM){let S=ms(n,`pkg`),C;try{C=lstatSync(S)}catch(n){if(n.code===`ENOENT`)return;throw n}if(!C.isSymbolicLink())return;let N;try{N=realpathSync(S)}catch{return}return Date.now()-C.mtime.getTime()<=a*RM?N:void 0}function symlinkSwap(n,a){let S=ms(n,`pkg`),C=ms(n,`pkg.tmp-${Date.now().toString(16)}-${process.pid.toString(16)}`);symlinkSync(a,C,`dir`);try{renameSync(C,S)}catch(n){let a=n.code;if(a===`EBUSY`||a===`EPERM`||a===`EEXIST`)return rmSync(C,{force:!0}),realpathSync(S);throw n}return realpathSync(S)}function resolveInstalledPkgDir(n,a){return ds(n,`node_modules`,a)}var RM,zM,BM=__esmMin(()=>{vo(),ul(),am(),Ts(),RM=6e4,zM=1440*7});function makeProgressReporter(n={}){if(n.enabled===!1)return HM;let a=n.stream??process.stderr,S=!!a.isTTY;return n.enabled??!0?S?makeTtyReporter(a):makePlainReporter(a):HM}function makeTtyReporter(n){let a=0,S=``;function render(C,N=!1){let F=Date.now();!N&&F-a<33&&C===S||(a=F,S=C,n.write(`\r\x1B[2K`+C))}function clearLine(){n.write(`\r\x1B[2K`),S=``}return{beginPhase(a,S){render(formatBar(a,0,S,void 0,n.columns??80),!0)},update(a){render(formatBar(a.phase,a.current,a.total,a.name,n.columns??80))},endPhase(a){let S=VM[a];clearLine(),n.write(`gjsify install: ${S} done\n`)}}}function makePlainReporter(n){let a=0,S=0;return{beginPhase(C,N){a=Date.now(),S=0,n.write(`gjsify install: ${VM[C]} ${N} package(s)\n`)},update(C){let N=Date.now();if(N-a<UM||C.current<=S)return;a=N,S=C.current;let F=C.total>0?Math.round(C.current/C.total*100):0;n.write(`gjsify install: ${VM[C.phase]} ${C.current}/${C.total} (${F}%)\n`)},endPhase(a){n.write(`gjsify install: ${VM[a]} done\n`)}}}function formatBar(n,a,S,C,N){let F=VM[n],I=S>0?Math.min(1,a/S):0,H=`${a}/${S}`,W=`gjsify install: ${F} `,K=` ${H}`+(C?` ${C}`:``),q=Math.max(8,Math.min(40,N-W.length-K.length-4)),Y=Math.round(I*q),X=`█`.repeat(Y)+`░`.repeat(q-Y),te=`${W}[${X}]${K}`;if(te.length>N){let n=te.length-N+1,a=C&&C.length>n?C.slice(0,C.length-n-1)+`…`:``;te=`${W}[${X}] ${H}${a?` `+a:``}`}return te}var VM,HM,UM,WM=__esmMin(()=>{VM={resolve:`resolving`,download:`downloading`,extract:`extracting`,link:`linking bins`},HM={update(){},beginPhase(){},endPhase(){}},UM=5e3});function parse(n){try{return new SemVer(n)}catch{return null}}function compare(n,a){let S=n instanceof SemVer?n:new SemVer(n),C=a instanceof SemVer?a:new SemVer(a);return S.compare(C)}function satisfies(n,a){let S=a instanceof qM?a:new qM(a),C=n instanceof SemVer?n:parse(String(n));return C?S.test(C):!1}function maxSatisfying(n,a){let S=a instanceof qM?a:new qM(a),C=null;for(let a of n){let n=parse(a);!n||!S.test(n)||(C===null||n.compare(C)>0)&&(C=n)}return C?C.version:null}function testComparator(n,a){if(n.semver===null)return!0;let S=a.compare(n.semver);switch(n.operator){case``:case`=`:return S===0;case`<`:return S<0;case`<=`:return S<=0;case`>`:return S>0;case`>=`:return S>=0}}function formatComparator(n){return n.semver===null?`*`:`${n.operator}${n.semver.version}`}function parseRangePart(n){let a=n.trim();if(a===``||a===`*`||a.toLowerCase()===`latest`)return[{operator:`>=`,semver:new SemVer(`0.0.0`)}];let S=a.match(/^\s*(\S+)\s+-\s+(\S+)\s*$/);if(S)return hyphenRange(S[1],S[2]);let C=a.replace(/(<=|>=|<|>|=)\s+(?=\S)/g,`$1`).split(/\s+/),N=[];for(let n of C)N.push(...parseSimple(n));return N}function parseSimple(n){if(n===`*`||n===``||n.toLowerCase()===`latest`)return[{operator:`>=`,semver:new SemVer(`0.0.0`)}];if(n.startsWith(`^`))return caretRange(n.slice(1));if(n.startsWith(`~`))return tildeRange(n.slice(1).replace(/^>/,``));let a=n.match(/^(<=|>=|<|>|=)\s*(.+)$/);if(a){let n=a[1];return primitiveRange(n,a[2])}return partialRange(n)}function parsePartial(n){let a=n.trim().replace(/^v/,``);if(a===``||a===`*`)return{major:null,minor:null,patch:null,pre:``,build:``};let S=``,C=``,N=a,F=N.indexOf(`+`);F>=0&&(C=N.slice(F+1),N=N.slice(0,F));let I=N.indexOf(`-`);I>=0&&(S=N.slice(I+1),N=N.slice(0,I));let H=N.split(`.`),xr=a=>{if(a===void 0||a===``||a===`x`||a===`X`||a===`*`)return null;if(!/^\d+$/.test(a))throw TypeError(`Invalid partial version: ${n}`);return Number(a)};return{major:xr(H[0]),minor:xr(H[1]),patch:xr(H[2]),pre:S,build:C}}function partialToVersion(n){return`${n.major??0}.${n.minor??0}.${n.patch??0}${n.pre?`-${n.pre}`:``}${n.build?`+${n.build}`:``}`}function partialRange(n){let a=parsePartial(n);return a.major===null?[{operator:`>=`,semver:new SemVer(`0.0.0`)}]:a.minor===null?[{operator:`>=`,semver:new SemVer(`${a.major}.0.0`)},{operator:`<`,semver:new SemVer(`${a.major+1}.0.0`)}]:a.patch===null?[{operator:`>=`,semver:new SemVer(`${a.major}.${a.minor}.0`)},{operator:`<`,semver:new SemVer(`${a.major}.${a.minor+1}.0`)}]:[{operator:`=`,semver:new SemVer(partialToVersion(a))}]}function caretRange(n){let a=parsePartial(n);if(a.major===null)return[{operator:`>=`,semver:new SemVer(`0.0.0`)}];let S=`${a.major}.${a.minor??0}.${a.patch??0}${a.pre?`-${a.pre}`:``}`,C;return C=a.major>0||a.minor===null?`${a.major+1}.0.0`:a.minor>0||a.patch===null?`0.${a.minor+1}.0`:`0.0.${a.patch+1}`,[{operator:`>=`,semver:new SemVer(S)},{operator:`<`,semver:new SemVer(C)}]}function tildeRange(n){let a=parsePartial(n);if(a.major===null)return[{operator:`>=`,semver:new SemVer(`0.0.0`)}];let S=`${a.major}.${a.minor??0}.${a.patch??0}${a.pre?`-${a.pre}`:``}`,C=a.minor===null?`${a.major+1}.0.0`:`${a.major}.${a.minor+1}.0`;return[{operator:`>=`,semver:new SemVer(S)},{operator:`<`,semver:new SemVer(C)}]}function primitiveRange(n,a){let S=parsePartial(a);return S.major===null?[{operator:`>=`,semver:new SemVer(`0.0.0`)}]:n===`=`||n===``?partialRange(a):n===`>`?S.minor===null?[{operator:`>=`,semver:new SemVer(`${S.major+1}.0.0`)}]:S.patch===null?[{operator:`>=`,semver:new SemVer(`${S.major}.${S.minor+1}.0`)}]:[{operator:`>`,semver:new SemVer(partialToVersion(S))}]:n===`<`?S.minor===null?[{operator:`<`,semver:new SemVer(`${S.major}.0.0`)}]:S.patch===null?[{operator:`<`,semver:new SemVer(`${S.major}.${S.minor}.0`)}]:[{operator:`<`,semver:new SemVer(partialToVersion(S))}]:n===`>=`?[{operator:`>=`,semver:new SemVer(partialToVersion(S))}]:S.minor===null?[{operator:`<`,semver:new SemVer(`${S.major+1}.0.0`)}]:S.patch===null?[{operator:`<`,semver:new SemVer(`${S.major}.${S.minor+1}.0`)}]:[{operator:`<=`,semver:new SemVer(partialToVersion(S))}]}function hyphenRange(n,a){let S=parsePartial(n),C=parsePartial(a),N=S.major===null?{operator:`>=`,semver:new SemVer(`0.0.0`)}:{operator:`>=`,semver:new SemVer(`${S.major}.${S.minor??0}.${S.patch??0}${S.pre?`-${S.pre}`:``}`)},F;return F=C.major===null?{operator:`>=`,semver:new SemVer(`0.0.0`)}:C.minor===null?{operator:`<`,semver:new SemVer(`${C.major+1}.0.0`)}:C.patch===null?{operator:`<`,semver:new SemVer(`${C.major}.${C.minor+1}.0`)}:{operator:`<=`,semver:new SemVer(`${C.major}.${C.minor}.${C.patch}${C.pre?`-${C.pre}`:``}`)},[N,F]}var GM,KM,SemVer,qM,JM=__esmMin(()=>{GM=/^(0|[1-9]\d*)$/,KM=/^(\d+)\.(\d+)\.(\d+)(?:-((?:[0-9A-Za-z-]+)(?:\.[0-9A-Za-z-]+)*))?(?:\+([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?$/,SemVer=class{major;minor;patch;prerelease;build;version;constructor(n){let a=String(n).trim().replace(/^v/,``),S=KM.exec(a);if(!S)throw TypeError(`Invalid Version: ${n}`);this.major=Number(S[1]),this.minor=Number(S[2]),this.patch=Number(S[3]),this.prerelease=S[4]?S[4].split(`.`).map(n=>GM.test(n)?Number(n):n):[],this.build=S[5]?S[5].split(`.`):[],this.version=`${this.major}.${this.minor}.${this.patch}`+(this.prerelease.length?`-${this.prerelease.join(`.`)}`:``)+(this.build.length?`+${this.build.join(`.`)}`:``)}compare(n){return this.major===n.major?this.minor===n.minor?this.patch===n.patch?this.comparePre(n):this.patch<n.patch?-1:1:this.minor<n.minor?-1:1:this.major<n.major?-1:1}comparePre(n){let a=this.prerelease,S=n.prerelease;if(a.length===0&&S.length===0)return 0;if(a.length===0)return 1;if(S.length===0)return-1;for(let n=0;;n++){let C=a[n],N=S[n];if(C===void 0&&N===void 0)return 0;if(N===void 0)return 1;if(C===void 0)return-1;if(C===N)continue;let F=typeof C==`number`,I=typeof N==`number`;return F&&!I?-1:!F&&I?1:C<N?-1:1}}toString(){return this.version}},qM=class Range{raw;set;constructor(n){if(n instanceof Range){this.raw=n.raw,this.set=n.set;return}this.raw=String(n).trim();let a=this.raw.split(/\s*\|\|\s*/),S=[];for(let n of a){let a=parseRangePart(n);if(a.length===0)throw TypeError(`Invalid range: ${this.raw}`);S.push(a)}if(S.length===0)throw TypeError(`Invalid range: ${this.raw}`);this.set=S}test(n){let a=n instanceof SemVer?n:parse(String(n));if(!a)return!1;for(let n of this.set)if(n.every(n=>testComparator(n,a))){if(a.prerelease.length>0&&!n.some(n=>n.semver!==null&&n.semver.prerelease.length>0&&n.semver.major===a.major&&n.semver.minor===a.minor&&n.semver.patch===a.patch))continue;return!0}return!1}format(){return this.set.map(n=>n.map(formatComparator).join(` `)).join(` || `)}toString(){return this.format()}}});function buildHeaders(n,a){let S={"user-agent":`gjsify-install/0.26.0`,"accept-encoding":a.acceptEncoding??`identity`};if(a.npmrc){let C=resolveAuthForUrl(n,a.npmrc);C&&(S.authorization=C)}if(a.headers)for(let[n,C]of Object.entries(a.headers))S[n.toLowerCase()]=C;return S}function resolveAuthForUrl(n,a){let S=pathPrefixes(new URL(n));for(let n of S){let S=a.authTokens[n];if(S)return`Bearer ${S}`;let C=a.basicAuth[n];if(C)return`Basic ${btoa(`${C.username}:${C.password}`)}`}return null}function pathPrefixes(n){let a=n.pathname.split(`/`).filter(Boolean),S=[];for(let C=a.length;C>=0;C--){let N=a.slice(0,C).join(`/`);S.push(N?`//${n.host}/${N}`:`//${n.host}`)}return S}var YM=__esmMin(()=>{}),PackageNotFoundError,IntegrityError,RegistryTimeoutError,XM=__esmMin(()=>{PackageNotFoundError=class extends Error{name;url;constructor(n,a){super(`Package not found in registry: ${n} (${a})`),this.name=n,this.url=a,this.name=`PackageNotFoundError`}},IntegrityError=class extends Error{url;integrity;constructor(n,a){super(`Tarball integrity mismatch for ${n} (expected ${a})`),this.url=n,this.integrity=a,this.name=`IntegrityError`}},RegistryTimeoutError=class extends Error{url;timeoutMs;attempts;constructor(n,a,S){let C=Math.round(a/100)/10,N=Math.round(a*S/100)/10;super(`@gjsify/npm-registry: GET ${n} timed out after ${C}s × ${S} attempt(s) (total ~${N}s). This usually means the registry CDN is slow or unreachable.`),this.url=n,this.timeoutMs=a,this.attempts=S,this.name=`RegistryTimeoutError`}}});function registryFor(n,a){if(a&&n.startsWith(`@`)){let S=n.slice(0,n.indexOf(`/`)),C=a.scopes[S];if(C)return ensureTrailingSlash$1(C)}return a?.registry?ensureTrailingSlash$1(a.registry):ZM}function parseNpmrc(n){let a={registry:ZM,scopes:{},authTokens:{},basicAuth:{}},S=n.split(/\r?\n/),C={};for(let n of S){let S=n.replace(/^\s+|\s+$/g,``);if(!S||S.startsWith(`#`)||S.startsWith(`;`))continue;let N=S.indexOf(`=`);if(N<0)continue;let F=S.slice(0,N).trim(),I=expandEnv(stripQuotes(S.slice(N+1).trim()));if(F===`registry`){a.registry=ensureTrailingSlash$1(I);continue}let H=F.match(/^(@[^:]+):registry$/);if(H){a.scopes[H[1]]=ensureTrailingSlash$1(I);continue}let W=F.match(/^\/\/(.+):_authToken$/);if(W){a.authTokens[normalizeAuthHost(W[1])]=I;continue}let K=F.match(/^\/\/(.+):username$/);if(K){(C[normalizeAuthHost(K[1])]??={}).user=I;continue}let q=F.match(/^\/\/(.+):_password$/);if(q){let n=base64Decode(I);(C[normalizeAuthHost(q[1])]??={}).pass=n;continue}}for(let[n,S]of Object.entries(C))S.user&&S.pass!==void 0&&(a.basicAuth[n]={username:S.user,password:S.pass});return a}function normalizeAuthHost(n){return`//${n.replace(/\/+$/,``)}`}function ensureTrailingSlash$1(n){return n.endsWith(`/`)?n:n+`/`}function stripQuotes(n){return n.startsWith(`"`)&&n.endsWith(`"`)||n.startsWith(`'`)&&n.endsWith(`'`)?n.slice(1,-1):n}function expandEnv(n){return n.replace(/\$\{([A-Z0-9_]+)\}/gi,(n,a)=>globalThis.process?.env?.[a]??``)}function base64Decode(n){return atob(n)}var ZM,QM=__esmMin(()=>{ZM=`https://registry.npmjs.org/`,__name$1(ensureTrailingSlash$1,`ensureTrailingSlash`)});async function fetchWithRetry(n,a,S){let C=S.fetch??globalThis.fetch;if(!C)throw Error(`@gjsify/npm-registry: globalThis.fetch is missing`);let N=Math.max(0,S.retries??3),F=Math.max(0,S.retryDelayMs??250),I=Math.max(0,S.timeoutMs??3e4),H=S.retryNotFound??!1,W=0,K,q=0;for(;;){if(a.signal?.aborted)throw signalAbortError(a.signal);let Y=I>0?new AbortController:null,X=Y===null?null:setTimeout(()=>Y.abort(Error(`@gjsify/npm-registry: per-request timeout ${I}ms`)),I),te=composeSignals(a.signal,Y?.signal);try{let S=await C(n,{...a,signal:te}),F=isRetryableStatus(S.status)||H&&S.status===404;if(S.ok||!F||W>=N)return S;try{await S.arrayBuffer()}catch{}K=Error(`HTTP ${S.status} ${S.statusText}`)}catch(S){let C=Y!==null&&Y.signal.aborted,F=a.signal?.aborted===!0;if(C&&!F){if(q++,W>=N)throw new RegistryTimeoutError(n,I,q);K=S}else if(F)throw signalAbortError(a.signal);else{if(!isRetryableError(S)||W>=N)throw S;K=S}}finally{X!==null&&clearTimeout(X)}let ne=Math.min(F*2**W,8e3);S.onRetry?.({attempt:W+1,error:K,delayMs:ne}),await delay$1(ne,a.signal),W++}}function composeSignals(n,a){return n?a?AbortSignal.any([n,a]):n:a}function isRetryableStatus(n){return n===408||n===425||n===429||n===500||n===502||n===503||n===504||n===521||n===522||n===524||n===525}function isRetryableError(n){if(n&&typeof n==`object`&&`name`in n&&n.name===`AbortError`)return!1;if(n instanceof TypeError)return!0;if(n&&typeof n==`object`&&`name`in n){let a=n.name;if(a===`FetchError`)return!0;if(a===`AbortError`)return!1}let a=n?.cause;if(a&&typeof a==`object`&&`code`in a){let n=a.code;if(typeof n==`string`)return n===`ECONNRESET`||n===`ECONNREFUSED`||n===`ENETUNREACH`||n===`ENOTFOUND`||n===`ETIMEDOUT`||n===`EAI_AGAIN`||n===`UND_ERR_SOCKET`||n===`UND_ERR_CONNECT_TIMEOUT`}return!1}function delay$1(n,a){return n<=0?Promise.resolve():new Promise((S,C)=>{let N=setTimeout(()=>{a?.removeEventListener?.(`abort`,onAbort),S()},n),onAbort=()=>{clearTimeout(N),C(signalAbortError(a))};if(a?.aborted){clearTimeout(N),C(signalAbortError(a));return}a?.addEventListener?.(`abort`,onAbort,{once:!0})})}function signalAbortError(n){let a=n&&`reason`in n?n.reason:void 0;if(a instanceof Error)return a;let S=Error(`Aborted`);return S.name=`AbortError`,S}var $M=__esmMin(()=>{XM(),__name$1(delay$1,`delay`)});async function verifyIntegrity(n,a){let S=a.trim().split(/\s+/);for(let a of S){let S=a.indexOf(`-`);if(S<0)continue;let C=a.slice(0,S).toLowerCase(),N=a.slice(S+1),F=globalThis.crypto?.subtle;if(!F)throw Error(`@gjsify/npm-registry: globalThis.crypto.subtle is missing`);let I=subriToWebCryptoAlgo(C);if(!I)continue;let H=await F.digest(I,dataAsArrayBuffer(n));if(bytesToBase64(new Uint8Array(H))===N)return!0}return!1}function subriToWebCryptoAlgo(n){switch(n){case`sha1`:return`SHA-1`;case`sha256`:return`SHA-256`;case`sha384`:return`SHA-384`;case`sha512`:return`SHA-512`;default:return null}}function dataAsArrayBuffer(n){if(n.byteOffset===0&&n.byteLength===n.buffer.byteLength)return n.buffer;let a=new Uint8Array(n.byteLength);return a.set(n),a.buffer}function bytesToBase64(n){let a=``;for(let S=0;S<n.length;S++)a+=String.fromCharCode(n[S]);return btoa(a)}var eN=__esmMin(()=>{});function assertPackument(n,a){if(!a||typeof a!=`object`)throw TypeError(`registry: ${n} packument is not an object`);let S=a;if(typeof S.name!=`string`)throw TypeError(`registry: ${n} packument missing string name`);if(!S.versions||typeof S.versions!=`object`)throw TypeError(`registry: ${n} packument missing versions map`)}function packumentUrl(n,a){let S=ensureTrailingSlash$1(a);if(n.startsWith(`@`)){let a=n.indexOf(`/`);if(a<0)throw TypeError(`Invalid scoped package name: ${n}`);let C=n.slice(0,a),N=n.slice(a+1);return`${S}${encodeURIComponent(C)}/${encodeURIComponent(N)}`}return`${S}${encodeURIComponent(n)}`}async function fetchPackumentConditional(n,a={}){let S=packumentUrl(n,a.registry??registryFor(n,a.npmrc)),C=buildHeaders(S,{...a,acceptEncoding:`gzip`});C.accept??=`application/vnd.npm.install-v1+json`,a.ifNoneMatch&&(C[`if-none-match`]=a.ifNoneMatch);let N=await fetchWithRetry(S,{headers:C,signal:a.signal},{fetch:a.fetch,retries:a.retries,retryDelayMs:a.retryDelayMs,timeoutMs:a.timeoutMs,onRetry:a.onRetry});if(N.status===304){try{await N.arrayBuffer()}catch{}return{status:`not-modified`,etag:a.ifNoneMatch}}if(!N.ok)throw N.status===404||N.status===406?new PackageNotFoundError(n,S):Error(`registry GET ${S} -> ${N.status} ${N.statusText}`);let F=N.headers.get(`etag`)??void 0,I=await decodeJsonBody(N);return assertPackument(n,I),{status:`fresh`,packument:I,etag:F}}async function decodeJsonBody(n){return n.json()}async function fetchPackument(n,a={}){let S=await fetchPackumentConditional(n,a);if(!S.packument)throw Error(`registry: ${n} returned 304 Not Modified to an unconditional request`);return S.packument}var tN=__esmMin(()=>{YM(),XM(),QM(),$M()});async function fetchTarball(n,a={}){let S=buildHeaders(n,{...a,acceptEncoding:`identity`});S.accept??=`application/octet-stream`;let C=await fetchWithRetry(n,{headers:S,signal:a.signal},{fetch:a.fetch,retries:a.retries,retryDelayMs:a.retryDelayMs,timeoutMs:a.timeoutMs,onRetry:a.onRetry,retryNotFound:a.retryNotFound??!0});if(!C.ok)throw Error(`tarball GET ${n} -> ${C.status} ${C.statusText}`);let N=new Uint8Array(await C.arrayBuffer());if(a.integrity&&!await verifyIntegrity(N,a.integrity))throw new IntegrityError(n,a.integrity);return N}var nN=__esmMin(()=>{YM(),XM(),$M(),eN()});async function whoami(n,a){let S=`${ensureTrailingSlash$1(n)}-/whoami`,C=buildHeaders(S,{npmrc:a});C.accept=`application/json`;let N=globalThis.fetch;if(!N)throw Error(`@gjsify/npm-registry: globalThis.fetch is missing`);let F=await N(S,{method:`GET`,headers:C});if(!F.ok)throw Error(`whoami GET ${S} -> ${F.status} ${F.statusText}`);let I=await F.json();if(I&&typeof I==`object`&&`username`in I){let n=I.username;if(typeof n==`string`&&n.length>0)return{username:n}}return{}}var rN=__esmMin(()=>{YM(),QM()}),iN=__esmMin(()=>{YM(),QM(),tN(),nN(),rN()});function parseTar(n){let a=[],S=null,C=null,N=null,F=0;for(;F+512<=n.length;){let I=n.subarray(F,F+512);if(allZeros(I)){let a=n.subarray(F+512,F+2*512);if(a.length===512&&allZeros(a))break;F+=512;continue}if(!validateChecksum(I))throw new TarParseError(`Bad header checksum at offset ${F} — file is not a valid tar archive`);let H=readString(I,0,100),W=parseOctal(I,100,8),K=parseOctal(I,124,12),q=parseOctal(I,136,12),Y=String.fromCharCode(I[156]||0),X=readString(I,157,100),te=readString(I,257,6),ne=readString(I,345,155),re=readString(I,265,32),ie=readString(I,297,32);F+=512;let ae=n.subarray(F,F+K);if(F+=alignToBlock(K),Y===`x`){S=parsePaxRecords(ae);continue}if(Y===`g`)continue;if(Y===`L`){C=bytesToString(ae).replace(/\0+$/,``);continue}if(Y===`K`){N=bytesToString(ae).replace(/\0+$/,``);continue}let oe=H;te===`ustar`&&ne!==``&&(oe=`${ne}/${H}`),C!==null&&(oe=C,C=null);let Z=X;if(N!==null&&(Z=N,N=null),S!==null){let C=S.get(`path`);C!==void 0&&(oe=C);let N=S.get(`linkpath`);N!==void 0&&(Z=N);let I=S.get(`size`);if(I!==void 0){let C=Number(I);if(Number.isFinite(C)){let N=F-alignToBlock(K),I=n.subarray(N,N+C);F=N+alignToBlock(C),S=null,a.push(buildEntry(oe,Z,Y,W,q,re,ie,I));continue}}S=null}a.push(buildEntry(oe,Z,Y,W,q,re,ie,ae))}return a}function buildEntry(n,a,S,C,N,F,I,H){return{name:n,linkname:a,type:typeflagToType(S,n),mode:C,mtime:N,body:H,uname:F,gname:I}}function typeflagToType(n,a){switch(n){case`0`:case`\0`:case``:return a.endsWith(`/`)?`directory`:`file`;case`1`:return`hardlink`;case`2`:return`symlink`;case`5`:return`directory`;case`x`:return`pax-header`;case`g`:return`pax-global`;case`L`:return`gnu-longname`;case`K`:return`gnu-longlink`;default:return`unknown`}}function parsePaxRecords(n){let a=new Map,S=0;for(;S<n.length;){let C=S;for(;C<n.length&&n[C]!==32;)C++;if(C>=n.length)break;let N=bytesToString(n.subarray(S,C)),F=Number(N);if(!Number.isFinite(F)||F<=0)break;let I=S+F;if(I>n.length)break;let H=bytesToString(n.subarray(C+1,I-1)),W=H.indexOf(`=`);if(W>0){let n=H.slice(0,W),S=H.slice(W+1);a.set(n,S)}S=I}return a}function readString(n,a,S){let C=a,N=a+S;for(;C<N&&n[C]!==0;)C++;return bytesToString(n.subarray(a,C))}function bytesToString(n){return new TextDecoder(`utf-8`,{fatal:!1}).decode(n)}function parseOctal(n,a,S){if(S>0&&n[a]&128){let C=n[a]&127;for(let N=1;N<S;N++)C=C*256+n[a+N];return C}let C=``;for(let N=0;N<S;N++){let S=n[a+N];S===0||S===32||(C+=String.fromCharCode(S))}return C===``?0:parseInt(C,8)}function alignToBlock(n){return Math.ceil(n/512)*512}function allZeros(n){for(let a=0;a<n.length;a++)if(n[a]!==0)return!1;return!0}function validateChecksum(n){let a=parseOctal(n,148,8),S=0,C=0;for(let a=0;a<512;a++){let N=a>=148&&a<156?32:n[a];S+=N,C+=N>127?N-256:N}return a===S||a===C}var TarParseError,aN=__esmMin(()=>{TarParseError=class extends Error{constructor(n){super(n),this.name=`TarParseError`}}});function createTarball(n){let a=[];for(let S of n){if(`directory`in S&&S.directory===!0){a.push(buildHeader(ensureTrailingSlash(S.name),0,`5`,S.mode??493,S.mtime??0));continue}let n=S,C=typeof n.body==`string`?new TextEncoder().encode(n.body):n.body,N=n.mode??defaultFileMode(C);a.push(buildHeader(n.name,C.byteLength,`0`,N,n.mtime??0)),a.push(C);let F=padTo512(C.byteLength);F>0&&a.push(new Uint8Array(F))}return a.push(new Uint8Array(512*2)),concatChunks(a)}function buildHeader(n,a,S,C,N){let{prefix:F,basename:I}=splitPathForUstar(n),H=new Uint8Array(512);writeAscii(H,I,0,100),writeOctal(H,C&4095,100,7),H[107]=0,writeOctal(H,0,108,7),H[115]=0,writeOctal(H,0,116,7),H[123]=0,writeOctal(H,a,124,11),H[135]=0,writeOctal(H,N,136,11),H[147]=0;for(let n=148;n<156;n++)H[n]=32;H[156]=S.charCodeAt(0),writeAscii(H,`ustar\0`,257,6),writeAscii(H,`00`,263,2),F&&writeAscii(H,F,345,155);let W=0;for(let n=0;n<512;n++)W+=H[n];return writeAscii(H,W.toString(8).padStart(6,`0`),148,6),H[154]=0,H[155]=32,H}function splitPathForUstar(n){if(n.length<=100)return{prefix:``,basename:n};if(n.length>255)throw Error(`createTarball: path too long (${n.length} > 255 chars): ${n}`);for(let a=Math.min(n.length-1,155);a>0;a--)if(n[a]===`/`&&n.length-a-1<=100)return{prefix:n.slice(0,a),basename:n.slice(a+1)};throw Error(`createTarball: cannot split path into ustar prefix+basename (basename slot is 100 chars): ${n}`)}function writeAscii(n,a,S,C){let N=new TextEncoder().encode(a);if(N.length>C)throw Error(`createTarball: field too long (${N.length} > ${C}): "${a}"`);n.set(N,S)}function writeOctal(n,a,S,C){writeAscii(n,a.toString(8).padStart(C,`0`),S,C)}function padTo512(n){let a=n%512;return a===0?0:512-a}function ensureTrailingSlash(n){return n.endsWith(`/`)?n:`${n}/`}function defaultFileMode(n){return n.length>=2&&n[0]===35&&n[1]===33?493:420}function concatChunks(n){let a=0;for(let S of n)a+=S.byteLength;let S=new Uint8Array(a),C=0;for(let a of n)S.set(a,C),C+=a.byteLength;return S}var oN=__esmMin(()=>{});async function extractTarball(n,a,S={}){let C=n instanceof Uint8Array?n:new Uint8Array(n),N=parseTar(S.gzip??(C.length>=2&&C[0]===31&&C[1]===139)?await gunzip(C):C);mkdirSync(a,{recursive:!0});let F=S.strip??1,I=S.preventEscape??!0,H={files:[],directories:[],symlinks:[],skipped:0};for(let n of N){let C=stripComponents(n.name,F);if(C===null||C===``){H.skipped++;continue}let N=ds(a,C);if(I&&!isInside(N,a))throw Error(`tar: refusing to extract ${n.name} outside ${a} (resolved=${N})`);if(S.filter&&!S.filter(n,N)){H.skipped++;continue}if(n.type===`directory`){mkdirSync(N,{recursive:!0}),H.directories.push(N);continue}if(n.type===`file`){mkdirSync(_s(N),{recursive:!0}),writeFileSync(N,n.body);let a=S.chmod?.(n,N)??n.mode&511;if(a>0)try{chmodSync(N,a)}catch{}H.files.push(N);continue}if(n.type===`symlink`){mkdirSync(_s(N),{recursive:!0});try{symlinkSync(n.linkname,N),H.symlinks.push(N)}catch{writeFileSync(N,n.linkname),H.files.push(N)}continue}H.skipped++}return H}async function gunzip(n){let a=globalThis.DecompressionStream;if(typeof a!=`function`)throw Error(`@gjsify/tar: globalThis.DecompressionStream is not available — import '@gjsify/compression-streams/register' on GJS to register it`);return drainStream(new Blob([new Uint8Array(n)]).stream().pipeThrough(new a(`gzip`)))}async function gzip(n){let a=globalThis.CompressionStream;if(typeof a!=`function`)throw Error(`@gjsify/tar: globalThis.CompressionStream is not available — import '@gjsify/compression-streams/register' on GJS to register it`);return drainStream(new Blob([new Uint8Array(n)]).stream().pipeThrough(new a(`gzip`)))}async function drainStream(n){let a=[],S=0,C=n.getReader();for(;;){let{value:n,done:N}=await C.read();if(N)break;let F=n instanceof Uint8Array?n:new Uint8Array(n);a.push(F),S+=F.length}let N=new Uint8Array(S),F=0;for(let n of a)N.set(n,F),F+=n.length;return N}function stripComponents(n,a){if(a<=0)return n;let S=n.split(`/`).filter(n=>n!==``);return S.length<=a?null:S.slice(a).join(`/`)}function isInside(n,a){let S=hs(a,n);return S!==``&&!S.startsWith(`..`)&&!ps(S)}var sN=__esmMin(()=>{aN(),ul(),Ts()}),cN=__exportAll$4({BLOCK_SIZE:()=>512,TarParseError:()=>TarParseError,createTarball:()=>createTarball,extractTarball:()=>extractTarball,gunzip:()=>gunzip,gzip:()=>gzip,parseTar:()=>parseTar}),lN=__esmMin(()=>{aN(),oN(),sN()});function gjsifyCacheRoot(n,a){let S=process.env.XDG_CACHE_HOME;return ms(S&&S.length>0?S:ms(homedir(),`.cache`),`gjsify`,n,a)}function atomicWrite(n,a){try{atomicWriteStrict(n,a)}catch{}}function atomicWriteStrict(n,a){mkdirSync(ms(n,`..`),{recursive:!0});let S=`${n}.tmp.${process.pid}`;writeFileSync(S,a),renameSync(S,n)}function readCacheFile(n){if(!existsSync(n))return null;try{let a=readFileSync(n);return a.length===0?null:a}catch{return null}}var uN=__esmMin(()=>{ul(),am(),Ts()});function staleMs(){let n=process.env.GJSIFY_INSTALL_LOCK_STALE_MS;if(n!==void 0){let a=Number(n);if(Number.isFinite(a)&&a>0)return a}return pN}function lockingDisabled(){let n=process.env.GJSIFY_INSTALL_LOCK;if(n===void 0)return!1;let a=n.trim();return a===`0`||a===`false`}function isPidAlive(n){if(existsSync(`/proc/self`))return existsSync(`/proc/${n}`);try{return process.kill(n,0),!0}catch(n){return n.code===`EPERM`}}function mtimeMs(n){try{return statSync(n).mtimeMs}catch{return null}}function assessLock(n){let a=ms(n,fN),S=null;try{S=JSON.parse(readFileSync(a,`utf-8`))}catch{S=null}let C=Date.now();if(S&&typeof S.pid==`number`){if(!isPidAlive(S.pid))return{stale:!0,reason:`owner pid ${S.pid} is gone`,ownerPid:S.pid};let n=typeof S.startedAt==`number`?S.startedAt:mtimeMs(a);return n!==null&&C-n>staleMs()?{stale:!0,reason:`owner pid ${S.pid} exceeded the ${staleMs()}ms staleness budget`,ownerPid:S.pid}:{stale:!1,ownerPid:S.pid}}let N=mtimeMs(n);return N===null?{stale:!1}:C-N>mN?{stale:!0,reason:`no owner recorded within the acquire grace period`}:{stale:!1}}function stealStaleLock(n){let a=`${n}.stale-${process.pid}-${++vN}`;try{renameSync(n,a)}catch{return!1}try{rmSync(a,{recursive:!0,force:!0})}catch{}return!0}function abortErr(n){let a=n&&`reason`in n?n.reason:void 0;if(a instanceof Error)return a;let S=Error(`Aborted`);return S.name=`AbortError`,S}function delay(n,a){return n<=0?Promise.resolve():new Promise((S,C)=>{let onAbort=()=>{clearTimeout(N),C(abortErr(a))},N=setTimeout(()=>{a?.removeEventListener?.(`abort`,onAbort),S()},n);if(a?.aborted){clearTimeout(N),C(abortErr(a));return}a?.addEventListener?.(`abort`,onAbort,{once:!0})})}function makeHandle(n){let a=!1;return{release(){if(a)return;a=!0;let S=_N.get(n);if(S&&(S.count--,!(S.count>0))){_N.delete(n);try{let a=JSON.parse(readFileSync(ms(n,fN),`utf-8`));if(a.nonce!==void 0&&a.nonce!==S.nonce)return}catch{}try{rmSync(n,{recursive:!0,force:!0})}catch{}}}}}async function acquireInstallLock(n,a={}){if(lockingDisabled())return{release(){}};let S;try{S=realpathSync(n)}catch{S=ds(n)}let C=ms(S,`node_modules`,dN),N=_N.get(C);if(N)return N.count++,makeHandle(C);mkdirSync(_s(C),{recursive:!0});let F=`${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2)}`,I=hN,H=!1;for(;;){if(a.signal?.aborted)throw abortErr(a.signal);try{return mkdirSync(C),writeFileSync(ms(C,fN),JSON.stringify({pid:process.pid,nonce:F,startedAt:Date.now()})),_N.set(C,{count:1,nonce:F}),makeHandle(C)}catch(n){if(n.code!==`EEXIST`)throw n}let n=assessLock(C);if(n.stale){stealStaleLock(C)&&he.warn(`gjsify install: removed stale install lock (${n.reason}) — ${C}`);continue}if(!H){H=!0;let a=n.ownerPid===void 0?``:` (pid ${n.ownerPid})`;he.warn(`gjsify install: waiting for a concurrent install${a} to release ${C} …`)}await delay(I,a.signal),I=Math.min(Math.round(I*1.6),gN)}}var dN,fN,pN,mN,hN,gN,_N,vN,yN=__esmMin(()=>{ge(),ul(),Ts(),dN=`.gjsify-install-lock`,fN=`owner.json`,pN=35*6e4,mN=15e3,hN=150,gN=1e3,_N=new Map,vN=0});function cacheRoot$1(){return gjsifyCacheRoot(`tarballs`,bN)}function parseSri$1(n){if(!n)return null;let a=n.indexOf(`-`);if(a<=0||a===n.length-1)return null;let S=n.slice(0,a),C=n.slice(a+1).replace(/=+$/,``),N=Ge.from(C,`base64`).toString(`hex`);return N.length<4?null:{algorithm:S,hex:N}}function pathFor$1(n){let a=parseSri$1(n);if(!a)return null;let S=a.hex.slice(0,2);return ms(cacheRoot$1(),a.algorithm,S,`${a.hex}.tgz`)}function getCachedTarball(n){let a=pathFor$1(n);return a?readCacheFile(a):null}function putCachedTarball(n,a){let S=pathFor$1(n);S&&(existsSync(S)||atomicWrite(S,a))}function npmCacacheContentDir(){let n=process.env.GJSIFY_NPM_CACHE;if(n!==void 0){let a=n.trim();return a===``||a===`0`||a===`false`?null:ms(a.endsWith(`_cacache`)?a:ms(a,`_cacache`),`content-v2`)}let a=process.env.npm_config_cache;return ms(a&&a.length>0?a:ms(homedir(),`.npm`),`_cacache`,`content-v2`)}function npmCachePathFor(n){let a=npmCacacheContentDir();if(!a)return null;let S=parseSri$1(n);return S?ms(a,S.algorithm,S.hex.slice(0,2),S.hex.slice(2,4),S.hex.slice(4)):null}function getForeignCachedTarball(n){let a=npmCachePathFor(n);return a?readCacheFile(a):null}var bN,xN=__esmMin(()=>{et(),ul(),am(),Ts(),uN(),bN=`v1`,__name$1(cacheRoot$1,`cacheRoot`),__name$1(parseSri$1,`parseSri`),__name$1(pathFor$1,`pathFor`)});function isEnabled(){let n=process.env.GJSIFY_PACKUMENT_CACHE;if(n===void 0)return!0;let a=n.trim();return!(a===`0`||a===`false`||a===``)}function cacheRoot(){return gjsifyCacheRoot(`metadata`,SN)}function shardFor(n){let a=2166136261;for(let S=0;S<n.length;S++)a^=n.charCodeAt(S),a=Math.imul(a,16777619);return(a>>>0&255).toString(16).padStart(2,`0`)}function pathFor(n,a){if(!isEnabled())return null;let S=`${n}|${a}`,C=`${encodeURIComponent(n)}|${encodeURIComponent(a)}.json`;return ms(cacheRoot(),shardFor(S),C)}function getCachedPackument(n,a){let S=pathFor(n,a);if(!S)return null;let C=readCacheFile(S);if(!C)return null;try{let n=JSON.parse(C.toString(`utf-8`));return typeof n.etag!=`string`||!n.etag||!n.packument||typeof n.packument!=`object`?null:{etag:n.etag,packument:n.packument}}catch{return null}}function putCachedPackument(n,a,S,C){if(!S)return;let N=pathFor(n,a);N&&atomicWrite(N,JSON.stringify({etag:S,packument:C}))}var SN,CN=__esmMin(()=>{Ts(),uN(),SN=`v1`});function parseNodeMajor(n){return Number.parseInt(String(n).split(`.`,1)[0]??``,10)}function nativeBackendNodeError(n,a){if(!a)return null;let S=parseNodeMajor(n);return!Number.isFinite(S)||S>=24?null:`gjsify install (native backend) requires Node ≥ 24, but this is Node ${n}. Its prebuilt native modules are ABI-locked to Node 24 and crash on older majors. Use Node 24 (nvm/asdf locally, actions/setup-node in CI), or run with --backend npm.`}function onRealNode(){return gjsSystemVersion()===void 0?isNode():!1}function assertNativeBackendNodeVersion(){let n=nativeBackendNodeError(process.versions.node,onRealNode());if(n)throw Error(n)}var wN=__esmMin(()=>{bm()});function parseShebang(n){let a=TN.exec(n.trim());return a?{variables:a[1]??``,prog:a[2]??``,args:a[3]??``}:null}function replaceDollarWithPercentPair(n){return n.replace(/\$\{?([^$@#?\- \t{}:]+)\}?/g,(n,a)=>`%${a}%`)}function convertToSetCommands(n){let a=``;for(let S of n.split(` `)){let n=S.indexOf(`=`);if(n<=0)continue;let C=S.slice(0,n).trim(),N=S.slice(n+1).trim();C&&N&&(a+=`@SET ${C}=${replaceDollarWithPercentPair(N)}\r\n`)}return a}function buildCmdShim(n,a){let S=n.split(`\\`).join(`/`),C=S.split(`/`).join(`\\`),N=S,F=a?.prog??``,I=a?.args??``,H=a?.variables??``,W=F?F.split(`\\`).join(`/`):``,K=W?`"${W}$exe"`:``,q=``,Y=``,X=``;F?(q=`"%dp0%\\${F}.exe"`,Y=`"$basedir/${F}"`,X=`"$basedir/${F}$exe"`,C=`"%dp0%\\${C}"`,S=`"$basedir_win/${S}"`,N=`"$basedir/${N}"`):(F=`"%dp0%\\${C}"`,W=`"$basedir/${S}"`,K=W,I=``,C=``,S=``,N=``);let te;if(q){let n=I.trim();te=EN+convertToSetCommands(H)+`\r
|
|
772
|
+
`)}),()=>{F.length>0&&(a.write(F),F=``)}}var kM=__esmMin(()=>{});function resolveEnv(n){if(!n.color)return n.env;let a=n.env??process.env,S=process.env.FORCE_COLOR!==void 0||process.env.NO_COLOR!==void 0?{}:{FORCE_COLOR:`1`};return{...a,...S}}function mapSpawnError(n,a){return n.code===`ENOENT`&&a.notFound?a.notFound(n):n}function mustBlock(n){return isGjs()&&n.completion===`return`}function spawnToCompletion(n,a,S){let C=resolveEnv(S);if(mustBlock(S)){let N=spawnSync(n,[...a],{stdio:[`inherit`,`pipe`,`pipe`],cwd:S.cwd,env:C,maxBuffer:S.maxBuffer??AM});return N.error?Promise.reject(mapSpawnError(N.error,S)):(N.stdout&&N.stdout.length>0&&process.stdout.write(N.stdout),N.stderr&&N.stderr.length>0&&process.stderr.write(N.stderr),Promise.resolve({code:N.status,signal:N.signal??null}))}return new Promise((N,F)=>{let I={cwd:S.cwd,stdio:S.stdio===`pipe`?[`ignore`,`pipe`,`pipe`]:`inherit`};C&&(I.env=C);let H=spawn(n,[...a],I);S.onSpawn?.(H),H.on(`close`,(n,a)=>{N({code:n,signal:a})}),H.on(`error`,n=>{F(mapSpawnError(n,S))})})}var AM,jM=__esmMin(()=>{Gm(),bm(),AM=64*1024*1024});async function runCheck(n,a){let S=[];try{let{code:C}=await spawnToCompletion(`npm`,[`run`,`check`,`--if-present`],{completion:`exit`,cwd:n.location,stdio:a===null?`inherit`:`pipe`,onSpawn:n=>{let C=!process.stdout.isTTY;if(a!==null&&n.stdout&&n.stderr){let N=`[${a}] `;S.push(prefixLines(n.stdout,process.stdout,N,C)),S.push(prefixLines(n.stderr,process.stderr,N,C))}}});for(let n of S)n();return C??1}catch{for(let n of S)n();return 1}}var MM,NM=__esmMin(()=>{ge(),Gm(),kM(),jM(),P_(),Ts(),am(),N_(),F_(),MM={command:`check`,description:"Run `npm run check` (TypeScript type-check) across the current workspace. In a workspace root: walks every package with a `check` script (excludes @girs/*; honours --include/--exclude). In a single package: runs the local `check` script directly. Symmetric peer of `gjsify format` / `lint` / `fix`. (Legacy system-dep `gjsify check` is now `gjsify system-check` — see #254.)",builder:n=>n.option(`include`,{description:`Only run in workspaces matching these glob patterns (repeatable).`,type:`string`,array:!0}).option(`exclude`,{description:`Skip workspaces matching these glob patterns (repeatable). Always excludes @girs/*.`,type:`string`,array:!0}).option(`parallel`,{description:`Run workspace checks in parallel (default). Use --no-parallel to run them sequentially with full per-workspace output.`,type:`boolean`,alias:`p`,default:!0}).option(`jobs`,{description:`Max parallel workers (when --parallel). Default: os.cpus().length.`,type:`number`,alias:`j`}).option(`verbose`,{description:`Log the per-workspace command before spawning.`,type:`boolean`,default:!1}),handler:async n=>{let a=process.cwd(),S=findWorkspaceRoot(a);if(S&&a!==S&&readPackageJson$2(ms(a,`package.json`))?.scripts?.check){n.verbose&&he.log(`[check] cwd=${a} → npm run check`);let S=spawnSync(`npm`,[`run`,`check`],{cwd:a,stdio:`inherit`});return process.exit(S.status??1)}if(!S)return he.error("gjsify check: no workspace root found from cwd. Run inside a workspace (or a package within one) with `npm run check` defined."),process.exit(1);let C=discoverWorkspaces(S),N=[`@girs/*`,...n.exclude??[]],F=filterWorkspaces(C,{include:n.include,exclude:N}).filter(n=>n.manifest.scripts?.check!==void 0);if(F.length===0)return he.error("gjsify check: no workspaces with a `check` script found."),process.exit(1);if(n.verbose&&he.log(`[check] root=${S} workspaces=${F.length} parallel=${n.parallel?`yes`:`no`}`),!n.parallel){let a=0,S=0;for(let C of F){n.verbose&&he.log(`[check] → ${C.name}`);let N=await runCheck(C,null);N!==0&&(S++,a===0&&(a=N))}return a!==0&&he.error(`gjsify check: failures in ${S} workspace(s)`),process.exit(a)}let I=n.jobs??Math.max(1,cpus().length),H=[],W=0,K=[];for(let n=0;n<I;n++)K.push((async()=>{for(;;){let n=W++;if(n>=F.length)return;let a=F[n],S=await runCheck(a,a.name);S!==0&&H.push({name:a.name,code:S})}})());if(await Promise.all(K),H.length>0){he.error(`\ngjsify check: ${H.length} of ${F.length} workspace(s) failed:`);for(let n of H)he.error(` ✗ ${n.name} (exit ${n.code})`);return process.exit(1)}n.verbose&&he.log(`\ngjsify check: ${F.length} workspace(s) green.`),process.exit(0)}}});function manifestPath(){let n=_s(fileURLToPath(import.meta.url)),a=[ms(n,`..`,`..`,`showcases.json`),ms(n,`..`,`showcases.json`)];return a.find(n=>existsSync(n))??a[0]}function discoverShowcases(){let n=manifestPath();if(!existsSync(n))return[];let a;try{a=JSON.parse(readFileSync(n,`utf-8`))}catch{return[]}if(!Array.isArray(a.showcases))return[];let S=a.showcases.map(n=>({name:n.name,packageName:n.package,category:n.category,description:n.description??``,needsWebgl:!!n.needsWebgl}));return S.sort((n,a)=>n.category.localeCompare(a.category)||n.name.localeCompare(a.name)),S}function findShowcase(n){return discoverShowcases().find(a=>a.name===n)}var PM=__esmMin(()=>{ul(),Ts(),nn()});function parseSpec$1(n){if(!n)throw Error(`dlx: empty package spec`);if(n.startsWith(`./`)||n.startsWith(`../`)||ps(n)||existsSync(n))return{kind:`local`,path:ds(n)};let a=n,S,C=n.lastIndexOf(`@`);if(C>0&&(a=n.slice(0,C),S=n.slice(C+1)),!FM.test(a))throw Error(`dlx: invalid package name "${a}"`);return{kind:`registry`,name:a,version:S,spec:n}}var FM,IM=__esmMin(()=>{ul(),Ts(),FM=/^(?:@[a-z0-9-~][a-z0-9-._~]*\/)?[a-z0-9-~][a-z0-9-._~]*$/,__name$1(parseSpec$1,`parseSpec`)});function resolveGjsEntry(n,a){let S=ms(n,`package.json`);if(!existsSync(S))throw Error(`dlx: no package.json found at ${n}`);let C=JSON.parse(readFileSync(S,`utf-8`)),N=C.gjsify?.bin,F=C.gjsify?.main,I=C.main,H,W=null,K=!1;if(a!==null){if(!N||!N[a]){let S=N?Object.keys(N).join(`, `):`(none)`;throw Error(`dlx: package "${C.name??n}" has no GJS bin named "${a}" — known: ${S}`)}H=N[a],W=a}else if(N&&Object.keys(N).length===1){let n=Object.keys(N)[0];H=N[n],W=n}else F?H=F:I&&(H=I,K=!0);if(N&&Object.keys(N).length>1&&a===null){let a=Object.keys(N).join(`, `);throw Error(`dlx: package "${C.name??n}" defines multiple GJS bins — pass one of: ${a}`)}if(!H)throw Error(`dlx: package "${C.name??n}" has no GJS entry — set \`gjsify.main\` (or \`gjsify.bin\`) in its package.json`);let q=ds(n,H);if(!existsSync(q))throw Error(`dlx: GJS entry not found: ${q}`);return{bundlePath:q,binName:W,fromFallback:K}}function resolveNodeEntry(n){let a=ms(n,`package.json`);if(!existsSync(a))throw Error(`no package.json found at ${n}`);let S=JSON.parse(readFileSync(a,`utf-8`)),C=S.gjsify?.example?.node;if(C){let a=ds(n,C);if(!existsSync(a))throw Error(`declared node entry not found: ${a} (gjsify.example.node)`);return a}let N=S.gjsify?.main??(S.gjsify?.bin?Object.values(S.gjsify.bin)[0]:void 0)??S.main;if(!N)throw Error(`package "${S.name??n}" has no entry to derive a node bundle from — set \`gjsify.example.node\` to its \`--app node\` bundle path.`);let F=N.replace(/\.gjs\.(js|mjs|cjs)$/,``).replace(/\.(js|mjs|cjs)$/,``),I=[`${F}.node.mjs`,`${F}.node.js`,`${F}.node.cjs`];for(let a of I){let S=ds(n,a);if(existsSync(S))return S}throw Error(`package "${S.name??n}" has no \`--app node\` bundle — looked for ${I.join(`, `)}.\n Build one (e.g. \`gjsify build src/app.ts --app node --outfile dist/app.node.mjs\`) or set \`gjsify.example.node\` to its path.`)}var LM=__esmMin(()=>{ul(),Ts()});function dirLinkTarget(n,a,S=RM){return S===`junction`?ds(a):hs(_s(n),a)}function linkDirSync(n,a){assertAbsolute(a),symlinkSync(dirLinkTarget(n,a),n,RM)}function replicateLinkSync(n,a){let S=readlinkSync(n);if(!dirLinksAreJunctions()){symlinkSync(S,a);return}let C=ds(_s(n),S),N;try{N=statSync(C).isDirectory()}catch{symlinkSync(S,a);return}N?symlinkSync(C,a,`junction`):symlinkSync(S,a,`file`)}function assertAbsolute(n){if(ds(n)!==n)throw TypeError(`linkDir: target must be an absolute path, got ${JSON.stringify(n)}. Node resolves a Windows junction target against the process CWD rather than the link's own directory, so a relative target silently points somewhere else there.`)}var RM,dirLinksAreJunctions,zM=__esmMin(()=>{ul(),Hc(),Ts(),RM=process.platform===`win32`?`junction`:void 0,dirLinksAreJunctions=()=>RM===`junction`});function lexCompare(n,a){return n<a?-1:+(n>a)}function createCacheKey(n){let a=[...n.packages].sort(lexCompare),S=Object.entries(n.registries??{}).sort(([n],[a])=>lexCompare(n,a)),C=JSON.stringify([a,S]);return createHash(`sha256`).update(C).digest(`hex`)}function dlxCacheRoot(){let n=process.env.XDG_CACHE_HOME,a=ms(n&&n.length>0?n:ms(homedir(),`.cache`),`gjsify`,`dlx`);return mkdirSync(a,{recursive:!0}),a}function cacheDirFor(n){let a=ms(dlxCacheRoot(),n);return mkdirSync(a,{recursive:!0}),a}function makePrepareDir(n){let a=ms(n,`${Date.now().toString(16)}-${process.pid.toString(16)}`);return mkdirSync(a,{recursive:!0}),a}function getValidCachedPkg(n,a=VM){let S=ms(n,`pkg`),C;try{C=lstatSync(S)}catch(n){if(n.code===`ENOENT`)return;throw n}if(!C.isSymbolicLink())return;let N;try{N=realpathSync(S)}catch{return}return Date.now()-C.mtime.getTime()<=a*BM?N:void 0}function symlinkSwap(n,a,S={}){let C=S.junctions??dirLinksAreJunctions(),N=ms(n,`pkg`),F=ms(n,`pkg.tmp-${Date.now().toString(16)}-${process.pid.toString(16)}`);linkDirSync(F,a);try{C&&rmSync(N,{force:!0,recursive:!1,maxRetries:10,retryDelay:100}),renameSync(F,N)}catch(n){let S=n.code;if(S===`EBUSY`||S===`EPERM`||S===`EEXIST`||S===`EACCES`){rmSync(F,{force:!0});try{return realpathSync(N)}catch{return realpathSync(a)}}throw n}return realpathSync(N)}function resolveInstalledPkgDir(n,a){return ds(n,`node_modules`,a)}var BM,VM,HM=__esmMin(()=>{vo(),ul(),am(),Ts(),zM(),BM=6e4,VM=1440*7});function makeProgressReporter(n={}){if(n.enabled===!1)return WM;let a=n.stream??process.stderr,S=!!a.isTTY;return n.enabled??!0?S?makeTtyReporter(a):makePlainReporter(a):WM}function makeTtyReporter(n){let a=0,S=``;function render(C,N=!1){let F=Date.now();!N&&F-a<33&&C===S||(a=F,S=C,n.write(`\r\x1B[2K`+C))}function clearLine(){n.write(`\r\x1B[2K`),S=``}return{beginPhase(a,S){render(formatBar(a,0,S,void 0,n.columns??80),!0)},update(a){render(formatBar(a.phase,a.current,a.total,a.name,n.columns??80))},endPhase(a){let S=UM[a];clearLine(),n.write(`gjsify install: ${S} done\n`)}}}function makePlainReporter(n){let a=0,S=0;return{beginPhase(C,N){a=Date.now(),S=0,n.write(`gjsify install: ${UM[C]} ${N} package(s)\n`)},update(C){let N=Date.now();if(N-a<GM||C.current<=S)return;a=N,S=C.current;let F=C.total>0?Math.round(C.current/C.total*100):0;n.write(`gjsify install: ${UM[C.phase]} ${C.current}/${C.total} (${F}%)\n`)},endPhase(a){n.write(`gjsify install: ${UM[a]} done\n`)}}}function formatBar(n,a,S,C,N){let F=UM[n],I=S>0?Math.min(1,a/S):0,H=`${a}/${S}`,W=`gjsify install: ${F} `,K=` ${H}`+(C?` ${C}`:``),q=Math.max(8,Math.min(40,N-W.length-K.length-4)),Y=Math.round(I*q),X=`█`.repeat(Y)+`░`.repeat(q-Y),te=`${W}[${X}]${K}`;if(te.length>N){let n=te.length-N+1,a=C&&C.length>n?C.slice(0,C.length-n-1)+`…`:``;te=`${W}[${X}] ${H}${a?` `+a:``}`}return te}var UM,WM,GM,KM=__esmMin(()=>{UM={resolve:`resolving`,download:`downloading`,extract:`extracting`,link:`linking bins`},WM={update(){},beginPhase(){},endPhase(){}},GM=5e3});function parse(n){try{return new SemVer(n)}catch{return null}}function compare(n,a){let S=n instanceof SemVer?n:new SemVer(n),C=a instanceof SemVer?a:new SemVer(a);return S.compare(C)}function satisfies(n,a){let S=a instanceof YM?a:new YM(a),C=n instanceof SemVer?n:parse(String(n));return C?S.test(C):!1}function maxSatisfying(n,a){let S=a instanceof YM?a:new YM(a),C=null;for(let a of n){let n=parse(a);!n||!S.test(n)||(C===null||n.compare(C)>0)&&(C=n)}return C?C.version:null}function testComparator(n,a){if(n.semver===null)return!0;let S=a.compare(n.semver);switch(n.operator){case``:case`=`:return S===0;case`<`:return S<0;case`<=`:return S<=0;case`>`:return S>0;case`>=`:return S>=0}}function formatComparator(n){return n.semver===null?`*`:`${n.operator}${n.semver.version}`}function parseRangePart(n){let a=n.trim();if(a===``||a===`*`||a.toLowerCase()===`latest`)return[{operator:`>=`,semver:new SemVer(`0.0.0`)}];let S=a.match(/^\s*(\S+)\s+-\s+(\S+)\s*$/);if(S)return hyphenRange(S[1],S[2]);let C=a.replace(/(<=|>=|<|>|=)\s+(?=\S)/g,`$1`).split(/\s+/),N=[];for(let n of C)N.push(...parseSimple(n));return N}function parseSimple(n){if(n===`*`||n===``||n.toLowerCase()===`latest`)return[{operator:`>=`,semver:new SemVer(`0.0.0`)}];if(n.startsWith(`^`))return caretRange(n.slice(1));if(n.startsWith(`~`))return tildeRange(n.slice(1).replace(/^>/,``));let a=n.match(/^(<=|>=|<|>|=)\s*(.+)$/);if(a){let n=a[1];return primitiveRange(n,a[2])}return partialRange(n)}function parsePartial(n){let a=n.trim().replace(/^v/,``);if(a===``||a===`*`)return{major:null,minor:null,patch:null,pre:``,build:``};let S=``,C=``,N=a,F=N.indexOf(`+`);F>=0&&(C=N.slice(F+1),N=N.slice(0,F));let I=N.indexOf(`-`);I>=0&&(S=N.slice(I+1),N=N.slice(0,I));let H=N.split(`.`),xr=a=>{if(a===void 0||a===``||a===`x`||a===`X`||a===`*`)return null;if(!/^\d+$/.test(a))throw TypeError(`Invalid partial version: ${n}`);return Number(a)};return{major:xr(H[0]),minor:xr(H[1]),patch:xr(H[2]),pre:S,build:C}}function partialToVersion(n){return`${n.major??0}.${n.minor??0}.${n.patch??0}${n.pre?`-${n.pre}`:``}${n.build?`+${n.build}`:``}`}function partialRange(n){let a=parsePartial(n);return a.major===null?[{operator:`>=`,semver:new SemVer(`0.0.0`)}]:a.minor===null?[{operator:`>=`,semver:new SemVer(`${a.major}.0.0`)},{operator:`<`,semver:new SemVer(`${a.major+1}.0.0`)}]:a.patch===null?[{operator:`>=`,semver:new SemVer(`${a.major}.${a.minor}.0`)},{operator:`<`,semver:new SemVer(`${a.major}.${a.minor+1}.0`)}]:[{operator:`=`,semver:new SemVer(partialToVersion(a))}]}function caretRange(n){let a=parsePartial(n);if(a.major===null)return[{operator:`>=`,semver:new SemVer(`0.0.0`)}];let S=`${a.major}.${a.minor??0}.${a.patch??0}${a.pre?`-${a.pre}`:``}`,C;return C=a.major>0||a.minor===null?`${a.major+1}.0.0`:a.minor>0||a.patch===null?`0.${a.minor+1}.0`:`0.0.${a.patch+1}`,[{operator:`>=`,semver:new SemVer(S)},{operator:`<`,semver:new SemVer(C)}]}function tildeRange(n){let a=parsePartial(n);if(a.major===null)return[{operator:`>=`,semver:new SemVer(`0.0.0`)}];let S=`${a.major}.${a.minor??0}.${a.patch??0}${a.pre?`-${a.pre}`:``}`,C=a.minor===null?`${a.major+1}.0.0`:`${a.major}.${a.minor+1}.0`;return[{operator:`>=`,semver:new SemVer(S)},{operator:`<`,semver:new SemVer(C)}]}function primitiveRange(n,a){let S=parsePartial(a);return S.major===null?[{operator:`>=`,semver:new SemVer(`0.0.0`)}]:n===`=`||n===``?partialRange(a):n===`>`?S.minor===null?[{operator:`>=`,semver:new SemVer(`${S.major+1}.0.0`)}]:S.patch===null?[{operator:`>=`,semver:new SemVer(`${S.major}.${S.minor+1}.0`)}]:[{operator:`>`,semver:new SemVer(partialToVersion(S))}]:n===`<`?S.minor===null?[{operator:`<`,semver:new SemVer(`${S.major}.0.0`)}]:S.patch===null?[{operator:`<`,semver:new SemVer(`${S.major}.${S.minor}.0`)}]:[{operator:`<`,semver:new SemVer(partialToVersion(S))}]:n===`>=`?[{operator:`>=`,semver:new SemVer(partialToVersion(S))}]:S.minor===null?[{operator:`<`,semver:new SemVer(`${S.major+1}.0.0`)}]:S.patch===null?[{operator:`<`,semver:new SemVer(`${S.major}.${S.minor+1}.0`)}]:[{operator:`<=`,semver:new SemVer(partialToVersion(S))}]}function hyphenRange(n,a){let S=parsePartial(n),C=parsePartial(a),N=S.major===null?{operator:`>=`,semver:new SemVer(`0.0.0`)}:{operator:`>=`,semver:new SemVer(`${S.major}.${S.minor??0}.${S.patch??0}${S.pre?`-${S.pre}`:``}`)},F;return F=C.major===null?{operator:`>=`,semver:new SemVer(`0.0.0`)}:C.minor===null?{operator:`<`,semver:new SemVer(`${C.major+1}.0.0`)}:C.patch===null?{operator:`<`,semver:new SemVer(`${C.major}.${C.minor+1}.0`)}:{operator:`<=`,semver:new SemVer(`${C.major}.${C.minor}.${C.patch}${C.pre?`-${C.pre}`:``}`)},[N,F]}var qM,JM,SemVer,YM,XM=__esmMin(()=>{qM=/^(0|[1-9]\d*)$/,JM=/^(\d+)\.(\d+)\.(\d+)(?:-((?:[0-9A-Za-z-]+)(?:\.[0-9A-Za-z-]+)*))?(?:\+([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?$/,SemVer=class{major;minor;patch;prerelease;build;version;constructor(n){let a=String(n).trim().replace(/^v/,``),S=JM.exec(a);if(!S)throw TypeError(`Invalid Version: ${n}`);this.major=Number(S[1]),this.minor=Number(S[2]),this.patch=Number(S[3]),this.prerelease=S[4]?S[4].split(`.`).map(n=>qM.test(n)?Number(n):n):[],this.build=S[5]?S[5].split(`.`):[],this.version=`${this.major}.${this.minor}.${this.patch}`+(this.prerelease.length?`-${this.prerelease.join(`.`)}`:``)+(this.build.length?`+${this.build.join(`.`)}`:``)}compare(n){return this.major===n.major?this.minor===n.minor?this.patch===n.patch?this.comparePre(n):this.patch<n.patch?-1:1:this.minor<n.minor?-1:1:this.major<n.major?-1:1}comparePre(n){let a=this.prerelease,S=n.prerelease;if(a.length===0&&S.length===0)return 0;if(a.length===0)return 1;if(S.length===0)return-1;for(let n=0;;n++){let C=a[n],N=S[n];if(C===void 0&&N===void 0)return 0;if(N===void 0)return 1;if(C===void 0)return-1;if(C===N)continue;let F=typeof C==`number`,I=typeof N==`number`;return F&&!I?-1:!F&&I?1:C<N?-1:1}}toString(){return this.version}},YM=class Range{raw;set;constructor(n){if(n instanceof Range){this.raw=n.raw,this.set=n.set;return}this.raw=String(n).trim();let a=this.raw.split(/\s*\|\|\s*/),S=[];for(let n of a){let a=parseRangePart(n);if(a.length===0)throw TypeError(`Invalid range: ${this.raw}`);S.push(a)}if(S.length===0)throw TypeError(`Invalid range: ${this.raw}`);this.set=S}test(n){let a=n instanceof SemVer?n:parse(String(n));if(!a)return!1;for(let n of this.set)if(n.every(n=>testComparator(n,a))){if(a.prerelease.length>0&&!n.some(n=>n.semver!==null&&n.semver.prerelease.length>0&&n.semver.major===a.major&&n.semver.minor===a.minor&&n.semver.patch===a.patch))continue;return!0}return!1}format(){return this.set.map(n=>n.map(formatComparator).join(` `)).join(` || `)}toString(){return this.format()}}});function buildHeaders(n,a){let S={"user-agent":`gjsify-install/0.26.1`,"accept-encoding":a.acceptEncoding??`identity`};if(a.npmrc){let C=resolveAuthForUrl(n,a.npmrc);C&&(S.authorization=C)}if(a.headers)for(let[n,C]of Object.entries(a.headers))S[n.toLowerCase()]=C;return S}function resolveAuthForUrl(n,a){let S=pathPrefixes(new URL(n));for(let n of S){let S=a.authTokens[n];if(S)return`Bearer ${S}`;let C=a.basicAuth[n];if(C)return`Basic ${btoa(`${C.username}:${C.password}`)}`}return null}function pathPrefixes(n){let a=n.pathname.split(`/`).filter(Boolean),S=[];for(let C=a.length;C>=0;C--){let N=a.slice(0,C).join(`/`);S.push(N?`//${n.host}/${N}`:`//${n.host}`)}return S}var ZM=__esmMin(()=>{}),PackageNotFoundError,IntegrityError,RegistryTimeoutError,QM=__esmMin(()=>{PackageNotFoundError=class extends Error{name;url;constructor(n,a){super(`Package not found in registry: ${n} (${a})`),this.name=n,this.url=a,this.name=`PackageNotFoundError`}},IntegrityError=class extends Error{url;integrity;constructor(n,a){super(`Tarball integrity mismatch for ${n} (expected ${a})`),this.url=n,this.integrity=a,this.name=`IntegrityError`}},RegistryTimeoutError=class extends Error{url;timeoutMs;attempts;constructor(n,a,S){let C=Math.round(a/100)/10,N=Math.round(a*S/100)/10;super(`@gjsify/npm-registry: GET ${n} timed out after ${C}s × ${S} attempt(s) (total ~${N}s). This usually means the registry CDN is slow or unreachable.`),this.url=n,this.timeoutMs=a,this.attempts=S,this.name=`RegistryTimeoutError`}}});function registryFor(n,a){if(a&&n.startsWith(`@`)){let S=n.slice(0,n.indexOf(`/`)),C=a.scopes[S];if(C)return ensureTrailingSlash$1(C)}return a?.registry?ensureTrailingSlash$1(a.registry):$M}function parseNpmrc(n){let a={registry:$M,scopes:{},authTokens:{},basicAuth:{}},S=n.split(/\r?\n/),C={};for(let n of S){let S=n.replace(/^\s+|\s+$/g,``);if(!S||S.startsWith(`#`)||S.startsWith(`;`))continue;let N=S.indexOf(`=`);if(N<0)continue;let F=S.slice(0,N).trim(),I=expandEnv(stripQuotes(S.slice(N+1).trim()));if(F===`registry`){a.registry=ensureTrailingSlash$1(I);continue}let H=F.match(/^(@[^:]+):registry$/);if(H){a.scopes[H[1]]=ensureTrailingSlash$1(I);continue}let W=F.match(/^\/\/(.+):_authToken$/);if(W){a.authTokens[normalizeAuthHost(W[1])]=I;continue}let K=F.match(/^\/\/(.+):username$/);if(K){(C[normalizeAuthHost(K[1])]??={}).user=I;continue}let q=F.match(/^\/\/(.+):_password$/);if(q){let n=base64Decode(I);(C[normalizeAuthHost(q[1])]??={}).pass=n;continue}}for(let[n,S]of Object.entries(C))S.user&&S.pass!==void 0&&(a.basicAuth[n]={username:S.user,password:S.pass});return a}function normalizeAuthHost(n){return`//${n.replace(/\/+$/,``)}`}function ensureTrailingSlash$1(n){return n.endsWith(`/`)?n:n+`/`}function stripQuotes(n){return n.startsWith(`"`)&&n.endsWith(`"`)||n.startsWith(`'`)&&n.endsWith(`'`)?n.slice(1,-1):n}function expandEnv(n){return n.replace(/\$\{([A-Z0-9_]+)\}/gi,(n,a)=>globalThis.process?.env?.[a]??``)}function base64Decode(n){return atob(n)}var $M,eN=__esmMin(()=>{$M=`https://registry.npmjs.org/`,__name$1(ensureTrailingSlash$1,`ensureTrailingSlash`)});async function fetchWithRetry(n,a,S){let C=S.fetch??globalThis.fetch;if(!C)throw Error(`@gjsify/npm-registry: globalThis.fetch is missing`);let N=Math.max(0,S.retries??3),F=Math.max(0,S.retryDelayMs??250),I=Math.max(0,S.timeoutMs??3e4),H=S.retryNotFound??!1,W=0,K,q=0;for(;;){if(a.signal?.aborted)throw signalAbortError(a.signal);let Y=I>0?new AbortController:null,X=Y===null?null:setTimeout(()=>Y.abort(Error(`@gjsify/npm-registry: per-request timeout ${I}ms`)),I),te=composeSignals(a.signal,Y?.signal);try{let S=await C(n,{...a,signal:te}),F=isRetryableStatus(S.status)||H&&S.status===404;if(S.ok||!F||W>=N)return S;try{await S.arrayBuffer()}catch{}K=Error(`HTTP ${S.status} ${S.statusText}`)}catch(S){let C=Y!==null&&Y.signal.aborted,F=a.signal?.aborted===!0;if(C&&!F){if(q++,W>=N)throw new RegistryTimeoutError(n,I,q);K=S}else if(F)throw signalAbortError(a.signal);else{if(!isRetryableError(S)||W>=N)throw S;K=S}}finally{X!==null&&clearTimeout(X)}let ne=Math.min(F*2**W,8e3);S.onRetry?.({attempt:W+1,error:K,delayMs:ne}),await delay$1(ne,a.signal),W++}}function composeSignals(n,a){return n?a?AbortSignal.any([n,a]):n:a}function isRetryableStatus(n){return n===408||n===425||n===429||n===500||n===502||n===503||n===504||n===521||n===522||n===524||n===525}function isRetryableError(n){if(n&&typeof n==`object`&&`name`in n&&n.name===`AbortError`)return!1;if(n instanceof TypeError)return!0;if(n&&typeof n==`object`&&`name`in n){let a=n.name;if(a===`FetchError`)return!0;if(a===`AbortError`)return!1}let a=n?.cause;if(a&&typeof a==`object`&&`code`in a){let n=a.code;if(typeof n==`string`)return n===`ECONNRESET`||n===`ECONNREFUSED`||n===`ENETUNREACH`||n===`ENOTFOUND`||n===`ETIMEDOUT`||n===`EAI_AGAIN`||n===`UND_ERR_SOCKET`||n===`UND_ERR_CONNECT_TIMEOUT`}return!1}function delay$1(n,a){return n<=0?Promise.resolve():new Promise((S,C)=>{let N=setTimeout(()=>{a?.removeEventListener?.(`abort`,onAbort),S()},n),onAbort=()=>{clearTimeout(N),C(signalAbortError(a))};if(a?.aborted){clearTimeout(N),C(signalAbortError(a));return}a?.addEventListener?.(`abort`,onAbort,{once:!0})})}function signalAbortError(n){let a=n&&`reason`in n?n.reason:void 0;if(a instanceof Error)return a;let S=Error(`Aborted`);return S.name=`AbortError`,S}var tN=__esmMin(()=>{QM(),__name$1(delay$1,`delay`)});async function verifyIntegrity(n,a){let S=a.trim().split(/\s+/);for(let a of S){let S=a.indexOf(`-`);if(S<0)continue;let C=a.slice(0,S).toLowerCase(),N=a.slice(S+1),F=globalThis.crypto?.subtle;if(!F)throw Error(`@gjsify/npm-registry: globalThis.crypto.subtle is missing`);let I=subriToWebCryptoAlgo(C);if(!I)continue;let H=await F.digest(I,dataAsArrayBuffer(n));if(bytesToBase64(new Uint8Array(H))===N)return!0}return!1}function subriToWebCryptoAlgo(n){switch(n){case`sha1`:return`SHA-1`;case`sha256`:return`SHA-256`;case`sha384`:return`SHA-384`;case`sha512`:return`SHA-512`;default:return null}}function dataAsArrayBuffer(n){if(n.byteOffset===0&&n.byteLength===n.buffer.byteLength)return n.buffer;let a=new Uint8Array(n.byteLength);return a.set(n),a.buffer}function bytesToBase64(n){let a=``;for(let S=0;S<n.length;S++)a+=String.fromCharCode(n[S]);return btoa(a)}var nN=__esmMin(()=>{});function assertPackument(n,a){if(!a||typeof a!=`object`)throw TypeError(`registry: ${n} packument is not an object`);let S=a;if(typeof S.name!=`string`)throw TypeError(`registry: ${n} packument missing string name`);if(!S.versions||typeof S.versions!=`object`)throw TypeError(`registry: ${n} packument missing versions map`)}function packumentUrl(n,a){let S=ensureTrailingSlash$1(a);if(n.startsWith(`@`)){let a=n.indexOf(`/`);if(a<0)throw TypeError(`Invalid scoped package name: ${n}`);let C=n.slice(0,a),N=n.slice(a+1);return`${S}${encodeURIComponent(C)}/${encodeURIComponent(N)}`}return`${S}${encodeURIComponent(n)}`}async function fetchPackumentConditional(n,a={}){let S=packumentUrl(n,a.registry??registryFor(n,a.npmrc)),C=buildHeaders(S,{...a,acceptEncoding:`gzip`});C.accept??=`application/vnd.npm.install-v1+json`,a.ifNoneMatch&&(C[`if-none-match`]=a.ifNoneMatch);let N=await fetchWithRetry(S,{headers:C,signal:a.signal},{fetch:a.fetch,retries:a.retries,retryDelayMs:a.retryDelayMs,timeoutMs:a.timeoutMs,onRetry:a.onRetry});if(N.status===304){try{await N.arrayBuffer()}catch{}return{status:`not-modified`,etag:a.ifNoneMatch}}if(!N.ok)throw N.status===404||N.status===406?new PackageNotFoundError(n,S):Error(`registry GET ${S} -> ${N.status} ${N.statusText}`);let F=N.headers.get(`etag`)??void 0,I=await decodeJsonBody(N);return assertPackument(n,I),{status:`fresh`,packument:I,etag:F}}async function decodeJsonBody(n){return n.json()}async function fetchPackument(n,a={}){let S=await fetchPackumentConditional(n,a);if(!S.packument)throw Error(`registry: ${n} returned 304 Not Modified to an unconditional request`);return S.packument}var rN=__esmMin(()=>{ZM(),QM(),eN(),tN()});async function fetchTarball(n,a={}){let S=buildHeaders(n,{...a,acceptEncoding:`identity`});S.accept??=`application/octet-stream`;let C=await fetchWithRetry(n,{headers:S,signal:a.signal},{fetch:a.fetch,retries:a.retries,retryDelayMs:a.retryDelayMs,timeoutMs:a.timeoutMs,onRetry:a.onRetry,retryNotFound:a.retryNotFound??!0});if(!C.ok)throw Error(`tarball GET ${n} -> ${C.status} ${C.statusText}`);let N=new Uint8Array(await C.arrayBuffer());if(a.integrity&&!await verifyIntegrity(N,a.integrity))throw new IntegrityError(n,a.integrity);return N}var iN=__esmMin(()=>{ZM(),QM(),tN(),nN()});async function whoami(n,a){let S=`${ensureTrailingSlash$1(n)}-/whoami`,C=buildHeaders(S,{npmrc:a});C.accept=`application/json`;let N=globalThis.fetch;if(!N)throw Error(`@gjsify/npm-registry: globalThis.fetch is missing`);let F=await N(S,{method:`GET`,headers:C});if(!F.ok)throw Error(`whoami GET ${S} -> ${F.status} ${F.statusText}`);let I=await F.json();if(I&&typeof I==`object`&&`username`in I){let n=I.username;if(typeof n==`string`&&n.length>0)return{username:n}}return{}}var aN=__esmMin(()=>{ZM(),eN()}),oN=__esmMin(()=>{ZM(),eN(),rN(),iN(),aN()});function parseTar(n){let a=[],S=null,C=null,N=null,F=0;for(;F+512<=n.length;){let I=n.subarray(F,F+512);if(allZeros(I)){let a=n.subarray(F+512,F+2*512);if(a.length===512&&allZeros(a))break;F+=512;continue}if(!validateChecksum(I))throw new TarParseError(`Bad header checksum at offset ${F} — file is not a valid tar archive`);let H=readString(I,0,100),W=parseOctal(I,100,8),K=parseOctal(I,124,12),q=parseOctal(I,136,12),Y=String.fromCharCode(I[156]||0),X=readString(I,157,100),te=readString(I,257,6),ne=readString(I,345,155),re=readString(I,265,32),ie=readString(I,297,32);F+=512;let ae=n.subarray(F,F+K);if(F+=alignToBlock(K),Y===`x`){S=parsePaxRecords(ae);continue}if(Y===`g`)continue;if(Y===`L`){C=bytesToString(ae).replace(/\0+$/,``);continue}if(Y===`K`){N=bytesToString(ae).replace(/\0+$/,``);continue}let oe=H;te===`ustar`&&ne!==``&&(oe=`${ne}/${H}`),C!==null&&(oe=C,C=null);let Z=X;if(N!==null&&(Z=N,N=null),S!==null){let C=S.get(`path`);C!==void 0&&(oe=C);let N=S.get(`linkpath`);N!==void 0&&(Z=N);let I=S.get(`size`);if(I!==void 0){let C=Number(I);if(Number.isFinite(C)){let N=F-alignToBlock(K),I=n.subarray(N,N+C);F=N+alignToBlock(C),S=null,a.push(buildEntry(oe,Z,Y,W,q,re,ie,I));continue}}S=null}a.push(buildEntry(oe,Z,Y,W,q,re,ie,ae))}return a}function buildEntry(n,a,S,C,N,F,I,H){return{name:n,linkname:a,type:typeflagToType(S,n),mode:C,mtime:N,body:H,uname:F,gname:I}}function typeflagToType(n,a){switch(n){case`0`:case`\0`:case``:return a.endsWith(`/`)?`directory`:`file`;case`1`:return`hardlink`;case`2`:return`symlink`;case`5`:return`directory`;case`x`:return`pax-header`;case`g`:return`pax-global`;case`L`:return`gnu-longname`;case`K`:return`gnu-longlink`;default:return`unknown`}}function parsePaxRecords(n){let a=new Map,S=0;for(;S<n.length;){let C=S;for(;C<n.length&&n[C]!==32;)C++;if(C>=n.length)break;let N=bytesToString(n.subarray(S,C)),F=Number(N);if(!Number.isFinite(F)||F<=0)break;let I=S+F;if(I>n.length)break;let H=bytesToString(n.subarray(C+1,I-1)),W=H.indexOf(`=`);if(W>0){let n=H.slice(0,W),S=H.slice(W+1);a.set(n,S)}S=I}return a}function readString(n,a,S){let C=a,N=a+S;for(;C<N&&n[C]!==0;)C++;return bytesToString(n.subarray(a,C))}function bytesToString(n){return new TextDecoder(`utf-8`,{fatal:!1}).decode(n)}function parseOctal(n,a,S){if(S>0&&n[a]&128){let C=n[a]&127;for(let N=1;N<S;N++)C=C*256+n[a+N];return C}let C=``;for(let N=0;N<S;N++){let S=n[a+N];S===0||S===32||(C+=String.fromCharCode(S))}return C===``?0:parseInt(C,8)}function alignToBlock(n){return Math.ceil(n/512)*512}function allZeros(n){for(let a=0;a<n.length;a++)if(n[a]!==0)return!1;return!0}function validateChecksum(n){let a=parseOctal(n,148,8),S=0,C=0;for(let a=0;a<512;a++){let N=a>=148&&a<156?32:n[a];S+=N,C+=N>127?N-256:N}return a===S||a===C}var TarParseError,sN=__esmMin(()=>{TarParseError=class extends Error{constructor(n){super(n),this.name=`TarParseError`}}});function createTarball(n){let a=[];for(let S of n){if(`directory`in S&&S.directory===!0){a.push(buildHeader(ensureTrailingSlash(S.name),0,`5`,S.mode??493,S.mtime??0));continue}let n=S,C=typeof n.body==`string`?new TextEncoder().encode(n.body):n.body,N=n.mode??defaultFileMode(C);a.push(buildHeader(n.name,C.byteLength,`0`,N,n.mtime??0)),a.push(C);let F=padTo512(C.byteLength);F>0&&a.push(new Uint8Array(F))}return a.push(new Uint8Array(512*2)),concatChunks(a)}function buildHeader(n,a,S,C,N){let{prefix:F,basename:I}=splitPathForUstar(n),H=new Uint8Array(512);writeAscii(H,I,0,100),writeOctal(H,C&4095,100,7),H[107]=0,writeOctal(H,0,108,7),H[115]=0,writeOctal(H,0,116,7),H[123]=0,writeOctal(H,a,124,11),H[135]=0,writeOctal(H,N,136,11),H[147]=0;for(let n=148;n<156;n++)H[n]=32;H[156]=S.charCodeAt(0),writeAscii(H,`ustar\0`,257,6),writeAscii(H,`00`,263,2),F&&writeAscii(H,F,345,155);let W=0;for(let n=0;n<512;n++)W+=H[n];return writeAscii(H,W.toString(8).padStart(6,`0`),148,6),H[154]=0,H[155]=32,H}function splitPathForUstar(n){if(n.length<=100)return{prefix:``,basename:n};if(n.length>255)throw Error(`createTarball: path too long (${n.length} > 255 chars): ${n}`);for(let a=Math.min(n.length-1,155);a>0;a--)if(n[a]===`/`&&n.length-a-1<=100)return{prefix:n.slice(0,a),basename:n.slice(a+1)};throw Error(`createTarball: cannot split path into ustar prefix+basename (basename slot is 100 chars): ${n}`)}function writeAscii(n,a,S,C){let N=new TextEncoder().encode(a);if(N.length>C)throw Error(`createTarball: field too long (${N.length} > ${C}): "${a}"`);n.set(N,S)}function writeOctal(n,a,S,C){writeAscii(n,a.toString(8).padStart(C,`0`),S,C)}function padTo512(n){let a=n%512;return a===0?0:512-a}function ensureTrailingSlash(n){return n.endsWith(`/`)?n:`${n}/`}function defaultFileMode(n){return n.length>=2&&n[0]===35&&n[1]===33?493:420}function concatChunks(n){let a=0;for(let S of n)a+=S.byteLength;let S=new Uint8Array(a),C=0;for(let a of n)S.set(a,C),C+=a.byteLength;return S}var cN=__esmMin(()=>{});async function extractTarball(n,a,S={}){let C=n instanceof Uint8Array?n:new Uint8Array(n),N=parseTar(S.gzip??(C.length>=2&&C[0]===31&&C[1]===139)?await gunzip(C):C);mkdirSync(a,{recursive:!0});let F=S.strip??1,I=S.preventEscape??!0,H={files:[],directories:[],symlinks:[],skipped:0};for(let n of N){let C=stripComponents(n.name,F);if(C===null||C===``){H.skipped++;continue}let N=ds(a,C);if(I&&!isInside(N,a))throw Error(`tar: refusing to extract ${n.name} outside ${a} (resolved=${N})`);if(S.filter&&!S.filter(n,N)){H.skipped++;continue}if(n.type===`directory`){mkdirSync(N,{recursive:!0}),H.directories.push(N);continue}if(n.type===`file`){mkdirSync(_s(N),{recursive:!0}),writeFileSync(N,n.body);let a=S.chmod?.(n,N)??n.mode&511;if(a>0)try{chmodSync(N,a)}catch{}H.files.push(N);continue}if(n.type===`symlink`){mkdirSync(_s(N),{recursive:!0});try{symlinkSync(n.linkname,N),H.symlinks.push(N)}catch{writeFileSync(N,n.linkname),H.files.push(N)}continue}H.skipped++}return H}async function gunzip(n){let a=globalThis.DecompressionStream;if(typeof a!=`function`)throw Error(`@gjsify/tar: globalThis.DecompressionStream is not available — import '@gjsify/compression-streams/register' on GJS to register it`);return drainStream(new Blob([new Uint8Array(n)]).stream().pipeThrough(new a(`gzip`)))}async function gzip(n){let a=globalThis.CompressionStream;if(typeof a!=`function`)throw Error(`@gjsify/tar: globalThis.CompressionStream is not available — import '@gjsify/compression-streams/register' on GJS to register it`);return drainStream(new Blob([new Uint8Array(n)]).stream().pipeThrough(new a(`gzip`)))}async function drainStream(n){let a=[],S=0,C=n.getReader();for(;;){let{value:n,done:N}=await C.read();if(N)break;let F=n instanceof Uint8Array?n:new Uint8Array(n);a.push(F),S+=F.length}let N=new Uint8Array(S),F=0;for(let n of a)N.set(n,F),F+=n.length;return N}function stripComponents(n,a){if(a<=0)return n;let S=n.split(`/`).filter(n=>n!==``);return S.length<=a?null:S.slice(a).join(`/`)}function isInside(n,a){let S=hs(a,n);return S!==``&&!S.startsWith(`..`)&&!ps(S)}var lN=__esmMin(()=>{sN(),ul(),Ts()}),uN=__exportAll$4({BLOCK_SIZE:()=>512,TarParseError:()=>TarParseError,createTarball:()=>createTarball,extractTarball:()=>extractTarball,gunzip:()=>gunzip,gzip:()=>gzip,parseTar:()=>parseTar}),dN=__esmMin(()=>{sN(),cN(),lN()});function gjsifyCacheRoot(n,a){let S=process.env.XDG_CACHE_HOME;return ms(S&&S.length>0?S:ms(homedir(),`.cache`),`gjsify`,n,a)}function atomicWrite(n,a){try{atomicWriteStrict(n,a)}catch{}}function atomicWriteStrict(n,a){mkdirSync(ms(n,`..`),{recursive:!0});let S=`${n}.tmp.${process.pid}`;writeFileSync(S,a),renameSync(S,n)}function readCacheFile(n){if(!existsSync(n))return null;try{let a=readFileSync(n);return a.length===0?null:a}catch{return null}}var fN=__esmMin(()=>{ul(),am(),Ts()});function staleMs(){let n=process.env.GJSIFY_INSTALL_LOCK_STALE_MS;if(n!==void 0){let a=Number(n);if(Number.isFinite(a)&&a>0)return a}return hN}function lockingDisabled(){let n=process.env.GJSIFY_INSTALL_LOCK;if(n===void 0)return!1;let a=n.trim();return a===`0`||a===`false`}function isPidAlive(n){if(existsSync(`/proc/self`))return existsSync(`/proc/${n}`);try{return process.kill(n,0),!0}catch(n){return n.code===`EPERM`}}function mtimeMs(n){try{return statSync(n).mtimeMs}catch{return null}}function assessLock(n){let a=ms(n,mN),S=null;try{S=JSON.parse(readFileSync(a,`utf-8`))}catch{S=null}let C=Date.now();if(S&&typeof S.pid==`number`){if(!isPidAlive(S.pid))return{stale:!0,reason:`owner pid ${S.pid} is gone`,ownerPid:S.pid};let n=typeof S.startedAt==`number`?S.startedAt:mtimeMs(a);return n!==null&&C-n>staleMs()?{stale:!0,reason:`owner pid ${S.pid} exceeded the ${staleMs()}ms staleness budget`,ownerPid:S.pid}:{stale:!1,ownerPid:S.pid}}let N=mtimeMs(n);return N===null?{stale:!1}:C-N>gN?{stale:!0,reason:`no owner recorded within the acquire grace period`}:{stale:!1}}function stealStaleLock(n){let a=`${n}.stale-${process.pid}-${++bN}`;try{renameSync(n,a)}catch{return!1}try{rmSync(a,{recursive:!0,force:!0})}catch{}return!0}function abortErr(n){let a=n&&`reason`in n?n.reason:void 0;if(a instanceof Error)return a;let S=Error(`Aborted`);return S.name=`AbortError`,S}function delay(n,a){return n<=0?Promise.resolve():new Promise((S,C)=>{let onAbort=()=>{clearTimeout(N),C(abortErr(a))},N=setTimeout(()=>{a?.removeEventListener?.(`abort`,onAbort),S()},n);if(a?.aborted){clearTimeout(N),C(abortErr(a));return}a?.addEventListener?.(`abort`,onAbort,{once:!0})})}function makeHandle(n){let a=!1;return{release(){if(a)return;a=!0;let S=yN.get(n);if(S&&(S.count--,!(S.count>0))){yN.delete(n);try{let a=JSON.parse(readFileSync(ms(n,mN),`utf-8`));if(a.nonce!==void 0&&a.nonce!==S.nonce)return}catch{}try{rmSync(n,{recursive:!0,force:!0})}catch{}}}}}async function acquireInstallLock(n,a={}){if(lockingDisabled())return{release(){}};let S;try{S=realpathSync(n)}catch{S=ds(n)}let C=ms(S,`node_modules`,pN),N=yN.get(C);if(N)return N.count++,makeHandle(C);mkdirSync(_s(C),{recursive:!0});let F=`${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2)}`,I=_N,H=!1;for(;;){if(a.signal?.aborted)throw abortErr(a.signal);try{return mkdirSync(C),writeFileSync(ms(C,mN),JSON.stringify({pid:process.pid,nonce:F,startedAt:Date.now()})),yN.set(C,{count:1,nonce:F}),makeHandle(C)}catch(n){if(n.code!==`EEXIST`)throw n}let n=assessLock(C);if(n.stale){stealStaleLock(C)&&he.warn(`gjsify install: removed stale install lock (${n.reason}) — ${C}`);continue}if(!H){H=!0;let a=n.ownerPid===void 0?``:` (pid ${n.ownerPid})`;he.warn(`gjsify install: waiting for a concurrent install${a} to release ${C} …`)}await delay(I,a.signal),I=Math.min(Math.round(I*1.6),vN)}}var pN,mN,hN,gN,_N,vN,yN,bN,xN=__esmMin(()=>{ge(),ul(),Ts(),pN=`.gjsify-install-lock`,mN=`owner.json`,hN=35*6e4,gN=15e3,_N=150,vN=1e3,yN=new Map,bN=0});function cacheRoot$1(){return gjsifyCacheRoot(`tarballs`,SN)}function parseSri$1(n){if(!n)return null;let a=n.indexOf(`-`);if(a<=0||a===n.length-1)return null;let S=n.slice(0,a),C=n.slice(a+1).replace(/=+$/,``),N=Ge.from(C,`base64`).toString(`hex`);return N.length<4?null:{algorithm:S,hex:N}}function pathFor$1(n){let a=parseSri$1(n);if(!a)return null;let S=a.hex.slice(0,2);return ms(cacheRoot$1(),a.algorithm,S,`${a.hex}.tgz`)}function getCachedTarball(n){let a=pathFor$1(n);return a?readCacheFile(a):null}function putCachedTarball(n,a){let S=pathFor$1(n);S&&(existsSync(S)||atomicWrite(S,a))}function npmCacacheContentDir(){let n=process.env.GJSIFY_NPM_CACHE;if(n!==void 0){let a=n.trim();return a===``||a===`0`||a===`false`?null:ms(a.endsWith(`_cacache`)?a:ms(a,`_cacache`),`content-v2`)}let a=process.env.npm_config_cache;return ms(a&&a.length>0?a:ms(homedir(),`.npm`),`_cacache`,`content-v2`)}function npmCachePathFor(n){let a=npmCacacheContentDir();if(!a)return null;let S=parseSri$1(n);return S?ms(a,S.algorithm,S.hex.slice(0,2),S.hex.slice(2,4),S.hex.slice(4)):null}function getForeignCachedTarball(n){let a=npmCachePathFor(n);return a?readCacheFile(a):null}var SN,CN=__esmMin(()=>{et(),ul(),am(),Ts(),fN(),SN=`v1`,__name$1(cacheRoot$1,`cacheRoot`),__name$1(parseSri$1,`parseSri`),__name$1(pathFor$1,`pathFor`)});function isEnabled(){let n=process.env.GJSIFY_PACKUMENT_CACHE;if(n===void 0)return!0;let a=n.trim();return!(a===`0`||a===`false`||a===``)}function cacheRoot(){return gjsifyCacheRoot(`metadata`,wN)}function shardFor(n){let a=2166136261;for(let S=0;S<n.length;S++)a^=n.charCodeAt(S),a=Math.imul(a,16777619);return(a>>>0&255).toString(16).padStart(2,`0`)}function encodePart(n){return encodeURIComponent(n).replace(/\*/g,`%2A`)}function packumentCacheKey(n,a){return`${encodePart(n)},${encodePart(a)}`}function pathFor(n,a){if(!isEnabled())return null;let S=packumentCacheKey(n,a);return ms(cacheRoot(),shardFor(S),`${S}.json`)}function getCachedPackument(n,a){let S=pathFor(n,a);if(!S)return null;let C=readCacheFile(S);if(!C)return null;try{let n=JSON.parse(C.toString(`utf-8`));return typeof n.etag!=`string`||!n.etag||!n.packument||typeof n.packument!=`object`?null:{etag:n.etag,packument:n.packument}}catch{return null}}function putCachedPackument(n,a,S,C){if(!S)return;let N=pathFor(n,a);N&&atomicWrite(N,JSON.stringify({etag:S,packument:C}))}var wN,TN=__esmMin(()=>{Ts(),fN(),wN=`v2`});function parseNodeMajor(n){return Number.parseInt(String(n).split(`.`,1)[0]??``,10)}function nativeBackendNodeError(n,a){if(!a)return null;let S=parseNodeMajor(n);return!Number.isFinite(S)||S>=24?null:`gjsify install (native backend) requires Node ≥ 24, but this is Node ${n}. Its prebuilt native modules are ABI-locked to Node 24 and crash on older majors. Use Node 24 (nvm/asdf locally, actions/setup-node in CI), or run with --backend npm.`}function onRealNode(){return gjsSystemVersion()===void 0?isNode():!1}function assertNativeBackendNodeVersion(){let n=nativeBackendNodeError(process.versions.node,onRealNode());if(n)throw Error(n)}var EN=__esmMin(()=>{bm()});function parseShebang(n){let a=DN.exec(n.trim());return a?{variables:a[1]??``,prog:a[2]??``,args:a[3]??``}:null}function replaceDollarWithPercentPair(n){return n.replace(/\$\{?([^$@#?\- \t{}:]+)\}?/g,(n,a)=>`%${a}%`)}function convertToSetCommands(n){let a=``;for(let S of n.split(` `)){let n=S.indexOf(`=`);if(n<=0)continue;let C=S.slice(0,n).trim(),N=S.slice(n+1).trim();C&&N&&(a+=`@SET ${C}=${replaceDollarWithPercentPair(N)}\r\n`)}return a}function buildCmdShim(n,a){let S=n.split(`\\`).join(`/`),C=S.split(`/`).join(`\\`),N=S,F=a?.prog??``,I=a?.args??``,H=a?.variables??``,W=F?F.split(`\\`).join(`/`):``,K=W?`"${W}$exe"`:``,q=``,Y=``,X=``;F?(q=`"%dp0%\\${F}.exe"`,Y=`"$basedir/${F}"`,X=`"$basedir/${F}$exe"`,C=`"%dp0%\\${C}"`,S=`"$basedir_win/${S}"`,N=`"$basedir/${N}"`):(F=`"%dp0%\\${C}"`,W=`"$basedir/${S}"`,K=W,I=``,C=``,S=``,N=``);let te;if(q){let n=I.trim();te=ON+convertToSetCommands(H)+`\r
|
|
773
773
|
IF EXIST ${q} (\r\n SET "_prog=${q.replace(/(^")|("$)/g,``)}"\r\n) ELSE (\r
|
|
774
774
|
SET "_prog=${F.replace(/(^")|("$)/g,``)}"\r\n)\r
|
|
775
775
|
\r
|
|
776
|
-
endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & set PATHEXT=%PATHEXT:;.JS;=;% & "%_prog%" ${n} ${C} %*\r\n`}else te=`${
|
|
776
|
+
endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & set PATHEXT=%PATHEXT:;.JS;=;% & "%_prog%" ${n} ${C} %*\r\n`}else te=`${ON}${F} ${I} ${C} %*\r\n`;let ne=`#!/bin/sh\n${kN}`;Y?ne+=`PROG_EXE=${Y.replace(/"$/,`.exe"`)}\nif ! [ -x "\$PROG_EXE" ]; then
|
|
777
777
|
PROG_EXE=${Y}\n if ! [ -x "\$PROG_EXE" ]; then
|
|
778
778
|
PROG_EXE=${W}\n if ! [ -x "\$PROG_EXE" ]; then
|
|
779
779
|
PROG_EXE=${W}.exe\n fi
|
|
780
780
|
fi
|
|
781
781
|
fi
|
|
782
782
|
|
|
783
|
-
exec ${H}"$PROG_EXE" ${I} ${S} "$@"\n`:ne+=`exec ${W} ${I} ${S} "$@"\n`;let re=
|
|
783
|
+
exec ${H}"$PROG_EXE" ${I} ${S} "$@"\n`:ne+=`exec ${W} ${I} ${S} "$@"\n`;let re=AN;return X?re+=`\$ret=0
|
|
784
784
|
if (Test-Path ${X}) {\n # Support pipeline input
|
|
785
785
|
if (\$MyInvocation.ExpectingInput) {
|
|
786
786
|
$input | & ${X} ${I} ${N} $args\n } else {
|
|
@@ -799,13 +799,13 @@ if (\$MyInvocation.ExpectingInput) {
|
|
|
799
799
|
$input | & ${K} ${N} $args\n} else {
|
|
800
800
|
& ${K} ${N} $args\n}
|
|
801
801
|
exit \$LASTEXITCODE
|
|
802
|
-
`,{sh:ne,cmd:te,ps1:re}}function buildLauncherShims(n){let{interpreter:a,interpreterArgs:S=[],target:C,prependEnv:N={}}=n,F=C.split(`/`).join(`\\`),I=S.length>0?`${S.join(` `)} `:``,H=Object.entries(N),W=
|
|
802
|
+
`,{sh:ne,cmd:te,ps1:re}}function buildLauncherShims(n){let{interpreter:a,interpreterArgs:S=[],target:C,prependEnv:N={}}=n,F=C.split(`/`).join(`\\`),I=S.length>0?`${S.join(` `)} `:``,H=Object.entries(N),W=ON;for(let[n,a]of H)W+=`@SET "${n}=${a};%${n}%"\r\n`;W+=`${a} ${I}"${F}" %*\r\n`;let K=`#!/usr/bin/env pwsh
|
|
803
803
|
`;for(let[n,a]of H)K+=`$env:${n} = "${a};" + $env:${n}\n`;let q=S.map(n=>`"${n}" `).join(``);return K+=`# Support pipeline input
|
|
804
804
|
if (\$MyInvocation.ExpectingInput) {
|
|
805
805
|
$input | & "${a}" ${q}"${F}" $args\n} else {
|
|
806
806
|
& "${a}" ${q}"${F}" $args\n}
|
|
807
807
|
exit \$LASTEXITCODE
|
|
808
|
-
`,{cmd:W,ps1:K}}function shQuote$1(n){return`'${n.replace(/'/g,`'\\''`)}'`}function buildNativeEnvPreamble(n,a=[],S={}){let C=S.platform??process.platform,N=S.arch??process.arch,{name:F,separator:I}=libraryPathVar(C);if(C===`win32`){if(a.length===0)return``;let n=shQuote$1(a.join(I));return`GI_TYPELIB_PATH=${n}\${GI_TYPELIB_PATH:+"${I}$GI_TYPELIB_PATH"}\n${F}=${n}\${${F}:+"${I}$${F}"}\nexport GI_TYPELIB_PATH ${F}\n`}let H=`${n.replace(/\/+$/,``)}/node_modules/`,W=a.filter(n=>!n.startsWith(H)),K=prebuildDirCandidates(C,N),q=[];for(let a of K)q.push(`${shQuote$1(n)}/node_modules/@*/*/prebuilds/${a}`),q.push(`${shQuote$1(n)}/node_modules/*/prebuilds/${a}`);return`gjsify_np=${W.length>0?shQuote$1(W.join(I)):`''`}\nfor gjsify_d in ${q.join(` `)}; do\n [ -d "$gjsify_d" ] || continue\n for gjsify_t in "$gjsify_d"/*.typelib; do\n if [ -f "$gjsify_t" ]; then gjsify_np="\${gjsify_np:+$gjsify_np${I}}$gjsify_d"; break; fi\n done\ndone\nif [ -n "$gjsify_np" ]; then\n GI_TYPELIB_PATH="$gjsify_np\${GI_TYPELIB_PATH:+${I}$GI_TYPELIB_PATH}"\n ${F}="$gjsify_np\${${F}:+${I}$${F}}"\n export GI_TYPELIB_PATH ${F}\nfi\nunset gjsify_np gjsify_d gjsify_t\n`}var
|
|
808
|
+
`,{cmd:W,ps1:K}}function shQuote$1(n){return`'${n.replace(/'/g,`'\\''`)}'`}function buildNativeEnvPreamble(n,a=[],S={}){let C=S.platform??process.platform,N=S.arch??process.arch,{name:F,separator:I}=libraryPathVar(C);if(C===`win32`){if(a.length===0)return``;let n=shQuote$1(a.join(I));return`GI_TYPELIB_PATH=${n}\${GI_TYPELIB_PATH:+"${I}$GI_TYPELIB_PATH"}\n${F}=${n}\${${F}:+"${I}$${F}"}\nexport GI_TYPELIB_PATH ${F}\n`}let H=`${n.replace(/\/+$/,``)}/node_modules/`,W=a.filter(n=>!n.startsWith(H)),K=prebuildDirCandidates(C,N),q=[];for(let a of K)q.push(`${shQuote$1(n)}/node_modules/@*/*/prebuilds/${a}`),q.push(`${shQuote$1(n)}/node_modules/*/prebuilds/${a}`);return`gjsify_np=${W.length>0?shQuote$1(W.join(I)):`''`}\nfor gjsify_d in ${q.join(` `)}; do\n [ -d "$gjsify_d" ] || continue\n for gjsify_t in "$gjsify_d"/*.typelib; do\n if [ -f "$gjsify_t" ]; then gjsify_np="\${gjsify_np:+$gjsify_np${I}}$gjsify_d"; break; fi\n done\ndone\nif [ -n "$gjsify_np" ]; then\n GI_TYPELIB_PATH="$gjsify_np\${GI_TYPELIB_PATH:+${I}$GI_TYPELIB_PATH}"\n ${F}="$gjsify_np\${${F}:+${I}$${F}}"\n export GI_TYPELIB_PATH ${F}\nfi\nunset gjsify_np gjsify_d gjsify_t\n`}var DN,ON,kN,AN,jN=__esmMin(()=>{uM(),DN=/^#!\s*(?:\/usr\/bin\/env\s+(?:-S\s+)?((?:[^ \t=]+=[^ \t=]+\s+)*))?([^ \t]+)(.*)$/,ON=`@ECHO off\r
|
|
809
809
|
GOTO start\r
|
|
810
810
|
:find_dp0\r
|
|
811
811
|
SET dp0=%~dp0\r
|
|
@@ -813,7 +813,7 @@ EXIT /b\r
|
|
|
813
813
|
:start\r
|
|
814
814
|
SETLOCAL\r
|
|
815
815
|
CALL :find_dp0\r
|
|
816
|
-
`,
|
|
816
|
+
`,kN=`basedir=$(dirname "$(echo "$0" | sed -e 's,\\\\,/,g')")
|
|
817
817
|
basedir_win="$basedir"
|
|
818
818
|
|
|
819
819
|
case \`uname -a\` in
|
|
@@ -833,7 +833,7 @@ case \`uname -a\` in
|
|
|
833
833
|
;;
|
|
834
834
|
esac
|
|
835
835
|
|
|
836
|
-
`,
|
|
836
|
+
`,AN=`#!/usr/bin/env pwsh
|
|
837
837
|
$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
|
|
838
838
|
|
|
839
839
|
$exe=""
|
|
@@ -842,23 +842,23 @@ if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
|
|
|
842
842
|
# are installed in the same directory
|
|
843
843
|
$exe=".exe"
|
|
844
844
|
}
|
|
845
|
-
`,__name$1(shQuote$1,`shQuote`)}),
|
|
845
|
+
`,__name$1(shQuote$1,`shQuote`)}),MN=__exportAll$4({installPackagesNative:()=>installPackagesNative,parseSpec:()=>parseSpec,pickVersion:()=>pickVersion,warnMissingNativeBuilds:()=>warnMissingNativeBuilds,writeBinEntry:()=>writeBinEntry});async function installPackagesNative(n){if(assertNativeBackendNodeVersion(),n.specs.length===0)throw Error(`installPackagesNative: empty specs list`);mkdirSync(n.prefix,{recursive:!0});let a=await loadNpmrc$1(n),S=makeLogger(n.verbose??!1),C=await acquireInstallLock(n.prefix,{signal:n.signal});try{return await installPackagesNativeLocked(n,a,S)}finally{C.release()}}async function installPackagesNativeLocked(n,a,S){let C=n.progress,N=ms(n.prefix,PN),F=readLockfile(N),I;if(n.frozen){if(!F)throw Error(`install: --immutable requires ${PN} at ${n.prefix} — none found. Run \`gjsify install\` (without --immutable) to generate one and commit it.`);let a=describeLockfileDrift(F,n.specs);if(a)throw Error(`install: --immutable but ${N} is stale.\n${a}\nRe-run \`gjsify install\` (without --immutable) to refresh the lockfile.`);S(`install: --immutable, using lockfile (%d package(s))`,Object.keys(F.packages).length),I=lockfileToNodes(F)}else if(!n.refreshLockfile&&F&&lockfileMatchesRequest(F,n.specs))S(`install: using lockfile (%d package(s))`,Object.keys(F.packages).length),I=lockfileToNodes(F);else{let H=!n.refreshLockfile&&F?buildPreferredVersions(F):void 0;S(`install: resolving %d top-level spec(s) → %s%s`,n.specs.length,n.prefix,H?` (preserving ${H.size} locked name(s))`:``),I=await resolveDeps(n.specs,a,S,n.overrides,n.skipDeps,n.signal,C,H,n.workspaceNames,n.specOrigins),n.lockfile&&(writeLockfile(N,n.specs,I),S(`install: wrote %s (%d entries)`,PN,I.length))}if(n.workspaceNames&&n.workspaceNames.size>0){let a=I.length;I=I.filter(a=>!n.workspaceNames.has(a.name));let C=a-I.length;C>0&&S(`install: %d workspace-provided package(s) symlinked, not fetched`,C)}return S(`install: downloading %d tarball(s)`,I.length),await downloadAndExtractAll(I,n.prefix,a,S,n.signal,C),await linkBins(I,n.prefix,S),warnMissingNativeBuilds(I,n.prefix,S),S(`install: done`),topLevelResolutions(n.specs,I)}function errMsg(n){return n instanceof Error?n.message:String(n)}function warnMissingNativeBuilds(n,a,S){let C=process.platform,N=process.arch,F=[`preinstall`,`install`,`postinstall`];for(let I of n){let n=ms(a,I.installPath),H;try{H=JSON.parse(readFileSync(ms(n,`package.json`),`utf8`))?.scripts}catch{continue}if(!H||typeof H!=`object`)continue;let W=F.find(n=>typeof H[n]==`string`);if(W===void 0)continue;let K=!1;try{let a=ms(n,`prebuilds`);for(let n of readdirSync(a))if(n.startsWith(`${C}-`)&&readdirSync(ms(a,n)).length>0){K=!0;break}}catch{}if(!K)try{K=readdirSync(ms(n,`build`,`Release`)).some(n=>n.endsWith(`.node`)||n.endsWith(`.so`))}catch{}K||S("install: WARNING — %s declares a native `%s` build script but ships no %s-%s prebuild, and gjsify install does not run build scripts (node-free). It will not load until built: run `node-gyp rebuild` in %s, or use a version that ships a %s-%s prebuild.",I.name,W,C,N,I.installPath,C,N)}}function topLevelResolutions(n,a){let S=new Map;for(let n of a)n.installPath===`node_modules/${n.name}`&&S.set(n.name,n);let C=[];for(let a of n){let n=parseSpecName(a),N=S.get(n);N&&C.push({name:N.name,version:N.version})}return C}function parseSpecName(n){if(n.startsWith(`@`)){let a=n.indexOf(`/`);if(a===-1)return n;let S=n.indexOf(`@`,a+1);return S===-1?n:n.slice(0,S)}let a=n.indexOf(`@`);return a===-1?n:n.slice(0,a)}async function resolveDeps(n,a,S,C,N,F,I,H,W,K){I?.beginPhase(`resolve`,n.length);let applyOverride=(n,a)=>{if(!C)return a;let N=C[n];return typeof N!=`string`||N.length===0||N===a?a:(S(`install: override %s %s → %s`,n,a,N),N)},q=new Map,fetchPkg=n=>{let C=q.get(n);if(C)return C;let N=fetchPackumentWithDiskCache(n,a,S,F);return q.set(n,N),N},Y=new Map,X=new Map,te=new Map,ne=n.map(parseSpec).map(n=>{let a=applyOverride(n.name,n.range),S=te.get(n.name);S||(S=new Map,te.set(n.name,S));let C=S.get(a);C||(C=new Set,S.set(a,C));for(let a of K?.get(`${n.name}@${n.range}`)??[])C.add(a);return{from:null,name:n.name,range:a,required:!0}});for(;ne.length>0;){let n=ne.splice(0,ne.length),a=[],C=new Set;for(let S of n)q.has(S.name)||C.has(S.name)||(C.add(S.name),a.push(S.name));await prefetchPackuments(a,fetchPkg,F);for(let a=0;a<n.length;a++){let C=n[a];if(W?.has(C.name))continue;let F=findVisible(C.from,C.name,Y);if(F&&satisfiesRange(F.version,C.range))continue;let K=null;try{let F=await fetchPkg(C.name),W=preferredVersionFor(H?.get(C.name),C.range);if(K=pickVersion(F,C.range,W),!K){if(!C.required)continue;throw Error(`No version of ${C.name} satisfies ${C.range}`)}let q=F.versions[K];if(!q)throw Error(`Packument for ${C.name} promised ${K} but no entry exists`);let te=decidePlacement(C.from,C.name,K,X),re={name:C.name,version:K,tarballUrl:q.dist.tarball,integrity:q.dist.integrity,installPath:te,dependencies:q.dependencies??{},optionalDependencies:q.optionalDependencies??{},bin:q.bin};if(Y.set(te,re),te===`node_modules/${C.name}`&&X.set(C.name,re),S(`resolve: %s@%s ← %s (at %s)`,C.name,K,C.range,te),I?.update({phase:`resolve`,current:Y.size,total:Y.size+(n.length-a-1)+ne.length,name:`${C.name}@${K}`}),!N){for(let[n,a]of Object.entries(re.dependencies))ne.push({from:te,name:n,range:applyOverride(n,a),required:!0});for(let[n,a]of Object.entries(re.optionalDependencies))ne.push({from:te,name:n,range:applyOverride(n,a),required:!1})}}catch(n){if(!C.required){S(`resolve: optional dep %s@%s skipped (%s)`,C.name,C.range,n.message);continue}throw n}}}return I?.endPhase(`resolve`),emitTopLevelConflictWarnings(te,X),Array.from(Y.values())}function emitTopLevelConflictWarnings(n,a){for(let[S,C]of n){if(C.size<2)continue;let n=a.get(S);if(!n)continue;let describe=(n,a)=>a.size>0?`${n} (requested by ${[...a].join(`, `)})`:n,N=[],F=[];for(let[a,S]of C){let C;try{C=satisfies(n.version,new YM(a))}catch{continue}(C?N:F).push(describe(a,S))}F.length!==0&&he.warn(`[gjsify] warning: version conflict for ${S}: installed ${n.version} at ${n.installPath} — does NOT satisfy ${F.join(`, `)}`+(N.length>0?`; satisfies ${N.join(`, `)}`:``)+`. One hoisted copy serves all requesters until the per-workspace dedup pass lands (Phase D.8).`)}}async function fetchPackumentWithDiskCache(n,a,S,C){let N=registryFor(n,a),F=getCachedPackument(N,n),onRetry=({attempt:a,error:C,delayMs:N})=>{S(`packument %s: retry %d after %dms (%s)`,n,a,N,errMsg(C))},I=await fetchPackumentConditional(n,{npmrc:a,signal:C,ifNoneMatch:F?.etag,onRetry});return I.status===`not-modified`&&F?(S(`packument-cache-hit: %s (304, etag %s)`,n,F.etag),F.packument):I.status===`fresh`&&I.packument?(I.etag&&putCachedPackument(N,n,I.etag,I.packument),I.packument):fetchPackument(n,{npmrc:a,signal:C,onRetry})}async function prefetchPackuments(n,a,S){if(n.length===0)return;let C=0,N=Math.max(1,Math.min(NN,n.length)),worker=async()=>{for(;C<n.length;){if(S?.aborted)return;let N=n[C++];try{await a(N)}catch{}}};await Promise.all(Array.from({length:N},()=>worker()))}function findVisible(n,a,S){let C=[];if(n!==null){C.push(`${n}/node_modules/${a}`);let S=n;for(;;){let n=S.lastIndexOf(`/node_modules/`);if(n<0||(S=S.slice(0,n),C.push(`${S}/node_modules/${a}`),S===``))break}}C.push(`node_modules/${a}`);for(let n of C){let a=S.get(n);if(a)return a}return null}function decidePlacement(n,a,S,C){let N=C.get(a);return!N||N.version===S||n===null?`node_modules/${a}`:`${n}/node_modules/${a}`}function satisfiesRange(n,a){try{return satisfies(n,new YM(a))}catch{return!1}}function readLockfile(n){if(!existsSync(n))return null;try{let a=JSON.parse(readFileSync(n,`utf-8`));return a.lockfileVersion!==FN||!a.packages||typeof a.packages!=`object`?null:a}catch{return null}}function writeLockfile(n,a,S){let C={},N=[...S].sort((n,a)=>n.installPath<a.installPath?-1:+(n.installPath>a.installPath));for(let n of N)C[n.installPath]={version:n.version,resolved:n.tarballUrl,integrity:n.integrity,dependencies:Object.keys(n.dependencies).length>0?n.dependencies:void 0,bin:n.bin};let F={lockfileVersion:FN,requested:[...a],packages:C};atomicWriteStrict(n,JSON.stringify(F,null,2)+`
|
|
846
846
|
`)}function buildPreferredVersions(n){let a=new Map;for(let[S,C]of Object.entries(n.packages)){let n=nameFromInstallPath(S),N=a.get(n);N||(N=new Set,a.set(n,N)),N.add(C.version)}return a}function preferredVersionFor(n,a){if(!n||n.size===0)return;let S;for(let C of n)satisfiesRange(C,a)&&(S===void 0||new SemVer(C).compare(new SemVer(S))>0)&&(S=C);return S}function lockfileToNodes(n){return Object.entries(n.packages).map(([n,a])=>({name:nameFromInstallPath(n),version:a.version,tarballUrl:a.resolved,integrity:a.integrity,installPath:n,dependencies:a.dependencies??{},optionalDependencies:{},bin:a.bin}))}function nameFromInstallPath(n){let a=n.lastIndexOf(`/node_modules/`);return a<0?n.replace(/^node_modules\//,``):n.slice(a+14)}function lockfileMatchesRequest(n,a){if(n.requested.length!==a.length)return!1;let S=[...n.requested].sort(),C=[...a].sort();return S.every((n,a)=>n===C[a])}function describeLockfileDrift(n,a){let S=new Set(n.requested),C=new Set(a),N=[],F=[];for(let n of C)S.has(n)||N.push(n);for(let n of S)C.has(n)||F.push(n);if(N.length===0&&F.length===0)return null;let I=[];return N.length>0&&I.push(` + ${N.sort().join(`
|
|
847
847
|
+ `)}`),F.length>0&&I.push(` - ${F.sort().join(`
|
|
848
848
|
- `)}`),I.join(`
|
|
849
|
-
`)}function parseSpec(n){if(n.startsWith(`@`)){let a=n.indexOf(`/`);if(a<0)throw Error(`Invalid spec (scoped name without slash): ${n}`);let S=n.indexOf(`@`,a);return S<0?{name:n,range:`latest`}:{name:n.slice(0,S),range:n.slice(S+1)||`latest`}}let a=n.indexOf(`@`);return a<0?{name:n,range:`latest`}:{name:n.slice(0,a),range:n.slice(a+1)||`latest`}}function pickVersion(n,a,S){if(S&&n.versions[S]&&satisfiesRange(S,a))return S;if(n[`dist-tags`][a])return n[`dist-tags`][a];let C;try{C=new qM(a)}catch{throw Error(`Invalid version range for ${n.name}: ${a}`)}return maxSatisfying(Object.keys(n.versions).filter(n=>{try{return new SemVer(n),!0}catch{return!1}}),C)}async function downloadAndExtractAll(n,a,S,C,N,F){let I=[...n].sort((n,a)=>depth(n.installPath)-depth(a.installPath)||(n.installPath<a.installPath?-1:1)),H=[],W=Math.max(1,Math.min(jN,I.length));F?.beginPhase(`download`,I.length);let K=0,q=0,tickProgress=(n,a)=>{K++,a&&q++,F?.update({phase:`download`,current:K,total:I.length,name:`${n.name}@${n.version}`})},Y=0,X=I.findIndex(n=>depth(n.installPath)>1),te=X<0?I.length:X;for(;Y<te;){if(N?.aborted)throw abortError(N);let n=I[Y++];if(!n)break;tickProgress(n,await extractOne(n,a,S,C,N))}for(let n=0;n<W;n++)H.push((async()=>{for(;;){if(N?.aborted)throw abortError(N);let n=Y++;if(n>=I.length)return;let F=I[n];if(!F)return;let H=await extractOne(F,a,S,C,N);tickProgress(F,H)}})());await Promise.all(H),F?.endPhase(`download`),q>0&&C(`install: %d/%d package(s) already up to date — extracted %d`,q,I.length,I.length-q)}function isAlreadyExtracted(n,a){let S=ms(n,`package.json`),C;try{C=readFileSync(S,`utf-8`)}catch{return!1}try{let n=JSON.parse(C);return!(n.version!==a.version||typeof n.name==`string`&&n.name!==a.name)}catch{return!1}}async function extractOne(n,a,S,C,N){let F=ms(a,n.installPath);if(assertNodeModulesDest(F,n),process.env.GJSIFY_INSTALL_FORCE_EXTRACT!==`1`&&isAlreadyExtracted(F,n))return C(`up-to-date: %s@%s (already extracted at %s)`,n.name,n.version,n.installPath),!0;let I=getCachedTarball(n.integrity);return I?C(`cache-hit: %s@%s ← %s`,n.name,n.version,n.integrity):(I=getForeignCachedTarball(n.integrity))?(C(`npm-cache-hit: %s@%s ← %s`,n.name,n.version,n.integrity),putCachedTarball(n.integrity,I)):(C(`fetch: %s@%s ← %s (→ %s)`,n.name,n.version,n.tarballUrl,n.installPath),I=await fetchTarball(n.tarballUrl,{npmrc:S,signal:N,integrity:n.integrity,onRetry:({attempt:a,error:S,delayMs:N})=>{C(`tarball %s@%s: retry %d after %dms (%s)`,n.name,n.version,a,N,errMsg(S))}}),putCachedTarball(n.integrity,I)),rmWithRetry(F),mkdirSync(F,{recursive:!0}),await extractWithStallGuard(I,F,n,N),!1}async function extractWithStallGuard(n,a,S,C){if(PN===0&&!C){await extractTarball(n,a);return}let N,onAbort;try{await new Promise((F,I)=>{if(process.env.GJSIFY_TEST_HANG_EXTRACT!==`1`&&extractTarball(n,a).then(()=>F(),I),PN>0&&(N=setTimeout(()=>{I(Error(`gjsify install: extract of ${S.name}@${S.version} stalled for ${Math.round(PN/1e3)}s (${S.installPath}) — the tarball decompress/write never completed. This is usually a dropped Gio stream event under GJS; re-run the install. Override the cap with GJSIFY_EXTRACT_STALL_MS=<ms> (0 disables it).`))},PN),N.unref?.()),C){if(C.aborted){I(abortError(C));return}onAbort=()=>I(abortError(C)),C.addEventListener(`abort`,onAbort,{once:!0})}})}finally{N&&clearTimeout(N),C&&onAbort&&C.removeEventListener(`abort`,onAbort)}}function abortError(n){let a=n&&`reason`in n?n.reason:void 0;if(a instanceof Error)return a;let S=Error(`Aborted`);return S.name=`AbortError`,S}function assertNodeModulesDest(n,a){if(!n.split(Ss).includes(`node_modules`))throw Error(`gjsify install: refusing to extract ${a.name}@${a.version} into ${n} — target is not inside a node_modules/ directory. This would overwrite working-tree files. A workspace package likely leaked into the fetch queue (it must be symlinked, not fetched).`);let S;try{S=realpathSync(n)}catch{return}if(!S.split(Ss).includes(`node_modules`))throw Error(`gjsify install: refusing to extract ${a.name}@${a.version} — ${n} resolves to ${S}, which is outside any node_modules/ directory (likely a symlink to a workspace source tree). Extracting here would delete working-tree source files.`)}function depth(n){return n.split(`/node_modules/`).length}function readShebang(n){let a;try{a=readFileSync(n,`utf-8`)}catch{return null}return parseShebang(a.trimStart().split(/\r*\n/,1)[0]??``)}function writeBinEntry(n){let{binDir:a,binName:S,targetAbs:C}=n,N=n.platform??process.platform,F=ms(a,S);if(N===`win32`){let{sh:n,cmd:S,ps1:N}=buildCmdShim(hs(a,C).split(`\\`).join(`/`),readShebang(C));for(let[a,C]of[[F,n],[`${F}.cmd`,S],[`${F}.ps1`,N]]){rmWithRetry(a),writeFileSync(a,C);try{chmodSync(a,493)}catch{}}return}rmWithRetry(F);let I=hs(a,C);try{symlinkSync(I,F)}catch{copyFileSync(C,F),chmodSync(F,493)}}async function linkBins(n,a,S){let C=ms(a,`node_modules`,`.bin`),N=0;for(let S of n){if(!S.bin||depth(S.installPath)!==1)continue;let n=normalizeBin$1(S.name,S.bin);if(n.size!==0){mkdirSync(C,{recursive:!0});for(let[F,I]of n){let n=ms(a,S.installPath,I);if(existsSync(n)){try{chmodSync(n,493)}catch{}writeBinEntry({binDir:C,binName:F,targetAbs:n}),N++}}}}N>0&&S(`bin: linked %d entry(ies) under .bin/`,N)}function rmWithRetry(n){rmSync(n,{recursive:!0,force:!0,maxRetries:10,retryDelay:100})}function normalizeBin$1(n,a){let S=new Map;if(typeof a==`string`){let C=n.startsWith(`@`)?n.slice(n.indexOf(`/`)+1):n;return S.set(C,a),S}for(let[n,C]of Object.entries(a))S.set(n,C);return S}async function loadNpmrc$1(n){let a=homedir(),S={registry:n.registry??ZM,scopes:{},authTokens:{},basicAuth:{}};for(let C of[ms(a,`.npmrc`),ms(n.prefix,`.npmrc`)])if(existsSync(C))try{let n=parseNpmrc(readFileSync(C,`utf-8`));S={...S,...n,scopes:{...S.scopes,...n.scopes}}}catch(n){he.warn(`gjsify install: ignoring malformed ${C}: ${n.message}`)}let C=process.env.npm_config_registry;return C&&(S.registry=C),n.registry&&(S.registry=n.registry),S}function makeLogger(n){return n?(n,...a)=>{let S=n.replace(/%s|%d/g,()=>String(a.shift()));process.stderr.write(`gjsify install: ${S}\n`)}:()=>{}}var jN,MN,NN,PN,FN=__esmMin(()=>{ge(),ul(),Ts(),am(),JM(),iN(),lN(),uN(),yN(),xN(),CN(),wN(),kN(),jN=Number(process.env.GJSIFY_INSTALL_CONCURRENCY??`16`)||16,MN=`gjsify-lock.json`,NN=2,PN=(()=>{let n=process.env.GJSIFY_EXTRACT_STALL_MS;if(n===void 0)return 12e4;let a=Number(n);return Number.isFinite(a)&&a>=0?a:12e4})(),__name$1(normalizeBin$1,`normalizeBin`),__name$1(loadNpmrc$1,`loadNpmrc`)}),IN=__exportAll$4({installPackages:()=>installPackages,makeProgressReporter:()=>makeProgressReporter});async function installPackages(n){if(LN===`npm`)return await installViaNpm(n),{installed:[]};let{installPackagesNative:a}=await Promise.resolve().then(()=>(FN(),AN));return{installed:await a(n)}}async function installViaNpm({prefix:n,specs:a,verbose:S,registry:C}){if(a.length===0)throw Error(`installPackages: empty specs list`);writeFileSync(ms(n,`package.json`),JSON.stringify({name:`gjsify-dlx-cache`,version:`0.0.0`,private:!0},null,2)),C&&writeFileSync(ms(n,`.npmrc`),`registry=${C}\n`);let N=[`install`,`--no-package-lock`,`--no-audit`,`--no-fund`,`--prefix`,n,...S?[`--loglevel`,`verbose`]:[`--loglevel`,`warn`],...a];await new Promise((n,a)=>{let S=spawn(`npm`,N,{stdio:`inherit`});S.on(`close`,S=>{S===0?n():a(Error(`npm install exited with code ${S}`))}),S.on(`error`,n=>{let S=n.code===`ENOENT`?`npm not found on PATH — install Node.js or set GJSIFY_INSTALL_BACKEND=native (not yet supported)`:`npm install failed: ${n.message}`;a(Error(S))})})}var LN,RN=__esmMin(()=>{Gm(),ul(),Ts(),WM(),LN=process.env.GJSIFY_INSTALL_BACKEND??`native`});async function ensurePkgDir(n,a){if(n.kind===`local`)return{pkgDir:n.path,cachedPkgName:null};let S=[n.spec,...a.extraSpecs??[]],C=cacheDirFor(createCacheKey({packages:S})),N=a.cacheMaxAge>0?getValidCachedPkg(C,a.cacheMaxAge):void 0;if(N)return{pkgDir:resolveInstalledPkgDir(N,n.name),cachedPkgName:n.name};let F=makePrepareDir(C),I=makeProgressReporter({enabled:!a.verbose});return await installPackages({prefix:F,specs:S,verbose:a.verbose,registry:a.registry,lockfile:!0,frozen:a.frozen,progress:I}),{pkgDir:resolveInstalledPkgDir(symlinkSwap(C,F),n.name),cachedPkgName:n.name}}function splitBinAndArgs(n,a,S){if(!a)return{binName:null,extraArgs:S};let C=ms(n,`package.json`);if(existsSync(C))try{let n=JSON.parse(readFileSync(C,`utf-8`)).gjsify?.bin;if(n&&Object.prototype.hasOwnProperty.call(n,a))return{binName:a,extraArgs:S}}catch{}return{binName:null,extraArgs:[a,...S]}}var zN,BN=__esmMin(()=>{ge(),fM(),IM(),LM(),BM(),RN(),ul(),Ts(),zN={command:`dlx <spec> [binOrArg] [extraArgs..]`,description:`Run the GJS bundle of an npm-published package without installing it locally.`,builder:n=>n.parserConfiguration({"populate--":!0}).positional(`spec`,{description:"Package spec (`name`, `name@version`, `@scope/name@spec`, or local path).",type:`string`,demandOption:!0}).positional(`binOrArg`,{description:"Optional bin name when the package defines `gjsify.bin` with multiple entries; otherwise treated as the first argument forwarded to the bundle. To pass a flag here (e.g. `--help`) use the `--` separator: `gjsify dlx <pkg> -- --help`.",type:`string`}).positional(`extraArgs`,{description:"Extra args forwarded to `gjs -m <bundle>`. Use `--` before flags to bypass gjsify-level parsing (`gjsify dlx <pkg> -- --help --verbose`).",type:`string`,array:!0}).option(`cache-max-age`,{description:`Cache TTL in minutes. Defaults to 7 days. Use 0 to bypass cache.`,type:`number`,default:1440*7}).option(`reinstall`,{description:`Bypass the cache for this run (alias for --cache-max-age=0).`,type:`boolean`,default:!1}).option(`frozen`,{description:`Use the project-local gjsify-lock.json verbatim — fail if missing or stale (no resolver pass).`,type:`boolean`,default:!1}).option(`verbose`,{description:`Verbose logging (passes --loglevel verbose to npm).`,type:`boolean`,default:!1}).option(`registry`,{description:`Registry URL override.`,type:`string`}),handler:async n=>{let a=parseSpec$1(n.spec),S=n.reinstall?0:n[`cache-max-age`],{pkgDir:C,cachedPkgName:N}=await ensurePkgDir(a,{verbose:n.verbose,registry:n.registry,cacheMaxAge:S,frozen:n.frozen}),F=(n[`--`]??[]).map(n=>String(n)),I=[...n.extraArgs??[],...F],{binName:H,extraArgs:W}=splitBinAndArgs(C,n.binOrArg,I),K=resolveGjsEntry(C,H);K.fromFallback&&he.warn(`[gjsify dlx] package "${N??a.kind}" has no \`gjsify\` field — falling back to package.json#main. Add \`gjsify.main\` to silence.`),await runGjsBundle(K.bundlePath,W,{exitOnSuccess:!0})}}});function readCliVersion(){try{let n=new URL(`../../package.json`,import.meta.url),a=JSON.parse(readFileSync(n,`utf8`));return typeof a.version==`string`?a.version:void 0}catch{return}}function runningAs(n){return n?`[gjsify ${n}] `:``}async function resolveShowcaseDir(n,a,S=[]){try{let a=createRequire(import.meta.url).resolve(`${n.packageName}/package.json`);if(existsSync(a))return _s(a)}catch{}let{pkgDir:C}=await ensurePkgDir(parseSpec$1(a?`${n.packageName}@${a}`:n.packageName),{verbose:!1,cacheMaxAge:1440*7,frozen:!1,extraSpecs:S});return C}async function runShowcaseOnRuntime(n,a,S){let C;try{C=await resolveShowcaseDir(n,S,[S?`@gjsify/node-gi@${S}`:`@gjsify/node-gi`])}catch(a){return he.error(`Could not resolve showcase "${n.name}": ${a.message}`),process.exit(1)}let N={};try{N=JSON.parse(readFileSync(`${C}/package.json`,`utf-8`))}catch{}let F=checkRuntimeSupported(a,readDeclaredRuntimes(N),n.name);if(!F.ok)return he.error(F.message),process.exit(1);let I;try{I=resolveNodeEntry(C)}catch(C){let F=typeof N.name==`string`?`${N.name}@${S??`?`}`:n.packageName;return he.error(`Cannot run showcase "${n.name}" on ${a}: ${C.message}\n\n ${F} declares --runtime ${a} but ships no \`--app node\` bundle, so that\n version of the showcase cannot run there. You are running gjsify ${S??`(unknown)`},\n and \`showcase\` pins the showcase to the CLI's own version.\n\n ${VN}\n\n Or run it on GJS, which every showcase ships: gjsify showcase ${n.name} --runtime gjs`),process.exit(1)}he.log(`Running showcase: ${n.name} ${runningAs(S)}on ${a} (${I})\n`);try{await runRuntimeBundle(a,I,[],{exitOnSuccess:!0})}catch(n){return he.error(`${n.message}\n\n The showcase and the \`@gjsify/node-gi\` bridge it needs are both installed by THIS CLI\n (gjsify ${S??`(unknown)`}) into its own cache, so a missing bridge points at the CLI\n rather than at anything in your project.\n\n ${VN}`),process.exit(1)}}var VN,HN,UN=__esmMin(()=>{ge(),PM(),EM(),ts(),Ts(),ul(),BN(),IM(),LM(),gM(),Ym(),VN=`A package runner reuses a CACHED copy of an unpinned bin. Force the current one:
|
|
849
|
+
`)}function parseSpec(n){if(n.startsWith(`@`)){let a=n.indexOf(`/`);if(a<0)throw Error(`Invalid spec (scoped name without slash): ${n}`);let S=n.indexOf(`@`,a);return S<0?{name:n,range:`latest`}:{name:n.slice(0,S),range:n.slice(S+1)||`latest`}}let a=n.indexOf(`@`);return a<0?{name:n,range:`latest`}:{name:n.slice(0,a),range:n.slice(a+1)||`latest`}}function pickVersion(n,a,S){if(S&&n.versions[S]&&satisfiesRange(S,a))return S;if(n[`dist-tags`][a])return n[`dist-tags`][a];let C;try{C=new YM(a)}catch{throw Error(`Invalid version range for ${n.name}: ${a}`)}return maxSatisfying(Object.keys(n.versions).filter(n=>{try{return new SemVer(n),!0}catch{return!1}}),C)}async function downloadAndExtractAll(n,a,S,C,N,F){let I=[...n].sort((n,a)=>depth(n.installPath)-depth(a.installPath)||(n.installPath<a.installPath?-1:1)),H=[],W=Math.max(1,Math.min(NN,I.length));F?.beginPhase(`download`,I.length);let K=0,q=0,tickProgress=(n,a)=>{K++,a&&q++,F?.update({phase:`download`,current:K,total:I.length,name:`${n.name}@${n.version}`})},Y=0,X=I.findIndex(n=>depth(n.installPath)>1),te=X<0?I.length:X;for(;Y<te;){if(N?.aborted)throw abortError(N);let n=I[Y++];if(!n)break;tickProgress(n,await extractOne(n,a,S,C,N))}for(let n=0;n<W;n++)H.push((async()=>{for(;;){if(N?.aborted)throw abortError(N);let n=Y++;if(n>=I.length)return;let F=I[n];if(!F)return;let H=await extractOne(F,a,S,C,N);tickProgress(F,H)}})());await Promise.all(H),F?.endPhase(`download`),q>0&&C(`install: %d/%d package(s) already up to date — extracted %d`,q,I.length,I.length-q)}function isAlreadyExtracted(n,a){let S=ms(n,`package.json`),C;try{C=readFileSync(S,`utf-8`)}catch{return!1}try{let n=JSON.parse(C);return!(n.version!==a.version||typeof n.name==`string`&&n.name!==a.name)}catch{return!1}}async function extractOne(n,a,S,C,N){let F=ms(a,n.installPath);if(assertNodeModulesDest(F,n),process.env.GJSIFY_INSTALL_FORCE_EXTRACT!==`1`&&isAlreadyExtracted(F,n))return C(`up-to-date: %s@%s (already extracted at %s)`,n.name,n.version,n.installPath),!0;let I=getCachedTarball(n.integrity);return I?C(`cache-hit: %s@%s ← %s`,n.name,n.version,n.integrity):(I=getForeignCachedTarball(n.integrity))?(C(`npm-cache-hit: %s@%s ← %s`,n.name,n.version,n.integrity),putCachedTarball(n.integrity,I)):(C(`fetch: %s@%s ← %s (→ %s)`,n.name,n.version,n.tarballUrl,n.installPath),I=await fetchTarball(n.tarballUrl,{npmrc:S,signal:N,integrity:n.integrity,onRetry:({attempt:a,error:S,delayMs:N})=>{C(`tarball %s@%s: retry %d after %dms (%s)`,n.name,n.version,a,N,errMsg(S))}}),putCachedTarball(n.integrity,I)),rmWithRetry(F),mkdirSync(F,{recursive:!0}),await extractWithStallGuard(I,F,n,N),!1}async function extractWithStallGuard(n,a,S,C){if(IN===0&&!C){await extractTarball(n,a);return}let N,onAbort;try{await new Promise((F,I)=>{if(process.env.GJSIFY_TEST_HANG_EXTRACT!==`1`&&extractTarball(n,a).then(()=>F(),I),IN>0&&(N=setTimeout(()=>{I(Error(`gjsify install: extract of ${S.name}@${S.version} stalled for ${Math.round(IN/1e3)}s (${S.installPath}) — the tarball decompress/write never completed. This is usually a dropped Gio stream event under GJS; re-run the install. Override the cap with GJSIFY_EXTRACT_STALL_MS=<ms> (0 disables it).`))},IN),N.unref?.()),C){if(C.aborted){I(abortError(C));return}onAbort=()=>I(abortError(C)),C.addEventListener(`abort`,onAbort,{once:!0})}})}finally{N&&clearTimeout(N),C&&onAbort&&C.removeEventListener(`abort`,onAbort)}}function abortError(n){let a=n&&`reason`in n?n.reason:void 0;if(a instanceof Error)return a;let S=Error(`Aborted`);return S.name=`AbortError`,S}function assertNodeModulesDest(n,a){if(!n.split(Ss).includes(`node_modules`))throw Error(`gjsify install: refusing to extract ${a.name}@${a.version} into ${n} — target is not inside a node_modules/ directory. This would overwrite working-tree files. A workspace package likely leaked into the fetch queue (it must be symlinked, not fetched).`);let S;try{S=realpathSync(n)}catch{return}if(!S.split(Ss).includes(`node_modules`))throw Error(`gjsify install: refusing to extract ${a.name}@${a.version} — ${n} resolves to ${S}, which is outside any node_modules/ directory (likely a symlink to a workspace source tree). Extracting here would delete working-tree source files.`)}function depth(n){return n.split(`/node_modules/`).length}function readShebang(n){let a;try{a=readFileSync(n,`utf-8`)}catch{return null}return parseShebang(a.trimStart().split(/\r*\n/,1)[0]??``)}function writeBinEntry(n){let{binDir:a,binName:S,targetAbs:C}=n,N=n.platform??process.platform,F=ms(a,S);if(N===`win32`){let{sh:n,cmd:S,ps1:N}=buildCmdShim(hs(a,C).split(`\\`).join(`/`),readShebang(C));for(let[a,C]of[[F,n],[`${F}.cmd`,S],[`${F}.ps1`,N]]){rmWithRetry(a),writeFileSync(a,C);try{chmodSync(a,493)}catch{}}return}rmWithRetry(F);let I=hs(a,C);try{symlinkSync(I,F)}catch{copyFileSync(C,F),chmodSync(F,493)}}async function linkBins(n,a,S){let C=ms(a,`node_modules`,`.bin`),N=0;for(let S of n){if(!S.bin||depth(S.installPath)!==1)continue;let n=normalizeBin$1(S.name,S.bin);if(n.size!==0){mkdirSync(C,{recursive:!0});for(let[F,I]of n){let n=ms(a,S.installPath,I);if(existsSync(n)){try{chmodSync(n,493)}catch{}writeBinEntry({binDir:C,binName:F,targetAbs:n}),N++}}}}N>0&&S(`bin: linked %d entry(ies) under .bin/`,N)}function rmWithRetry(n){rmSync(n,{recursive:!0,force:!0,maxRetries:10,retryDelay:100})}function normalizeBin$1(n,a){let S=new Map;if(typeof a==`string`){let C=n.startsWith(`@`)?n.slice(n.indexOf(`/`)+1):n;return S.set(C,a),S}for(let[n,C]of Object.entries(a))S.set(n,C);return S}async function loadNpmrc$1(n){let a=homedir(),S={registry:n.registry??$M,scopes:{},authTokens:{},basicAuth:{}};for(let C of[ms(a,`.npmrc`),ms(n.prefix,`.npmrc`)])if(existsSync(C))try{let n=parseNpmrc(readFileSync(C,`utf-8`));S={...S,...n,scopes:{...S.scopes,...n.scopes}}}catch(n){he.warn(`gjsify install: ignoring malformed ${C}: ${n.message}`)}let C=process.env.npm_config_registry;return C&&(S.registry=C),n.registry&&(S.registry=n.registry),S}function makeLogger(n){return n?(n,...a)=>{let S=n.replace(/%s|%d/g,()=>String(a.shift()));process.stderr.write(`gjsify install: ${S}\n`)}:()=>{}}var NN,PN,FN,IN,LN=__esmMin(()=>{ge(),ul(),Ts(),am(),XM(),oN(),dN(),fN(),xN(),CN(),TN(),EN(),jN(),NN=Number(process.env.GJSIFY_INSTALL_CONCURRENCY??`16`)||16,PN=`gjsify-lock.json`,FN=2,IN=(()=>{let n=process.env.GJSIFY_EXTRACT_STALL_MS;if(n===void 0)return 12e4;let a=Number(n);return Number.isFinite(a)&&a>=0?a:12e4})(),__name$1(normalizeBin$1,`normalizeBin`),__name$1(loadNpmrc$1,`loadNpmrc`)}),RN=__exportAll$4({installPackages:()=>installPackages,makeProgressReporter:()=>makeProgressReporter});async function installPackages(n){if(zN===`npm`)return await installViaNpm(n),{installed:[]};let{installPackagesNative:a}=await Promise.resolve().then(()=>(LN(),MN));return{installed:await a(n)}}async function installViaNpm({prefix:n,specs:a,verbose:S,registry:C}){if(a.length===0)throw Error(`installPackages: empty specs list`);writeFileSync(ms(n,`package.json`),JSON.stringify({name:`gjsify-dlx-cache`,version:`0.0.0`,private:!0},null,2)),C&&writeFileSync(ms(n,`.npmrc`),`registry=${C}\n`);let N=[`install`,`--no-package-lock`,`--no-audit`,`--no-fund`,`--prefix`,n,...S?[`--loglevel`,`verbose`]:[`--loglevel`,`warn`],...a];await new Promise((n,a)=>{let S=spawn(`npm`,N,{stdio:`inherit`});S.on(`close`,S=>{S===0?n():a(Error(`npm install exited with code ${S}`))}),S.on(`error`,n=>{let S=n.code===`ENOENT`?`npm not found on PATH — install Node.js or set GJSIFY_INSTALL_BACKEND=native (not yet supported)`:`npm install failed: ${n.message}`;a(Error(S))})})}var zN,BN=__esmMin(()=>{Gm(),ul(),Ts(),KM(),zN=process.env.GJSIFY_INSTALL_BACKEND??`native`});async function ensurePkgDir(n,a){if(n.kind===`local`)return{pkgDir:n.path,cachedPkgName:null};let S=[n.spec,...a.extraSpecs??[]],C=cacheDirFor(createCacheKey({packages:S})),N=a.cacheMaxAge>0?getValidCachedPkg(C,a.cacheMaxAge):void 0;if(N)return{pkgDir:resolveInstalledPkgDir(N,n.name),cachedPkgName:n.name};let F=makePrepareDir(C),I=makeProgressReporter({enabled:!a.verbose});return await installPackages({prefix:F,specs:S,verbose:a.verbose,registry:a.registry,lockfile:!0,frozen:a.frozen,progress:I}),{pkgDir:resolveInstalledPkgDir(symlinkSwap(C,F),n.name),cachedPkgName:n.name}}function splitBinAndArgs(n,a,S){if(!a)return{binName:null,extraArgs:S};let C=ms(n,`package.json`);if(existsSync(C))try{let n=JSON.parse(readFileSync(C,`utf-8`)).gjsify?.bin;if(n&&Object.prototype.hasOwnProperty.call(n,a))return{binName:a,extraArgs:S}}catch{}return{binName:null,extraArgs:[a,...S]}}var VN,HN=__esmMin(()=>{ge(),fM(),IM(),LM(),HM(),BN(),ul(),Ts(),VN={command:`dlx <spec> [binOrArg] [extraArgs..]`,description:`Run the GJS bundle of an npm-published package without installing it locally.`,builder:n=>n.parserConfiguration({"populate--":!0}).positional(`spec`,{description:"Package spec (`name`, `name@version`, `@scope/name@spec`, or local path).",type:`string`,demandOption:!0}).positional(`binOrArg`,{description:"Optional bin name when the package defines `gjsify.bin` with multiple entries; otherwise treated as the first argument forwarded to the bundle. To pass a flag here (e.g. `--help`) use the `--` separator: `gjsify dlx <pkg> -- --help`.",type:`string`}).positional(`extraArgs`,{description:"Extra args forwarded to `gjs -m <bundle>`. Use `--` before flags to bypass gjsify-level parsing (`gjsify dlx <pkg> -- --help --verbose`).",type:`string`,array:!0}).option(`cache-max-age`,{description:`Cache TTL in minutes. Defaults to 7 days. Use 0 to bypass cache.`,type:`number`,default:1440*7}).option(`reinstall`,{description:`Bypass the cache for this run (alias for --cache-max-age=0).`,type:`boolean`,default:!1}).option(`frozen`,{description:`Use the project-local gjsify-lock.json verbatim — fail if missing or stale (no resolver pass).`,type:`boolean`,default:!1}).option(`verbose`,{description:`Verbose logging (passes --loglevel verbose to npm).`,type:`boolean`,default:!1}).option(`registry`,{description:`Registry URL override.`,type:`string`}),handler:async n=>{let a=parseSpec$1(n.spec),S=n.reinstall?0:n[`cache-max-age`],{pkgDir:C,cachedPkgName:N}=await ensurePkgDir(a,{verbose:n.verbose,registry:n.registry,cacheMaxAge:S,frozen:n.frozen}),F=(n[`--`]??[]).map(n=>String(n)),I=[...n.extraArgs??[],...F],{binName:H,extraArgs:W}=splitBinAndArgs(C,n.binOrArg,I),K=resolveGjsEntry(C,H);K.fromFallback&&he.warn(`[gjsify dlx] package "${N??a.kind}" has no \`gjsify\` field — falling back to package.json#main. Add \`gjsify.main\` to silence.`),await runGjsBundle(K.bundlePath,W,{exitOnSuccess:!0})}}});function readCliVersion(){try{let n=new URL(`../../package.json`,import.meta.url),a=JSON.parse(readFileSync(n,`utf8`));return typeof a.version==`string`?a.version:void 0}catch{return}}function runningAs(n){return n?`[gjsify ${n}] `:``}async function resolveShowcaseDir(n,a,S=[]){try{let a=createRequire(import.meta.url).resolve(`${n.packageName}/package.json`);if(existsSync(a))return _s(a)}catch{}let{pkgDir:C}=await ensurePkgDir(parseSpec$1(a?`${n.packageName}@${a}`:n.packageName),{verbose:!1,cacheMaxAge:1440*7,frozen:!1,extraSpecs:S});return C}async function runShowcaseOnRuntime(n,a,S){let C;try{C=await resolveShowcaseDir(n,S,[S?`@gjsify/node-gi@${S}`:`@gjsify/node-gi`])}catch(a){return he.error(`Could not resolve showcase "${n.name}": ${a.message}`),process.exit(1)}let N={};try{N=JSON.parse(readFileSync(`${C}/package.json`,`utf-8`))}catch{}let F=checkRuntimeSupported(a,readDeclaredRuntimes(N),n.name);if(!F.ok)return he.error(F.message),process.exit(1);let I;try{I=resolveNodeEntry(C)}catch(C){let F=typeof N.name==`string`?`${N.name}@${S??`?`}`:n.packageName;return he.error(`Cannot run showcase "${n.name}" on ${a}: ${C.message}\n\n ${F} declares --runtime ${a} but ships no \`--app node\` bundle, so that\n version of the showcase cannot run there. You are running gjsify ${S??`(unknown)`},\n and \`showcase\` pins the showcase to the CLI's own version.\n\n ${UN}\n\n Or run it on GJS, which every showcase ships: gjsify showcase ${n.name} --runtime gjs`),process.exit(1)}he.log(`Running showcase: ${n.name} ${runningAs(S)}on ${a} (${I})\n`);try{await runRuntimeBundle(a,I,[],{exitOnSuccess:!0})}catch(n){return he.error(`${n.message}\n\n The showcase and the \`@gjsify/node-gi\` bridge it needs are both installed by THIS CLI\n (gjsify ${S??`(unknown)`}) into its own cache, so a missing bridge points at the CLI\n rather than at anything in your project.\n\n ${UN}`),process.exit(1)}}var UN,WN,GN=__esmMin(()=>{ge(),PM(),EM(),ts(),Ts(),ul(),HN(),IM(),LM(),gM(),Ym(),UN=`A package runner reuses a CACHED copy of an unpinned bin. Force the current one:
|
|
850
850
|
npx @gjsify/cli@latest showcase <name>
|
|
851
851
|
bunx @gjsify/cli@latest showcase <name>
|
|
852
|
-
deno run -A --reload --min-dep-age 0 npm:@gjsify/cli@latest showcase <name>`,
|
|
852
|
+
deno run -A --reload --min-dep-age 0 npm:@gjsify/cli@latest showcase <name>`,WN={command:`showcase [name]`,description:`List or run curated gjsify showcase applications.`,builder:n=>n.positional(`name`,{description:`Showcase name to run (omit to list all)`,type:`string`}).option(`json`,{description:`Output as JSON`,type:`boolean`,default:!1}).option(`list`,{description:`List available showcases`,type:`boolean`,default:!1}).option(`runtime`,{type:`string`,choices:qm,defaultDescription:`gjs when gjs is installed, else the host runtime`,description:"Runtime to run the showcase on: gjs | node | bun | deno (default: gjs when installed, else the host runtime). node/bun/deno run its `--app node` bundle."}),handler:async n=>{if(!n.name||n.list){let a=discoverShowcases();if(n.json){he.log(JSON.stringify(a,null,2));return}if(a.length===0){he.log("No showcases found. The CLI ships a curated list in `showcases.json`; if it is missing the CLI install is incomplete.");return}let S=new Map;for(let n of a){let a=S.get(n.category)??[];a.push(n),S.set(n.category,a)}he.log(`Available gjsify showcases:
|
|
853
853
|
`);for(let[n,a]of S){he.log(` ${n.toUpperCase()}:`);let S=Math.max(...a.map(n=>n.name.length));for(let n of a){let a=` `.repeat(S-n.name.length+2),C=n.description?`${a}${n.description}`:``;he.log(` ${n.name}${C}`)}he.log(``)}he.log(`Run a showcase: gjsify showcase <name>`);return}let a=findShowcase(n.name);if(!a)return he.error(`Unknown showcase: "${n.name}"`),he.error(`Run "gjsify showcase" to list available showcases.`),process.exit(1);let S=n.runtime??defaultExampleRuntime();if(!isExampleRuntime(S))return he.error(`Unknown --runtime "${S}" (expected: ${qm.join(`, `)}).`),process.exit(1);if(requiresGjsSystemDeps(S)){let n=runMinimalChecks().filter(n=>!n.found&&n.severity===`required`);if(n.length>0){he.error(`Missing system dependencies:
|
|
854
|
-
`);for(let a of n)he.error(` ✗ ${a.name}`);let a=buildInstallCommand(detectPackageManager$2(),n);return a&&he.error(`\nInstall with:\n ${a}`),process.exit(1)}}let C=readCliVersion();if(S!==`gjs`){await runShowcaseOnRuntime(a,S,C);return}let N=C?`${a.packageName}@${C}`:a.packageName;he.log(`Running showcase: ${a.name} ${runningAs(C)}(via gjsify dlx ${N})\n`);try{let{runCli:n}=await Promise.resolve().then(()=>(
|
|
855
|
-
`),S(Error(`Cancelled by user`));return}F.name===`up`||F.name===`k`?(C=(C-1+n.length)%n.length,render(n,C,!1)):F.name===`down`||F.name===`j`?(C=(C+1)%n.length,render(n,C,!1)):(F.name===`return`||F.name===`enter`)&&(cleanup(),a(n[C]))}};Jt.on(`keypress`,onKeypress)})}var YN,XN=__esmMin(()=>{Yt(),Qc(),YN={reset:`\x1B[0m`,bold:`\x1B[1m`,dim:`\x1B[2m`,cyan:`\x1B[36m`,green:`\x1B[32m`}}),ZN,QN=__esmMin(()=>{ge(),JN(),XN(),ZN={command:`create [project-name]`,description:`Scaffold a new Gjsify project in a new directory.`,builder:n=>{let a=discoverTemplates().map(n=>n.name);return n.positional(`project-name`,{describe:`Name of the project directory to create`,type:`string`,default:`my-gjs-app`}).option(`template`,{alias:`t`,describe:`Template to scaffold from`,type:`string`,choices:a.length>0?a:void 0}).option(`force`,{alias:`f`,describe:`Scaffold into a non-empty directory`,type:`boolean`,default:!1}).option(`install`,{describe:`Run npm install after scaffolding`,type:`boolean`,default:!1})},handler:async n=>{let a=n.template;if(!a){let n=discoverTemplates();if(!process.stdin.isTTY){let a=n.map(n=>n.name).join(`, `);return he.error(`Error: --template is required in non-interactive mode. Available templates: ${a||`(none)`}`),process.exit(1)}a=(await promptTemplate(n)).name}await createProject({projectName:n[`project-name`],template:a,force:n.force,install:n.install})}}});function defaultTargetFor(n){let a=vs(n,ys(n));return ds(_s(n),a)}var $N,eP,tP=__esmMin(()=>{ge(),Gm(),Hc(),Ts(),pc(),$N=promisify(execFile),eP={command:`gresource <xml>`,description:"Compile a GResource XML descriptor into a binary .gresource bundle (wraps `glib-compile-resources`).",builder:n=>n.positional(`xml`,{description:`Path to the .gresource.xml descriptor`,type:`string`,normalize:!0,demandOption:!0}).option(`sourcedir`,{description:`Directory containing the resource files referenced by <xml>`,type:`string`,normalize:!0}).option(`target`,{alias:`t`,description:`Output .gresource file (default: <xml-without-.xml> next to <xml>)`,type:`string`,normalize:!0}).option(`verbose`,{description:`Print the underlying glib-compile-resources invocation`,type:`boolean`,default:!1}),handler:async n=>{let a=ds(n.xml),S=n.target?ds(n.target):defaultTargetFor(a),C=[`--sourcedir=${n.sourcedir?ds(n.sourcedir):_s(a)}`,`--target=${S}`,a];n.verbose&&he.log(`[gjsify gresource] glib-compile-resources ${C.join(` `)}`),await mkdir$1(_s(S),{recursive:!0});try{let{stdout:a,stderr:N}=await $N(`glib-compile-resources`,C);a&&process.stdout.write(a),N&&process.stderr.write(N),n.verbose&&he.log(`[gjsify gresource] wrote ${S}`)}catch(n){let a=n;a?.code===`ENOENT`?he.error(`[gjsify gresource] glib-compile-resources not found. Install it via your distro (package: glib2-devel / libglib2.0-dev).`):(a?.stderr&&process.stderr.write(a.stderr),he.error(`[gjsify gresource] glib-compile-resources failed${a?.code===void 0?``:` (exit ${a.code})`}`)),process.exitCode=typeof a?.code==`number`?a.code:1}}}});async function listLanguages(n){return(await readdir$1(n)).filter(n=>n.endsWith(`.po`)&&!n.startsWith(`.`)).map(n=>n.slice(0,-3)).sort()}function stripXmlComments(n){return n.replace(/<!--[\s\S]*?-->/g,``)}async function ensureDir(n){await mkdir$1(n,{recursive:!0})}async function fileExists(n){try{return await stat$1(n),!0}catch{return!1}}async function compileBulkXml(n){let a=ms(n.outDir,n.filename);await ensureDir(n.outDir);let S=[`--output-file=${a}`,`--xml`,`--template=${n.template}`,`-d`,n.poDir];n.verbose&&he.log(`[gjsify gettext] msgfmt ${S.join(` `)}`),await nP(`msgfmt`,S),n.removeXmlComments&&await writeFile$1(a,stripXmlComments(await readFile$1(a,`utf-8`))),n.verbose&&he.log(`[gjsify gettext] wrote ${a}`)}async function compilePerLanguage(n){let a=await listLanguages(n.poDir);if(a.length===0){he.warn(`[gjsify gettext] no .po files found in ${n.poDir}`);return}for(let S of a){let a=ms(n.poDir,`${S}.po`),C=n.format===`mo`?ms(n.outDir,S,`LC_MESSAGES`):ms(n.outDir,S);await ensureDir(C);let N=[`--output-file=${ms(C,n.filename)}`];n.format!==`mo`&&N.push(`--${n.format}`),N.push(a),n.verbose&&he.log(`[gjsify gettext] msgfmt ${N.join(` `)}`),await nP(`msgfmt`,N)}n.verbose&&he.log(`[gjsify gettext] compiled ${a.length} language(s) into ${n.outDir}`)}function defaultFilename(n,a,S){switch(a){case`mo`:return`${n}.mo`;case`json`:return`${n}.json`;case`desktop`:return`${n}.desktop`;case`xml`:if(S){let n=S.replace(/\.in$/,``),a=n.lastIndexOf(`/`);return a>=0?n.slice(a+1):n}return`${n}.xml`}}var nP,rP,iP=__esmMin(()=>{ge(),Gm(),Hc(),Ts(),pc(),nP=promisify(execFile),rP={command:`gettext <poDir> <outDir>`,description:`Compile gettext .po files to .mo (per-language locale tree) or substitute a metainfo template via msgfmt --xml.`,builder:n=>n.positional(`poDir`,{description:`Directory containing <lang>.po files`,type:`string`,normalize:!0,demandOption:!0}).positional(`outDir`,{description:`Output directory (locale tree for --format=mo, plain dir for xml/desktop/json)`,type:`string`,normalize:!0,demandOption:!0}).option(`domain`,{description:"Text domain / application ID (e.g. `org.pixelrpg.maker`)",type:`string`,normalize:!0,demandOption:!0}).option(`format`,{description:`Output format`,type:`string`,choices:[`mo`,`xml`,`desktop`,`json`],default:`mo`}).option(`metainfo`,{description:"For --format=xml: path to the template (`.metainfo.xml.in`) used as msgfmt --template",type:`string`,normalize:!0}).option(`filename`,{description:`Override the output filename (defaults to <domain>.<ext>)`,type:`string`,normalize:!0}).option(`remove-xml-comments`,{description:`For --format=xml: strip XML comments from the compiled output`,type:`boolean`,default:!0}).option(`verbose`,{description:`Print each msgfmt invocation`,type:`boolean`,default:!1}),handler:async n=>{let a=ds(n.poDir),S=ds(n.outDir),C=n.domain,N=n.format??`mo`,F=n.metainfo?ds(n.metainfo):void 0,I=n.filename??defaultFilename(C,N,F),H=!!n.verbose,W=!!n[`remove-xml-comments`];if(!await fileExists(a)){he.error(`[gjsify gettext] PO directory does not exist: ${a}`),process.exitCode=1;return}try{N===`xml`&&F?await compileBulkXml({poDir:a,outDir:S,domain:C,template:F,filename:I,removeXmlComments:W,verbose:H}):(N===`xml`&&he.warn(`[gjsify gettext] --format=xml without --metainfo: falling back to per-language XML files`),await compilePerLanguage({poDir:a,outDir:S,domain:C,format:N,filename:I,verbose:H}))}catch(n){let a=n;a?.code===`ENOENT`?he.error(`[gjsify gettext] msgfmt not found. Install it via your distro (package: gettext).`):(a?.stderr&&process.stderr.write(a.stderr),he.error(`[gjsify gettext] msgfmt failed${a?.code===void 0?``:` (exit ${a.code})`}`)),process.exitCode=typeof a?.code==`number`?a.code:1}}}}),aP,oP,sP=__esmMin(()=>{ge(),Gm(),Hc(),Ts(),pc(),aP=promisify(execFile),oP={command:`gsettings <schemadir>`,description:"Compile GSettings schema XML files into a binary gschemas.compiled (wraps `glib-compile-schemas`).",builder:n=>n.positional(`schemadir`,{description:`Directory containing *.gschema.xml descriptors`,type:`string`,normalize:!0,demandOption:!0}).option(`targetdir`,{alias:`t`,description:`Directory to write gschemas.compiled (default: <schemadir>)`,type:`string`,normalize:!0}).option(`strict`,{description:`Abort on any schema warning (passes --strict to glib-compile-schemas)`,type:`boolean`,default:!0}).option(`verbose`,{description:`Print the underlying glib-compile-schemas invocation`,type:`boolean`,default:!1}),handler:async n=>{let a=ds(n.schemadir),S=n.targetdir?ds(n.targetdir):a,C=[];n.strict&&C.push(`--strict`),C.push(`--targetdir=${S}`),C.push(a),n.verbose&&he.log(`[gjsify gsettings] glib-compile-schemas ${C.join(` `)}`),await mkdir$1(S,{recursive:!0});try{let{stdout:a,stderr:N}=await aP(`glib-compile-schemas`,C);a&&process.stdout.write(a),N&&process.stderr.write(N),n.verbose&&he.log(`[gjsify gsettings] wrote ${S}/gschemas.compiled`)}catch(n){let a=n;a?.code===`ENOENT`?he.error(`[gjsify gsettings] glib-compile-schemas not found. Install it via your distro (package: glib2-devel / libglib2.0-dev).`):(a?.stderr&&process.stderr.write(a.stderr),he.error(`[gjsify gsettings] glib-compile-schemas failed${a?.code===void 0?``:` (exit ${a.code})`}`)),process.exitCode=typeof a?.code==`number`?a.code:1}}}});function readPackageJson(n){let a=ds(n,`package.json`),S;try{S=readFileSync(a,`utf-8`)}catch{throw Error(`gjsify flatpak: no package.json found at ${a}`)}try{return JSON.parse(S)}catch(n){throw Error(`gjsify flatpak: package.json at ${a} is not valid JSON: ${n.message}`)}}function looksLikeAppId(n){return typeof n==`string`&&/^[A-Za-z][A-Za-z0-9_-]*(\.[A-Za-z][A-Za-z0-9_-]*){2,}$/.test(n)}function resolveRuntime(n,a){let S=a.runtime??n?.runtime??`gnome`;if(S!==`gnome`&&S!==`freedesktop`)throw Error(`gjsify flatpak: unknown runtime "${S}" (expected "gnome" or "freedesktop")`);let C=a.runtimeVersion??n?.runtimeVersion??(S===`gnome`?`50`:`24.08`);return S===`gnome`?{runtime:S,runtimeId:`org.gnome.Platform`,sdk:`org.gnome.Sdk`,runtimeVersion:C}:{runtime:S,runtimeId:`org.freedesktop.Platform`,sdk:`org.freedesktop.Sdk`,runtimeVersion:C}}function defaultCiContainer(n,a){return`ghcr.io/flathub-infra/flatpak-github-actions:${`${n}-${a}`}`}var cP,lP,uP=__esmMin(()=>{ul(),Ts(),cP=[`--device=dri`,`--share=ipc`,`--socket=fallback-x11`,`--socket=wayland`],lP=[]});function loadDesktopTemplate(){return readFileSync(new URL(`../../templates/flatpak/desktop.tmpl`,import.meta.url),`utf-8`)}function loadFlathubAppTemplate(){return readFileSync(new URL(`../../templates/flatpak/flathub-app.json.tmpl`,import.meta.url),`utf-8`)}function loadFlathubCliTemplate(){return readFileSync(new URL(`../../templates/flatpak/flathub-cli.json.tmpl`,import.meta.url),`utf-8`)}function validateScaffoldInputs(n){let a=n.flatpak,S=[];return(!a.developer?.id||!a.developer?.name)&&S.push({field:`gjsify.flatpak.developer`,hint:'Set `gjsify.flatpak.developer = { "id": "io.github.you", "name": "Your Name" }` in package.json. The id is reverse-DNS.'}),a.summary||S.push({field:`gjsify.flatpak.summary`,hint:`One-line app summary, ≤80 chars, no trailing period. Example: "Learn 6502 assembly language".`}),a.description||S.push({field:`gjsify.flatpak.description`,hint:`Plain text (split on blank lines) or DescriptionBlock[] for rich content with bullet lists + translator hints.`}),a.license?.project||S.push({field:`gjsify.flatpak.license.project`,hint:`SPDX identifier of the project license, e.g. "MIT", "GPL-3.0-or-later".`}),a.homepageUrl||S.push({field:`gjsify.flatpak.homepageUrl`,hint:`Required by Flathub. Example: "https://github.com/you/your-repo".`}),S}function renderMetainfoApp(n){return renderMetainfo(n,`desktop-application`)}function renderMetainfoCli(n){return renderMetainfo(n,`console-application`)}function renderDesktop(n){let a=n.flatpak,S=(a.categories??[`Utility`]).join(`;`)+`;`,C=a.keywords?.length?`Keywords=${a.keywords.join(`;`)};\n`:``,N=a.provides?.mimetypes??[],F=N.length?`MimeType=${N.join(`;`)};\n`:``;return substitute(loadDesktopTemplate(),{NAME:n.name,SUMMARY:a.summary??n.name,COMMAND:n.command,APP_ID:n.appId,CATEGORIES_LINE:S,KEYWORDS_LINE:C,MIMETYPES_LINE:F})}function renderFlathubJson(n){return n===`cli`?loadFlathubCliTemplate():loadFlathubAppTemplate()}function renderMetainfo(n,a){let S=n.flatpak,C=new Date().getFullYear(),N=S.developer?.name??``,F=[];F.push(`<?xml version="1.0" encoding="UTF-8"?>`),F.push(`<!-- Copyright ${C} ${escapeXml(N)} -->`),F.push(`<component type="${a}">`),F.push(` <id>${escapeXml(n.appId)}</id>`),F.push(` <metadata_license>${escapeXml(S.license?.metadata??`CC0-1.0`)}</metadata_license>`),F.push(` <project_license>${escapeXml(S.license?.project??``)}</project_license>`),F.push(` <name>${escapeXml(n.name)}</name>`),pushTranslatorHint(F,S.summaryTranslatorHint,` `),F.push(` <summary>${escapeXml(S.summary??n.name)}</summary>`),S.iconRemote&&F.push(` <icon type="remote">${escapeXml(S.iconRemote)}</icon>`),F.push(` <description>`);for(let n of renderDescriptionBlocks(S.description??``,` `))F.push(n);if(F.push(` </description>`),S.developer?.id&&S.developer?.name){F.push(` <developer id="${escapeXml(S.developer.id)}">`);let n=S.developer.nameTranslatable===!0?``:` translate="no"`;F.push(` <name${n}>${escapeXml(S.developer.name)}</name>`),S.developer.email&&F.push(` <email>${escapeXml(S.developer.email)}</email>`),F.push(` </developer>`)}a===`desktop-application`&&F.push(` <launchable type="desktop-id">${escapeXml(n.appId)}.desktop</launchable>`),S.screenshots?.length&&(F.push(` <screenshots>`),S.screenshots.forEach((n,a)=>{let S=n.type??(a===0?`default`:void 0),C=S?` type="${escapeXml(S)}"`:``,N=n.environment?` environment="${escapeXml(n.environment)}"`:``;F.push(` <screenshot${C}${N}>`),F.push(` <image>${escapeXml(n.url)}</image>`),n.caption&&(pushTranslatorHint(F,n.captionTranslatorHint,` `),F.push(` <caption>${escapeXml(n.caption)}</caption>`)),F.push(` </screenshot>`)}),F.push(` </screenshots>`)),S.homepageUrl&&F.push(` <url type="homepage">${escapeXml(S.homepageUrl)}</url>`),S.bugtrackerUrl&&F.push(` <url type="bugtracker">${escapeXml(S.bugtrackerUrl)}</url>`),S.vcsBrowserUrl&&F.push(` <url type="vcs-browser">${escapeXml(S.vcsBrowserUrl)}</url>`),S.donationUrl&&F.push(` <url type="donation">${escapeXml(S.donationUrl)}</url>`),S.translateUrl&&F.push(` <url type="translate">${escapeXml(S.translateUrl)}</url>`);let I=normaliseContentRating(S.contentRating);if(I.attributes&&Object.keys(I.attributes).length>0){F.push(` <content_rating type="${escapeXml(I.type)}">`);for(let[n,a]of Object.entries(I.attributes))F.push(` <content_attribute id="${escapeXml(n)}">${escapeXml(a)}</content_attribute>`);F.push(` </content_rating>`)}else F.push(` <content_rating type="${escapeXml(I.type)}" />`);if(S.releases?.length){F.push(` <releases>`);for(let n of S.releases)if(n.description===void 0)F.push(` <release version="${escapeXml(n.version)}" date="${escapeXml(n.date)}" />`);else{F.push(` <release version="${escapeXml(n.version)}" date="${escapeXml(n.date)}">`),F.push(` <description>`);for(let a of renderDescriptionBlocks(n.description,` `))F.push(a);F.push(` </description>`),F.push(` </release>`)}F.push(` </releases>`)}if(S.categories?.length){F.push(` <categories>`);for(let n of S.categories)F.push(` <category>${escapeXml(n)}</category>`);F.push(` </categories>`)}if(S.keywords?.length){F.push(` <keywords>`);for(let n of S.keywords)F.push(` <keyword>${escapeXml(n)}</keyword>`);F.push(` </keywords>`)}if(a===`desktop-application`&&S.branding&&(F.push(` <branding>`),F.push(` <color type="primary" scheme_preference="light">${escapeXml(S.branding.accentLight)}</color>`),F.push(` <color type="primary" scheme_preference="dark">${escapeXml(S.branding.accentDark)}</color>`),F.push(` </branding>`)),S.kudos?.length){F.push(` <kudos>`);for(let n of S.kudos)F.push(` <kudo>${escapeXml(n)}</kudo>`);F.push(` </kudos>`)}let H=S.provides?.binaries??[n.command],W=S.provides?.mimetypes??[],K=S.provides?.dbus??[];if(H.length||W.length||K.length){F.push(` <provides>`);for(let n of H)F.push(` <binary>${escapeXml(n)}</binary>`);for(let n of W)F.push(` <mediatype>${escapeXml(n)}</mediatype>`);for(let n of K)F.push(` <dbus type="${escapeXml(n.type)}">${escapeXml(n.id)}</dbus>`);F.push(` </provides>`)}if(S.supports?.controls?.length||S.supports?.internet){F.push(` <supports>`);for(let n of S.supports.controls??[])F.push(` <control>${escapeXml(n)}</control>`);S.supports.internet&&F.push(` <internet>${escapeXml(S.supports.internet)}</internet>`),F.push(` </supports>`)}if(S.requires?.displayLengthMin||S.requires?.controls?.length||S.requires?.internet){F.push(` <requires>`),S.requires.displayLengthMin&&F.push(` <display_length compare="ge">${S.requires.displayLengthMin}</display_length>`);for(let n of S.requires.controls??[])F.push(` <control>${escapeXml(n)}</control>`);S.requires.internet&&F.push(` <internet>${escapeXml(S.requires.internet)}</internet>`),F.push(` </requires>`)}if(S.recommends?.displayLengthMin||S.recommends?.controls?.length){F.push(` <recommends>`),S.recommends.displayLengthMin&&F.push(` <display_length compare="ge">${S.recommends.displayLengthMin}</display_length>`);for(let n of S.recommends.controls??[])F.push(` <control>${escapeXml(n)}</control>`);F.push(` </recommends>`)}return F.push(`</component>`),F.join(`
|
|
854
|
+
`);for(let a of n)he.error(` ✗ ${a.name}`);let a=buildInstallCommand(detectPackageManager$2(),n);return a&&he.error(`\nInstall with:\n ${a}`),process.exit(1)}}let C=readCliVersion();if(S!==`gjs`){await runShowcaseOnRuntime(a,S,C);return}let N=C?`${a.packageName}@${C}`:a.packageName;he.log(`Running showcase: ${a.name} ${runningAs(C)}(via gjsify dlx ${N})\n`);try{let{runCli:n}=await Promise.resolve().then(()=>(FI(),PI));await n([`dlx`,N])}catch(n){he.error(n.message),process.exit(1)}}}});function resolveTemplatesRoot(){let n=_s(fileURLToPath(import.meta.url)),a=[ms(n,`..`,`dist-templates`),ms(n,`dist-templates`)];try{let n=createRequire(import.meta.url).resolve(`@gjsify/create-app/package.json`);a.splice(1,0,ms(_s(n),`dist-templates`))}catch{}return a.find(n=>existsSync(n))}function discoverTemplates(){let n=resolveTemplatesRoot();if(!n)return[];let a=[];for(let S of readdirSync(n)){let C=ms(n,S),N=ms(C,`package.json`);if(!statSync(C).isDirectory()||!existsSync(N))continue;let F=KN[S]??``;try{let n=JSON.parse(readFileSync(N,`utf-8`));typeof n.description==`string`&&n.description.trim()&&(F=n.description)}catch{}a.push({name:S,description:F,path:C})}return a.sort((n,a)=>n.name.localeCompare(a.name)),a}function findTemplate(n){return discoverTemplates().find(a=>a.name===n)}var KN,qN=__esmMin(()=>{ul(),ts(),Ts(),nn(),KN={"gtk-minimal":`Minimal GTK4 app — Gtk.Window + Gtk.Label (no Adwaita, no Blueprint).`,cli:`Command-line tool using yargs (Node.js + GJS).`,"adw-canvas2d":`Adwaita app with HTML Canvas 2D rendering (Blueprint UI).`,"adw-webgl":`Adwaita app with WebGL + three.js (Blueprint UI).`,"adw-game":`Adwaita game shell using Excalibur.js, WebGL → Canvas2D fallback.`,"web-server-hono":`HTTP server using Hono (Web-standard fetch-style API).`,"web-server-express":`HTTP server using Express (familiar Node.js stack).`}});function sanitizeProjectName(n){let a=n.trim();if(!a)throw Error(`Project name cannot be empty.`);let S=a.toLowerCase().replace(/[^a-z0-9._-]+/g,`-`).replace(/^[._-]+/,``).replace(/[._-]+$/,``);if(!S)throw Error(`"${n}" is not a valid npm package name.`);return S}function isDirEmpty(n){return existsSync(n)?readdirSync(n).length===0:!0}async function createProject(n){let a=sanitizeProjectName(n.projectName),{template:S,force:C=!1,install:N=!1}=n,F=findTemplate(S);if(!F){let n=discoverTemplates().map(n=>n.name).join(`, `);throw Error(`Unknown template "${S}". Available templates: ${n||`(none — run "yarn build" first)`}`)}let I=ds(process.cwd(),a);if(existsSync(I)&&!isDirEmpty(I)&&!C)return he.error(`Error: Directory "${a}" exists and is not empty. Use --force to scaffold into it anyway.`),process.exit(1);he.log(`Creating new Gjsify project in ${I} (template: ${F.name})...`),mkdirSync(I,{recursive:!0}),cpSync(F.path,I,{recursive:!0}),substituteProjectName(I,a),N&&(he.log(`Running npm install...`),spawnSync(`npm`,[`install`,`--no-audit`,`--no-fund`],{cwd:I,stdio:`inherit`}).status!==0&&he.warn(`npm install failed; re-run it manually in the project directory.`)),printNextSteps(a,F,N)}function substituteProjectName(n,a){let S=new Set([`node_modules`,`dist`,`lib`]),C=[n];for(;C.length>0;){let n=C.pop();for(let N of readdirSync(n,{withFileTypes:!0})){let F=ms(n,N.name);if(N.isDirectory()){S.has(N.name)||C.push(F);continue}if(!N.isFile())continue;let I=N.name.lastIndexOf(`.`),H=I>=0?N.name.slice(I):``;if(!YN.has(H))continue;let W=readFileSync(F,`utf-8`);W.includes(JN)&&writeFileSync(F,W.replaceAll(JN,a))}}}function printNextSteps(n,a,S){he.log(``),he.log(`Project created from template "${a.name}".`),he.log(``),he.log(`Next steps:`),he.log(` cd ${n}`),S||he.log(` npm install`),he.log(` npm run dev`),he.log(``)}var JN,YN,XN=__esmMin(()=>{ge(),Gm(),ul(),Ts(),qN(),JN=`new-gjsify-app`,YN=new Set([`.json`,`.md`,`.ts`,`.tsx`,`.js`,`.mjs`,`.cjs`,`.blp`,`.html`,`.css`,`.scss`,`.xml`,`.ui`,`.txt`])});function render(n,a,S){S||qt.write(`\x1b[${n.length}A`);for(let S=0;S<n.length;S++){let C=n[S],N=S===a?`${ZN.cyan}❯${ZN.reset}`:` `,F=S===a?`${ZN.bold}${ZN.green}${C.name}${ZN.reset}`:C.name;qt.write(`\x1b[2K\r ${N} ${F} ${ZN.dim}${C.description}${ZN.reset}\n`)}}function promptTemplate(n){return n.length===0?Promise.reject(Error(`No templates available.`)):new Promise((a,S)=>{let C=0;qt.write(`${ZN.bold}Select a template${ZN.reset} ${ZN.dim}(↑/↓ to navigate, Enter to confirm, Ctrl+C to cancel)${ZN.reset}\n`),render(n,C,!0),emitKeypressEvents(Jt),Jt.isTTY&&Jt.setRawMode(!0),Jt.resume();let cleanup=()=>{Jt.removeListener(`keypress`,onKeypress),Jt.isTTY&&Jt.setRawMode(!1),Jt.pause()},onKeypress=(N,F)=>{if(F){if(F.ctrl&&F.name===`c`){cleanup(),qt.write(`
|
|
855
|
+
`),S(Error(`Cancelled by user`));return}F.name===`up`||F.name===`k`?(C=(C-1+n.length)%n.length,render(n,C,!1)):F.name===`down`||F.name===`j`?(C=(C+1)%n.length,render(n,C,!1)):(F.name===`return`||F.name===`enter`)&&(cleanup(),a(n[C]))}};Jt.on(`keypress`,onKeypress)})}var ZN,QN=__esmMin(()=>{Yt(),Qc(),ZN={reset:`\x1B[0m`,bold:`\x1B[1m`,dim:`\x1B[2m`,cyan:`\x1B[36m`,green:`\x1B[32m`}}),$N,eP=__esmMin(()=>{ge(),XN(),QN(),$N={command:`create [project-name]`,description:`Scaffold a new Gjsify project in a new directory.`,builder:n=>{let a=discoverTemplates().map(n=>n.name);return n.positional(`project-name`,{describe:`Name of the project directory to create`,type:`string`,default:`my-gjs-app`}).option(`template`,{alias:`t`,describe:`Template to scaffold from`,type:`string`,choices:a.length>0?a:void 0}).option(`force`,{alias:`f`,describe:`Scaffold into a non-empty directory`,type:`boolean`,default:!1}).option(`install`,{describe:`Run npm install after scaffolding`,type:`boolean`,default:!1})},handler:async n=>{let a=n.template;if(!a){let n=discoverTemplates();if(!process.stdin.isTTY){let a=n.map(n=>n.name).join(`, `);return he.error(`Error: --template is required in non-interactive mode. Available templates: ${a||`(none)`}`),process.exit(1)}a=(await promptTemplate(n)).name}await createProject({projectName:n[`project-name`],template:a,force:n.force,install:n.install})}}});function defaultTargetFor(n){let a=vs(n,ys(n));return ds(_s(n),a)}var tP,nP,rP=__esmMin(()=>{ge(),Gm(),Hc(),Ts(),pc(),tP=promisify(execFile),nP={command:`gresource <xml>`,description:"Compile a GResource XML descriptor into a binary .gresource bundle (wraps `glib-compile-resources`).",builder:n=>n.positional(`xml`,{description:`Path to the .gresource.xml descriptor`,type:`string`,normalize:!0,demandOption:!0}).option(`sourcedir`,{description:`Directory containing the resource files referenced by <xml>`,type:`string`,normalize:!0}).option(`target`,{alias:`t`,description:`Output .gresource file (default: <xml-without-.xml> next to <xml>)`,type:`string`,normalize:!0}).option(`verbose`,{description:`Print the underlying glib-compile-resources invocation`,type:`boolean`,default:!1}),handler:async n=>{let a=ds(n.xml),S=n.target?ds(n.target):defaultTargetFor(a),C=[`--sourcedir=${n.sourcedir?ds(n.sourcedir):_s(a)}`,`--target=${S}`,a];n.verbose&&he.log(`[gjsify gresource] glib-compile-resources ${C.join(` `)}`),await mkdir$1(_s(S),{recursive:!0});try{let{stdout:a,stderr:N}=await tP(`glib-compile-resources`,C);a&&process.stdout.write(a),N&&process.stderr.write(N),n.verbose&&he.log(`[gjsify gresource] wrote ${S}`)}catch(n){let a=n;a?.code===`ENOENT`?he.error(`[gjsify gresource] glib-compile-resources not found. Install it via your distro (package: glib2-devel / libglib2.0-dev).`):(a?.stderr&&process.stderr.write(a.stderr),he.error(`[gjsify gresource] glib-compile-resources failed${a?.code===void 0?``:` (exit ${a.code})`}`)),process.exitCode=typeof a?.code==`number`?a.code:1}}}});async function listLanguages(n){return(await readdir$1(n)).filter(n=>n.endsWith(`.po`)&&!n.startsWith(`.`)).map(n=>n.slice(0,-3)).sort()}function stripXmlComments(n){return n.replace(/<!--[\s\S]*?-->/g,``)}async function ensureDir(n){await mkdir$1(n,{recursive:!0})}async function fileExists(n){try{return await stat$1(n),!0}catch{return!1}}async function compileBulkXml(n){let a=ms(n.outDir,n.filename);await ensureDir(n.outDir);let S=[`--output-file=${a}`,`--xml`,`--template=${n.template}`,`-d`,n.poDir];n.verbose&&he.log(`[gjsify gettext] msgfmt ${S.join(` `)}`),await iP(`msgfmt`,S),n.removeXmlComments&&await writeFile$1(a,stripXmlComments(await readFile$1(a,`utf-8`))),n.verbose&&he.log(`[gjsify gettext] wrote ${a}`)}async function compilePerLanguage(n){let a=await listLanguages(n.poDir);if(a.length===0){he.warn(`[gjsify gettext] no .po files found in ${n.poDir}`);return}for(let S of a){let a=ms(n.poDir,`${S}.po`),C=n.format===`mo`?ms(n.outDir,S,`LC_MESSAGES`):ms(n.outDir,S);await ensureDir(C);let N=[`--output-file=${ms(C,n.filename)}`];n.format!==`mo`&&N.push(`--${n.format}`),N.push(a),n.verbose&&he.log(`[gjsify gettext] msgfmt ${N.join(` `)}`),await iP(`msgfmt`,N)}n.verbose&&he.log(`[gjsify gettext] compiled ${a.length} language(s) into ${n.outDir}`)}function defaultFilename(n,a,S){switch(a){case`mo`:return`${n}.mo`;case`json`:return`${n}.json`;case`desktop`:return`${n}.desktop`;case`xml`:if(S){let n=S.replace(/\.in$/,``),a=n.lastIndexOf(`/`);return a>=0?n.slice(a+1):n}return`${n}.xml`}}var iP,aP,oP=__esmMin(()=>{ge(),Gm(),Hc(),Ts(),pc(),iP=promisify(execFile),aP={command:`gettext <poDir> <outDir>`,description:`Compile gettext .po files to .mo (per-language locale tree) or substitute a metainfo template via msgfmt --xml.`,builder:n=>n.positional(`poDir`,{description:`Directory containing <lang>.po files`,type:`string`,normalize:!0,demandOption:!0}).positional(`outDir`,{description:`Output directory (locale tree for --format=mo, plain dir for xml/desktop/json)`,type:`string`,normalize:!0,demandOption:!0}).option(`domain`,{description:"Text domain / application ID (e.g. `org.pixelrpg.maker`)",type:`string`,normalize:!0,demandOption:!0}).option(`format`,{description:`Output format`,type:`string`,choices:[`mo`,`xml`,`desktop`,`json`],default:`mo`}).option(`metainfo`,{description:"For --format=xml: path to the template (`.metainfo.xml.in`) used as msgfmt --template",type:`string`,normalize:!0}).option(`filename`,{description:`Override the output filename (defaults to <domain>.<ext>)`,type:`string`,normalize:!0}).option(`remove-xml-comments`,{description:`For --format=xml: strip XML comments from the compiled output`,type:`boolean`,default:!0}).option(`verbose`,{description:`Print each msgfmt invocation`,type:`boolean`,default:!1}),handler:async n=>{let a=ds(n.poDir),S=ds(n.outDir),C=n.domain,N=n.format??`mo`,F=n.metainfo?ds(n.metainfo):void 0,I=n.filename??defaultFilename(C,N,F),H=!!n.verbose,W=!!n[`remove-xml-comments`];if(!await fileExists(a)){he.error(`[gjsify gettext] PO directory does not exist: ${a}`),process.exitCode=1;return}try{N===`xml`&&F?await compileBulkXml({poDir:a,outDir:S,domain:C,template:F,filename:I,removeXmlComments:W,verbose:H}):(N===`xml`&&he.warn(`[gjsify gettext] --format=xml without --metainfo: falling back to per-language XML files`),await compilePerLanguage({poDir:a,outDir:S,domain:C,format:N,filename:I,verbose:H}))}catch(n){let a=n;a?.code===`ENOENT`?he.error(`[gjsify gettext] msgfmt not found. Install it via your distro (package: gettext).`):(a?.stderr&&process.stderr.write(a.stderr),he.error(`[gjsify gettext] msgfmt failed${a?.code===void 0?``:` (exit ${a.code})`}`)),process.exitCode=typeof a?.code==`number`?a.code:1}}}}),sP,cP,lP=__esmMin(()=>{ge(),Gm(),Hc(),Ts(),pc(),sP=promisify(execFile),cP={command:`gsettings <schemadir>`,description:"Compile GSettings schema XML files into a binary gschemas.compiled (wraps `glib-compile-schemas`).",builder:n=>n.positional(`schemadir`,{description:`Directory containing *.gschema.xml descriptors`,type:`string`,normalize:!0,demandOption:!0}).option(`targetdir`,{alias:`t`,description:`Directory to write gschemas.compiled (default: <schemadir>)`,type:`string`,normalize:!0}).option(`strict`,{description:`Abort on any schema warning (passes --strict to glib-compile-schemas)`,type:`boolean`,default:!0}).option(`verbose`,{description:`Print the underlying glib-compile-schemas invocation`,type:`boolean`,default:!1}),handler:async n=>{let a=ds(n.schemadir),S=n.targetdir?ds(n.targetdir):a,C=[];n.strict&&C.push(`--strict`),C.push(`--targetdir=${S}`),C.push(a),n.verbose&&he.log(`[gjsify gsettings] glib-compile-schemas ${C.join(` `)}`),await mkdir$1(S,{recursive:!0});try{let{stdout:a,stderr:N}=await sP(`glib-compile-schemas`,C);a&&process.stdout.write(a),N&&process.stderr.write(N),n.verbose&&he.log(`[gjsify gsettings] wrote ${S}/gschemas.compiled`)}catch(n){let a=n;a?.code===`ENOENT`?he.error(`[gjsify gsettings] glib-compile-schemas not found. Install it via your distro (package: glib2-devel / libglib2.0-dev).`):(a?.stderr&&process.stderr.write(a.stderr),he.error(`[gjsify gsettings] glib-compile-schemas failed${a?.code===void 0?``:` (exit ${a.code})`}`)),process.exitCode=typeof a?.code==`number`?a.code:1}}}});function readPackageJson(n){let a=ds(n,`package.json`),S;try{S=readFileSync(a,`utf-8`)}catch{throw Error(`gjsify flatpak: no package.json found at ${a}`)}try{return JSON.parse(S)}catch(n){throw Error(`gjsify flatpak: package.json at ${a} is not valid JSON: ${n.message}`)}}function looksLikeAppId(n){return typeof n==`string`&&/^[A-Za-z][A-Za-z0-9_-]*(\.[A-Za-z][A-Za-z0-9_-]*){2,}$/.test(n)}function resolveRuntime(n,a){let S=a.runtime??n?.runtime??`gnome`;if(S!==`gnome`&&S!==`freedesktop`)throw Error(`gjsify flatpak: unknown runtime "${S}" (expected "gnome" or "freedesktop")`);let C=a.runtimeVersion??n?.runtimeVersion??(S===`gnome`?`50`:`24.08`);return S===`gnome`?{runtime:S,runtimeId:`org.gnome.Platform`,sdk:`org.gnome.Sdk`,runtimeVersion:C}:{runtime:S,runtimeId:`org.freedesktop.Platform`,sdk:`org.freedesktop.Sdk`,runtimeVersion:C}}function defaultCiContainer(n,a){return`ghcr.io/flathub-infra/flatpak-github-actions:${`${n}-${a}`}`}var uP,dP,fP=__esmMin(()=>{ul(),Ts(),uP=[`--device=dri`,`--share=ipc`,`--socket=fallback-x11`,`--socket=wayland`],dP=[]});function loadDesktopTemplate(){return readFileSync(new URL(`../../templates/flatpak/desktop.tmpl`,import.meta.url),`utf-8`)}function loadFlathubAppTemplate(){return readFileSync(new URL(`../../templates/flatpak/flathub-app.json.tmpl`,import.meta.url),`utf-8`)}function loadFlathubCliTemplate(){return readFileSync(new URL(`../../templates/flatpak/flathub-cli.json.tmpl`,import.meta.url),`utf-8`)}function validateScaffoldInputs(n){let a=n.flatpak,S=[];return(!a.developer?.id||!a.developer?.name)&&S.push({field:`gjsify.flatpak.developer`,hint:'Set `gjsify.flatpak.developer = { "id": "io.github.you", "name": "Your Name" }` in package.json. The id is reverse-DNS.'}),a.summary||S.push({field:`gjsify.flatpak.summary`,hint:`One-line app summary, ≤80 chars, no trailing period. Example: "Learn 6502 assembly language".`}),a.description||S.push({field:`gjsify.flatpak.description`,hint:`Plain text (split on blank lines) or DescriptionBlock[] for rich content with bullet lists + translator hints.`}),a.license?.project||S.push({field:`gjsify.flatpak.license.project`,hint:`SPDX identifier of the project license, e.g. "MIT", "GPL-3.0-or-later".`}),a.homepageUrl||S.push({field:`gjsify.flatpak.homepageUrl`,hint:`Required by Flathub. Example: "https://github.com/you/your-repo".`}),S}function renderMetainfoApp(n){return renderMetainfo(n,`desktop-application`)}function renderMetainfoCli(n){return renderMetainfo(n,`console-application`)}function renderDesktop(n){let a=n.flatpak,S=(a.categories??[`Utility`]).join(`;`)+`;`,C=a.keywords?.length?`Keywords=${a.keywords.join(`;`)};\n`:``,N=a.provides?.mimetypes??[],F=N.length?`MimeType=${N.join(`;`)};\n`:``;return substitute(loadDesktopTemplate(),{NAME:n.name,SUMMARY:a.summary??n.name,COMMAND:n.command,APP_ID:n.appId,CATEGORIES_LINE:S,KEYWORDS_LINE:C,MIMETYPES_LINE:F})}function renderFlathubJson(n){return n===`cli`?loadFlathubCliTemplate():loadFlathubAppTemplate()}function renderMetainfo(n,a){let S=n.flatpak,C=new Date().getFullYear(),N=S.developer?.name??``,F=[];F.push(`<?xml version="1.0" encoding="UTF-8"?>`),F.push(`<!-- Copyright ${C} ${escapeXml(N)} -->`),F.push(`<component type="${a}">`),F.push(` <id>${escapeXml(n.appId)}</id>`),F.push(` <metadata_license>${escapeXml(S.license?.metadata??`CC0-1.0`)}</metadata_license>`),F.push(` <project_license>${escapeXml(S.license?.project??``)}</project_license>`),F.push(` <name>${escapeXml(n.name)}</name>`),pushTranslatorHint(F,S.summaryTranslatorHint,` `),F.push(` <summary>${escapeXml(S.summary??n.name)}</summary>`),S.iconRemote&&F.push(` <icon type="remote">${escapeXml(S.iconRemote)}</icon>`),F.push(` <description>`);for(let n of renderDescriptionBlocks(S.description??``,` `))F.push(n);if(F.push(` </description>`),S.developer?.id&&S.developer?.name){F.push(` <developer id="${escapeXml(S.developer.id)}">`);let n=S.developer.nameTranslatable===!0?``:` translate="no"`;F.push(` <name${n}>${escapeXml(S.developer.name)}</name>`),S.developer.email&&F.push(` <email>${escapeXml(S.developer.email)}</email>`),F.push(` </developer>`)}a===`desktop-application`&&F.push(` <launchable type="desktop-id">${escapeXml(n.appId)}.desktop</launchable>`),S.screenshots?.length&&(F.push(` <screenshots>`),S.screenshots.forEach((n,a)=>{let S=n.type??(a===0?`default`:void 0),C=S?` type="${escapeXml(S)}"`:``,N=n.environment?` environment="${escapeXml(n.environment)}"`:``;F.push(` <screenshot${C}${N}>`),F.push(` <image>${escapeXml(n.url)}</image>`),n.caption&&(pushTranslatorHint(F,n.captionTranslatorHint,` `),F.push(` <caption>${escapeXml(n.caption)}</caption>`)),F.push(` </screenshot>`)}),F.push(` </screenshots>`)),S.homepageUrl&&F.push(` <url type="homepage">${escapeXml(S.homepageUrl)}</url>`),S.bugtrackerUrl&&F.push(` <url type="bugtracker">${escapeXml(S.bugtrackerUrl)}</url>`),S.vcsBrowserUrl&&F.push(` <url type="vcs-browser">${escapeXml(S.vcsBrowserUrl)}</url>`),S.donationUrl&&F.push(` <url type="donation">${escapeXml(S.donationUrl)}</url>`),S.translateUrl&&F.push(` <url type="translate">${escapeXml(S.translateUrl)}</url>`);let I=normaliseContentRating(S.contentRating);if(I.attributes&&Object.keys(I.attributes).length>0){F.push(` <content_rating type="${escapeXml(I.type)}">`);for(let[n,a]of Object.entries(I.attributes))F.push(` <content_attribute id="${escapeXml(n)}">${escapeXml(a)}</content_attribute>`);F.push(` </content_rating>`)}else F.push(` <content_rating type="${escapeXml(I.type)}" />`);if(S.releases?.length){F.push(` <releases>`);for(let n of S.releases)if(n.description===void 0)F.push(` <release version="${escapeXml(n.version)}" date="${escapeXml(n.date)}" />`);else{F.push(` <release version="${escapeXml(n.version)}" date="${escapeXml(n.date)}">`),F.push(` <description>`);for(let a of renderDescriptionBlocks(n.description,` `))F.push(a);F.push(` </description>`),F.push(` </release>`)}F.push(` </releases>`)}if(S.categories?.length){F.push(` <categories>`);for(let n of S.categories)F.push(` <category>${escapeXml(n)}</category>`);F.push(` </categories>`)}if(S.keywords?.length){F.push(` <keywords>`);for(let n of S.keywords)F.push(` <keyword>${escapeXml(n)}</keyword>`);F.push(` </keywords>`)}if(a===`desktop-application`&&S.branding&&(F.push(` <branding>`),F.push(` <color type="primary" scheme_preference="light">${escapeXml(S.branding.accentLight)}</color>`),F.push(` <color type="primary" scheme_preference="dark">${escapeXml(S.branding.accentDark)}</color>`),F.push(` </branding>`)),S.kudos?.length){F.push(` <kudos>`);for(let n of S.kudos)F.push(` <kudo>${escapeXml(n)}</kudo>`);F.push(` </kudos>`)}let H=S.provides?.binaries??[n.command],W=S.provides?.mimetypes??[],K=S.provides?.dbus??[];if(H.length||W.length||K.length){F.push(` <provides>`);for(let n of H)F.push(` <binary>${escapeXml(n)}</binary>`);for(let n of W)F.push(` <mediatype>${escapeXml(n)}</mediatype>`);for(let n of K)F.push(` <dbus type="${escapeXml(n.type)}">${escapeXml(n.id)}</dbus>`);F.push(` </provides>`)}if(S.supports?.controls?.length||S.supports?.internet){F.push(` <supports>`);for(let n of S.supports.controls??[])F.push(` <control>${escapeXml(n)}</control>`);S.supports.internet&&F.push(` <internet>${escapeXml(S.supports.internet)}</internet>`),F.push(` </supports>`)}if(S.requires?.displayLengthMin||S.requires?.controls?.length||S.requires?.internet){F.push(` <requires>`),S.requires.displayLengthMin&&F.push(` <display_length compare="ge">${S.requires.displayLengthMin}</display_length>`);for(let n of S.requires.controls??[])F.push(` <control>${escapeXml(n)}</control>`);S.requires.internet&&F.push(` <internet>${escapeXml(S.requires.internet)}</internet>`),F.push(` </requires>`)}if(S.recommends?.displayLengthMin||S.recommends?.controls?.length){F.push(` <recommends>`),S.recommends.displayLengthMin&&F.push(` <display_length compare="ge">${S.recommends.displayLengthMin}</display_length>`);for(let n of S.recommends.controls??[])F.push(` <control>${escapeXml(n)}</control>`);F.push(` </recommends>`)}return F.push(`</component>`),F.join(`
|
|
856
856
|
`)+`
|
|
857
|
-
`}function renderDescriptionBlocks(n,a){let S=typeof n==`string`?stringToBlocks(n):n,C=[];for(let n of S)if(`p`in n)pushTranslatorHint(C,n.translatorHint,a),C.push(`${a}<p>${escapeXml(n.p.trim().replace(/\s+/g,` `))}</p>`);else{pushTranslatorHint(C,n.translatorHint,a),C.push(`${a}<ul>`);for(let S of n.ul)typeof S==`string`?C.push(`${a} <li>${escapeXml(S)}</li>`):(pushTranslatorHint(C,S.translatorHint,`${a} `),C.push(`${a} <li>${escapeXml(S.item)}</li>`));C.push(`${a}</ul>`)}return C}function stringToBlocks(n){return n.trim().split(/\n\n+/).map(n=>({p:n.trim().replace(/\s+/g,` `)}))}function pushTranslatorHint(n,a,S){a&&n.push(`${S}<!-- TRANSLATORS: ${a} -->`)}function normaliseContentRating(n){return n===void 0?{type:`oars-1.1`}:typeof n==`string`?{type:n}:{type:n.type??`oars-1.1`,attributes:n.attributes}}function substitute(n,a){let S=n;for(let[n,C]of Object.entries(a))S=S.split(`{{${n}}}`).join(C);return S}function escapeXml(n){return n.replace(/&/g,`&`).replace(/</g,`<`).replace(/>/g,`>`).replace(/"/g,`"`)}var
|
|
857
|
+
`}function renderDescriptionBlocks(n,a){let S=typeof n==`string`?stringToBlocks(n):n,C=[];for(let n of S)if(`p`in n)pushTranslatorHint(C,n.translatorHint,a),C.push(`${a}<p>${escapeXml(n.p.trim().replace(/\s+/g,` `))}</p>`);else{pushTranslatorHint(C,n.translatorHint,a),C.push(`${a}<ul>`);for(let S of n.ul)typeof S==`string`?C.push(`${a} <li>${escapeXml(S)}</li>`):(pushTranslatorHint(C,S.translatorHint,`${a} `),C.push(`${a} <li>${escapeXml(S.item)}</li>`));C.push(`${a}</ul>`)}return C}function stringToBlocks(n){return n.trim().split(/\n\n+/).map(n=>({p:n.trim().replace(/\s+/g,` `)}))}function pushTranslatorHint(n,a,S){a&&n.push(`${S}<!-- TRANSLATORS: ${a} -->`)}function normaliseContentRating(n){return n===void 0?{type:`oars-1.1`}:typeof n==`string`?{type:n}:{type:n.type??`oars-1.1`,attributes:n.attributes}}function substitute(n,a){let S=n;for(let[n,C]of Object.entries(a))S=S.split(`{{${n}}}`).join(C);return S}function escapeXml(n){return n.replace(/&/g,`&`).replace(/</g,`<`).replace(/>/g,`>`).replace(/"/g,`"`)}var pP=__esmMin(()=>{ul()});function oxcBindingSuffix(){let n=process.platform,a=process.arch,S;if(n===`linux`)S=`linux`;else if(n===`darwin`)S=`darwin`;else if(n===`win32`)S=`win32`;else throw Error(`[gjsify oxc] Unsupported platform: ${n}`);let C;if(a===`x64`)C=`x64`;else if(a===`arm64`)C=`arm64`;else throw Error(`[gjsify oxc] Unsupported arch on ${S}: ${a}`);if(S===`linux`){let n=`gnu`;try{readdirSync(`/lib`).some(n=>n.startsWith(`ld-musl-`))&&(n=`musl`)}catch{}return`${S}-${C}-${n}`}return S===`win32`?`${S}-${C}-msvc`:`${S}-${C}`}function bindingPackageName(n){return`${n===`oxlint`?`@oxlint`:`@oxfmt`}/binding-${oxcBindingSuffix()}`}function probeNodeModules(n,a,S){let C=ms(n,`node_modules`,a,S);return existsSync(C)?C:null}function findOxcLauncher(n,a=process.cwd()){let S=ms(`bin`,n),C=probeNodeModules(a,n,S);if(C)return C;let N=findWorkspaceRoot(a);if(N&&N!==a){let a=probeNodeModules(N,n,S);if(a)return a}let F=ds(a,`..`);for(let a=0;a<6;a++){let a=probeNodeModules(F,n,S);if(a)return a;let C=ds(F,`..`);if(C===F)break;F=C}throw new OxcNotFoundError(n,a)}function findOxlintConfig(n=process.cwd()){return findConfigFile(n,[`.oxlintrc.json`])}function findOxfmtConfig(n=process.cwd()){return findConfigFile(n,[`.oxfmtrc`,`.oxfmtrc.json`])}function findConfigFile(n,a){let S=n;for(let n=0;n<12;n++){for(let n of a){let a=ms(S,n);if(existsSync(a))return a}let n=ds(S,`..`);if(n===S)break;S=n}return null}async function tryLoadNativeOxfmt(){return mP||(mP=(async()=>{if(!isGjs())return null;try{let n=`@gjsify/oxfmt-native`,a=await import(pathToFileURL(resolveNpmPackage(n,{bundleUrl:import.meta.url})??createRequire(import.meta.url).resolve(n)).href);return a.hasNativeOxfmt()?a:null}catch{return null}})(),mP)}async function shouldUseNativeOxfmt(){let n=(globalThis.process?.env??{}).GJSIFY_OXFMT;if(n===`npm`)return!1;if(n===`native`){if(!await tryLoadNativeOxfmt())throw Error(`GJSIFY_OXFMT=native but @gjsify/oxfmt-native is not loadable (no prebuild for this architecture, or not running under GJS).`);return!0}return isGjs()?await tryLoadNativeOxfmt()!==null:!1}async function runOxc(n,a,S={}){if(n===`oxfmt`&&await shouldUseNativeOxfmt()){let n=await tryLoadNativeOxfmt();if(!n)throw Error(`@gjsify/oxfmt-native not loadable`);return S.verbose&&he.log(`[gjsify oxc] @gjsify/oxfmt-native (in-process) ${a.join(` `)}`),n.runOxfmt(a)}return spawnOxcLauncher(n,a,S)}function spawnOxcLauncher(n,a,S={}){let C=S.cwd??process.cwd(),N=findOxcLauncher(n,C),F=nodeBinary();return S.verbose&&he.log(`[gjsify oxc] ${F} ${N} ${a.join(` `)}`),spawnToCompletion(F,[N,...a],{completion:`return`,cwd:C,notFound:()=>new OxcNotFoundError(n,C)}).then(({code:a,signal:S})=>S===null?a??0:(he.error(`[gjsify oxc] ${n} terminated by signal ${S}`),1))}function runOxlint(n,a={}){return runOxc(`oxlint`,n,a)}function runOxfmt(n,a={}){return runOxc(`oxfmt`,n,a)}function loadOxlintTemplate(){return readFileSync(new URL(`../templates/oxlintrc.json.tmpl`,import.meta.url),`utf-8`)}function loadOxfmtTemplate(){return readFileSync(new URL(`../templates/oxfmtrc.tmpl`,import.meta.url),`utf-8`)}function printOxcNotFound(n){he.error(n.message)}function setOxcExitCode(n){process.exitCode=n,n!==0&&gjsExit(n)}function hasOxcDevDep(n=process.cwd(),a=`oxfmt`){let S=ms(n,`package.json`);if(!existsSync(S))return!1;try{let n=JSON.parse(readFileSync(S,`utf-8`));return!!(n?.devDependencies?.[a]||n?.dependencies?.[a])}catch{return!1}}var OxcNotFoundError,mP,hP=__esmMin(()=>{ge(),ul(),Ts(),ts(),nn(),F_(),I_(),gM(),jM(),bm(),OxcNotFoundError=class extends Error{tool;cwd;constructor(n,a){let S=(()=>{try{return bindingPackageName(n)}catch{return`@${n===`oxlint`?`oxlint`:`oxfmt`}/binding-<platform>`}})();super(`[gjsify oxc] ${n} not found.\n Expected: ${n}/bin/${n} in node_modules of ${a} or any workspace root above it.\n Install it via: gjsify install -D ${n}\n (this adds ${n} to devDependencies; the matching ${S} napi binding lands automatically as an optionalDependency.)`),this.tool=n,this.cwd=a,this.name=`OxcNotFoundError`}},mP=null});function writeIfFresh(n,a,S,C){return existsSync(n)&&!S?(he.log(`[gjsify flatpak init] skipped ${C}: ${n} (exists; --force to overwrite)`),null):(mkdirSync(_s(n),{recursive:!0}),writeFileSync(n,a,`utf-8`),he.log(`[gjsify flatpak init] wrote ${C}: ${n}`),n)}function friendlyName(n,a){if(n.startsWith(`@`))return n.slice(n.indexOf(`/`)+1);if(n===a){let n=a.split(`.`);return n[n.length-1]??a}return n}function mergeArrays(n,a){if(!(!n?.length&&!a?.length))return[...n??[],...a??[]]}function deriveAppendPath(n){let a=[];for(let S of n){let n=/^org\.freedesktop\.Sdk\.Extension\.([A-Za-z0-9-]+)$/.exec(S);n&&a.push(`/usr/lib/sdk/${n[1]}/bin`)}return a.push(`/app/bin`),a}function deriveModuleName(n){let a=n.split(`.`);return a[a.length-1]||n}var gP,_P=__esmMin(()=>{ge(),ul(),Ts(),fP(),pP(),aM(),hP(),gP={command:`init`,description:"Generate Flatpak manifest + MetaInfo XML + .desktop + flathub.json from `gjsify.flatpak` config.",builder:n=>n.option(`app-id`,{description:"Reverse-DNS app id (default: `gjsify.flatpak.appId` or package.json#name)",type:`string`}).option(`runtime`,{description:`Runtime family`,choices:[`gnome`,`freedesktop`]}).option(`runtime-version`,{description:`Runtime version (default: gnome -> 50, freedesktop -> 24.08)`,type:`string`}).option(`kind`,{description:`App kind: "app" (default, desktop) or "cli" (console-application MetaInfo, no .desktop)`,choices:[`app`,`cli`]}).option(`cli-only`,{description:"(Deprecated) Alias for `--kind cli`. Use --kind instead.",type:`boolean`,default:!1}).option(`manifest`,{description:"Output path for the manifest. Default: `<app-id>.json` in cwd.",type:`string`,normalize:!0}).option(`metainfo`,{description:"Output path for the MetaInfo XML. Default: `data/<app-id>.metainfo.xml.in` in cwd.",type:`string`,normalize:!0}).option(`desktop`,{description:"Output path for the .desktop entry (app kind only). Default: `data/<app-id>.desktop.in`.",type:`string`,normalize:!0}).option(`flathub-json`,{description:"Output path for the flathub.json policy stub. Default: `flathub.json` in cwd.",type:`string`,normalize:!0}).option(`command`,{description:`Binary name in /app/bin (default: app id)`,type:`string`}).option(`sdk-extension`,{description:`Extra SDK extension (repeatable)`,type:`string`,array:!0}).option(`finish-arg`,{description:`Extra finish-arg (repeatable). Override defaults entirely with multiple --finish-arg.`,type:`string`,array:!0}).option(`force`,{description:`Overwrite existing output files (manifest, metainfo, desktop, flathub.json)`,type:`boolean`,default:!1}).option(`verbose`,{description:`Print the resolved manifest fields before writing`,type:`boolean`,default:!1}).option(`format`,{description:"Run `oxfmt --write` on the generated JS/TS files when `oxfmt` is detected in the project. Default: true. Pass --no-format to skip. Note: oxfmt formats JS/TS only — the JSON/XML/.desktop manifests generated here are not reformatted (CSS/JSON formatting was dropped in the oxc migration).",type:`boolean`,default:!0}),handler:async n=>{let a=(await new Config().forBuild({}).catch(()=>({}))).flatpak??{},S=process.cwd(),C=readPackageJson(S),N=n.appId??a.appId??(looksLikeAppId(C.name)?C.name:void 0);if(!N)throw Error(`gjsify flatpak init: no app id available. Pass --app-id, set gjsify.flatpak.appId in package.json, or rename the package to a reverse-DNS id like org.example.MyApp.`);let F=n.kind??a.kind??(n.cliOnly?`cli`:`app`),{runtime:I,runtimeId:H,sdk:W,runtimeVersion:K}=resolveRuntime(a,{runtime:n.runtime,runtimeVersion:n.runtimeVersion}),q=mergeArrays(a.sdkExtensions,n.sdkExtension),Y=a.appendPath??(q?.length?deriveAppendPath(q):void 0),X=n.command??a.command??N,te=n.finishArg,ne=te===void 0?a.finishArgs??(F===`cli`?dP:uP):te,re={id:N,runtime:H,"runtime-version":K,sdk:W};q?.length&&(re[`sdk-extensions`]=q),Y?.length&&(re[`build-options`]={"append-path":Y.join(`:`)}),re.command=X,re[`finish-args`]=ne;let ie=a.cleanup;ie?.length&&(re.cleanup=ie);let ae=[];a.modules?.length?ae.push(...a.modules):(a.extraModules?.length&&ae.push(...a.extraModules),ae.push({name:deriveModuleName(N),buildsystem:`meson`,sources:[{type:`dir`,path:`.`}]})),re.modules=ae;let oe=[],trackWrite=n=>{n&&oe.push(n)};trackWrite(writeIfFresh(ds(S,n.manifest??`${N}.json`),JSON.stringify(re,null,2)+`
|
|
858
858
|
`,n.force??!1,`manifest`));let Z=C.name??N,se={appId:N,name:a.name??friendlyName(Z,N),command:X,kind:F,flatpak:a},ce=validateScaffoldInputs(se);if(ce.length>0){he.warn(`[gjsify flatpak init] Manifest written, but MetaInfo / .desktop are skipped — config gaps:`);for(let n of ce)he.warn(` - ${n.field}: ${n.hint}`);he.warn(`
|
|
859
|
-
Fill these fields in package.json#gjsify.flatpak (or .gjsifyrc.*) and re-run with --force.`)}else{let C=F===`cli`?renderMetainfoCli(se):renderMetainfoApp(se);trackWrite(writeIfFresh(ds(S,n.metainfo??`data/${N}.metainfo.xml.in`),C,n.force??!1,`metainfo`)),F===`app`&&(trackWrite(writeIfFresh(ds(S,n.desktop??`data/${N}.desktop.in`),renderDesktop(se),n.force??!1,`desktop`)),a.icon||he.warn(`[gjsify flatpak init] No gjsify.flatpak.icon set. Flathub requires a scalable SVG at\n data/icons/hicolor/scalable/apps/${N}.svg`)),trackWrite(writeIfFresh(ds(S,n.flathubJson??`flathub.json`),renderFlathubJson(F),n.force??!1,`flathub.json`))}let le=oe.filter(n=>/\.(ts|tsx|mts|cts|js|jsx|mjs|cjs)$/.test(n));if(le.length>0&&n.format!==!1&&hasOxcDevDep(S))try{await runOxfmt([`--write`,...le],{cwd:S})}catch(n){if(n instanceof OxcNotFoundError)he.warn("[gjsify flatpak init] post-format skipped: oxfmt declared but binding not installed. Run `gjsify install` then re-run with --force, or pass --no-format.");else throw n}n.verbose&&(he.log(`[gjsify flatpak init] kind=${F} runtime=${H} ${K} sdk=${W}`),he.log(`[gjsify flatpak init] command=${X} finish-args=${JSON.stringify(ne)}`))}}});function findDefaultManifest(n){return scanForManifest(n)??`flatpak.json`}function scanForManifest(n){let a=[];try{a=readdirSync(n)}catch{return}for(let S of a)if(S.endsWith(`.json`)&&!(S===`package.json`||S===`tsconfig.json`||S.startsWith(`.`)))try{let a=JSON.parse(readFileSync(ds(n,S),`utf-8`));if(typeof a.id==`string`&&typeof a.runtime==`string`&&Array.isArray(a.modules))return S}catch{}}function readManifestAppId(n){let a=readFileSync(n,`utf-8`),S=JSON.parse(a);if(typeof S.id!=`string`)throw Error(`gjsify flatpak build: ${n} has no string "id" field`);return S.id}async function runFlatpakBuilder(n,a){return runProc(`flatpak-builder`,n,a,{notFoundHint:"flatpak-builder not found. Install via your distro (Fedora: `sudo dnf install flatpak-builder`)."})}async function runFlatpak(n,a){return runProc(`flatpak`,n,a,{notFoundHint:`flatpak not found. Install via your distro and add Flathub: see https://flathub.org/setup.`})}async function runTar(n,a){return runProc(`tar`,n,a,{notFoundHint:`tar not found.`})}async function runProc(n,a,S,C){S.verbose&&he.log(`[gjsify flatpak] ${n} ${a.join(` `)}`);let{code:N}=await spawnToCompletion(n,a,{completion:`exit`,notFound:()=>Error(`gjsify flatpak: ${C.notFoundHint}`)});if(N!==0)throw Error(`gjsify flatpak: ${n} exited with status ${N}`)}var
|
|
859
|
+
Fill these fields in package.json#gjsify.flatpak (or .gjsifyrc.*) and re-run with --force.`)}else{let C=F===`cli`?renderMetainfoCli(se):renderMetainfoApp(se);trackWrite(writeIfFresh(ds(S,n.metainfo??`data/${N}.metainfo.xml.in`),C,n.force??!1,`metainfo`)),F===`app`&&(trackWrite(writeIfFresh(ds(S,n.desktop??`data/${N}.desktop.in`),renderDesktop(se),n.force??!1,`desktop`)),a.icon||he.warn(`[gjsify flatpak init] No gjsify.flatpak.icon set. Flathub requires a scalable SVG at\n data/icons/hicolor/scalable/apps/${N}.svg`)),trackWrite(writeIfFresh(ds(S,n.flathubJson??`flathub.json`),renderFlathubJson(F),n.force??!1,`flathub.json`))}let le=oe.filter(n=>/\.(ts|tsx|mts|cts|js|jsx|mjs|cjs)$/.test(n));if(le.length>0&&n.format!==!1&&hasOxcDevDep(S))try{await runOxfmt([`--write`,...le],{cwd:S})}catch(n){if(n instanceof OxcNotFoundError)he.warn("[gjsify flatpak init] post-format skipped: oxfmt declared but binding not installed. Run `gjsify install` then re-run with --force, or pass --no-format.");else throw n}n.verbose&&(he.log(`[gjsify flatpak init] kind=${F} runtime=${H} ${K} sdk=${W}`),he.log(`[gjsify flatpak init] command=${X} finish-args=${JSON.stringify(ne)}`))}}});function findDefaultManifest(n){return scanForManifest(n)??`flatpak.json`}function scanForManifest(n){let a=[];try{a=readdirSync(n)}catch{return}for(let S of a)if(S.endsWith(`.json`)&&!(S===`package.json`||S===`tsconfig.json`||S.startsWith(`.`)))try{let a=JSON.parse(readFileSync(ds(n,S),`utf-8`));if(typeof a.id==`string`&&typeof a.runtime==`string`&&Array.isArray(a.modules))return S}catch{}}function readManifestAppId(n){let a=readFileSync(n,`utf-8`),S=JSON.parse(a);if(typeof S.id!=`string`)throw Error(`gjsify flatpak build: ${n} has no string "id" field`);return S.id}async function runFlatpakBuilder(n,a){return runProc(`flatpak-builder`,n,a,{notFoundHint:"flatpak-builder not found. Install via your distro (Fedora: `sudo dnf install flatpak-builder`)."})}async function runFlatpak(n,a){return runProc(`flatpak`,n,a,{notFoundHint:`flatpak not found. Install via your distro and add Flathub: see https://flathub.org/setup.`})}async function runTar(n,a){return runProc(`tar`,n,a,{notFoundHint:`tar not found.`})}async function runProc(n,a,S,C){S.verbose&&he.log(`[gjsify flatpak] ${n} ${a.join(` `)}`);let{code:N}=await spawnToCompletion(n,a,{completion:`exit`,notFound:()=>Error(`gjsify flatpak: ${C.notFoundHint}`)});if(N!==0)throw Error(`gjsify flatpak: ${n} exited with status ${N}`)}var vP,yP=__esmMin(()=>{ge(),ul(),Ts(),jM(),vP={command:`build [manifest]`,description:"Build the Flatpak via `flatpak-builder`. Wraps a typical install + export + bundle + tarball pipeline.",builder:n=>n.positional(`manifest`,{description:`Path to the Flatpak manifest (default: first *.json that looks like a manifest in cwd)`,type:`string`,normalize:!0}).option(`build-dir`,{description:`flatpak-builder working directory`,type:`string`,default:`flatpak-build`,normalize:!0}).option(`install`,{description:"After build, run `flatpak-builder --user --install` to install locally",type:`boolean`,default:!1}).option(`repo`,{description:"Export the build into the given OSTree repo (passes `--repo=<dir>` to flatpak-builder)",type:`string`,normalize:!0}).option(`bundle`,{description:"After --repo export, build a single-file bundle (`flatpak build-bundle`) at this path",type:`string`,normalize:!0}).option(`tarball`,{description:`Create a tarball of the build dir (parity with the legacy build-flatpak.sh tarball step)`,type:`string`,normalize:!0}).option(`force-clean`,{description:`Pass --force-clean to flatpak-builder (default true)`,type:`boolean`,default:!0}).option(`sandbox`,{description:`Pass --sandbox to flatpak-builder (default true)`,type:`boolean`,default:!0}).option(`delete-build-dirs`,{description:`Pass --delete-build-dirs to flatpak-builder (default true)`,type:`boolean`,default:!0}).option(`install-deps-from`,{description:"Pass --install-deps-from to flatpak-builder (e.g. `flathub`)",type:`string`}).option(`verbose`,{description:`Print the underlying flatpak-builder invocations`,type:`boolean`,default:!1}),handler:async n=>{let a=process.cwd(),S=ds(a,n.manifest??findDefaultManifest(a));if(!existsSync(S))throw Error(`gjsify flatpak build: manifest ${S} not found`);let C=ds(a,n.buildDir??`flatpak-build`),N=[];if(n.forceClean!==!1&&N.push(`--force-clean`),n.sandbox!==!1&&N.push(`--sandbox`),n.deleteBuildDirs!==!1&&N.push(`--delete-build-dirs`),n.installDepsFrom&&N.push(`--install-deps-from=${n.installDepsFrom}`),existsSync(C)&&rmSync(C,{recursive:!0,force:!0}),await runFlatpakBuilder([...N,C,S],{verbose:n.verbose}),n.install&&await runFlatpakBuilder([`--user`,`--install`,`--force-clean`,C,S],{verbose:n.verbose}),n.repo){let N=ds(a,n.repo);mkdirSync(_s(N),{recursive:!0}),await runFlatpakBuilder([`--repo=${N}`,`--force-clean`,C,S],{verbose:n.verbose})}if(n.bundle){if(!n.repo)throw Error(`gjsify flatpak build: --bundle requires --repo (the bundle is built from the OSTree repo).`);let C=ds(a,n.bundle);mkdirSync(_s(C),{recursive:!0}),await runFlatpak([`build-bundle`,ds(a,n.repo),C,readManifestAppId(S)],{verbose:n.verbose})}if(n.tarball){let S=ds(a,n.tarball);mkdirSync(_s(S),{recursive:!0}),await runTar([`-czf`,S,`-C`,C,`.`],{verbose:n.verbose})}return he.log(`[gjsify flatpak build] done (${C})`),process.exit(0)}}});function detectLockfile(n){return existsSync(ds(n,`yarn.lock`))?`yarn.lock`:existsSync(ds(n,`package-lock.json`))?`package-lock.json`:`yarn.lock`}var bP,xP=__esmMin(()=>{ge(),Gm(),ul(),Ts(),bP={command:`deps`,description:"Generate Flatpak offline-cache sources from a yarn.lock / package-lock.json (wraps `flatpak-node-generator`).",builder:n=>n.option(`lockfile`,{description:`Path to lockfile (default: yarn.lock or package-lock.json in cwd)`,type:`string`,normalize:!0}).option(`type`,{description:`Lockfile type. Default: detected from filename.`,choices:[`yarn`,`npm`]}).option(`out`,{description:`Output JSON sources file`,type:`string`,default:`flatpak-node-sources.json`,normalize:!0}).option(`xdg-layout`,{description:`Pass --xdg-layout (recommended for Yarn Berry / PnP setups)`,type:`boolean`,default:!0}).option(`electron-node-headers`,{description:`Pass --electron-node-headers`,type:`boolean`,default:!1}).option(`verbose`,{description:`Print the underlying flatpak-node-generator invocation`,type:`boolean`,default:!1}),handler:async n=>{let a=process.cwd(),S=ds(a,n.lockfile??detectLockfile(a));if(!existsSync(S))throw Error(`gjsify flatpak deps: lockfile ${S} not found (use --lockfile to override)`);let C=n.type??(S.endsWith(`package-lock.json`)?`npm`:`yarn`),N=ds(a,n.out??`flatpak-node-sources.json`);mkdirSync(_s(N),{recursive:!0});let F=[C,S,`-o`,N];n.xdgLayout!==!1&&F.push(`--xdg-layout`),n.electronNodeHeaders&&F.push(`--electron-node-headers`),n.verbose&&he.log(`[gjsify flatpak deps] flatpak-node-generator ${F.join(` `)}`),await new Promise((n,a)=>{let S=spawn(`flatpak-node-generator`,F,{stdio:`inherit`});S.on(`error`,n=>{n.code===`ENOENT`?a(Error("gjsify flatpak deps: flatpak-node-generator not found. Install via `pipx install flatpak-node-generator` (see https://github.com/flatpak/flatpak-builder-tools/tree/master/node).")):a(n)}),S.on(`exit`,S=>{S===0?n():a(Error(`gjsify flatpak deps: flatpak-node-generator exited with status ${S}`))})}),he.log(`[gjsify flatpak deps] wrote ${N}`)}}});function parseSri(n){if(!n)return null;let a=n.indexOf(`-`);if(a<=0||a===n.length-1)return null;let S=n.slice(0,a),C=n.slice(a+1).replace(/=+$/,``),N=Ge.from(C,`base64`).toString(`hex`);return N.length<4?null:{algorithm:S,hex:N}}function parseNpmLike(n){let a=[],S=n,C=S.packages;if(C&&typeof C==`object`){for(let n of Object.values(C))n?.resolved&&n.integrity&&a.push({url:n.resolved,integrity:n.integrity});if(a.length>0)return a}return S.dependencies&&typeof S.dependencies==`object`&&collectV1Deps(S.dependencies,a),a}function collectV1Deps(n,a){for(let S of Object.values(n))S?.resolved&&S.integrity&&a.push({url:S.resolved,integrity:S.integrity}),S?.dependencies&&collectV1Deps(S.dependencies,a)}function parseYarnClassic(n){if(/^__metadata:/m.test(n))throw Error("gjsify flatpak sources: Yarn Berry (v2+) yarn.lock is not supported — its `checksum` is a cache hash, not a tarball SRI. Run `gjsify install` to produce a gjsify-lock.json, or use a classic (v1) yarn.lock.");let a=[],S=0;for(let C of n.split(/\n\s*\n/)){let n=C.match(/^\s+resolved\s+"([^"]+)"/m);if(!n)continue;let N=n[1].replace(/#.*$/,``),F=C.match(/^\s+integrity\s+(\S+)/m);if(!F){S++;continue}a.push({url:N,integrity:F[1]})}return S>0&&he.warn(`[gjsify flatpak sources] ${S} yarn.lock entr(y/ies) had no integrity (pre-1.x format) and were skipped — re-lock with a modern yarn or use \`gjsify install\`.`),a}function parsePnpm(n){let a=[],S=!1,C=null;for(let N of n.split(`
|
|
860
860
|
`)){let n=N.replace(/\r$/,``);if(/^packages:\s*$/.test(n)){S=!0;continue}if(S&&/^[^\s#]/.test(n)&&(S=!1),!S)continue;let F=n.match(/^ {2}(?:'([^']+)'|"([^"]+)"|([^\s#][^:]*)):\s*$/);if(F){C=F[1]??F[2]??F[3]??null;continue}let I=n.match(/resolution:\s*\{([^}]*)\}/);if(I&&C){let n=I[1].match(/integrity:\s*(sha\d+-[A-Za-z0-9+/=]+)/);if(!n)continue;let S=I[1].match(/tarball:\s*([^\s,}]+)/),N=S?S[1]:reconstructNpmTarballUrl(C);N&&a.push({url:N,integrity:n[1]})}}return a}function reconstructNpmTarballUrl(n){let a,S;if(n.startsWith(`/`)){let C=n.slice(1).replace(/_.*$/,``),N=C.lastIndexOf(`/`);if(N<=0)return null;a=C.slice(0,N),S=C.slice(N+1)}else{let C=n.replace(/\(.*\)$/,``),N=C.lastIndexOf(`@`);if(N<=0)return null;a=C.slice(0,N),S=C.slice(N+1)}if(!a||!S||/[@:/]/.test(S))return null;let C=a.slice(a.lastIndexOf(`/`)+1);return`https://registry.npmjs.org/${a}/-/${C}-${S}.tgz`}function detectType(n){let a=n.toLowerCase();return a.endsWith(`pnpm-lock.yaml`)?`pnpm`:a.endsWith(`yarn.lock`)?`yarn`:a.endsWith(`package-lock.json`)?`npm`:`gjsify`}function defaultLockfile(n){for(let a of[`gjsify-lock.json`,`package-lock.json`,`yarn.lock`,`pnpm-lock.yaml`])if(existsSync(ms(n,a)))return a;return`gjsify-lock.json`}function parseLockfile(n,a){let S=readFileSync(n,`utf-8`);if(a===`yarn`)return parseYarnClassic(S);if(a===`pnpm`)return parsePnpm(S);let C;try{C=JSON.parse(S)}catch(a){throw Error(`gjsify flatpak sources: ${n} is not valid JSON: ${a.message}`)}return parseNpmLike(C)}function buildModuleSnippet(n,a){return[``,`# Add the generated sources to your app module and point XDG_CACHE_HOME`,`# at the vendored cache before running gjsify offline. Example module:`,`#`,`# {`,`# "name": "my-app",`,`# "buildsystem": "simple",`,`# "build-commands": [`,`# "export XDG_CACHE_HOME=\\"$(pwd)/${a}\\"",`,`# "gjsify install --immutable",`,`# "gjsify build src/main.ts --app gjs --outfile /app/bin/my-app"`,`# ],`,`# "sources": [`,`# { "type": "dir", "path": "." },`,`# "${n}"`,`# ]`,`# }`,``].join(`
|
|
861
|
-
`)}var
|
|
861
|
+
`)}var SP,CP,wP=__esmMin(()=>{ge(),ul(),Ts(),et(),SP=new Set([`sha256`,`sha512`]),CP={command:`sources`,description:"Generate an offline flatpak-builder `sources` array from any lockfile (gjsify-lock.json / package-lock.json / yarn.lock / pnpm-lock.yaml) for a no-network Flathub build.",builder:n=>n.option(`lockfile`,{description:`Path to the lockfile. Default: the first of gjsify-lock.json / package-lock.json / yarn.lock / pnpm-lock.yaml found in cwd.`,type:`string`,normalize:!0}).option(`type`,{description:`Lockfile format. Default: detected from the filename.`,choices:[`gjsify`,`npm`,`yarn`,`pnpm`]}).option(`out`,{description:`Output JSON sources file`,type:`string`,default:`gjsify-sources.json`,normalize:!0}).option(`cache-root`,{description:`Relative dir the tarballs download into; point XDG_CACHE_HOME here in the build. Tarballs land at <cache-root>/gjsify/tarballs/v1/<algo>/<shard>/<hex>.tgz.`,type:`string`,default:`flatpak-gjsify-cache`}).option(`print-module`,{description:`Also print a ready-to-paste flatpak manifest module snippet to stderr`,type:`boolean`,default:!1}),handler:async n=>{let a=process.cwd(),S=ds(a,n.lockfile??defaultLockfile(a));if(!existsSync(S))throw Error(`gjsify flatpak sources: lockfile ${S} not found. Run \`gjsify install\` (or npm/yarn/pnpm) first, or pass --lockfile.`);let C=n.type??detectType(S),N=parseLockfile(S,C),F=n.cacheRoot??`flatpak-gjsify-cache`,I=new Map,H=0,W=0;for(let{url:n,integrity:a}of N){let S=parseSri(a);if(!S){H++;continue}if(!SP.has(S.algorithm)){W++;continue}let C=`${S.algorithm}:${S.hex}`;if(I.has(C))continue;let N={type:`file`,url:n,dest:`${F}/gjsify/tarballs/v1/${S.algorithm}/${S.hex.slice(0,2)}`,"dest-filename":`${S.hex}.tgz`};S.algorithm===`sha512`?N.sha512=S.hex:N.sha256=S.hex,I.set(C,N)}let K=[...I.values()].sort((n,a)=>n.url<a.url?-1:+(n.url>a.url)),q=ds(a,n.out??`gjsify-sources.json`);mkdirSync(_s(q),{recursive:!0}),writeFileSync(q,JSON.stringify(K,null,2)+`
|
|
862
862
|
`),he.log(`[gjsify flatpak sources] wrote ${q} — ${K.length} tarball source(s) from ${C} lockfile (${N.length} locked entr${N.length===1?`y`:`ies`})`+(H?`, ${H} without a usable integrity skipped`:``)+(W?`, ${W} non-sha256/512 skipped`:``)),n.printModule&&he.error(buildModuleSnippet(n.out??`gjsify-sources.json`,F))}}});function renderWorkflow(n){let a=`[${n.branches.map(n=>JSON.stringify(n)).join(`, `)}]`;return`name: Flatpak
|
|
863
863
|
|
|
864
864
|
on:
|
|
@@ -887,27 +887,27 @@ jobs:
|
|
|
887
887
|
manifest-path: ${n.manifest}
|
|
888
888
|
bundle: ${n.bundle}
|
|
889
889
|
cache-key: ${n.cacheKey}
|
|
890
|
-
`}var
|
|
890
|
+
`}var TP,EP=__esmMin(()=>{ge(),ul(),Ts(),aM(),fP(),TP={command:`ci`,description:`Scaffold .github/workflows/flatpak.yml using the flathub-infra container + flatpak-builder@v6 action.`,builder:n=>n.option(`manifest`,{description:`Manifest path the workflow points at (default: <app-id>.json)`,type:`string`,normalize:!0}).option(`bundle`,{description:`Bundle filename produced by the action (default: <app-id>.flatpak)`,type:`string`,normalize:!0}).option(`runtime-image`,{description:"Container image override. Default derived from gjsify.flatpak.runtime + runtimeVersion (e.g. `ghcr.io/flathub-infra/flatpak-github-actions:gnome-50`).",type:`string`}).option(`branches`,{description:`Branches the workflow runs on push for (default: main)`,type:`string`,array:!0}).option(`out`,{description:`Output path`,type:`string`,default:`.github/workflows/flatpak.yml`,normalize:!0}).option(`cache-key`,{description:"Override the action `cache-key` (default: `flatpak-builder-${{ github.sha }}`)",type:`string`}).option(`force`,{description:`Overwrite an existing workflow file`,type:`boolean`,default:!1}).option(`verbose`,{description:`Print resolved fields`,type:`boolean`,default:!1}),handler:async n=>{let a=process.cwd(),S=(await new Config().forBuild({}).catch(()=>({}))).flatpak??{},C=readPackageJson(a),N=S.appId??(looksLikeAppId(C.name)?C.name:void 0);if(!N)throw Error(`gjsify flatpak ci: no app id available. Set gjsify.flatpak.appId in package.json or rename the package to a reverse-DNS id.`);let F=n.manifest??`${N}.json`,I=n.bundle??`${N}.flatpak`,{runtime:H,runtimeVersion:W}=resolveRuntime(S,{}),K=n.runtimeImage??S.ciContainer??defaultCiContainer(H,W),q=n.branches??S.ciBranches??[`main`],Y=n.cacheKey??"flatpak-builder-${{ github.sha }}",X=ds(a,n.out??`.github/workflows/flatpak.yml`);if(existsSync(X)&&!n.force){if(readFileSync(X,`utf-8`)===renderWorkflow({manifest:F,bundle:I,runtimeImage:K,branches:q,cacheKey:Y})){he.log(`[gjsify flatpak ci] ${X} already up to date`);return}throw Error(`gjsify flatpak ci: ${X} exists with different content. Pass --force to overwrite.`)}let te=renderWorkflow({manifest:F,bundle:I,runtimeImage:K,branches:q,cacheKey:Y});mkdirSync(_s(X),{recursive:!0}),writeFileSync(X,te,`utf-8`),n.verbose&&he.log(`[gjsify flatpak ci] runtime-image=${K} manifest=${F} bundle=${I}`),he.log(`[gjsify flatpak ci] wrote ${X}`)}}});function resolveAppId(n,a,S){if(a.appId)return a.appId;try{let n=readPackageJson(S);if(looksLikeAppId(n.name))return n.name}catch{}if(n)return n.replace(/\.json$/,``)}function resolveManifestPath(n,a,S){if(n)return ds(S,n);if(a)return ds(S,`${a}.json`);let C=readdirSync(S).filter(n=>n.endsWith(`.json`)&&!n.startsWith(`package`));if(C.length===1)return ds(S,C[0]);throw Error(`gjsify flatpak check: no manifest path given and could not auto-detect. Pass the manifest as a positional argument.`)}function runLinter(n,a,S){return new Promise(C=>{let N=spawn(n,a,{stdio:S?`inherit`:[`ignore`,`pipe`,`pipe`]}),F=``,I=``;S||(N.stdout?.setEncoding(`utf-8`),N.stderr?.setEncoding(`utf-8`),N.stdout?.on(`data`,n=>{F+=n}),N.stderr?.on(`data`,n=>{I+=n})),N.on(`error`,a=>{let S=a;S.code===`ENOENT`?he.error(`[gjsify flatpak check] ${n} not found in PATH.\nInstall via:\n flatpak install -y flathub org.flatpak.Builder\n alias ${n}="flatpak run --command=${n} org.flatpak.Builder"`):he.error(`[gjsify flatpak check] ${n} failed to spawn: ${S.message}`),C(!1)}),N.on(`exit`,N=>{let H=N===0,W=H?`OK`:`FAIL`;he.log(`[gjsify flatpak check] ${W}: ${n} ${a.join(` `)}`),!H&&!S&&(F.trim()&&he.log(F.trimEnd()),I.trim()&&he.error(I.trimEnd())),C(H)})})}var DP,OP=__esmMin(()=>{ge(),ul(),Ts(),Gm(),fP(),aM(),DP={command:`check [manifest]`,description:`Run Flathub pre-submission linters: appstreamcli validate + flatpak-builder-lint.`,builder:n=>n.positional(`manifest`,{description:"Path to the Flatpak manifest. Auto-detects `<app-id>.json` if omitted.",type:`string`,normalize:!0}).option(`repo`,{description:"Built ostree-repo path. If given, also runs `flatpak-builder-lint repo`.",type:`string`,normalize:!0}).option(`metainfo`,{description:"MetaInfo XML path. Default: `data/<app-id>.metainfo.xml.in`.",type:`string`,normalize:!0}).option(`appstream`,{description:"Run `appstreamcli validate --strict` (default: true).",type:`boolean`,default:!0}).option(`builder-lint`,{description:"Run `flatpak-builder-lint manifest` (default: true).",type:`boolean`,default:!0}).option(`verbose`,{description:`Stream linter stdout/stderr verbatim.`,type:`boolean`,default:!1}),handler:async n=>{let a=(await new Config().forBuild({}).catch(()=>({}))).flatpak??{},S=process.cwd(),C=resolveAppId(n.manifest,a,S),N=resolveManifestPath(n.manifest,C,S),F=ds(S,n.metainfo??`data/${C??`unknown`}.metainfo.xml.in`),I=0;if(n.appstream!==!1&&(existsSync(F)?await runLinter(`appstreamcli`,[`validate`,`--strict`,F],n.verbose??!1)||I++:he.warn(`[gjsify flatpak check] skipping appstreamcli — ${F} not found`)),n.builderLint!==!1){if(!existsSync(N))return he.error(`[gjsify flatpak check] manifest not found: ${N}`),process.exit(1);await runLinter(`flatpak-builder-lint`,[`manifest`,N],n.verbose??!1)||I++,n.repo&&(await runLinter(`flatpak-builder-lint`,[`repo`,ds(S,n.repo)],n.verbose??!1)||I++)}if(I>0)return he.error(`\n[gjsify flatpak check] ${I} check(s) failed.`),process.exit(1);he.log(`[gjsify flatpak check] all checks passed.`)}}});async function resolveLatestTag$1(n,a){try{let{stdout:S}=await kP(`git`,[`describe`,`--tags`,`--abbrev=0`],{cwd:n});return a&&he.log(`[gjsify flatpak sync-flathub] resolved latest tag → ${S.trim()}`),S.trim()||null}catch{return null}}async function resolveCommitForTag(n,a,S){try{let{stdout:C}=await kP(`git`,[`rev-list`,`-n`,`1`,a],{cwd:n}),N=C.trim();if(!N)throw Error(`empty rev-list output`);return S&&he.log(`[gjsify flatpak sync-flathub] resolved ${a} → ${N}`),N}catch(n){throw Error(`[gjsify flatpak sync-flathub] tag ${a} not found locally. Run \`git fetch --tags\` or pass --commit <sha>.\n underlying error: ${n instanceof Error?n.message:String(n)}`)}}function normaliseBranchSegment(n){return n.replace(/^v/,``).replace(/[^A-Za-z0-9._-]/g,`-`)}function flathubCacheRoot(){return ms(process.env.XDG_CACHE_HOME||ms(homedir(),`.cache`),`gjsify`,`flathub-sync`)}async function ensureClone(n,a,S){if(existsSync(ms(n,`.git`))){S&&he.log(`[gjsify flatpak sync-flathub] reusing clone at ${n}`),await gitInRepo(n,[`fetch`,`origin`],S);let a=await detectDefaultBranch(n,S);await gitInRepo(n,[`checkout`,a],S),await gitInRepo(n,[`reset`,`--hard`,`origin/${a}`],S);return}mkdirSync(ds(n,`..`),{recursive:!0});let C=`https://github.com/${a}.git`;S&&he.log(`[gjsify flatpak sync-flathub] git clone ${C} ${n}`);try{await kP(`git`,[`clone`,C,n])}catch(n){throw n?.code===`ENOENT`?Error("[gjsify flatpak sync-flathub] `git` not found. Install git from your distro (Fedora: `dnf install git`, Debian: `apt install git`)."):n}}async function detectDefaultBranch(n,a){try{let{stdout:S}=await kP(`git`,[`remote`,`show`,`origin`],{cwd:n}),C=S.match(/HEAD branch: (\S+)/);if(C&&C[1]&&C[1]!==`(unknown)`)return a&&he.log(`[gjsify flatpak sync-flathub] default branch → ${C[1]}`),C[1]}catch{}return`master`}function gitInRepo(n,a,S){return S&&he.log(`[gjsify flatpak sync-flathub] git ${a.join(` `)} (in ${n})`),new Promise((S,C)=>{let N=spawn(`git`,a,{cwd:n,stdio:`inherit`});N.on(`error`,n=>{n.code===`ENOENT`?C(Error("[gjsify flatpak sync-flathub] `git` not found. Install it from your distro.")):C(n)}),N.on(`exit`,n=>{n===0?S():C(Error(`git ${a[0]} exited ${n}`))})})}function ghCreate(n,a,S,C,N,F){let I=[`pr`,`create`,`--repo`,a,`--head`,S,`--title`,`Update to ${C}`,`--body`,N];return F&&he.log(`[gjsify flatpak sync-flathub] gh ${I.join(` `)} (in ${n})`),new Promise((a,S)=>{let C=spawn(`gh`,I,{cwd:n,stdio:`inherit`});C.on(`error`,n=>{n.code===`ENOENT`?S(Error("[gjsify flatpak sync-flathub] `gh` (GitHub CLI) not found. Install via `dnf install gh` (Fedora), `apt install gh` (Debian/Ubuntu), or `flatpak install -y flathub com.github.cli`.")):S(n)}),C.on(`exit`,n=>{n===0?a():S(Error(`gh pr create exited ${n}`))})})}function editManifest(n,a){let S=JSON.parse(n),C=S.modules??[];if(C.length===0)throw Error(`[gjsify flatpak sync-flathub] manifest has no modules`);let N=C[0].sources??[];if(N.length===0)throw Error(`[gjsify flatpak sync-flathub] modules[0] has no sources`);let F=a.sourceIndex??N.findIndex(n=>n.type===`git`);if(F<0||F>=N.length)throw Error(`[gjsify flatpak sync-flathub] no git source found in modules[0].sources (use --source-index <n>)`);let I=N[F];if(I.type!==`git`)throw Error(`[gjsify flatpak sync-flathub] modules[0].sources[${F}].type is "${I.type}", expected "git"`);I.tag=a.tag,I.commit=a.commit,I[`x-checker-data`]||={type:`git`,"tag-pattern":`^v(\\d+\\.\\d+\\.\\d+)$`,"version-scheme":`semantic`};let H=detectIndent$1(n);return JSON.stringify(S,null,H)+(n.endsWith(`
|
|
891
891
|
`)?`
|
|
892
|
-
`:``)}function detectIndent$1(n){let a=n.match(/^\{\n( +)/);return a?a[1].length:2}var DP,OP,kP=__esmMin(()=>{ge(),ul(),Ts(),am(),Gm(),pc(),aM(),uP(),DP=promisify(execFile),OP={command:`sync-flathub`,description:`Update the per-app Flathub tracking-repo manifest to a new git tag + commit. Clones, edits, commits, optionally opens a PR.`,builder:n=>n.version(!1).option(`version`,{description:"Git tag to sync to. Default: `git describe --tags --abbrev=0` in cwd.",type:`string`}).option(`app-id`,{description:"Reverse-DNS app id. Default: `gjsify.flatpak.appId`.",type:`string`}).option(`flathub-repo`,{description:"Flathub tracking-repo (owner/name). Default: `flathub/<appId>`.",type:`string`}).option(`commit`,{description:"Commit SHA to pin. Default: resolved via `git rev-list -n 1 <version>` in cwd.",type:`string`}).option(`branch`,{description:"Branch name in the flathub-repo. Default: `update-to-<version>`.",type:`string`}).option(`source-index`,{description:"Index into modules[0].sources[] to update (when manifest has multiple sources). Default: first `type: git` source.",type:`number`}).option(`pr`,{description:"After commit + push, open a PR via `gh pr create`. Pass `--no-pr` to skip and stop after push.",type:`boolean`,default:!0}).option(`dry-run`,{description:`Show what would be edited; touch no files, run no git commands.`,type:`boolean`,default:!1}).option(`verbose`,{description:`Echo every git / gh invocation before running.`,type:`boolean`,default:!1}),handler:async n=>{let a=process.cwd(),S=(await new Config().forBuild({}).catch(()=>({}))).flatpak??{},C=n.appId??S.appId??readPackageJson(a).name;if(!C)throw Error(`[gjsify flatpak sync-flathub] no app id available — pass --app-id or set gjsify.flatpak.appId.`);let N=n.flathubRepo??S.flathubRepo??`flathub/${C}`,F=n.version??await resolveLatestTag$1(a,n.verbose);if(!F)throw Error(`[gjsify flatpak sync-flathub] no version resolved — pass --version vX.Y.Z or create a git tag locally.`);let I=n.commit??await resolveCommitForTag(a,F,n.verbose),H=n.branch??`update-to-${normaliseBranchSegment(F)}`;if(he.log(`[gjsify flatpak sync-flathub] appId=${C}`),he.log(`[gjsify flatpak sync-flathub] flathubRepo=${N}`),he.log(`[gjsify flatpak sync-flathub] version=${F}`),he.log(`[gjsify flatpak sync-flathub] commit=${I}`),he.log(`[gjsify flatpak sync-flathub] branch=${H}`),n.dryRun){he.log(`[gjsify flatpak sync-flathub] --dry-run set; not cloning / writing / pushing.`);return}let W=flathubCacheRoot(),K=ms(W,N.replace(`/`,`__`));mkdirSync(W,{recursive:!0}),await ensureClone(K,N,n.verbose);let q=ms(K,`${C}.json`);if(!existsSync(q))throw Error(`[gjsify flatpak sync-flathub] Flathub manifest not found at ${q} — wrong appId / wrong flathub-repo?`);let Y=readFileSync(q,`utf-8`),X=editManifest(Y,{tag:F,commit:I,sourceIndex:n.sourceIndex});if(X===Y){he.log(`[gjsify flatpak sync-flathub] manifest already at ${F} — nothing to do.`);return}if(writeFileSync(q,X,`utf-8`),he.log(`[gjsify flatpak sync-flathub] manifest patched at ${q}`),await gitInRepo(K,[`checkout`,`-B`,H],n.verbose),await gitInRepo(K,[`add`,`.`],n.verbose),await gitInRepo(K,[`commit`,`-m`,`Update to ${F}`],n.verbose),n.pr===!1){he.log(`[gjsify flatpak sync-flathub] --no-pr set; branch ${H} committed locally in ${K}.`);return}await gitInRepo(K,[`push`,`-u`,`origin`,H,`--force-with-lease`],n.verbose),await ghCreate(K,N,H,F,`Auto-generated by \`gjsify flatpak sync-flathub\`.\n\n- Version: \`${F}\`\n- Commit: \`${I}\`\n`,n.verbose)}},__name$1(resolveLatestTag$1,`resolveLatestTag`),__name$1(detectIndent$1,`detectIndent`)});async function loadFlathubSource(n,a){let S;if(n.against){if(!existsSync(n.against))throw Error(`[gjsify flatpak diff] --against path ${n.against} does not exist`);S=readFileSync(n.against,`utf-8`)}else S=await fetchFlathubManifest(n.flathubRepo,n.appId,n.verbose);let C;try{C=JSON.parse(S)}catch(n){throw Error(`[gjsify flatpak diff] failed to parse Flathub manifest as JSON: ${n.message}`)}let N=(C.modules??[])[0]?.sources??[];if(N.length===0)return null;let F=a??N.findIndex(n=>n?.type===`git`);return F<0||F>=N.length?null:N[F]??null}async function fetchFlathubManifest(n,a,S){for(let C of[`master`,`main`]){let N=`https://raw.githubusercontent.com/${n}/${C}/${a}.json`;S&&he.log(`[gjsify flatpak diff] fetch ${N}`);try{let n=await fetch(N);if(n.ok)return await n.text();S&&he.log(`[gjsify flatpak diff] ${C} → HTTP ${n.status}`)}catch(n){S&&he.log(`[gjsify flatpak diff] ${C} fetch error: ${n.message}`)}}throw Error(`[gjsify flatpak diff] could not fetch flathub manifest from ${n} on master or main`)}async function resolveLatestTag(n,a){try{let{stdout:S}=await AP(`git`,[`describe`,`--tags`,`--abbrev=0`],{cwd:n}),C=S.trim();return a&&he.log(`[gjsify flatpak diff] local latest tag → ${C}`),C||null}catch{return null}}var AP,jP,MP=__esmMin(()=>{ge(),ul(),Gm(),pc(),aM(),uP(),AP=promisify(execFile),jP={command:`diff`,description:`Compare the per-app Flathub tracking-repo manifest against the local git state and report version / commit drift.`,builder:n=>n.version(!1).option(`version`,{description:"Local version to compare against. Default: `git describe --tags --abbrev=0` in cwd.",type:`string`}).option(`app-id`,{description:"Reverse-DNS app id. Default: `gjsify.flatpak.appId`.",type:`string`}).option(`flathub-repo`,{description:"Flathub tracking-repo (owner/name). Default: `gjsify.flatpak.flathubRepo` or `flathub/<appId>`.",type:`string`}).option(`against`,{description:`Read the Flathub manifest from a local file instead of fetching it. Useful in CI or offline.`,type:`string`}).option(`detail`,{description:`Also print the full Flathub manifest source entry alongside the resolved local version.`,type:`boolean`,default:!1}).option(`source-index`,{description:`Index into modules[0].sources[] to inspect (when the manifest has multiple sources).`,type:`number`}).option(`verbose`,{description:`Echo fetch URL + resolved values.`,type:`boolean`,default:!1}),handler:async n=>{let a=process.cwd(),S=(await new Config().forBuild({}).catch(()=>({}))).flatpak??{},C=n.appId??S.appId??readPackageJson(a).name;if(!C)throw Error(`[gjsify flatpak diff] no app id available — pass --app-id or set gjsify.flatpak.appId.`);let N=n.flathubRepo??S.flathubRepo??`flathub/${C}`,F=n.version??await resolveLatestTag(a,n.verbose),I=await loadFlathubSource({appId:C,flathubRepo:N,against:n.against,verbose:n.verbose},n.sourceIndex),H=I?.tag,W=I?.commit;if(he.log(`[gjsify flatpak diff] appId=${C}`),he.log(`[gjsify flatpak diff] flathubRepo=${N}`),he.log(`[gjsify flatpak diff] flathub: tag=${H??`(missing)`} commit=${W??`(missing)`}`),he.log(`[gjsify flatpak diff] local: tag=${F??`(none)`}`),n.detail&&I&&(he.log(`[gjsify flatpak diff] flathub manifest source:`),he.log(JSON.stringify(I,null,2))),!F){he.warn("[gjsify flatpak diff] no local git tag found — cut a release (`git tag vX.Y.Z`) or pass --version vX.Y.Z to compare against an explicit value.");return}if(!H)return he.warn("[gjsify flatpak diff] flathub manifest has no `tag` field on the inspected source."),process.exit(1);if(H===F){he.log(`✅ in sync (${F})`);return}he.log(`❌ drift detected — flathub=${H} vs local=${F}`),he.log(` run \`gjsify flatpak sync-flathub --version ${F}\` to update the Flathub manifest.`),process.exit(1)}}});function resolveCliEntry(){return ds(ds(_s(fileURLToPath(import.meta.url)),`..`,`..`),`index.js`)}async function runNode(n,a){await new Promise((S,C)=>{let N=spawn(`node`,n,{cwd:a,stdio:`inherit`});N.on(`error`,C),N.on(`exit`,a=>{a===0?S():C(Error(`sub-command exited with code ${a}: node ${n.join(` `)}`))})})}var NP,PP,FP=__esmMin(()=>{ge(),Gm(),pc(),nn(),Ts(),NP=promisify(execFile),PP={command:`release <version>`,description:"Cut a release end-to-end: regenerate Flathub assets, run linters, create + push the git tag, then open the Flathub PR. Each step delegates to the equivalent `gjsify flatpak <sub>` command.",builder:n=>n.version(!1).positional(`version`,{description:"Release tag, e.g. `v0.6.6`.",type:`string`,demandOption:!0}).option(`skip-init`,{description:"Skip the `flatpak init --force` regen step.",type:`boolean`,default:!1}).option(`skip-check`,{description:"Skip the `flatpak check` linter step.",type:`boolean`,default:!1}).option(`skip-tag`,{description:"Skip the `git tag` + `git push --tags` step (use when the tag was already created out-of-band).",type:`boolean`,default:!1}).option(`push-tag`,{description:`Push the created tag after creating it. Default: true.`,type:`boolean`,default:!0}).option(`flathub-repo`,{description:`Flathub tracking-repo override forwarded to sync-flathub.`,type:`string`}).option(`dry-run`,{description:`Print each step that would run without executing any of them.`,type:`boolean`,default:!1}).option(`verbose`,{description:`Echo every sub-command invocation.`,type:`boolean`,default:!1}),handler:async n=>{let a=typeof n.version==`string`?n.version.trim():``;if(!a)throw Error(`[gjsify flatpak release] missing <version> positional`);let S=resolveCliEntry(),C=process.cwd(),N=[];n.skipInit||N.push({name:`init`,args:[S,`flatpak`,`init`,`--force`]}),n.skipCheck||N.push({name:`check`,args:[S,`flatpak`,`check`]});let F=[S,`flatpak`,`sync-flathub`,`--version`,a];if(n.flathubRepo&&F.push(`--flathub-repo`,n.flathubRepo),n.verbose&&F.push(`--verbose`),he.log(`[gjsify flatpak release] starting release of ${a}`),n.dryRun){he.log(`[gjsify flatpak release] --dry-run set; printing plan only:`);for(let n of N)he.log(` · ${n.name}: node ${n.args.join(` `)}`);n.skipTag||he.log(` · tag: git tag ${a}${n.pushTag===!1?``:` && git push origin `+a}`),he.log(` · sync: node ${F.join(` `)}`);return}for(let a of N)n.verbose&&he.log(`[gjsify flatpak release] step ${a.name}: node ${a.args.join(` `)}`),await runNode(a.args,C),he.log(`[gjsify flatpak release] ${a.name} ✔`);if(!n.skipTag){n.verbose&&he.log(`[gjsify flatpak release] git tag ${a}`);try{await NP(`git`,[`tag`,a],{cwd:C}),he.log(`[gjsify flatpak release] tag ${a} created`)}catch(n){throw Error(`[gjsify flatpak release] git tag failed (${n.message}). If the tag already exists, re-run with --skip-tag.`)}n.pushTag!==!1&&(n.verbose&&he.log(`[gjsify flatpak release] git push origin ${a}`),await NP(`git`,[`push`,`origin`,a],{cwd:C}),he.log(`[gjsify flatpak release] tag pushed`))}n.verbose&&he.log(`[gjsify flatpak release] sync: node ${F.join(` `)}`),await runNode(F,C),he.log(`[gjsify flatpak release] ✅ release ${a} complete`)}}}),IP,LP=__esmMin(()=>{hP(),_P(),yP(),SP(),wP(),EP(),kP(),MP(),FP(),IP={command:`flatpak <subcommand>`,description:`Flatpak toolchain: init/build/deps/sources/ci/check/sync-flathub/diff/release subcommands for shipping GJS apps and CLIs as Flatpaks.`,builder:n=>n.command(mP.command,mP.description,mP.builder,mP.handler).command(gP.command,gP.description,gP.builder,gP.handler).command(vP.command,vP.description,vP.builder,vP.handler).command(xP.command,xP.description,xP.builder,xP.handler).command(CP.command,CP.description,CP.builder,CP.handler).command(TP.command,TP.description,TP.builder,TP.handler).command(OP.command,OP.description,OP.builder,OP.handler).command(jP.command,jP.description,jP.builder,jP.handler).command(PP.command,PP.description,PP.builder,PP.handler).demandCommand(1).strict()}});function defaultGlobalLayout(){let n=process.env.GJSIFY_GLOBAL_PREFIX,a=process.env.GJSIFY_GLOBAL_BIN_DIR,S=homedir(),C=process.env.XDG_DATA_HOME??ms(S,`.local`,`share`);return{prefix:n??ms(C,`gjsify`,`global`),binDir:a??ms(S,`.local`,`bin`)}}function hasBundlerEngineInstalled(n){return existsSync(ms(n,`node_modules`,`@gjsify/rolldown-native`,`package.json`))}async function installGjsEnginePackages(n,a,S={}){let C=S.verbose??!1,N=S.installFn??(async a=>{let{installPackages:S}=await Promise.resolve().then(()=>(RN(),IN));await S({prefix:n,specs:[a],verbose:C})});for(let n of RP){let S=a?`${n}@${a}`:n;try{await N(S)}catch(S){let N=S instanceof Error?S.message:String(S);n===`@gjsify/rolldown-native`?he.warn(`\nWarning: could not install the GJS bundler engine ${n}@${a} — ${N}\n \`gjsify build\` (and storybook / flatpak) will fail under GJS until it is present.\n This usually means no prebuild is published for this platform (${process.platform}/${process.arch}).`):C&&he.warn(`gjsify install: optional GJS engine ${n}@${a} not installed — ${N}`)}}}function linkGlobalBins(n,a){mkdirSync(a.binDir,{recursive:!0});let S=[],C=detectNativePackages(a.prefix).map(n=>n.prebuildsDir),N=buildNativeEnvPreamble(a.prefix,C);for(let F of n){let n=ms(a.prefix,`node_modules`,F),I=ms(n,`package.json`);if(!existsSync(I))continue;let H=pickBinMap(F,readJson(I));if(!(!H||H.size===0))for(let[F,I]of H){let H=ms(n,I);if(!existsSync(H))continue;try{chmodSync(H,493)}catch{}let W=ms(a.binDir,F);for(let n of[W,`${W}.cmd`,`${W}.ps1`])rmSync(n,{force:!0,maxRetries:10,retryDelay:100});let K=H.endsWith(`.gjs.mjs`)||H.endsWith(`.mjs`);if(writeFileSync(W,K?`#!/bin/sh\n${N}exec gjs -m ${shQuote(H)} "$@"\n`:`#!/bin/sh\nexec ${shQuote(H)} "$@"\n`),chmodSync(W,493),process.platform===`win32`){let n=C.join(`;`),a=K&&C.length>0?{GI_TYPELIB_PATH:n,PATH:n}:{},S=K?null:readShebangOf(H),N=buildLauncherShims(K?{interpreter:`gjs`,interpreterArgs:[`-m`],target:H,prependEnv:a}:{interpreter:S?.prog||`node`,interpreterArgs:S?.args.trim()?S.args.trim().split(/\s+/):[],target:H});writeFileSync(`${W}.cmd`,N.cmd),writeFileSync(`${W}.ps1`,N.ps1)}S.push({name:F,target:H,link:W})}}return S}function shQuote(n){return`'${n.replace(/'/g,`'\\''`)}'`}function readShebangOf(n){try{return parseShebang(readFileSync(n,`utf-8`).trimStart().split(/\r*\n/,1)[0]??``)}catch{return null}}function pickBinMap(n,a){let S=a.gjsify;if(S?.bin!==void 0)return normalizeBin(n,S.bin);let C=a.bin;return C===void 0?null:normalizeBin(n,C)}function normalizeBin(n,a){let S=new Map;if(typeof a==`string`){let C=n.startsWith(`@`)?n.slice(n.indexOf(`/`)+1):n;return S.set(C,a),S}for(let[n,C]of Object.entries(a))S.set(n,C);return S}function readJson(n){return JSON.parse(readFileSync(n,`utf-8`))}function binDirOnPath(n){let a=process.env.PATH??``,S=process.platform===`win32`?`;`:`:`,C=ds(n);return a.split(S).some(n=>n&&ds(n)===C)}function specToPackageName(n){if(n.startsWith(`@`)){let a=n.indexOf(`/`);if(a<0)return n;let S=n.indexOf(`@`,a);return S<0?n:n.slice(0,S)}let a=n.indexOf(`@`);return a<0?n:n.slice(0,a)}var RP,zP=__esmMin(()=>{ge(),ul(),am(),Ts(),uM(),kN(),RP=[`@gjsify/rolldown-native`,`@gjsify/lightningcss-native`,`@gjsify/oxfmt-native`]});function workspaceLinkTarget(n,a){return BP===`junction`?ds(a):hs(_s(n),a)}function isAbortedFromOverallTimeout(n){if(!n||typeof n!=`object`)return!1;let a=n.name;if(a===`AbortError`)return!0;let S=n.message;return!!(typeof S==`string`&&S.includes(`install-overall-timeout`)||a===`RegistryTimeoutError`)}function forceExit(n){process.exitCode=n,!gjsExit(n)&&process.exit(n)}function readCliVersionFrom(n){try{if(!existsSync(n))return null;let a=JSON.parse(readFileSync(n,`utf-8`));if(a.name===UP&&typeof a.version==`string`)return a.version}catch{}return null}function readRunningCliVersion(){try{let n=_s(ds(fileURLToPath(import.meta.url)));for(let a=0;a<8&&n!==_s(n);a++){let a=readCliVersionFrom(ms(n,`package.json`));if(a)return a;n=_s(n)}}catch{}return null}function readWorkspaceCliVersion(n){return readCliVersionFrom(ms(n,`node_modules`,UP,`package.json`))??readCliVersionFrom(ms(n,`packages`,`infra`,`cli`,`package.json`))}function warnOnCliVersionSkew(n){if(process.env.GJSIFY_NO_VERSION_SKEW_WARNING===`1`)return;let a=readRunningCliVersion(),S=readWorkspaceCliVersion(n);!a||!S||a===S||he.warn(`gjsify install: version skew — you are running @gjsify/cli v${a}, but this workspace pins v${S}.\n A mismatched CLI can stall the install (lock discarded → full re-resolve) or silently produce a wrong build.\n Align them: run \`gjsify self-update\` (global CLI) or use the workspace-local \`node_modules/.bin/gjsify\`.\n Suppress this with GJSIFY_NO_VERSION_SKEW_WARNING=1.`)}function isWorkspaceRoot(n){let a=readPackageJson$1(ms(n,`package.json`));return a?a.workspaces!==void 0:!1}function depKindFromArgs(n){return n[`save-dev`]?`devDependencies`:n[`save-peer`]?`peerDependencies`:n[`save-optional`]?`optionalDependencies`:`dependencies`}async function projectInstallNative(n,a){let S=process.cwd(),C=ms(S,`package.json`),N=[`.pnp.cjs`,`.pnp.loader.mjs`].filter(n=>existsSync(ms(S,n)));if(N.length>0)throw Error(`gjsify install uses the node_modules linker and cannot run in a Yarn PnP project (found ${N.join(`, `)} in ${S}).\n\n• If this project uses \`gjsify install\` to manage dependencies, these PnP files are stale residue from an earlier \`yarn install\` — remove them and re-run:\n rm -f .pnp.cjs .pnp.loader.mjs && rm -rf .yarn/cache .yarn/unplugged\n gjsify install\n\n• If instead you want Yarn to manage dependencies, set \`nodeLinker: node-modules\` in .yarnrc.yml and run \`yarn install\` (not \`gjsify install\`).`);if(!n.packages||n.packages.length===0){let C=isWorkspaceRoot(S)?S:findWorkspaceRoot(S);if(C){C!==S&&he.log(`gjsify install: resolved workspace root ${C} (from ${S}); installing the workspace.`),await workspaceInstall(C,n,a);return}}let F,I=readPackageJson$1(C),H=I?projectSpecsFromPackageJson(I):[];if(n.packages&&n.packages.length>0){let a=new Set(n.packages.map(n=>parseSpec$2(n).name));F=[...H.filter(n=>!a.has(parseSpec$2(n).name)),...n.packages]}else{if(!I)throw Error(`gjsify install: no package.json in ${S}`);if(F=H,F.length===0){he.log(`gjsify install: no dependencies declared in package.json — nothing to do.`);return}}mkdirSync(S,{recursive:!0});let W=makeProgressReporter({enabled:!n.verbose&&!n.quiet&&n.progress!==!1}),K=await acquireInstallLock(S,{signal:a});try{let N=await installPackages({prefix:S,specs:F,verbose:n.verbose,lockfile:!n.immutable,frozen:n.immutable,refreshLockfile:n[`refresh-lockfile`],signal:a,progress:W});if(n.packages&&n.packages.length>0&&I){let a=depKindFromArgs(n);for(let S of n.packages){let{name:n,range:C}=parseSpec$2(S),F=N.installed.find(a=>a.name===n);addDependencyEntry(I,n,C??(F?defaultRangeFromVersion(F.version):`latest`),a)}writePackageJson(C,I),n.immutable||syncLockfileRequested(S,projectSpecsFromPackageJson(I))}}finally{K.release()}}function syncLockfileRequested(n,a){let S=ms(n,`gjsify-lock.json`);if(existsSync(S))try{let n=JSON.parse(readFileSync(S,`utf-8`)),C=[...a].sort(),N=[...n.requested??[]].sort();if(C.length===N.length&&C.every((n,a)=>n===N[a]))return;n.requested=a,atomicWriteStrict(S,JSON.stringify(n,null,2)+`
|
|
893
|
-
`)}catch{}}async function workspaceInstall(n,a,S){let C=await acquireInstallLock(n,{signal:S});try{await workspaceInstallLocked(n,a,S)}finally{C.release()}}async function workspaceInstallLocked(n,a,S){let C=discoverWorkspaces(n,{includeRoot:!0});if(C.length===0)throw Error(`gjsify install: ${n} has a "workspaces" field but no workspaces were discovered`);let N=new Map(C.map(n=>[n.name,n])),F=new Set,I=new Map,H=[];for(let n of C){let a=n.manifest;for(let S of[`dependencies`,`devDependencies`,`optionalDependencies`]){let C=a[S];if(C)for(let[a,S]of Object.entries(C)){if(typeof S!=`string`)continue;let C=N.get(a);if(C&&!/^(link|file|portal|git\+|https?):/.test(S)){H.push({fromWorkspaceName:n.name,depName:a,targetLocation:C.location});continue}if(S.startsWith(`workspace:`))throw Error(`gjsify install: ${n.name} declares "${a}: ${S}" but no workspace with that name exists`);if(/^(link|file|portal|git\+|https?):/.test(S))continue;let W=`${a}@${S}`;F.add(W);let K=I.get(W);K||(K=new Set,I.set(W,K)),K.add(n.name)}}}he.log(`gjsify install: ${C.length} workspace(s), ${F.size} external dep spec(s), ${H.length} workspace symlink(s)`),writeWorkspaceBinShims(n,C);let wireWorkspaceSymlinks=async()=>{if(H.length>0){let n=await Promise.resolve().then(()=>(Hc(),zc)),a=new Set,S=[];for(let n of H){let C=N.get(n.fromWorkspaceName);if(!C)continue;let F=ms(C.location,`node_modules`,n.depName);a.add(_s(F));let I=workspaceLinkTarget(F,n.targetLocation);S.push({linkPath:F,relTarget:I})}await Promise.all([...a].map(a=>n.mkdir(a,{recursive:!0})));let C=0,F=[],wireOne=async(a,S)=>{try{await n.rm(a,{recursive:!0,force:!0,maxRetries:10,retryDelay:100})}catch{}await n.symlink(S,a,
|
|
892
|
+
`:``)}function detectIndent$1(n){let a=n.match(/^\{\n( +)/);return a?a[1].length:2}var kP,AP,jP=__esmMin(()=>{ge(),ul(),Ts(),am(),Gm(),pc(),aM(),fP(),kP=promisify(execFile),AP={command:`sync-flathub`,description:`Update the per-app Flathub tracking-repo manifest to a new git tag + commit. Clones, edits, commits, optionally opens a PR.`,builder:n=>n.version(!1).option(`version`,{description:"Git tag to sync to. Default: `git describe --tags --abbrev=0` in cwd.",type:`string`}).option(`app-id`,{description:"Reverse-DNS app id. Default: `gjsify.flatpak.appId`.",type:`string`}).option(`flathub-repo`,{description:"Flathub tracking-repo (owner/name). Default: `flathub/<appId>`.",type:`string`}).option(`commit`,{description:"Commit SHA to pin. Default: resolved via `git rev-list -n 1 <version>` in cwd.",type:`string`}).option(`branch`,{description:"Branch name in the flathub-repo. Default: `update-to-<version>`.",type:`string`}).option(`source-index`,{description:"Index into modules[0].sources[] to update (when manifest has multiple sources). Default: first `type: git` source.",type:`number`}).option(`pr`,{description:"After commit + push, open a PR via `gh pr create`. Pass `--no-pr` to skip and stop after push.",type:`boolean`,default:!0}).option(`dry-run`,{description:`Show what would be edited; touch no files, run no git commands.`,type:`boolean`,default:!1}).option(`verbose`,{description:`Echo every git / gh invocation before running.`,type:`boolean`,default:!1}),handler:async n=>{let a=process.cwd(),S=(await new Config().forBuild({}).catch(()=>({}))).flatpak??{},C=n.appId??S.appId??readPackageJson(a).name;if(!C)throw Error(`[gjsify flatpak sync-flathub] no app id available — pass --app-id or set gjsify.flatpak.appId.`);let N=n.flathubRepo??S.flathubRepo??`flathub/${C}`,F=n.version??await resolveLatestTag$1(a,n.verbose);if(!F)throw Error(`[gjsify flatpak sync-flathub] no version resolved — pass --version vX.Y.Z or create a git tag locally.`);let I=n.commit??await resolveCommitForTag(a,F,n.verbose),H=n.branch??`update-to-${normaliseBranchSegment(F)}`;if(he.log(`[gjsify flatpak sync-flathub] appId=${C}`),he.log(`[gjsify flatpak sync-flathub] flathubRepo=${N}`),he.log(`[gjsify flatpak sync-flathub] version=${F}`),he.log(`[gjsify flatpak sync-flathub] commit=${I}`),he.log(`[gjsify flatpak sync-flathub] branch=${H}`),n.dryRun){he.log(`[gjsify flatpak sync-flathub] --dry-run set; not cloning / writing / pushing.`);return}let W=flathubCacheRoot(),K=ms(W,N.replace(`/`,`__`));mkdirSync(W,{recursive:!0}),await ensureClone(K,N,n.verbose);let q=ms(K,`${C}.json`);if(!existsSync(q))throw Error(`[gjsify flatpak sync-flathub] Flathub manifest not found at ${q} — wrong appId / wrong flathub-repo?`);let Y=readFileSync(q,`utf-8`),X=editManifest(Y,{tag:F,commit:I,sourceIndex:n.sourceIndex});if(X===Y){he.log(`[gjsify flatpak sync-flathub] manifest already at ${F} — nothing to do.`);return}if(writeFileSync(q,X,`utf-8`),he.log(`[gjsify flatpak sync-flathub] manifest patched at ${q}`),await gitInRepo(K,[`checkout`,`-B`,H],n.verbose),await gitInRepo(K,[`add`,`.`],n.verbose),await gitInRepo(K,[`commit`,`-m`,`Update to ${F}`],n.verbose),n.pr===!1){he.log(`[gjsify flatpak sync-flathub] --no-pr set; branch ${H} committed locally in ${K}.`);return}await gitInRepo(K,[`push`,`-u`,`origin`,H,`--force-with-lease`],n.verbose),await ghCreate(K,N,H,F,`Auto-generated by \`gjsify flatpak sync-flathub\`.\n\n- Version: \`${F}\`\n- Commit: \`${I}\`\n`,n.verbose)}},__name$1(resolveLatestTag$1,`resolveLatestTag`),__name$1(detectIndent$1,`detectIndent`)});async function loadFlathubSource(n,a){let S;if(n.against){if(!existsSync(n.against))throw Error(`[gjsify flatpak diff] --against path ${n.against} does not exist`);S=readFileSync(n.against,`utf-8`)}else S=await fetchFlathubManifest(n.flathubRepo,n.appId,n.verbose);let C;try{C=JSON.parse(S)}catch(n){throw Error(`[gjsify flatpak diff] failed to parse Flathub manifest as JSON: ${n.message}`)}let N=(C.modules??[])[0]?.sources??[];if(N.length===0)return null;let F=a??N.findIndex(n=>n?.type===`git`);return F<0||F>=N.length?null:N[F]??null}async function fetchFlathubManifest(n,a,S){for(let C of[`master`,`main`]){let N=`https://raw.githubusercontent.com/${n}/${C}/${a}.json`;S&&he.log(`[gjsify flatpak diff] fetch ${N}`);try{let n=await fetch(N);if(n.ok)return await n.text();S&&he.log(`[gjsify flatpak diff] ${C} → HTTP ${n.status}`)}catch(n){S&&he.log(`[gjsify flatpak diff] ${C} fetch error: ${n.message}`)}}throw Error(`[gjsify flatpak diff] could not fetch flathub manifest from ${n} on master or main`)}async function resolveLatestTag(n,a){try{let{stdout:S}=await MP(`git`,[`describe`,`--tags`,`--abbrev=0`],{cwd:n}),C=S.trim();return a&&he.log(`[gjsify flatpak diff] local latest tag → ${C}`),C||null}catch{return null}}var MP,NP,PP=__esmMin(()=>{ge(),ul(),Gm(),pc(),aM(),fP(),MP=promisify(execFile),NP={command:`diff`,description:`Compare the per-app Flathub tracking-repo manifest against the local git state and report version / commit drift.`,builder:n=>n.version(!1).option(`version`,{description:"Local version to compare against. Default: `git describe --tags --abbrev=0` in cwd.",type:`string`}).option(`app-id`,{description:"Reverse-DNS app id. Default: `gjsify.flatpak.appId`.",type:`string`}).option(`flathub-repo`,{description:"Flathub tracking-repo (owner/name). Default: `gjsify.flatpak.flathubRepo` or `flathub/<appId>`.",type:`string`}).option(`against`,{description:`Read the Flathub manifest from a local file instead of fetching it. Useful in CI or offline.`,type:`string`}).option(`detail`,{description:`Also print the full Flathub manifest source entry alongside the resolved local version.`,type:`boolean`,default:!1}).option(`source-index`,{description:`Index into modules[0].sources[] to inspect (when the manifest has multiple sources).`,type:`number`}).option(`verbose`,{description:`Echo fetch URL + resolved values.`,type:`boolean`,default:!1}),handler:async n=>{let a=process.cwd(),S=(await new Config().forBuild({}).catch(()=>({}))).flatpak??{},C=n.appId??S.appId??readPackageJson(a).name;if(!C)throw Error(`[gjsify flatpak diff] no app id available — pass --app-id or set gjsify.flatpak.appId.`);let N=n.flathubRepo??S.flathubRepo??`flathub/${C}`,F=n.version??await resolveLatestTag(a,n.verbose),I=await loadFlathubSource({appId:C,flathubRepo:N,against:n.against,verbose:n.verbose},n.sourceIndex),H=I?.tag,W=I?.commit;if(he.log(`[gjsify flatpak diff] appId=${C}`),he.log(`[gjsify flatpak diff] flathubRepo=${N}`),he.log(`[gjsify flatpak diff] flathub: tag=${H??`(missing)`} commit=${W??`(missing)`}`),he.log(`[gjsify flatpak diff] local: tag=${F??`(none)`}`),n.detail&&I&&(he.log(`[gjsify flatpak diff] flathub manifest source:`),he.log(JSON.stringify(I,null,2))),!F){he.warn("[gjsify flatpak diff] no local git tag found — cut a release (`git tag vX.Y.Z`) or pass --version vX.Y.Z to compare against an explicit value.");return}if(!H)return he.warn("[gjsify flatpak diff] flathub manifest has no `tag` field on the inspected source."),process.exit(1);if(H===F){he.log(`✅ in sync (${F})`);return}he.log(`❌ drift detected — flathub=${H} vs local=${F}`),he.log(` run \`gjsify flatpak sync-flathub --version ${F}\` to update the Flathub manifest.`),process.exit(1)}}});function resolveCliEntry(){return ds(ds(_s(fileURLToPath(import.meta.url)),`..`,`..`),`index.js`)}async function runNode(n,a){await new Promise((S,C)=>{let N=spawn(`node`,n,{cwd:a,stdio:`inherit`});N.on(`error`,C),N.on(`exit`,a=>{a===0?S():C(Error(`sub-command exited with code ${a}: node ${n.join(` `)}`))})})}var FP,IP,LP=__esmMin(()=>{ge(),Gm(),pc(),nn(),Ts(),FP=promisify(execFile),IP={command:`release <version>`,description:"Cut a release end-to-end: regenerate Flathub assets, run linters, create + push the git tag, then open the Flathub PR. Each step delegates to the equivalent `gjsify flatpak <sub>` command.",builder:n=>n.version(!1).positional(`version`,{description:"Release tag, e.g. `v0.6.6`.",type:`string`,demandOption:!0}).option(`skip-init`,{description:"Skip the `flatpak init --force` regen step.",type:`boolean`,default:!1}).option(`skip-check`,{description:"Skip the `flatpak check` linter step.",type:`boolean`,default:!1}).option(`skip-tag`,{description:"Skip the `git tag` + `git push --tags` step (use when the tag was already created out-of-band).",type:`boolean`,default:!1}).option(`push-tag`,{description:`Push the created tag after creating it. Default: true.`,type:`boolean`,default:!0}).option(`flathub-repo`,{description:`Flathub tracking-repo override forwarded to sync-flathub.`,type:`string`}).option(`dry-run`,{description:`Print each step that would run without executing any of them.`,type:`boolean`,default:!1}).option(`verbose`,{description:`Echo every sub-command invocation.`,type:`boolean`,default:!1}),handler:async n=>{let a=typeof n.version==`string`?n.version.trim():``;if(!a)throw Error(`[gjsify flatpak release] missing <version> positional`);let S=resolveCliEntry(),C=process.cwd(),N=[];n.skipInit||N.push({name:`init`,args:[S,`flatpak`,`init`,`--force`]}),n.skipCheck||N.push({name:`check`,args:[S,`flatpak`,`check`]});let F=[S,`flatpak`,`sync-flathub`,`--version`,a];if(n.flathubRepo&&F.push(`--flathub-repo`,n.flathubRepo),n.verbose&&F.push(`--verbose`),he.log(`[gjsify flatpak release] starting release of ${a}`),n.dryRun){he.log(`[gjsify flatpak release] --dry-run set; printing plan only:`);for(let n of N)he.log(` · ${n.name}: node ${n.args.join(` `)}`);n.skipTag||he.log(` · tag: git tag ${a}${n.pushTag===!1?``:` && git push origin `+a}`),he.log(` · sync: node ${F.join(` `)}`);return}for(let a of N)n.verbose&&he.log(`[gjsify flatpak release] step ${a.name}: node ${a.args.join(` `)}`),await runNode(a.args,C),he.log(`[gjsify flatpak release] ${a.name} ✔`);if(!n.skipTag){n.verbose&&he.log(`[gjsify flatpak release] git tag ${a}`);try{await FP(`git`,[`tag`,a],{cwd:C}),he.log(`[gjsify flatpak release] tag ${a} created`)}catch(n){throw Error(`[gjsify flatpak release] git tag failed (${n.message}). If the tag already exists, re-run with --skip-tag.`)}n.pushTag!==!1&&(n.verbose&&he.log(`[gjsify flatpak release] git push origin ${a}`),await FP(`git`,[`push`,`origin`,a],{cwd:C}),he.log(`[gjsify flatpak release] tag pushed`))}n.verbose&&he.log(`[gjsify flatpak release] sync: node ${F.join(` `)}`),await runNode(F,C),he.log(`[gjsify flatpak release] ✅ release ${a} complete`)}}}),RP,zP=__esmMin(()=>{_P(),yP(),xP(),wP(),EP(),OP(),jP(),PP(),LP(),RP={command:`flatpak <subcommand>`,description:`Flatpak toolchain: init/build/deps/sources/ci/check/sync-flathub/diff/release subcommands for shipping GJS apps and CLIs as Flatpaks.`,builder:n=>n.command(gP.command,gP.description,gP.builder,gP.handler).command(vP.command,vP.description,vP.builder,vP.handler).command(bP.command,bP.description,bP.builder,bP.handler).command(CP.command,CP.description,CP.builder,CP.handler).command(TP.command,TP.description,TP.builder,TP.handler).command(DP.command,DP.description,DP.builder,DP.handler).command(AP.command,AP.description,AP.builder,AP.handler).command(NP.command,NP.description,NP.builder,NP.handler).command(IP.command,IP.description,IP.builder,IP.handler).demandCommand(1).strict()}});function defaultGlobalLayout(){let n=process.env.GJSIFY_GLOBAL_PREFIX,a=process.env.GJSIFY_GLOBAL_BIN_DIR,S=homedir(),C=process.env.XDG_DATA_HOME??ms(S,`.local`,`share`);return{prefix:n??ms(C,`gjsify`,`global`),binDir:a??ms(S,`.local`,`bin`)}}function hasBundlerEngineInstalled(n){return existsSync(ms(n,`node_modules`,`@gjsify/rolldown-native`,`package.json`))}async function installGjsEnginePackages(n,a,S={}){let C=S.verbose??!1,N=S.installFn??(async a=>{let{installPackages:S}=await Promise.resolve().then(()=>(BN(),RN));await S({prefix:n,specs:[a],verbose:C})});for(let n of BP){let S=a?`${n}@${a}`:n;try{await N(S)}catch(S){let N=S instanceof Error?S.message:String(S);n===`@gjsify/rolldown-native`?he.warn(`\nWarning: could not install the GJS bundler engine ${n}@${a} — ${N}\n \`gjsify build\` (and storybook / flatpak) will fail under GJS until it is present.\n This usually means no prebuild is published for this platform (${process.platform}/${process.arch}).`):C&&he.warn(`gjsify install: optional GJS engine ${n}@${a} not installed — ${N}`)}}}function linkGlobalBins(n,a){mkdirSync(a.binDir,{recursive:!0});let S=[],C=detectNativePackages(a.prefix).map(n=>n.prebuildsDir),N=buildNativeEnvPreamble(a.prefix,C);for(let F of n){let n=ms(a.prefix,`node_modules`,F),I=ms(n,`package.json`);if(!existsSync(I))continue;let H=pickBinMap(F,readJson(I));if(!(!H||H.size===0))for(let[F,I]of H){let H=ms(n,I);if(!existsSync(H))continue;try{chmodSync(H,493)}catch{}let W=ms(a.binDir,F);for(let n of[W,`${W}.cmd`,`${W}.ps1`])rmSync(n,{force:!0,maxRetries:10,retryDelay:100});let K=H.endsWith(`.gjs.mjs`)||H.endsWith(`.mjs`);if(writeFileSync(W,K?`#!/bin/sh\n${N}exec gjs -m ${shQuote(H)} "$@"\n`:`#!/bin/sh\nexec ${shQuote(H)} "$@"\n`),chmodSync(W,493),process.platform===`win32`){let n=C.join(`;`),a=K&&C.length>0?{GI_TYPELIB_PATH:n,PATH:n}:{},S=K?null:readShebangOf(H),N=buildLauncherShims(K?{interpreter:`gjs`,interpreterArgs:[`-m`],target:H,prependEnv:a}:{interpreter:S?.prog||`node`,interpreterArgs:S?.args.trim()?S.args.trim().split(/\s+/):[],target:H});writeFileSync(`${W}.cmd`,N.cmd),writeFileSync(`${W}.ps1`,N.ps1)}S.push({name:F,target:H,link:W})}}return S}function shQuote(n){return`'${n.replace(/'/g,`'\\''`)}'`}function readShebangOf(n){try{return parseShebang(readFileSync(n,`utf-8`).trimStart().split(/\r*\n/,1)[0]??``)}catch{return null}}function pickBinMap(n,a){let S=a.gjsify;if(S?.bin!==void 0)return normalizeBin(n,S.bin);let C=a.bin;return C===void 0?null:normalizeBin(n,C)}function normalizeBin(n,a){let S=new Map;if(typeof a==`string`){let C=n.startsWith(`@`)?n.slice(n.indexOf(`/`)+1):n;return S.set(C,a),S}for(let[n,C]of Object.entries(a))S.set(n,C);return S}function readJson(n){return JSON.parse(readFileSync(n,`utf-8`))}function binDirOnPath(n){let a=process.env.PATH??``,S=process.platform===`win32`?`;`:`:`,C=ds(n);return a.split(S).some(n=>n&&ds(n)===C)}function specToPackageName(n){if(n.startsWith(`@`)){let a=n.indexOf(`/`);if(a<0)return n;let S=n.indexOf(`@`,a);return S<0?n:n.slice(0,S)}let a=n.indexOf(`@`);return a<0?n:n.slice(0,a)}var BP,VP=__esmMin(()=>{ge(),ul(),am(),Ts(),uM(),jN(),BP=[`@gjsify/rolldown-native`,`@gjsify/lightningcss-native`,`@gjsify/oxfmt-native`]});function workspaceLinkTarget(n,a){return HP===`junction`?ds(a):hs(_s(n),a)}function isAbortedFromOverallTimeout(n){if(!n||typeof n!=`object`)return!1;let a=n.name;if(a===`AbortError`)return!0;let S=n.message;return!!(typeof S==`string`&&S.includes(`install-overall-timeout`)||a===`RegistryTimeoutError`)}function forceExit(n){process.exitCode=n,!gjsExit(n)&&process.exit(n)}function readCliVersionFrom(n){try{if(!existsSync(n))return null;let a=JSON.parse(readFileSync(n,`utf-8`));if(a.name===GP&&typeof a.version==`string`)return a.version}catch{}return null}function readRunningCliVersion(){try{let n=_s(ds(fileURLToPath(import.meta.url)));for(let a=0;a<8&&n!==_s(n);a++){let a=readCliVersionFrom(ms(n,`package.json`));if(a)return a;n=_s(n)}}catch{}return null}function readWorkspaceCliVersion(n){return readCliVersionFrom(ms(n,`node_modules`,GP,`package.json`))??readCliVersionFrom(ms(n,`packages`,`infra`,`cli`,`package.json`))}function warnOnCliVersionSkew(n){if(process.env.GJSIFY_NO_VERSION_SKEW_WARNING===`1`)return;let a=readRunningCliVersion(),S=readWorkspaceCliVersion(n);!a||!S||a===S||he.warn(`gjsify install: version skew — you are running @gjsify/cli v${a}, but this workspace pins v${S}.\n A mismatched CLI can stall the install (lock discarded → full re-resolve) or silently produce a wrong build.\n Align them: run \`gjsify self-update\` (global CLI) or use the workspace-local \`node_modules/.bin/gjsify\`.\n Suppress this with GJSIFY_NO_VERSION_SKEW_WARNING=1.`)}function isWorkspaceRoot(n){let a=readPackageJson$1(ms(n,`package.json`));return a?a.workspaces!==void 0:!1}function depKindFromArgs(n){return n[`save-dev`]?`devDependencies`:n[`save-peer`]?`peerDependencies`:n[`save-optional`]?`optionalDependencies`:`dependencies`}async function projectInstallNative(n,a){let S=process.cwd(),C=ms(S,`package.json`),N=[`.pnp.cjs`,`.pnp.loader.mjs`].filter(n=>existsSync(ms(S,n)));if(N.length>0)throw Error(`gjsify install uses the node_modules linker and cannot run in a Yarn PnP project (found ${N.join(`, `)} in ${S}).\n\n• If this project uses \`gjsify install\` to manage dependencies, these PnP files are stale residue from an earlier \`yarn install\` — remove them and re-run:\n rm -f .pnp.cjs .pnp.loader.mjs && rm -rf .yarn/cache .yarn/unplugged\n gjsify install\n\n• If instead you want Yarn to manage dependencies, set \`nodeLinker: node-modules\` in .yarnrc.yml and run \`yarn install\` (not \`gjsify install\`).`);if(!n.packages||n.packages.length===0){let C=isWorkspaceRoot(S)?S:findWorkspaceRoot(S);if(C){C!==S&&he.log(`gjsify install: resolved workspace root ${C} (from ${S}); installing the workspace.`),await workspaceInstall(C,n,a);return}}let F,I=readPackageJson$1(C),H=I?projectSpecsFromPackageJson(I):[];if(n.packages&&n.packages.length>0){let a=new Set(n.packages.map(n=>parseSpec$2(n).name));F=[...H.filter(n=>!a.has(parseSpec$2(n).name)),...n.packages]}else{if(!I)throw Error(`gjsify install: no package.json in ${S}`);if(F=H,F.length===0){he.log(`gjsify install: no dependencies declared in package.json — nothing to do.`);return}}mkdirSync(S,{recursive:!0});let W=makeProgressReporter({enabled:!n.verbose&&!n.quiet&&n.progress!==!1}),K=await acquireInstallLock(S,{signal:a});try{let N=await installPackages({prefix:S,specs:F,verbose:n.verbose,lockfile:!n.immutable,frozen:n.immutable,refreshLockfile:n[`refresh-lockfile`],signal:a,progress:W});if(n.packages&&n.packages.length>0&&I){let a=depKindFromArgs(n);for(let S of n.packages){let{name:n,range:C}=parseSpec$2(S),F=N.installed.find(a=>a.name===n);addDependencyEntry(I,n,C??(F?defaultRangeFromVersion(F.version):`latest`),a)}writePackageJson(C,I),n.immutable||syncLockfileRequested(S,projectSpecsFromPackageJson(I))}}finally{K.release()}}function syncLockfileRequested(n,a){let S=ms(n,`gjsify-lock.json`);if(existsSync(S))try{let n=JSON.parse(readFileSync(S,`utf-8`)),C=[...a].sort(),N=[...n.requested??[]].sort();if(C.length===N.length&&C.every((n,a)=>n===N[a]))return;n.requested=a,atomicWriteStrict(S,JSON.stringify(n,null,2)+`
|
|
893
|
+
`)}catch{}}async function workspaceInstall(n,a,S){let C=await acquireInstallLock(n,{signal:S});try{await workspaceInstallLocked(n,a,S)}finally{C.release()}}async function workspaceInstallLocked(n,a,S){let C=discoverWorkspaces(n,{includeRoot:!0});if(C.length===0)throw Error(`gjsify install: ${n} has a "workspaces" field but no workspaces were discovered`);let N=new Map(C.map(n=>[n.name,n])),F=new Set,I=new Map,H=[];for(let n of C){let a=n.manifest;for(let S of[`dependencies`,`devDependencies`,`optionalDependencies`]){let C=a[S];if(C)for(let[a,S]of Object.entries(C)){if(typeof S!=`string`)continue;let C=N.get(a);if(C&&!/^(link|file|portal|git\+|https?):/.test(S)){H.push({fromWorkspaceName:n.name,depName:a,targetLocation:C.location});continue}if(S.startsWith(`workspace:`))throw Error(`gjsify install: ${n.name} declares "${a}: ${S}" but no workspace with that name exists`);if(/^(link|file|portal|git\+|https?):/.test(S))continue;let W=`${a}@${S}`;F.add(W);let K=I.get(W);K||(K=new Set,I.set(W,K)),K.add(n.name)}}}he.log(`gjsify install: ${C.length} workspace(s), ${F.size} external dep spec(s), ${H.length} workspace symlink(s)`),writeWorkspaceBinShims(n,C);let wireWorkspaceSymlinks=async()=>{if(H.length>0){let n=await Promise.resolve().then(()=>(Hc(),zc)),a=new Set,S=[];for(let n of H){let C=N.get(n.fromWorkspaceName);if(!C)continue;let F=ms(C.location,`node_modules`,n.depName);a.add(_s(F));let I=workspaceLinkTarget(F,n.targetLocation);S.push({linkPath:F,relTarget:I})}await Promise.all([...a].map(a=>n.mkdir(a,{recursive:!0})));let C=0,F=[],wireOne=async(a,S)=>{try{await n.rm(a,{recursive:!0,force:!0,maxRetries:10,retryDelay:100})}catch{}await n.symlink(S,a,HP)};for(let n=0;n<Math.min(32,S.length);n++)F.push((async()=>{for(;;){let n=C++;if(n>=S.length)return;let a=S[n];if(!a)return;await wireOne(a.linkPath,a.relTarget)}})());await Promise.all(F),he.log(`gjsify install: wired ${H.length} workspace symlink(s)`)}let a=ms(n,`node_modules`),S=0;for(let N of C){if(N.location===n||!N.name)continue;let C=ms(a,N.name),F=!1;try{lstatSync(C),F=!0}catch{}F||(mkdirSync(_s(C),{recursive:!0}),symlinkSync(workspaceLinkTarget(C,N.location),C,HP),S++)}S>0&&he.log(`gjsify install: hoisted ${S} workspace(s) to root node_modules/`)};await wireWorkspaceSymlinks();let W=C.find(a=>a.location===n)?.manifest,K=extractOverrides(W),q=K?.global,Y=new Map,X=new Set;if(K&&K.scoped.size>0){for(let n of C){let a=n.manifest;for(let S of[`dependencies`,`devDependencies`,`optionalDependencies`]){let C=a[S];if(C)for(let[a,S]of Object.entries(C)){let C=scopedOverrideFor(n,a,K);if(!C)continue;let N=C,F=n.location,I=Y.get(F);I||(I=new Set,Y.set(F,I)),I.add(`${a}@${N}`),X.add(`${a}@${S}`)}}}let n=new Set;for(let a of C)for(let S of[`dependencies`,`devDependencies`,`optionalDependencies`]){let C=a.manifest[S];if(C)for(let[S,N]of Object.entries(C))scopedOverrideFor(a,S,K)||n.add(`${S}@${N}`)}for(let a of X)n.has(a)||F.delete(a);Y.size>0&&he.log(`gjsify install: ${Y.size} workspace(s) have scoped overrides — they will install their overridden deps locally after the root install`)}if(F.size>0){let C=makeProgressReporter({enabled:!a.verbose&&!a.quiet&&a.progress!==!1});await installPackages({prefix:n,specs:[...F],verbose:a.verbose,lockfile:!a.immutable,frozen:a.immutable,refreshLockfile:a[`refresh-lockfile`],overrides:q,signal:S,progress:C,workspaceNames:new Set(N.keys()),specOrigins:new Map([...I].map(([n,a])=>[n,[...a]]))})}else a.verbose&&he.log(`gjsify install: no external deps to fetch`);for(let[n,F]of Y){if(F.size===0)continue;let I=C.find(a=>a.location===n)?.name??n;a.verbose&&he.log(`gjsify install: ${I} — installing ${F.size} scoped-override spec(s) into ${n}/node_modules/`),await installPackages({prefix:n,specs:[...F],verbose:a.verbose,lockfile:!a.immutable,frozen:a.immutable,signal:S,workspaceNames:new Set(N.keys())})}await wireWorkspaceSymlinks();let te=writeWorkspaceBinShims(n,C);te>0&&he.log(`gjsify install: linked ${te} workspace bin(s) into node_modules/.bin/`)}function writeWorkspaceBinShims(n,a){let S=ms(n,`node_modules`,`.bin`),C=detectNativePackages(n).map(n=>n.prebuildsDir),N=0;for(let F of a){let a=F.manifest,I=a.gjsify?.bin,H=a.bin,W=mergeWorkspaceBins(F.name,I,H);if(W.size!==0){mkdirSync(S,{recursive:!0});for(let[a,{nodeTarget:I,gjsTarget:H}]of W){let W=ms(S,a);for(let n of[W,`${W}.cmd`,`${W}.ps1`])try{rmSync(n,{force:!0,maxRetries:10,retryDelay:100})}catch{}if(writeFileSync(W,buildBinShim(F.location,I,H,C,process.platform,n),{mode:493}),chmodSync(W,493),process.platform===`win32`)for(let[n,a]of Object.entries(buildWorkspaceBinShimsForWindows(F.location,I,H,C)))writeFileSync(`${W}.${n}`,a,{mode:493});N++}}}return N}function extractOverrides(n){if(!n)return;let a={},S=new Map,merge=(n,C)=>{if(n){for(let[N,F]of Object.entries(n))if(!N.startsWith(`_`)){if(typeof F==`string`){let n=N,S=N.startsWith(`@`)?N.indexOf(`@`,1):N.indexOf(`@`);S>0&&(n=N.slice(0,S)),a[n]=F;continue}if(F&&typeof F==`object`&&!Array.isArray(F)){let n={};for(let[a,S]of Object.entries(F)){if(a.startsWith(`_`))continue;if(typeof S!=`string`){he.warn(`gjsify install: ${C}["${N}"]["${a}"] is not a string — only one level of nesting is supported, skipping`);continue}let F=a,I=a.startsWith(`@`)?a.indexOf(`@`,1):a.indexOf(`@`);I>0&&(F=a.slice(0,I)),n[F]=S}if(Object.keys(n).length>0){let a=S.get(N)??{};S.set(N,{...a,...n})}continue}he.warn(`gjsify install: ${C}["${N}"] is not a string or object — skipping`)}}};if(merge(n.overrides,`overrides`),merge(n.resolutions,`resolutions`),!(Object.keys(a).length===0&&S.size===0))return{global:a,scoped:S}}function scopedOverrideFor(n,a,S){if(!S||S.scoped.size===0)return;let C=[n.name,n.relativeLocation];for(let n of C){let C=S.scoped.get(n);if(C?.[a])return C[a]}}function buildBinShim(n,a,S,C=[],N=process.platform,F=n){let I=a?ms(n,a):null,H=S?ms(n,S):null,W=buildNativeEnvPreamble(F,C,{platform:N});if(I&&H)return`#!/bin/sh\nif command -v gjs >/dev/null 2>&1 && [ -f "${H}" ]; then\n${W}exec gjs -m "${H}" "$@"\nfi\nexec node "${I}" "$@"\n`;if(I)return`#!/bin/sh\nexec node "${I}" "$@"\n`;if(H)return`#!/bin/sh\n${W}exec gjs -m "${H}" "$@"\n`;throw Error(`buildBinShim: either nodeTarget or gjsTarget must be provided`)}function buildWorkspaceBinShimsForWindows(n,a,S,C=[]){let N=a?ms(n,a):null,F=S?ms(n,S):null;if(N)return buildLauncherShims({interpreter:`node`,target:N});if(F){let n=C.join(`;`);return buildLauncherShims({interpreter:`gjs`,interpreterArgs:[`-m`],target:F,prependEnv:C.length===0?{}:{GI_TYPELIB_PATH:n,PATH:n}})}throw Error(`buildWorkspaceBinShimsForWindows: either nodeTarget or gjsTarget must be provided`)}function mergeWorkspaceBins(n,a,S){let C=new Map,N=n.startsWith(`@`)?n.slice(n.indexOf(`/`)+1):n,get=n=>{let a=C.get(n);return a||(a={},C.set(n,a)),a};if(typeof S==`string`)get(N).nodeTarget=S;else if(S&&typeof S==`object`)for(let[n,a]of Object.entries(S))typeof a==`string`&&a.length>0&&(get(n).nodeTarget=a);if(typeof a==`string`)get(N).gjsTarget=a;else if(a&&typeof a==`object`)for(let[n,S]of Object.entries(a))typeof S==`string`&&S.length>0&&(get(n).gjsTarget=S);return C}async function projectInstallViaNpm(n){let a=[`install`];n[`save-dev`]&&a.push(`--save-dev`),n[`save-peer`]&&a.push(`--save-peer`),n[`save-optional`]&&a.push(`--save-optional`),n.verbose&&a.push(`--loglevel`,`verbose`),n.packages&&n.packages.length>0&&a.push(...n.packages),await spawnNpm(a)}async function spawnNpm(n){return spawnToCompletion(`npm`,n,{completion:`return`,notFound:()=>Error(`npm not found on PATH — install Node.js first.`)}).then(({code:n})=>{if(n!==0)throw Error(`npm install exited with code ${n}`)}).catch(n=>{let a=n.code;he.error(a===void 0?n.message:`npm install failed: ${n.message}`),process.exit(1)})}async function installGlobalAndLink(n,a){let S=defaultGlobalLayout();mkdirSync(S.prefix,{recursive:!0}),he.log(`gjsify install --global → ${S.prefix}`),he.log(` bins → ${S.binDir}`);let C=await acquireInstallLock(S.prefix,{});try{let C=await installPackages({prefix:S.prefix,specs:n,verbose:a.verbose}),N=n.map(specToPackageName);if(N.includes(`@gjsify/cli`)){let n=C.installed.find(n=>n.name===`@gjsify/cli`)?.version??`latest`;await installGjsEnginePackages(S.prefix,n,{verbose:a.verbose})}reportLinkedBins(linkGlobalBins(N,S),S.binDir)}finally{C.release()}}function reportLinkedBins(n,a){if(n.length===0)he.warn("\nNo bins declared (neither `gjsify.bin` nor `bin` in package.json) — nothing was symlinked.");else{he.log(`\nLinked ${n.length} bin(s):`);for(let a of n)he.log(` • ${a.link} → ${a.target}`)}n.length>0&&!binDirOnPath(a)&&he.warn(`\nNote: ${a} is not on your PATH.\nAdd it to your shell rc file:\n export PATH="${a}:$PATH"`)}async function runPostInstallChecks(){he.log(`
|
|
894
894
|
--- gjsify post-install checks ---`);let n=runMinimalChecks().filter(n=>!n.found&&n.severity===`required`);if(n.length>0){he.warn(`Missing required system dependencies:
|
|
895
|
-
`);for(let a of n)he.warn(` ✗ ${a.name}`);let a=buildInstallCommand(detectPackageManager$2(),n);a&&he.warn(`\nInstall with:\n ${a}`)}else he.log(`System dependencies OK.`);let a=detectNativePackages(process.cwd());if(a.length>0){he.log(`\nDetected ${a.length} @gjsify/* package(s) with native prebuilds:`);for(let n of a)he.log(` • ${n.name}`);he.log("\nUse `gjsify run <bundle>` to launch with LD_LIBRARY_PATH/GI_TYPELIB_PATH set.")}maybeInstallGitHooks()}function maybeInstallGitHooks(){let n=process.cwd(),a=ms(n,`scripts`,`install-git-hooks.mjs`);if(existsSync(a)&&existsSync(ms(n,`.git`)))try{let S=spawnSync(nodeBinary(),[a,`--quiet`],{cwd:n,stdio:`inherit`,env:process.env});S.status!==0&&he.warn(`[gjsify install] scripts/install-git-hooks.mjs exited ${S.status} — git hooks may not be active.`)}catch(n){he.warn(`[gjsify install] git hook installation skipped: ${n instanceof Error?n.message:String(n)}`)}}var
|
|
895
|
+
`);for(let a of n)he.warn(` ✗ ${a.name}`);let a=buildInstallCommand(detectPackageManager$2(),n);a&&he.warn(`\nInstall with:\n ${a}`)}else he.log(`System dependencies OK.`);let a=detectNativePackages(process.cwd());if(a.length>0){he.log(`\nDetected ${a.length} @gjsify/* package(s) with native prebuilds:`);for(let n of a)he.log(` • ${n.name}`);he.log("\nUse `gjsify run <bundle>` to launch with LD_LIBRARY_PATH/GI_TYPELIB_PATH set.")}maybeInstallGitHooks()}function maybeInstallGitHooks(){let n=process.cwd(),a=ms(n,`scripts`,`install-git-hooks.mjs`);if(existsSync(a)&&existsSync(ms(n,`.git`)))try{let S=spawnSync(nodeBinary(),[a,`--quiet`],{cwd:n,stdio:`inherit`,env:process.env});S.status!==0&&he.warn(`[gjsify install] scripts/install-git-hooks.mjs exited ${S.status} — git hooks may not be active.`)}catch(n){he.warn(`[gjsify install] git hook installation skipped: ${n instanceof Error?n.message:String(n)}`)}}var HP,UP,WP,GP,KP=__esmMin(()=>{ge(),ul(),Ts(),nn(),Gm(),bm(),N_(),EM(),uM(),jN(),BN(),fN(),xN(),gM(),jM(),F_(),VP(),_M(),HP=process.platform===`win32`?`junction`:void 0,UP=18e5,WP={command:`install [packages..]`,description:`Install npm dependencies in the current project (or globally with -g), then run gjsify-aware post-checks.`,builder:n=>n.positional(`packages`,{description:`Optional package specs. With none, runs a full project install.`,type:`string`,array:!0}).option(`global`,{description:`Install into the user-global XDG location and symlink bins into ~/.local/bin.`,type:`boolean`,alias:`g`,default:!1}).option(`save-dev`,{type:`boolean`,alias:`D`}).option(`save-peer`,{type:`boolean`}).option(`save-optional`,{type:`boolean`,alias:`O`}).option(`immutable`,{description:`CI mode: install strictly from gjsify-lock.json, fail if the lockfile is missing or stale. Equivalent to yarn --immutable / npm ci --frozen-lockfile.`,type:`boolean`,default:!1}).option(`refresh-lockfile`,{description:`Re-resolve every dependency to the newest version satisfying its range and rewrite the lockfile (bumps in-range transitive deps). Without it, a resolve preserves versions already pinned in the lockfile and only resolves new/changed deps — the npm/yarn/pnpm default. Mirrors yarn install --mode=update-lockfile.`,type:`boolean`,default:!1}).option(`verbose`,{description:`Verbose install logging.`,type:`boolean`,default:!1}).option(`quiet`,{description:`Silence the progress bar.`,type:`boolean`,default:!1}).option(`progress`,{description:`Show a TTY-aware progress bar for resolve / download / extract phases. Auto-enabled when stderr is a TTY (override with --no-progress). Implicitly off under --verbose (per-package log lines replace the bar) or --quiet.`,type:`boolean`,default:!0}).option(`backend`,{description:"Install backend. `native` (default) routes through `@gjsify/{semver,npm-registry,tar}` — no Node/npm at runtime. `npm` shells out to `npm install` as an escape hatch for cases the native backend does not yet model (Yarn PnP repos, lifecycle scripts). Overrides `GJSIFY_INSTALL_BACKEND` if both are set.",type:`string`,choices:[`native`,`npm`]}).option(`timeout`,{description:`Overall install wall-clock timeout in ms (default 1800000 = 30 min). On timeout, all in-flight registry fetches are aborted and the install exits non-zero with a clear "install timed out — likely a registry slowdown" message. Per-request timeouts in @gjsify/npm-registry (default 30s) still apply within this budget. Set to 0 to disable the overall budget.`,type:`number`,default:UP}),handler:async n=>{if(n.immutable){if(n.packages&&n.packages.length>0)return he.error(`gjsify install --immutable does not accept package arguments. Remove the package names or drop --immutable.`),process.exit(1);if(n.global)return he.error(`gjsify install --immutable is incompatible with --global.`),process.exit(1);if(n[`refresh-lockfile`])return he.error(`gjsify install --immutable is incompatible with --refresh-lockfile (--immutable forbids rewriting the lockfile). Drop one.`),process.exit(1)}if(n.global){if(!n.packages||n.packages.length===0)return he.error(`gjsify install --global requires at least one <pkg> argument.`),process.exit(1);for(let a of[`save-dev`,`save-peer`,`save-optional`])n[a]&&he.warn(`gjsify install --global ignores --${a}: global installs do not modify a project package.json.`);await installGlobalAndLink(n.packages,{verbose:n.verbose});return}if(warnOnCliVersionSkew(process.cwd()),(n.backend??process.env.GJSIFY_INSTALL_BACKEND??`native`)===`npm`){await projectInstallViaNpm(n),await runPostInstallChecks();return}let a=n.timeout>0?n.timeout:0,S=a>0?new AbortController:null,C=S===null?null:setTimeout(()=>S.abort(Error(`install-overall-timeout`)),a),N=a>0?setTimeout(()=>{let n=Math.round(a/100)/10;he.error(`gjsify install: the ${n}s budget elapsed and the abort did not unwind within 10s — forcing exit. That means one of two things, and this timer cannot distinguish them: the install was still WORKING (a cold tree here extracts several GB, and extraction blocks the loop in multi-second synchronous stretches), or a step genuinely wedged. Re-running tells you which, and is safe: extraction is idempotent, every package already on disk is skipped, so a second run finishes the remainder in a fraction of the time. A re-run that makes NO further progress is a real wedge — file an issue.`),forceExit(1)},a+1e4):null;N?.unref?.();try{await projectInstallNative(n,S?.signal),await runPostInstallChecks()}catch(n){if(S!==null&&S.signal.aborted&&isAbortedFromOverallTimeout(n)){let n=Math.round(a/100)/10;return he.error(`gjsify install: timed out after ${n}s — likely a registry slowdown or a wedged extract.\nRe-run, or override with --timeout <ms> (set --timeout 0 to disable the overall budget).`),process.exit(1)}throw n}finally{C!==null&&clearTimeout(C),N!==null&&clearTimeout(N)}}},GP=`@gjsify/cli`});function buildCacheEnabledByEnv(n=process.env){let a=n.GJSIFY_BUILD_CACHE;return a===void 0?!1:a!==``&&a!==`0`&&a!==`false`}function buildCacheRoot(n){return ms(n,`node_modules`,`.cache`,`gjsify`,`build`)}function sanitizePackageDirName(n){return`${n.replace(/^@/,``).replace(/[^A-Za-z0-9._-]/g,`-`)}-${createHash(`sha256`).update(n).digest(`hex`).slice(0,8)}`}function hashFileStream(n){let a=createHash(`sha256`),S=openSync(n,`r`);try{let n=Buffer.alloc(64*1024);for(;;){let C=readSync(S,n,0,n.length,null);if(C<=0)break;a.update(n.subarray(0,C))}}finally{closeSync(S)}return a.digest(`hex`)}function walkFiles(n,a,S){let C;try{C=readdirSync(n)}catch{return}C.sort();for(let N of C){if(N===`node_modules`)continue;let C=ms(n,N),F=a===``?N:`${a}/${N}`,I;try{I=lstatSync(C)}catch{continue}if(I.isSymbolicLink())try{let n=readlinkSync(C);S.push({rel:F,abs:C,link:n})}catch{}else I.isDirectory()?walkFiles(C,F,S):I.isFile()&&S.push({rel:F,abs:C})}}function hashPackageInputs(n){let a=[],S=ms(n,`package.json`);existsSync(S)&&a.push({rel:`package.json`,abs:S});let C=[];try{C=readdirSync(n)}catch{}for(let S of C.sort())/^tsconfig.*\.json$/.test(S)&&a.push({rel:S,abs:ms(n,S)});let N=ms(n,`src`);existsSync(N)&&walkFiles(N,`src`,a);let F=createHash(`sha256`);F.update(`gjsify-build-cache-inputs/v2
|
|
896
896
|
`);for(let n of a){if(n.link!==void 0){let a;try{a=hashFileStream(n.abs)}catch{a=`link:${n.link}`}F.update(`${n.rel} ${a}\n`);continue}try{F.update(`${n.rel} ${hashFileStream(n.abs)}\n`)}catch{F.update(`${n.rel} unreadable\n`)}}return F.digest(`hex`)}function hashOutputDirs(n,a){let S=createHash(`sha256`);S.update(`gjsify-build-cache-outputs/v2
|
|
897
|
-
`);for(let C of[...a].sort()){let a=ms(n,C);if(!existsSync(a)){S.update(`${C} absent\n`);continue}let N=[];walkFiles(a,C,N);for(let n of N){if(n.link!==void 0){S.update(`${n.rel} link:${n.link}\n`);continue}try{S.update(`${n.rel} ${hashFileStream(n.abs)}\n`)}catch{S.update(`${n.rel} unreadable\n`)}}}return S.digest(`hex`)}function outputUnits(n){let a=[];for(let S of
|
|
898
|
-
`),a.update(`script:${n.script}\n`);for(let S of n.args??[])a.update(`arg:${S}\n`);for(let S of Object.keys(n.toolchain).sort())a.update(`tool:${S}@${n.toolchain[S]}\n`);a.update(`self:${n.ownHash}\n`);let S=n.depHashes instanceof Map?n.depHashes:new Map(Object.entries(n.depHashes));for(let n of[...S.keys()].sort())a.update(`dep:${n} ${S.get(n)}\n`);return a.digest(`hex`).slice(0,32)}function resolveToolchainVersions(n){let a={};for(let S of
|
|
899
|
-
`)),process.exit(1),Error(`gjsify foreach: --include matched no workspace`)}function stripSurroundingQuotes(n){return n.length>=2&&(n[0]===`'`||n[0]===`"`)&&n[n.length-1]===n[0]?n.slice(1,-1):n}async function runSequential(n,a,S,C,N,F){for(let I of n)await runOne$1(I,a,S,!1,C,N,F)}async function runParallel(n,a,S,C,N,F,I){let H=0,W=[];for(let K=0;K<C;K++)W.push((async()=>{for(;H<n.length;)await runOne$1(n[H++],a,S,!0,N,F,I)})());await Promise.all(W)}async function runTopologicalParallel(n,a,S,C,N,F,I,H){let W=new Set(n.map(n=>n.name)),K=new Map;for(let a of n){let n=new Set,S=a.manifest;for(let a of[S.dependencies,F?S.devDependencies:void 0,S.optionalDependencies])if(a)for(let[S,C]of Object.entries(a))typeof C==`string`&&C.startsWith(`workspace:`)&&W.has(S)&&n.add(S);K.set(a.name,n)}let q=new Map(n.map(n=>[n.name,n])),Y=n.length,X=new Set,te=0,ne=!process.stdout.isTTY||N,re=new Map,ie=Number(process.env.GJSIFY_FOREACH_STALL_MINUTES??`20`),ae=(Number.isFinite(ie)&&ie>0?ie:20)*6e4;return new Promise((n,F)=>{let W=null,ie=Date.now(),describeInflight=()=>[...re.entries()].map(([n,a])=>`${n} (${Math.round((Date.now()-a)/1e3)}s)`).join(`, `),failFast=n=>{W||(W=n,killActiveChildren(),setTimeout(()=>settle(),ZP).unref?.())},oe=setInterval(()=>{let n=Date.now()-ie;n<3e5||re.size===0||(he.error(`[gjsify foreach] WARNING: no workspace completed for ${Math.round(n/6e4)}min — in-flight: ${describeInflight()}`),n>=ae&&failFast(Error(`gjsify foreach: stalled — no workspace completed for ${Math.round(n/6e4)}min (override via GJSIFY_FOREACH_STALL_MINUTES); killed in-flight: ${describeInflight()}`)))},6e4);oe.unref?.();let settle=()=>{clearInterval(oe),W?F(W):n()},pump=()=>{if(!W){for(;te<C;){let n=[...K.entries()].filter(([,n])=>[...n].every(n=>X.has(n))).map(([n])=>n);if(n.length===0)break;let C=n.sort()[0];K.delete(C),te++,re.set(C,Date.now()),ne&&he.error(`[gjsify foreach] start ${C} (${X.size}/${Y} done, ${te} in flight)`),runOne$1(q.get(C),a,S,!0,N,I,H).then(()=>{X.add(C)}).catch(n=>{failFast(n instanceof Error?n:Error(String(n)))}).finally(()=>{te--,re.delete(C),ie=Date.now(),W?te===0&&settle():K.size===0&&te===0?settle():pump()})}K.size>0&&te===0&&!W&&(clearInterval(oe),F(Error(`gjsify foreach --topological: stuck — workspaces ${[...K.keys()].join(`, `)} have unsatisfied deps in the selected set`)))}};pump()})}async function runOne$1(n,a,S,C,N,F,I){if(F){N&&he.error(`[${n.name}] $ ${a} ${S.join(` `)}`),await spawnPrefixed(a,S,n.location,C?`[${n.name}] `:null);return}if(I&&I.tryRestore(n))return;let H=I?.snapshotOutputs(n),W=detectPackageManager$1(),K=W===`gjsify`?[`run`,a,...S]:[`run`,a,...S.length>0?[`--`,...S]:[]];N&&he.error(`[${n.name}] $ ${W} ${K.join(` `)}`),await spawnPrefixed(W,K,n.location,C?`[${n.name}] `:null),I&&H&&I.storeAfterSuccess(n,H)}function detectPackageManager$1(){if(isGjs())return`gjsify`;let n=process.env.npm_config_user_agent??``;return n.startsWith(`yarn/`)?`yarn`:n.startsWith(`gjsify/`)?`gjsify`:`npm`}async function spawnPrefixed(n,a,S,C){let N=null,F=[];try{let I=await spawnToCompletion(n,a,{completion:`exit`,cwd:S,stdio:C?`pipe`:`inherit`,color:!0,onSpawn:n=>{N=n,YP.add(n);let a=!process.stdout.isTTY;C&&n.stdout&&n.stderr&&(F.push(prefixLines(n.stdout,process.stdout,C,a)),F.push(prefixLines(n.stderr,process.stderr,C,a)))}});for(let n of F)n();if(I.code!==0)throw Error(`${n} ${a.join(` `)} exited with code ${I.code}`)}finally{N&&YP.delete(N)}}var YP,XP,ZP,QP,$P=__esmMin(()=>{ge(),jM(),ul(),am(),N_(),F_(),kM(),JP(),bm(),YP=new Set,XP=5e3,ZP=15e3,QP={command:`foreach [script] [args..]`,description:"Run a workspace script across all (or filtered) workspaces. Drop-in for `yarn workspaces foreach`: -A/--all, -p/--parallel, -t/--topological, --include, --exclude, --no-private. Pass --exec to run an arbitrary command instead of a script.",builder:n=>n.positional(`script`,{description:"Script name to run in each workspace (`run <name>`-equivalent). With --exec, the command to run instead.",type:`string`}).positional(`args`,{description:`Extra arguments forwarded to each child invocation.`,type:`string`,array:!0}).option(`all`,{description:"Include workspaces declared as `private: true`.",type:`boolean`,alias:`A`,default:!1}).option(`parallel`,{description:`Run workspaces in parallel (capped by --jobs).`,type:`boolean`,alias:`p`,default:!1}).option(`topological`,{description:`Wait for each workspace's deps to finish before starting it (production deps only).`,type:`boolean`,alias:`t`,default:!1}).option(`topological-dev`,{description:`Like --topological but also respects devDependencies (often cyclic — use sparingly).`,type:`boolean`,default:!1}).option(`include`,{description:`Glob pattern to include workspaces by name (repeatable). A pattern that matches NO discovered workspace is a hard error — a filter selecting nothing is a typo or a caller-side quoting bug, never an intent.`,type:`string`,array:!0}).option(`exclude`,{description:`Glob pattern to exclude workspaces by name (repeatable).`,type:`string`,array:!0}).option(`private`,{description:`Include private workspaces (default true). Pass --no-private to skip them.`,type:`boolean`,default:!0}).option(`verbose`,{description:`Echo every spawned command before running it.`,type:`boolean`,alias:`v`,default:!1}).option(`jobs`,{description:`Maximum concurrent workspaces in --parallel mode (default: cpu count).`,type:`number`,alias:`j`}).option(`exec`,{description:"Treat <script> [args..] as an arbitrary command (yarn `workspaces foreach exec`-equivalent) instead of a package.json script lookup. Workspace filtering by script presence is skipped. Use `-- <cmd> <args...>` to pass flags to the command without yargs intercepting them.",type:`boolean`,default:!1}).option(`cached`,{description:`Content-hash build cache (ADR 0006): skip a workspace whose inputs (src/**, package.json, tsconfig*.json, transitive workspace deps, toolchain versions) are unchanged and restore its stored outputs instead; on miss run the script and store the output dirs it modified. Script mode only. Default from GJSIFY_BUILD_CACHE=1.`,type:`boolean`}).option(`shard`,{description:`Run only a deterministic slice "<index>/<total>" (1-based) of the matched workspaces, e.g. --shard 2/4. For fanning a long run across parallel CI jobs. Partitions by sorted name (round-robin) so the shards are disjoint and their union is the full set; order-independent, so safe for tests but NOT for ordered builds.`,type:`string`}).parserConfiguration({"populate--":!0}),handler:async n=>{let a=findWorkspaceRoot(process.cwd())??process.cwd(),S=discoverWorkspaces(a),C=n.exec===!0,N=n.script,F=n.args??[];if(!C){let a=(n[`--`]??[]).filter(n=>typeof n==`string`);a.length>0&&(F=[...F,...a])}if(C){let a=(n[`--`]??[]).filter(n=>typeof n==`string`);if(a.length>0&&(N?F=[...F,...a]:(N=a[0],F=[...F,...a.slice(1)])),!N)return he.error("gjsify foreach --exec: missing command. Pass it after `--`, e.g. `gjsify foreach --exec -- npm publish --tag latest`."),process.exit(1)}assertEveryIncludeMatches(S,n.include);let I=filterWorkspaces(S,{include:n.include,exclude:n.exclude,noPrivate:n.private===!1});if(!C){if(!N)return he.error(`gjsify foreach: missing <script> positional. Pass --exec to run an arbitrary command instead.`),process.exit(1);let n=N;I=I.filter(a=>typeof(a.manifest.scripts??{})[n]==`string`)}if(typeof n.shard==`string`&&n.shard.length>0){let a=/^\s*(\d+)\s*\/\s*(\d+)\s*$/.exec(n.shard);if(!a)return he.error(`gjsify foreach: invalid --shard "${n.shard}" — expected "<index>/<total>" (1-based), e.g. 2/4.`),process.exit(1);let S=Number(a[1]),C=Number(a[2]);if(C<1||S<1||S>C)return he.error(`gjsify foreach: invalid --shard "${n.shard}" — need 1 <= index <= total and total >= 1.`),process.exit(1);if(C>1){let n=[...I].sort((n,a)=>n.name<a.name?-1:+(n.name>a.name));I=n.filter((n,a)=>a%C===S-1),he.log(`gjsify foreach: shard ${S}/${C} → ${I.length} of ${n.length} workspace(s)`)}}if(I.length===0){he.log(`gjsify foreach: no workspaces match (${C?`exec`:`script`}="${N}", include=${JSON.stringify(n.include??[])}, exclude=${JSON.stringify(n.exclude??[])})`);return}(n.topological||n[`topological-dev`])&&(I=topologicalSort(buildDependencyGraph(I,{includeDev:n[`topological-dev`]===!0})));let H=n.verbose===!0,W=N,K=n.cached??buildCacheEnabledByEnv();if(n.cached===!0&&C)return he.error(`gjsify foreach: --cached only applies to script mode, not --exec.`),process.exit(1);let q=K&&!C?new BuildCacheRunner({root:a,workspaces:S,script:W,args:F,targets:I.map(n=>n.name)}):void 0;try{if(n.parallel&&!n.topological&&!n[`topological-dev`]){let a=n.jobs&&n.jobs>0?n.jobs:cpus().length;await runParallel(I,W,F,a,H,C,q)}else if(n.parallel){let a=n.jobs&&n.jobs>0?n.jobs:cpus().length;await runTopologicalParallel(I,W,F,a,H,n[`topological-dev`]===!0,C,q)}else await runSequential(I,W,F,H,C,q)}catch(n){return killActiveChildren(),he.error(n.message),process.exit(1)}process.exit(0)}},__name$1(runOne$1,`runOne`),__name$1(detectPackageManager$1,`detectPackageManager`)});function editDistance(n,a){if(n===a)return 0;if(n.length===0)return a.length;if(a.length===0)return n.length;let S=Array.from({length:a.length+1},(n,a)=>a),C=Array.from({length:a.length+1},()=>0);for(let N=1;N<=n.length;N++){C[0]=N;for(let F=1;F<=a.length;F++){let I=n[N-1]===a[F-1]?0:1;C[F]=Math.min(S[F]+1,C[F-1]+1,S[F-1]+I)}[S,C]=[C,S]}return S[a.length]}function suggestClosest(n,a){if(a.length===0)return;let S=n.toLowerCase(),C=Math.max(2,Math.floor(n.length/3)),N,F=1/0;for(let n of a){let a=editDistance(S,n.toLowerCase());a<F&&(F=a,N=n)}return N!==void 0&&F<=C?N:void 0}var eF=__esmMin(()=>{});function collectTransitiveClosure(n,a,S){let C=new Map;for(let n of a)C.set(n.name,n);let N=new Set,F=[],I=[n];for(;I.length>0;){let n=I.pop();if(N.has(n.name))continue;N.add(n.name),F.push(n);let a=n.manifest,H=[a.dependencies,S?a.devDependencies:void 0,a.optionalDependencies];for(let n of H)if(n)for(let[a,S]of Object.entries(n)){if(typeof S!=`string`||!S.startsWith(`workspace:`))continue;let n=C.get(a);n&&(N.has(n.name)||I.push(n))}}return F}async function runOne(n,a,S,C,N,F){if(F&&F.tryRestore(n))return;let I=F?.snapshotOutputs(n),H=C===`gjsify`?[`run`,a,...S]:[`run`,a,...S.length>0?[`--`,...S]:[]];N&&he.error(`[${n.name}] $ ${C} ${H.join(` `)}`);let{code:W}=await spawnToCompletion(C,H,{completion:`exit`,cwd:n.location,color:!0});if(W!==0)throw Error(`${C} ${H.join(` `)} exited with code ${W}`);F&&I&&F.storeAfterSuccess(n,I)}function detectPackageManager(){if(isGjs())return`gjsify`;let n=process.env.npm_config_user_agent??``;return n.startsWith(`yarn/`)?`yarn`:n.startsWith(`gjsify/`)?`gjsify`:`npm`}var tF,nF=__esmMin(()=>{ge(),jM(),N_(),F_(),JP(),bm(),eF(),tF={command:`workspace <name> <script> [args..]`,description:"Run a workspace script. Both `workspace <name> <script>` and the yarn spelling `workspace <name> run <script>` work.",builder:n=>n.positional(`name`,{description:"Workspace name (matches package.json `name` field).",type:`string`,demandOption:!0}).positional(`script`,{description:`Script name to run inside that workspace.`,type:`string`,demandOption:!0}).positional(`args`,{description:`Extra arguments forwarded to the script.`,type:`string`,array:!0}).option(`with-dependencies`,{description:"Pre-build the target workspace's transitive workspace dependencies in topological order before running the script in the target. Deps that don't declare the script are skipped (--if-present behaviour). Replaces manual `gjsify workspace A build && gjsify workspace B build && …` chains.",type:`boolean`,alias:[`d`,`t`,`topological`],default:!1}).option(`include-dev`,{description:"When --with-dependencies is set, also walk devDependencies (production deps only by default — matches `gjsify foreach -t`).",type:`boolean`,default:!1}).option(`continue-on-error`,{description:`When --with-dependencies is set, keep running remaining deps after one fails (default: stop on first failure).`,type:`boolean`,default:!1}).option(`verbose`,{description:`Echo every spawned command before running it.`,type:`boolean`,alias:`v`,default:!1}).option(`cached`,{description:`Content-hash build cache (ADR 0006): skip the script for a workspace whose inputs (src/**, package.json, tsconfig*.json, transitive workspace deps, toolchain versions) are unchanged and restore its stored outputs instead; on miss run it and store the output dirs it modified. Also applies to the deps run via --with-dependencies. Default from GJSIFY_BUILD_CACHE=1.`,type:`boolean`}),handler:async n=>{let a=findWorkspaceRoot(process.cwd())??process.cwd(),S=discoverWorkspaces(a),C=S.find(a=>a.name===n.name);if(!C){let C=suggestClosest(n.name,S.map(n=>n.name)),N=C?` — did you mean "${C}"?`:``;return he.error(`gjsify workspace: no workspace named "${n.name}"${N} (discovered ${S.length} workspace(s) under ${a})`),process.exit(1)}let N=detectPackageManager(),F=n.verbose===!0,I=n[`with-dependencies`]===!0,H=n[`continue-on-error`]===!0,W=n.script,K=n.args??[];W===`run`&&K.length>0&&([W,...K]=K);let q=C.manifest.scripts??{};if(typeof q[W]!=`string`){let a=suggestClosest(W,Object.keys(q));return he.error(`gjsify workspace: workspace "${n.name}" has no script "${W}"`+(a?` — did you mean "${a}"?`:``)),process.exit(1)}let Y;Y=I?topologicalSort(buildDependencyGraph(collectTransitiveClosure(C,S,n[`include-dev`]===!0),{includeDev:n[`include-dev`]===!0})):[C];let X=n.cached??buildCacheEnabledByEnv()?new BuildCacheRunner({root:a,workspaces:S,script:W,args:K,targets:Y.map(n=>n.name)}):void 0,te=[];for(let n of Y){if(typeof(n.manifest.scripts??{})[W]!=`string`){F&&he.error(`[${n.name}] (no "${W}" script — skipping)`);continue}try{await runOne(n,W,K,N,F,X)}catch(a){let S=a instanceof Error?a:Error(String(a));if(he.error(`[${n.name}] ${S.message}`),!H)return process.exit(1);te.push({workspace:n.name,error:S})}}return te.length>0?(he.error(`gjsify workspace: ${te.length} workspace(s) failed: ${te.map(n=>n.workspace).join(`, `)}`),process.exit(1)):process.exit(0)}}});async function runLifecycleScript(n,a,S,C={}){let N=(a.scripts??{})[S];if(typeof N!=`string`){if(C.optional!==!1)return!1;throw Error(`gjsify lifecycle-script: no "${S}" in ${n}/package.json`)}let F=findWorkspaceRoot(n),I=[ms(n,`node_modules`,`.bin`)];F&&F!==n&&I.push(ms(F,`node_modules`,`.bin`));let H=process.env.FORCE_COLOR!==void 0||process.env.NO_COLOR!==void 0?{}:{FORCE_COLOR:`1`},W={...process.env,...H,PATH:[...I,process.env.PATH??``].filter(Boolean).join(Cs),npm_lifecycle_event:S,npm_package_name:a.name??``,npm_package_version:a.version??``,...C.env},K=C.stdio===`inherit-stderr`?[`inherit`,2,2]:C.stdio??`inherit`;return await new Promise((a,C)=>{let F=spawn(N,[],{cwd:n,env:W,stdio:K,shell:!0});F.on(`close`,N=>{N===0?a():C(Error(`gjsify lifecycle-script: "${S}" in ${n} exited with code ${N}`))}),F.on(`error`,C)}),!0}var rF=__esmMin(()=>{Gm(),Ts(),F_()});async function packWorkspace(n,a={}){let S=ms(n,`package.json`);if(!existsSync(S))throw Error(`gjsify pack: no package.json at ${n}`);let C=readFileSync(S,`utf-8`),N=JSON.parse(C),F=typeof N.name==`string`?N.name:``,I=typeof N.version==`string`?N.version:`0.0.0`;if(!F)throw Error(`gjsify pack: package.json at ${n} has no "name"`);let H=a.lifecycleScripts??[`prepack`];for(let S of H)await runLifecycleScript(n,N,S,{optional:!0,stdio:a.lifecycleStdio});let W=readFileSync(S,`utf-8`),K=W===C?N:JSON.parse(W),q=a.skipWorkspaceRewrite?K:rewriteWorkspaceDeps(K,n),Y=JSON.stringify(q,null,indentOf(W))+`
|
|
897
|
+
`);for(let C of[...a].sort()){let a=ms(n,C);if(!existsSync(a)){S.update(`${C} absent\n`);continue}let N=[];walkFiles(a,C,N);for(let n of N){if(n.link!==void 0){S.update(`${n.rel} link:${n.link}\n`);continue}try{S.update(`${n.rel} ${hashFileStream(n.abs)}\n`)}catch{S.update(`${n.rel} unreadable\n`)}}}return S.digest(`hex`)}function outputUnits(n){let a=[];for(let S of qP){let C=ms(n,S);if(!existsSync(C))continue;let N;try{N=readdirSync(C).filter(n=>n!==`node_modules`)}catch{continue}let F=N.every(n=>{try{return lstatSync(ms(C,n)).isDirectory()}catch{return!1}});if(N.length===0||!F){a.push(S);continue}for(let n of[...N].sort())a.push(`${S}/${n}`)}return a}function signatureOf(n,a){let S=[];walkFiles(ms(n,a),a,S);let C=createHash(`sha256`);for(let n of S){let a=`link`;if(n.link===void 0)try{let S=lstatSync(n.abs);a=`${S.size}:${S.mtimeMs}`}catch{a=`gone`}C.update(`${n.rel} ${a}\n`)}return C.digest(`hex`)}function snapshotOutputDirs(n){let a={};for(let n of qP)a[n]=null;for(let S of outputUnits(n))a[S]=signatureOf(n,S);return a}function modifiedOutputDirs(n,a){let S=[];for(let C of outputUnits(n))signatureOf(n,C)!==(a[C]??null)&&S.push(C);return S.sort()}function composeCacheKey(n){let a=createHash(`sha256`);a.update(`gjsify-build-cache/v2
|
|
898
|
+
`),a.update(`script:${n.script}\n`);for(let S of n.args??[])a.update(`arg:${S}\n`);for(let S of Object.keys(n.toolchain).sort())a.update(`tool:${S}@${n.toolchain[S]}\n`);a.update(`self:${n.ownHash}\n`);let S=n.depHashes instanceof Map?n.depHashes:new Map(Object.entries(n.depHashes));for(let n of[...S.keys()].sort())a.update(`dep:${n} ${S.get(n)}\n`);return a.digest(`hex`).slice(0,32)}function resolveToolchainVersions(n){let a={};for(let S of JP){let C=`none`;try{let a=readFileSync(ms(n,`node_modules`,...S.split(`/`),`package.json`),`utf-8`),N=JSON.parse(a);typeof N.version==`string`&&(C=N.version)}catch{}S===`@gjsify/cli`&&C===`none`&&(C=readOwnCliVersion()??`none`),a[S]=C}return a}function readOwnCliVersion(){try{let n=_s(fileURLToPath(import.meta.url));for(let a=0;a<4;a++){let a=ms(n,`package.json`);if(existsSync(a)){let n=JSON.parse(readFileSync(a,`utf-8`));if(n.name===`@gjsify/cli`&&typeof n.version==`string`)return n.version}n=_s(n)}}catch{}return null}function copyDirRecursive(n,a){mkdirSync(a,{recursive:!0});for(let S of readdirSync(n).sort()){let C=ms(n,S),N=ms(a,S),F=lstatSync(C);if(F.isSymbolicLink())replicateLinkSync(C,N);else if(F.isDirectory())copyDirRecursive(C,N);else if(F.isFile()){copyFileSync(C,N);try{chmodSync(N,F.mode&511)}catch{}}}}function buildCacheEntryDir(n,a,S){return ms(n,sanitizePackageDirName(a),S)}function readCacheEntry(n,a,S){let C=ms(YP(n,a,S),`manifest.json`);try{let N=JSON.parse(readFileSync(C,`utf-8`));if(N.version!==1||N.layout!==`v2`||N.package!==a||N.key!==S||!Array.isArray(N.dirs))return null;for(let C of N.dirs)if(!existsSync(ms(YP(n,a,S),`outputs`,C)))return null;return N}catch{return null}}function storeCacheEntry(n,a,S,C,N){let F=YP(n,a.name,S),I=`${F}.tmp-${process.pid}`;try{rmSync(I,{recursive:!0,force:!0}),mkdirSync(ms(I,`outputs`),{recursive:!0});for(let n of N)copyDirRecursive(ms(a.location,n),ms(I,`outputs`,n));let H=new Date().toISOString(),W={version:1,layout:`v2`,package:a.name,script:C,key:S,dirs:[...N],outputsHash:hashOutputDirs(a.location,N),createdAt:H,usedAt:H};return writeFileSync(ms(I,`manifest.json`),JSON.stringify(W,null,2)),rmSync(F,{recursive:!0,force:!0}),renameSync(I,F),pruneCacheEntries(n,a.name),W}catch{try{rmSync(I,{recursive:!0,force:!0})}catch{}return null}}function restoreCacheEntry(n,a,S){let C=YP(n,a.name,S.key);try{if(S.dirs.length>0&&hashOutputDirs(a.location,S.dirs)===S.outputsHash)return touchManifestUsed(C,S),`up-to-date`;for(let n of S.dirs){let S=ms(a.location,n);rmSync(S,{recursive:!0,force:!0}),copyDirRecursive(ms(C,`outputs`,n),S)}return touchManifestUsed(C,S),S.dirs.length>0?`restored`:`up-to-date`}catch{return null}}function touchManifestUsed(n,a){try{a.usedAt=new Date().toISOString(),writeFileSync(ms(n,`manifest.json`),JSON.stringify(a,null,2))}catch{}}function pruneCacheEntries(n,a,S=2){let C=ms(n,sanitizePackageDirName(a)),N;try{N=readdirSync(C)}catch{return}let F=[];for(let n of N){if(n.includes(`.tmp-`)){try{rmSync(ms(C,n),{recursive:!0,force:!0})}catch{}continue}let a=``;try{let S=JSON.parse(readFileSync(ms(C,n,`manifest.json`),`utf-8`));a=S.usedAt??S.createdAt??``}catch{}F.push({name:n,stamp:a})}if(!(F.length<=S)){F.sort((n,a)=>n.stamp<a.stamp?1:n.stamp>a.stamp?-1:0);for(let n of F.slice(S))try{rmSync(ms(C,n.name),{recursive:!0,force:!0})}catch{}}}function buildCacheOptedOut(n){return n.manifest.gjsify?.buildCache===!1}var qP,JP,YP,BuildCacheRunner,XP=__esmMin(()=>{ge(),vo(),ul(),Ts(),nn(),N_(),zM(),qP=[`lib`,`dist`,`dist-templates`],JP=[`@gjsify/cli`,`@gjsify/tsc`,`rolldown`,`typescript`],YP=buildCacheEntryDir,BuildCacheRunner=class{options;cacheRoot;graph;toolchain;ownHashes=new Map;closures=new Map;keys=new Map;log;constructor(n){this.options=n,this.cacheRoot=buildCacheRoot(n.root),this.graph=buildDependencyGraph(n.workspaces,{includeDev:!0,includePeer:!0,includeOptional:!0}),this.toolchain=resolveToolchainVersions(n.root),this.log=n.log??(n=>he.error(n));for(let a of n.targets??[])if(this.graph.byName.has(a)){this.ownHashOf(a);for(let n of this.closureOf(a))this.ownHashOf(n)}}ownHashOf(n){let a=this.ownHashes.get(n);if(a===void 0){let S=this.graph.byName.get(n);a=S?hashPackageInputs(S.location):`unknown-workspace`,this.ownHashes.set(n,a)}return a}closureOf(n){let a=this.closures.get(n);if(a===void 0){let S=new Set,C=[...this.graph.edges.get(n)??[]];for(;C.length>0;){let a=C.shift();if(!(a===n||S.has(a))){S.add(a);for(let N of this.graph.edges.get(a)??[])!S.has(N)&&N!==n&&C.push(N)}}a=[...S].sort(),this.closures.set(n,a)}return a}keyFor(n){let a=this.keys.get(n.name);if(a===void 0){let S=new Map;for(let a of this.closureOf(n.name))S.set(a,this.ownHashOf(a));a=composeCacheKey({script:this.options.script,args:this.options.args,toolchain:this.toolchain,ownHash:this.ownHashOf(n.name),depHashes:S}),this.keys.set(n.name,a)}return a}tryRestore(n){try{if(buildCacheOptedOut(n))return this.log(`[gjsify build-cache] ${n.name}: opted out (gjsify.buildCache=false) — running uncached`),!1;let a=this.keyFor(n),S=readCacheEntry(this.cacheRoot,n.name,a);if(!S||S.script!==this.options.script)return this.log(`[gjsify build-cache] ${n.name}: miss ${a} — running "${this.options.script}"`),!1;let C=restoreCacheEntry(this.cacheRoot,n,S);if(C===null)return this.log(`[gjsify build-cache] ${n.name}: entry ${a} unrestorable — running "${this.options.script}"`),!1;let N=S.dirs.length>0?S.dirs.join(`, `):`no output dirs`;return this.log(`[gjsify build-cache] ${n.name}: hit ${a} — ${C===`restored`?`restored ${N}`:`${N} up to date`} (skipped "${this.options.script}")`),!0}catch(a){return this.log(`[gjsify build-cache] ${n.name}: cache error (${a.message}) — running uncached`),!1}}snapshotOutputs(n){try{return snapshotOutputDirs(n.location)}catch{return{}}}storeAfterSuccess(n,a){try{if(buildCacheOptedOut(n))return;let S=this.keyFor(n),C=modifiedOutputDirs(n.location,a);if(storeCacheEntry(this.cacheRoot,n,S,this.options.script,C)){let a=C.length>0?C.join(`, `):`no output dirs modified`;this.log(`[gjsify build-cache] ${n.name}: stored ${S} (${a})`)}}catch(a){this.log(`[gjsify build-cache] ${n.name}: store failed (${a.message}) — continuing`)}}}});function readDirectChildren(n){let a;try{a=readdirSync(`/proc/${n}/task`)}catch{return null}let S=[],C=!1;for(let N of a)try{let a=readFileSync(`/proc/${n}/task/${N}/children`,`utf-8`);C=!0;for(let n of a.trim().split(/\s+/)){let a=Number(n);Number.isInteger(a)&&a>0&&S.push(a)}}catch{}return C?S:null}function buildPpidMap(){let n=new Map,a=[];try{a=readdirSync(`/proc`)}catch{return n}for(let S of a){let a=Number(S);if(!(!Number.isInteger(a)||a<=0))try{let S=readFileSync(`/proc/${a}/stat`,`utf-8`),C=S.slice(S.lastIndexOf(`)`)+2).split(` `),N=Number(C[1]);if(!Number.isInteger(N)||N<=0)continue;let F=n.get(N);F?F.push(a):n.set(N,[a])}catch{}}return n}function collectDescendants(n){let a=[],S=new Set([n]),C=[n],N=null;for(;C.length>0;){let n=C.shift(),F=readDirectChildren(n);F===null&&(N??=buildPpidMap(),F=N.get(n)??[]);for(let n of F)S.has(n)||(S.add(n),a.push(n),C.push(n))}return a}function signalTree(n,a,S){for(let n=a.length-1;n>=0;n--)try{process.kill(a[n],S)}catch{}try{n.kill(S)}catch{}}function killActiveChildren(){let n=new Map;for(let a of ZP){let S=a.pid?collectDescendants(a.pid):[];n.set(a,S),signalTree(a,S,`SIGTERM`)}setTimeout(()=>{for(let a of ZP){let S=new Set(a.pid?collectDescendants(a.pid):[]);for(let C of n.get(a)??[])S.add(C);signalTree(a,[...S],`SIGKILL`)}},QP).unref?.()}function assertEveryIncludeMatches(n,a){if(!a||a.length===0)return;let S=a.filter(a=>filterWorkspaces(n,{include:[a]}).length===0);if(S.length===0)return;let C=[`gjsify foreach: --include matched no workspace (${S.length} of ${a.length} pattern(s)):`];for(let a of S){C.push(` ${JSON.stringify(a)}`);let S=stripSurroundingQuotes(a);if(S!==a&&filterWorkspaces(n,{include:[S]}).length>0){C.push(` → matches as ${JSON.stringify(S)}: the QUOTES are part of the value. A shell expansion`," is not re-scanned for quoting, so a pre-quoted filter spliced through `sh -c` arrives with",` the quotes attached. Pass the bare name and let word splitting do the work.`);continue}let N=n.map(n=>n.name).filter(n=>n.toLowerCase().includes(S.replace(/\*/g,``).toLowerCase())).slice(0,3);N.length>0&&C.push(` → did you mean: ${N.join(`, `)}?`)}throw C.push(` ${n.length} workspace(s) discovered. Refusing to run: a filter that selects nothing would`,` otherwise exit 0 and look exactly like a successful run over the whole set.`),he.error(C.join(`
|
|
899
|
+
`)),process.exit(1),Error(`gjsify foreach: --include matched no workspace`)}function stripSurroundingQuotes(n){return n.length>=2&&(n[0]===`'`||n[0]===`"`)&&n[n.length-1]===n[0]?n.slice(1,-1):n}async function runSequential(n,a,S,C,N,F){for(let I of n)await runOne$1(I,a,S,!1,C,N,F)}async function runParallel(n,a,S,C,N,F,I){let H=0,W=[];for(let K=0;K<C;K++)W.push((async()=>{for(;H<n.length;)await runOne$1(n[H++],a,S,!0,N,F,I)})());await Promise.all(W)}async function runTopologicalParallel(n,a,S,C,N,F,I,H){let W=new Set(n.map(n=>n.name)),K=new Map;for(let a of n){let n=new Set,S=a.manifest;for(let a of[S.dependencies,F?S.devDependencies:void 0,S.optionalDependencies])if(a)for(let[S,C]of Object.entries(a))typeof C==`string`&&C.startsWith(`workspace:`)&&W.has(S)&&n.add(S);K.set(a.name,n)}let q=new Map(n.map(n=>[n.name,n])),Y=n.length,X=new Set,te=0,ne=!process.stdout.isTTY||N,re=new Map,ie=Number(process.env.GJSIFY_FOREACH_STALL_MINUTES??`20`),ae=(Number.isFinite(ie)&&ie>0?ie:20)*6e4;return new Promise((n,F)=>{let W=null,ie=Date.now(),describeInflight=()=>[...re.entries()].map(([n,a])=>`${n} (${Math.round((Date.now()-a)/1e3)}s)`).join(`, `),failFast=n=>{W||(W=n,killActiveChildren(),setTimeout(()=>settle(),$P).unref?.())},oe=setInterval(()=>{let n=Date.now()-ie;n<3e5||re.size===0||(he.error(`[gjsify foreach] WARNING: no workspace completed for ${Math.round(n/6e4)}min — in-flight: ${describeInflight()}`),n>=ae&&failFast(Error(`gjsify foreach: stalled — no workspace completed for ${Math.round(n/6e4)}min (override via GJSIFY_FOREACH_STALL_MINUTES); killed in-flight: ${describeInflight()}`)))},6e4);oe.unref?.();let settle=()=>{clearInterval(oe),W?F(W):n()},pump=()=>{if(!W){for(;te<C;){let n=[...K.entries()].filter(([,n])=>[...n].every(n=>X.has(n))).map(([n])=>n);if(n.length===0)break;let C=n.sort()[0];K.delete(C),te++,re.set(C,Date.now()),ne&&he.error(`[gjsify foreach] start ${C} (${X.size}/${Y} done, ${te} in flight)`),runOne$1(q.get(C),a,S,!0,N,I,H).then(()=>{X.add(C)}).catch(n=>{failFast(n instanceof Error?n:Error(String(n)))}).finally(()=>{te--,re.delete(C),ie=Date.now(),W?te===0&&settle():K.size===0&&te===0?settle():pump()})}K.size>0&&te===0&&!W&&(clearInterval(oe),F(Error(`gjsify foreach --topological: stuck — workspaces ${[...K.keys()].join(`, `)} have unsatisfied deps in the selected set`)))}};pump()})}async function runOne$1(n,a,S,C,N,F,I){if(F){N&&he.error(`[${n.name}] $ ${a} ${S.join(` `)}`),await spawnPrefixed(a,S,n.location,C?`[${n.name}] `:null);return}if(I&&I.tryRestore(n))return;let H=I?.snapshotOutputs(n),W=detectPackageManager$1(),K=W===`gjsify`?[`run`,a,...S]:[`run`,a,...S.length>0?[`--`,...S]:[]];N&&he.error(`[${n.name}] $ ${W} ${K.join(` `)}`),await spawnPrefixed(W,K,n.location,C?`[${n.name}] `:null),I&&H&&I.storeAfterSuccess(n,H)}function detectPackageManager$1(){if(isGjs())return`gjsify`;let n=process.env.npm_config_user_agent??``;return n.startsWith(`yarn/`)?`yarn`:n.startsWith(`gjsify/`)?`gjsify`:`npm`}async function spawnPrefixed(n,a,S,C){let N=null,F=[];try{let I=await spawnToCompletion(n,a,{completion:`exit`,cwd:S,stdio:C?`pipe`:`inherit`,color:!0,onSpawn:n=>{N=n,ZP.add(n);let a=!process.stdout.isTTY;C&&n.stdout&&n.stderr&&(F.push(prefixLines(n.stdout,process.stdout,C,a)),F.push(prefixLines(n.stderr,process.stderr,C,a)))}});for(let n of F)n();if(I.code!==0)throw Error(`${n} ${a.join(` `)} exited with code ${I.code}`)}finally{N&&ZP.delete(N)}}var ZP,QP,$P,eF,tF=__esmMin(()=>{ge(),jM(),ul(),am(),N_(),F_(),kM(),XP(),bm(),ZP=new Set,QP=5e3,$P=15e3,eF={command:`foreach [script] [args..]`,description:"Run a workspace script across all (or filtered) workspaces. Drop-in for `yarn workspaces foreach`: -A/--all, -p/--parallel, -t/--topological, --include, --exclude, --no-private. Pass --exec to run an arbitrary command instead of a script.",builder:n=>n.positional(`script`,{description:"Script name to run in each workspace (`run <name>`-equivalent). With --exec, the command to run instead.",type:`string`}).positional(`args`,{description:`Extra arguments forwarded to each child invocation.`,type:`string`,array:!0}).option(`all`,{description:"Include workspaces declared as `private: true`.",type:`boolean`,alias:`A`,default:!1}).option(`parallel`,{description:`Run workspaces in parallel (capped by --jobs).`,type:`boolean`,alias:`p`,default:!1}).option(`topological`,{description:`Wait for each workspace's deps to finish before starting it (production deps only).`,type:`boolean`,alias:`t`,default:!1}).option(`topological-dev`,{description:`Like --topological but also respects devDependencies (often cyclic — use sparingly).`,type:`boolean`,default:!1}).option(`include`,{description:`Glob pattern to include workspaces by name (repeatable). A pattern that matches NO discovered workspace is a hard error — a filter selecting nothing is a typo or a caller-side quoting bug, never an intent.`,type:`string`,array:!0}).option(`exclude`,{description:`Glob pattern to exclude workspaces by name (repeatable).`,type:`string`,array:!0}).option(`private`,{description:`Include private workspaces (default true). Pass --no-private to skip them.`,type:`boolean`,default:!0}).option(`verbose`,{description:`Echo every spawned command before running it.`,type:`boolean`,alias:`v`,default:!1}).option(`jobs`,{description:`Maximum concurrent workspaces in --parallel mode (default: cpu count).`,type:`number`,alias:`j`}).option(`exec`,{description:"Treat <script> [args..] as an arbitrary command (yarn `workspaces foreach exec`-equivalent) instead of a package.json script lookup. Workspace filtering by script presence is skipped. Use `-- <cmd> <args...>` to pass flags to the command without yargs intercepting them.",type:`boolean`,default:!1}).option(`cached`,{description:`Content-hash build cache (ADR 0006): skip a workspace whose inputs (src/**, package.json, tsconfig*.json, transitive workspace deps, toolchain versions) are unchanged and restore its stored outputs instead; on miss run the script and store the output dirs it modified. Script mode only. Default from GJSIFY_BUILD_CACHE=1.`,type:`boolean`}).option(`shard`,{description:`Run only a deterministic slice "<index>/<total>" (1-based) of the matched workspaces, e.g. --shard 2/4. For fanning a long run across parallel CI jobs. Partitions by sorted name (round-robin) so the shards are disjoint and their union is the full set; order-independent, so safe for tests but NOT for ordered builds.`,type:`string`}).parserConfiguration({"populate--":!0}),handler:async n=>{let a=findWorkspaceRoot(process.cwd())??process.cwd(),S=discoverWorkspaces(a),C=n.exec===!0,N=n.script,F=n.args??[];if(!C){let a=(n[`--`]??[]).filter(n=>typeof n==`string`);a.length>0&&(F=[...F,...a])}if(C){let a=(n[`--`]??[]).filter(n=>typeof n==`string`);if(a.length>0&&(N?F=[...F,...a]:(N=a[0],F=[...F,...a.slice(1)])),!N)return he.error("gjsify foreach --exec: missing command. Pass it after `--`, e.g. `gjsify foreach --exec -- npm publish --tag latest`."),process.exit(1)}assertEveryIncludeMatches(S,n.include);let I=filterWorkspaces(S,{include:n.include,exclude:n.exclude,noPrivate:n.private===!1});if(!C){if(!N)return he.error(`gjsify foreach: missing <script> positional. Pass --exec to run an arbitrary command instead.`),process.exit(1);let n=N;I=I.filter(a=>typeof(a.manifest.scripts??{})[n]==`string`)}if(typeof n.shard==`string`&&n.shard.length>0){let a=/^\s*(\d+)\s*\/\s*(\d+)\s*$/.exec(n.shard);if(!a)return he.error(`gjsify foreach: invalid --shard "${n.shard}" — expected "<index>/<total>" (1-based), e.g. 2/4.`),process.exit(1);let S=Number(a[1]),C=Number(a[2]);if(C<1||S<1||S>C)return he.error(`gjsify foreach: invalid --shard "${n.shard}" — need 1 <= index <= total and total >= 1.`),process.exit(1);if(C>1){let n=[...I].sort((n,a)=>n.name<a.name?-1:+(n.name>a.name));I=n.filter((n,a)=>a%C===S-1),he.log(`gjsify foreach: shard ${S}/${C} → ${I.length} of ${n.length} workspace(s)`)}}if(I.length===0){he.log(`gjsify foreach: no workspaces match (${C?`exec`:`script`}="${N}", include=${JSON.stringify(n.include??[])}, exclude=${JSON.stringify(n.exclude??[])})`);return}(n.topological||n[`topological-dev`])&&(I=topologicalSort(buildDependencyGraph(I,{includeDev:n[`topological-dev`]===!0})));let H=n.verbose===!0,W=N,K=n.cached??buildCacheEnabledByEnv();if(n.cached===!0&&C)return he.error(`gjsify foreach: --cached only applies to script mode, not --exec.`),process.exit(1);let q=K&&!C?new BuildCacheRunner({root:a,workspaces:S,script:W,args:F,targets:I.map(n=>n.name)}):void 0;try{if(n.parallel&&!n.topological&&!n[`topological-dev`]){let a=n.jobs&&n.jobs>0?n.jobs:cpus().length;await runParallel(I,W,F,a,H,C,q)}else if(n.parallel){let a=n.jobs&&n.jobs>0?n.jobs:cpus().length;await runTopologicalParallel(I,W,F,a,H,n[`topological-dev`]===!0,C,q)}else await runSequential(I,W,F,H,C,q)}catch(n){return killActiveChildren(),he.error(n.message),process.exit(1)}process.exit(0)}},__name$1(runOne$1,`runOne`),__name$1(detectPackageManager$1,`detectPackageManager`)});function editDistance(n,a){if(n===a)return 0;if(n.length===0)return a.length;if(a.length===0)return n.length;let S=Array.from({length:a.length+1},(n,a)=>a),C=Array.from({length:a.length+1},()=>0);for(let N=1;N<=n.length;N++){C[0]=N;for(let F=1;F<=a.length;F++){let I=n[N-1]===a[F-1]?0:1;C[F]=Math.min(S[F]+1,C[F-1]+1,S[F-1]+I)}[S,C]=[C,S]}return S[a.length]}function suggestClosest(n,a){if(a.length===0)return;let S=n.toLowerCase(),C=Math.max(2,Math.floor(n.length/3)),N,F=1/0;for(let n of a){let a=editDistance(S,n.toLowerCase());a<F&&(F=a,N=n)}return N!==void 0&&F<=C?N:void 0}var nF=__esmMin(()=>{});function collectTransitiveClosure(n,a,S){let C=new Map;for(let n of a)C.set(n.name,n);let N=new Set,F=[],I=[n];for(;I.length>0;){let n=I.pop();if(N.has(n.name))continue;N.add(n.name),F.push(n);let a=n.manifest,H=[a.dependencies,S?a.devDependencies:void 0,a.optionalDependencies];for(let n of H)if(n)for(let[a,S]of Object.entries(n)){if(typeof S!=`string`||!S.startsWith(`workspace:`))continue;let n=C.get(a);n&&(N.has(n.name)||I.push(n))}}return F}async function runOne(n,a,S,C,N,F){if(F&&F.tryRestore(n))return;let I=F?.snapshotOutputs(n),H=C===`gjsify`?[`run`,a,...S]:[`run`,a,...S.length>0?[`--`,...S]:[]];N&&he.error(`[${n.name}] $ ${C} ${H.join(` `)}`);let{code:W}=await spawnToCompletion(C,H,{completion:`exit`,cwd:n.location,color:!0});if(W!==0)throw Error(`${C} ${H.join(` `)} exited with code ${W}`);F&&I&&F.storeAfterSuccess(n,I)}function detectPackageManager(){if(isGjs())return`gjsify`;let n=process.env.npm_config_user_agent??``;return n.startsWith(`yarn/`)?`yarn`:n.startsWith(`gjsify/`)?`gjsify`:`npm`}var rF,iF=__esmMin(()=>{ge(),jM(),N_(),F_(),XP(),bm(),nF(),rF={command:`workspace <name> <script> [args..]`,description:"Run a workspace script. Both `workspace <name> <script>` and the yarn spelling `workspace <name> run <script>` work.",builder:n=>n.positional(`name`,{description:"Workspace name (matches package.json `name` field).",type:`string`,demandOption:!0}).positional(`script`,{description:`Script name to run inside that workspace.`,type:`string`,demandOption:!0}).positional(`args`,{description:`Extra arguments forwarded to the script.`,type:`string`,array:!0}).option(`with-dependencies`,{description:"Pre-build the target workspace's transitive workspace dependencies in topological order before running the script in the target. Deps that don't declare the script are skipped (--if-present behaviour). Replaces manual `gjsify workspace A build && gjsify workspace B build && …` chains.",type:`boolean`,alias:[`d`,`t`,`topological`],default:!1}).option(`include-dev`,{description:"When --with-dependencies is set, also walk devDependencies (production deps only by default — matches `gjsify foreach -t`).",type:`boolean`,default:!1}).option(`continue-on-error`,{description:`When --with-dependencies is set, keep running remaining deps after one fails (default: stop on first failure).`,type:`boolean`,default:!1}).option(`verbose`,{description:`Echo every spawned command before running it.`,type:`boolean`,alias:`v`,default:!1}).option(`cached`,{description:`Content-hash build cache (ADR 0006): skip the script for a workspace whose inputs (src/**, package.json, tsconfig*.json, transitive workspace deps, toolchain versions) are unchanged and restore its stored outputs instead; on miss run it and store the output dirs it modified. Also applies to the deps run via --with-dependencies. Default from GJSIFY_BUILD_CACHE=1.`,type:`boolean`}),handler:async n=>{let a=findWorkspaceRoot(process.cwd())??process.cwd(),S=discoverWorkspaces(a),C=S.find(a=>a.name===n.name);if(!C){let C=suggestClosest(n.name,S.map(n=>n.name)),N=C?` — did you mean "${C}"?`:``;return he.error(`gjsify workspace: no workspace named "${n.name}"${N} (discovered ${S.length} workspace(s) under ${a})`),process.exit(1)}let N=detectPackageManager(),F=n.verbose===!0,I=n[`with-dependencies`]===!0,H=n[`continue-on-error`]===!0,W=n.script,K=n.args??[];W===`run`&&K.length>0&&([W,...K]=K);let q=C.manifest.scripts??{};if(typeof q[W]!=`string`){let a=suggestClosest(W,Object.keys(q));return he.error(`gjsify workspace: workspace "${n.name}" has no script "${W}"`+(a?` — did you mean "${a}"?`:``)),process.exit(1)}let Y;Y=I?topologicalSort(buildDependencyGraph(collectTransitiveClosure(C,S,n[`include-dev`]===!0),{includeDev:n[`include-dev`]===!0})):[C];let X=n.cached??buildCacheEnabledByEnv()?new BuildCacheRunner({root:a,workspaces:S,script:W,args:K,targets:Y.map(n=>n.name)}):void 0,te=[];for(let n of Y){if(typeof(n.manifest.scripts??{})[W]!=`string`){F&&he.error(`[${n.name}] (no "${W}" script — skipping)`);continue}try{await runOne(n,W,K,N,F,X)}catch(a){let S=a instanceof Error?a:Error(String(a));if(he.error(`[${n.name}] ${S.message}`),!H)return process.exit(1);te.push({workspace:n.name,error:S})}}return te.length>0?(he.error(`gjsify workspace: ${te.length} workspace(s) failed: ${te.map(n=>n.workspace).join(`, `)}`),process.exit(1)):process.exit(0)}}});async function runLifecycleScript(n,a,S,C={}){let N=(a.scripts??{})[S];if(typeof N!=`string`){if(C.optional!==!1)return!1;throw Error(`gjsify lifecycle-script: no "${S}" in ${n}/package.json`)}let F=findWorkspaceRoot(n),I=[ms(n,`node_modules`,`.bin`)];F&&F!==n&&I.push(ms(F,`node_modules`,`.bin`));let H=process.env.FORCE_COLOR!==void 0||process.env.NO_COLOR!==void 0?{}:{FORCE_COLOR:`1`},W={...process.env,...H,PATH:[...I,process.env.PATH??``].filter(Boolean).join(Cs),npm_lifecycle_event:S,npm_package_name:a.name??``,npm_package_version:a.version??``,...C.env},K=C.stdio===`inherit-stderr`?[`inherit`,2,2]:C.stdio??`inherit`;return await new Promise((a,C)=>{let F=spawn(N,[],{cwd:n,env:W,stdio:K,shell:!0});F.on(`close`,N=>{N===0?a():C(Error(`gjsify lifecycle-script: "${S}" in ${n} exited with code ${N}`))}),F.on(`error`,C)}),!0}var aF=__esmMin(()=>{Gm(),Ts(),F_()});async function packWorkspace(n,a={}){let S=ms(n,`package.json`);if(!existsSync(S))throw Error(`gjsify pack: no package.json at ${n}`);let C=readFileSync(S,`utf-8`),N=JSON.parse(C),F=typeof N.name==`string`?N.name:``,I=typeof N.version==`string`?N.version:`0.0.0`;if(!F)throw Error(`gjsify pack: package.json at ${n} has no "name"`);let H=a.lifecycleScripts??[`prepack`];for(let S of H)await runLifecycleScript(n,N,S,{optional:!0,stdio:a.lifecycleStdio});let W=readFileSync(S,`utf-8`),K=W===C?N:JSON.parse(W),q=a.skipWorkspaceRewrite?K:rewriteWorkspaceDeps(K,n),Y=JSON.stringify(q,null,indentOf(W))+`
|
|
900
900
|
`,X=collectFiles(n,K);assertTypeDeclarationsShipped(n,K,X);let te=[{name:`package/`,directory:!0,mode:493}],ne=[],re=0;for(let a of X){let S;S=a===`package.json`?new TextEncoder().encode(Y):new Uint8Array(readFileSync(ms(n,a)));let C=statSync(ms(n,a)).mode&511;te.push({name:`package/${a}`,body:S,mode:C,mtime:0}),ne.push({path:a,size:S.byteLength,mode:C}),re+=S.byteLength}let ie=await gzip(createTarball(te)),ae=`${F.startsWith(`@`)?F.slice(1).replace(`/`,`-`):F}-${I}.tgz`,oe=createHash(`sha1`).update(ie).digest(`hex`),Z=`sha512-${createHash(`sha512`).update(ie).digest(`base64`)}`,se=a.destination?ds(a.destination):n,ce=ms(se,ae);return a.dryRun||(mkdirSync(se,{recursive:!0}),writeFileSync(ce,ie)),{filename:ae,name:F,version:I,size:ie.byteLength,unpackedSize:re,shasum:oe,integrity:Z,entryCount:ne.length,files:ne,absolutePath:a.dryRun?null:ce}}function collectFiles(n,a){let S=forceIncluded(a),C=Array.isArray(a.files)?a.files.filter(n=>typeof n==`string`):null,N=new Set;if(C)for(let a of expandFilesPatterns(n,C))N.add(a);else{let a=loadIgnore(n);for(let S of walkAll(n))a(S)||N.add(S)}for(let a of S)existsSync(ms(n,a))&&N.add(a);return[...N].sort()}function collectTypeDeclarationRefs(n){let a=new Set,add=n=>{if(typeof n!=`string`)return;let S=n.replace(/^\.\//,``);S.includes(`*`)||a.add(S)};for(let a of[`types`,`typings`])add(n[a]);let walk=n=>{if(!(!n||typeof n!=`object`)){if(Array.isArray(n)){for(let a of n)walk(a);return}for(let[a,S]of Object.entries(n))a===`types`||a===`typings`?add(S):walk(S)}};return walk(n.exports),[...a]}function assertTypeDeclarationsShipped(n,a,S){let C=new Set(S),N=collectTypeDeclarationRefs(a).filter(a=>{let S=ms(n,a);return existsSync(S)&&statSync(S).isFile()&&!C.has(a)});if(N.length===0)return;let F=typeof a.name==`string`?a.name:`(unnamed)`,I=Array.isArray(a.files)?JSON.stringify(a.files):`(none)`;throw Error(`gjsify pack: ${F} references TypeScript declaration file(s) via "exports"/"types" that exist on disk but are excluded from the tarball by the "files" allowlist (${I}):\n`+N.map(n=>` - ${n}`).join(`
|
|
901
901
|
`)+`
|
|
902
|
-
Add the missing path(s) to package.json "files" so type resolution isn't silently broken for consumers.`)}function forceIncluded(n){let a=new Set;a.add(`package.json`);for(let n of[`README`,`README.md`,`LICENSE`,`LICENSE.md`,`NOTICE`,`NOTICE.md`])a.add(n);let S=typeof n.main==`string`?n.main:null;S&&a.add(S.replace(/^\.\//,``));let C=n.bin;if(typeof C==`string`)a.add(C.replace(/^\.\//,``));else if(C&&typeof C==`object`)for(let n of Object.values(C))typeof n==`string`&&a.add(n.replace(/^\.\//,``));return[...a]}function walkAll(n,a=``){let S=[],C=a?ms(n,a):n,N;try{N=readdirSync(C,{withFileTypes:!0})}catch{return S}for(let C of N){if(
|
|
903
|
-
`);for(let a of n){let n=a.trim();!n||n.startsWith(`#`)||n.startsWith(`!`)||C.push(globToRegex(n))}}return n=>{for(let a of C)if(a.test(n))return!0;return!1}}function globToRegex(n){let a=n.replace(/^\//,``);return a=a.replace(/[.+^${}()|[\]\\]/g,`\\$&`),a=a.replace(/\*\*/g,`__DOUBLESTAR__`).replace(/\*/g,`[^/]*`).replace(/__DOUBLESTAR__/g,`.*`),a=a.replace(/\?/g,`[^/]`),RegExp(`^${a}($|/)`)}function collectWorkspaceProtocolDeps(n){let a=[];for(let S of
|
|
902
|
+
Add the missing path(s) to package.json "files" so type resolution isn't silently broken for consumers.`)}function forceIncluded(n){let a=new Set;a.add(`package.json`);for(let n of[`README`,`README.md`,`LICENSE`,`LICENSE.md`,`NOTICE`,`NOTICE.md`])a.add(n);let S=typeof n.main==`string`?n.main:null;S&&a.add(S.replace(/^\.\//,``));let C=n.bin;if(typeof C==`string`)a.add(C.replace(/^\.\//,``));else if(C&&typeof C==`object`)for(let n of Object.values(C))typeof n==`string`&&a.add(n.replace(/^\.\//,``));return[...a]}function walkAll(n,a=``){let S=[],C=a?ms(n,a):n,N;try{N=readdirSync(C,{withFileTypes:!0})}catch{return S}for(let C of N){if(sF.has(C.name)||C.name.startsWith(`.tsbuildinfo`))continue;let N=a?`${a}/${C.name}`:C.name;C.isDirectory()?S.push(...walkAll(n,N)):C.isFile()&&S.push(N)}return S}function expandFilesPatterns(n,a){let S=new Set,C=null;for(let N of a){let a=N.replace(/^\.\//,``).replace(/\/$/,``);if(!a)continue;if(!/[*?[\]]/.test(a)){let C=ms(n,a);if(!existsSync(C))continue;let N=statSync(C);if(N.isDirectory())for(let C of walkAll(n,a))S.add(C);else N.isFile()&&S.add(a);continue}C??=walkAll(n);let F=filesGlobToRegExp(a),I=filesGlobToRegExp(`${a}/**`);for(let n of C)(F.test(n)||I.test(n))&&S.add(n)}return[...S]}function filesGlobToRegExp(n){let a=`^`;for(let S=0;S<n.length;S++){let C=n[S];if(C===`*`)n[S+1]===`*`?(a+=`.*`,S++,n[S+1]===`/`&&S++):a+=`[^/]*`;else if(C===`?`)a+=`[^/]`;else if(C===`[`){let C=S+1,N=`[`;for(n[C]===`!`&&(N+=`^`,C++);C<n.length&&n[C]!==`]`;C++)N+=n[C];C<n.length?(a+=`${N}]`,S=C):a+=`\\[`}else".+^${}()|\\]".includes(C)?a+=`\\${C}`:a+=C}return RegExp(`${a}$`)}function loadIgnore(n){let a=ms(n,`.npmignore`),S=ms(n,`.gitignore`),C=[],N=existsSync(a)?a:existsSync(S)?S:null;if(N){let n=readFileSync(N,`utf-8`).split(`
|
|
903
|
+
`);for(let a of n){let n=a.trim();!n||n.startsWith(`#`)||n.startsWith(`!`)||C.push(globToRegex(n))}}return n=>{for(let a of C)if(a.test(n))return!0;return!1}}function globToRegex(n){let a=n.replace(/^\//,``);return a=a.replace(/[.+^${}()|[\]\\]/g,`\\$&`),a=a.replace(/\*\*/g,`__DOUBLESTAR__`).replace(/\*/g,`[^/]*`).replace(/__DOUBLESTAR__/g,`.*`),a=a.replace(/\?/g,`[^/]`),RegExp(`^${a}($|/)`)}function collectWorkspaceProtocolDeps(n){let a=[];for(let S of cF){let C=n[S];if(C)for(let[n,N]of Object.entries(C))typeof N==`string`&&N.startsWith(`workspace:`)&&a.push(`${S}.${n}`)}return a}function findPackWorkspaceRoot(n){let a=findWorkspaceRoot(n);if(a)return a;let S=n;for(let n=0;n<12;n++){let n=ms(S,`package.json`);if(existsSync(n)&&readPackageJson$2(n)?.workspaces!==void 0)return S;let a=ds(S,`..`);if(a===S)break;S=a}return null}function rewriteWorkspaceDeps(n,a){let S=findPackWorkspaceRoot(a);if(!S){let S=collectWorkspaceProtocolDeps(n);if(S.length>0)throw Error(`gjsify pack: ${String(n.name)} declares workspace: ranges (${S.join(`, `)}) but ${a} is not inside a monorepo (no ancestor package.json declares "workspaces"). A workspace: range cannot be published — replace it with a real npm range, or pack from within the monorepo.`);return n}let C=new Map;for(let n of discoverWorkspaces(S))n.name&&n.version&&C.set(n.name,n.version);let N=JSON.parse(JSON.stringify(n));for(let n of cF){let a=N[n];if(a)for(let[F,I]of Object.entries(a)){if(typeof I!=`string`||!I.startsWith(`workspace:`))continue;let H=C.get(F);if(!H)throw Error(`gjsify pack: ${N.name} declares ${I} on ${F} (${n}) but no sibling workspace with that name exists in the monorepo at ${S}`);let W=I.slice(10);W===`*`||W===``?a[F]=H:W===`^`||W===`~`?a[F]=`${W}${H}`:a[F]=W}}return N}function indentOf(n){let a=n.match(/\n([ \t]+)"/);return a?a[1]:` `}var oF,sF,cF,lF=__esmMin(()=>{ul(),vo(),Ts(),dN(),N_(),F_(),P_(),aF(),oF={command:`pack [path]`,description:`Produce an npm-compatible .tgz tarball for the workspace at <path> (default: cwd). Rewrites workspace:^/~/* deps to resolved versions.`,builder:n=>n.positional(`path`,{description:`Workspace path (default: cwd).`,type:`string`}).option(`pack-destination`,{description:`Directory to write the tarball into. Default: workspace cwd.`,type:`string`}).option(`json`,{description:"Emit pack metadata as JSON on stdout (mirrors `npm pack --json`).",type:`boolean`,default:!1}).option(`dry-run`,{description:`Compute everything but do not write the .tgz.`,type:`boolean`,default:!1}).option(`ignore-scripts`,{description:"Skip the `prepack` lifecycle script before packing. Mirrors `npm pack --ignore-scripts`. Use when scripts are already run by the outer workflow.",type:`boolean`,default:!1}),handler:async n=>{let a=await packWorkspace(ds(n.path??process.cwd()),{destination:n[`pack-destination`],dryRun:n[`dry-run`]===!0,lifecycleScripts:n[`ignore-scripts`]?[]:[`prepack`],lifecycleStdio:n.json?`inherit-stderr`:`inherit`});n.json?process.stdout.write(`${JSON.stringify([a],null,2)}\n`):process.stdout.write(`${a.filename}\n`)}},sF=new Set([`.git`,`.svn`,`.hg`,`.gitignore`,`.gitattributes`,`.npmrc`,`CVS`,`.DS_Store`,`node_modules`,`.npmignore`,`package-lock.json`,`gjsify-lock.json`,`yarn.lock`,`yarn-error.log`,`.yarn`,`.pnp.cjs`,`.pnp.loader.mjs`,`tsconfig.tsbuildinfo`]),cF=[`dependencies`,`devDependencies`,`peerDependencies`,`optionalDependencies`]});function escapePackageName(n){return n.replace(`/`,`%2f`)}function buildPublishHeaders(n,a){let S=buildHeaders(n,{npmrc:a.npmrc});return S[`content-type`]=`application/json`,S[`npm-command`]=`publish`,S[`npm-auth-type`]=a.otp?`legacy`:`web`,S[`user-agent`]=a.userAgent??defaultUserAgent(),a.otp&&(S[`npm-otp`]=a.otp),a.authorization&&(S.authorization=a.authorization),S}function cliVersion(){return uF===void 0&&(uF=`0.26.1`),uF}function defaultUserAgent(){let n=globalThis.process,a=n?.arch??`x64`,S=n?.platform??`linux`;return`gjsify-publish/${cliVersion()} (${S} ${a})`}var uF,dF=__esmMin(()=>{ul(),Ts(),oN()});function decodeJwtPayload(n){let a=n.split(`.`);if(a.length!==3)return null;try{let n=a[1].replace(/-/g,`+`).replace(/_/g,`/`),S=typeof atob==`function`?atob(n):Buffer.from(n,`base64`).toString(`binary`);return JSON.parse(S)}catch{return null}}function hasGithubOidcEnv(){return!!(process.env.ACTIONS_ID_TOKEN_REQUEST_URL&&process.env.ACTIONS_ID_TOKEN_REQUEST_TOKEN)}async function fetchGithubOidcToken(n,a){let S=process.env.ACTIONS_ID_TOKEN_REQUEST_URL,C=process.env.ACTIONS_ID_TOKEN_REQUEST_TOKEN;if(!S||!C)throw new OidcUnavailableError("GitHub Actions OIDC env vars (ACTIONS_ID_TOKEN_REQUEST_{URL,TOKEN}) not set. The calling workflow needs `permissions: id-token: write`.",`no-env`);let N=`${S}${S.includes(`?`)?`&`:`?`}audience=${encodeURIComponent(n)}`;a?.(`gjsify oidc: GET ${N.replace(C,`<bearer>`)}`);let F=await fetch(N,{method:`GET`,headers:{Accept:`application/json`,Authorization:`Bearer ${C}`}});if(!F.ok){let n=await F.text().catch(()=>`<no body>`);throw new OidcUnavailableError(`Failed to fetch GitHub OIDC id_token: ${F.status} ${F.statusText} — ${n.slice(0,200)}`,`fetch-id-token`)}let I=await F.json().catch(()=>({}));if(!I.value)throw new OidcUnavailableError("GitHub OIDC response missing `value` field",`no-id-token`);return I.value}async function exchangeOidcForNpmToken(n){let{packageName:a,registry:S,idToken:C,log:N}=n,F=`${S.endsWith(`/`)?S.slice(0,-1):S}/-/npm/v1/oidc/token/exchange/package/${a.startsWith(`@`)?(()=>{let n=a.indexOf(`/`),S=a.slice(1,n),C=a.slice(n+1);return`@${encodeURIComponent(S)}%2f${encodeURIComponent(C)}`})():encodeURIComponent(a)}`;N?.(`gjsify oidc: POST ${F}`);let I=n.maxRetries??3,H=n.retryBaseMs??1e3;for(let n=0;;n++){let S;try{S=await fetch(F,{method:`POST`,headers:{Authorization:`Bearer ${C}`,"Content-Type":`application/json`,Accept:`application/json`},body:`{}`})}catch(S){if(n<I){let S=Math.min(H*2**n,8e3);N?.(`gjsify oidc: network error for ${a} (attempt ${n+1}/${I+1}), retrying in ${S}ms`),await sleep(S);continue}throw new OidcExchangeError(`npm OIDC token exchange network error for ${a} after ${n+1} attempt(s): ${S instanceof Error?S.message:String(S)}`,0,``,a,decodeJwtPayload(C)??void 0)}let W=await S.text().catch(()=>``);if(!S.ok){if(fF.has(S.status)&&n<I){let C=Math.min(H*2**n,8e3);N?.(`gjsify oidc: transient ${S.status} ${S.statusText} for ${a} (attempt ${n+1}/${I+1}), retrying in ${C}ms`),await sleep(C);continue}throw new OidcExchangeError(`npm OIDC token exchange failed for ${a}: ${S.status} ${S.statusText} — ${W.slice(0,300)}`,S.status,W,a,decodeJwtPayload(C)??void 0)}let K;try{K=JSON.parse(W)}catch{throw new OidcExchangeError(`npm OIDC token exchange returned non-JSON body for ${a}: ${W.slice(0,200)}`,S.status,W,a)}if(!K.token)throw new OidcExchangeError(`npm OIDC token exchange returned no \`token\` field for ${a}`,S.status,W,a);return K.token}}async function getNpmTrustedToken(n){let a=`npm:${new URL(n.registry).hostname}`,S=await fetchGithubOidcToken(a,n.log);return{token:await exchangeOidcForNpmToken({...n,idToken:S}),audience:a}}var fF,sleep,OidcUnavailableError,OidcExchangeError,pF=__esmMin(()=>{fF=new Set([408,425,429,500,502,503,504]),sleep=n=>new Promise(a=>setTimeout(a,n)),OidcUnavailableError=class extends Error{reason;constructor(n,a){super(n),this.reason=a,this.name=`OidcUnavailableError`}},OidcExchangeError=class extends Error{status;body;packageName;claims;constructor(n,a,S,C,N){super(n),this.status=a,this.body=S,this.packageName=C,this.claims=N,this.name=`OidcExchangeError`}}});async function diagnose404(n){let{packageName:a,version:S,registry:C,npmrc:N}=n,F={};try{F=await whoami(C,N)}catch{return{reason:`unknown`,message:formatUnknown(a,S)}}return F.username&&F.username.length>0?{reason:`live-token-404`,username:F.username,message:formatLiveToken404(a,S,F.username)}:{reason:`dead-token`,message:formatDeadToken(a,S)}}function formatDeadToken(n,a){return[`gjsify publish: ${n}@${a} — 404 Not Found`,``,`The npm token in ~/.npmrc appears to be revoked or expired (the /-/whoami probe`,`returned {} instead of {"username": "..."}). The 404 is npm's response to a PUT`,`authenticated with an invalid bearer token.`,``,`To refresh:`,` npm login`,` # or, future: gjsify login (tracked as project_gjsify_login_goal)`,``,`Then verify before publishing:`,` curl -s -H "Authorization: Bearer $(grep registry.npmjs.org ~/.npmrc | sed 's|.*=||')" \\`,` https://registry.npmjs.org/-/whoami`,` # Healthy: {"username":"<you>"}`,` # Dead: {}`].join(`
|
|
904
904
|
`)}function formatLiveToken404(n,a,S){return[`gjsify publish: ${n}@${a} — 404 Not Found`,``,`Authenticated as: ${S}`,``,`Your token authenticates, so this is NOT a dead-token problem. The package`,`${n} is not (yet) on npmjs.com. Two cases:`,``,` 1. First publish of a brand-new scoped package — do the one-time bootstrap`,` (see AGENTS.md > "New @gjsify/* package: first-publish + Trusted`,` Publisher bootstrap"). The npm registry can also 404 *transiently*`,` while provisioning a brand-new package: simply re-run, or do the very`," first publish with `npm publish` (then configure the Trusted Publisher)."," 2. You lack publish access to the scope — verify with `npm access ls-packages`."].join(`
|
|
905
|
-
`)}function formatUnknown(n,a){return`gjsify publish: ${n}@${a} — 404 Not Found`}function is404DiagnosticCandidate(n){let a=n.trim();return!!(a.length===0||/^not found$/i.test(a)||/"error"\s*:\s*"Not Found"/i.test(a))}var
|
|
906
|
-
`).replace(/\$\{([A-Z_][A-Z0-9_]*)\}/gi,(n,a)=>process.env[a]??``))}function hasAnyAuthToken(n){return Object.keys(n.authTokens).length>0}function hasAnyCredential(n){return hasAnyAuthToken(n)||Object.keys(n.basicAuth).length>0}var
|
|
905
|
+
`)}function formatUnknown(n,a){return`gjsify publish: ${n}@${a} — 404 Not Found`}function is404DiagnosticCandidate(n){let a=n.trim();return!!(a.length===0||/^not found$/i.test(a)||/"error"\s*:\s*"Not Found"/i.test(a))}var mF=__esmMin(()=>{oN()});async function loadNpmrc(n){let a=[],S=ms(n,`.npmrc`);existsSync(S)&&a.push(readFileSync(S,`utf-8`));let C=process.env.NPM_CONFIG_USERCONFIG;if(C&&existsSync(C))a.push(readFileSync(C,`utf-8`));else{let n=ms(homedir(),`.npmrc`);existsSync(n)&&a.push(readFileSync(n,`utf-8`))}return parseNpmrc(a.join(`
|
|
906
|
+
`).replace(/\$\{([A-Z_][A-Z0-9_]*)\}/gi,(n,a)=>process.env[a]??``))}function hasAnyAuthToken(n){return Object.keys(n.authTokens).length>0}function hasAnyCredential(n){return hasAnyAuthToken(n)||Object.keys(n.basicAuth).length>0}var hF=__esmMin(()=>{ul(),am(),Ts(),oN()});function isTtyStdin(){let n=process.stdin;return!!n.isTTY&&typeof n.setRawMode==`function`}function applyKey(n,a,S){return a===`\r`||a===`
|
|
907
907
|
`?{buf:n,echo:`
|
|
908
|
-
`,done:!0,interrupt:!1}:a===
|
|
909
|
-
`,done:!1,interrupt:!0}:a===
|
|
910
|
-
Enter OTP: `,OtpProvider=class{cached;promptFn;registry;constructor(n,a=promptLine,S={}){this.promptFn=a,this.registry=S.registry;let C=n&&n.length>0?n:void 0;C?(this.cached=C,this.registry&&writeCachedOtp(this.registry,C)):this.cached=this.registry?readCachedOtp(this.registry):void 0}current(){return this.cached}async refresh(n=xF){let a=(await this.promptFn(n)).trim();return a&&(this.cached=a,this.registry&&writeCachedOtp(this.registry,a)),a}invalidate(){this.cached=void 0,this.registry&&clearCachedOtp(this.registry)}}});async function publishWorkspace(n){let{wsDir:a,tag:S,access:C,provenance:N,tolerate:F,tolerateUntrustedNew:I,trustedFlag:H,verbose:W,json:K,otpProvider:q}=n,Y=await packWorkspace(a,{dryRun:!0,lifecycleScripts:[`prepublishOnly`,`prepack`],lifecycleStdio:K?`inherit-stderr`:`inherit`}),X=await packWorkspaceToBytes(a),te=readFileSync(ms(a,`package.json`),`utf-8`),ne=await loadRewrittenManifest(a,JSON.parse(te)),re=await loadNpmrc(a),ie=n.registry??process.env.npm_config_registry??registryFor(Y.name,re)??ZM,ae=ie.endsWith(`/`)?ie.slice(0,-1):ie,oe=`${ae}/${escapePackageName(Y.name)}`,Z=`${Y.name.includes(`/`)?Y.name.slice(Y.name.indexOf(`/`)+1):Y.name}-${Y.version}.tgz`,se=buildPublishPayload({pkg:ne,tag:S,access:C,tarballBytes:X,tarballUrl:`${ae}/${Y.name}/-/${Z}`,packed:{...Y,wireFilename:Z},provenance:N}),ce=buildPublishHeaders(oe,{npmrc:re}),le=H===!0||H===void 0&&hasGithubOidcEnv()&&!process.env.NODE_AUTH_TOKEN,ue=`token`;if(le)try{let{token:n,audience:a}=await getNpmTrustedToken({packageName:Y.name,registry:ie,log:W?n=>he.error(n):void 0});ce.authorization=`Bearer ${n}`,ue=`oidc`,W&&he.error(`gjsify publish: OIDC token obtained (audience=${a})`)}catch(n){if(n instanceof OidcExchangeError&&n.status===404&&/package not found/i.test(n.body)&&I)return{ok:!0,action:`skipped-untrusted-new`,name:Y.name,version:Y.version};if(H===!0)return{ok:!1,action:`oidc-failed`,name:Y.name,version:Y.version,error:n};if(!ce.authorization)return{ok:!1,action:`oidc-no-token`,name:Y.name,version:Y.version,error:n};if(W){let a=n instanceof Error?n.message:String(n);he.error(`gjsify publish: OIDC auto-detect failed (${a}) — falling back to token auth`)}}W&&(he.error(`gjsify publish: PUT ${oe} (${Y.name}@${Y.version})`),he.error(` auth-mode: ${ue}`),he.error(` authorization: ${ce.authorization?`(set)`:`(none)`}`),he.error(` payload size: ${JSON.stringify(se).length} bytes`));let de=JSON.stringify(se),doPut=n=>{let a={...ce};return n&&(a[`npm-otp`]=n,a[`npm-auth-type`]=`legacy`),fetch(oe,{method:`PUT`,headers:a,body:de})},fe=await withOtpRetry(doPut,q,{seedFirstAttempt:n.seedOtpFirst});if(await isOtpChallenge(fe))return{ok:!1,action:`otp-required`,name:Y.name,version:Y.version,status:fe.status};if(fe.ok)return{ok:!0,action:`published`,name:Y.name,version:Y.version,filename:Y.filename,size:Y.size,integrity:Y.integrity,tag:S,registry:ae};let pe=await fe.text().catch(()=>`<no body>`);if((fe.status===409||fe.status===403&&/previously published/i.test(pe))&&F)return{ok:!0,action:`republish-tolerated`,name:Y.name,version:Y.version,status:fe.status};if(fe.status===404&&ue===`token`&&is404DiagnosticCandidate(pe)){let n=await diagnose404({packageName:Y.name,version:Y.version,registry:ae,npmrc:re});if(n.reason!==`unknown`)return{ok:!1,action:`diagnostic`,name:Y.name,version:Y.version,status:404,diag:n}}return{ok:!1,action:`error`,name:Y.name,version:Y.version,status:fe.status,statusText:fe.statusText,text:pe}}function reportPublishOutcome(n,a){switch(n.action){case`published`:{let S={ok:!0,name:n.name,version:n.version,filename:n.filename,size:n.size,integrity:n.integrity,tag:n.tag,registry:n.registry};a?process.stdout.write(`${JSON.stringify(S,null,2)}\n`):process.stdout.write(`+ ${n.name}@${n.version}\n`);return}case`republish-tolerated`:{let S={ok:!0,action:`republish-tolerated`,name:n.name,version:n.version,status:n.status};a?process.stdout.write(`${JSON.stringify(S,null,2)}\n`):process.stdout.write(`= ${n.name}@${n.version} (already published, tolerated)\n`);return}case`skipped-untrusted-new`:a?process.stdout.write(`${JSON.stringify({ok:!0,action:`skipped-untrusted-new`,name:n.name,version:n.version,reason:`no-trusted-publisher`},null,2)}\n`):process.stdout.write(`~ ${n.name}@${n.version} (skipped — no Trusted Publisher on npm, see AGENTS.md "New @gjsify/* package: first-publish + Trusted Publisher bootstrap")\n`);return;case`otp-required`:return he.error("gjsify publish: npm requires a 2FA one-time code — re-run with `--otp <code>`"),process.exit(1);case`oidc-failed`:return handleOidcFailure(n.error,n.name,a),process.exit(1);case`oidc-no-token`:{let S=n.error instanceof Error?n.error.message:String(n.error);return he.error(`gjsify publish: OIDC token exchange failed for ${n.name} (${S}) and no fallback npm token is configured — refusing to publish without credentials.`),a&&process.stdout.write(`${JSON.stringify({ok:!1,name:n.name,version:n.version,error:`oidc-failed-no-token`},null,2)}\n`),process.exit(1)}case`diagnostic`:return a?process.stdout.write(`${JSON.stringify({ok:!1,name:n.name,version:n.version,status:404,diagnostic:n.diag.reason,username:n.diag.username},null,2)}\n`):process.stderr.write(`${n.diag.message}\n`),process.exit(1);case`error`:return he.error(`gjsify publish: ${n.name}@${n.version} — ${n.status} ${n.statusText}`),he.error(n.text),process.exit(1)}}async function packWorkspaceToBytes(n){let a=`/tmp/gjsify-publish-${process.pid}-${Date.now()}`,S=await packWorkspace(n,{destination:a,dryRun:!1,lifecycleScripts:[]});if(!S.absolutePath)throw Error(`gjsify publish: pack did not produce a file`);let C=new Uint8Array(readFileSync(S.absolutePath));try{(await Promise.resolve().then(()=>(ul(),sl))).rmSync(S.absolutePath)}catch{}try{(await Promise.resolve().then(()=>(ul(),sl))).rmdirSync(a)}catch{}return C}async function loadRewrittenManifest(n,a){let S=`/tmp/gjsify-publish-manifest-${process.pid}-${Date.now()}.tgz`,C=await packWorkspace(n,{destination:S.substring(0,S.lastIndexOf(`/`)),dryRun:!1}),{rmSync:N}=await Promise.resolve().then(()=>(ul(),sl));if(!C.absolutePath)throw Error(`gjsify publish: pack did not produce a file`);let{gunzip:F,parseTar:I}=await Promise.resolve().then(()=>(lN(),cN)),H=new Uint8Array(readFileSync(C.absolutePath));N(C.absolutePath);let W=await F(H);for(let n of I(W))if(n.name===`package/package.json`&&n.body)return JSON.parse(new TextDecoder().decode(n.body));return a}function buildPublishPayload(n){let{pkg:a,tag:S,access:C,tarballBytes:N,tarballUrl:F,packed:I,provenance:H}=n,W={...a,_id:`${I.name}@${I.version}`,dist:{integrity:I.integrity,shasum:I.shasum,tarball:F}};H&&(W._hasShrinkwrap=!1);let K={_id:I.name,name:I.name,description:typeof a.description==`string`?a.description:``,"dist-tags":{[S]:I.version},versions:{[I.version]:W},readme:``,_attachments:{[I.wireFilename]:{content_type:`application/octet-stream`,data:base64Encode(N),length:N.byteLength}}};return C&&(K.access=C),K}function base64Encode(n){let a=``,S=32768;for(let C=0;C<n.length;C+=S)a+=String.fromCharCode(...n.subarray(C,C+S));return btoa(a)}function handleOidcFailure(n,a,S){if(n instanceof OidcUnavailableError){let C=`gjsify publish: OIDC not available — ${n.message}`;S?process.stdout.write(`${JSON.stringify({ok:!1,name:a,error:`oidc-unavailable`,reason:n.reason,message:n.message})}\n`):process.stderr.write(`${C}\n`);return}if(n instanceof OidcExchangeError){let C=n.status===401||n.status===403?`npm rejected the OIDC exchange (${n.status}) — check that ${a} has a Trusted Publisher configured at https://www.npmjs.com/package/${encodeURIComponent(a)}/access pointing at this workflow.`:n.message;if(S)process.stdout.write(`${JSON.stringify({ok:!1,name:a,error:`oidc-exchange`,status:n.status,body:n.body,claims:n.claims,message:n.message})}\n`);else if(process.stderr.write(`✗ ${a}: ${C}\n`),n.body&&process.stderr.write(` ↳ npm said: ${n.body.slice(0,300)}\n`),n.claims){let a=n.claims,S=[`aud`,`iss`,`repository`,`repository_owner`,`workflow_ref`,`job_workflow_ref`,`ref`,`environment`,`sub`].filter(n=>a[n]!==void 0).map(n=>`${n}=${JSON.stringify(a[n])}`).join(`, `);S&&process.stderr.write(` ↳ JWT claims npm received: ${S}\n`)}return}let C=n instanceof Error?n.message:String(n);S?process.stdout.write(`${JSON.stringify({ok:!1,name:a,error:`unknown`,message:C})}\n`):process.stderr.write(`✗ ${a}: ${C}\n`)}var CF,wF=__esmMin(()=>{ge(),ul(),Ts(),iN(),lF(),sF(),dF(),fF(),pF(),SF(),_F(),CF={command:`publish [path]`,description:"Pack + upload the workspace at <path> (default: cwd) to its npm registry. Drop-in for `npm publish` with workspace:^ rewrite handled automatically.",builder:n=>n.positional(`path`,{description:`Workspace path (default: cwd).`,type:`string`}).option(`tag`,{description:`Dist-tag to publish under. Default: latest.`,type:`string`,default:`latest`}).option(`access`,{description:"Package access — `public` or `restricted` (required for first publish of scoped packages on the public registry).",type:`string`}).option(`otp`,{description:"npm 2FA one-time code; sent as the `npm-otp` header. Required for manual publishes from a 2FA-enabled account.",type:`string`}).option(`tolerate-republish`,{description:'Treat "version already published" as success — covers both classic 409 Conflict and the npm OIDC-path 403 Forbidden + `"previously published"` body shape. Matches yarn `--tolerate-republish`.',type:`boolean`,default:!1}).option(`tolerate-untrusted-new`,{description:'Skip (exit 0) when OIDC token exchange returns `package not found` AND no fallback token is configured — i.e. a never-before-published `@scope/<name>` whose Trusted Publisher entry hasn\'t been set up on npmjs.com yet. Without this flag, one un-bootstrapped new package breaks the entire serialized `gjsify foreach publish` loop. Pair with `--tolerate-republish` in CI release workflows so a fresh-merged package gracefully skips its first CI publish, leaving the manual-bootstrap step to a maintainer (see AGENTS.md "New @gjsify/* package: first-publish + Trusted Publisher bootstrap").',type:`boolean`,default:!1}).option(`provenance`,{description:`Pass-through flag — recorded in the payload but no signing happens (gjsify doesn't ship a sigstore signer yet).`,type:`boolean`,default:!1}).option(`dry-run`,{description:`Pack only, do not PUT.`,type:`boolean`,default:!1}).option(`json`,{description:`Emit publish metadata as JSON on stdout.`,type:`boolean`,default:!1}).option(`trusted`,{description:"Authenticate via npm Trusted Publishing (OIDC): exchange the GitHub Actions id-token for a short-lived npm token. Pass `--trusted` to force this mode (errors if env vars missing). Omit to auto-detect: OIDC is used iff `ACTIONS_ID_TOKEN_REQUEST_URL`+`_TOKEN` are set AND no `_authToken` is present in the resolved npmrc; otherwise the long-lived token path is used. Requires the calling workflow to declare `permissions: id-token: write` AND the target package to have a Trusted Publisher configured on npmjs.com.",type:`boolean`,default:void 0}).option(`check-trusted`,{description:"Diagnostic mode: perform the OIDC id-token request + npm token exchange, report success/failure, then exit WITHOUT publishing. Useful as a bulk-verifier (e.g. via `gjsify foreach publish --check-trusted`) to confirm Trusted Publisher config across many packages.",type:`boolean`,default:!1}),handler:async n=>{let a=ds(n.path??process.cwd()),S=n.tag??`latest`,C=n.access,N=n.otp,F=n[`tolerate-republish`]===!0,I=n[`tolerate-untrusted-new`]===!0,H=n.provenance===!0,W=n[`dry-run`]===!0,K=n[`check-trusted`]===!0,q=n.trusted,Y=!!process.env.GJSIFY_PUBLISH_DEBUG;if(H&&he.warn(`gjsify publish: --provenance recorded but not signed (no sigstore integration yet).`),K){let S=ms(a,`package.json`),C=JSON.parse(readFileSync(S,`utf-8`));if(typeof C.name!=`string`)return process.stderr.write(`gjsify publish --check-trusted: ${S} has no \`name\` field\n`),process.exit(2);if(C.private===!0){let a={ok:!0,action:`check-trusted`,name:C.name,skipped:`private`};n.json?process.stdout.write(`${JSON.stringify(a)}\n`):process.stdout.write(`- ${C.name}: skipped (private package)\n`);return}let N=await loadNpmrc(a),F=process.env.npm_config_registry??registryFor(C.name,N)??ZM;try{await getNpmTrustedToken({packageName:C.name,registry:F,log:Y?n=>he.error(n):void 0});let a={ok:!0,action:`check-trusted`,name:C.name,registry:F};n.json?process.stdout.write(`${JSON.stringify(a)}\n`):process.stdout.write(`✓ ${C.name}: trusted publisher OK\n`);return}catch(a){handleOidcFailure(a,C.name,n.json===!0);return}}if(W){let S=await packWorkspace(a,{dryRun:!0,lifecycleScripts:[`prepublishOnly`,`prepack`],lifecycleStdio:n.json?`inherit-stderr`:`inherit`}),C={ok:!0,action:`dry-run`,name:S.name,version:S.version,filename:S.filename,size:S.size,shasum:S.shasum,integrity:S.integrity};n.json?process.stdout.write(`${JSON.stringify(C,null,2)}\n`):process.stdout.write(`+ ${S.name}@${S.version} (dry-run, ${S.size} bytes, ${S.entryCount} files)\n`);return}let X=!!(process.stdin.isTTY&&process.stdout.isTTY),te=await loadNpmrc(a),ne;try{ne=JSON.parse(readFileSync(ms(a,`package.json`),`utf-8`)).name}catch{}let re=process.env.npm_config_registry??(ne?registryFor(ne,te):void 0)??te.registry??ZM,ie=new OtpProvider(N,X?promptLine:async()=>``,{registry:re});reportPublishOutcome(await publishWorkspace({wsDir:a,tag:S,access:C,provenance:H,tolerate:F,tolerateUntrustedNew:I,trustedFlag:q,verbose:Y,json:n.json===!0,otpProvider:ie,seedOtpFirst:N!==void 0}),n.json===!0)}}}),TF,EF=__esmMin(()=>{iN(),pF(),TF={command:`whoami`,description:`Print the npm-registry username for the current ~/.npmrc token. Clear failure message when the token is dead, missing, or the registry is unreachable.`,builder:n=>n.option(`registry`,{description:`Registry URL to probe. Default: scope-aware lookup from .npmrc (falls back to ${ZM}).`,type:`string`}).option(`json`,{description:"Emit `{username, registry}` (or `{error, registry}`) as a single-line JSON object.",type:`boolean`,default:!1}),handler:async n=>{let a=await loadNpmrc(process.cwd()),S=n.registry??process.env.npm_config_registry??a.registry??ZM,C=S.endsWith(`/`)?S.slice(0,-1):S,N=n.json===!0;if(!hasAnyCredential(a))return N?process.stdout.write(`${JSON.stringify({error:`no-token-configured`,registry:C})}\n`):process.stderr.write([`gjsify whoami: no npm token configured.`,``,`No \`_authToken\` found in ~/.npmrc / $NPM_CONFIG_USERCONFIG / .npmrc for ${C}.`,``,`Add one via: npm login`,`Then verify: gjsify whoami`].join(`
|
|
908
|
+
`,done:!0,interrupt:!1}:a===gF?{buf:n,echo:`
|
|
909
|
+
`,done:!1,interrupt:!0}:a===_F||a===vF?n.length>0?{buf:n.slice(0,-1),echo:`\b \b`,done:!1,interrupt:!1}:{buf:n,echo:``,done:!1,interrupt:!1}:a>=` `?{buf:n+a,echo:S?`*`:a,done:!1,interrupt:!1}:{buf:n,echo:``,done:!1,interrupt:!1}}async function runRawSession(n){let a=process.stdin,S=process.stdout,C=null,cleanup=()=>{a.removeListener(`data`,onData);try{a.setRawMode(!1)}catch{}typeof a.pause==`function`&&a.pause()},onData=n=>{let a=typeof n==`string`?n:n.toString(`utf-8`);for(let n of a){if(!C)continue;let a=applyKey(C.buf,n,C.mask);if(C.buf=a.buf,a.echo&&S.write(a.echo),a.interrupt)return cleanup(),process.exit(130);if(a.done){let{resolve:n}=C;C=null,n(a.buf)}}};a.setRawMode(!0),typeof a.resume==`function`&&a.resume(),a.setEncoding(`utf-8`),a.on(`data`,onData);let read=(n,a)=>new Promise(N=>{S.write(n),C={mask:a,buf:``,resolve:N}});try{return await n(read)}finally{cleanup()}}function readLine(){return new Promise(n=>{let a=``,onData=S=>{a+=typeof S==`string`?S:S.toString(`utf-8`);let C=a.search(/[\r\n]/);C>=0&&(cleanup(),n(a.slice(0,C)))},onEnd=()=>{cleanup(),n(a.replace(/\r$/,``).trim())},cleanup=()=>{process.stdin.removeListener(`data`,onData),process.stdin.removeListener(`end`,onEnd)};process.stdin.setEncoding(`utf-8`),typeof process.stdin.isPaused==`function`&&process.stdin.isPaused()&&process.stdin.resume(),process.stdin.on(`data`,onData),process.stdin.once(`end`,onEnd)})}async function promptLine(n){return isTtyStdin()?runRawSession(a=>a(n,!1)):(process.stdout.write(n),readLine())}async function promptCredentials(n){if(!isTtyStdin()){let a=n;a||=(process.stdout.write(`Username: `),await readLine()),process.stdout.write(`Password: `);let S=await readLine();return{username:a,password:S}}return runRawSession(async a=>({username:n??await a(`Username: `,!1),password:await a(`Password: `,!0)}))}var gF,_F,vF,yF=__esmMin(()=>{gF=``,_F=``,vF=`\b`});function isOtpCacheEnabled(){let n=process.env[bF];return!(n===`1`||n===`true`||n===`yes`)}function normalizeRegistry(n){return n.endsWith(`/`)?n.slice(0,-1):n}function cacheBaseDir(n){if(n?.dir)return n.dir;let a=process.env.XDG_RUNTIME_DIR;return ms(a&&a.length>0?a:tmpdir(),xF)}function cacheFileFor(n,a){let S=normalizeRegistry(n).replace(/[^a-zA-Z0-9]+/g,`-`).replace(/^-+|-+$/g,``).slice(0,120);return ms(cacheBaseDir(a),`otp-${S||`default`}.json`)}function readCachedOtp(n,a){if(!isOtpCacheEnabled())return;let S=a?.now??Date.now(),C=cacheFileFor(n,a);try{if(!existsSync(C))return;let a=JSON.parse(readFileSync(C,`utf8`));if(!a||typeof a.otp!=`string`||typeof a.expiresAt!=`number`){deleteCacheFile(C);return}if(a.registry!==normalizeRegistry(n))return;if(S>=a.expiresAt){deleteCacheFile(C);return}return a.otp.length>0?a.otp:void 0}catch{deleteCacheFile(C);return}}function writeCachedOtp(n,a,S){if(!isOtpCacheEnabled()||!a||a.length===0)return;let C=S?.now??Date.now(),N=S?.ttlMs??3e4;try{mkdirSync(cacheBaseDir(S),{recursive:!0,mode:448});let F=cacheFileFor(n,S),I={otp:a,expiresAt:C+N,registry:normalizeRegistry(n)};writeFileSync(F,JSON.stringify(I),{mode:384}),chmodSync(F,384)}catch{}}function clearCachedOtp(n,a){deleteCacheFile(cacheFileFor(n,a))}function deleteCacheFile(n){try{existsSync(n)&&rmSync(n,{force:!0})}catch{}}var bF,xF,SF=__esmMin(()=>{ul(),am(),Ts(),bF=`GJSIFY_NO_OTP_CACHE`,xF=`gjsify-otp`});async function isOtpChallenge(n){if(n.status!==401)return!1;if((n.headers.get(`www-authenticate`)??``).toLowerCase().includes(`otp`))return!0;let a=await n.clone().text().catch(()=>``);return/one-time pass/i.test(a)||/\bEOTP\b/.test(a)}async function withOtpRetry(n,a,S={}){let C=S.maxPrompts??2,N=S.question??CF,F=a.current(),I=S.seedFirstAttempt===!0&&F!==void 0,H=await n(I?F:void 0);if(!await isOtpChallenge(H))return H;if(I&&a.invalidate(),!I&&a.current()!==void 0){if(H=await n(a.current()),!await isOtpChallenge(H))return H;a.invalidate()}for(let S=0;S<C;S++){let S=await a.refresh(N);if(!S||(H=await n(S),!await isOtpChallenge(H)))return H;a.invalidate()}return H}var CF,OtpProvider,wF=__esmMin(()=>{yF(),SF(),CF=`This operation requires a one-time password.
|
|
910
|
+
Enter OTP: `,OtpProvider=class{cached;promptFn;registry;constructor(n,a=promptLine,S={}){this.promptFn=a,this.registry=S.registry;let C=n&&n.length>0?n:void 0;C?(this.cached=C,this.registry&&writeCachedOtp(this.registry,C)):this.cached=this.registry?readCachedOtp(this.registry):void 0}current(){return this.cached}async refresh(n=CF){let a=(await this.promptFn(n)).trim();return a&&(this.cached=a,this.registry&&writeCachedOtp(this.registry,a)),a}invalidate(){this.cached=void 0,this.registry&&clearCachedOtp(this.registry)}}});async function publishWorkspace(n){let{wsDir:a,tag:S,access:C,provenance:N,tolerate:F,tolerateUntrustedNew:I,trustedFlag:H,verbose:W,json:K,otpProvider:q}=n,Y=await packWorkspace(a,{dryRun:!0,lifecycleScripts:[`prepublishOnly`,`prepack`],lifecycleStdio:K?`inherit-stderr`:`inherit`}),X=await packWorkspaceToBytes(a),te=readFileSync(ms(a,`package.json`),`utf-8`),ne=await loadRewrittenManifest(a,JSON.parse(te)),re=await loadNpmrc(a),ie=n.registry??process.env.npm_config_registry??registryFor(Y.name,re)??$M,ae=ie.endsWith(`/`)?ie.slice(0,-1):ie,oe=`${ae}/${escapePackageName(Y.name)}`,Z=`${Y.name.includes(`/`)?Y.name.slice(Y.name.indexOf(`/`)+1):Y.name}-${Y.version}.tgz`,se=buildPublishPayload({pkg:ne,tag:S,access:C,tarballBytes:X,tarballUrl:`${ae}/${Y.name}/-/${Z}`,packed:{...Y,wireFilename:Z},provenance:N}),ce=buildPublishHeaders(oe,{npmrc:re}),le=H===!0||H===void 0&&hasGithubOidcEnv()&&!process.env.NODE_AUTH_TOKEN,ue=`token`;if(le)try{let{token:n,audience:a}=await getNpmTrustedToken({packageName:Y.name,registry:ie,log:W?n=>he.error(n):void 0});ce.authorization=`Bearer ${n}`,ue=`oidc`,W&&he.error(`gjsify publish: OIDC token obtained (audience=${a})`)}catch(n){if(n instanceof OidcExchangeError&&n.status===404&&/package not found/i.test(n.body)&&I)return{ok:!0,action:`skipped-untrusted-new`,name:Y.name,version:Y.version};if(H===!0)return{ok:!1,action:`oidc-failed`,name:Y.name,version:Y.version,error:n};if(!ce.authorization)return{ok:!1,action:`oidc-no-token`,name:Y.name,version:Y.version,error:n};if(W){let a=n instanceof Error?n.message:String(n);he.error(`gjsify publish: OIDC auto-detect failed (${a}) — falling back to token auth`)}}W&&(he.error(`gjsify publish: PUT ${oe} (${Y.name}@${Y.version})`),he.error(` auth-mode: ${ue}`),he.error(` authorization: ${ce.authorization?`(set)`:`(none)`}`),he.error(` payload size: ${JSON.stringify(se).length} bytes`));let de=JSON.stringify(se),doPut=n=>{let a={...ce};return n&&(a[`npm-otp`]=n,a[`npm-auth-type`]=`legacy`),fetch(oe,{method:`PUT`,headers:a,body:de})},fe=await withOtpRetry(doPut,q,{seedFirstAttempt:n.seedOtpFirst});if(await isOtpChallenge(fe))return{ok:!1,action:`otp-required`,name:Y.name,version:Y.version,status:fe.status};if(fe.ok)return{ok:!0,action:`published`,name:Y.name,version:Y.version,filename:Y.filename,size:Y.size,integrity:Y.integrity,tag:S,registry:ae};let pe=await fe.text().catch(()=>`<no body>`);if((fe.status===409||fe.status===403&&/previously published/i.test(pe))&&F)return{ok:!0,action:`republish-tolerated`,name:Y.name,version:Y.version,status:fe.status};if(fe.status===404&&ue===`token`&&is404DiagnosticCandidate(pe)){let n=await diagnose404({packageName:Y.name,version:Y.version,registry:ae,npmrc:re});if(n.reason!==`unknown`)return{ok:!1,action:`diagnostic`,name:Y.name,version:Y.version,status:404,diag:n}}return{ok:!1,action:`error`,name:Y.name,version:Y.version,status:fe.status,statusText:fe.statusText,text:pe}}function reportPublishOutcome(n,a){switch(n.action){case`published`:{let S={ok:!0,name:n.name,version:n.version,filename:n.filename,size:n.size,integrity:n.integrity,tag:n.tag,registry:n.registry};a?process.stdout.write(`${JSON.stringify(S,null,2)}\n`):process.stdout.write(`+ ${n.name}@${n.version}\n`);return}case`republish-tolerated`:{let S={ok:!0,action:`republish-tolerated`,name:n.name,version:n.version,status:n.status};a?process.stdout.write(`${JSON.stringify(S,null,2)}\n`):process.stdout.write(`= ${n.name}@${n.version} (already published, tolerated)\n`);return}case`skipped-untrusted-new`:a?process.stdout.write(`${JSON.stringify({ok:!0,action:`skipped-untrusted-new`,name:n.name,version:n.version,reason:`no-trusted-publisher`},null,2)}\n`):process.stdout.write(`~ ${n.name}@${n.version} (skipped — no Trusted Publisher on npm, see AGENTS.md "New @gjsify/* package: first-publish + Trusted Publisher bootstrap")\n`);return;case`otp-required`:return he.error("gjsify publish: npm requires a 2FA one-time code — re-run with `--otp <code>`"),process.exit(1);case`oidc-failed`:return handleOidcFailure(n.error,n.name,a),process.exit(1);case`oidc-no-token`:{let S=n.error instanceof Error?n.error.message:String(n.error);return he.error(`gjsify publish: OIDC token exchange failed for ${n.name} (${S}) and no fallback npm token is configured — refusing to publish without credentials.`),a&&process.stdout.write(`${JSON.stringify({ok:!1,name:n.name,version:n.version,error:`oidc-failed-no-token`},null,2)}\n`),process.exit(1)}case`diagnostic`:return a?process.stdout.write(`${JSON.stringify({ok:!1,name:n.name,version:n.version,status:404,diagnostic:n.diag.reason,username:n.diag.username},null,2)}\n`):process.stderr.write(`${n.diag.message}\n`),process.exit(1);case`error`:return he.error(`gjsify publish: ${n.name}@${n.version} — ${n.status} ${n.statusText}`),he.error(n.text),process.exit(1)}}async function packWorkspaceToBytes(n){let a=`/tmp/gjsify-publish-${process.pid}-${Date.now()}`,S=await packWorkspace(n,{destination:a,dryRun:!1,lifecycleScripts:[]});if(!S.absolutePath)throw Error(`gjsify publish: pack did not produce a file`);let C=new Uint8Array(readFileSync(S.absolutePath));try{(await Promise.resolve().then(()=>(ul(),sl))).rmSync(S.absolutePath)}catch{}try{(await Promise.resolve().then(()=>(ul(),sl))).rmdirSync(a)}catch{}return C}async function loadRewrittenManifest(n,a){let S=`/tmp/gjsify-publish-manifest-${process.pid}-${Date.now()}.tgz`,C=await packWorkspace(n,{destination:S.substring(0,S.lastIndexOf(`/`)),dryRun:!1}),{rmSync:N}=await Promise.resolve().then(()=>(ul(),sl));if(!C.absolutePath)throw Error(`gjsify publish: pack did not produce a file`);let{gunzip:F,parseTar:I}=await Promise.resolve().then(()=>(dN(),uN)),H=new Uint8Array(readFileSync(C.absolutePath));N(C.absolutePath);let W=await F(H);for(let n of I(W))if(n.name===`package/package.json`&&n.body)return JSON.parse(new TextDecoder().decode(n.body));return a}function buildPublishPayload(n){let{pkg:a,tag:S,access:C,tarballBytes:N,tarballUrl:F,packed:I,provenance:H}=n,W={...a,_id:`${I.name}@${I.version}`,dist:{integrity:I.integrity,shasum:I.shasum,tarball:F}};H&&(W._hasShrinkwrap=!1);let K={_id:I.name,name:I.name,description:typeof a.description==`string`?a.description:``,"dist-tags":{[S]:I.version},versions:{[I.version]:W},readme:``,_attachments:{[I.wireFilename]:{content_type:`application/octet-stream`,data:base64Encode(N),length:N.byteLength}}};return C&&(K.access=C),K}function base64Encode(n){let a=``,S=32768;for(let C=0;C<n.length;C+=S)a+=String.fromCharCode(...n.subarray(C,C+S));return btoa(a)}function handleOidcFailure(n,a,S){if(n instanceof OidcUnavailableError){let C=`gjsify publish: OIDC not available — ${n.message}`;S?process.stdout.write(`${JSON.stringify({ok:!1,name:a,error:`oidc-unavailable`,reason:n.reason,message:n.message})}\n`):process.stderr.write(`${C}\n`);return}if(n instanceof OidcExchangeError){let C=n.status===401||n.status===403?`npm rejected the OIDC exchange (${n.status}) — check that ${a} has a Trusted Publisher configured at https://www.npmjs.com/package/${encodeURIComponent(a)}/access pointing at this workflow.`:n.message;if(S)process.stdout.write(`${JSON.stringify({ok:!1,name:a,error:`oidc-exchange`,status:n.status,body:n.body,claims:n.claims,message:n.message})}\n`);else if(process.stderr.write(`✗ ${a}: ${C}\n`),n.body&&process.stderr.write(` ↳ npm said: ${n.body.slice(0,300)}\n`),n.claims){let a=n.claims,S=[`aud`,`iss`,`repository`,`repository_owner`,`workflow_ref`,`job_workflow_ref`,`ref`,`environment`,`sub`].filter(n=>a[n]!==void 0).map(n=>`${n}=${JSON.stringify(a[n])}`).join(`, `);S&&process.stderr.write(` ↳ JWT claims npm received: ${S}\n`)}return}let C=n instanceof Error?n.message:String(n);S?process.stdout.write(`${JSON.stringify({ok:!1,name:a,error:`unknown`,message:C})}\n`):process.stderr.write(`✗ ${a}: ${C}\n`)}var TF,EF=__esmMin(()=>{ge(),ul(),Ts(),oN(),dF(),lF(),pF(),mF(),hF(),wF(),yF(),TF={command:`publish [path]`,description:"Pack + upload the workspace at <path> (default: cwd) to its npm registry. Drop-in for `npm publish` with workspace:^ rewrite handled automatically.",builder:n=>n.positional(`path`,{description:`Workspace path (default: cwd).`,type:`string`}).option(`tag`,{description:`Dist-tag to publish under. Default: latest.`,type:`string`,default:`latest`}).option(`access`,{description:"Package access — `public` or `restricted` (required for first publish of scoped packages on the public registry).",type:`string`}).option(`otp`,{description:"npm 2FA one-time code; sent as the `npm-otp` header. Required for manual publishes from a 2FA-enabled account.",type:`string`}).option(`tolerate-republish`,{description:'Treat "version already published" as success — covers both classic 409 Conflict and the npm OIDC-path 403 Forbidden + `"previously published"` body shape. Matches yarn `--tolerate-republish`.',type:`boolean`,default:!1}).option(`tolerate-untrusted-new`,{description:'Skip (exit 0) when OIDC token exchange returns `package not found` AND no fallback token is configured — i.e. a never-before-published `@scope/<name>` whose Trusted Publisher entry hasn\'t been set up on npmjs.com yet. Without this flag, one un-bootstrapped new package breaks the entire serialized `gjsify foreach publish` loop. Pair with `--tolerate-republish` in CI release workflows so a fresh-merged package gracefully skips its first CI publish, leaving the manual-bootstrap step to a maintainer (see AGENTS.md "New @gjsify/* package: first-publish + Trusted Publisher bootstrap").',type:`boolean`,default:!1}).option(`provenance`,{description:`Pass-through flag — recorded in the payload but no signing happens (gjsify doesn't ship a sigstore signer yet).`,type:`boolean`,default:!1}).option(`dry-run`,{description:`Pack only, do not PUT.`,type:`boolean`,default:!1}).option(`json`,{description:`Emit publish metadata as JSON on stdout.`,type:`boolean`,default:!1}).option(`trusted`,{description:"Authenticate via npm Trusted Publishing (OIDC): exchange the GitHub Actions id-token for a short-lived npm token. Pass `--trusted` to force this mode (errors if env vars missing). Omit to auto-detect: OIDC is used iff `ACTIONS_ID_TOKEN_REQUEST_URL`+`_TOKEN` are set AND no `_authToken` is present in the resolved npmrc; otherwise the long-lived token path is used. Requires the calling workflow to declare `permissions: id-token: write` AND the target package to have a Trusted Publisher configured on npmjs.com.",type:`boolean`,default:void 0}).option(`check-trusted`,{description:"Diagnostic mode: perform the OIDC id-token request + npm token exchange, report success/failure, then exit WITHOUT publishing. Useful as a bulk-verifier (e.g. via `gjsify foreach publish --check-trusted`) to confirm Trusted Publisher config across many packages.",type:`boolean`,default:!1}),handler:async n=>{let a=ds(n.path??process.cwd()),S=n.tag??`latest`,C=n.access,N=n.otp,F=n[`tolerate-republish`]===!0,I=n[`tolerate-untrusted-new`]===!0,H=n.provenance===!0,W=n[`dry-run`]===!0,K=n[`check-trusted`]===!0,q=n.trusted,Y=!!process.env.GJSIFY_PUBLISH_DEBUG;if(H&&he.warn(`gjsify publish: --provenance recorded but not signed (no sigstore integration yet).`),K){let S=ms(a,`package.json`),C=JSON.parse(readFileSync(S,`utf-8`));if(typeof C.name!=`string`)return process.stderr.write(`gjsify publish --check-trusted: ${S} has no \`name\` field\n`),process.exit(2);if(C.private===!0){let a={ok:!0,action:`check-trusted`,name:C.name,skipped:`private`};n.json?process.stdout.write(`${JSON.stringify(a)}\n`):process.stdout.write(`- ${C.name}: skipped (private package)\n`);return}let N=await loadNpmrc(a),F=process.env.npm_config_registry??registryFor(C.name,N)??$M;try{await getNpmTrustedToken({packageName:C.name,registry:F,log:Y?n=>he.error(n):void 0});let a={ok:!0,action:`check-trusted`,name:C.name,registry:F};n.json?process.stdout.write(`${JSON.stringify(a)}\n`):process.stdout.write(`✓ ${C.name}: trusted publisher OK\n`);return}catch(a){handleOidcFailure(a,C.name,n.json===!0);return}}if(W){let S=await packWorkspace(a,{dryRun:!0,lifecycleScripts:[`prepublishOnly`,`prepack`],lifecycleStdio:n.json?`inherit-stderr`:`inherit`}),C={ok:!0,action:`dry-run`,name:S.name,version:S.version,filename:S.filename,size:S.size,shasum:S.shasum,integrity:S.integrity};n.json?process.stdout.write(`${JSON.stringify(C,null,2)}\n`):process.stdout.write(`+ ${S.name}@${S.version} (dry-run, ${S.size} bytes, ${S.entryCount} files)\n`);return}let X=!!(process.stdin.isTTY&&process.stdout.isTTY),te=await loadNpmrc(a),ne;try{ne=JSON.parse(readFileSync(ms(a,`package.json`),`utf-8`)).name}catch{}let re=process.env.npm_config_registry??(ne?registryFor(ne,te):void 0)??te.registry??$M,ie=new OtpProvider(N,X?promptLine:async()=>``,{registry:re});reportPublishOutcome(await publishWorkspace({wsDir:a,tag:S,access:C,provenance:H,tolerate:F,tolerateUntrustedNew:I,trustedFlag:q,verbose:Y,json:n.json===!0,otpProvider:ie,seedOtpFirst:N!==void 0}),n.json===!0)}}}),DF,OF=__esmMin(()=>{oN(),hF(),DF={command:`whoami`,description:`Print the npm-registry username for the current ~/.npmrc token. Clear failure message when the token is dead, missing, or the registry is unreachable.`,builder:n=>n.option(`registry`,{description:`Registry URL to probe. Default: scope-aware lookup from .npmrc (falls back to ${$M}).`,type:`string`}).option(`json`,{description:"Emit `{username, registry}` (or `{error, registry}`) as a single-line JSON object.",type:`boolean`,default:!1}),handler:async n=>{let a=await loadNpmrc(process.cwd()),S=n.registry??process.env.npm_config_registry??a.registry??$M,C=S.endsWith(`/`)?S.slice(0,-1):S,N=n.json===!0;if(!hasAnyCredential(a))return N?process.stdout.write(`${JSON.stringify({error:`no-token-configured`,registry:C})}\n`):process.stderr.write([`gjsify whoami: no npm token configured.`,``,`No \`_authToken\` found in ~/.npmrc / $NPM_CONFIG_USERCONFIG / .npmrc for ${C}.`,``,`Add one via: npm login`,`Then verify: gjsify whoami`].join(`
|
|
911
911
|
`)+`
|
|
912
912
|
`),process.exit(1);let F;try{F=await whoami(S,a)}catch(n){let a=n instanceof Error?n.message:String(n);return N?process.stdout.write(`${JSON.stringify({error:a,registry:C})}\n`):(process.stderr.write(`gjsify whoami: ${a}\n`),process.stderr.write(`Registry: ${C}\n`)),process.exit(1)}if(F.username&&F.username.length>0){N?process.stdout.write(`${JSON.stringify({username:F.username,registry:C})}\n`):(process.stdout.write(`Logged in as: ${F.username}\n`),process.stdout.write(`Registry: ${C}\n`));return}N?process.stdout.write(`${JSON.stringify({error:`dead-token`,registry:C})}\n`):process.stderr.write([`gjsify whoami: token appears dead or revoked (registry returned an empty whoami response).`,``,`Refresh via: npm login`,`Then verify: gjsify whoami`,``,`For the @gjsify scope, see AGENTS.md > "New @gjsify/* package: first-publish + Trusted Publisher bootstrap".`].join(`
|
|
913
913
|
`)+`
|
|
@@ -916,22 +916,22 @@ Enter OTP: `,OtpProvider=class{cached;promptFn;registry;constructor(n,a=promptLi
|
|
|
916
916
|
`)+`
|
|
917
917
|
`),S}function removeAuthToken(n){let a=userconfigNpmrcPath(),S=authTokenKey(n),C=readUserconfig(a);if(!C)return{path:a,removed:!1};let N=C.split(`
|
|
918
918
|
`),F=N.filter(n=>!n.replace(/\s+/g,``).startsWith(`${S}=`)),I=F.length!==N.length;return I&&writeUserconfig(a,F.join(`
|
|
919
|
-
`)),{path:a,removed:I}}var
|
|
920
|
-
Enter OTP: `),!q)throw new LoginError(`gjsify login: no OTP entered.`);writeCachedOtp(C,q),Y=await putUser(``,q)}}if(Y.status===409){let n=await fetch(`${H}?write=true`,{headers:authHeaders(q)});if(n.ok){let a=await n.json().catch(()=>({}));for(let n of Object.keys(a))(!W[n]||n===`roles`)&&(W[n]=a[n]);W._rev&&(Y=await putUser(`/-rev/${W._rev}`,q))}}if(Y.status===400)throw new LoginError(`gjsify login: there is no user with the username "${N}" on ${C}.`);if(!Y.ok){let n=await Y.text().catch(()=>`<no body>`);throw new LoginError(`gjsify login: ${Y.status} ${Y.statusText} from ${C}\n${n.slice(0,400)}`)}let X=await Y.json().catch(()=>({}));if(!X.token)throw new LoginError("gjsify login: the registry accepted the login but returned no token (unexpected response shape). Your registry may require the web-OAuth flow — use `npm login`.");let te=writeAuthToken(C,X.token);return q&&writeCachedOtp(C,q),{username:(await whoami(C,await loadNpmrc(n.cwd??process.cwd()))).username??N,registry:C,npmrcPath:te}}var LoginError,
|
|
921
|
-
`)[0].slice(0,200)}var
|
|
922
|
-
(\`gjsify trust\` uses the ~/.npmrc bearer token directly — unlike \`npm trust\`, which logs in via the browser.)`),process.exit(1)}if(!n.username)return he.error("gjsify trust: your npm token appears dead or revoked (registry returned an empty whoami).\nRefresh it with `npm login`, then re-run."),process.exit(1);he.log(`gjsify trust: authenticated as ${n.username}`)}let N=n.repository;if(!N){let n=spawnSync(`git`,[`remote`,`get-url`,`origin`],{cwd:a,encoding:`utf8`});n.status===0&&(N=parseRepoFromGitRemote(n.stdout)??void 0)}if(!N)return he.error("gjsify trust: could not determine the GitHub repository.\nPass --repository owner/repo (no `origin` remote to infer from)."),process.exit(1);if(!validateRepository(N))return he.error(`gjsify trust: --repository must be "owner/repo", got "${N}".`),process.exit(1);let F=normalizeWorkflowFile(n.workflow),I=n.environment,H=n.list===!0,W=n[`dry-run`]===!0,K=n.force===!0,q=ms(a,`.github`,`workflows`,F);existsSync(q)||he.warn(`gjsify trust: note — ${q} not found; configuring trust for "${F}" anyway.`);let Y=filterWorkspaces(mergePublishables(discoverWorkspaces(a,{includeRoot:!0}),a),{noPrivate:n.private!==!0,include:n.packages&&n.packages.length>0?n.packages:void 0}).filter(n=>n.name);if(Y.length===0)return he.error(`gjsify trust: no publishable packages matched.`),process.exit(1);he.log(`gjsify trust: ${Y.length} package(s) | repo=${N} workflow=${F}`),W&&he.log(`(dry-run — nothing will be written)`),he.log();let X=createTrustRequester({npmrc:S,otpProvider:new OtpProvider(n.otp)}),te=0,ne=0,re=0,ie=0,ae=[],oe=[];for(let a of Y){let C=a.name,q=trustUrl(n.registry??registryFor(C,S)??ZM,C);process.stdout.write(`→ ${C.padEnd(42)} `);let Y=await X(`GET`,q),Z=classifyTrustList(Y.status,Y.json,{repository:N,workflow:F});if(H){Z===`trusted`?he.log(`trusted`):Z===`unpublished`?he.log(`unpublished`):Z===`auth-required`?he.log(`auth-required (could not read)`):Z===`untrusted`?he.log(`not trusted`):he.log(`error (HTTP ${Y.status})`);continue}if(Z===`trusted`&&!K){he.log(`already configured — skip`),ne++;continue}if(Z===`unpublished`){he.log(`not on npm yet — needs first-publish, skip`),re++,ae.push(C);continue}if(W){he.log(`would configure`),te++;continue}let se=await X(`POST`,q,githubTrustBody({repository:N,workflow:F,environment:I}));se.status>=200&&se.status<300?(he.log(`configured`),te++):se.status===409?(he.log(`already configured (409) — done`),ne++):se.status===404?(he.log(`not on npm yet — needs first-publish, skip`),re++,ae.push(C)):(he.log(`FAILED (HTTP ${se.status})`),ie++,oe.push(`${C} — HTTP ${se.status}${se.text?`: ${firstLine(se.text)}`:``}`))}if(!H){if(he.log(),he.log(`Done: ${te} ${W?`would-configure`:`configured`}, ${ne} already-configured, ${re} unpublished, ${ie} failed.`),ae.length>0){he.log("Need a first publish before they can be trust-configured (then re-run `gjsify trust`):");for(let n of ae)he.log(` ${n}`)}if(oe.length>0){he.log("Failed (re-run `gjsify trust` — it is incremental; usually a lapsed 2FA window or rate-limit):");for(let n of oe)he.log(` ${n}`);process.exit(1)}}}}});function actionForState(n){switch(n){case`trusted`:return`skip`;case`untrusted`:return`trust`;case`unpublished`:return`publish-and-trust`;default:return`blocked`}}function defaultSleep(n){return new Promise(a=>setTimeout(a,n))}async function probeTrustState(n,a,S,C={}){let N=S.registryOverride??registryFor(a.name,S.npmrc)??ZM,F=trustUrl(N,a.name),I={repository:S.repository,workflow:S.workflow},H=await n(`GET`,F),W=classifyTrustList(H.status,H.json,I);return W===`auth-required`&&C.retryOn401!==!1&&(await(C.sleep??defaultSleep)(C.retryDelayMs??400),H=await n(`GET`,F),W=classifyTrustList(H.status,H.json,I)),{ws:a,registry:N,url:F,state:W,httpStatus:H.status,action:actionForState(W)}}async function probeAllTrustStates(n,a,S,C,N={}){return a.length===0?[]:[await probeTrustState(n,a[0],C,N),...await mapWithConcurrency(a.slice(1),Math.max(1,S),a=>probeTrustState(n,a,C,N))]}async function mapWithConcurrency(n,a,S){let C=Array.from({length:n.length}),N=0,F=Array.from({length:Math.min(Math.max(1,a),n.length)},async()=>{for(;;){let a=N++;if(a>=n.length)return;C[a]=await S(n[a])}});return await Promise.all(F),C}var RF=__esmMin(()=>{iN(),FF()});function finish(n,a,S){let C=S.failed??0;if(S.asJson)process.stdout.write(`${JSON.stringify({ok:C===0,dryRun:S.dryRun,total:a.length,published:n.filter(n=>n.result===`published`||n.result===`published+trusted`).length,trusted:n.filter(n=>n.result===`trusted`||n.result===`published+trusted`).length,alreadyDone:n.filter(n=>n.result===`already-done`).length,failed:C,results:n},null,2)}\n`);else{let a=S.dryRun?`Dry-run complete — nothing changed.`:`Done: ${n.filter(n=>n.result.includes(`published`)).length} published, ${n.filter(n=>n.result===`trusted`||n.result===`published+trusted`).length} trusted, ${n.filter(n=>n.result===`already-done`).length} already done, ${C} failed.`;process.stdout.write(`\n${a}\n`)}process.exit(+(C>0))}function statusCell(n){switch(n.action){case`skip`:return`published✓ trusted✓`;case`trust`:return`published✓ trust… `;case`publish-and-trust`:return`publish… trust… `;case`blocked`:return`unreadable (${n.httpStatus})`}}async function ensureAuthenticated(n){let{npmrc:a,registry:S,cwd:C,nonInteractive:N,dryRun:F,otp:I,log:H}=n;if(hasAnyCredential(a))try{let n=await whoami(S,a);if(n.username)return n.username}catch{}if(F){H(`gjsify onboard: no live npm token — dry-run continues (state reads may be limited).`);return}if(N)throw Error("gjsify onboard: not authenticated and --yes was passed — run `gjsify login` first (or omit --yes to log in interactively).");H(`gjsify onboard: no live npm token — logging in…`);try{return(await runLogin({registry:S,otp:I,cwd:C})).username}catch(n){throw n instanceof LoginError?Error(n.message):n}}async function buildIfPresent(n,a){if(typeof(n.manifest.scripts??{}).build!=`string`)return;let S=detectPackageManager(),C=[`run`,`build`];a(` $ ${S} ${C.join(` `)}`),await new Promise((a,N)=>{let F=spawn(S,C,{cwd:n.location,stdio:`inherit`,env:{...process.env}});F.on(`close`,n=>{n===0?a():N(Error(`build exited with code ${n}`))}),F.on(`error`,N)})}function describePublishFailure(n){switch(n.action){case`otp-required`:return`npm required a 2FA code (re-run with --otp, or on a TTY)`;case`oidc-failed`:case`oidc-no-token`:return`OIDC/token auth failed`;case`diagnostic`:return`HTTP 404 (${n.diag.reason})`;case`error`:return`HTTP ${n.status} ${n.statusText}`;default:return`unknown`}}var zF,BF=__esmMin(()=>{ge(),Gm(),iN(),N_(),NF(),pF(),SF(),wF(),LF(),kF(),nF(),F_(),FF(),RF(),zF={command:`onboard`,description:`Ensure every publishable @gjsify/* workspace is both published on npm and has a Trusted Publisher configured — publishing/trusting only what is missing, one shared OTP across the whole sweep. Idempotent.`,builder:n=>n.option(`repository`,{description:"GitHub repo as `owner/repo`. Default: inferred from the `origin` git remote.",type:`string`}).option(`workflow`,{description:`Workflow filename allowed to publish via OIDC (basename only).`,type:`string`,default:`release.yml`}).option(`environment`,{description:`Optional GitHub Actions environment the workflow must run in.`,type:`string`}).option(`registry`,{description:`Registry override. Default: scope-aware lookup from .npmrc (falls back to ${ZM}).`,type:`string`}).option(`otp`,{description:`npm 2FA one-time code, used as the initial shared code. Prompted on demand (once) if omitted and a challenge occurs.`,type:`string`}).option(`concurrency`,{description:`How many packages to probe (read state) in parallel (kept small so a single token does not burst npm; the first read is always serial to prompt for the shared OTP once).`,type:`number`,default:4}).option(`dry-run`,{description:`Report the plan (what would be published / trusted) without changing anything.`,type:`boolean`,default:!1}).option(`json`,{description:`Emit a machine-readable summary object as the final line of stdout.`,type:`boolean`,default:!1}).option(`yes`,{description:`Non-interactive: never prompt. Fail clearly if a login or an OTP is required and not supplied via flags.`,type:`boolean`,default:!1}),handler:async n=>{let a=process.cwd(),S=n[`dry-run`]===!0,C=n.json===!0,N=n.yes===!0,log=(n=``)=>{C?process.stderr.write(`${n}\n`):process.stdout.write(`${n}\n`)},F=await loadNpmrc(a),I=n.registry??process.env.npm_config_registry??F.registry??ZM,H;try{H=await ensureAuthenticated({npmrc:F,registry:I,cwd:a,nonInteractive:N,dryRun:S,otp:n.otp,log})}catch(n){let a=n instanceof Error?n.message:String(n);return C?process.stdout.write(`${JSON.stringify({ok:!1,error:`auth`,message:a})}\n`):he.error(a),process.exit(1)}F=await loadNpmrc(a),H&&log(`gjsify onboard: authenticated as ${H}`);let W=n.repository;if(!W){let n=spawnSync(`git`,[`remote`,`get-url`,`origin`],{cwd:a,encoding:`utf8`});n.status===0&&(W=parseRepoFromGitRemote(n.stdout)??void 0)}if(!W||!validateRepository(W)){let n=`gjsify onboard: could not determine the GitHub repository — pass --repository owner/repo.`;return C?process.stdout.write(`${JSON.stringify({ok:!1,error:`repository`,message:n})}\n`):he.error(n),process.exit(1)}let K=normalizeWorkflowFile(n.workflow),q=n.environment,Y=filterWorkspaces(mergePublishables(discoverWorkspaces(findWorkspaceRoot(a)??a,{includeRoot:!0}),a),{noPrivate:!0,exclude:[`@girs/*`]}).filter(n=>n.name);if(Y.length===0){let n=`gjsify onboard: no publishable workspace packages found.`;return C?process.stdout.write(`${JSON.stringify({ok:!1,error:`no-packages`,message:n})}\n`):he.error(n),process.exit(1)}log(`gjsify onboard: ${Y.length} package(s) | repo=${W} workflow=${K}`),S&&log(`(dry-run — nothing will be published or configured)`),log();let X=new OtpProvider(n.otp,N?async()=>``:void 0,{registry:I}),te=createTrustRequester({npmrc:F,otpProvider:X}),ne=await probeAllTrustStates(te,Y,Math.max(1,n.concurrency),{registryOverride:n.registry,npmrc:F,repository:W,workflow:K}),re=ne.filter(n=>n.action===`publish-and-trust`),ie=ne.filter(n=>n.action===`trust`),ae=ne.filter(n=>n.action===`skip`),oe=ne.filter(n=>n.action===`blocked`);for(let n of ne)log(` ${statusCell(n)} ${n.ws.name}`);log(),log(`Plan: ${ae.length} already done, ${re.length} to publish+trust, ${ie.length} to trust, ${oe.length} unreadable.`);let Z=[];if(S){for(let n of ne)Z.push({name:n.ws.name,result:n.action===`skip`?`already-done`:n.action===`blocked`?`failed`:`skipped-dry-run`,detail:n.action===`publish-and-trust`?`would publish + trust`:n.action===`trust`?`would trust`:void 0});finish(Z,ne,{asJson:C,dryRun:S});return}let se=githubTrustBody({repository:W,workflow:K,environment:q}),ce=0;for(let n of ne){if(n.action===`skip`){Z.push({name:n.ws.name,result:`already-done`});continue}if(n.action===`blocked`){log(`→ ${n.ws.name}: cannot read trust state (HTTP ${n.httpStatus}) — skipped`),Z.push({name:n.ws.name,result:`failed`,detail:`state HTTP ${n.httpStatus}`}),ce++;continue}let a=!1;if(n.action===`publish-and-trust`){log(`→ ${n.ws.name}: building + publishing…`);try{await buildIfPresent(n.ws,log)}catch(a){let S=a instanceof Error?a.message:String(a);log(` build failed: ${S}`),Z.push({name:n.ws.name,result:`failed`,detail:`build: ${S}`}),ce++;continue}let S=await publishWorkspace({wsDir:n.ws.location,tag:`latest`,access:`public`,provenance:!1,tolerate:!0,tolerateUntrustedNew:!1,trustedFlag:void 0,registry:n.registry,verbose:!1,json:!1,otpProvider:X,seedOtpFirst:!1});if(!S.ok){let a=describePublishFailure(S);log(` publish failed: ${a}`),Z.push({name:n.ws.name,result:`failed`,detail:`publish: ${a}`}),ce++;continue}a=S.action!==`skipped-untrusted-new`,log(` published ${S.name}@${`version`in S?S.version:``}`)}let S=await te(`POST`,n.url,se);S.status>=200&&S.status<300?(log(` trusted ${n.ws.name}`),Z.push({name:n.ws.name,result:a?`published+trusted`:`trusted`})):S.status===409?Z.push({name:n.ws.name,result:a?`published+trusted`:`trusted`}):S.status===404?(log(` ${n.ws.name}: published but not yet trust-configurable (re-run onboard)`),Z.push({name:n.ws.name,result:a?`published`:`failed`,detail:`trust config deferred (404)`}),a||ce++):(log(` trust failed (HTTP ${S.status})`),Z.push({name:n.ws.name,result:`failed`,detail:`trust HTTP ${S.status}`}),ce++)}finish(Z,ne,{asJson:C,dryRun:S,failed:ce})}}});function readCurrentVersion(){try{let n=process.env.GJSIFY_CLI_PACKAGE_JSON;if(n){let a=JSON.parse(readFileSync(n,`utf-8`));return a.name===VF&&typeof a.version==`string`?a.version:null}let a=_s(ds(fileURLToPath(import.meta.url)));for(let n=0;n<8&&a!==_s(a);n++){let n=ms(a,`package.json`);if(existsSync(n)){let a=JSON.parse(readFileSync(n,`utf-8`));if(a.name===VF&&typeof a.version==`string`)return a.version}a=_s(a)}}catch{}return null}function resolveTag(n,a){let S=n[`dist-tags`]??{};return S[a]?S[a]:n.versions&&typeof n.versions==`object`&&n.versions[a]?a:null}var VF,HF,UF=__esmMin(()=>{ge(),ul(),Ts(),nn(),iN(),RN(),zP(),VF=`@gjsify/cli`,HF={command:`self-update`,description:`Update the installed ${VF} to the latest release (or pinned --tag).`,builder:n=>n.option(`check`,{description:`Only check whether a newer version is available; do not install.`,type:`boolean`,default:!1}).option(`force`,{description:`Reinstall even when the current version already matches the target tag.`,type:`boolean`,default:!1}).option(`tag`,{description:"npm dist-tag or pinned version to install (e.g. `latest`, `next`, `0.5.0`).",type:`string`,default:`latest`}).option(`skip-deps`,{description:`Update only the @gjsify/cli bundle itself; do not pull its runtime dependencies (rolldown, lightningcss, @gjsify/tsc, the native gi:// bridges, …). Faster, but can leave the on-disk runtime deps stale relative to the new bundle.`,type:`boolean`,default:!1}),handler:async n=>{let a=defaultGlobalLayout(),S=ms(ms(a.prefix,`node_modules`,VF),`package.json`),C=readCurrentVersion(),N=existsSync(S);he.log(`Current ${VF}: v${C??`(unknown)`}`),N||he.warn(`\nWarning: no @gjsify/cli install found under ${a.prefix}.\nself-update only manages installs created by install.mjs or \`gjsify install -g\`.\nIf you installed via \`npm install -g\`, remove that and use:\n curl -fsSL https://github.com/gjsify/gjsify/releases/latest/download/install.mjs -o /tmp/g.mjs && gjs -m /tmp/g.mjs && rm /tmp/g.mjs`),he.log(`Fetching dist-tags for ${VF}@${n.tag} ...`);let F;try{F=await fetchPackument(VF)}catch(n){let a=n instanceof Error?n.message:String(n);return he.error(`Failed to fetch packument: ${a}`),process.exit(1)}let I=resolveTag(F,n.tag);if(!I)return he.error(`Unknown dist-tag '${n.tag}' on ${VF}. Known tags: ${Object.keys(F[`dist-tags`]??{}).join(`, `)||`(none)`}`),process.exit(1);he.log(`Latest matching --tag ${n.tag}: v${I}`);let H=N&&!hasBundlerEngineInstalled(a.prefix),W=H&&!n.skipDeps&&!n.check;if(C===I&&!n.force&&!W){he.log(`Already up to date (v${I}).`),H&&n.skipDeps&&he.log("Note: the GJS bundler engine @gjsify/rolldown-native is not installed — re-run without --skip-deps to repair it (`gjsify build` needs it under GJS)."),n.check||he.log(`Run with --force to reinstall anyway.`);return}if(W&&C===I&&!n.force&&he.log(`@gjsify/cli is at v${I} but the GJS bundler engine @gjsify/rolldown-native is missing — repairing.`),n.check)return he.log(C?`Update available: v${C} → v${I}`:`Install required: → v${I}`),process.exit(1);let K=!n.skipDeps,q=K?` + runtime dependencies`:` (bundle only)`;he.log(`Installing ${VF}@${I}${q} ...`);let Y=makeProgressReporter();try{await installPackages({prefix:a.prefix,specs:[`${VF}@${I}`],verbose:!1,skipDeps:!K,progress:Y})}catch(n){let a=n instanceof Error?n.message:String(n);return he.error(`self-update: install failed — ${a}`),he.error("Re-run `gjsify self-update` to retry."),process.exit(1)}K&&await installGjsEnginePackages(a.prefix,I,{verbose:!1});let X=linkGlobalBins([VF],a);if(X.length===0)he.warn("self-update: install completed but no bins were linked — package.json may be missing a `bin` field.");else for(let n of X)he.log(` • ${n.link} → ${n.target}`);he.log(`\nUpdated ${VF} to v${I}.`),K?he.log(`Runtime dependencies were resolved alongside the bundle.`):he.log(`Bundle-only update (--skip-deps): on-disk runtime dependencies were left unchanged.`)}}});function loadInstallerTemplate(){return readFileSync(new URL(`../templates/install.mjs.tmpl`,import.meta.url),`utf-8`)}function pickDefaultBinName(n,a){let S=n?.gjsify?.bin;if(S&&typeof S==`object`){let n=Object.keys(S)[0];if(n)return n}let C=n?.bin;if(C&&typeof C==`object`){let n=Object.keys(C)[0];if(n)return n}return a.startsWith(`@`)?a.slice(a.indexOf(`/`)+1):a}var WF,GF,KF=__esmMin(()=>{ge(),ul(),Ts(),WF=`https://github.com/gjsify/gjsify/releases/latest/download/cli.gjs.mjs`,GF={command:`generate-installer [target]`,description:`Scaffold an install.mjs in the current directory for a GJS-runnable npm package.`,builder:n=>n.positional(`target`,{description:`Npm package name to install (default: current package.json name).`,type:`string`}).option(`bin-name`,{description:"Bin name produced by the installer (default: first key of `gjsify.bin` or `bin`).",type:`string`}).option(`bootstrap-url`,{description:`Override the cli.gjs.mjs bootstrap bundle URL (default: gjsify GitHub releases/latest).`,type:`string`}).option(`output`,{description:`Where to write the generated installer.`,type:`string`,default:`install.mjs`}).option(`force`,{description:`Overwrite an existing output file.`,type:`boolean`,default:!1}),handler:n=>{let a=ds(process.cwd(),n.output);if(existsSync(a)&&!n.force)return he.error(`${n.output} already exists. Re-run with --force to overwrite.`),process.exit(1);let S=ds(process.cwd(),`package.json`),C=null;if(existsSync(S))try{C=JSON.parse(readFileSync(S,`utf-8`))}catch{}let N=n.target??C?.name;if(!N)return he.error("No target package: pass `gjsify generate-installer <pkg>` or run inside a directory with a package.json."),process.exit(1);let F=n[`bin-name`]??pickDefaultBinName(C,N),I=n[`bootstrap-url`]??WF;writeFileSync(a,loadInstallerTemplate().replace(/const DEFAULT_TARGET = '[^']+';/,`const DEFAULT_TARGET = ${JSON.stringify(N)};`).replace(/const DEFAULT_BIN_NAME = '[^']+';/,`const DEFAULT_BIN_NAME = ${JSON.stringify(F)};`).replace(/const DEFAULT_BOOTSTRAP_URL =\s*'[^']+';/,`const DEFAULT_BOOTSTRAP_URL = ${JSON.stringify(I)};`),{mode:493}),he.log(`Wrote ${n.output} (target=${N}, bin=${F}).`),he.log(``),he.log(`Install one-liner for your README:`),he.log(` curl -fsSL https://github.com/<you>/<repo>/raw/main/${n.output} -o /tmp/i.mjs \\`),he.log(` && gjs -m /tmp/i.mjs && rm /tmp/i.mjs`)}}});function findBinShimsForPackage(n,a,S){if(!existsSync(n))return[];let C=[],N;try{N=readdirSync(n)}catch{return[]}for(let F of N){let N=ms(n,F);try{if(!statSync(N).isFile())continue;let n=readFileSync(N,`utf-8`);if(!n.startsWith(`#!/bin/sh`))continue;let S=n.split(`
|
|
923
|
-
`).find(n=>/^exec (?:gjs -m )?'/.test(n));if(!S)continue;let F=S.match(/'([^']+)'/);if(!F)continue;let I=F[1];(I.startsWith(a+`/`)||I===a)&&C.push(N)}catch(n){S&&he.warn(` ? could not inspect ${N}: ${n.message}`)}}return C}var
|
|
924
|
-
No packages removed.`),process.exit(1))}}});function handleInit({cwd:n,force:a}){let writeOne=(S,C)=>{let N=ds(n,S);if(existsSync(N)&&!a){he.log(`[gjsify format] ${S} exists at ${N} — pass --force to overwrite.`);return}writeFileSync(N,C,`utf-8`),he.log(`[gjsify format] wrote ${N}`)};writeOne(`.oxlintrc.json`,loadOxlintTemplate()),writeOne(`.oxfmtrc.json`,loadOxfmtTemplate()),he.log("[gjsify format] Run `gjsify format --write .` to apply the formatter to the project.")}var
|
|
925
|
-
[gjsify upgrade --align] --dry-run: no files changed.`);return}let N=applyToFiles(C);he.log(`\n✏️ updated ${C.length} dep(s) across ${N} package.json file(s).`)}async function resolveCandidateGroups(n,a,S,C){let N=[],F=0;async function worker(){for(;;){let I=F++;if(I>=n.length)return;let H=n[I];try{let n=(await fetchPackument(H.name,{npmrc:a}))[`dist-tags`]?.latest;if(!n){S&&he.warn(` ${H.name}: no dist-tags.latest, skipping`);continue}let F=H.highestVersion;if(!F){S&&he.warn(` ${H.name}: unable to parse any current range`);continue}let I=classifyDiff(F,n);if(I===`none`||C===`minor`&&I===`major`||C===`patch`&&(I===`major`||I===`minor`))continue;N.push({...H,latestVersion:n,diff:I})}catch(n){S&&he.warn(` ${H.name}: fetch failed (${n.message})`)}}}return await Promise.all(Array.from({length:8},()=>worker())),N.sort((n,a)=>n.name.localeCompare(a.name)),N}function classifyDiff(n,a){let S=parse(n),C=parse(a);return!S||!C?`none`:S.major===C.major?S.minor===C.minor?S.patch===C.patch?(S.prerelease??[]).join(`.`)===(C.prerelease??[]).join(`.`)?`none`:`prerelease`:C.patch>S.patch?`patch`:`none`:C.minor>S.minor?`minor`:`none`:C.major>S.major?`major`:`none`}function colorForDiff(n){switch(n){case`major`:return
|
|
926
|
-
Select upgrades: comma- or space-separated indices, `+
|
|
919
|
+
`)),{path:a,removed:I}}var kF=__esmMin(()=>{ul(),am(),Ts()});async function runLogin(n){let a=await loadNpmrc(n.cwd??process.cwd()),S=n.registry??process.env.npm_config_registry??(n.scope?registryFor(n.scope.startsWith(`@`)?`${n.scope}/_`:`@${n.scope}/_`,a):void 0)??$M,C=S.endsWith(`/`)?S:`${S}/`,{username:N,password:F}=await promptCredentials(n.username);if(!N)throw new LoginError(`gjsify login: a username is required.`);if(!F)throw new LoginError(`gjsify login: a password is required.`);let I=`Basic ${btoa(`${N}:${F}`)}`,H=`${C}-/user/org.couchdb.user:${encodeURIComponent(N)}`,W={_id:`org.couchdb.user:${N}`,name:N,password:F,type:`user`,roles:[],date:void 0};function authHeaders(n){let a={authorization:I,"content-type":`application/json`,accept:`*/*`};return n&&(a[`npm-otp`]=n),a}async function putUser(n,a){return fetch(`${H}${n}`,{method:`PUT`,headers:authHeaders(a),body:JSON.stringify(W)})}let K=typeof n.otp==`string`&&n.otp.length>0,q=n.otp??readCachedOtp(C),Y=await putUser(``,q);if(Y.status===401&&!K){let n=(Y.headers.get(`www-authenticate`)??``).toLowerCase(),a=await Y.clone().text().catch(()=>``);if(n.includes(`otp`)||/one-time pass/i.test(a)){if(clearCachedOtp(C),q=await promptLine(`This operation requires a one-time password.
|
|
920
|
+
Enter OTP: `),!q)throw new LoginError(`gjsify login: no OTP entered.`);writeCachedOtp(C,q),Y=await putUser(``,q)}}if(Y.status===409){let n=await fetch(`${H}?write=true`,{headers:authHeaders(q)});if(n.ok){let a=await n.json().catch(()=>({}));for(let n of Object.keys(a))(!W[n]||n===`roles`)&&(W[n]=a[n]);W._rev&&(Y=await putUser(`/-rev/${W._rev}`,q))}}if(Y.status===400)throw new LoginError(`gjsify login: there is no user with the username "${N}" on ${C}.`);if(!Y.ok){let n=await Y.text().catch(()=>`<no body>`);throw new LoginError(`gjsify login: ${Y.status} ${Y.statusText} from ${C}\n${n.slice(0,400)}`)}let X=await Y.json().catch(()=>({}));if(!X.token)throw new LoginError("gjsify login: the registry accepted the login but returned no token (unexpected response shape). Your registry may require the web-OAuth flow — use `npm login`.");let te=writeAuthToken(C,X.token);return q&&writeCachedOtp(C,q),{username:(await whoami(C,await loadNpmrc(n.cwd??process.cwd()))).username??N,registry:C,npmrcPath:te}}var LoginError,AF,jF=__esmMin(()=>{ge(),oN(),hF(),kF(),yF(),SF(),LoginError=class extends Error{constructor(n){super(n),this.name=`LoginError`}},AF={command:`login`,description:"Log in to an npm registry (Node-free `npm login`). Prompts for username + password (hidden) and writes the token to ~/.npmrc. Use --otp for 2FA. Web-OAuth flow is not supported — this is npm's legacy credentials flow.",builder:n=>n.option(`registry`,{description:`Registry URL to log in to. Default: ${$M} (or a --scope's registry).`,type:`string`}).option(`scope`,{description:`Associate the login with a scope (e.g. @gjsify) — resolves that scope's registry from .npmrc.`,type:`string`}).option(`username`,{description:`Username (prompted if omitted).`,type:`string`}).option(`otp`,{description:`npm 2FA one-time code (prompted on demand if omitted).`,type:`string`}).option(`json`,{description:"Emit `{username, registry}` JSON on success.",type:`boolean`}),handler:async n=>{try{let{username:a,registry:S,npmrcPath:C}=await runLogin({registry:n.registry,scope:n.scope,username:n.username,otp:n.otp});n.json?process.stdout.write(`${JSON.stringify({username:a,registry:S})}\n`):process.stdout.write(`Logged in as ${a} on ${S}\n(token written to ${C})\n`)}catch(n){if(n instanceof LoginError)return he.error(n.message),process.exit(1);throw n}}}}),MF,NF=__esmMin(()=>{oN(),hF(),kF(),SF(),MF={command:`logout`,description:"Log out of an npm registry (Node-free `npm logout`). Revokes the token on the registry (best-effort) and removes it from ~/.npmrc.",builder:n=>n.option(`registry`,{description:`Registry URL to log out of. Default: ${$M} (or a --scope's registry).`,type:`string`}).option(`scope`,{description:`Log out of a scope's registry (e.g. @gjsify) — resolved from .npmrc.`,type:`string`}).option(`json`,{description:"Emit `{registry, revoked, removed}` JSON.",type:`boolean`}),handler:async n=>{let a=await loadNpmrc(process.cwd()),S=n.registry??process.env.npm_config_registry??(n.scope?registryFor(n.scope.startsWith(`@`)?`${n.scope}/_`:`@${n.scope}/_`,a):void 0)??$M,C=S.endsWith(`/`)?S:`${S}/`,N=resolveAuthForUrl(`${C}-/whoami`,a),F=!1;if(N?.startsWith(`Bearer `)){let n=N.slice(7);try{F=(await fetch(`${C}-/user/token/${encodeURIComponent(n)}`,{method:`DELETE`,headers:{authorization:N,accept:`*/*`}})).ok}catch{}}clearCachedOtp(C);let{path:I,removed:H}=removeAuthToken(C);n.json?process.stdout.write(`${JSON.stringify({registry:C,revoked:F,removed:H})}\n`):H?process.stdout.write(`Logged out of ${C}${F?` (token revoked)`:``}\n(removed from ${I})\n`):process.stdout.write(`No token for ${C} found in ${I} — nothing to remove.\n`)}}});function discoverNonWorkspacePublishables(n){let a=n,S=PF[0];for(let n=0;n<8&&!existsSync(ms(a,...S));n++){let n=_s(a);if(n===a)return[];a=n}let C=[];for(let n of PF){let S=ms(a,...n);if(!existsSync(S))continue;let N;try{N=readdirSync(S,{withFileTypes:!0})}catch{continue}for(let a of N){if(!a.isDirectory())continue;let N=ms(S,a.name),F=ms(N,`package.json`);if(existsSync(F))try{let S=JSON.parse(readFileSync(F,`utf8`));if(!S||typeof S.name!=`string`||S.name.length===0)continue;C.push({location:N,relativeLocation:ms(...n,a.name),name:S.name,version:typeof S.version==`string`?S.version:`0.0.0`,manifest:S,private:S.private===!0})}catch{}}}return C}function mergePublishables(n,a){let S=new Set(n.map(n=>n.name));return[...n,...discoverNonWorkspacePublishables(a).filter(n=>!S.has(n.name))]}var PF,FF=__esmMin(()=>{ul(),Ts(),PF=[[`packages`,`node-gi`],[`packages`,`napi`]]});function trustUrl(n,a){return`${n.endsWith(`/`)?n.slice(0,-1):n}/-/package/${escapePackageName(a)}/trust`}function githubTrustBody(n){let a={repository:n.repository,workflow_ref:{file:normalizeWorkflowFile(n.workflow)}};return n.environment&&(a.environment=n.environment),[{type:`github`,claims:a,permissions:n.permissions&&n.permissions.length>0?n.permissions:[IF]}]}function normalizeWorkflowFile(n){return n.split(`/`).pop()??n}function validateRepository(n){let a=n.split(`/`);return a.length===2&&a[0].length>0&&a[1].length>0}function matchesGithubTrust(n,a){if(n.type!==`github`)return!1;let S=n.claims?.repository,C=n.claims?.workflow_ref?.file;return S===a.repository&&C===normalizeWorkflowFile(a.workflow)}function classifyTrustList(n,a,S){return n===404?`unpublished`:n===401?`auth-required`:n>=200&&n<300?(Array.isArray(a)?a:[]).some(n=>matchesGithubTrust(n,S))?`trusted`:`untrusted`:`error`}function parseRepoFromGitRemote(n){let a=n.trim();if(!a)return null;a=a.replace(/\.git$/,``);let S=a.match(/^[^/@]+@[^:]+:(.+)$/);if(S)return twoSegments(S[1]);let C=a.match(/^[a-z]+:\/\/[^/]+\/(.+)$/i);return C?twoSegments(C[1]):null}function twoSegments(n){let a=n.split(`/`).filter(n=>n.length>0);return a.length<2?null:`${a[a.length-2]}/${a[a.length-1]}`}var IF,LF=__esmMin(()=>{dF(),IF=`createPackage`});function createTrustRequester(n){return async(a,S,C)=>{let doFetch=N=>{let F=buildHeaders(S,{npmrc:n.npmrc});F.accept=`application/json`,C!==void 0&&(F[`content-type`]=`application/json`),N&&(F[`npm-otp`]=N);let I={method:a,headers:F};return C!==void 0&&(I.body=JSON.stringify(C)),fetch(S,I)},N=await withOtpRetry(doFetch,n.otpProvider),F=await N.text().catch(()=>``),I;try{I=F?JSON.parse(F):void 0}catch{}return{status:N.status,json:I,text:F}}}function firstLine(n){return n.split(`
|
|
921
|
+
`)[0].slice(0,200)}var RF,zF=__esmMin(()=>{ge(),Gm(),ul(),Ts(),oN(),N_(),FF(),hF(),wF(),LF(),RF={command:`trust [packages..]`,description:"Configure npm Trusted Publishers (OIDC/GitHub Actions) for publishable workspace packages so release.yml can publish without a token. Native — no `npm` needed. Incremental: skips already-configured packages.",builder:n=>n.positional(`packages`,{description:`Optional package-name globs to limit the sweep (default: all publishable workspaces).`,type:`string`,array:!0}).option(`repository`,{description:"GitHub repo as `owner/repo`. Default: inferred from the `origin` git remote.",type:`string`}).option(`workflow`,{description:`Workflow filename allowed to publish (basename only).`,type:`string`,default:`release.yml`}).option(`environment`,{description:`Optional GitHub Actions environment the workflow must run in.`,type:`string`}).option(`registry`,{description:`Registry override. Default: scope-aware lookup from .npmrc (falls back to ${$M}).`,type:`string`}).option(`otp`,{description:"npm 2FA one-time code; sent as `npm-otp`. Prompted on demand if omitted.",type:`string`}).option(`dry-run`,{description:`List what would be configured without writing anything.`,type:`boolean`,default:!1}).option(`force`,{description:`Re-POST the config even for packages already trusted for this repo+workflow.`,type:`boolean`,default:!1}).option(`list`,{description:`Only report each package’s current trust state; configure nothing.`,type:`boolean`,default:!1}).option(`private`,{description:`Include private workspaces (default false — private packages are not publishable).`,type:`boolean`,default:!1}),handler:async n=>{let a=process.cwd(),S=await loadNpmrc(a);if(!hasAnyCredential(S))return he.error("gjsify trust: no npm token configured. Run `gjsify login` first."),process.exit(1);let C=n.registry??process.env.npm_config_registry??S.registry??$M;if(n[`dry-run`]!==!0){let n;try{n=await whoami(C,S)}catch(n){let a=n instanceof Error?n.message:String(n);return he.error(`gjsify trust: npm auth check failed (${a}).\nYour ~/.npmrc token is dead or revoked — refresh it with \`npm login\`, then re-run.
|
|
922
|
+
(\`gjsify trust\` uses the ~/.npmrc bearer token directly — unlike \`npm trust\`, which logs in via the browser.)`),process.exit(1)}if(!n.username)return he.error("gjsify trust: your npm token appears dead or revoked (registry returned an empty whoami).\nRefresh it with `npm login`, then re-run."),process.exit(1);he.log(`gjsify trust: authenticated as ${n.username}`)}let N=n.repository;if(!N){let n=spawnSync(`git`,[`remote`,`get-url`,`origin`],{cwd:a,encoding:`utf8`});n.status===0&&(N=parseRepoFromGitRemote(n.stdout)??void 0)}if(!N)return he.error("gjsify trust: could not determine the GitHub repository.\nPass --repository owner/repo (no `origin` remote to infer from)."),process.exit(1);if(!validateRepository(N))return he.error(`gjsify trust: --repository must be "owner/repo", got "${N}".`),process.exit(1);let F=normalizeWorkflowFile(n.workflow),I=n.environment,H=n.list===!0,W=n[`dry-run`]===!0,K=n.force===!0,q=ms(a,`.github`,`workflows`,F);existsSync(q)||he.warn(`gjsify trust: note — ${q} not found; configuring trust for "${F}" anyway.`);let Y=filterWorkspaces(mergePublishables(discoverWorkspaces(a,{includeRoot:!0}),a),{noPrivate:n.private!==!0,include:n.packages&&n.packages.length>0?n.packages:void 0}).filter(n=>n.name);if(Y.length===0)return he.error(`gjsify trust: no publishable packages matched.`),process.exit(1);he.log(`gjsify trust: ${Y.length} package(s) | repo=${N} workflow=${F}`),W&&he.log(`(dry-run — nothing will be written)`),he.log();let X=createTrustRequester({npmrc:S,otpProvider:new OtpProvider(n.otp)}),te=0,ne=0,re=0,ie=0,ae=[],oe=[];for(let a of Y){let C=a.name,q=trustUrl(n.registry??registryFor(C,S)??$M,C);process.stdout.write(`→ ${C.padEnd(42)} `);let Y=await X(`GET`,q),Z=classifyTrustList(Y.status,Y.json,{repository:N,workflow:F});if(H){Z===`trusted`?he.log(`trusted`):Z===`unpublished`?he.log(`unpublished`):Z===`auth-required`?he.log(`auth-required (could not read)`):Z===`untrusted`?he.log(`not trusted`):he.log(`error (HTTP ${Y.status})`);continue}if(Z===`trusted`&&!K){he.log(`already configured — skip`),ne++;continue}if(Z===`unpublished`){he.log(`not on npm yet — needs first-publish, skip`),re++,ae.push(C);continue}if(W){he.log(`would configure`),te++;continue}let se=await X(`POST`,q,githubTrustBody({repository:N,workflow:F,environment:I}));se.status>=200&&se.status<300?(he.log(`configured`),te++):se.status===409?(he.log(`already configured (409) — done`),ne++):se.status===404?(he.log(`not on npm yet — needs first-publish, skip`),re++,ae.push(C)):(he.log(`FAILED (HTTP ${se.status})`),ie++,oe.push(`${C} — HTTP ${se.status}${se.text?`: ${firstLine(se.text)}`:``}`))}if(!H){if(he.log(),he.log(`Done: ${te} ${W?`would-configure`:`configured`}, ${ne} already-configured, ${re} unpublished, ${ie} failed.`),ae.length>0){he.log("Need a first publish before they can be trust-configured (then re-run `gjsify trust`):");for(let n of ae)he.log(` ${n}`)}if(oe.length>0){he.log("Failed (re-run `gjsify trust` — it is incremental; usually a lapsed 2FA window or rate-limit):");for(let n of oe)he.log(` ${n}`);process.exit(1)}}}}});function actionForState(n){switch(n){case`trusted`:return`skip`;case`untrusted`:return`trust`;case`unpublished`:return`publish-and-trust`;default:return`blocked`}}function defaultSleep(n){return new Promise(a=>setTimeout(a,n))}async function probeTrustState(n,a,S,C={}){let N=S.registryOverride??registryFor(a.name,S.npmrc)??$M,F=trustUrl(N,a.name),I={repository:S.repository,workflow:S.workflow},H=await n(`GET`,F),W=classifyTrustList(H.status,H.json,I);return W===`auth-required`&&C.retryOn401!==!1&&(await(C.sleep??defaultSleep)(C.retryDelayMs??400),H=await n(`GET`,F),W=classifyTrustList(H.status,H.json,I)),{ws:a,registry:N,url:F,state:W,httpStatus:H.status,action:actionForState(W)}}async function probeAllTrustStates(n,a,S,C,N={}){return a.length===0?[]:[await probeTrustState(n,a[0],C,N),...await mapWithConcurrency(a.slice(1),Math.max(1,S),a=>probeTrustState(n,a,C,N))]}async function mapWithConcurrency(n,a,S){let C=Array.from({length:n.length}),N=0,F=Array.from({length:Math.min(Math.max(1,a),n.length)},async()=>{for(;;){let a=N++;if(a>=n.length)return;C[a]=await S(n[a])}});return await Promise.all(F),C}var BF=__esmMin(()=>{oN(),LF()});function finish(n,a,S){let C=S.failed??0;if(S.asJson)process.stdout.write(`${JSON.stringify({ok:C===0,dryRun:S.dryRun,total:a.length,published:n.filter(n=>n.result===`published`||n.result===`published+trusted`).length,trusted:n.filter(n=>n.result===`trusted`||n.result===`published+trusted`).length,alreadyDone:n.filter(n=>n.result===`already-done`).length,failed:C,results:n},null,2)}\n`);else{let a=S.dryRun?`Dry-run complete — nothing changed.`:`Done: ${n.filter(n=>n.result.includes(`published`)).length} published, ${n.filter(n=>n.result===`trusted`||n.result===`published+trusted`).length} trusted, ${n.filter(n=>n.result===`already-done`).length} already done, ${C} failed.`;process.stdout.write(`\n${a}\n`)}process.exit(+(C>0))}function statusCell(n){switch(n.action){case`skip`:return`published✓ trusted✓`;case`trust`:return`published✓ trust… `;case`publish-and-trust`:return`publish… trust… `;case`blocked`:return`unreadable (${n.httpStatus})`}}async function ensureAuthenticated(n){let{npmrc:a,registry:S,cwd:C,nonInteractive:N,dryRun:F,otp:I,log:H}=n;if(hasAnyCredential(a))try{let n=await whoami(S,a);if(n.username)return n.username}catch{}if(F){H(`gjsify onboard: no live npm token — dry-run continues (state reads may be limited).`);return}if(N)throw Error("gjsify onboard: not authenticated and --yes was passed — run `gjsify login` first (or omit --yes to log in interactively).");H(`gjsify onboard: no live npm token — logging in…`);try{return(await runLogin({registry:S,otp:I,cwd:C})).username}catch(n){throw n instanceof LoginError?Error(n.message):n}}async function buildIfPresent(n,a){if(typeof(n.manifest.scripts??{}).build!=`string`)return;let S=detectPackageManager(),C=[`run`,`build`];a(` $ ${S} ${C.join(` `)}`),await new Promise((a,N)=>{let F=spawn(S,C,{cwd:n.location,stdio:`inherit`,env:{...process.env}});F.on(`close`,n=>{n===0?a():N(Error(`build exited with code ${n}`))}),F.on(`error`,N)})}function describePublishFailure(n){switch(n.action){case`otp-required`:return`npm required a 2FA code (re-run with --otp, or on a TTY)`;case`oidc-failed`:case`oidc-no-token`:return`OIDC/token auth failed`;case`diagnostic`:return`HTTP 404 (${n.diag.reason})`;case`error`:return`HTTP ${n.status} ${n.statusText}`;default:return`unknown`}}var VF,HF=__esmMin(()=>{ge(),Gm(),oN(),N_(),FF(),hF(),wF(),EF(),zF(),jF(),iF(),F_(),LF(),BF(),VF={command:`onboard`,description:`Ensure every publishable @gjsify/* workspace is both published on npm and has a Trusted Publisher configured — publishing/trusting only what is missing, one shared OTP across the whole sweep. Idempotent.`,builder:n=>n.option(`repository`,{description:"GitHub repo as `owner/repo`. Default: inferred from the `origin` git remote.",type:`string`}).option(`workflow`,{description:`Workflow filename allowed to publish via OIDC (basename only).`,type:`string`,default:`release.yml`}).option(`environment`,{description:`Optional GitHub Actions environment the workflow must run in.`,type:`string`}).option(`registry`,{description:`Registry override. Default: scope-aware lookup from .npmrc (falls back to ${$M}).`,type:`string`}).option(`otp`,{description:`npm 2FA one-time code, used as the initial shared code. Prompted on demand (once) if omitted and a challenge occurs.`,type:`string`}).option(`concurrency`,{description:`How many packages to probe (read state) in parallel (kept small so a single token does not burst npm; the first read is always serial to prompt for the shared OTP once).`,type:`number`,default:4}).option(`dry-run`,{description:`Report the plan (what would be published / trusted) without changing anything.`,type:`boolean`,default:!1}).option(`json`,{description:`Emit a machine-readable summary object as the final line of stdout.`,type:`boolean`,default:!1}).option(`yes`,{description:`Non-interactive: never prompt. Fail clearly if a login or an OTP is required and not supplied via flags.`,type:`boolean`,default:!1}),handler:async n=>{let a=process.cwd(),S=n[`dry-run`]===!0,C=n.json===!0,N=n.yes===!0,log=(n=``)=>{C?process.stderr.write(`${n}\n`):process.stdout.write(`${n}\n`)},F=await loadNpmrc(a),I=n.registry??process.env.npm_config_registry??F.registry??$M,H;try{H=await ensureAuthenticated({npmrc:F,registry:I,cwd:a,nonInteractive:N,dryRun:S,otp:n.otp,log})}catch(n){let a=n instanceof Error?n.message:String(n);return C?process.stdout.write(`${JSON.stringify({ok:!1,error:`auth`,message:a})}\n`):he.error(a),process.exit(1)}F=await loadNpmrc(a),H&&log(`gjsify onboard: authenticated as ${H}`);let W=n.repository;if(!W){let n=spawnSync(`git`,[`remote`,`get-url`,`origin`],{cwd:a,encoding:`utf8`});n.status===0&&(W=parseRepoFromGitRemote(n.stdout)??void 0)}if(!W||!validateRepository(W)){let n=`gjsify onboard: could not determine the GitHub repository — pass --repository owner/repo.`;return C?process.stdout.write(`${JSON.stringify({ok:!1,error:`repository`,message:n})}\n`):he.error(n),process.exit(1)}let K=normalizeWorkflowFile(n.workflow),q=n.environment,Y=filterWorkspaces(mergePublishables(discoverWorkspaces(findWorkspaceRoot(a)??a,{includeRoot:!0}),a),{noPrivate:!0,exclude:[`@girs/*`]}).filter(n=>n.name);if(Y.length===0){let n=`gjsify onboard: no publishable workspace packages found.`;return C?process.stdout.write(`${JSON.stringify({ok:!1,error:`no-packages`,message:n})}\n`):he.error(n),process.exit(1)}log(`gjsify onboard: ${Y.length} package(s) | repo=${W} workflow=${K}`),S&&log(`(dry-run — nothing will be published or configured)`),log();let X=new OtpProvider(n.otp,N?async()=>``:void 0,{registry:I}),te=createTrustRequester({npmrc:F,otpProvider:X}),ne=await probeAllTrustStates(te,Y,Math.max(1,n.concurrency),{registryOverride:n.registry,npmrc:F,repository:W,workflow:K}),re=ne.filter(n=>n.action===`publish-and-trust`),ie=ne.filter(n=>n.action===`trust`),ae=ne.filter(n=>n.action===`skip`),oe=ne.filter(n=>n.action===`blocked`);for(let n of ne)log(` ${statusCell(n)} ${n.ws.name}`);log(),log(`Plan: ${ae.length} already done, ${re.length} to publish+trust, ${ie.length} to trust, ${oe.length} unreadable.`);let Z=[];if(S){for(let n of ne)Z.push({name:n.ws.name,result:n.action===`skip`?`already-done`:n.action===`blocked`?`failed`:`skipped-dry-run`,detail:n.action===`publish-and-trust`?`would publish + trust`:n.action===`trust`?`would trust`:void 0});finish(Z,ne,{asJson:C,dryRun:S});return}let se=githubTrustBody({repository:W,workflow:K,environment:q}),ce=0;for(let n of ne){if(n.action===`skip`){Z.push({name:n.ws.name,result:`already-done`});continue}if(n.action===`blocked`){log(`→ ${n.ws.name}: cannot read trust state (HTTP ${n.httpStatus}) — skipped`),Z.push({name:n.ws.name,result:`failed`,detail:`state HTTP ${n.httpStatus}`}),ce++;continue}let a=!1;if(n.action===`publish-and-trust`){log(`→ ${n.ws.name}: building + publishing…`);try{await buildIfPresent(n.ws,log)}catch(a){let S=a instanceof Error?a.message:String(a);log(` build failed: ${S}`),Z.push({name:n.ws.name,result:`failed`,detail:`build: ${S}`}),ce++;continue}let S=await publishWorkspace({wsDir:n.ws.location,tag:`latest`,access:`public`,provenance:!1,tolerate:!0,tolerateUntrustedNew:!1,trustedFlag:void 0,registry:n.registry,verbose:!1,json:!1,otpProvider:X,seedOtpFirst:!1});if(!S.ok){let a=describePublishFailure(S);log(` publish failed: ${a}`),Z.push({name:n.ws.name,result:`failed`,detail:`publish: ${a}`}),ce++;continue}a=S.action!==`skipped-untrusted-new`,log(` published ${S.name}@${`version`in S?S.version:``}`)}let S=await te(`POST`,n.url,se);S.status>=200&&S.status<300?(log(` trusted ${n.ws.name}`),Z.push({name:n.ws.name,result:a?`published+trusted`:`trusted`})):S.status===409?Z.push({name:n.ws.name,result:a?`published+trusted`:`trusted`}):S.status===404?(log(` ${n.ws.name}: published but not yet trust-configurable (re-run onboard)`),Z.push({name:n.ws.name,result:a?`published`:`failed`,detail:`trust config deferred (404)`}),a||ce++):(log(` trust failed (HTTP ${S.status})`),Z.push({name:n.ws.name,result:`failed`,detail:`trust HTTP ${S.status}`}),ce++)}finish(Z,ne,{asJson:C,dryRun:S,failed:ce})}}});function readCurrentVersion(){try{let n=process.env.GJSIFY_CLI_PACKAGE_JSON;if(n){let a=JSON.parse(readFileSync(n,`utf-8`));return a.name===UF&&typeof a.version==`string`?a.version:null}let a=_s(ds(fileURLToPath(import.meta.url)));for(let n=0;n<8&&a!==_s(a);n++){let n=ms(a,`package.json`);if(existsSync(n)){let a=JSON.parse(readFileSync(n,`utf-8`));if(a.name===UF&&typeof a.version==`string`)return a.version}a=_s(a)}}catch{}return null}function resolveTag(n,a){let S=n[`dist-tags`]??{};return S[a]?S[a]:n.versions&&typeof n.versions==`object`&&n.versions[a]?a:null}var UF,WF,GF=__esmMin(()=>{ge(),ul(),Ts(),nn(),oN(),BN(),VP(),UF=`@gjsify/cli`,WF={command:`self-update`,description:`Update the installed ${UF} to the latest release (or pinned --tag).`,builder:n=>n.option(`check`,{description:`Only check whether a newer version is available; do not install.`,type:`boolean`,default:!1}).option(`force`,{description:`Reinstall even when the current version already matches the target tag.`,type:`boolean`,default:!1}).option(`tag`,{description:"npm dist-tag or pinned version to install (e.g. `latest`, `next`, `0.5.0`).",type:`string`,default:`latest`}).option(`skip-deps`,{description:`Update only the @gjsify/cli bundle itself; do not pull its runtime dependencies (rolldown, lightningcss, @gjsify/tsc, the native gi:// bridges, …). Faster, but can leave the on-disk runtime deps stale relative to the new bundle.`,type:`boolean`,default:!1}),handler:async n=>{let a=defaultGlobalLayout(),S=ms(ms(a.prefix,`node_modules`,UF),`package.json`),C=readCurrentVersion(),N=existsSync(S);he.log(`Current ${UF}: v${C??`(unknown)`}`),N||he.warn(`\nWarning: no @gjsify/cli install found under ${a.prefix}.\nself-update only manages installs created by install.mjs or \`gjsify install -g\`.\nIf you installed via \`npm install -g\`, remove that and use:\n curl -fsSL https://github.com/gjsify/gjsify/releases/latest/download/install.mjs -o /tmp/g.mjs && gjs -m /tmp/g.mjs && rm /tmp/g.mjs`),he.log(`Fetching dist-tags for ${UF}@${n.tag} ...`);let F;try{F=await fetchPackument(UF)}catch(n){let a=n instanceof Error?n.message:String(n);return he.error(`Failed to fetch packument: ${a}`),process.exit(1)}let I=resolveTag(F,n.tag);if(!I)return he.error(`Unknown dist-tag '${n.tag}' on ${UF}. Known tags: ${Object.keys(F[`dist-tags`]??{}).join(`, `)||`(none)`}`),process.exit(1);he.log(`Latest matching --tag ${n.tag}: v${I}`);let H=N&&!hasBundlerEngineInstalled(a.prefix),W=H&&!n.skipDeps&&!n.check;if(C===I&&!n.force&&!W){he.log(`Already up to date (v${I}).`),H&&n.skipDeps&&he.log("Note: the GJS bundler engine @gjsify/rolldown-native is not installed — re-run without --skip-deps to repair it (`gjsify build` needs it under GJS)."),n.check||he.log(`Run with --force to reinstall anyway.`);return}if(W&&C===I&&!n.force&&he.log(`@gjsify/cli is at v${I} but the GJS bundler engine @gjsify/rolldown-native is missing — repairing.`),n.check)return he.log(C?`Update available: v${C} → v${I}`:`Install required: → v${I}`),process.exit(1);let K=!n.skipDeps,q=K?` + runtime dependencies`:` (bundle only)`;he.log(`Installing ${UF}@${I}${q} ...`);let Y=makeProgressReporter();try{await installPackages({prefix:a.prefix,specs:[`${UF}@${I}`],verbose:!1,skipDeps:!K,progress:Y})}catch(n){let a=n instanceof Error?n.message:String(n);return he.error(`self-update: install failed — ${a}`),he.error("Re-run `gjsify self-update` to retry."),process.exit(1)}K&&await installGjsEnginePackages(a.prefix,I,{verbose:!1});let X=linkGlobalBins([UF],a);if(X.length===0)he.warn("self-update: install completed but no bins were linked — package.json may be missing a `bin` field.");else for(let n of X)he.log(` • ${n.link} → ${n.target}`);he.log(`\nUpdated ${UF} to v${I}.`),K?he.log(`Runtime dependencies were resolved alongside the bundle.`):he.log(`Bundle-only update (--skip-deps): on-disk runtime dependencies were left unchanged.`)}}});function loadInstallerTemplate(){return readFileSync(new URL(`../templates/install.mjs.tmpl`,import.meta.url),`utf-8`)}function pickDefaultBinName(n,a){let S=n?.gjsify?.bin;if(S&&typeof S==`object`){let n=Object.keys(S)[0];if(n)return n}let C=n?.bin;if(C&&typeof C==`object`){let n=Object.keys(C)[0];if(n)return n}return a.startsWith(`@`)?a.slice(a.indexOf(`/`)+1):a}var KF,qF,JF=__esmMin(()=>{ge(),ul(),Ts(),KF=`https://github.com/gjsify/gjsify/releases/latest/download/cli.gjs.mjs`,qF={command:`generate-installer [target]`,description:`Scaffold an install.mjs in the current directory for a GJS-runnable npm package.`,builder:n=>n.positional(`target`,{description:`Npm package name to install (default: current package.json name).`,type:`string`}).option(`bin-name`,{description:"Bin name produced by the installer (default: first key of `gjsify.bin` or `bin`).",type:`string`}).option(`bootstrap-url`,{description:`Override the cli.gjs.mjs bootstrap bundle URL (default: gjsify GitHub releases/latest).`,type:`string`}).option(`output`,{description:`Where to write the generated installer.`,type:`string`,default:`install.mjs`}).option(`force`,{description:`Overwrite an existing output file.`,type:`boolean`,default:!1}),handler:n=>{let a=ds(process.cwd(),n.output);if(existsSync(a)&&!n.force)return he.error(`${n.output} already exists. Re-run with --force to overwrite.`),process.exit(1);let S=ds(process.cwd(),`package.json`),C=null;if(existsSync(S))try{C=JSON.parse(readFileSync(S,`utf-8`))}catch{}let N=n.target??C?.name;if(!N)return he.error("No target package: pass `gjsify generate-installer <pkg>` or run inside a directory with a package.json."),process.exit(1);let F=n[`bin-name`]??pickDefaultBinName(C,N),I=n[`bootstrap-url`]??KF;writeFileSync(a,loadInstallerTemplate().replace(/const DEFAULT_TARGET = '[^']+';/,`const DEFAULT_TARGET = ${JSON.stringify(N)};`).replace(/const DEFAULT_BIN_NAME = '[^']+';/,`const DEFAULT_BIN_NAME = ${JSON.stringify(F)};`).replace(/const DEFAULT_BOOTSTRAP_URL =\s*'[^']+';/,`const DEFAULT_BOOTSTRAP_URL = ${JSON.stringify(I)};`),{mode:493}),he.log(`Wrote ${n.output} (target=${N}, bin=${F}).`),he.log(``),he.log(`Install one-liner for your README:`),he.log(` curl -fsSL https://github.com/<you>/<repo>/raw/main/${n.output} -o /tmp/i.mjs \\`),he.log(` && gjs -m /tmp/i.mjs && rm /tmp/i.mjs`)}}});function findBinShimsForPackage(n,a,S){if(!existsSync(n))return[];let C=[],N;try{N=readdirSync(n)}catch{return[]}for(let F of N){let N=ms(n,F);try{if(!statSync(N).isFile())continue;let n=readFileSync(N,`utf-8`);if(!n.startsWith(`#!/bin/sh`))continue;let S=n.split(`
|
|
923
|
+
`).find(n=>/^exec (?:gjs -m )?'/.test(n));if(!S)continue;let F=S.match(/'([^']+)'/);if(!F)continue;let I=F[1];(I.startsWith(a+`/`)||I===a)&&C.push(N)}catch(n){S&&he.warn(` ? could not inspect ${N}: ${n.message}`)}}return C}var YF,XF=__esmMin(()=>{ge(),ul(),Ts(),VP(),YF={command:`uninstall <packages..>`,description:"Uninstall a previously installed package. Currently only `--global` mode is supported.",builder:n=>n.positional(`packages`,{description:`Package(s) to uninstall (npm names, optionally with version).`,type:`string`,array:!0,demandOption:!0}).option(`global`,{description:`Uninstall from the user-global XDG location (the install -g target).`,type:`boolean`,alias:`g`,default:!1}).option(`dry-run`,{description:`Show what would be removed without touching the filesystem.`,type:`boolean`,default:!1}).option(`verbose`,{description:`Verbose logging.`,type:`boolean`,default:!1}),handler:n=>{if(!n.global)return he.error("gjsify uninstall currently only supports --global. For project-local removal, edit package.json + re-run `gjsify install`."),process.exit(1);let a=defaultGlobalLayout(),S=n[`dry-run`]??!1,C=n.verbose??!1,N=`gjsify uninstall${S?` (dry-run)`:``} --global`;he.log(`${N} ← ${a.prefix}`),he.log(`${` `.repeat(N.length)} bins ← ${a.binDir}`);let F=!1;for(let N of n.packages){let n=specToPackageName(N),I=ms(a.prefix,`node_modules`,n);if(!existsSync(I)){he.warn(` ✗ ${n} — not installed at ${I}`);continue}let H=findBinShimsForPackage(a.binDir,I,C);if(S){he.log(` • would remove ${I}`);for(let n of H)he.log(` • would remove ${n}`)}else{rmSync(I,{recursive:!0,force:!0}),he.log(` • removed ${I}`);for(let n of H)unlinkSync(n),he.log(` • removed ${n}`)}F=!0}F||(he.error(`
|
|
924
|
+
No packages removed.`),process.exit(1))}}});function handleInit({cwd:n,force:a}){let writeOne=(S,C)=>{let N=ds(n,S);if(existsSync(N)&&!a){he.log(`[gjsify format] ${S} exists at ${N} — pass --force to overwrite.`);return}writeFileSync(N,C,`utf-8`),he.log(`[gjsify format] wrote ${N}`)};writeOne(`.oxlintrc.json`,loadOxlintTemplate()),writeOne(`.oxfmtrc.json`,loadOxfmtTemplate()),he.log("[gjsify format] Run `gjsify format --write .` to apply the formatter to the project.")}var ZF,QF=__esmMin(()=>{ge(),ul(),Ts(),hP(),ZF={command:`format [paths..]`,description:`Format JS/TS source files via oxfmt (CSS/JSON formatting is not supported).`,builder:n=>n.positional(`paths`,{description:"Files or directories to format. Default: `.`",type:`string`,array:!0}).option(`write`,{description:`Modify files in place (default: report drift without writing).`,type:`boolean`,default:!1}).option(`check`,{description:`Report formatting drift without modifying files; exit non-zero if any file is unformatted. Useful for CI.`,type:`boolean`,default:!1}).option(`config-path`,{description:`Path to an .oxfmtrc.json. Default: walks up from cwd to find one.`,type:`string`,normalize:!0}).option(`init`,{description:`Write recommended .oxlintrc.json + .oxfmtrc.json into cwd (skips existing files unless --force).`,type:`boolean`,default:!1}).option(`force`,{description:`Overwrite existing .oxlintrc.json / .oxfmtrc.json with --init.`,type:`boolean`,default:!1}).option(`verbose`,{description:`Echo the resolved oxfmt launcher + args before spawning.`,type:`boolean`,default:!1}),handler:async n=>{let a=process.cwd();if(n.init){handleInit({cwd:a,force:n.force??!1});return}let S=n.paths?.length?n.paths:[`.`],C=[];n.check?C.push(`--check`):n.write?C.push(`--write`):C.push(`--list-different`);let N=n.configPath??findOxfmtConfig(a)??void 0;N&&C.push(`--config`,ds(N)),C.push(...S);try{setOxcExitCode(await runOxfmt(C,{cwd:a,verbose:n.verbose}))}catch(n){if(n instanceof OxcNotFoundError){printOxcNotFound(n),setOxcExitCode(1);return}throw n}}}}),$F,eI=__esmMin(()=>{Ts(),hP(),$F={command:`lint [paths..]`,description:`Run oxlint diagnostics (spawned via its Node launcher to support JS plugins).`,builder:n=>n.positional(`paths`,{description:"Files or directories to lint. Default: `.`",type:`string`,array:!0}).option(`fix`,{description:`Apply safe lint fixes in place.`,type:`boolean`,default:!1}).option(`config-path`,{description:`Path to an .oxlintrc.json. Default: walks up from cwd to find one.`,type:`string`,normalize:!0}).option(`verbose`,{description:`Echo the resolved oxlint launcher + args before spawning.`,type:`boolean`,default:!1}),handler:async n=>{let a=process.cwd(),S=n.paths?.length?n.paths:[`.`],C=[];n.fix&&C.push(`--fix`);let N=n.configPath??findOxlintConfig(a)??void 0;N&&C.push(`--config`,ds(N)),C.push(...S);try{setOxcExitCode(await runOxlint(C,{cwd:a,verbose:n.verbose}))}catch(n){if(n instanceof OxcNotFoundError){printOxcNotFound(n),setOxcExitCode(1);return}throw n}}}}),tI,nI=__esmMin(()=>{Ts(),hP(),tI={command:`fix [paths..]`,description:`Run oxfmt --write then oxlint --fix — format + safe lint fixes in one pass.`,builder:n=>n.positional(`paths`,{description:"Files or directories to fix. Default: `.`",type:`string`,array:!0}).option(`write`,{description:`Apply fixes in place (default: true). Pass --no-write to report only.`,type:`boolean`,default:!0}).option(`config-path`,{description:`Path to an .oxlintrc.json. Default: walks up from cwd to find one.`,type:`string`,normalize:!0}).option(`verbose`,{description:`Echo the resolved oxc launchers + args before spawning.`,type:`boolean`,default:!1}),handler:async n=>{let a=process.cwd(),S=n.paths?.length?n.paths:[`.`],C=n.verbose??!1,N=n.write!==!1;try{let F=[N?`--write`:`--list-different`],I=n.configPath??findOxfmtConfig(a)??void 0;I&&F.push(`--config`,ds(I)),F.push(...S);let H=await runOxfmt(F,{cwd:a,verbose:C}),W=[];N&&W.push(`--fix`);let K=n.configPath??findOxlintConfig(a)??void 0;K&&W.push(`--config`,ds(K)),W.push(...S);let q=await runOxlint(W,{cwd:a,verbose:C});setOxcExitCode(H||q)}catch(n){if(n instanceof OxcNotFoundError){printOxcNotFound(n),setOxcExitCode(1);return}throw n}}}});function createInterface(n,a){return typeof n==`object`&&n&&!(`read`in n&&typeof n.read==`function`)?new Interface(n):new Interface({input:n,output:a})}var Interface,rI=__esmMin(()=>{Qc(),Interface=class extends Interface$1{question(n,a){return new Promise(a=>{super.question(n,a)})}}});function semverGt(n,a){try{return compare(n,a)===1}catch{return!1}}function groupByDependency(n){let a=new Map;for(let S of n){let n=a.get(S.name);n||(n={name:S.name,occurrences:[],declaredRanges:new Set,dominantRange:S.currentRange,highestVersion:S.currentVersion},a.set(S.name,n)),n.occurrences.push(S),n.declaredRanges.add(S.currentRange),S.currentVersion&&(!n.highestVersion||semverGt(S.currentVersion,n.highestVersion))&&(n.highestVersion=S.currentVersion)}for(let n of a.values()){let a=new Map;for(let S of n.occurrences)a.set(S.currentRange,(a.get(S.currentRange)??0)+1);let S=n.occurrences[0].currentRange,C=-1,N=null;for(let[n,F]of a.entries()){let a=parse(n.replace(/^[\^~>=<]+/,``))?.version??null;(F>C||F===C&&a&&N&&semverGt(a,N)||F===C&&n<S)&&(S=n,C=F,N=a)}n.dominantRange=S}return[...a.values()].sort((n,a)=>n.name.localeCompare(a.name))}function isInconsistent(n){return n.declaredRanges.size>1}function findInconsistencies(n){return n.filter(isInconsistent)}var iI=__esmMin(()=>{XM()});function discoverContext(n){let a=findWorkspaceRoot(n);if(a)return{root:a,workspaces:discoverWorkspaces(a,{includeRoot:!0}),isMonorepo:!0};let S=ms(n,`package.json`);if(!existsSync(S))throw Error(`[gjsify upgrade] no package.json at ${S}`);let C=JSON.parse(readFileSync(S,`utf-8`));return{root:n,workspaces:[{name:C.name??`<root>`,location:n,relativeLocation:`.`,version:C.version??`0.0.0`,manifest:C,private:C.private===!0}],isMonorepo:!1}}function applyWorkspaceFilter(n,a,S){let C=a?.split(`,`).map(n=>n.trim()).filter(Boolean),N=S?.split(`,`).map(n=>n.trim()).filter(Boolean);return(!C||C.length===0)&&(!N||N.length===0)?n:filterWorkspaces(n,{include:C,exclude:N})}function parseFilterList(n){return n?n.split(`,`).map(n=>n.trim().toLowerCase()).filter(Boolean):[]}function collectAllDeclarations(n,a){let S=[];for(let C of n)for(let n of collectFromWorkspace(C,a))S.push(n);return S}function collectFromWorkspace(n,a){let S=[],C=n.manifest;for(let N of oI){let F=C[N];if(!(!F||typeof F!=`object`))for(let[C,I]of Object.entries(F)){if(typeof I!=`string`||a.length&&!a.some(n=>C.toLowerCase().includes(n))||I.startsWith(`workspace:`)||I.startsWith(`file:`)||I.startsWith(`link:`)||I.startsWith(`git+`)||I.startsWith(`git:`)||I.startsWith(`http:`)||I.startsWith(`https:`)||I.startsWith(`npm:`)||I.startsWith(`portal:`))continue;let{prefix:F,version:H}=splitRange(I);S.push({workspace:n.name,workspaceLocation:n.location,name:C,field:N,currentRange:I,currentVersion:H,prefix:F})}}return S}function splitRange(n){let a=n.match(/^(\^|~|>=|<=|>|<|=)?\s*([0-9].*)$/);if(!a)return{prefix:``,version:null};let S=a[1]??``,C=a[2]?.split(/\s|[|&,]/)[0]??null;return{prefix:S,version:(C?parse(C):null)?.version??null}}function runCheckMode(n){let a=findInconsistencies(n);if(a.length===0){he.log(`gjsify upgrade --check: OK. ${n.length} dep(s) consistently declared across workspaces.`);return}he.error(`gjsify upgrade --check: FAIL. ${a.length} dep(s) declared at inconsistent ranges:\n`);for(let n of a){let a=new Map;for(let S of n.occurrences){let n=a.get(S.currentRange)??[];n.push(S.workspace),a.set(S.currentRange,n)}he.error(` ${sI.bold}${n.name}${sI.reset}`);for(let[n,S]of a.entries())he.error(` ${n.padEnd(16)} — ${S.join(`, `)}`)}he.error("\nFix: run `gjsify upgrade --align` (offline; aligns each dep to its highest declared range)."),process.exit(1)}function runAlignMode(n,a){let S=findInconsistencies(n);if(S.length===0){he.log(`gjsify upgrade --align: nothing to do. ${n.length} dep(s) already consistent.`);return}let C=[];for(let n of S){if(!n.highestVersion)continue;let a=n.occurrences.find(a=>a.currentRange===n.dominantRange)?.prefix||`^`;C.push({...n,latestVersion:n.highestVersion,diff:`none`,occurrences:n.occurrences.map(n=>({...n,prefix:a}))})}if(C.length===0){he.log(`gjsify upgrade --align: inconsistencies present but no parseable target version. No-op.`);return}he.log(`gjsify upgrade --align: aligning ${C.length} inconsistent dep(s) to their highest declared version:\n`);for(let n of C){let a=n.occurrences[0]?.prefix??`^`;he.log(` ${n.name.padEnd(28)} ranges: ${[...n.declaredRanges].join(`, `)} → ${a}${n.latestVersion}`)}if(a.dryRun){he.log(`
|
|
925
|
+
[gjsify upgrade --align] --dry-run: no files changed.`);return}let N=applyToFiles(C);he.log(`\n✏️ updated ${C.length} dep(s) across ${N} package.json file(s).`)}async function resolveCandidateGroups(n,a,S,C){let N=[],F=0;async function worker(){for(;;){let I=F++;if(I>=n.length)return;let H=n[I];try{let n=(await fetchPackument(H.name,{npmrc:a}))[`dist-tags`]?.latest;if(!n){S&&he.warn(` ${H.name}: no dist-tags.latest, skipping`);continue}let F=H.highestVersion;if(!F){S&&he.warn(` ${H.name}: unable to parse any current range`);continue}let I=classifyDiff(F,n);if(I===`none`||C===`minor`&&I===`major`||C===`patch`&&(I===`major`||I===`minor`))continue;N.push({...H,latestVersion:n,diff:I})}catch(n){S&&he.warn(` ${H.name}: fetch failed (${n.message})`)}}}return await Promise.all(Array.from({length:8},()=>worker())),N.sort((n,a)=>n.name.localeCompare(a.name)),N}function classifyDiff(n,a){let S=parse(n),C=parse(a);return!S||!C?`none`:S.major===C.major?S.minor===C.minor?S.patch===C.patch?(S.prerelease??[]).join(`.`)===(C.prerelease??[]).join(`.`)?`none`:`prerelease`:C.patch>S.patch?`patch`:`none`:C.minor>S.minor?`minor`:`none`:C.major>S.major?`major`:`none`}function colorForDiff(n){switch(n){case`major`:return sI.red;case`minor`:return sI.yellow;case`patch`:return sI.green;case`prerelease`:return sI.cyan;default:return``}}function printTable(n){let a=Math.max(...n.map(n=>n.name.length),4),S=Math.max(...n.map(n=>`${n.occurrences.length}`.length+2),3),C=Math.max(...n.map(n=>declaredCellWidth(n)),7),N=Math.max(...n.map(n=>n.latestVersion.length),6),F=String(n.length).length+2,I=` `.repeat(F+2)+sI.bold+`name`.padEnd(a)+` `+`fan`.padEnd(S)+` `+`declared`.padEnd(C)+` `+`latest`.padEnd(N)+` kind`+sI.reset;he.log(I),he.log(` `.repeat(F+2)+sI.dim+`─`.repeat(a+S+C+N+16)+sI.reset);for(let I=0;I<n.length;I++){let H=n[I],W=`${I+1}.`.padEnd(F),K=H.declaredRanges.size>1?`${sI.magenta}⚠ ${sI.reset}`:` `,q=colorForDiff(H.diff);he.log(W+K+H.name.padEnd(a)+` `+sI.dim+`${H.occurrences.length}`.padEnd(S)+sI.reset+` `+sI.dim+renderDeclaredCell(H).padEnd(C)+sI.reset+` `+q+H.latestVersion.padEnd(N)+sI.reset+` `+q+H.diff+sI.reset)}let H=n.filter(n=>n.declaredRanges.size>1).length;H>0&&he.log(`\n${sI.magenta}⚠${sI.reset} ${H} dep(s) declared at inconsistent ranges across workspaces.`)}function declaredCellWidth(n){return renderDeclaredCell(n).length}function renderDeclaredCell(n){if(n.declaredRanges.size===1)return[...n.declaredRanges][0];let a=[...n.declaredRanges].sort().join(`, `);return a.length<=32?a:a.slice(0,29)+`…`}function printChangePlan(n){for(let a of n)for(let n of a.occurrences)he.log(` ${n.workspace.padEnd(38)} ${a.name.padEnd(28)} ${n.currentRange.padEnd(12)} → ${n.prefix}${a.latestVersion}`)}async function promptSelection(n){if(!process.stdin.isTTY)return he.log(`[gjsify upgrade] non-TTY stdin: pass --latest / --minor / --patch (or --yes for interactive-all) to upgrade non-interactively.`),[];let a=createInterface({input:process.stdin,output:process.stdout});try{he.log(`
|
|
926
|
+
Select upgrades: comma- or space-separated indices, `+sI.bold+`a`+sI.reset+` for all, ranges like `+sI.bold+`1-3`+sI.reset+`, or `+sI.bold+`ENTER`+sI.reset+` to skip:`);let S=(await a.question(`> `)).trim();if(!S)return[];if(S.toLowerCase()===`a`||S.toLowerCase()===`all`)return[...n];let C=new Set;for(let n of S.split(/[\s,]+/).filter(Boolean)){let a=n.match(/^(\d+)-(\d+)$/);if(a){let n=Number(a[1]),S=Number(a[2]);for(let a=Math.min(n,S);a<=Math.max(n,S);a++)C.add(a-1)}else/^\d+$/.test(n)&&C.add(Number(n)-1)}return[...C].filter(a=>a>=0&&a<n.length).map(a=>n[a])}finally{a.close()}}function applyToFiles(n){let a=new Map;for(let S of n)for(let n of S.occurrences){let C=a.get(n.workspaceLocation)??[];C.push({...S,occurrences:[n]}),a.set(n.workspaceLocation,C)}let S=0;for(let[n,C]of a.entries()){let a=ms(n,`package.json`),N=readFileSync(a,`utf-8`),F=JSON.parse(N),I=!1;for(let n of C){let a=n.occurrences[0],S=F[a.field];if(!S)continue;let C=`${a.prefix}${n.latestVersion}`;S[n.name]!==C&&(S[n.name]=C,I=!0)}if(I){let n=detectIndent(N);writeFileSync(a,JSON.stringify(F,null,n)+(N.endsWith(`
|
|
927
927
|
`)?`
|
|
928
|
-
`:``),`utf-8`),S++}}return S}function uniqueLocations(n){let a=new Set;for(let S of n)for(let n of S.occurrences)a.add(n.workspaceLocation);return[...a]}function detectIndent(n){let a=n.match(/^\{\n( +)/);return a?a[1].length:2}async function loadNpmrcLight(n){let a={registry
|
|
928
|
+
`:``),`utf-8`),S++}}return S}function uniqueLocations(n){let a=new Set;for(let S of n)for(let n of S.occurrences)a.add(n.workspaceLocation);return[...a]}function detectIndent(n){let a=n.match(/^\{\n( +)/);return a?a[1].length:2}async function loadNpmrcLight(n){let a={registry:$M,scopes:{},authTokens:{},basicAuth:{}};for(let S of[ms(homedir(),`.npmrc`),ms(n,`.npmrc`)])if(existsSync(S))try{let n=parseNpmrc(readFileSync(S,`utf-8`));a={...a,...n,scopes:{...a.scopes,...n.scopes}}}catch{}return process.env.npm_config_registry&&(a.registry=process.env.npm_config_registry),a}var aI,oI,sI,cI=__esmMin(()=>{ge(),ul(),Ts(),am(),rI(),XM(),oN(),N_(),F_(),iI(),aI={command:`upgrade`,description:"Workspace-aware dependency upgrades. Walks every package.json in the monorepo, groups by dep, flags inconsistencies. `--latest` / `--minor` / `--patch` for bulk-mode, `--align` for offline consistency-only mode, `--check` for CI drift detection.",builder:n=>n.option(`latest`,{description:`Non-interactive: bump every dependency to its latest version (allows major).`,type:`boolean`,default:!1}).option(`minor`,{description:`Non-interactive: bump every dependency to the latest within the same major (semver-minor + semver-patch).`,type:`boolean`,default:!1}).option(`patch`,{description:`Non-interactive: bump every dependency to the latest within the same minor (semver-patch only).`,type:`boolean`,default:!1}).option(`filter`,{description:`Only consider deps whose name matches this substring (case-insensitive). Repeatable; comma-separated values are split.`,type:`string`}).option(`workspace`,{alias:`p`,description:`Restrict to a subset of workspaces. Patterns are matched against the workspace package name AND its directory path (substring + glob). Repeatable; comma-separated values are split.`,type:`string`}).option(`exclude-workspace`,{description:`Skip workspaces matching this pattern (glob-shaped; matched against workspace package name AND directory path). Repeatable; comma-separated values are split. Use for workspaces with intentional dependency drift — e.g. integration tests pinned to specific upstream versions.`,type:`string`}).option(`align`,{description:`Offline consistency mode: find deps declared at multiple ranges across the workspace and align them to the highest. No registry calls.`,type:`boolean`,default:!1}).option(`check`,{description:"CI gate: exit non-zero when any dep is declared inconsistently across workspaces. Implies offline (no registry calls). Pairs with `--align` as the fix.",type:`boolean`,default:!1}).option(`dry-run`,{description:`Print the upgrade plan without writing package.json files.`,type:`boolean`,default:!1}).option(`cwd`,{description:`Project directory. Default: process.cwd(). When inside a workspace, walks up to the monorepo root.`,type:`string`}).option(`yes`,{alias:`y`,description:`Interactive mode: select all without prompting.`,type:`boolean`,default:!1}).option(`verbose`,{description:`Print extra resolution details.`,type:`boolean`,default:!1}),handler:async n=>{let a=discoverContext(ds(n.cwd??process.cwd())),S=applyWorkspaceFilter(a.workspaces,n.workspace,n.excludeWorkspace);if(S.length===0){he.log(`[gjsify upgrade] no matching workspaces.`);return}let C=collectAllDeclarations(S,parseFilterList(n.filter));if(C.length===0){he.log(`[gjsify upgrade] no external npm dependencies to check.`);return}let N=groupByDependency(C);if(n.check)return runCheckMode(N);if(n.align)return runAlignMode(N,n);let F=await loadNpmrcLight(a.root),I=n.latest?`latest`:n.minor?`minor`:n.patch?`patch`:`interactive`;he.log(`[gjsify upgrade] checking ${N.length} unique deps across ${S.length} workspace(s) against ${F.registry}…`);let H=await resolveCandidateGroups(N,F,n.verbose??!1,I);if(H.length===0){he.log(`✅ all dependencies are up to date`);let n=findInconsistencies(N);n.length>0&&he.log(`\n⚠ ${n.length} dep(s) declared at inconsistent ranges across workspaces. Run \`gjsify upgrade --align\` to fix.`);return}printTable(H);let W;if(I===`interactive`&&!n.yes?W=await promptSelection(H):(n.yes&&I===`interactive`&&he.log(`[gjsify upgrade] -y / --yes: selecting all`),W=H),W.length===0){he.log(`[gjsify upgrade] nothing selected; no files changed.`);return}if(n.dryRun){let n=uniqueLocations(W).length;he.log(`[gjsify upgrade] --dry-run: would update ${W.length} deps across ${n} package.json file(s).`),printChangePlan(W);return}let K=applyToFiles(W);he.log(`✏️ updated ${W.length} dep(s) across ${K} package.json file(s). Run \`gjsify install\` to apply.`)}},oI=[`dependencies`,`devDependencies`,`optionalDependencies`,`peerDependencies`],sI={reset:`\x1B[0m`,bold:`\x1B[1m`,dim:`\x1B[2m`,red:`\x1B[31m`,yellow:`\x1B[33m`,green:`\x1B[32m`,cyan:`\x1B[36m`,magenta:`\x1B[35m`}});async function generateBarrels(n){let a=n.singleQuotes?`'`:`"`,S=n.noSemicolon?``:`;`,C=n.extension===`none`?``:`.${n.extension}`,N=0;for(let F of n.paths){let I=ds(n.baseDir,F),H=vs(I)===`types`,W;try{W=(await readdir$1(I,{withFileTypes:!0})).filter(n=>n.isFile()).filter(n=>uI.test(n.name)).filter(n=>n.name!==`index.ts`).filter(a=>!n.exclude.some(n=>n.test(a.name))).sort((n,a)=>n.name.localeCompare(a.name))}catch(a){n.verbose&&he.error(`[gjsify barrels] skip ${I}: ${a.message}`);continue}let K=W.map(n=>{let N=vs(n.name,ys(n.name));return`${H?`export type *`:`export *`} from ${a}./${N}${C}${a}${S}`}),q=K.length?`${K.join(`
|
|
929
929
|
`)}\n`:`export {};
|
|
930
|
-
`,Y=`${n.header}\n\n${q}`,X=ms(I,`index.ts`);if(await readFile$1(X,`utf-8`).catch(()=>``)===Y){n.verbose&&he.log(`[gjsify barrels] up-to-date: ${X}`);continue}n.check?(he.error(`[gjsify barrels] drift: ${X}`),N++):(await writeFile$1(X,Y,`utf-8`),n.verbose&&he.log(`[gjsify barrels] wrote: ${X}`))}return N}var
|
|
931
|
-
`).map(n=>n.trim()).filter(Boolean)}var
|
|
930
|
+
`,Y=`${n.header}\n\n${q}`,X=ms(I,`index.ts`);if(await readFile$1(X,`utf-8`).catch(()=>``)===Y){n.verbose&&he.log(`[gjsify barrels] up-to-date: ${X}`);continue}n.check?(he.error(`[gjsify barrels] drift: ${X}`),N++):(await writeFile$1(X,Y,`utf-8`),n.verbose&&he.log(`[gjsify barrels] wrote: ${X}`))}return N}var lI,uI,dI=__esmMin(()=>{ge(),Hc(),Ts(),lI=[`\\.test\\.`,`\\.spec\\.`,`\\.test-data\\.`],uI=/\.(ts|tsx|mts|cts)$/}),fI,pI=__esmMin(()=>{ge(),dI(),fI={command:`barrels [paths..]`,description:"Regenerate `index.ts` barrel files for the given directories. Drop-in replacement for `barrelsby`.",builder:n=>n.positional(`paths`,{description:"Directories whose `index.ts` to (re)generate. May also be passed via `--paths`.",type:`string`,array:!0}).option(`paths`,{alias:`p`,description:`Alternative to positional — repeatable list of directories.`,type:`string`,array:!0}).option(`ext`,{description:"Import-specifier extension. Default: `none` (bundler-mode resolution).",type:`string`,choices:[`js`,`ts`,`none`],default:`none`}).option(`base-dir`,{alias:`b`,description:"Resolve `paths` against this directory. Default: cwd.",type:`string`}).option(`exclude`,{description:"Regex(es) of file names to skip. Repeatable. Defaults: `\\.test\\.`, `\\.spec\\.`, `\\.test-data\\.`.",type:`string`,array:!0}).option(`header`,{description:`Header comment prepended to every generated file.`,type:`string`}).option(`semicolon`,{description:"Emit trailing `;` on each export line. Negate with `--no-semicolon`. Default: omitted.",type:`boolean`,default:!1}).option(`single-quotes`,{description:"Use `'` for import specifiers. Default: true. Pass `--no-single-quotes` for `\"`.",type:`boolean`,default:!0}).option(`check`,{description:`Report drift without modifying files; exit non-zero if any barrel is stale.`,type:`boolean`,default:!1}).option(`verbose`,{description:`Log each file scanned + written.`,type:`boolean`,default:!1}),handler:async n=>{let a=Array.from(new Set((n.paths??[]).filter(Boolean)));if(a.length===0){he.error(`[gjsify barrels] no paths provided. Pass directories as positional arguments or via --paths.`),process.exitCode=1;return}let S=n.exclude?.length?n.exclude:[...lI],C=await generateBarrels({paths:a,extension:n.ext??`none`,baseDir:n.baseDir??process.cwd(),exclude:S.map(n=>new RegExp(n)),header:n.header??"// Auto-generated by `gjsify barrels` — do not edit by hand.",noSemicolon:n.semicolon===!1||n.semicolon===void 0,singleQuotes:n.singleQuotes!==!1,check:n.check??!1,verbose:n.verbose??!1});n.check&&C>0&&(he.error(`[gjsify barrels] ${C} barrel file(s) drifted. Run without --check to fix.`),process.exitCode=1)}}}),mI,hI=__esmMin(()=>{ge(),Gm(),ts(),Ts(),nn(),uM(),F_(),mI={command:`tsc [tscArgs..]`,description:"Run TypeScript compiler (tsc) under GJS via the @gjsify/tsc bundle. All arguments are passed through to tsc. Equivalent to `gjsify-tsc <args>` from the @gjsify/tsc bin.",builder:n=>n.parserConfiguration({"unknown-options-as-args":!0}).version(!1).help(!1).positional(`tscArgs`,{description:"Arguments forwarded verbatim to tsc (e.g. `--version`, `-p tsconfig.json`).",type:`string`,array:!0,default:[]}),handler:async n=>{let a=(n._??[]).slice(1).map(String),S=n.tscArgs??[],C=a.length>0?a:S,N=process.cwd(),F=[pathToFileURL(`${findWorkspaceRoot(N)??N}/__gjsify_tsc__.js`).href,import.meta.url],I;for(let n of F)try{I=createRequire(n).resolve(`@gjsify/tsc/bundle`);break}catch{}let H;for(let n of F)try{H=ms(_s(createRequire(n).resolve(`typescript/package.json`)),`lib`,`tsc.js`);break}catch{}if(!I&&!H)return he.error("gjsify tsc: neither @gjsify/tsc (GJS bundle) nor npm `typescript` (Node) is installed."),he.error(" Install with: gjsify install --save-dev @gjsify/tsc (or add `typescript`)."),process.exit(1);let W=buildNativeEnv(detectNativePackages(N)),K={...process.env,...W},runNodeTsc=()=>{let n=spawn(process.execPath,[H,...C],{env:K,stdio:`inherit`});n.on(`close`,n=>process.exit(n??1)),n.on(`error`,n=>{he.error(`gjsify tsc (node typescript): ${n.message}`),process.exit(1)})};if(I){let n=!1,a=spawn(`gjs`,[`-m`,I,...C],{env:K,stdio:`inherit`});await new Promise(S=>{a.on(`close`,a=>{n||process.exit(a??1)}),a.on(`error`,a=>{n=!0,a.code===`ENOENT`&&H?runNodeTsc():a.code===`ENOENT`?(he.error("gjsify tsc: `gjs` not found on PATH and no npm `typescript` fallback."),he.error(" Install GJS (e.g. `dnf install gjs`), or add `typescript` to the project."),process.exit(1)):(he.error(`gjsify tsc: ${a.message}`),process.exit(1))})})}else runNodeTsc()}}});function readStdinTextGioUnix(){let n=giNamespace()?.GioUnix;if(typeof n?.InputStream!=`function`)throw Error(`GioUnix.InputStream is unavailable`);let a=new n.InputStream({fd:0,close_fd:!1}),S=[],C=0;for(;;){let n=a.read_bytes(gI,null);if(n.get_size()===0)break;let N=n.toArray();S.push(N),C+=N.length}if(C===0)return``;let N=new Uint8Array(C),F=0;for(let n of S)N.set(n,F),F+=n.length;return new TextDecoder().decode(N)}function readStdinTextGioFile(){let n=giNamespace()?.Gio;if(!n?.File)throw Error(`Gio.File is unavailable`);let[a,S]=n.File.new_for_path(`/dev/stdin`).load_contents(null);if(!a)throw Error(`Gio.File.load_contents("/dev/stdin") returned false`);return new TextDecoder().decode(S)}function giNamespace(){return globalThis.imports?.gi}function readStdinText(){if(!giNamespace())return readFileSync(0,`utf-8`);let n=[];for(let a of[readStdinTextGioUnix,readStdinTextGioFile])try{return a()}catch(S){n.push(`${a.name}: ${S.message}`)}throw Error(`gjsify: cannot read stdin under GJS. Tried ${n.join(`; `)}. Pass the input as an argument instead (e.g. --base <ref> rather than --changed-from-stdin).`)}function readStdinLines(){return splitStdinLines(readStdinText())}function splitStdinLines(n){return n.split(`
|
|
931
|
+
`).map(n=>n.trim()).filter(Boolean)}var gI,_I=__esmMin(()=>{ul(),gI=64*1024});function classifyAndExpand(n,a){let S=a.map(n=>n.replace(/\\/g,`/`)).filter(n=>n.length>0);if(S.length===0)return{global:!1,reason:`empty-diff`,workspaces:[],runE2E:!1,runIntegration:!1,skipAll:!0};let C=[];for(let n of S)bI.some(a=>a.test(n))||C.push(n);if(C.length===0)return{global:!1,reason:`ignored-only`,workspaces:[],runE2E:!1,runIntegration:!1,skipAll:!0};for(let a of C)for(let S of yI)if(S.test(a))return{global:!0,reason:`global-trigger ${S.source} matched ${a}`,workspaces:n.map(n=>n.name),runE2E:!0,runIntegration:!0,skipAll:!1};let{matched:N,unmatched:F}=workspacesForChangedFiles(n,C),I=new Set(n.map(n=>n.name)),H=new Set,W=new Set,K=!1;for(let a of SI){let S=C.filter(n=>a.match.test(n));if(S.length!==0){for(let n of S)W.add(n);for(let S of a.seeds){if(!I.has(S))return{global:!0,reason:`script-coupling seed ${S} is not a workspace (${a.match.source} → ${a.why}); SCRIPT_COUPLINGS in commands/affected.ts is stale`,workspaces:n.map(n=>n.name),runE2E:!0,runIntegration:!0,skipAll:!1};H.add(S)}a.runE2E&&(K=!0)}}let q=F.filter(n=>!W.has(n));if(q.length>0)return{global:!0,reason:`unmatched files (${q.length}): ${q.slice(0,3).join(`, `)}${q.length>3?`…`:``}`,workspaces:n.map(n=>n.name),runE2E:!0,runIntegration:!0,skipAll:!1};for(let n of H)N.add(n);if(H.size===0&&C.every(n=>xI.some(a=>a.test(n)))&&N.size===1){let n=[...N][0],a=C.some(n=>n.startsWith(`tests/e2e/`)),S=C.some(n=>n.startsWith(`tests/integration/`));return{global:!1,reason:`test-only (${C.length} file(s) in ${n})`,workspaces:[n],runE2E:a,runIntegration:S||isIntegrationWorkspace(n),skipAll:!1}}let Y=affectedClosure(buildReverseDependencyGraph(n,{includeDev:!1}),[...N]),X=buildDependencyGraph(n,{includeDev:!0}),te=!1;for(let[n,a]of X.edges)if(isIntegrationWorkspace(n)){for(let S of a)if(Y.has(S)){Y.add(n),te=!0;break}}let ne=C.some(n=>n.startsWith(`tests/e2e/`))||K;return{global:!1,reason:`closure (${Y.size} ws from ${N.size} seed(s))`+(H.size>0?`, ${H.size} via script-coupling`:``),workspaces:[...Y].sort(),runE2E:ne,runIntegration:te,skipAll:!1}}function isIntegrationWorkspace(n){return n.startsWith(`@gjsify/integration-`)}function runGitDiff(n,a,S){let C=spawnSync(`git`,[`diff`,`--name-only`,`${a}...${S}`],{cwd:n,encoding:`utf8`});if(C.status!==0)throw process.stderr.write(`gjsify affected: git diff failed (${C.status}): ${C.stderr.trim()}\n`),process.exit(2),Error(`gjsify affected: git diff failed (${C.status})`);return C.stdout.split(`
|
|
932
932
|
`).filter(Boolean)}function emit(n,a){if(n===`json`){process.stdout.write(JSON.stringify(a)+`
|
|
933
933
|
`);return}if(n===`globs`){for(let n of a.workspaces)process.stdout.write(`${n}\n`);return}if(n===`github-actions`){let n=a.global?``:a.workspaces.map(n=>`--include ${assertShellSafeWorkspaceName(n)}`).join(` `),S=process.env.GITHUB_OUTPUT,C=[`skip-all=${a.skipAll}`,`global=${a.global}`,`include-args=${n}`,`run-integration=${a.runIntegration}`,`run-e2e=${a.runE2E}`,`reason=${a.reason}`];if(S)for(let n of C)appendFileSync(S,`${n}\n`);else for(let n of C)process.stdout.write(`${n}\n`);return}process.stdout.write(`affected:
|
|
934
|
-
`),process.stdout.write(` reason: ${a.reason}\n`),process.stdout.write(` global: ${a.global}\n`),process.stdout.write(` skip-all: ${a.skipAll}\n`),process.stdout.write(` run-integration: ${a.runIntegration}\n`),process.stdout.write(` run-e2e: ${a.runE2E}\n`),process.stdout.write(` workspaces (${a.workspaces.length}):\n`);for(let n of a.workspaces)process.stdout.write(` - ${n}\n`)}function assertShellSafeWorkspaceName(n){if(
|
|
934
|
+
`),process.stdout.write(` reason: ${a.reason}\n`),process.stdout.write(` global: ${a.global}\n`),process.stdout.write(` skip-all: ${a.skipAll}\n`),process.stdout.write(` run-integration: ${a.runIntegration}\n`),process.stdout.write(` run-e2e: ${a.runE2E}\n`),process.stdout.write(` workspaces (${a.workspaces.length}):\n`);for(let n of a.workspaces)process.stdout.write(` - ${n}\n`)}function assertShellSafeWorkspaceName(n){if(CI.test(n))return n;throw process.stderr.write(`gjsify affected: workspace name ${JSON.stringify(n)} is not shell-safe, so it cannot be emitted as an\n \`include-args\` token (the value is consumed by an UNQUOTED $INCLUDE_ARGS expansion — see the\n contract at the top of commands/affected.ts). Rename the workspace, or teach this command a\n transport the consumers can unquote. Refusing to emit a filter that would silently mis-match.\n`),process.exit(2),Error(`gjsify affected: unsafe workspace name ${n}`)}var vI,yI,bI,xI,SI,CI,wI=__esmMin(()=>{Gm(),ul(),_I(),N_(),F_(),vI={command:`affected`,description:"Classify changed files against the workspace tree and print the set of workspaces affected (seeds + transitive dependents). Designed for CI to gate `gjsify foreach test --include …` so unrelated workspaces are not re-tested on every PR.",builder:n=>n.option(`base`,{description:"Diff base. Default: `origin/main`. Resolved via `git rev-parse`. On a PR set this to `${{ github.event.pull_request.base.sha }}`.",type:`string`}).option(`head`,{description:"Diff head. Default: `HEAD`.",type:`string`,default:`HEAD`}).option(`format`,{description:`Output shape.`,choices:[`text`,`json`,`globs`,`github-actions`],default:`text`}).option(`changed-from-stdin`,{description:"Skip `git diff`. Read a newline-separated list of repo-relative paths from stdin instead. Lets callers — tests, ad-hoc scripts — control the input exactly.",type:`boolean`,default:!1}).option(`cwd`,{description:"Workspace root. Default: discovered from `process.cwd()`.",type:`string`}),handler:async n=>{let a=n.cwd??findWorkspaceRoot(process.cwd())??process.cwd(),S=classifyAndExpand(discoverWorkspaces(a,{includeRoot:!0}),n[`changed-from-stdin`]?readStdinLines():runGitDiff(a,n.base??`origin/main`,n.head??`HEAD`));emit(n.format,S)}},yI=[/^packages\/infra\/workspace\//,/^packages\/infra\/cli\//,/^packages\/infra\/rolldown-plugin-gjsify\//,/^packages\/infra\/resolve-npm\//,/^packages\/gjs\/unit\//,/^\.github\/actions\//,/^gjsify-lock\.json$/,/^package\.json$/,/^tsconfig[^/]*\.json$/,/^\.github\/workflows\/main\.yml$/,/^scripts\/audit-runtimes\.mjs$/],bI=[/\.md$/i,/^refs\//,/^website\//,/^docs\//,/^\.github\/workflows\/(deploy-docs|commitlint|release|release-cut|audit-runtimes|prebuilds|node-gi|napi|cli-cross-platform|build-ci-image)\.yml$/,/^\.github\/prebuild-toolchain\//,/^scripts\/manifest-conformance\//,/^\.githooks\//,/^packages\/node-gi\//,/^packages\/napi\//,/^flatpak\//,/^LICENSE/,/^\.gitignore$/,/^\.gjsify-[^/]*\.md$/,/^STATUS\.md$/,/^CHANGELOG\.md$/,/^AGENTS\.md$/,/^CLAUDE\.md$/,/^README\.md$/],xI=[/\.spec\.[mc]?[tj]sx?$/,/^tests\/(e2e|integration)\//],SI=[{match:/^templates\//,seeds:[`@gjsify/create-app`],runE2E:!0,why:`@gjsify/create-app build → node scripts/process-template.mjs reads templates/`}],CI=/^[A-Za-z0-9@][A-Za-z0-9@._/-]*$/});function readPackage$2(n){try{return JSON.parse(readFileSync(ms(n,`package.json`),`utf8`))}catch{return{}}}function deriveAppId(n){return n?`org.gjsify.storybook.${n.replace(/^@/,``).replace(/[^a-zA-Z0-9]+/g,`.`).replace(/^\.+|\.+$/g,``)}`:`org.gjsify.Storybook`}function findStoryFiles(n){let a=[];if(!existsSync(n))return a;for(let S of readdirSync(n,{withFileTypes:!0})){if(S.name===`node_modules`||S.name.startsWith(`.`))continue;let C=ms(n,S.name);S.isDirectory()?a.push(...findStoryFiles(C)):/\.story\.(ts|js|mts|mjs)$/.test(S.name)&&a.push(C)}return a}function generateEntry$2(n,a,S){let C=n.map((n,a)=>`import * as m${a} from ${JSON.stringify(n)};`).join(`
|
|
935
935
|
`),N=n.map((n,a)=>`m${a}`).join(`, `),F=S?`\n title: ${JSON.stringify(S)},`:``;return`// Auto-generated by \`gjsify storybook\` — do not edit by hand.
|
|
936
936
|
import { collectStoryModules, runStorybook } from '@gjsify/storybook';
|
|
937
937
|
${C}
|
|
@@ -940,7 +940,7 @@ await runStorybook({
|
|
|
940
940
|
applicationId: ${JSON.stringify(a)},${F}
|
|
941
941
|
stories: collectStoryModules([${N}]),
|
|
942
942
|
});
|
|
943
|
-
`}var
|
|
943
|
+
`}var TI,EI=__esmMin(()=>{ge(),Gm(),ul(),Ts(),bm(),__name$1(readPackage$2,`readPackage`),__name$1(generateEntry$2,`generateEntry`),TI={command:`storybook`,description:`Discover *.story.ts in this project and launch the GTK storybook browser.`,builder:n=>n.option(`stories`,{description:`Directory scanned recursively for *.story.ts (default: src, or gjsify.storybook.stories)`,type:`string`}).option(`app-id`,{description:`GApplication id (default: gjsify.storybook.applicationId or derived from the package name)`,type:`string`}).option(`title`,{description:`Window title`,type:`string`}).option(`globals`,{description:"Value for `gjsify build --globals` (default: auto; use auto,dom for canvas/DOM stories)",type:`string`}).option(`out`,{description:`Output bundle path (default: node_modules/.cache/gjsify-storybook)`,type:`string`}).option(`runtime`,{description:"Runtime to build for and launch on: gjs | node | bun | deno (default: the host runtime). node/bun/deno build the same `--app node` bundle (gi:// → @gjsify/node-gi) and require @gjsify/node-gi installed in the project.",type:`string`,choices:[`gjs`,`node`,`bun`,`deno`],defaultDescription:`host runtime (gjs on gjs, else node/bun/deno)`}).option(`watch`,{description:`Rebuild and relaunch when a story file changes`,type:`boolean`,default:!1}).option(`build-only`,{description:`Build the bundle but do not launch it`,type:`boolean`,default:!1}),handler:async n=>{let a=process.cwd(),S=readPackage$2(a),C=S.gjsify?.storybook??{},N=ds(a,n.stories??C.stories??`src`),F=n.appId??C.applicationId??deriveAppId(S.name),I=n.title??C.title,H=n.globals??C.globals??`auto`,W=n.runtime??C.runtime??hostRuntime(),K=W===`gjs`?`gjs`:`node`,q=ms(a,`node_modules`,`.cache`,`gjsify-storybook`);mkdirSync(q,{recursive:!0});let Y=ms(q,`entry.ts`),X=n.out?ds(a,n.out):ms(q,`storybook.${K}.mjs`),writeEntry=()=>{let n=findStoryFiles(N).sort();return writeFileSync(Y,generateEntry$2(n,F,I)),n.length},te=writeEntry();if(te===0)return he.error(`No *.story.ts files found under ${hs(a,N)||N}\n\n \`gjsify storybook\` renders the stories of the CURRENT project: it discovers\n \`*.story.ts\` files and launches a component browser over them. Point it at a\n different directory with --stories <dir> (or \`gjsify.storybook.stories\` in\n package.json) if yours live elsewhere.\n\n To SEE a storybook without authoring one first, run the curated Libadwaita\n component browser — it is a showcase, so it needs no project at all:\n\n gjsify showcase adwaita-storybook`),process.exit(1);he.log(`Found ${te} story file(s) under ${hs(a,N)||`.`} (runtime: ${W})`);let{runCli:ne}=await Promise.resolve().then(()=>(FI(),PI)),buildBundle=()=>ne([`build`,Y,`--app`,K,`--globals`,H,`--outfile`,X]),launch=async()=>{if(W===`gjs`){let{runGjsBundle:n}=await Promise.resolve().then(()=>(fM(),dM));await n(X,[],{exitOnSuccess:!0})}else if(W===`node`){let{runNodeBundle:n}=await Promise.resolve().then(()=>(gM(),hM));await n(X,[],{exitOnSuccess:!0})}else{let{runRuntimeBundle:n}=await Promise.resolve().then(()=>(gM(),hM));await n(W,X,[],{exitOnSuccess:!0})}};if(!n.watch){if(await buildBundle(),n.buildOnly)return;await launch();return}let{watch:re}=await Promise.resolve().then(()=>(ul(),sl)),spawnChild=async()=>{if(W===`gjs`)return spawn(`gjs`,[`-m`,X],{stdio:`inherit`});let{computeNativeEnvForBundle:n}=await Promise.resolve().then(()=>(fM(),dM)),{resolveNodeGiForBundle:S,nodeBinary:C}=await Promise.resolve().then(()=>(gM(),hM)),{RUNTIMES:N}=await Promise.resolve().then(()=>(Ym(),Km));if(!S(X,a))throw Error(`Cannot run the storybook on ${W}: \`@gjsify/node-gi\` is not installed. Add @gjsify/node-gi as a dependency to run the storybook on ${W}.`);let{env:F}=n(X,a),I={...process.env,...F};if(W===`node`)return spawn(C(),[X],{stdio:`inherit`,env:I});let[H,K]=N[W].launch(X);return spawn(H,K,{stdio:`inherit`,env:I})},ie=null,ae=!1,oe=!1,rebuild=async()=>{if(ae){oe=!0;return}ae=!0;try{writeEntry(),ie&&=(ie.kill(),null),await buildBundle(),n.buildOnly||(ie=await spawnChild())}catch(n){he.error(`[storybook] rebuild failed: ${n.message}`)}finally{ae=!1,oe&&(oe=!1,rebuild())}};await rebuild();let Z=null;re(N,{recursive:!0},()=>{Z&&clearTimeout(Z),Z=setTimeout(()=>void rebuild(),200)}),he.log(`[storybook] watching ${hs(a,N)||`.`} — press Ctrl+C to stop`)}}});function readPackage$1(n){try{return JSON.parse(readFileSync(ms(n,`package.json`),`utf8`))}catch{return{}}}function deriveStorybookAppId(n){return n?`org.gjsify.storybook.${n.replace(/^@/,``).replace(/[^a-zA-Z0-9]+/g,`.`).replace(/^\.+|\.+$/g,``)}`:`org.gjsify.Storybook`}function deriveBrowserAppId$1(n){return n?`org.gjsify.browser.${n.replace(/^@/,``).replace(/[^a-zA-Z0-9]+/g,`.`).replace(/^\.+|\.+$/g,``)}`:`org.gjsify.Browser`}function hasDep(n,a){return!!(n.dependencies?.[a]||n.devDependencies?.[a])}function generateEntry$1(n,a,S,C){return n===`storybook`?`// Auto-generated by \`gjsify debug\` — do not edit by hand.
|
|
944
944
|
import { runDevtoolsMcp, storybookProfile } from '@gjsify/devtools-mcp';
|
|
945
945
|
|
|
946
946
|
await runDevtoolsMcp(storybookProfile(${JSON.stringify(a)}));
|
|
@@ -960,10 +960,10 @@ await runDevtoolsMcp({
|
|
|
960
960
|
version: ${JSON.stringify(C)},
|
|
961
961
|
busNameBase: ${JSON.stringify(a)},
|
|
962
962
|
});
|
|
963
|
-
`}var
|
|
963
|
+
`}var DI,OI=__esmMin(()=>{ge(),ul(),Ts(),__name$1(readPackage$1,`readPackage`),__name$1(deriveBrowserAppId$1,`deriveBrowserAppId`),__name$1(generateEntry$1,`generateEntry`),DI={command:`debug`,description:`Launch an MCP bridge for a devtools-enabled gjsify app (org.gjsify.Devtools).`,builder:n=>n.option(`bus-name`,{description:`App DBus base name (default: gjsify.devtools.busNameBase, or the storybook app-id)`,type:`string`}).option(`profile`,{description:`Tool profile: generic | storybook | browser | cdp (default: auto — storybook if @gjsify/storybook is a dep, browser if @gjsify/devtools-browser is, cdp if @gjsify/devtools-cdp is, else generic)`,type:`string`}).option(`globals`,{description:"Value for `gjsify build --globals` (default: auto)",type:`string`}).option(`out`,{description:`Output bundle path (default: node_modules/.cache/gjsify-debug)`,type:`string`}).option(`build-only`,{description:`Build the bridge bundle but do not launch it (for a .mcp.json command pointing at the bundle)`,type:`boolean`,default:!1}),handler:async n=>{let a=process.cwd(),S=readPackage$1(a),C=S.gjsify?.devtools??{},N=n.profile??C.profile??(hasDep(S,`@gjsify/storybook`)?`storybook`:hasDep(S,`@gjsify/devtools-browser`)?`browser`:hasDep(S,`@gjsify/devtools-cdp`)?`cdp`:`generic`),F=n.busName??C.busNameBase??(N===`storybook`?S.gjsify?.storybook?.applicationId??deriveStorybookAppId(S.name):N===`browser`||N===`cdp`?S.gjsify?.browse?.applicationId??deriveBrowserAppId$1(S.name):void 0);if(!F)return he.error(`gjsify debug: no bus name — set package.json#gjsify.devtools.busNameBase or pass --bus-name <org.example.App>`),process.exit(1);let I=n.globals??C.globals??`auto`,H=S.name?`${S.name}-devtools`:`gjsify-devtools`,W=ms(a,`node_modules`,`.cache`,`gjsify-debug`);mkdirSync(W,{recursive:!0});let K=ms(W,`entry.ts`),q=n.out?ds(a,n.out):ms(W,`bridge.gjs.mjs`);writeFileSync(K,generateEntry$1(N,F,H,`0.8.0`)),he.error(`[gjsify debug] profile=${N} bus=${F}`);let{runCli:Y}=await Promise.resolve().then(()=>(FI(),PI));if(await Y([`build`,K,`--app`,`gjs`,`--shebang`,`--globals`,I,`--outfile`,q]),n.buildOnly){he.error(`[gjsify debug] built ${q}`);return}let{runGjsBundle:X}=await Promise.resolve().then(()=>(fM(),dM));await X(q,[],{exitOnSuccess:!0})}}});function readPackage(n){try{return JSON.parse(readFileSync(ms(n,`package.json`),`utf8`))}catch{return{}}}function deriveBrowserAppId(n){return n?`org.gjsify.browser.${n.replace(/^@/,``).replace(/[^a-zA-Z0-9]+/g,`.`).replace(/^\.+|\.+$/g,``)}`:`org.gjsify.Browser`}function generateEntry(n,a,S,C,N){let F=S?`\n title: ${JSON.stringify(S)},`:``,I=a?`\n homeUrl: ${JSON.stringify(a)},`:``,H=C===void 0?``:`\n inspectorPort: ${C},`,W=N?`\n screenshot: ${JSON.stringify(N)},`:``;return`// Auto-generated by \`gjsify browse\` — do not edit by hand.
|
|
964
964
|
import { runBrowserDevtools } from '@gjsify/devtools-browser';
|
|
965
965
|
|
|
966
966
|
await runBrowserDevtools({
|
|
967
967
|
applicationId: ${JSON.stringify(n)},${F}${I}${H}${W}
|
|
968
968
|
});
|
|
969
|
-
`}var
|
|
969
|
+
`}var kI,AI=__esmMin(()=>{ge(),ul(),Ts(),kI={command:`browse [url]`,description:`Launch the Adwaita web browser, optionally pointed at a URL.`,builder:n=>n.positional(`url`,{description:`Initial URL to load (default: page:welcome)`,type:`string`}).option(`app-id`,{description:`GApplication id (default: gjsify.browse.applicationId or derived from the package name)`,type:`string`}).option(`title`,{description:`Window title`,type:`string`}).option(`globals`,{description:"Value for `gjsify build --globals` (default: auto,dom — WebKit/iframe need DOM globals)",type:`string`}).option(`out`,{description:`Output bundle path (default: node_modules/.cache/gjsify-browse)`,type:`string`}).option(`devtools`,{description:`Enable the MCP devtools control plane (sets GJSIFY_DEVTOOLS=1)`,type:`boolean`,default:!1}).option(`inspector-port`,{description:`Enable WebKit's remote inspector protocol on this port + the Cdp* methods (implies --devtools)`,type:`number`}).option(`screenshot`,{description:`One-shot: load the URL, capture a WebKit screenshot to this path, and exit (CI / quick captures).`,type:`string`}).option(`build-only`,{description:`Build the bundle but do not launch it`,type:`boolean`,default:!1}),handler:async n=>{let a=process.cwd(),S=readPackage(a),C=S.gjsify?.browse??{},N=n.appId??C.applicationId??deriveBrowserAppId(S.name),F=n.title??C.title,I=n.globals??C.globals??`auto,dom`,H=n.url,W=n.inspectorPort??C.inspectorPort,K=n.devtools||W!==void 0,q=ms(a,`node_modules`,`.cache`,`gjsify-browse`);mkdirSync(q,{recursive:!0});let Y=ms(q,`entry.ts`),X=n.out?ds(a,n.out):ms(q,`browse.gjs.mjs`);writeFileSync(Y,generateEntry(N,H,F,W,n.screenshot?ds(a,n.screenshot):void 0)),he.log(`[gjsify browse] app=${N}${H?` url=${H}`:``}${K?` devtools=1`:``}${W===void 0?``:` inspector-port=${W}`}`);let{runCli:te}=await Promise.resolve().then(()=>(FI(),PI));if(await te([`build`,Y,`--app`,`gjs`,`--globals`,I,`--outfile`,X]),n.buildOnly){he.log(`[gjsify browse] built ${X}`);return}K&&(process.env.GJSIFY_DEVTOOLS=`1`),W!==void 0&&(process.env.WEBKIT_INSPECTOR_HTTP_SERVER=`127.0.0.1:${W}`);let{runGjsBundle:ne}=await Promise.resolve().then(()=>(fM(),dM));await ne(X,[],{exitOnSuccess:!0})}}}),jI=__esmMin(()=>{sM(),mM(),yM(),xM(),OM(),NM(),GN(),eP(),rP(),oP(),lP(),zP(),HN(),KP(),tF(),iF(),lF(),EF(),OF(),jF(),NF(),zF(),HF(),GF(),JF(),XF(),QF(),eI(),nI(),cI(),pI(),hI(),wI(),EI(),OI(),AI()});function ensureGjsifyShimOnPath(){if(MI||!isGjs())return;MI=!0;let n=process.env.GJSIFY_SHIM_DIR;if(n&&existsSync(ms(n,`gjsify`))){(process.env.PATH??``).split(Cs).includes(n)||(process.env.PATH=n+Cs+(process.env.PATH??``));return}let a=fileURLToPath(import.meta.url),S=process.env.GJS_CONSOLE||`gjs`,C=mkdtempSync(ms(tmpdir(),`gjsify-shim-`)),N=ms(C,`gjsify`);writeFileSync(N,`#!/bin/sh\nexec "${S}" -m "${a}" "$@"\n`,{mode:493}),chmodSync(N,493),process.env.GJSIFY_SHIM_DIR=C,process.env.PATH=C+Cs+(process.env.PATH??``)}var MI,NI=__esmMin(()=>{ul(),am(),Ts(),nn(),bm(),MI=!1}),PI=__exportAll$4({runCli:()=>runCli});function runtimeLabel(){let n=gjsSystemVersion();if(n!==void 0){let a=Number(n);return`GJS ${Math.floor(a/1e4)}.${Math.floor(a%1e4/100)}.${a%100} (SpiderMonkey)`}return isBun()?`Bun ${globalThis.Bun?.version??process.versions.bun??``}`.trim():isDeno()?`Deno ${globalThis.Deno?.version?.deno??``}`.trim():isNode()?`Node.js ${process.version}`:`unknown runtime`}function readBundleVersion(){try{let n=_s(fileURLToPath(import.meta.url)),a=JSON.parse(readFileSync(ms(n,`..`,`package.json`),`utf8`));return typeof a.version==`string`?a.version:`unknown`}catch{return`unknown`}}async function runCli(n){ensureGjsifyShimOnPath();let a=df(n);await a.scriptName(pf).version(readBundleVersion()).strict().wrap(a.terminalWidth()).command($N.command,$N.description,$N.builder,$N.handler).command(WP.command,WP.description,WP.builder,WP.handler).command(oM.command,oM.description,oM.builder,oM.handler).command(pM.command,pM.description,pM.builder,pM.handler).command(vM.command,vM.description,vM.builder,vM.handler).command(VN.command,VN.description,VN.builder,VN.handler).command(bM.command,bM.description,bM.builder,bM.handler).command(DM.command,DM.description,DM.builder,DM.handler).command(MM.command,MM.description,MM.builder,MM.handler).command(WN.command,WN.description,WN.builder,WN.handler).command(nP.command,nP.description,nP.builder,nP.handler).command(aP.command,aP.description,aP.builder,aP.handler).command(cP.command,cP.description,cP.builder,cP.handler).command(RP.command,RP.description,RP.builder,RP.handler).command(eF.command,eF.description,eF.builder,eF.handler).command(rF.command,rF.description,rF.builder,rF.handler).command(oF.command,oF.description,oF.builder,oF.handler).command(TF.command,TF.description,TF.builder,TF.handler).command(DF.command,DF.description,DF.builder,DF.handler).command(AF.command,AF.description,AF.builder,AF.handler).command(MF.command,MF.description,MF.builder,MF.handler).command(RF.command,RF.description,RF.builder,RF.handler).command(VF.command,VF.description,VF.builder,VF.handler).command(WF.command,WF.description,WF.builder,WF.handler).command(qF.command,qF.description,qF.builder,qF.handler).command(YF.command,YF.description,YF.builder,YF.handler).command(aI.command,aI.description,aI.builder,aI.handler).command(ZF.command,ZF.description,ZF.builder,ZF.handler).command($F.command,$F.description,$F.builder,$F.handler).command(tI.command,tI.description,tI.builder,tI.handler).command(fI.command,fI.description,fI.builder,fI.handler).command(mI.command,mI.description,mI.builder,mI.handler).command(vI.command,vI.description,vI.builder,vI.handler).command(TI.command,TI.description,TI.builder,TI.handler).command(DI.command,DI.description,DI.builder,DI.handler).command(kI.command,kI.description,kI.builder,kI.handler).demandCommand(1).epilogue(`Running on ${runtimeLabel()}`).help().parseAsync()}var FI=__esmMin(()=>{ul(),Ts(),nn(),ff(),jI(),mf(),bm(),NI()});ge(),FI(),bm();try{await runCli(hideBin(process.argv))}catch(n){he.error(n instanceof Error?n.message:String(n)),process.env.GJSIFY_DEBUG&&n instanceof Error&&n.stack&&he.error(n.stack),process.exitCode=1,gjsExit(1)}
|