@gjsify/cli 0.7.0 → 0.7.2

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 CHANGED
@@ -738,7 +738,7 @@ var S=Object.getOwnPropertySymbols,C=Object.prototype.hasOwnProperty,N=Object.pr
738
738
  `),I=new Set;return{input:N,plugin:{name:`gjsify-virtual-entry`,async resolveId(n,a){return n.startsWith(C)?n:I.has(n)?{id:n,moduleSideEffects:`no-treeshake`}:null},async load(n){if(!n.startsWith(C))return null;let a=S.get(n);if(!a)return null;let N=(await this.resolve(a,void 0,{skipSelf:!0}))?.id??a;return I.add(N),{code:`${F}\nimport ${JSON.stringify(N)};\nexport * from ${JSON.stringify(N)};\n`,moduleSideEffects:`no-treeshake`}}}}}function flattenAliases$4(n){let a={};for(let[S,C]of Object.entries(n))C&&(a[S]=C);return a}function createGjsExternalsPredicate(n=[]){let a=[`cairo`,`gettext`,`system`,...n];return n=>isRegisterSubpath(n)?!1:!!(n.startsWith(`gi://`)||a.includes(n))}function isRegisterSubpath(n){return!!(/\/register(?:\/[^?]*)?$/.test(n)||/[/\\]register(?:[/\\][^/\\]+)?\.(?:[mc]?js|ts)$/.test(n))}var aA,setupForGjs,oA=__esmMin(()=>{fn(),ls(),Ub(),Wb(),YS(),Ck(),a_(),kv(),kk(),Nk(),eA(),iA(),aA=ts(fileURLToPath(import.meta.url)),setupForGjs=async n=>{let a=n.userExternal??[],S=[`cairo`,`gettext`,`system`,...a.filter(n=>!isRegisterSubpath(n))],C=createGjsExternalsPredicate(a),N=n.pluginOptions.format??`esm`,F=n.pluginOptions.exclude??[],I=await globToEntryPoints(n.input,F),H=resolveShim(`unicorn-magic`),W={...getAliasesForGjs({external:C}),"unicorn-magic":H,...n.pluginOptions.aliases,...n.userAliases},K=n.pluginOptions.consoleShim===!1?null:resolveShim(`console-gjs`),q=[];n.pluginOptions.autoGlobalsInject&&q.push(n.pluginOptions.autoGlobalsInject);let Y=wrapInputWithSideEffects(I,q),X={input:Y.input,platform:`neutral`,external:S,resolve:{mainFields:N===`esm`?[`browser`,`module`,`main`]:[`browser`,`main`,`module`],conditionNames:N===`esm`?[`browser`,`import`]:[`browser`,`require`,`import`]},transform:{target:`firefox140`,define:{global:`globalThis`,window:`globalThis`,"process.env.READABLE_STREAM":`"disable"`},...K?{inject:{console:[K,`console`]}}:{}},output:{...n.output,format:N,sourcemap:!1,codeSplitting:!1},treeshake:!0},te=getBundleDirFromOutput(n.output);return{options:X,plugins:[...Y.plugin?[Y.plugin]:[],inputShebangStripPlugin(),aliasPlugin({entries:{"random-access-file":`random-access-file/index.js`,...flattenAliases$4(W)}}),externalsPlugin(C,{name:`gjsify-gjs-externalize`}),blueprintPlugin(),deepkitPlugin({reflection:n.pluginOptions.reflection}),cssAsStringPlugin({targets:{firefox:60<<16}}),nodeModulesPathRewritePlugin({bundleDir:te,runtimeResolve:N===`esm`}),processStubPlugin({userBanner:n.userBanner,captureBundleUrl:N===`esm`}),(()=>{let a=resolveShebangLine(n.shebang);return shebangPlugin({enabled:a!==null,line:a??void 0})})()]}},__name$1(flattenAliases$4,`flattenAliases`)});function gjsImportsEmptyPlugin(){return{name:`gjsify-gjs-imports-empty`,resolveId:{order:`pre`,filter:{id:/^(@girs\/|gi:\/\/)/},handler(n){return/^(@girs\/|gi:\/\/)/.test(n)?{id:sA}:null}},load(n){return n===sA?{code:`export {}; export default {};`,moduleSideEffects:!1}:null}}}var sA,cA=__esmMin(()=>{sA=`\0gjsify-empty-gjs-import`});function flattenAliases$3(n){let a={};for(let[S,C]of Object.entries(n))C&&(a[S]=C);return a}var setupForNode,lA=__esmMin(()=>{Ub(),YS(),i_(),a_(),kv(),kk(),eA(),cA(),setupForNode=async n=>{let a=n.userExternal??[],S=[...Jg,`node-datachannel`,...a],external=n=>!!S.includes(n),C=n.pluginOptions.format??`esm`,N=n.pluginOptions.exclude??[],F=await globToEntryPoints(n.input,N),I={...getAliasesForNode({external}),...n.pluginOptions.aliases,...n.userAliases},H=getBundleDirFromOutput(n.output);return{options:{input:F,platform:`node`,external:S,resolve:{mainFields:C===`esm`?[`module`,`main`,`browser`]:[`main`,`module`,`browser`],conditionNames:C===`esm`?[`require`,`node`,`module`]:[`require`]},transform:{target:`node24`,define:{global:`globalThis`,window:`globalThis`}},output:{...n.output,format:C,sourcemap:!1,banner:void 0,codeSplitting:!1},treeshake:!0},plugins:[gjsImportsEmptyPlugin(),aliasPlugin({entries:flattenAliases$3(I)}),deepkitPlugin({reflection:n.pluginOptions.reflection}),cssAsStringPlugin(),nodeModulesPathRewritePlugin({bundleDir:H})]}},__name$1(flattenAliases$3,`flattenAliases`)});function flattenAliases$2(n){let a={};for(let[S,C]of Object.entries(n))C&&(a[S]=C);return a}var setupForBrowser,uA=__esmMin(()=>{Ub(),YS(),Ck(),i_(),kv(),cA(),eA(),setupForBrowser=async n=>{let a=[...n.userExternal??[]],S=n.pluginOptions.exclude??[],C=await globToEntryPoints(n.input,S),N={};for(let[n,a]of Object.entries(Qg))N[n]=a,N[`node:${n}`]=a;let F={},I={...getDerivedAliasesSync(`browser`),...N,...F,...n.pluginOptions.aliases,...n.userAliases};return{options:{input:C,platform:`browser`,external:a,resolve:{mainFields:[`browser`,`module`,`main`],conditionNames:[`import`,`browser`]},transform:{target:`esnext`,define:{global:`globalThis`,window:`globalThis`}},output:{...n.output,format:`esm`,sourcemap:!1,codeSplitting:!1},treeshake:!0},plugins:[gjsImportsEmptyPlugin(),aliasPlugin({entries:flattenAliases$2(I)}),blueprintPlugin(),deepkitPlugin({reflection:n.pluginOptions.reflection}),cssAsStringPlugin()]}},__name$1(flattenAliases$2,`flattenAliases`)});function isPlatform(n){return dA.includes(n)}function platformResolvePlugin(n={}){let a=n.platform,S=a?[a,`native`]:[`native`];return{name:`gjsify-nativescript-platform-resolve`,resolveId:{order:`pre`,async handler(n,a,C){if(!a||!n.startsWith(`./`)&&!n.startsWith(`../`))return null;let N=fA.exec(n),F=N?N[0]:``,I=F?n.slice(0,-F.length):n;for(let N of S){let S=F&&`${I}.${N}`!=`${I}.${N}${F}`?[`${I}.${N}`,`${I}.${N}${F}`]:[`${I}.${N}`];for(let N of S){if(N===n)continue;let S=await this.resolve(N,a,{skipSelf:!0,...C?.kind?{kind:C.kind}:{}});if(S&&!S.external)return S}}return null}}}}function detectNativescriptPlatform(n=process.env){let a=n.NATIVESCRIPT_PLATFORM??n.NS_PLATFORM;if(a&&isPlatform(a))return a;let S=n.NATIVESCRIPT_BUNDLER_ENV??n.NATIVESCRIPT_WEBPACK_ENV;if(S)try{let n=JSON.parse(S);if(n.android===!0)return`android`;if(n.ios===!0)return`ios`;if(n.visionos===!0)return`visionos`;if(typeof n.platform==`string`&&isPlatform(n.platform))return n.platform}catch{}}function nativescriptPlatformDefines(n,a={}){let S=n===`android`,C=n===`ios`,N=n===`visionos`;return{__ANDROID__:String(S),__IOS__:String(C),__VISIONOS__:String(N),__APPLE__:String(C||N),__DEV__:String(a.dev??!1)}}var dA,fA,pA=__esmMin(()=>{dA=[`android`,`ios`,`visionos`],fA=/\.(tsx?|jsx?|mts|cts|mjs|cjs)$/});function flattenAliases$1(n){let a={};for(let[S,C]of Object.entries(n))C&&(a[S]=C);return a}var setupForNativescript,mA=__esmMin(()=>{Ub(),YS(),i_(),kv(),cA(),pA(),setupForNativescript=async n=>{let a=[...n.userExternal??[]],S=n.pluginOptions.exclude??[],C=await globToEntryPoints(n.input,S),N=detectNativescriptPlatform(),F={};for(let[n,a]of Object.entries($g))F[n]=a,F[`node:${n}`]=a;let I={},H={...getDerivedAliasesSync(`nativescript`),...F,...I,...n.pluginOptions.aliases,...n.userAliases};return{options:{input:C,platform:`browser`,external:a,resolve:{mainFields:[`nativescript`,`module`,`main`],conditionNames:[`import`,`nativescript`]},transform:{target:`esnext`,define:{global:`globalThis`,...nativescriptPlatformDefines(N,{dev:!1})}},output:{...n.output,format:`esm`,sourcemap:!1,codeSplitting:!1},treeshake:!0},plugins:[gjsImportsEmptyPlugin(),platformResolvePlugin({platform:N}),aliasPlugin({entries:flattenAliases$1(H)}),deepkitPlugin({reflection:n.pluginOptions.reflection})]}},__name$1(flattenAliases$1,`flattenAliases`)}),hA=__esmMin(()=>{oA(),lA(),uA(),mA()});function isExternalSpecifier(n){return!(n.startsWith(`./`)||n.startsWith(`../`)||n.startsWith(`/`)||n.startsWith(`\0`)||n.startsWith(`data:`))}function computeCommonRoot(n){let a=n===void 0?[]:typeof n==`string`?[n]:Array.isArray(n)?n:Object.values(n);if(a.length===0)return`src`;let S=a.map(n=>n.split(`/`).filter(Boolean)),C=S[0],N=0;for(;N<C.length;N++){let n=C[N];if(!S.every(a=>a[N]===n))break}if(N===0)return`src`;let F=C.slice(0,N);return S.some(n=>n.length>N)?F.join(`/`):F.slice(0,-1).join(`/`)||`src`}function flattenAliases(n){let a={};for(let[S,C]of Object.entries(n))C&&(a[S]=C);return a}var setupLib,gA=__esmMin(()=>{Ub(),eA(),Wb(),kv(),setupLib=async n=>{let a=n.pluginOptions.format??n.pluginOptions.library??`esm`,S=n.pluginOptions.exclude??[],C=await globToEntryPoints(n.input,S),N=computeCommonRoot(C),F={...n.pluginOptions.aliases,...n.userAliases};return{options:{input:C,platform:`neutral`,resolve:{mainFields:a===`esm`?[`module`,`main`]:[`main`],conditionNames:a===`esm`?[`module`,`import`]:[`require`]},transform:{target:`esnext`},output:{...n.output,format:a,preserveModules:!0,preserveModulesRoot:N,sourcemap:!1},treeshake:!1},plugins:[aliasPlugin({entries:flattenAliases(F)}),externalsPlugin(isExternalSpecifier,{name:`gjsify-lib-externalize`}),cssAsStringPlugin()]}}}),_A=__esmMin(()=>{gA()});function mimeForExtension(n){return vA[n.toLowerCase()]??`application/octet-stream`}function textLoaderPlugin(n={}){let a=n.loaders??{},S=Object.entries(a),C=S.filter(([,n])=>n===`text`).map(([n])=>n),N=S.filter(([,n])=>n===`dataurl`).map(([n])=>n),F=[...C,...N];if(F.length===0)return null;let I=F.map(n=>n.replace(/^\./,``).replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)),H=RegExp(`\\.(?:${I.join(`|`)})$`),W=new Map(S.map(([n,a])=>[n.toLowerCase(),a]));return{name:`gjsify-asset-loader`,async load(n){if(!H.test(n))return null;let a=n.lastIndexOf(`.`),S=a>=0?n.slice(a).toLowerCase():``;if((W.get(S)??`text`)===`dataurl`){let a=await readFile$1(n),C=mimeForExtension(S),N=a.toString(`base64`);return{code:`export default ${JSON.stringify(`data:${C};base64,${N}`)};`,moduleType:`js`}}let C=await readFile$1(n,`utf8`);return{code:`export default ${JSON.stringify(C)};`,moduleType:`js`}}}}var vA,yA=__esmMin(()=>{Tc(),vA={".png":`image/png`,".jpg":`image/jpeg`,".jpeg":`image/jpeg`,".gif":`image/gif`,".webp":`image/webp`,".svg":`image/svg+xml`,".ico":`image/x-icon`,".avif":`image/avif`,".bmp":`image/bmp`,".tiff":`image/tiff`,".tif":`image/tiff`,".wasm":`application/wasm`}}),gjsifyPlugin,bA=__esmMin(()=>{hA(),_A(),gjsifyPlugin=async(n,a={})=>{if(a.library)switch(a.library){case`esm`:case`cjs`:return await setupLib({input:n.input,output:n.output,userAliases:n.userAliases,pluginOptions:a});default:throw TypeError(`Unknown library type: `+a.library)}let S=a.app??`gjs`;switch(S){case`gjs`:return await setupForGjs({input:n.input,output:n.output,userExternal:n.userExternal,userBanner:n.userBanner,userAliases:n.userAliases,shebang:n.shebang,pluginOptions:a});case`node`:return await setupForNode({input:n.input,output:n.output,userExternal:n.userExternal,userAliases:n.userAliases,pluginOptions:a});case`browser`:return await setupForBrowser({input:n.input,output:n.output,userExternal:n.userExternal,userAliases:n.userAliases,pluginOptions:a});case`nativescript`:return await setupForNativescript({input:n.input,output:n.output,userExternal:n.userExternal,userAliases:n.userAliases,pluginOptions:a});default:throw TypeError(`Unknown app platform: `+S)}}}),xA=__esmMin(()=>{Hg(),Hb(),hA(),_A(),kk(),Nk(),eA(),yA(),iA(),cA(),Wb(),pA(),bA(),bA(),i_()});function isPluginByName(n){return typeof n==`object`&&!!n&&typeof n.name==`string`&&!(`apply`in n)&&!(`resolveId`in n)&&!(`load`in n)&&!(`transform`in n)&&!(`renderChunk`in n)&&!(`generateBundle`in n)}async function resolveUserPlugins(n,a){let S=createRequire(Qo(a,`package.json`)),C=[];for(let N of n){if(!isPluginByName(N)){C.push(N);continue}let n;try{n=S.resolve(N.name)}catch(n){throw Error(`gjsify config: failed to resolve plugin "${N.name}" from ${a}. Add it to your project's dependencies, or pass a Plugin object directly. (${n.message})`)}let F=await import(pathToFileURL(n).href),I=N.export??`default`,H=F[I];if(typeof H!=`function`){let n=Object.keys(F).filter(n=>typeof F[n]==`function`);throw Error(`gjsify config: plugin "${N.name}" has no function export "${I}". Available function exports: ${n.length?n.join(`, `):`(none)`}.`)}let W=await H(N.options);if(W==null)throw Error(`gjsify config: plugin "${N.name}" factory returned ${W}. Check the plugin's signature — it should return a Rolldown/Vite plugin object.`);C.push(W)}return C}var SA=__esmMin(()=>{zo(),ls(),fn()}),CA,wA=__esmMin(()=>{CA={"@gjsify/buffer/register":[`AbortController`,`AbortSignal`,`Blob`,`Buffer`,`ByteLengthQueuingStrategy`,`CountQueuingStrategy`,`DOMException`,`File`,`ReadableStream`,`TextDecoderStream`,`TextEncoderStream`,`TransformStream`,`WritableStream`,`atob`,`btoa`,`clearTimeout`,`performance`,`process`,`queueMicrotask`,`setTimeout`,`structuredClone`],"@gjsify/dom-elements/register/canvas":[`AbortController`,`AbortSignal`,`Blob`,`Buffer`,`ByteLengthQueuingStrategy`,`CountQueuingStrategy`,`DOMException`,`File`,`HTMLCanvasElement`,`ReadableStream`,`TextDecoderStream`,`TextEncoderStream`,`TransformStream`,`WritableStream`,`atob`,`btoa`,`clearTimeout`,`document`,`performance`,`process`,`queueMicrotask`,`setTimeout`,`structuredClone`],"@gjsify/dom-elements/register/document":[`AbortController`,`AbortSignal`,`Blob`,`Buffer`,`ByteLengthQueuingStrategy`,`CountQueuingStrategy`,`DOMException`,`File`,`HTMLCanvasElement`,`ReadableStream`,`TextDecoderStream`,`TextEncoderStream`,`TransformStream`,`WritableStream`,`atob`,`btoa`,`clearTimeout`,`document`,`performance`,`process`,`queueMicrotask`,`setTimeout`,`structuredClone`],"@gjsify/dom-elements/register/font-face":[`AbortController`,`AbortSignal`,`Blob`,`Buffer`,`ByteLengthQueuingStrategy`,`CountQueuingStrategy`,`DOMException`,`File`,`ReadableStream`,`TextDecoderStream`,`TextEncoderStream`,`TransformStream`,`WritableStream`,`atob`,`btoa`,`performance`,`process`,`queueMicrotask`,`setTimeout`,`structuredClone`],"@gjsify/dom-elements/register/image":[`AbortController`,`AbortSignal`,`Blob`,`Buffer`,`ByteLengthQueuingStrategy`,`CountQueuingStrategy`,`DOMException`,`File`,`HTMLCanvasElement`,`ReadableStream`,`TextDecoderStream`,`TextEncoderStream`,`TransformStream`,`WritableStream`,`atob`,`btoa`,`document`,`performance`,`process`,`queueMicrotask`,`setTimeout`,`structuredClone`],"@gjsify/dom-elements/register/location":[`AbortController`,`AbortSignal`,`Blob`,`Buffer`,`ByteLengthQueuingStrategy`,`CountQueuingStrategy`,`DOMException`,`File`,`ReadableStream`,`TextDecoderStream`,`TextEncoderStream`,`TransformStream`,`WritableStream`,`atob`,`btoa`,`performance`,`process`,`queueMicrotask`,`setTimeout`,`structuredClone`],"@gjsify/dom-elements/register/match-media":[`AbortController`,`AbortSignal`,`Blob`,`Buffer`,`ByteLengthQueuingStrategy`,`CountQueuingStrategy`,`DOMException`,`File`,`ReadableStream`,`TextDecoderStream`,`TextEncoderStream`,`TransformStream`,`WritableStream`,`atob`,`btoa`,`performance`,`process`,`queueMicrotask`,`setTimeout`,`structuredClone`],"@gjsify/dom-elements/register/navigator":[`AbortController`,`AbortSignal`,`Blob`,`Buffer`,`ByteLengthQueuingStrategy`,`CountQueuingStrategy`,`DOMException`,`File`,`ReadableStream`,`TextDecoderStream`,`TextEncoderStream`,`TransformStream`,`WritableStream`,`atob`,`btoa`,`navigator`,`performance`,`process`,`queueMicrotask`,`setTimeout`,`structuredClone`],"@gjsify/dom-elements/register/observers":[`AbortController`,`AbortSignal`,`Blob`,`Buffer`,`ByteLengthQueuingStrategy`,`CountQueuingStrategy`,`DOMException`,`File`,`ReadableStream`,`TextDecoderStream`,`TextEncoderStream`,`TransformStream`,`WritableStream`,`atob`,`btoa`,`performance`,`process`,`queueMicrotask`,`setTimeout`,`structuredClone`],"@gjsify/domparser/register":[`AbortController`,`AbortSignal`,`Blob`,`Buffer`,`ByteLengthQueuingStrategy`,`CountQueuingStrategy`,`DOMException`,`File`,`ReadableStream`,`TextDecoderStream`,`TextEncoderStream`,`TransformStream`,`WritableStream`,`atob`,`btoa`,`performance`,`process`,`queueMicrotask`,`setTimeout`,`structuredClone`],"@gjsify/gamepad/register":[`AbortController`,`AbortSignal`,`Blob`,`Buffer`,`ByteLengthQueuingStrategy`,`CountQueuingStrategy`,`DOMException`,`File`,`ReadableStream`,`TextDecoderStream`,`TextEncoderStream`,`TransformStream`,`WritableStream`,`atob`,`btoa`,`performance`,`process`,`queueMicrotask`,`setTimeout`,`structuredClone`],"@gjsify/node-globals/register/buffer":[`AbortController`,`AbortSignal`,`Blob`,`Buffer`,`ByteLengthQueuingStrategy`,`CountQueuingStrategy`,`DOMException`,`File`,`ReadableStream`,`TextDecoderStream`,`TextEncoderStream`,`TransformStream`,`WritableStream`,`atob`,`btoa`,`clearTimeout`,`performance`,`process`,`queueMicrotask`,`setTimeout`,`structuredClone`],"@gjsify/node-globals/register/encoding":[`AbortController`,`AbortSignal`,`Blob`,`Buffer`,`ByteLengthQueuingStrategy`,`CountQueuingStrategy`,`DOMException`,`File`,`ReadableStream`,`TextDecoderStream`,`TextEncoderStream`,`TransformStream`,`WritableStream`,`atob`,`btoa`,`performance`,`process`,`queueMicrotask`,`setTimeout`,`structuredClone`],"@gjsify/node-globals/register/microtask":[`AbortController`,`AbortSignal`,`Blob`,`Buffer`,`ByteLengthQueuingStrategy`,`CountQueuingStrategy`,`DOMException`,`File`,`ReadableStream`,`TextDecoderStream`,`TextEncoderStream`,`TransformStream`,`WritableStream`,`atob`,`btoa`,`performance`,`process`,`queueMicrotask`,`setTimeout`,`structuredClone`],"@gjsify/node-globals/register/process":[`AbortController`,`AbortSignal`,`Blob`,`Buffer`,`ByteLengthQueuingStrategy`,`CountQueuingStrategy`,`DOMException`,`File`,`ReadableStream`,`TextDecoderStream`,`TextEncoderStream`,`TransformStream`,`WritableStream`,`atob`,`btoa`,`clearTimeout`,`performance`,`process`,`queueMicrotask`,`setTimeout`,`structuredClone`],"@gjsify/node-globals/register/structured-clone":[`AbortController`,`AbortSignal`,`Blob`,`Buffer`,`ByteLengthQueuingStrategy`,`CountQueuingStrategy`,`DOMException`,`File`,`ReadableStream`,`TextDecoderStream`,`TextEncoderStream`,`TransformStream`,`WritableStream`,`atob`,`btoa`,`performance`,`process`,`queueMicrotask`,`setTimeout`,`structuredClone`],"@gjsify/node-globals/register/timers":[`AbortController`,`AbortSignal`,`Blob`,`Buffer`,`ByteLengthQueuingStrategy`,`CountQueuingStrategy`,`DOMException`,`File`,`ReadableStream`,`TextDecoderStream`,`TextEncoderStream`,`TransformStream`,`WritableStream`,`atob`,`btoa`,`clearTimeout`,`performance`,`process`,`queueMicrotask`,`setTimeout`,`structuredClone`],"@gjsify/node-globals/register/url":[`AbortController`,`AbortSignal`,`Blob`,`Buffer`,`ByteLengthQueuingStrategy`,`CountQueuingStrategy`,`DOMException`,`File`,`ReadableStream`,`TextDecoderStream`,`TextEncoderStream`,`TransformStream`,`URL`,`URLSearchParams`,`WritableStream`,`atob`,`btoa`,`performance`,`process`,`queueMicrotask`,`setTimeout`,`structuredClone`],"@gjsify/web-globals/register/formdata":[`AbortController`,`AbortSignal`,`Blob`,`Buffer`,`ByteLengthQueuingStrategy`,`CountQueuingStrategy`,`DOMException`,`File`,`FormData`,`ReadableStream`,`TextDecoderStream`,`TextEncoderStream`,`TransformStream`,`WritableStream`,`atob`,`btoa`,`clearTimeout`,`performance`,`process`,`queueMicrotask`,`setTimeout`,`structuredClone`],"@gjsify/web-globals/register/performance":[`AbortController`,`AbortSignal`,`Blob`,`Buffer`,`ByteLengthQueuingStrategy`,`CountQueuingStrategy`,`DOMException`,`File`,`ReadableStream`,`TextDecoderStream`,`TextEncoderStream`,`TransformStream`,`WritableStream`,`atob`,`btoa`,`performance`,`process`,`queueMicrotask`,`setTimeout`,`structuredClone`],"@gjsify/webaudio/register":[`AbortController`,`AbortSignal`,`Blob`,`Buffer`,`ByteLengthQueuingStrategy`,`CountQueuingStrategy`,`DOMException`,`File`,`ReadableStream`,`TextDecoderStream`,`TextEncoderStream`,`TransformStream`,`WritableStream`,`atob`,`btoa`,`performance`,`process`,`queueMicrotask`,`setTimeout`,`structuredClone`],"@gjsify/webrtc/register/data-channel":[`AbortController`,`AbortSignal`,`Blob`,`Buffer`,`ByteLengthQueuingStrategy`,`CountQueuingStrategy`,`DOMException`,`Event`,`EventTarget`,`File`,`MessageEvent`,`ReadableStream`,`TextDecoderStream`,`TextEncoderStream`,`TransformStream`,`WritableStream`,`atob`,`btoa`,`clearTimeout`,`performance`,`process`,`queueMicrotask`,`setTimeout`,`structuredClone`],"@gjsify/webrtc/register/error":[`AbortController`,`AbortSignal`,`Blob`,`Buffer`,`ByteLengthQueuingStrategy`,`CountQueuingStrategy`,`DOMException`,`Event`,`File`,`ReadableStream`,`TextDecoderStream`,`TextEncoderStream`,`TransformStream`,`WritableStream`,`atob`,`btoa`,`performance`,`process`,`queueMicrotask`,`setTimeout`,`structuredClone`],"@gjsify/webrtc/register/media":[`AbortController`,`AbortSignal`,`Blob`,`Buffer`,`ByteLengthQueuingStrategy`,`CountQueuingStrategy`,`DOMException`,`Event`,`EventTarget`,`File`,`MediaStream`,`MediaStreamTrack`,`ReadableStream`,`TextDecoderStream`,`TextEncoderStream`,`TransformStream`,`WritableStream`,`atob`,`btoa`,`performance`,`process`,`queueMicrotask`,`setTimeout`,`structuredClone`],"@gjsify/webrtc/register/media-devices":[`AbortController`,`AbortSignal`,`Blob`,`Buffer`,`ByteLengthQueuingStrategy`,`CountQueuingStrategy`,`DOMException`,`Event`,`EventTarget`,`File`,`MediaStream`,`MediaStreamTrack`,`ReadableStream`,`TextDecoderStream`,`TextEncoderStream`,`TransformStream`,`WritableStream`,`atob`,`btoa`,`performance`,`process`,`queueMicrotask`,`setTimeout`,`structuredClone`],"@gjsify/webrtc/register/peer-connection":`AbortController.AbortSignal.Blob.Buffer.ByteLengthQueuingStrategy.CountQueuingStrategy.DOMException.Event.EventTarget.File.MediaStream.MediaStreamTrack.MessageEvent.RTCSessionDescription.ReadableStream.TextDecoderStream.TextEncoderStream.TransformStream.WritableStream.atob.btoa.clearTimeout.performance.process.queueMicrotask.setTimeout.structuredClone`.split(`.`),"abort-controller/register":[`AbortController`,`AbortSignal`,`Blob`,`Buffer`,`ByteLengthQueuingStrategy`,`CountQueuingStrategy`,`DOMException`,`File`,`ReadableStream`,`TextDecoderStream`,`TextEncoderStream`,`TransformStream`,`WritableStream`,`atob`,`btoa`,`clearTimeout`,`performance`,`process`,`queueMicrotask`,`setTimeout`,`structuredClone`],"compression-streams/register":[`AbortController`,`AbortSignal`,`Blob`,`Buffer`,`ByteLengthQueuingStrategy`,`CompressionStream`,`CountQueuingStrategy`,`DOMException`,`DecompressionStream`,`File`,`ReadableStream`,`TextDecoderStream`,`TextEncoderStream`,`TransformStream`,`WritableStream`,`atob`,`btoa`,`clearTimeout`,`performance`,`process`,`queueMicrotask`,`setTimeout`,`structuredClone`],"dom-events/register/custom-events":[`AbortController`,`AbortSignal`,`Blob`,`Buffer`,`ByteLengthQueuingStrategy`,`CountQueuingStrategy`,`DOMException`,`File`,`ReadableStream`,`TextDecoderStream`,`TextEncoderStream`,`TransformStream`,`WritableStream`,`atob`,`btoa`,`performance`,`process`,`queueMicrotask`,`setTimeout`,`structuredClone`],"dom-events/register/event-target":[`AbortController`,`AbortSignal`,`Blob`,`Buffer`,`ByteLengthQueuingStrategy`,`CountQueuingStrategy`,`DOMException`,`File`,`ReadableStream`,`TextDecoderStream`,`TextEncoderStream`,`TransformStream`,`WritableStream`,`atob`,`btoa`,`performance`,`process`,`queueMicrotask`,`setTimeout`,`structuredClone`],"dom-events/register/ui-events":[`AbortController`,`AbortSignal`,`Blob`,`Buffer`,`ByteLengthQueuingStrategy`,`CountQueuingStrategy`,`DOMException`,`File`,`ReadableStream`,`TextDecoderStream`,`TextEncoderStream`,`TransformStream`,`WritableStream`,`atob`,`btoa`,`performance`,`process`,`queueMicrotask`,`setTimeout`,`structuredClone`],"dom-exception/register":[`AbortController`,`AbortSignal`,`Blob`,`Buffer`,`ByteLengthQueuingStrategy`,`CountQueuingStrategy`,`DOMException`,`File`,`ReadableStream`,`TextDecoderStream`,`TextEncoderStream`,`TransformStream`,`WritableStream`,`atob`,`btoa`,`performance`,`process`,`queueMicrotask`,`setTimeout`,`structuredClone`],"eventsource/register":`AbortController.AbortSignal.Blob.Buffer.ByteLengthQueuingStrategy.CompressionStream.CountQueuingStrategy.DOMException.DecompressionStream.Event.EventSource.EventTarget.File.Headers.MessageEvent.ReadableStream.Request.Response.TextDecoderStream.TextEncoderStream.TransformStream.URL.URLSearchParams.WritableStream.atob.btoa.clearTimeout.fetch.performance.process.queueMicrotask.setTimeout.structuredClone`.split(`.`),"fetch/register/fetch":`AbortController.AbortSignal.Blob.Buffer.ByteLengthQueuingStrategy.CompressionStream.CountQueuingStrategy.DOMException.DecompressionStream.File.Headers.ReadableStream.Request.Response.TextDecoderStream.TextEncoderStream.TransformStream.URL.URLSearchParams.WritableStream.atob.btoa.clearTimeout.fetch.performance.process.queueMicrotask.setTimeout.structuredClone`.split(`.`),"fetch/register/xhr":`AbortController.AbortSignal.Blob.Buffer.ByteLengthQueuingStrategy.CompressionStream.CountQueuingStrategy.DOMException.DecompressionStream.Event.EventTarget.File.Headers.ProgressEvent.ReadableStream.Request.Response.TextDecoderStream.TextEncoderStream.TransformStream.URL.URLSearchParams.WritableStream.XMLHttpRequest.XMLHttpRequestUpload.atob.btoa.clearTimeout.fetch.performance.process.queueMicrotask.setTimeout.structuredClone`.split(`.`),"message-channel/register":[`AbortController`,`AbortSignal`,`Blob`,`Buffer`,`ByteLengthQueuingStrategy`,`CountQueuingStrategy`,`DOMException`,`File`,`MessageChannel`,`MessagePort`,`ReadableStream`,`TextDecoderStream`,`TextEncoderStream`,`TransformStream`,`WritableStream`,`atob`,`btoa`,`performance`,`process`,`queueMicrotask`,`setTimeout`,`structuredClone`],"web-streams/register/queuing":[`AbortController`,`AbortSignal`,`Blob`,`Buffer`,`ByteLengthQueuingStrategy`,`CountQueuingStrategy`,`DOMException`,`File`,`ReadableStream`,`TextDecoderStream`,`TextEncoderStream`,`TransformStream`,`WritableStream`,`atob`,`btoa`,`clearTimeout`,`performance`,`process`,`queueMicrotask`,`setTimeout`,`structuredClone`],"web-streams/register/readable":[`AbortController`,`AbortSignal`,`Blob`,`Buffer`,`ByteLengthQueuingStrategy`,`CountQueuingStrategy`,`DOMException`,`File`,`ReadableStream`,`TextDecoderStream`,`TextEncoderStream`,`TransformStream`,`WritableStream`,`atob`,`btoa`,`clearTimeout`,`performance`,`process`,`queueMicrotask`,`setTimeout`,`structuredClone`],"web-streams/register/text-streams":[`AbortController`,`AbortSignal`,`Blob`,`Buffer`,`ByteLengthQueuingStrategy`,`CountQueuingStrategy`,`DOMException`,`File`,`ReadableStream`,`TextDecoderStream`,`TextEncoderStream`,`TransformStream`,`WritableStream`,`atob`,`btoa`,`clearTimeout`,`performance`,`process`,`queueMicrotask`,`setTimeout`,`structuredClone`],"web-streams/register/transform":[`AbortController`,`AbortSignal`,`Blob`,`Buffer`,`ByteLengthQueuingStrategy`,`CountQueuingStrategy`,`DOMException`,`File`,`ReadableStream`,`TextDecoderStream`,`TextEncoderStream`,`TransformStream`,`WritableStream`,`atob`,`btoa`,`clearTimeout`,`performance`,`process`,`queueMicrotask`,`setTimeout`,`structuredClone`],"web-streams/register/writable":[`AbortController`,`AbortSignal`,`Blob`,`Buffer`,`ByteLengthQueuingStrategy`,`CountQueuingStrategy`,`DOMException`,`File`,`ReadableStream`,`TextDecoderStream`,`TextEncoderStream`,`TransformStream`,`WritableStream`,`atob`,`btoa`,`clearTimeout`,`performance`,`process`,`queueMicrotask`,`setTimeout`,`structuredClone`],"webassembly/register/promise":[`AbortController`,`AbortSignal`,`Blob`,`Buffer`,`ByteLengthQueuingStrategy`,`CountQueuingStrategy`,`DOMException`,`File`,`ReadableStream`,`TextDecoderStream`,`TextEncoderStream`,`TransformStream`,`WebAssembly`,`WritableStream`,`atob`,`btoa`,`performance`,`process`,`queueMicrotask`,`setTimeout`,`structuredClone`],"webcrypto/register":[`AbortController`,`AbortSignal`,`Blob`,`Buffer`,`ByteLengthQueuingStrategy`,`CountQueuingStrategy`,`DOMException`,`File`,`ReadableStream`,`TextDecoderStream`,`TextEncoderStream`,`TransformStream`,`WritableStream`,`atob`,`btoa`,`clearTimeout`,`crypto`,`performance`,`process`,`queueMicrotask`,`setTimeout`,`structuredClone`],"websocket/register":[`AbortController`,`AbortSignal`,`Blob`,`Buffer`,`ByteLengthQueuingStrategy`,`CountQueuingStrategy`,`DOMException`,`File`,`ReadableStream`,`TextDecoderStream`,`TextEncoderStream`,`TransformStream`,`WritableStream`,`atob`,`btoa`,`clearTimeout`,`performance`,`process`,`queueMicrotask`,`setTimeout`,`structuredClone`]}});function expandWithClosure(n,a){let S=new Set(n),C=[...n];for(;C.length>0;){let n=TA[C.pop()];if(!n)continue;let N=EA[n];if(N)for(let n of N)a.has(n)||TA[n]&&(S.has(n)||(S.add(n),C.push(n)))}return S}function isSubset(n,a){for(let S of n)if(!a.has(S))return!1;return!0}async function applyExcludeGlobals(n,a,S,C,N){if(!C?.length)return{detected:n,injectPath:a};for(let a of C)n.delete(a);let F=detectedToRegisterPaths(n);for(let n of S)F.add(n);return N&&(F=filterResolvableRegisterPaths(F,N)),{detected:n,injectPath:F.size>0?await writeRegisterInjectFile(F,N)??void 0:void 0}}function detectedToRegisterPaths(n){let a=new Set;for(let S of n){let n=TA[S];n&&a.add(n)}return a}function isFullConfig(n){return typeof n==`object`&&!!n&&!Array.isArray(n)&&`plugins`in n&&`options`in n}async function detectAutoGlobals(n,a,S,C,N={},F=defaultBundler){let I=N.extraGlobalsList?resolveGlobalsList(N.extraGlobalsList):new Set,H=new Set(N.excludeGlobals??[]),W=N.cwd,K=new Set,q;I.size>0&&(q=await writeRegisterInjectFile(W?filterResolvableRegisterPaths(I,W):I,W)??void 0);let Y=(n.plugins??[]).filter(n=>{let a=n&&typeof n==`object`&&`name`in n?n.name:void 0;return a!==`gjsify`&&a!==`gjsify-orchestrator`});for(let X=1;X<=DA;X++){let te=await S({...a,autoGlobalsInject:q}),ne,re;isFullConfig(te)?(re=te.options,ne=te.plugins):ne=te;let ie=q?appendInjectAsEntry(n.input,q):n.input,ae=n.resolve??re?.resolve,oe=n.external??re?.external,Z=n.transform??re?.transform,se=re?.treeshake,ce=Array.isArray(ne)?ne:[ne],le=await F({rolldownInput:{input:ie,external:oe,resolve:ae,transform:Z,plugins:[...Y,...ce],logLevel:`silent`,...se===void 0?{}:{treeshake:se}},format:n.format??`esm`});if(le.length===0)return{detected:new Set,injectPath:q};let ue=new Set;for(let n=0;n<le.length;n++){let a=le[n]??``;try{for(let n of detectFreeGlobals(a))ue.add(n)}catch(S){if(globalThis.process?.env?.GJSIFY_DEBUG_AUTO_GLOBALS){let S=`/tmp/gjsify-auto-globals-failed-chunk-${n}.mjs`;try{(await Promise.resolve().then(()=>(Jc(),Gc))).writeFileSync(S,a),ke.error(`[gjsify-auto-globals] parse failed on chunk #${n} — wrote ${S} for inspection`)}catch{}}throw S}}if(H.size>0)for(let n of H)ue.delete(n);if(isSubset(ue,K)){if(C){let n=[...K].sort(),a=I.size>0?` (+ ${I.size} extra register module(s))`:``;ke.debug(`[gjsify] --globals auto: converged after ${X-1} iteration(s), ${K.size} global(s)${n.length?`: `+n.join(`, `):``}${a}`)}return applyExcludeGlobals(K,q,I,N.excludeGlobals,W)}let de=N.disableClosureExpansion?ue:expandWithClosure(ue,H);C&&de.size>ue.size&&ke.debug(`[gjsify] --globals auto: closure map expanded ${ue.size} → ${de.size} global(s)`),X>1&&C&&ke.debug("[gjsify] --globals auto: detection grew past the closure-map expansion — the committed register-globals-closure map looks stale. Regenerate via `node packages/infra/cli/scripts/generate-register-closure.mjs`."),K=new Set([...K,...de]);let fe=detectedToRegisterPaths(K);for(let n of I)fe.add(n);if(W&&(fe=filterResolvableRegisterPaths(fe,W)),fe.size===0)return{detected:K,injectPath:void 0};if(q=await writeRegisterInjectFile(fe,W)??void 0,C){let n=[...K].sort();ke.debug(`[gjsify] --globals auto: iteration ${X}, ${K.size} global(s)${n.length?`: `+n.join(`, `):``}`)}}return C&&ke.debug(`[gjsify] --globals auto: hit max iterations (${DA}), using last detected set`),applyExcludeGlobals(K,q,I,N.excludeGlobals,W)}function appendInjectAsEntry(n,a){return n===void 0?[a]:typeof n==`string`?[n,a]:Array.isArray(n)?[...n,a]:{...n,__gjsify_inject:a}}var defaultBundler,TA,EA,DA,OA=__esmMin(()=>{Ae(),Fb(),zb(),Ab(),wA(),defaultBundler=async({rolldownInput:n,format:a})=>{let S=await(await import(`rolldown`)).rolldown(n);try{let n=await S.generate({format:a,minify:!1,sourcemap:!1}),C=[];for(let a of n.output)a.type===`chunk`&&C.push(a.code);return C}finally{await S.close()}},TA=kb,EA=CA,DA=5}),kA=__esmMin(()=>{zb(),Fb(),OA()});function findPnpRoot(n){let a=n;for(;;){if(existsSync(Qo(a,`.pnp.cjs`)))return a;let n=ts(a);if(n===a)return null;a=n}}async function loadPnpApi(){try{let n=await import(`pnpapi`);return n.default??n}catch{return null}}async function pnpPlugin(n={}){let a=n.issuerUrl??import.meta.url;if(!findPnpRoot(process.cwd()))return null;let S=await loadPnpApi();if(S===null)return null;let C=fileURLToPath(a),N=createRequire(C),F=n.relayPackages??[`@gjsify/node-polyfills`,`@gjsify/web-polyfills`],I=[];for(let n of F)try{I.push(N.resolve(`${n}/package.json`))}catch{}return{name:`gjsify-pnp`,resolveId:{order:`pre`,async handler(n,a){if(n.startsWith(`.`)||n.startsWith(`/`))return null;if(n.startsWith(`gi://`))return{id:n,external:!0};if(n.startsWith(`node:`))return await this.resolve(n,a,{skipSelf:!0});if(!a)return null;let N=a.startsWith(`file://`)?fileURLToPath(a):a;try{let a=S.resolveRequest(n,N);return a===null?null:{id:a}}catch(a){if(!isUndeclaredDependency(a))throw a;try{let a=S.resolveRequest(n,C);if(a!==null)return{id:a}}catch(n){if(!isUndeclaredDependency(n))throw n}for(let a of I)try{let C=S.resolveRequest(n,a);if(C!==null)return{id:C}}catch(n){if(!isUndeclaredDependency(n))throw n}return null}}},async load(n){if(!n.includes(`/.yarn/`)&&!n.includes(`.zip/`))return null;try{return{code:await readFile$1(n,`utf8`)}}catch(a){let S=a instanceof Error?a.message:String(a);this.error(`gjsify-pnp: failed to read ${n}: ${S}`)}}}}function isUndeclaredDependency(n){return typeof n==`object`&&!!n&&`pnpCode`in n&&n.pnpCode===`UNDECLARED_DEPENDENCY`}var AA=__esmMin(()=>{zo(),fn(),ls(),Jc(),Tc()});function normalizeBundlerOptions(n){let a=n.bundler??{},S=a;if(typeof a.define==`object`&&a.define!==null){MA||(MA=!0,ke.warn(`[gjsify] WARNING: 'bundler.define' is not a valid Rolldown option and would be silently ignored — it has been auto-mapped to 'bundler.transform.define'. Move 'define' under 'bundler.transform.define' in your config to suppress this warning and avoid a ReferenceError at GJS load time.`));let{define:n,...C}=a;S={...C,transform:{...C.transform,define:{...n,...C.transform?.define}}}}if(!n.esbuild)return S;jA||(jA=!0,ke.warn(`[gjsify] DEPRECATION: the 'esbuild' config key is deprecated and will be removed in 0.5.0. Rename it to 'bundler' (typed as RolldownOptions). See the migration notes in the gjsify CHANGELOG.`));let C=legacyEsbuildToRolldown(n.esbuild),N={...C,...S};return(C.output||S.output)&&(N.output={...C.output,...S.output}),(C.transform||S.transform)&&(N.transform={...C.transform,...S.transform},(C.transform?.define||S.transform?.define)&&(N.transform.define={...C.transform?.define,...S.transform?.define})),(C.resolve||S.resolve)&&(N.resolve={...C.resolve,...S.resolve}),N}function legacyEsbuildToRolldown(n){let a={},S={},C={},N={};return n.outfile!==void 0&&(S.file=n.outfile),n.outdir!==void 0&&(S.dir=n.outdir),n.format!==void 0&&(S.format=n.format),n.minify!==void 0&&(S.minify=n.minify),n.sourcemap!==void 0&&(S.sourcemap=n.sourcemap===`inline`?`inline`:!!n.sourcemap),n.banner?.js!==void 0&&(S.banner=n.banner.js),n.target!==void 0&&(C.target=Array.isArray(n.target)?n.target.join(`,`):n.target),n.define!==void 0&&(C.define=n.define),n.mainFields!==void 0&&(N.mainFields=n.mainFields),n.conditions!==void 0&&(N.conditionNames=n.conditions),n.external!==void 0&&(a.external=n.external),n.platform!==void 0&&(a.platform=n.platform),Object.keys(S).length>0&&(a.output=S),Object.keys(C).length>0&&(a.transform=C),Object.keys(N).length>0&&(a.resolve=N),a}function mergeBundlerOptions(n,a){let{input:S,external:C,...N}=a,F={...n,...N};return(n.output||a.output)&&(F.output={...n.output,...a.output}),(n.transform||a.transform)&&(F.transform={...n.transform,...a.transform},(n.transform?.define||a.transform?.define)&&(F.transform.define={...n.transform?.define,...a.transform?.define})),(n.resolve||a.resolve)&&(F.resolve={...n.resolve,...a.resolve}),F}var jA,MA,NA=__esmMin(()=>{Ae(),jA=!1,MA=!1});function isUnsafeDefaultOutput(n){if(/\.[cm]?tsx?$/i.test(n))return!0;let a=n.replace(/\\/g,`/`);return!!/(?:^|\/)src\//.test(a)}async function buildPnpPlugin(){return pnpPlugin({issuerUrl:import.meta.url})}async function runOneLibraryBuild(n){let a=await gjsifyPlugin({input:n.userBundler.input,output:n.output,userAliases:n.userAliases},n.pluginOpts);return await runBundle({...mergeBundlerOptions(a.options,n.userBundler),plugins:[...n.pnpPlugins,...a.plugins]})}var PA,BuildAction,FA=__esmMin(()=>{Ae(),Rg(),xA(),SA(),kA(),AA(),ls(),Tc(),NA(),PA=`#!/usr/bin/env -S gjs -m`,BuildAction=class{configData;constructor(n={}){this.configData=n}async buildLibrary(){let{verbose:n,library:a,typescript:S,exclude:C,aliases:N}=this.configData,F=a??{},I=normalizeBundlerOptions(this.configData),H=F.module?ts(F.module):void 0,W=F.main?ts(F.main):void 0,K=F.module?rs(F.module):`.js`,q=F.main?rs(F.main):`.js`,Y=H&&W&&H!==W,X=await buildPnpPlugin(),te=X?[X]:[],ne=[];if(Y){let a=H.includes(`/cjs`)||K===`.cjs`?`cjs`:`esm`;ne.push(await runOneLibraryBuild({pluginOpts:{debug:n,library:a,exclude:C,reflection:S?.reflection,jsExtension:K},userBundler:I,output:{dir:H},userAliases:N,pnpPlugins:te}));let F=W.includes(`/cjs`)||q===`.cjs`?`cjs`:`esm`;ne.push(await runOneLibraryBuild({pluginOpts:{debug:n,library:F,exclude:C,reflection:S?.reflection,jsExtension:q},userBundler:I,output:{dir:W},userAliases:N,pnpPlugins:te}))}else{let a=I.output?.file??F.module??F.main,H=a?rs(a):`.js`,W=I.output?.dir??(a?ts(a):void 0),K=I.output?.format??(W?.includes(`/cjs`)||H===`.cjs`?`cjs`:`esm`);ne.push(await runOneLibraryBuild({pluginOpts:{debug:n,library:K,exclude:C,reflection:S?.reflection,jsExtension:H},userBundler:I,output:{dir:W},userAliases:N,pnpPlugins:te}))}return ne}parseGlobalsValue(n){if(n===void 0)return{autoMode:!0,extras:``};if(n===`none`||n===``)return{autoMode:!1,extras:``};let a=n.split(`,`).map(n=>n.trim()).filter(Boolean);return{autoMode:a.includes(`auto`),extras:a.filter(n=>n!==`auto`).join(`,`)}}async resolveGlobalsInject(n,a,S){if(n!==`gjs`||!a)return;let C=resolveGlobalsList(a);if(C.size===0)return;let N=await writeRegisterInjectFile(C,process.cwd());return S&&N&&ke.debug(`[gjsify] globals: injected ${C.size} register module(s) from --globals ${a}`),N??void 0}async applyShebang(n,a,S){if(!a){S&&ke.warn(`[gjsify] --shebang skipped: no single outfile (use --outfile for executables)`);return}let C=n===`node`?nA:PA,N=resolveShebangLine(this.configData.shebang,C)??C,F=await readFile$1(a,`utf-8`);F.startsWith(`#!`)?S&&ke.debug(`[gjsify] --shebang skipped: ${a} already starts with a shebang`):await writeFile$1(a,N+`
739
739
  `+F),await chmod$1(a,493),S&&ke.debug(`[gjsify] --shebang: wrote ${N} + chmod 0o755 to ${a}`)}async buildApp(n=`gjs`,a={}){let{verbose:S,typescript:C,exclude:N,library:F,aliases:I,excludeGlobals:H}=this.configData,W=normalizeBundlerOptions(this.configData),K=W.output?.format??(W.output?.file?.endsWith(`.cjs`)?`cjs`:`esm`),q=K===`iife`?`esm`:K,Y=W.output?.file,X=W.output?.dir;if(!Y&&!X&&(F?.main||F?.module)){let n=q===`cjs`?F.main??F.module:F.module??F.main;if(n&&isUnsafeDefaultOutput(n))throw Error(`gjsify build: refusing to default --outfile to ${n} (would overwrite a TypeScript source file). Pass --outfile/--outdir explicitly, or set "gjsify.bundler.output.file" in package.json.`);Y=n}let{consoleShim:te,globals:ne}=this.configData,re=Array.isArray(W.external)?W.external:void 0,ie=typeof W.output?.banner==`string`?W.output.banner:void 0,ae={debug:S,app:n,format:q,exclude:N,reflection:C?.reflection,consoleShim:te,...I?{aliases:I}:{}},{autoMode:oe,extras:Z}=this.parseGlobalsValue(ne),se=await buildPnpPlugin(),ce=se?[se]:[],le=textLoaderPlugin({loaders:this.configData.loaders}),ue=le?[le]:[];if(W.plugins?.length){let n=await resolveUserPlugins(W.plugins,process.cwd());ue.push(...n)}if(n===`gjs`&&oe){let gjsifyPluginFactory=async n=>{let a=await gjsifyPlugin({input:W.input,output:{file:Y,dir:X},userExternal:re,userBanner:ie,userAliases:I,shebang:this.configData.shebang},n);return{options:a.options,plugins:a.plugins}},{injectPath:n}=await detectAutoGlobals({input:W.input,plugins:[...ce,...ue],external:W.external,transform:W.transform,format:q},ae,gjsifyPluginFactory,S,{extraGlobalsList:Z,excludeGlobals:H,cwd:process.cwd()},bundleToChunks);ae.autoGlobalsInject=n}else Z&&(ae.autoGlobalsInject=await this.resolveGlobalsInject(n,Z,S));let de=await gjsifyPlugin({input:W.input,output:{file:Y,dir:X},userExternal:re,userBanner:ie,userAliases:I,shebang:this.configData.shebang},ae),fe={...mergeBundlerOptions(de.options,W),plugins:[...ce,...ue,...de.plugins]};if(a.watch)return await this.runWatchLoop(fe,n,Y,S),[];let pe=await runBundle(fe);return(n===`gjs`||n===`node`)&&this.configData.shebang&&await this.applyShebang(n,Y,S),[pe]}async runWatchLoop(n,a,S,C){let N=await runWatch(n),F=new Promise(n=>{N.on(`close`,()=>n())}),I=!1,shutdown=async()=>{if(!I){I=!0,ke.log(`
740
740
  [gjsify build --watch] stopping watcher…`);try{await N.close()}catch(n){ke.error(`[gjsify build --watch] watcher close error:`,n)}}};process.on(`SIGINT`,shutdown),process.on(`SIGTERM`,shutdown),N.on(`event`,async n=>{switch(n.code){case`START`:C&&ke.log(`[gjsify build --watch] rebuild start`);break;case`BUNDLE_START`:ke.log(`[gjsify build --watch] building…`);break;case`BUNDLE_END`:ke.log(`[gjsify build --watch] built in ${n.duration}ms`);try{(a===`gjs`||a===`node`)&&this.configData.shebang&&await this.applyShebang(a,S,C)}finally{await n.result.close()}break;case`END`:ke.log(`[gjsify build --watch] waiting for changes…`);break;case`ERROR`:ke.error(`[gjsify build --watch] build failed:`,n.error?.message??n.error),C&&n.error?.stack&&ke.error(n.error.stack);try{await n.result.close()}catch{}break}}),C&&N.on(`change`,(n,a)=>{ke.log(`[gjsify build --watch] ${a.event}: ${n}`)}),await F}async start(n={app:`gjs`}){if(n.library){if(n.watch)throw Error(`gjsify build: --watch is not supported with --library (library mode would emit watcher rebuilds for every produced format; use --app gjs|node|browser instead).`);return await this.buildLibrary()}return await this.buildApp(n.app,{watch:n.watch})}}}),IA,LA=__esmMin(()=>{Mg(),FA(),IA={command:`build [entryPoints..]`,description:`Build and bundle your Gjs project`,builder:n=>n.option(`entry-points`,{description:`The entry points you want to bundle. Defaults to bundler.input from package.json#gjsify or .gjsifyrc.js, falling back to src/index.ts when neither is set.`,array:!0,type:`string`,normalize:!0,defaultDescription:`src/index.ts (fallback)`,coerce:n=>[...new Set(n)]}).option(`exclude`,{description:`An array of glob patterns to exclude entry-points and aliases`,array:!0,type:`string`,normalize:!0,default:[]}).option(`verbose`,{description:`Switch on the verbose mode`,type:`boolean`,normalize:!0,default:!1}).option(`app`,{description:`Use this if you want to build an application, the platform node is usually only used for tests`,type:`string`,choices:[`gjs`,`node`,`browser`,`nativescript`],normalize:!0,default:`gjs`}).option(`format`,{description:`Override the default output format`,type:`string`,choices:[`iife`,`esm`,`cjs`],normalize:!0}).option(`minify`,{description:`Minify the bundled output. Defaults to true; use --no-minify to emit pretty-printed code (e.g. for debugging or readable bundle review).`,type:`boolean`,normalize:!0,defaultDescription:`true`}).option(`library`,{description:`Use this if you want to build a library for Gjsify`,type:`boolean`,normalize:!0,default:!1}).option(`outfile`,{alias:`o`,description:`Sets the output file name for the build operation. If no outfile is specified, the outfile will be parsed from the package.json. Only used if application mode is active`,type:`string`,normalize:!0}).option(`outdir`,{alias:`d`,description:`Sets the output directory for the build operation. If no outdir is specified, the outdir will be parsed from the package.json. Only used if library mode is active`,type:`string`,normalize:!0}).option(`reflection`,{alias:`r`,description:`Enables TypeScript types on runtime using Deepkit's type compiler`,type:`boolean`,normalize:!0,default:!1}).option(`log-level`,{description:`The log level can be changed to prevent esbuild from printing warning and/or error messages to the terminal`,type:`string`,choices:[`silent`,`error`,`warning`,`info`,`debug`,`verbose`],normalize:!0,default:`warning`}).option(`console-shim`,{description:`Inject a console shim into GJS builds for clean output without the GLib prefix and with working ANSI colors. Use --no-console-shim to disable. Only applies to GJS app builds.`,type:`boolean`,normalize:!0,default:!0}).option(`globals`,{description:"Comma-separated list of global identifiers, 'auto' (default) to detect automatically from the bundled output, or 'none' to disable. The 'auto' token may be combined with explicit identifiers/groups (e.g. 'auto,dom') for cases where the detector cannot statically see a global because it's accessed via indirection. Each identifier is mapped to the corresponding `@gjsify/<pkg>/register` module and injected into the bundle. See the CLI Reference docs for the full list of known identifiers. Only applies to GJS app builds.",type:`string`,normalize:!0,default:`auto`}).option(`shebang`,{description:"Prepend a target-appropriate shebang to the output and mark it executable (chmod 755): `#!/usr/bin/env -S gjs -m` for --app gjs, `#!/usr/bin/env node` for --app node. Applies to GJS and Node app builds with a single --outfile. Default: false (use --shebang to enable, or set `shebang: true` in `.gjsifyrc.js`).",type:`boolean`,normalize:!0}).option(`external`,{description:"Module names that should NOT be bundled — EXACT package names only, matched literally on both bundler engines (no globs). Repeat the flag or pass a comma-separated list (e.g. --external typedoc,prettier). Appended to the per-app built-in externals; register subpaths (`<pkg>/register[/…]`) are always force-inlined for --app gjs regardless of this flag.",array:!0,type:`string`,default:[],coerce:n=>n.flatMap(n=>n.split(`,`).map(n=>n.trim()).filter(Boolean))}).option(`define`,{description:`Substitute compile-time constants. Each entry is KEY=VALUE where VALUE is a JS expression (string literals must be quoted: --define VERSION='"1.2.3"'). Repeat the flag or pass comma-separated. See https://esbuild.github.io/api/#define`,array:!0,type:`string`,default:[]}).option(`alias`,{description:`Map module specifiers at bundle time. Each entry is FROM=TO (e.g. --alias typedoc=@gjsify/empty). Layered on top of the built-in alias map. Useful for stubbing heavy deps the test scenario never executes.`,array:!0,type:`string`,default:[],coerce:n=>n.flatMap(n=>n.split(`,`).map(n=>n.trim()).filter(Boolean))}).option(`exclude-globals`,{description:`Comma-separated global identifiers to remove from auto-detection results. Use for false positives from dead browser-compat code whose polyfills require unavailable native libraries (e.g. --exclude-globals fetch,XMLHttpRequest).`,type:`string`,normalize:!0}).option(`watch`,{alias:`w`,description:"Watch source files and rebuild on change. Logs each rebuild with duration; clean SIGINT shutdown. Only valid with --app gjs|node|browser (rejected with --library). Requires the npm `rolldown` engine — run under Node, not the GJS-bundled CLI.",type:`boolean`,normalize:!0,default:!1}),handler:async n=>{await new BuildAction(await new Config().forBuild(n)).start({library:n.library,app:n.app,watch:n.watch})}}});function nodeArchToLinuxArch(n){return{x64:`x86_64`,arm64:`aarch64`,arm:`armv7`,ia32:`i686`}[n]??n}function readPackageJson$3(n){try{return JSON.parse(readFileSync(n,`utf-8`))}catch{return null}}function scanNodeModules(n,a){let S=[];if(!existsSync(n))return S;let C;try{C=readdirSync(n)}catch{return S}for(let N of C)if(!N.startsWith(`.`))if(N.startsWith(`@`)){let C=Qo(n,N),F;try{F=readdirSync(C)}catch{continue}for(let n of F){let F=checkPackage(Qo(C,n),`${N}/${n}`,a);F&&S.push(F)}}else{let C=checkPackage(Qo(n,N),N,a);C&&S.push(C)}return S}function checkPackage(n,a,S){let C=readPackageJson$3(Qo(n,`package.json`));if(!C)return null;let N=C.gjsify;if(!N||typeof N!=`object`)return null;let F=N.prebuilds;if(typeof F!=`string`)return null;let I=Qo(n,F,`linux-${S}`);return existsSync(I)?{name:a,prebuildsDir:I}:null}function detectNativePackages(n){let a=nodeArchToLinuxArch(process.arch),S=[],C=new Set,N=Yo(n);for(;;){let n=Qo(N,`node_modules`);if(existsSync(n))for(let N of scanNodeModules(n,a))C.has(N.name)||(C.add(N.name),S.push(N));let F=Yo(N,`..`);if(F===N)break;N=F}return S}function buildNativeEnv(n){let a=n.map(n=>n.prebuildsDir),S=process.env.LD_LIBRARY_PATH??``,C=process.env.GI_TYPELIB_PATH??``;return{LD_LIBRARY_PATH:[...a,...S?[S]:[]].join(`:`),GI_TYPELIB_PATH:[...a,...C?[C]:[]].join(`:`)}}var RA=__esmMin(()=>{Jc(),ls(),__name$1(readPackageJson$3,`readPackageJson`)});function computeNativeEnvForBundle(n,a=process.cwd()){let S=Yo(n),C=detectNativePackages(a),N=detectNativePackages(ts(S)),F=new Set(C.map(n=>n.name)),I=buildNativeEnv([...C,...N.filter(n=>!F.has(n.name))]);return{env:I,envPrefix:Object.entries(I).filter(([,n])=>n!==void 0&&n!==``).map(([n,a])=>`${n}=${a}`).join(` `)}}async function runGjsBundle(n,a=[],S={}){let{env:C,envPrefix:N}=computeNativeEnvForBundle(n),F={...process.env,...C},I=[`-m`,n,...a],H=[`gjs`,...I.map(n=>n.includes(` `)?`"${n}"`:n)].join(` `);ke.error(`$ ${N?`${N} `:``}${H}`);let W=spawn(`gjs`,I,{env:F,stdio:`inherit`});await new Promise((n,a)=>{W.on(`close`,S=>{S===0?n():a(Error(`gjs exited with code ${S}`))}),W.on(`error`,a)}).catch(n=>{ke.error(n.message),process.exit(1)}),S.exitOnSuccess&&process.exit(0)}var zA=__esmMin(()=>{Ae(),nC(),ls(),RA()});async function buildTestBundle(n,a,S,C){let N=await new Config().forBuild({entryPoints:[n],outfile:a,app:S,verbose:C??!1,logLevel:`warning`,exclude:[]});N.library={...N.library},N.bundler={...N.bundler,input:[n],output:{...N.bundler?.output,file:a}},await new BuildAction(N).start({app:S,library:!1})}async function runTestBundle(n,a){if(a===`gjs`){await runGjsBundle(n);return}await new Promise((a,S)=>{let C=spawn(`node`,[n],{stdio:`inherit`});C.on(`error`,S),C.on(`exit`,n=>{n===0?a():S(Error(`node exited with code ${n}`))})})}function isFresh(n,a){if(!existsSync(n))return!1;let S=statSync(n).mtimeMs,C=ts(a);try{return S>=newestMtimeUnder(existsSync(C)?C:a)}catch{return!1}}function newestMtimeUnder(n){let a=statSync(n);if(a.isFile())return a.mtimeMs;let S=a.mtimeMs;for(let a of readdirSync(n,{withFileTypes:!0})){if(a.name===`node_modules`||a.name===`dist`||a.name===`lib`||a.name.startsWith(`.`))continue;let C=newestMtimeUnder(Qo(n,a.name));C>S&&(S=C)}return S}var BA,VA=__esmMin(()=>{Ae(),Jc(),ls(),nC(),Mg(),FA(),zA(),BA={command:`test`,description:"Build + run the package’s `src/test.mts` suite on GJS and Node and aggregate the results. Replaces the per-package `build:test:{gjs,node}` + `test:{gjs,node}` script boilerplate.",builder:n=>n.option(`runtime`,{description:`Target runtime. Default: both.`,type:`string`,choices:[`gjs`,`node`,`all`],default:`all`}).option(`entry`,{description:"Path to the test entry. Default: `src/test.mts` (or `gjsify.test.entry`).",type:`string`,normalize:!0}).option(`outdir`,{description:"Output directory for the built test bundles. Default: `dist/`.",type:`string`,normalize:!0}).option(`rebuild`,{description:`Always rebuild the test bundles, even when they look up-to-date.`,type:`boolean`,default:!1}).option(`build`,{description:`Build before running. Default: true (use --no-build to skip when bundles already exist).`,type:`boolean`,default:!0}).option(`verbose`,{description:`Print resolved entry/outdir + per-step timing.`,type:`boolean`,default:!1}),handler:async n=>{let a=process.cwd(),S=(await new Config().forBuild({}).catch(()=>({}))).test??{},C=Yo(a,n.entry??S.entry??`src/test.mts`),N=Yo(a,n.outdir??S.outdir??`dist`);existsSync(C)||(ke.error(`[gjsify test] no test entry at ${$o(a,C)} — add an \`src/test.mts\` that aggregates your \`@gjsify/unit\` suites, or set \`gjsify.test.entry\` in package.json.`),process.exit(1));let F=n.runtime===`gjs`?[`gjs`]:n.runtime===`node`?[`node`]:S.runtimes&&S.runtimes.length>0?S.runtimes:[`gjs`,`node`],I=[];for(let S of F){let F=Qo(N,`test.${S}.mjs`);if(n.build!==!1)if(n.rebuild||!isFresh(F,C)){let N=Date.now();n.verbose&&ke.log(`[gjsify test] building → ${$o(a,F)} (—app ${S})`);try{await buildTestBundle(C,F,S,n.verbose),n.verbose&&ke.log(`[gjsify test] built ${S} in ${Date.now()-N}ms`)}catch(n){ke.error(`[gjsify test] build failed for ${S}:`,n.message),I.push({runtime:S,ok:!1,durationMs:0,error:`build failed`});continue}}else n.verbose&&ke.log(`[gjsify test] ${S}: bundle is up-to-date — skipping build (use --rebuild to force)`);else if(!existsSync(F)){ke.error(`[gjsify test] --no-build but ${$o(a,F)} doesn't exist. Build first or drop --no-build.`),I.push({runtime:S,ok:!1,durationMs:0,error:`no bundle`});continue}let H=Date.now();try{await runTestBundle(F,S),I.push({runtime:S,ok:!0,durationMs:Date.now()-H})}catch(n){I.push({runtime:S,ok:!1,durationMs:Date.now()-H,error:n.message})}}let H=I.map(n=>`${n.ok?`✅`:`❌`} ${n.runtime} (${n.durationMs}ms)${n.error?` — ${n.error}`:``}`).join(` `);ke.log(`[gjsify test] ${H}`),I.some(n=>!n.ok)&&process.exit(1),process.exit(0)}}});function readPackageJson$2(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)+`
741
- `,`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 HA=__esmMin(()=>{Jc(),__name$1(readPackageJson$2,`readPackageJson`),__name$1(parseSpec$2,`parseSpec`)});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 runScript(n,a){let S=process.cwd(),C=Qo(S,`package.json`),N=readPackageJson$2(C);N||(ke.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>`;ke.error(`gjsify run: no script "${n}" in ${C} (available: ${a})`),process.exit(1)}let H=findWorkspaceRoot(S),W=[Qo(S,`node_modules`,`.bin`)];H&&H!==S&&W.push(Qo(H,`node_modules`,`.bin`));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(ss),npm_lifecycle_event:n,npm_package_name:N.name??``,npm_package_version:N.version??``},Y=runningUnderGjs()?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);try{let{runCli:n}=await Promise.resolve().then(()=>(KN(),GN));await n(Y)}catch(n){ke.error(n.message),process.exit(1)}process.exit(process.exitCode==null?0:Number(process.exitCode))}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=>{ke.error(n.message),process.exit(1)}),process.exit(0)}function shellEscape(n){return/^[a-zA-Z0-9_\-./=:@,]+$/.test(n)?n:`'${n.replace(/'/g,`'\\''`)}'`}function runningUnderGjs(){return globalThis.imports?.gi!==void 0}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(`|&;<>\`$()\\
741
+ `,`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 HA=__esmMin(()=>{Jc(),__name$1(readPackageJson$2,`readPackageJson`),__name$1(parseSpec$2,`parseSpec`)});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 runScript(n,a){let S=process.cwd(),C=Qo(S,`package.json`),N=readPackageJson$2(C);N||(ke.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>`;ke.error(`gjsify run: no script "${n}" in ${C} (available: ${a})`),process.exit(1)}let H=findWorkspaceRoot(S),W=[Qo(S,`node_modules`,`.bin`)];H&&H!==S&&W.push(Qo(H,`node_modules`,`.bin`));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(ss),npm_lifecycle_event:n,npm_package_name:N.name??``,npm_package_version:N.version??``},Y=runningUnderGjs()?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);try{let{runCli:n}=await Promise.resolve().then(()=>(XN(),YN));await n(Y)}catch(n){ke.error(n.message),process.exit(1)}process.exit(process.exitCode==null?0:Number(process.exitCode))}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=>{ke.error(n.message),process.exit(1)}),process.exit(0)}function shellEscape(n){return/^[a-zA-Z0-9_\-./=:@,]+$/.test(n)?n:`'${n.replace(/'/g,`'\\''`)}'`}function runningUnderGjs(){return globalThis.imports?.gi!==void 0}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(`|&;<>\`$()\\
742
742
  \r*?{}[]~#!`.includes(I))return null;S+=I,C=!0}return N?null:(C&&a.push(S),a)}var UA,WA=__esmMin(()=>{Ae(),Jc(),ls(),nC(),zA(),HA(),Pg(),UA={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:[]}).parserConfiguration({"populate--":!0}),handler:async n=>{let a=n.target,S=n.args??[],C=(n[`--`]??[]).filter(n=>typeof n==`string`),N=[...S,...C],F=readPackageJson$2(Qo(process.cwd(),`package.json`));if(!(F?.scripts&&typeof F.scripts[a]==`string`)&&looksLikeFile(a)){await runGjsBundle(Yo(a),N,{exitOnSuccess:!0});return}await runScript(a,N)}}}),GA,KA=__esmMin(()=>{Ae(),ls(),RA(),GA={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?Yo(n.file):null,C=detectNativePackages(a),{LD_LIBRARY_PATH:N,GI_TYPELIB_PATH:F}=buildNativeEnv(C);if(n.export){ke.log(`export LD_LIBRARY_PATH="${N}"`),ke.log(`export GI_TYPELIB_PATH="${F}"`);return}if(C.length===0){ke.log(`No native gjsify packages detected in node_modules.`),ke.log(`Native packages declare "gjsify": { "prebuilds": "<dir>" } in their package.json.`);return}ke.log(`Native packages detected:`);for(let n of C)ke.log(` ${n.name} → ${n.prebuildsDir}`);ke.log(``),ke.log(`To run your app directly with gjs, set:`),ke.log(` export LD_LIBRARY_PATH="${N}"`),ke.log(` export GI_TYPELIB_PATH="${F}"`),S?ke.log(` gjs -m ${S}`):ke.log(` gjs -m <your-bundle.js>`),ke.log(``),ke.log(`Or use gjsify run to handle this automatically:`),S?ke.log(` gjsify run ${n.file}`):ke.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(`
743
743
  `)[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(`
744
744
  `)[0],severity:C,requiredBy:N}}function checkNpmPackage(n,a,S,C,N,F){try{return createRequire(pathToFileURL(Qo(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=Yo(n);for(;;){if(existsSync(Qo(a,`package.json`)))return a;let n=Yo(a,`..`);if(n===a)return null;a=n}}function discoverGjsifyPackages(n){let a=findProjectRoot(n);if(!a)return null;let S=Qo(a,`node_modules`,`@gjsify`);if(!existsSync(S))return new Set;let C=Qo(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=JA[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(`
@@ -794,7 +794,7 @@ jobs:
794
794
  + `)}`),F.length>0&&I.push(` - ${F.sort().join(`
795
795
  - `)}`),I.join(`
796
796
  `)}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){if(n[`dist-tags`][a])return n[`dist-tags`][a];let S;try{S=new dM(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}}),S)}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(EM,I.length));F?.beginPhase(`download`,I.length);let K=0,tickProgress=n=>{K++,F?.update({phase:`download`,current:K,total:I.length,name:`${n.name}@${n.version}`})},q=0,Y=I.findIndex(n=>depth(n.installPath)>1),X=Y<0?I.length:Y;for(;q<X;){let n=I[q++];if(!n)break;await extractOne(n,a,S,C,N),tickProgress(n)}for(let n=0;n<W;n++)H.push((async()=>{for(;;){let n=q++;if(n>=I.length)return;let F=I[n];if(!F)return;await extractOne(F,a,S,C,N),tickProgress(F)}})());await Promise.all(H),F?.endPhase(`download`)}async function extractOne(n,a,S,C,N){let F=Qo(a,n.installPath);assertNodeModulesDest(F,n);let I=getCachedTarball(n.integrity);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)),rmSync(F,{recursive:!0,force:!0}),mkdirSync(F,{recursive:!0}),await extractTarball(I,F)}function assertNodeModulesDest(n,a){if(!n.split(os).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(os).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}async function linkBins(n,a,S){let C=Qo(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=Qo(a,S.installPath,I);if(!existsSync(n))continue;try{chmodSync(n,493)}catch{}let H=Qo(C,F);rmSync(H,{force:!0});let W=$o(C,n);try{symlinkSync(W,H),N++}catch{copyFileSync(n,H),chmodSync(H,493),N++}}}}N>0&&S(`bin: linked %d entry(ies) under .bin/`,N)}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??pM,scopes:{},authTokens:{},basicAuth:{}};for(let C of[Qo(a,`.npmrc`),Qo(n.prefix,`.npmrc`)])if(existsSync(C))try{let n=parseNpmrc(readFileSync(C,`utf-8`));S={...S,...n,scopes:{...S.scopes,...n.scopes}}}catch(n){ke.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 EM,DM,OM,kM=__esmMin(()=>{Ae(),Jc(),ls(),Vp(),fM(),mM(),yM(),SM(),wM(),EM=Number(process.env.GJSIFY_INSTALL_CONCURRENCY??`16`)||16,DM=`gjsify-lock.json`,OM=2,__name$1(normalizeBin$1,`normalizeBin`),__name$1(loadNpmrc$1,`loadNpmrc`)});async function installPackages(n){if(AM===`npm`)return await installViaNpm(n),{installed:[]};let{installPackagesNative:a}=await Promise.resolve().then(()=>(kM(),TM));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(Qo(n,`package.json`),JSON.stringify({name:`gjsify-dlx-cache`,version:`0.0.0`,private:!0},null,2)),C&&writeFileSync(Qo(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 AM,jM=__esmMin(()=>{nC(),Jc(),ls(),cM(),AM=process.env.GJSIFY_INSTALL_BACKEND??`native`});async function ensurePkgDir(n,a){if(n.kind===`local`)return{pkgDir:n.path,cachedPkgName:null};let S=cacheDirFor(createCacheKey({packages:[n.spec]})),C=a.cacheMaxAge>0?getValidCachedPkg(S,a.cacheMaxAge):void 0;if(C)return{pkgDir:resolveInstalledPkgDir(C,n.name),cachedPkgName:n.name};let N=makePrepareDir(S),F=makeProgressReporter({enabled:!a.verbose});return await installPackages({prefix:N,specs:[n.spec],verbose:a.verbose,registry:a.registry,lockfile:!0,frozen:a.frozen,progress:F}),{pkgDir:resolveInstalledPkgDir(symlinkSwap(S,N),n.name),cachedPkgName:n.name}}function splitBinAndArgs(n,a,S){if(!a)return{binName:null,extraArgs:S};let C=Qo(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 MM,NM=__esmMin(()=>{Ae(),zA(),tM(),nM(),aM(),jM(),Jc(),ls(),MM={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&&ke.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 defaultGlobalLayout(){let n=process.env.GJSIFY_GLOBAL_PREFIX,a=process.env.GJSIFY_GLOBAL_BIN_DIR,S=homedir(),C=process.env.XDG_DATA_HOME??Qo(S,`.local`,`share`);return{prefix:n??Qo(C,`gjsify`,`global`),binDir:a??Qo(S,`.local`,`bin`)}}function linkGlobalBins(n,a){mkdirSync(a.binDir,{recursive:!0});let S=[],C=buildLauncherEnvPreamble(detectNativePackages(a.prefix).map(n=>n.prebuildsDir));for(let N of n){let n=Qo(a.prefix,`node_modules`,N),F=Qo(n,`package.json`);if(!existsSync(F))continue;let I=pickBinMap(N,readJson(F));if(!(!I||I.size===0))for(let[N,F]of I){let I=Qo(n,F);if(!existsSync(I))continue;try{chmodSync(I,493)}catch{}let H=Qo(a.binDir,N);rmSync(H,{force:!0}),writeFileSync(H,I.endsWith(`.gjs.mjs`)||I.endsWith(`.mjs`)?`#!/bin/sh\n${C}exec gjs -m ${shQuote(I)} "$@"\n`:`#!/bin/sh\nexec ${shQuote(I)} "$@"\n`),chmodSync(H,493),S.push({name:N,target:I,link:H})}}return S}function shQuote(n){return`'${n.replace(/'/g,`'\\''`)}'`}function buildLauncherEnvPreamble(n){if(n.length===0)return``;let a=shQuote(n.join(`:`));return`GI_TYPELIB_PATH=${a}\${GI_TYPELIB_PATH:+":$GI_TYPELIB_PATH"}\nLD_LIBRARY_PATH=${a}\${LD_LIBRARY_PATH:+":$LD_LIBRARY_PATH"}\nexport GI_TYPELIB_PATH LD_LIBRARY_PATH\n`}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=Yo(n);return a.split(S).some(n=>n&&Yo(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 PM=__esmMin(()=>{Jc(),Vp(),ls(),RA()});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 isWorkspaceRoot(n){let a=readPackageJson$2(Qo(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=Qo(S,`package.json`),N=[`.pnp.cjs`,`.pnp.loader.mjs`].filter(n=>existsSync(Qo(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)&&isWorkspaceRoot(S)){await workspaceInstall(S,n,a);return}let F,I=readPackageJson$2(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){ke.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 installPackages({prefix:S,specs:F,verbose:n.verbose,lockfile:!n.immutable,frozen:n.immutable,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),N=K.installed.find(a=>a.name===n);addDependencyEntry(I,n,C??(N?defaultRangeFromVersion(N.version):`latest`),a)}writePackageJson(C,I),n.immutable||syncLockfileRequested(S,projectSpecsFromPackageJson(I))}}function syncLockfileRequested(n,a){let S=Qo(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,writeFileSync(S,JSON.stringify(n,null,2)+`
797
- `)}catch{}}async function workspaceInstall(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=[];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)){I.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`);/^(link|file|portal|git\+|https?):/.test(S)||F.add(`${a}@${S}`)}}}ke.log(`gjsify install: ${C.length} workspace(s), ${F.size} external dep spec(s), ${I.length} workspace symlink(s)`),writeWorkspaceBinShims(n,C);let H=C.find(a=>a.location===n)?.manifest,W=extractOverrides(H),K=W?.global,q=new Map,Y=new Set;if(W&&W.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,W);if(!C)continue;let N=C,F=n.location,I=q.get(F);I||(I=new Set,q.set(F,I)),I.add(`${a}@${N}`),Y.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,W)||n.add(`${S}@${N}`)}for(let a of Y)n.has(a)||F.delete(a);q.size>0&&ke.log(`gjsify install: ${q.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,overrides:K,signal:S,progress:C})}else a.verbose&&ke.log(`gjsify install: no external deps to fetch`);for(let[n,N]of q){if(N.size===0)continue;let F=C.find(a=>a.location===n)?.name??n;a.verbose&&ke.log(`gjsify install: ${F} — installing ${N.size} scoped-override spec(s) into ${n}/node_modules/`),await installPackages({prefix:n,specs:[...N],verbose:a.verbose,lockfile:!a.immutable,frozen:a.immutable,signal:S})}if(I.length>0){let n=await Promise.resolve().then(()=>(Tc(),Sc)),a=new Set,S=[];for(let n of I){let C=N.get(n.fromWorkspaceName);if(!C)continue;let F=Qo(C.location,`node_modules`,n.depName);a.add(ts(F));let I=$o(ts(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})}catch{}await n.symlink(S,a)};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),ke.log(`gjsify install: wired ${I.length} workspace symlink(s)`)}let X=Qo(n,`node_modules`),te=0;for(let a of C){if(a.location===n||!a.name)continue;let S=Qo(X,a.name),C=!1;try{lstatSync(S),C=!0}catch{}C||(mkdirSync(ts(S),{recursive:!0}),symlinkSync($o(ts(S),a.location),S),te++)}te>0&&ke.log(`gjsify install: hoisted ${te} workspace(s) to root node_modules/`);let ne=writeWorkspaceBinShims(n,C);ne>0&&ke.log(`gjsify install: linked ${ne} workspace bin(s) into node_modules/.bin/`)}function writeWorkspaceBinShims(n,a){let S=Qo(n,`node_modules`,`.bin`),C=detectNativePackages(n).map(n=>n.prebuildsDir),N=0;for(let n of a){let a=n.manifest,F=a.gjsify?.bin,I=a.bin,H=mergeWorkspaceBins(n.name,F,I);if(H.size!==0){mkdirSync(S,{recursive:!0});for(let[a,{nodeTarget:F,gjsTarget:I}]of H){let H=Qo(S,a);try{rmSync(H,{force:!0})}catch{}writeFileSync(H,buildBinShim(n.location,F,I,C),{mode:493}),chmodSync(H,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`){ke.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}ke.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=[]){let N=a?Qo(n,a):null,F=S?Qo(n,S):null,I=C.length===0?``:(()=>{let n=`'${C.join(`:`).replace(/'/g,`'\\''`)}'`;return`GI_TYPELIB_PATH=${n}\${GI_TYPELIB_PATH:+":$GI_TYPELIB_PATH"}\nLD_LIBRARY_PATH=${n}\${LD_LIBRARY_PATH:+":$LD_LIBRARY_PATH"}\nexport GI_TYPELIB_PATH LD_LIBRARY_PATH\n`})();if(N&&F)return`#!/bin/sh\nif command -v gjs >/dev/null 2>&1 && [ -f "${F}" ]; then\n${I}exec gjs -m "${F}" "$@"\nfi\nexec node "${N}" "$@"\n`;if(N)return`#!/bin/sh\nexec node "${N}" "$@"\n`;if(F)return`#!/bin/sh\n${I}exec gjs -m "${F}" "$@"\n`;throw Error(`buildBinShim: 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 new Promise((a,S)=>{let C=spawn(`npm`,n,{stdio:`inherit`});C.on(`close`,n=>{n===0?a():S(Error(`npm install exited with code ${n}`))}),C.on(`error`,n=>{let a=n.code===`ENOENT`?`npm not found on PATH — install Node.js first.`:`npm install failed: ${n.message}`;S(Error(a))})}).catch(n=>{ke.error(n.message),process.exit(1)})}async function installGlobalAndLink(n,a){let S=defaultGlobalLayout();mkdirSync(S.prefix,{recursive:!0}),ke.log(`gjsify install --global → ${S.prefix}`),ke.log(` bins → ${S.binDir}`),await installPackages({prefix:S.prefix,specs:n,verbose:a.verbose});let C=linkGlobalBins(n.map(specToPackageName),S);if(C.length===0)ke.warn("\nNo bins declared (neither `gjsify.bin` nor `bin` in package.json) — nothing was symlinked.");else{ke.log(`\nLinked ${C.length} bin(s):`);for(let n of C)ke.log(` • ${n.link} → ${n.target}`)}C.length>0&&!binDirOnPath(S.binDir)&&ke.warn(`\nNote: ${S.binDir} is not on your PATH.\nAdd it to your shell rc file:\n export PATH="${S.binDir}:$PATH"`)}async function runPostInstallChecks(){ke.log(`
797
+ `)}catch{}}async function workspaceInstall(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=[];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)){I.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`);/^(link|file|portal|git\+|https?):/.test(S)||F.add(`${a}@${S}`)}}}ke.log(`gjsify install: ${C.length} workspace(s), ${F.size} external dep spec(s), ${I.length} workspace symlink(s)`),writeWorkspaceBinShims(n,C);let wireWorkspaceSymlinks=async()=>{if(I.length>0){let n=await Promise.resolve().then(()=>(Tc(),Sc)),a=new Set,S=[];for(let n of I){let C=N.get(n.fromWorkspaceName);if(!C)continue;let F=Qo(C.location,`node_modules`,n.depName);a.add(ts(F));let I=$o(ts(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})}catch{}await n.symlink(S,a)};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),ke.log(`gjsify install: wired ${I.length} workspace symlink(s)`)}let a=Qo(n,`node_modules`),S=0;for(let N of C){if(N.location===n||!N.name)continue;let C=Qo(a,N.name),F=!1;try{lstatSync(C),F=!0}catch{}F||(mkdirSync(ts(C),{recursive:!0}),symlinkSync($o(ts(C),N.location),C),S++)}S>0&&ke.log(`gjsify install: hoisted ${S} workspace(s) to root node_modules/`)};await wireWorkspaceSymlinks();let H=C.find(a=>a.location===n)?.manifest,W=extractOverrides(H),K=W?.global,q=new Map,Y=new Set;if(W&&W.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,W);if(!C)continue;let N=C,F=n.location,I=q.get(F);I||(I=new Set,q.set(F,I)),I.add(`${a}@${N}`),Y.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,W)||n.add(`${S}@${N}`)}for(let a of Y)n.has(a)||F.delete(a);q.size>0&&ke.log(`gjsify install: ${q.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,overrides:K,signal:S,progress:C})}else a.verbose&&ke.log(`gjsify install: no external deps to fetch`);for(let[n,N]of q){if(N.size===0)continue;let F=C.find(a=>a.location===n)?.name??n;a.verbose&&ke.log(`gjsify install: ${F} — installing ${N.size} scoped-override spec(s) into ${n}/node_modules/`),await installPackages({prefix:n,specs:[...N],verbose:a.verbose,lockfile:!a.immutable,frozen:a.immutable,signal:S})}await wireWorkspaceSymlinks();let X=writeWorkspaceBinShims(n,C);X>0&&ke.log(`gjsify install: linked ${X} workspace bin(s) into node_modules/.bin/`)}function writeWorkspaceBinShims(n,a){let S=Qo(n,`node_modules`,`.bin`),C=detectNativePackages(n).map(n=>n.prebuildsDir),N=0;for(let n of a){let a=n.manifest,F=a.gjsify?.bin,I=a.bin,H=mergeWorkspaceBins(n.name,F,I);if(H.size!==0){mkdirSync(S,{recursive:!0});for(let[a,{nodeTarget:F,gjsTarget:I}]of H){let H=Qo(S,a);try{rmSync(H,{force:!0})}catch{}writeFileSync(H,buildBinShim(n.location,F,I,C),{mode:493}),chmodSync(H,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`){ke.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}ke.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=[]){let N=a?Qo(n,a):null,F=S?Qo(n,S):null,I=C.length===0?``:(()=>{let n=`'${C.join(`:`).replace(/'/g,`'\\''`)}'`;return`GI_TYPELIB_PATH=${n}\${GI_TYPELIB_PATH:+":$GI_TYPELIB_PATH"}\nLD_LIBRARY_PATH=${n}\${LD_LIBRARY_PATH:+":$LD_LIBRARY_PATH"}\nexport GI_TYPELIB_PATH LD_LIBRARY_PATH\n`})();if(N&&F)return`#!/bin/sh\nif command -v gjs >/dev/null 2>&1 && [ -f "${F}" ]; then\n${I}exec gjs -m "${F}" "$@"\nfi\nexec node "${N}" "$@"\n`;if(N)return`#!/bin/sh\nexec node "${N}" "$@"\n`;if(F)return`#!/bin/sh\n${I}exec gjs -m "${F}" "$@"\n`;throw Error(`buildBinShim: 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 new Promise((a,S)=>{let C=spawn(`npm`,n,{stdio:`inherit`});C.on(`close`,n=>{n===0?a():S(Error(`npm install exited with code ${n}`))}),C.on(`error`,n=>{let a=n.code===`ENOENT`?`npm not found on PATH — install Node.js first.`:`npm install failed: ${n.message}`;S(Error(a))})}).catch(n=>{ke.error(n.message),process.exit(1)})}async function installGlobalAndLink(n,a){let S=defaultGlobalLayout();mkdirSync(S.prefix,{recursive:!0}),ke.log(`gjsify install --global → ${S.prefix}`),ke.log(` bins → ${S.binDir}`),await installPackages({prefix:S.prefix,specs:n,verbose:a.verbose});let C=linkGlobalBins(n.map(specToPackageName),S);if(C.length===0)ke.warn("\nNo bins declared (neither `gjsify.bin` nor `bin` in package.json) — nothing was symlinked.");else{ke.log(`\nLinked ${C.length} bin(s):`);for(let n of C)ke.log(` • ${n.link} → ${n.target}`)}C.length>0&&!binDirOnPath(S.binDir)&&ke.warn(`\nNote: ${S.binDir} is not on your PATH.\nAdd it to your shell rc file:\n export PATH="${S.binDir}:$PATH"`)}async function runPostInstallChecks(){ke.log(`
798
798
  --- gjsify post-install checks ---`);let n=runMinimalChecks().filter(n=>!n.found&&n.severity===`required`);if(n.length>0){ke.warn(`Missing required system dependencies:
799
799
  `);for(let a of n)ke.warn(` ✗ ${a.name}`);let a=buildInstallCommand(detectPackageManager$2(),n);a&&ke.warn(`\nInstall with:\n ${a}`)}else ke.log(`System dependencies OK.`);let a=detectNativePackages(process.cwd());if(a.length>0){ke.log(`\nDetected ${a.length} @gjsify/* package(s) with native prebuilds:`);for(let n of a)ke.log(` • ${n.name}`);ke.log("\nUse `gjsify run <bundle>` to launch with LD_LIBRARY_PATH/GI_TYPELIB_PATH set.")}maybeInstallGitHooks()}function maybeInstallGitHooks(){let n=process.cwd(),a=Qo(n,`scripts`,`install-git-hooks.mjs`);if(existsSync(a)&&existsSync(Qo(n,`.git`)))try{let S=spawnSync(process.execPath,[a,`--quiet`],{cwd:n,stdio:`inherit`,env:process.env});S.status!==0&&ke.warn(`[gjsify install] scripts/install-git-hooks.mjs exited ${S.status} — git hooks may not be active.`)}catch(n){ke.warn(`[gjsify install] git hook installation skipped: ${n instanceof Error?n.message:String(n)}`)}}var FM,IM,LM=__esmMin(()=>{Ae(),Jc(),ls(),nC(),Ng(),ZA(),RA(),jM(),PM(),HA(),FM=18e5,IM={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(`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:FM}),handler:async n=>{if(n.immutable&&(n.packages&&n.packages.length>0&&(ke.error(`gjsify install --immutable does not accept package arguments. Remove the package names or drop --immutable.`),process.exit(1)),n.global&&(ke.error(`gjsify install --immutable is incompatible with --global.`),process.exit(1))),n.global){(!n.packages||n.packages.length===0)&&(ke.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]&&ke.warn(`gjsify install --global ignores --${a}: global installs do not modify a project package.json.`);await installGlobalAndLink(n.packages,{verbose:n.verbose});return}if((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);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;ke.error(`gjsify install: timed out after ${n}s — likely a registry slowdown.\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)}}}});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 RM){let S=a.pid?collectDescendants(a.pid):[];n.set(a,S),signalTree(a,S,`SIGTERM`)}setTimeout(()=>{for(let a of RM){let S=new Set(a.pid?collectDescendants(a.pid):[]);for(let C of n.get(a)??[])S.add(C);signalTree(a,[...S],`SIGKILL`)}},zM).unref?.()}async function runSequential(n,a,S,C,N){for(let F of n)await runOne$1(F,a,S,!1,C,N)}async function runParallel(n,a,S,C,N,F){let I=0,H=[];for(let W=0;W<C;W++)H.push((async()=>{for(;I<n.length;)await runOne$1(n[I++],a,S,!0,N,F)})());await Promise.all(H)}async function runTopologicalParallel(n,a,S,C,N,F,I){let H=new Set(n.map(n=>n.name)),W=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:`)&&H.has(S)&&n.add(S);W.set(a.name,n)}let K=new Map(n.map(n=>[n.name,n])),q=n.length,Y=new Set,X=0,te=!process.stdout.isTTY||N,ne=new Map,re=Number(process.env.GJSIFY_FOREACH_STALL_MINUTES??`20`),ie=(Number.isFinite(re)&&re>0?re:20)*6e4;return new Promise((n,F)=>{let H=null,re=Date.now(),describeInflight=()=>[...ne.entries()].map(([n,a])=>`${n} (${Math.round((Date.now()-a)/1e3)}s)`).join(`, `),failFast=n=>{H||(H=n,killActiveChildren(),setTimeout(()=>settle(),BM).unref?.())},ae=setInterval(()=>{let n=Date.now()-re;n<3e5||ne.size===0||(ke.error(`[gjsify foreach] WARNING: no workspace completed for ${Math.round(n/6e4)}min — in-flight: ${describeInflight()}`),n>=ie&&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);ae.unref?.();let settle=()=>{clearInterval(ae),H?F(H):n()},pump=()=>{if(!H){for(;X<C;){let n=[...W.entries()].filter(([,n])=>[...n].every(n=>Y.has(n))).map(([n])=>n);if(n.length===0)break;let C=n.sort()[0];W.delete(C),X++,ne.set(C,Date.now()),te&&ke.error(`[gjsify foreach] start ${C} (${Y.size}/${q} done, ${X} in flight)`),runOne$1(K.get(C),a,S,!0,N,I).then(()=>{Y.add(C)}).catch(n=>{failFast(n instanceof Error?n:Error(String(n)))}).finally(()=>{X--,ne.delete(C),re=Date.now(),H?X===0&&settle():W.size===0&&X===0?settle():pump()})}W.size>0&&X===0&&!H&&(clearInterval(ae),F(Error(`gjsify foreach --topological: stuck — workspaces ${[...W.keys()].join(`, `)} have unsatisfied deps in the selected set`)))}};pump()})}async function runOne$1(n,a,S,C,N,F){if(F){N&&ke.error(`[${n.name}] $ ${a} ${S.join(` `)}`),await spawnPrefixed(a,S,n.location,C?`[${n.name}] `:null);return}let I=detectPackageManager$1(),H=I===`gjsify`?[`run`,a,...S]:[`run`,a,...S.length>0?[`--`,...S]:[]];N&&ke.error(`[${n.name}] $ ${I} ${H.join(` `)}`),await spawnPrefixed(I,H,n.location,C?`[${n.name}] `:null)}function detectPackageManager$1(){let n=process.env.npm_config_user_agent??``;return n.startsWith(`yarn/`)?`yarn`:n.startsWith(`gjsify/`)?`gjsify`:`npm`}function spawnPrefixed(n,a,S,C){let N=process.env.FORCE_COLOR!==void 0||process.env.NO_COLOR!==void 0?{}:{FORCE_COLOR:`1`};return new Promise((F,I)=>{let H=spawn(n,a,{cwd:S,stdio:C?[`ignore`,`pipe`,`pipe`]:`inherit`,env:{...process.env,...N}});RM.add(H);let W=!process.stdout.isTTY,K=[];C&&H.stdout&&H.stderr&&(K.push(prefixLines(H.stdout,process.stdout,C,W)),K.push(prefixLines(H.stderr,process.stderr,C,W))),H.on(`close`,S=>{RM.delete(H);for(let n of K)n();S===0?F():I(Error(`${n} ${a.join(` `)} exited with code ${S}`))}),H.on(`error`,n=>{RM.delete(H),I(n)})})}var RM,zM,BM,VM,HM=__esmMin(()=>{Ae(),nC(),Jc(),Vp(),Ng(),Pg(),ej(),RM=new Set,zM=5e3,BM=15e3,VM={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).`,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}).parserConfiguration({"populate--":!0}),handler:async n=>{let a=discoverWorkspaces(findWorkspaceRoot(process.cwd())??process.cwd()),S=n.exec===!0,C=n.script,N=n.args??[];if(!S){let a=(n[`--`]??[]).filter(n=>typeof n==`string`);a.length>0&&(N=[...N,...a])}if(S){let a=(n[`--`]??[]).filter(n=>typeof n==`string`);a.length>0&&(C?N=[...N,...a]:(C=a[0],N=[...N,...a.slice(1)])),C||(ke.error("gjsify foreach --exec: missing command. Pass it after `--`, e.g. `gjsify foreach --exec -- npm publish --tag latest`."),process.exit(1))}let F=filterWorkspaces(a,{include:n.include,exclude:n.exclude,noPrivate:n.private===!1});if(!S){C||(ke.error(`gjsify foreach: missing <script> positional. Pass --exec to run an arbitrary command instead.`),process.exit(1));let n=C;F=F.filter(a=>typeof(a.manifest.scripts??{})[n]==`string`)}if(F.length===0){ke.log(`gjsify foreach: no workspaces match (${S?`exec`:`script`}="${C}", include=${JSON.stringify(n.include??[])}, exclude=${JSON.stringify(n.exclude??[])})`);return}(n.topological||n[`topological-dev`])&&(F=topologicalSort(buildDependencyGraph(F,{includeDev:n[`topological-dev`]===!0})));let I=n.verbose===!0,H=C;try{if(n.parallel&&!n.topological&&!n[`topological-dev`]){let a=n.jobs&&n.jobs>0?n.jobs:cpus().length;await runParallel(F,H,N,a,I,S)}else if(n.parallel){let a=n.jobs&&n.jobs>0?n.jobs:cpus().length;await runTopologicalParallel(F,H,N,a,I,n[`topological-dev`]===!0,S)}else await runSequential(F,H,N,I,S)}catch(n){killActiveChildren(),ke.error(n.message),process.exit(1)}process.exit(0)}},__name$1(runOne$1,`runOne`),__name$1(detectPackageManager$1,`detectPackageManager`)});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){let F=C===`gjsify`?[`run`,a,...S]:[`run`,a,...S.length>0?[`--`,...S]:[]];N&&ke.error(`[${n.name}] $ ${C} ${F.join(` `)}`);let I=process.env.FORCE_COLOR!==void 0||process.env.NO_COLOR!==void 0?{}:{FORCE_COLOR:`1`};await new Promise((a,S)=>{let N=spawn(C,F,{cwd:n.location,stdio:`inherit`,env:{...process.env,...I}});N.on(`close`,n=>{n===0?a():S(Error(`${C} ${F.join(` `)} exited with code ${n}`))}),N.on(`error`,S)})}function detectPackageManager(){let n=process.env.npm_config_user_agent??``;return n.startsWith(`yarn/`)?`yarn`:n.startsWith(`gjsify/`)?`gjsify`:`npm`}var UM,WM=__esmMin(()=>{Ae(),nC(),Ng(),Pg(),UM={command:`workspace <name> <script> [args..]`,description:"Run a workspace script (`yarn workspace <name> run <script>` equivalent).",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}),handler:async n=>{let a=discoverWorkspaces(findWorkspaceRoot(process.cwd())??process.cwd()),S=a.find(a=>a.name===n.name);S||(ke.error(`gjsify workspace: no workspace named "${n.name}" — discovered ${a.length} workspace(s)`),process.exit(1));let C=detectPackageManager(),N=n.verbose===!0,F=n[`with-dependencies`]===!0,I=n[`continue-on-error`]===!0;typeof(S.manifest.scripts??{})[n.script]!=`string`&&(ke.error(`gjsify workspace: workspace "${n.name}" has no script "${n.script}"`),process.exit(1));let H;H=F?topologicalSort(buildDependencyGraph(collectTransitiveClosure(S,a,n[`include-dev`]===!0),{includeDev:n[`include-dev`]===!0})):[S];let W=[];for(let a of H){if(typeof(a.manifest.scripts??{})[n.script]!=`string`){N&&ke.error(`[${a.name}] (no "${n.script}" script — skipping)`);continue}try{await runOne(a,n.script,n.args??[],C,N)}catch(n){let S=n instanceof Error?n:Error(String(n));ke.error(`[${a.name}] ${S.message}`),I||process.exit(1),W.push({workspace:a.name,error:S})}}W.length>0&&(ke.error(`gjsify workspace: ${W.length} workspace(s) failed: ${W.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=[Qo(n,`node_modules`,`.bin`)];F&&F!==n&&I.push(Qo(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(ss),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 GM=__esmMin(()=>{nC(),ls(),Pg()});async function packWorkspace(n,a={}){let S=Qo(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))+`
800
800
  `,X=collectFiles(n,K),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(Qo(n,a)));let C=statSync(Qo(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?Yo(a.destination):n,ce=Qo(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;N=C?expandFilesPatterns(n,C):walkAll(n);let F=loadIgnore(n),I=new Set;for(let n of N)F(n)||I.add(n);for(let a of S)existsSync(Qo(n,a))&&I.add(a);return[...I].sort()}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?Qo(n,a):n,N;try{N=readdirSync(C,{withFileTypes:!0})}catch{return S}for(let C of N){if(qM.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=Qo(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=Qo(n,`.npmignore`),S=Qo(n,`.gitignore`),C=[],N=existsSync(a)?a:existsSync(S)?S:null;if(N){let n=readFileSync(N,`utf-8`).split(`
@@ -815,18 +815,20 @@ Enter OTP: `);let n=await readLineFromStdin();n?pe=await doPut({...le,"npm-otp":
815
815
  `)),{path:a,removed:I}}var rN=__esmMin(()=>{Jc(),Vp(),ls()});async function promptLine(n){return process.stdout.write(n),readLine()}async function promptHidden(n){process.stdout.write(n);let a=process.stdin;return!a.isTTY||typeof a.setRawMode!=`function`?readLine():new Promise(n=>{let S=``;a.setRawMode(!0),a.resume(),a.setEncoding(`utf-8`);let onData=a=>{for(let C of a)if(C===`\r`||C===`
816
816
  `){cleanup(),process.stdout.write(`
817
817
  `),n(S);return}else C===iN?(cleanup(),process.stdout.write(`
818
- `),process.exit(130)):C===aN||C===oN?S.length>0&&(S=S.slice(0,-1),process.stdout.write(`\b \b`)):C>=` `&&(S+=C,process.stdout.write(`*`))},cleanup=()=>{a.setRawMode(!1),a.removeListener(`data`,onData),a.pause()};a.on(`data`,onData)})}function readLine(){return new Promise(n=>{let a=``,onData=S=>{a+=typeof S==`string`?S:S.toString(`utf-8`);let C=a.indexOf(`
819
- `);C>=0&&(cleanup(),n(a.slice(0,C).replace(/\r$/,``)))},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)})}var iN,aN,oN,sN=__esmMin(()=>{iN=``,aN=``,oN=`\b`}),cN,lN=__esmMin(()=>{Ae(),mM(),QM(),rN(),sN(),cN={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: ${pM} (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=>{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)??pM,C=S.endsWith(`/`)?S:`${S}/`,N=n.username??await promptLine(`Username: `);N||(ke.error(`gjsify login: a username is required.`),process.exit(1));let F=await promptHidden(`Password: `);F||(ke.error(`gjsify login: a password is required.`),process.exit(1));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=n.otp,q=await putUser(``,K);if(q.status===401&&!K){let n=(q.headers.get(`www-authenticate`)??``).toLowerCase(),a=await q.clone().text().catch(()=>``);(n.includes(`otp`)||/one-time pass/i.test(a))&&(K=await promptLine(`This operation requires a one-time password.
820
- Enter OTP: `),K||(ke.error(`gjsify login: no OTP entered.`),process.exit(1)),q=await putUser(``,K))}if(q.status===409){let n=await fetch(`${H}?write=true`,{headers:authHeaders(K)});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&&(q=await putUser(`/-rev/${W._rev}`,K))}}if(q.status===400&&(ke.error(`gjsify login: there is no user with the username "${N}" on ${C}.`),process.exit(1)),!q.ok){let n=await q.text().catch(()=>`<no body>`);ke.error(`gjsify login: ${q.status} ${q.statusText} from ${C}\n${n.slice(0,400)}`),process.exit(1)}let Y=await q.json().catch(()=>({}));Y.token||(ke.error("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`."),process.exit(1));let X=writeAuthToken(C,Y.token),te=(await whoami(C,await loadNpmrc(process.cwd()))).username??N;n.json?process.stdout.write(`${JSON.stringify({username:te,registry:C})}\n`):process.stdout.write(`Logged in as ${te} on ${C}\n(token written to ${X})\n`)}}}),uN,dN=__esmMin(()=>{mM(),QM(),rN(),uN={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: ${pM} (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)??pM,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{}}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 readCurrentVersion(){try{let n=process.env.GJSIFY_CLI_PACKAGE_JSON;if(n){let a=JSON.parse(readFileSync(n,`utf-8`));return a.name===fN&&typeof a.version==`string`?a.version:null}let a=ts(Yo(fileURLToPath(import.meta.url)));for(let n=0;n<8&&a!==ts(a);n++){let n=Qo(a,`package.json`);if(existsSync(n)){let a=JSON.parse(readFileSync(n,`utf-8`));if(a.name===fN&&typeof a.version==`string`)return a.version}a=ts(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 fN,pN,mN=__esmMin(()=>{Ae(),Jc(),ls(),fn(),mM(),jM(),PM(),fN=`@gjsify/cli`,pN={command:`self-update`,description:`Update the installed ${fN} 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=Qo(Qo(a.prefix,`node_modules`,fN),`package.json`),C=readCurrentVersion(),N=existsSync(S);ke.log(`Current ${fN}: v${C??`(unknown)`}`),N||ke.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`),ke.log(`Fetching dist-tags for ${fN}@${n.tag} ...`);let F;try{F=await fetchPackument(fN)}catch(n){let a=n instanceof Error?n.message:String(n);ke.error(`Failed to fetch packument: ${a}`),process.exit(1);return}let I=resolveTag(F,n.tag);if(!I){ke.error(`Unknown dist-tag '${n.tag}' on ${fN}. Known tags: ${Object.keys(F[`dist-tags`]??{}).join(`, `)||`(none)`}`),process.exit(1);return}if(ke.log(`Latest matching --tag ${n.tag}: v${I}`),C===I&&!n.force){ke.log(`Already up to date (v${I}).`),n.check||ke.log(`Run with --force to reinstall anyway.`);return}if(n.check){ke.log(C?`Update available: v${C} → v${I}`:`Install required: → v${I}`),process.exit(1);return}let H=!n.skipDeps,W=H?` + runtime dependencies`:` (bundle only)`;ke.log(`Installing ${fN}@${I}${W} ...`);try{await installPackages({prefix:a.prefix,specs:[`${fN}@${I}`],verbose:!1,skipDeps:!H})}catch(n){let a=n instanceof Error?n.message:String(n);ke.error(`self-update: install failed — ${a}`),ke.error("Re-run `gjsify self-update` to retry."),process.exit(1);return}let K=linkGlobalBins([fN],a);if(K.length===0)ke.warn("self-update: install completed but no bins were linked — package.json may be missing a `bin` field.");else for(let n of K)ke.log(` • ${n.link} → ${n.target}`);ke.log(`\nUpdated ${fN} to v${I}.`),H?ke.log(`Runtime dependencies were resolved alongside the bundle.`):ke.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 hN,gN,_N=__esmMin(()=>{Ae(),Jc(),ls(),hN=`https://github.com/gjsify/gjsify/releases/latest/download/cli.gjs.mjs`,gN={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=Yo(process.cwd(),n.output);if(existsSync(a)&&!n.force){ke.error(`${n.output} already exists. Re-run with --force to overwrite.`),process.exit(1);return}let S=Yo(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){ke.error("No target package: pass `gjsify generate-installer <pkg>` or run inside a directory with a package.json."),process.exit(1);return}let F=n[`bin-name`]??pickDefaultBinName(C,N),I=n[`bootstrap-url`]??hN;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}),ke.log(`Wrote ${n.output} (target=${N}, bin=${F}).`),ke.log(``),ke.log(`Install one-liner for your README:`),ke.log(` curl -fsSL https://github.com/<you>/<repo>/raw/main/${n.output} -o /tmp/i.mjs \\`),ke.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=Qo(n,F);try{if(!statSync(N).isFile())continue;let n=readFileSync(N,`utf-8`);if(!n.startsWith(`#!/bin/sh`))continue;let S=n.split(`
821
- `).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&&ke.warn(` ? could not inspect ${N}: ${n.message}`)}}return C}var vN,yN=__esmMin(()=>{Ae(),Jc(),ls(),PM(),vN={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){ke.error("gjsify uninstall currently only supports --global. For project-local removal, edit package.json + re-run `gjsify install`."),process.exit(1);return}let a=defaultGlobalLayout(),S=n[`dry-run`]??!1,C=n.verbose??!1,N=`gjsify uninstall${S?` (dry-run)`:``} --global`;ke.log(`${N} ← ${a.prefix}`),ke.log(`${` `.repeat(N.length)} bins ← ${a.binDir}`);let F=!1;for(let N of n.packages){let n=specToPackageName(N),I=Qo(a.prefix,`node_modules`,n);if(!existsSync(I)){ke.warn(` ✗ ${n} — not installed at ${I}`);continue}let H=findBinShimsForPackage(a.binDir,I,C);if(S){ke.log(` • would remove ${I}`);for(let n of H)ke.log(` • would remove ${n}`)}else{rmSync(I,{recursive:!0,force:!0}),ke.log(` • removed ${I}`);for(let n of H)unlinkSync(n),ke.log(` • removed ${n}`)}F=!0}F||(ke.error(`
822
- No packages removed.`),process.exit(1))}}});function handleInit({cwd:n,force:a}){let writeOne=(S,C)=>{let N=Yo(n,S);if(existsSync(N)&&!a){ke.log(`[gjsify format] ${S} exists at ${N} — pass --force to overwrite.`);return}writeFileSync(N,C,`utf-8`),ke.log(`[gjsify format] wrote ${N}`)};writeOne(`.oxlintrc.json`,loadOxlintTemplate()),writeOne(`.oxfmtrc.json`,loadOxfmtTemplate()),ke.log("[gjsify format] Run `gjsify format --write .` to apply the formatter to the project.")}var bN,xN=__esmMin(()=>{Ae(),Jc(),ls(),kj(),bN={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`,Yo(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}}}}),SN,CN=__esmMin(()=>{ls(),kj(),SN={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`,Yo(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}}}}),wN,TN=__esmMin(()=>{ls(),kj(),wN={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`,Yo(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`,Yo(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,EN=__esmMin(()=>{Ic(),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 DN=__esmMin(()=>{fM()});function discoverContext(n){let a=findWorkspaceRoot(n);if(a)return{root:a,workspaces:discoverWorkspaces(a,{includeRoot:!0}),isMonorepo:!0};let S=Qo(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 kN){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){ke.log(`gjsify upgrade --check: OK. ${n.length} dep(s) consistently declared across workspaces.`);return}ke.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)}ke.error(` ${AN.bold}${n.name}${AN.reset}`);for(let[n,S]of a.entries())ke.error(` ${n.padEnd(16)} — ${S.join(`, `)}`)}ke.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){ke.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){ke.log(`gjsify upgrade --align: inconsistencies present but no parseable target version. No-op.`);return}ke.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??`^`;ke.log(` ${n.name.padEnd(28)} ranges: ${[...n.declaredRanges].join(`, `)} → ${a}${n.latestVersion}`)}if(a.dryRun){ke.log(`
823
- [gjsify upgrade --align] --dry-run: no files changed.`);return}let N=applyToFiles(C);ke.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&&ke.warn(` ${H.name}: no dist-tags.latest, skipping`);continue}let F=H.highestVersion;if(!F){S&&ke.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&&ke.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 AN.red;case`minor`:return AN.yellow;case`patch`:return AN.green;case`prerelease`:return AN.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)+AN.bold+`name`.padEnd(a)+` `+`fan`.padEnd(S)+` `+`declared`.padEnd(C)+` `+`latest`.padEnd(N)+` kind`+AN.reset;ke.log(I),ke.log(` `.repeat(F+2)+AN.dim+`─`.repeat(a+S+C+N+16)+AN.reset);for(let I=0;I<n.length;I++){let H=n[I],W=`${I+1}.`.padEnd(F),K=H.declaredRanges.size>1?`${AN.magenta}⚠ ${AN.reset}`:` `,q=colorForDiff(H.diff);ke.log(W+K+H.name.padEnd(a)+` `+AN.dim+`${H.occurrences.length}`.padEnd(S)+AN.reset+` `+AN.dim+renderDeclaredCell(H).padEnd(C)+AN.reset+` `+q+H.latestVersion.padEnd(N)+AN.reset+` `+q+H.diff+AN.reset)}let H=n.filter(n=>n.declaredRanges.size>1).length;H>0&&ke.log(`\n${AN.magenta}⚠${AN.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)ke.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 ke.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{ke.log(`
824
- Select upgrades: comma- or space-separated indices, `+AN.bold+`a`+AN.reset+` for all, ranges like `+AN.bold+`1-3`+AN.reset+`, or `+AN.bold+`ENTER`+AN.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=Qo(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(`
818
+ `),process.exit(130)):C===aN||C===oN?S.length>0&&(S=S.slice(0,-1),process.stdout.write(`\b \b`)):C>=` `&&(S+=C,process.stdout.write(`*`))},cleanup=()=>{a.setRawMode(!1),a.removeListener(`data`,onData),a.pause()};a.on(`data`,onData)})}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)})}var iN,aN,oN,sN=__esmMin(()=>{iN=``,aN=``,oN=`\b`}),cN,lN=__esmMin(()=>{Ae(),mM(),QM(),rN(),sN(),cN={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: ${pM} (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=>{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)??pM,C=S.endsWith(`/`)?S:`${S}/`,N=n.username??await promptLine(`Username: `);N||(ke.error(`gjsify login: a username is required.`),process.exit(1));let F=await promptHidden(`Password: `);F||(ke.error(`gjsify login: a password is required.`),process.exit(1));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=n.otp,q=await putUser(``,K);if(q.status===401&&!K){let n=(q.headers.get(`www-authenticate`)??``).toLowerCase(),a=await q.clone().text().catch(()=>``);(n.includes(`otp`)||/one-time pass/i.test(a))&&(K=await promptLine(`This operation requires a one-time password.
819
+ Enter OTP: `),K||(ke.error(`gjsify login: no OTP entered.`),process.exit(1)),q=await putUser(``,K))}if(q.status===409){let n=await fetch(`${H}?write=true`,{headers:authHeaders(K)});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&&(q=await putUser(`/-rev/${W._rev}`,K))}}if(q.status===400&&(ke.error(`gjsify login: there is no user with the username "${N}" on ${C}.`),process.exit(1)),!q.ok){let n=await q.text().catch(()=>`<no body>`);ke.error(`gjsify login: ${q.status} ${q.statusText} from ${C}\n${n.slice(0,400)}`),process.exit(1)}let Y=await q.json().catch(()=>({}));Y.token||(ke.error("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`."),process.exit(1));let X=writeAuthToken(C,Y.token),te=(await whoami(C,await loadNpmrc(process.cwd()))).username??N;n.json?process.stdout.write(`${JSON.stringify({username:te,registry:C})}\n`):process.stdout.write(`Logged in as ${te} on ${C}\n(token written to ${X})\n`)}}}),uN,dN=__esmMin(()=>{mM(),QM(),rN(),uN={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: ${pM} (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)??pM,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{}}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 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:[fN]}]}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 fN,pN=__esmMin(()=>{YM(),fN=`createPackage`});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)}function firstLine(n){return n.split(`
820
+ `)[0].slice(0,200)}var mN,hN=__esmMin(()=>{Ae(),nC(),Jc(),ls(),mM(),Ng(),QM(),sN(),pN(),mN={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 ${pM}).`,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);hasAnyCredential(S)||(ke.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??pM;if(n[`dry-run`]!==!0){let n;try{n=await whoami(C,S)}catch(n){let a=n instanceof Error?n.message:String(n);ke.error(`gjsify trust: npm auth check failed (${a}).\nYour ~/.npmrc token is dead or revoked — refresh it with \`npm login\`, then re-run.
821
+ (\`gjsify trust\` uses the ~/.npmrc bearer token directly — unlike \`npm trust\`, which logs in via the browser.)`),process.exit(1);return}n.username||(ke.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)),ke.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)}N||(ke.error("gjsify trust: could not determine the GitHub repository.\nPass --repository owner/repo (no `origin` remote to infer from)."),process.exit(1)),validateRepository(N)||(ke.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=Qo(a,`.github`,`workflows`,F);existsSync(q)||ke.warn(`gjsify trust: note — ${q} not found; configuring trust for "${F}" anyway.`);let Y=filterWorkspaces(discoverWorkspaces(a,{includeRoot:!0}),{noPrivate:n.private!==!0,include:n.packages&&n.packages.length>0?n.packages:void 0}).filter(n=>n.name);Y.length===0&&(ke.error(`gjsify trust: no publishable workspace packages matched.`),process.exit(1)),ke.log(`gjsify trust: ${Y.length} package(s) | repo=${N} workflow=${F}`),W&&ke.log(`(dry-run — nothing will be written)`),ke.log();let X=n.otp,request=async(n,a,C)=>{let doFetch=async N=>{let F=buildHeaders(a,{npmrc:S});return F.accept=`application/json`,C!==void 0&&(F[`content-type`]=`application/json`),N&&(F[`npm-otp`]=N),fetch(a,{method:n,headers:F,body:C===void 0?void 0:JSON.stringify(C)})},N=await doFetch();if(await isOtpChallenge(N)){let n=X;if(X=void 0,n||=await promptLine(`This operation requires a one-time password.
822
+ Enter OTP: `),n||(ke.error(`gjsify trust: no OTP entered.`),process.exit(1)),N=await doFetch(n),await isOtpChallenge(N)){let n=await promptLine(`OTP rejected (expired?) — enter a fresh code: `);n||(ke.error(`gjsify trust: no OTP entered.`),process.exit(1)),N=await doFetch(n)}}let F=await N.text().catch(()=>``),I;try{I=F?JSON.parse(F):void 0}catch{}return{status:N.status,json:I,text:F}},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)??pM,C);process.stdout.write(`→ ${C.padEnd(42)} `);let Y=await request(`GET`,q),X=classifyTrustList(Y.status,Y.json,{repository:N,workflow:F});if(H){X===`trusted`?ke.log(`trusted`):X===`unpublished`?ke.log(`unpublished`):X===`auth-required`?ke.log(`auth-required (could not read)`):X===`untrusted`?ke.log(`not trusted`):ke.log(`error (HTTP ${Y.status})`);continue}if(X===`trusted`&&!K){ke.log(`already configured — skip`),ne++;continue}if(X===`unpublished`){ke.log(`not on npm yet — needs first-publish, skip`),re++,ae.push(C);continue}if(W){ke.log(`would configure`),te++;continue}let Z=await request(`POST`,q,githubTrustBody({repository:N,workflow:F,environment:I}));Z.status>=200&&Z.status<300?(ke.log(`configured`),te++):Z.status===409?(ke.log(`already configured (409) — done`),ne++):Z.status===404?(ke.log(`not on npm yet — needs first-publish, skip`),re++,ae.push(C)):(ke.log(`FAILED (HTTP ${Z.status})`),ie++,oe.push(`${C} — HTTP ${Z.status}${Z.text?`: ${firstLine(Z.text)}`:``}`))}if(!H){if(ke.log(),ke.log(`Done: ${te} ${W?`would-configure`:`configured`}, ${ne} already-configured, ${re} unpublished, ${ie} failed.`),ae.length>0){ke.log("Need a first publish before they can be trust-configured (then re-run `gjsify trust`):");for(let n of ae)ke.log(` ${n}`)}if(oe.length>0){ke.log("Failed (re-run `gjsify trust` — it is incremental; usually a lapsed 2FA window or rate-limit):");for(let n of oe)ke.log(` ${n}`);process.exit(1)}}}}});function readCurrentVersion(){try{let n=process.env.GJSIFY_CLI_PACKAGE_JSON;if(n){let a=JSON.parse(readFileSync(n,`utf-8`));return a.name===gN&&typeof a.version==`string`?a.version:null}let a=ts(Yo(fileURLToPath(import.meta.url)));for(let n=0;n<8&&a!==ts(a);n++){let n=Qo(a,`package.json`);if(existsSync(n)){let a=JSON.parse(readFileSync(n,`utf-8`));if(a.name===gN&&typeof a.version==`string`)return a.version}a=ts(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 gN,_N,vN=__esmMin(()=>{Ae(),Jc(),ls(),fn(),mM(),jM(),PM(),gN=`@gjsify/cli`,_N={command:`self-update`,description:`Update the installed ${gN} 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=Qo(Qo(a.prefix,`node_modules`,gN),`package.json`),C=readCurrentVersion(),N=existsSync(S);ke.log(`Current ${gN}: v${C??`(unknown)`}`),N||ke.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`),ke.log(`Fetching dist-tags for ${gN}@${n.tag} ...`);let F;try{F=await fetchPackument(gN)}catch(n){let a=n instanceof Error?n.message:String(n);ke.error(`Failed to fetch packument: ${a}`),process.exit(1);return}let I=resolveTag(F,n.tag);if(!I){ke.error(`Unknown dist-tag '${n.tag}' on ${gN}. Known tags: ${Object.keys(F[`dist-tags`]??{}).join(`, `)||`(none)`}`),process.exit(1);return}if(ke.log(`Latest matching --tag ${n.tag}: v${I}`),C===I&&!n.force){ke.log(`Already up to date (v${I}).`),n.check||ke.log(`Run with --force to reinstall anyway.`);return}if(n.check){ke.log(C?`Update available: v${C} → v${I}`:`Install required: → v${I}`),process.exit(1);return}let H=!n.skipDeps,W=H?` + runtime dependencies`:` (bundle only)`;ke.log(`Installing ${gN}@${I}${W} ...`);try{await installPackages({prefix:a.prefix,specs:[`${gN}@${I}`],verbose:!1,skipDeps:!H})}catch(n){let a=n instanceof Error?n.message:String(n);ke.error(`self-update: install failed — ${a}`),ke.error("Re-run `gjsify self-update` to retry."),process.exit(1);return}let K=linkGlobalBins([gN],a);if(K.length===0)ke.warn("self-update: install completed but no bins were linked — package.json may be missing a `bin` field.");else for(let n of K)ke.log(` • ${n.link} → ${n.target}`);ke.log(`\nUpdated ${gN} to v${I}.`),H?ke.log(`Runtime dependencies were resolved alongside the bundle.`):ke.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 yN,bN,xN=__esmMin(()=>{Ae(),Jc(),ls(),yN=`https://github.com/gjsify/gjsify/releases/latest/download/cli.gjs.mjs`,bN={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=Yo(process.cwd(),n.output);if(existsSync(a)&&!n.force){ke.error(`${n.output} already exists. Re-run with --force to overwrite.`),process.exit(1);return}let S=Yo(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){ke.error("No target package: pass `gjsify generate-installer <pkg>` or run inside a directory with a package.json."),process.exit(1);return}let F=n[`bin-name`]??pickDefaultBinName(C,N),I=n[`bootstrap-url`]??yN;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}),ke.log(`Wrote ${n.output} (target=${N}, bin=${F}).`),ke.log(``),ke.log(`Install one-liner for your README:`),ke.log(` curl -fsSL https://github.com/<you>/<repo>/raw/main/${n.output} -o /tmp/i.mjs \\`),ke.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=Qo(n,F);try{if(!statSync(N).isFile())continue;let n=readFileSync(N,`utf-8`);if(!n.startsWith(`#!/bin/sh`))continue;let S=n.split(`
823
+ `).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&&ke.warn(` ? could not inspect ${N}: ${n.message}`)}}return C}var SN,CN=__esmMin(()=>{Ae(),Jc(),ls(),PM(),SN={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){ke.error("gjsify uninstall currently only supports --global. For project-local removal, edit package.json + re-run `gjsify install`."),process.exit(1);return}let a=defaultGlobalLayout(),S=n[`dry-run`]??!1,C=n.verbose??!1,N=`gjsify uninstall${S?` (dry-run)`:``} --global`;ke.log(`${N} ← ${a.prefix}`),ke.log(`${` `.repeat(N.length)} bins ← ${a.binDir}`);let F=!1;for(let N of n.packages){let n=specToPackageName(N),I=Qo(a.prefix,`node_modules`,n);if(!existsSync(I)){ke.warn(` ✗ ${n} — not installed at ${I}`);continue}let H=findBinShimsForPackage(a.binDir,I,C);if(S){ke.log(` • would remove ${I}`);for(let n of H)ke.log(` • would remove ${n}`)}else{rmSync(I,{recursive:!0,force:!0}),ke.log(` • removed ${I}`);for(let n of H)unlinkSync(n),ke.log(` • removed ${n}`)}F=!0}F||(ke.error(`
824
+ No packages removed.`),process.exit(1))}}});function handleInit({cwd:n,force:a}){let writeOne=(S,C)=>{let N=Yo(n,S);if(existsSync(N)&&!a){ke.log(`[gjsify format] ${S} exists at ${N} — pass --force to overwrite.`);return}writeFileSync(N,C,`utf-8`),ke.log(`[gjsify format] wrote ${N}`)};writeOne(`.oxlintrc.json`,loadOxlintTemplate()),writeOne(`.oxfmtrc.json`,loadOxfmtTemplate()),ke.log("[gjsify format] Run `gjsify format --write .` to apply the formatter to the project.")}var wN,TN=__esmMin(()=>{Ae(),Jc(),ls(),kj(),wN={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`,Yo(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}}}}),EN,DN=__esmMin(()=>{ls(),kj(),EN={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`,Yo(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}}}}),ON,kN=__esmMin(()=>{ls(),kj(),ON={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`,Yo(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`,Yo(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,AN=__esmMin(()=>{Ic(),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 jN=__esmMin(()=>{fM()});function discoverContext(n){let a=findWorkspaceRoot(n);if(a)return{root:a,workspaces:discoverWorkspaces(a,{includeRoot:!0}),isMonorepo:!0};let S=Qo(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 NN){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){ke.log(`gjsify upgrade --check: OK. ${n.length} dep(s) consistently declared across workspaces.`);return}ke.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)}ke.error(` ${PN.bold}${n.name}${PN.reset}`);for(let[n,S]of a.entries())ke.error(` ${n.padEnd(16)} — ${S.join(`, `)}`)}ke.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){ke.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){ke.log(`gjsify upgrade --align: inconsistencies present but no parseable target version. No-op.`);return}ke.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??`^`;ke.log(` ${n.name.padEnd(28)} ranges: ${[...n.declaredRanges].join(`, `)} → ${a}${n.latestVersion}`)}if(a.dryRun){ke.log(`
825
+ [gjsify upgrade --align] --dry-run: no files changed.`);return}let N=applyToFiles(C);ke.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&&ke.warn(` ${H.name}: no dist-tags.latest, skipping`);continue}let F=H.highestVersion;if(!F){S&&ke.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&&ke.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 PN.red;case`minor`:return PN.yellow;case`patch`:return PN.green;case`prerelease`:return PN.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)+PN.bold+`name`.padEnd(a)+` `+`fan`.padEnd(S)+` `+`declared`.padEnd(C)+` `+`latest`.padEnd(N)+` kind`+PN.reset;ke.log(I),ke.log(` `.repeat(F+2)+PN.dim+`─`.repeat(a+S+C+N+16)+PN.reset);for(let I=0;I<n.length;I++){let H=n[I],W=`${I+1}.`.padEnd(F),K=H.declaredRanges.size>1?`${PN.magenta}⚠ ${PN.reset}`:` `,q=colorForDiff(H.diff);ke.log(W+K+H.name.padEnd(a)+` `+PN.dim+`${H.occurrences.length}`.padEnd(S)+PN.reset+` `+PN.dim+renderDeclaredCell(H).padEnd(C)+PN.reset+` `+q+H.latestVersion.padEnd(N)+PN.reset+` `+q+H.diff+PN.reset)}let H=n.filter(n=>n.declaredRanges.size>1).length;H>0&&ke.log(`\n${PN.magenta}⚠${PN.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)ke.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 ke.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{ke.log(`
826
+ Select upgrades: comma- or space-separated indices, `+PN.bold+`a`+PN.reset+` for all, ranges like `+PN.bold+`1-3`+PN.reset+`, or `+PN.bold+`ENTER`+PN.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=Qo(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(`
825
827
  `)?`
826
- `:``),`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:pM,scopes:{},authTokens:{},basicAuth:{}};for(let S of[Qo(homedir(),`.npmrc`),Qo(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 ON,kN,AN,jN=__esmMin(()=>{Ae(),Jc(),ls(),Vp(),EN(),fM(),mM(),Ng(),Pg(),DN(),ON={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(Yo(n.cwd??process.cwd())),S=applyWorkspaceFilter(a.workspaces,n.workspace,n.excludeWorkspace);if(S.length===0){ke.log(`[gjsify upgrade] no matching workspaces.`);return}let C=collectAllDeclarations(S,parseFilterList(n.filter));if(C.length===0){ke.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`;ke.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){ke.log(`✅ all dependencies are up to date`);let n=findInconsistencies(N);n.length>0&&ke.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`&&ke.log(`[gjsify upgrade] -y / --yes: selecting all`),W=H),W.length===0){ke.log(`[gjsify upgrade] nothing selected; no files changed.`);return}if(n.dryRun){let n=uniqueLocations(W).length;ke.log(`[gjsify upgrade] --dry-run: would update ${W.length} deps across ${n} package.json file(s).`),printChangePlan(W);return}let K=applyToFiles(W);ke.log(`✏️ updated ${W.length} dep(s) across ${K} package.json file(s). Run \`gjsify install\` to apply.`)}},kN=[`dependencies`,`devDependencies`,`optionalDependencies`,`peerDependencies`],AN={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=Yo(n.baseDir,F),H=ns(I)===`types`,W;try{W=(await readdir$1(I,{withFileTypes:!0})).filter(n=>n.isFile()).filter(n=>NN.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&&ke.error(`[gjsify barrels] skip ${I}: ${a.message}`);continue}let K=W.map(n=>{let N=ns(n.name,rs(n.name));return`${H?`export type *`:`export *`} from ${a}./${N}${C}${a}${S}`}),q=K.length?`${K.join(`
828
+ `:``),`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:pM,scopes:{},authTokens:{},basicAuth:{}};for(let S of[Qo(homedir(),`.npmrc`),Qo(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 MN,NN,PN,FN=__esmMin(()=>{Ae(),Jc(),ls(),Vp(),AN(),fM(),mM(),Ng(),Pg(),jN(),MN={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(Yo(n.cwd??process.cwd())),S=applyWorkspaceFilter(a.workspaces,n.workspace,n.excludeWorkspace);if(S.length===0){ke.log(`[gjsify upgrade] no matching workspaces.`);return}let C=collectAllDeclarations(S,parseFilterList(n.filter));if(C.length===0){ke.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`;ke.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){ke.log(`✅ all dependencies are up to date`);let n=findInconsistencies(N);n.length>0&&ke.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`&&ke.log(`[gjsify upgrade] -y / --yes: selecting all`),W=H),W.length===0){ke.log(`[gjsify upgrade] nothing selected; no files changed.`);return}if(n.dryRun){let n=uniqueLocations(W).length;ke.log(`[gjsify upgrade] --dry-run: would update ${W.length} deps across ${n} package.json file(s).`),printChangePlan(W);return}let K=applyToFiles(W);ke.log(`✏️ updated ${W.length} dep(s) across ${K} package.json file(s). Run \`gjsify install\` to apply.`)}},NN=[`dependencies`,`devDependencies`,`optionalDependencies`,`peerDependencies`],PN={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=Yo(n.baseDir,F),H=ns(I)===`types`,W;try{W=(await readdir$1(I,{withFileTypes:!0})).filter(n=>n.isFile()).filter(n=>LN.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&&ke.error(`[gjsify barrels] skip ${I}: ${a.message}`);continue}let K=W.map(n=>{let N=ns(n.name,rs(n.name));return`${H?`export type *`:`export *`} from ${a}./${N}${C}${a}${S}`}),q=K.length?`${K.join(`
827
829
  `)}\n`:`export {};
828
- `,Y=`${n.header}\n\n${q}`,X=Qo(I,`index.ts`);if(await readFile$1(X,`utf-8`).catch(()=>``)===Y){n.verbose&&ke.log(`[gjsify barrels] up-to-date: ${X}`);continue}n.check?(ke.error(`[gjsify barrels] drift: ${X}`),N++):(await writeFile$1(X,Y,`utf-8`),n.verbose&&ke.log(`[gjsify barrels] wrote: ${X}`))}return N}var MN,NN,PN=__esmMin(()=>{Ae(),Tc(),ls(),MN=[`\\.test\\.`,`\\.spec\\.`,`\\.test-data\\.`],NN=/\.(ts|tsx|mts|cts)$/}),FN,IN=__esmMin(()=>{Ae(),PN(),FN={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){ke.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:[...MN],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&&(ke.error(`[gjsify barrels] ${C} barrel file(s) drifted. Run without --check to fix.`),process.exitCode=1)}}}),LN,RN=__esmMin(()=>{Ae(),nC(),zo(),ls(),fn(),RA(),Pg(),LN={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=Qo(ts(createRequire(n).resolve(`typescript/package.json`)),`lib`,`tsc.js`);break}catch{}!I&&!H&&(ke.error("gjsify tsc: neither @gjsify/tsc (GJS bundle) nor npm `typescript` (Node) is installed."),ke.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=>{ke.error(`gjsify tsc (node typescript): ${n.message}`),process.exit(1)})};if(I){let n=spawn(`gjs`,[`-m`,I,...C],{env:K,stdio:`inherit`});await new Promise(a=>{n.on(`close`,n=>{process.exit(n??1)}),n.on(`error`,n=>{n.code===`ENOENT`&&H?runNodeTsc():n.code===`ENOENT`?(ke.error("gjsify tsc: `gjs` not found on PATH and no npm `typescript` fallback."),ke.error(" Install GJS (e.g. `dnf install gjs`), or add `typescript` to the project."),process.exit(1)):(ke.error(`gjsify tsc: ${n.message}`),process.exit(1))})})}else runNodeTsc()}}});function classifyAndExpand(n,a,S){let C=S.map(n=>n.replace(/\\/g,`/`)).filter(n=>n.length>0);if(C.length===0)return{global:!1,reason:`empty-diff`,workspaces:[],runE2E:!1,runIntegration:!1,skipAll:!0};let N=[];for(let n of C)VN.some(a=>a.test(n))||N.push(n);if(N.length===0)return{global:!1,reason:`ignored-only`,workspaces:[],runE2E:!1,runIntegration:!1,skipAll:!0};for(let a of N)for(let S of BN)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:F,unmatched:I}=workspacesForChangedFiles(n,a,N);if(I.length>0)return{global:!0,reason:`unmatched files (${I.length}): ${I.slice(0,3).join(`, `)}${I.length>3?`…`:``}`,workspaces:n.map(n=>n.name),runE2E:!0,runIntegration:!0,skipAll:!1};if(N.every(n=>HN.some(a=>a.test(n)))&&F.size===1){let n=[...F][0],a=N.some(n=>n.startsWith(`tests/e2e/`)),S=N.some(n=>n.startsWith(`tests/integration/`));return{global:!1,reason:`test-only (${N.length} file(s) in ${n})`,workspaces:[n],runE2E:a,runIntegration:S||isIntegrationWorkspace(n),skipAll:!1}}let H=affectedClosure(buildReverseDependencyGraph(n,{includeDev:!0}),[...F]),W=buildDependencyGraph(n,{includeDev:!0}),K=!1;for(let[n,a]of W.edges)if(isIntegrationWorkspace(n)){for(let S of a)if(H.has(S)){H.add(n),K=!0;break}}let q=N.some(n=>n.startsWith(`tests/e2e/`));return{global:!1,reason:`closure (${H.size} ws from ${F.size} seed(s))`,workspaces:[...H].sort(),runE2E:q,runIntegration:K,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`});return C.status!==0&&(process.stderr.write(`gjsify affected: git diff failed (${C.status}): ${C.stderr.trim()}\n`),process.exit(2)),C.stdout.split(`
830
+ `,Y=`${n.header}\n\n${q}`,X=Qo(I,`index.ts`);if(await readFile$1(X,`utf-8`).catch(()=>``)===Y){n.verbose&&ke.log(`[gjsify barrels] up-to-date: ${X}`);continue}n.check?(ke.error(`[gjsify barrels] drift: ${X}`),N++):(await writeFile$1(X,Y,`utf-8`),n.verbose&&ke.log(`[gjsify barrels] wrote: ${X}`))}return N}var IN,LN,RN=__esmMin(()=>{Ae(),Tc(),ls(),IN=[`\\.test\\.`,`\\.spec\\.`,`\\.test-data\\.`],LN=/\.(ts|tsx|mts|cts)$/}),zN,BN=__esmMin(()=>{Ae(),RN(),zN={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){ke.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:[...IN],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&&(ke.error(`[gjsify barrels] ${C} barrel file(s) drifted. Run without --check to fix.`),process.exitCode=1)}}}),VN,HN=__esmMin(()=>{Ae(),nC(),zo(),ls(),fn(),RA(),Pg(),VN={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=Qo(ts(createRequire(n).resolve(`typescript/package.json`)),`lib`,`tsc.js`);break}catch{}!I&&!H&&(ke.error("gjsify tsc: neither @gjsify/tsc (GJS bundle) nor npm `typescript` (Node) is installed."),ke.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=>{ke.error(`gjsify tsc (node typescript): ${n.message}`),process.exit(1)})};if(I){let n=spawn(`gjs`,[`-m`,I,...C],{env:K,stdio:`inherit`});await new Promise(a=>{n.on(`close`,n=>{process.exit(n??1)}),n.on(`error`,n=>{n.code===`ENOENT`&&H?runNodeTsc():n.code===`ENOENT`?(ke.error("gjsify tsc: `gjs` not found on PATH and no npm `typescript` fallback."),ke.error(" Install GJS (e.g. `dnf install gjs`), or add `typescript` to the project."),process.exit(1)):(ke.error(`gjsify tsc: ${n.message}`),process.exit(1))})})}else runNodeTsc()}}});function classifyAndExpand(n,a,S){let C=S.map(n=>n.replace(/\\/g,`/`)).filter(n=>n.length>0);if(C.length===0)return{global:!1,reason:`empty-diff`,workspaces:[],runE2E:!1,runIntegration:!1,skipAll:!0};let N=[];for(let n of C)GN.some(a=>a.test(n))||N.push(n);if(N.length===0)return{global:!1,reason:`ignored-only`,workspaces:[],runE2E:!1,runIntegration:!1,skipAll:!0};for(let a of N)for(let S of WN)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:F,unmatched:I}=workspacesForChangedFiles(n,a,N);if(I.length>0)return{global:!0,reason:`unmatched files (${I.length}): ${I.slice(0,3).join(`, `)}${I.length>3?`…`:``}`,workspaces:n.map(n=>n.name),runE2E:!0,runIntegration:!0,skipAll:!1};if(N.every(n=>KN.some(a=>a.test(n)))&&F.size===1){let n=[...F][0],a=N.some(n=>n.startsWith(`tests/e2e/`)),S=N.some(n=>n.startsWith(`tests/integration/`));return{global:!1,reason:`test-only (${N.length} file(s) in ${n})`,workspaces:[n],runE2E:a,runIntegration:S||isIntegrationWorkspace(n),skipAll:!1}}let H=affectedClosure(buildReverseDependencyGraph(n,{includeDev:!0}),[...F]),W=buildDependencyGraph(n,{includeDev:!0}),K=!1;for(let[n,a]of W.edges)if(isIntegrationWorkspace(n)){for(let S of a)if(H.has(S)){H.add(n),K=!0;break}}let q=N.some(n=>n.startsWith(`tests/e2e/`));return{global:!1,reason:`closure (${H.size} ws from ${F.size} seed(s))`,workspaces:[...H].sort(),runE2E:q,runIntegration:K,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`});return C.status!==0&&(process.stderr.write(`gjsify affected: git diff failed (${C.status}): ${C.stderr.trim()}\n`),process.exit(2)),C.stdout.split(`
829
831
  `).filter(Boolean)}function readStdinLines(){return readFileSync(0,`utf8`).split(`
830
832
  `).map(n=>n.trim()).filter(Boolean)}function emit(n,a){if(n===`json`){process.stdout.write(JSON.stringify(a)+`
831
833
  `);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 '${escSingleQuote(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){let{appendFileSync:n}=(Jc(),__toCommonJS(Gc));for(let a of C)n(S,`${a}\n`)}else for(let n of C)process.stdout.write(`${n}\n`);return}process.stdout.write(`affected:
832
- `),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 escSingleQuote(n){return n.replace(/'/g,`'\\''`)}var zN,BN,VN,HN,UN=__esmMin(()=>{nC(),Jc(),Ng(),Pg(),zN={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}),a,n[`changed-from-stdin`]?readStdinLines():runGitDiff(a,n.base??`origin/main`,n.head??`HEAD`));emit(n.format,S)}},BN=[/^packages\/infra\/workspace\//,/^packages\/infra\/cli\//,/^packages\/infra\/rolldown-plugin-gjsify\//,/^packages\/infra\/resolve-npm\//,/^gjsify-lock\.json$/,/^package\.json$/,/^tsconfig[^/]*\.json$/,/^\.github\/workflows\/main\.yml$/,/^scripts\/audit-runtimes\.mjs$/],VN=[/\.md$/i,/^refs\//,/^website\//,/^docs\//,/^\.github\/workflows\/(deploy-docs|commitlint|release|audit-runtimes|prebuilds)\.yml$/,/^\.githooks\//,/^flatpak\//,/^LICENSE/,/^\.gitignore$/,/^\.gjsify-[^/]*\.md$/,/^STATUS\.md$/,/^CHANGELOG\.md$/,/^AGENTS\.md$/,/^CLAUDE\.md$/,/^README\.md$/],HN=[/\.spec\.[mc]?[tj]sx?$/,/^tests\/(e2e|integration)\//]}),WN=__esmMin(()=>{LA(),VA(),WA(),KA(),$A(),nj(),aj(),mj(),_j(),bj(),Cj(),$j(),NM(),LM(),HM(),WM(),JM(),eN(),nN(),lN(),dN(),mN(),_N(),yN(),xN(),CN(),TN(),jN(),IN(),RN(),UN()}),GN=__exportAll$3({runCli:()=>runCli});function runtimeLabel(){try{let n=globalThis.imports?.system;if(n?.version!==void 0){let a=Number(n.version);return`GJS ${Math.floor(a/1e4)}.${Math.floor(a%1e4/100)}.${a%100} (SpiderMonkey)`}}catch{}return typeof process<`u`&&typeof process.versions?.node==`string`?`Node.js ${process.version}`:`unknown runtime`}function readBundleVersion(){try{let n=ts(fileURLToPath(import.meta.url)),a=JSON.parse(readFileSync(Qo(n,`..`,`package.json`),`utf8`));return typeof a.version==`string`?a.version:`unknown`}catch{return`unknown`}}async function runCli(n){let a=Jd(n);await a.scriptName(Xd).version(readBundleVersion()).strict().wrap(a.terminalWidth()).command(pj.command,pj.description,pj.builder,pj.handler).command(IM.command,IM.description,IM.builder,IM.handler).command(IA.command,IA.description,IA.builder,IA.handler).command(BA.command,BA.description,BA.builder,BA.handler).command(UA.command,UA.description,UA.builder,UA.handler).command(MM.command,MM.description,MM.builder,MM.handler).command(GA.command,GA.description,GA.builder,GA.handler).command(QA.command,QA.description,QA.builder,QA.handler).command(tj.command,tj.description,tj.builder,tj.handler).command(ij.command,ij.description,ij.builder,ij.handler).command(gj.command,gj.description,gj.builder,gj.handler).command(yj.command,yj.description,yj.builder,yj.handler).command(Sj.command,Sj.description,Sj.builder,Sj.handler).command(Qj.command,Qj.description,Qj.builder,Qj.handler).command(VM.command,VM.description,VM.builder,VM.handler).command(UM.command,UM.description,UM.builder,UM.handler).command(KM.command,KM.description,KM.builder,KM.handler).command($M.command,$M.description,$M.builder,$M.handler).command(tN.command,tN.description,tN.builder,tN.handler).command(cN.command,cN.description,cN.builder,cN.handler).command(uN.command,uN.description,uN.builder,uN.handler).command(pN.command,pN.description,pN.builder,pN.handler).command(gN.command,gN.description,gN.builder,gN.handler).command(vN.command,vN.description,vN.builder,vN.handler).command(ON.command,ON.description,ON.builder,ON.handler).command(bN.command,bN.description,bN.builder,bN.handler).command(SN.command,SN.description,SN.builder,SN.handler).command(wN.command,wN.description,wN.builder,wN.handler).command(FN.command,FN.description,FN.builder,FN.handler).command(LN.command,LN.description,LN.builder,LN.handler).command(zN.command,zN.description,zN.builder,zN.handler).demandCommand(1).epilogue(`Running on ${runtimeLabel()}`).help().parseAsync()}var KN=__esmMin(()=>{Jc(),ls(),fn(),Yd(),WN(),Zd()});KN(),await runCli(hideBin(process.argv));
834
+ `),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 escSingleQuote(n){return n.replace(/'/g,`'\\''`)}var UN,WN,GN,KN,qN=__esmMin(()=>{nC(),Jc(),Ng(),Pg(),UN={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}),a,n[`changed-from-stdin`]?readStdinLines():runGitDiff(a,n.base??`origin/main`,n.head??`HEAD`));emit(n.format,S)}},WN=[/^packages\/infra\/workspace\//,/^packages\/infra\/cli\//,/^packages\/infra\/rolldown-plugin-gjsify\//,/^packages\/infra\/resolve-npm\//,/^gjsify-lock\.json$/,/^package\.json$/,/^tsconfig[^/]*\.json$/,/^\.github\/workflows\/main\.yml$/,/^scripts\/audit-runtimes\.mjs$/],GN=[/\.md$/i,/^refs\//,/^website\//,/^docs\//,/^\.github\/workflows\/(deploy-docs|commitlint|release|audit-runtimes|prebuilds)\.yml$/,/^\.githooks\//,/^flatpak\//,/^LICENSE/,/^\.gitignore$/,/^\.gjsify-[^/]*\.md$/,/^STATUS\.md$/,/^CHANGELOG\.md$/,/^AGENTS\.md$/,/^CLAUDE\.md$/,/^README\.md$/],KN=[/\.spec\.[mc]?[tj]sx?$/,/^tests\/(e2e|integration)\//]}),JN=__esmMin(()=>{LA(),VA(),WA(),KA(),$A(),nj(),aj(),mj(),_j(),bj(),Cj(),$j(),NM(),LM(),HM(),WM(),JM(),eN(),nN(),lN(),dN(),hN(),vN(),xN(),CN(),TN(),DN(),kN(),FN(),BN(),HN(),qN()}),YN=__exportAll$3({runCli:()=>runCli});function runtimeLabel(){try{let n=globalThis.imports?.system;if(n?.version!==void 0){let a=Number(n.version);return`GJS ${Math.floor(a/1e4)}.${Math.floor(a%1e4/100)}.${a%100} (SpiderMonkey)`}}catch{}return typeof process<`u`&&typeof process.versions?.node==`string`?`Node.js ${process.version}`:`unknown runtime`}function readBundleVersion(){try{let n=ts(fileURLToPath(import.meta.url)),a=JSON.parse(readFileSync(Qo(n,`..`,`package.json`),`utf8`));return typeof a.version==`string`?a.version:`unknown`}catch{return`unknown`}}async function runCli(n){let a=Jd(n);await a.scriptName(Xd).version(readBundleVersion()).strict().wrap(a.terminalWidth()).command(pj.command,pj.description,pj.builder,pj.handler).command(IM.command,IM.description,IM.builder,IM.handler).command(IA.command,IA.description,IA.builder,IA.handler).command(BA.command,BA.description,BA.builder,BA.handler).command(UA.command,UA.description,UA.builder,UA.handler).command(MM.command,MM.description,MM.builder,MM.handler).command(GA.command,GA.description,GA.builder,GA.handler).command(QA.command,QA.description,QA.builder,QA.handler).command(tj.command,tj.description,tj.builder,tj.handler).command(ij.command,ij.description,ij.builder,ij.handler).command(gj.command,gj.description,gj.builder,gj.handler).command(yj.command,yj.description,yj.builder,yj.handler).command(Sj.command,Sj.description,Sj.builder,Sj.handler).command(Qj.command,Qj.description,Qj.builder,Qj.handler).command(VM.command,VM.description,VM.builder,VM.handler).command(UM.command,UM.description,UM.builder,UM.handler).command(KM.command,KM.description,KM.builder,KM.handler).command($M.command,$M.description,$M.builder,$M.handler).command(tN.command,tN.description,tN.builder,tN.handler).command(cN.command,cN.description,cN.builder,cN.handler).command(uN.command,uN.description,uN.builder,uN.handler).command(mN.command,mN.description,mN.builder,mN.handler).command(_N.command,_N.description,_N.builder,_N.handler).command(bN.command,bN.description,bN.builder,bN.handler).command(SN.command,SN.description,SN.builder,SN.handler).command(MN.command,MN.description,MN.builder,MN.handler).command(wN.command,wN.description,wN.builder,wN.handler).command(EN.command,EN.description,EN.builder,EN.handler).command(ON.command,ON.description,ON.builder,ON.handler).command(zN.command,zN.description,zN.builder,zN.handler).command(VN.command,VN.description,VN.builder,VN.handler).command(UN.command,UN.description,UN.builder,UN.handler).demandCommand(1).epilogue(`Running on ${runtimeLabel()}`).help().parseAsync()}var XN=__esmMin(()=>{Jc(),ls(),fn(),Yd(),JN(),Zd()});XN(),await runCli(hideBin(process.argv));