@gjsify/cli 0.4.19 → 0.4.20

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,8 +738,8 @@ var S=Object.getOwnPropertySymbols,C=Object.prototype.hasOwnProperty,N=Object.pr
738
738
  `+N:``)}function processStubPlugin(n={}){let a=composeBanner(`if(typeof globalThis.process==="undefined"){const _s=imports.system,_G=imports.gi.GLib;const _h=t=>t?[0,0]:[0,0];_h.bigint=()=>0n;globalThis.process={platform:"linux",arch:"x64",version:"v20.0.0",env:new Proxy({},{get(_,p){return typeof p==="string"?(_G.getenv(p)??undefined):undefined},set(_,p,v){if(typeof p==="string")_G.setenv(p,String(v),true);return true},has(_,p){return typeof p==="string"&&_G.getenv(p)!==null},deleteProperty(_,p){if(typeof p==="string")_G.unsetenv(p);return true},ownKeys(){return _G.listenv()??[]},getOwnPropertyDescriptor(_,p){const v=_G.getenv(p);return v!==null?{value:v,writable:true,enumerable:true,configurable:true}:undefined}}),argv:_s?.programArgs?["gjs",_s.programInvocationName||"",..._s.programArgs]:["gjs"],versions:{},config:{},cwd(){return _G.get_current_dir()||"/"},exit(c){_s.exit(c??0)},stderr:{write(s){printerr(s)}},stdout:{write(s){print(s)}},stdin:null,exitCode:undefined,nextTick(fn,...a){Promise.resolve().then(()=>fn(...a))},hrtime:_h,};}`,n.userBanner??``);return{name:`gjsify-process-stub`,renderChunk:{order:`post`,handler(n,S){return S.isEntry?{code:a+`
739
739
  `+n,map:null}:null}}}}var cT=__commonJSMin(((n,a)=>{let isLinux=()=>process.platform===`linux`,S=null,getReport=()=>{if(!S)if(isLinux()&&process.report){let n=process.report.excludeNetwork;process.report.excludeNetwork=!0,S=process.report.getReport(),process.report.excludeNetwork=n}else S={};return S};a.exports={isLinux,getReport}})),lT=__commonJSMin(((n,a)=>{let S=(zs(),__toCommonJS(Is)),C=2048,readFileSync=n=>{let a=S.openSync(n,`r`),N=Buffer.alloc(C),F=S.readSync(a,N,0,C,0);return S.close(a,()=>{}),N.subarray(0,F)},readFile=n=>new Promise((a,N)=>{S.open(n,`r`,(n,F)=>{if(n)N(n);else{let n=Buffer.alloc(C);S.read(F,n,0,C,0,(C,N)=>{a(n.subarray(0,N)),S.close(F,()=>{})})}})});a.exports={LDD_PATH:`/usr/bin/ldd`,SELF_PATH:`/proc/self/exe`,readFileSync,readFile}})),uT=__commonJSMin(((n,a)=>{let interpreterPath=n=>{if(n.length<64||n.readUInt32BE(0)!==2135247942||n.readUInt8(4)!==2||n.readUInt8(5)!==1)return null;let a=n.readUInt32LE(32),S=n.readUInt16LE(54),C=n.readUInt16LE(56);for(let N=0;N<C;N++){let C=a+N*S;if(n.readUInt32LE(C)===3){let a=n.readUInt32LE(C+8),S=n.readUInt32LE(C+32);return n.subarray(a,a+S).toString().replace(/\0.*$/g,``)}}return null};a.exports={interpreterPath}})),dT=__commonJSMin(((n,a)=>{let S=(vx(),__toCommonJS(hx)),{isLinux:C,getReport:N}=cT(),{LDD_PATH:F,SELF_PATH:I,readFile:H,readFileSync:W}=lT(),{interpreterPath:K}=uT(),q,Y,X,te=`getconf GNU_LIBC_VERSION 2>&1 || true; ldd --version 2>&1 || true`,ne=``,safeCommand=()=>ne||new Promise(n=>{S.exec(te,(a,S)=>{ne=a?` `:S,n(ne)})}),safeCommandSync=()=>{if(!ne)try{ne=S.execSync(te,{encoding:`utf8`})}catch{ne=` `}return ne},re=`glibc`,ie=/LIBC[a-z0-9 \-).]*?(\d+\.\d+)/i,ae=`musl`,isFileMusl=n=>n.includes(`libc.musl-`)||n.includes(`ld-musl-`),familyFromReport=()=>{let n=N();return n.header&&n.header.glibcVersionRuntime?re:Array.isArray(n.sharedObjects)&&n.sharedObjects.some(isFileMusl)?ae:null},familyFromCommand=n=>{let[a,S]=n.split(/[\r\n]+/);return a&&a.includes(re)?re:S&&S.includes(ae)?ae:null},familyFromInterpreterPath=n=>{if(n){if(n.includes(`/ld-musl-`))return ae;if(n.includes(`/ld-linux-`))return re}return null},getFamilyFromLddContent=n=>(n=n.toString(),n.includes(`musl`)?ae:n.includes(`GNU C Library`)?re:null),familyFromFilesystem=async()=>{if(Y!==void 0)return Y;Y=null;try{Y=getFamilyFromLddContent(await H(F))}catch{}return Y},familyFromFilesystemSync=()=>{if(Y!==void 0)return Y;Y=null;try{Y=getFamilyFromLddContent(W(F))}catch{}return Y},familyFromInterpreter=async()=>{if(q!==void 0)return q;q=null;try{q=familyFromInterpreterPath(K(await H(I)))}catch{}return q},familyFromInterpreterSync=()=>{if(q!==void 0)return q;q=null;try{q=familyFromInterpreterPath(K(W(I)))}catch{}return q},family=async()=>{let n=null;return C()&&(n=await familyFromInterpreter(),n||(n=await familyFromFilesystem(),n||=familyFromReport(),n||=familyFromCommand(await safeCommand()))),n},familySync=()=>{let n=null;return C()&&(n=familyFromInterpreterSync(),n||(n=familyFromFilesystemSync(),n||=familyFromReport(),n||=familyFromCommand(safeCommandSync()))),n},isNonGlibcLinux=async()=>C()&&await family()!==re,isNonGlibcLinuxSync=()=>C()&&familySync()!==re,versionFromFilesystem=async()=>{if(X!==void 0)return X;X=null;try{let n=(await H(F)).match(ie);n&&(X=n[1])}catch{}return X},versionFromFilesystemSync=()=>{if(X!==void 0)return X;X=null;try{let n=W(F).match(ie);n&&(X=n[1])}catch{}return X},versionFromReport=()=>{let n=N();return n.header&&n.header.glibcVersionRuntime?n.header.glibcVersionRuntime:null},versionSuffix=n=>n.trim().split(/\s+/)[1],versionFromCommand=n=>{let[a,S,C]=n.split(/[\r\n]+/);return a&&a.includes(re)?versionSuffix(a):S&&C&&S.includes(ae)?versionSuffix(C):null},version=async()=>{let n=null;return C()&&(n=await versionFromFilesystem(),n||=versionFromReport(),n||=versionFromCommand(await safeCommand())),n},versionSync=()=>{let n=null;return C()&&(n=versionFromFilesystemSync(),n||=versionFromReport(),n||=versionFromCommand(safeCommandSync())),n};a.exports={GLIBC:re,MUSL:ae,family,familySync,isNonGlibcLinux,isNonGlibcLinuxSync,version,versionSync}})),fT=__commonJSMin(((n,a)=>{let S={and_chr:`chrome`,and_ff:`firefox`,ie_mob:`ie`,op_mob:`opera`,and_qq:null,and_uc:null,baidu:null,bb:null,kaios:null,op_mini:null};function browserslistToTargets(n){let a={};for(let C of n){let[n,N]=C.split(` `);if(S[n]===null)continue;let F=parseVersion(N);F!=null&&(a[n]==null||F<a[n])&&(a[n]=F)}return a}function parseVersion(n){let[a,S=0,C=0]=n.split(`-`)[0].split(`.`).map(n=>parseInt(n,10));return isNaN(a)||isNaN(S)||isNaN(C)?null:a<<16|S<<8|C}a.exports=browserslistToTargets})),pT=__commonJSMin(((n,a)=>{function composeVisitors(n){if(n.length===1)return n[0];if(n.some(n=>typeof n==`function`))return a=>composeVisitors(n.map(n=>typeof n==`function`?n(a):n));let a={};return composeSimpleVisitors(a,n,`StyleSheet`),composeSimpleVisitors(a,n,`StyleSheetExit`),composeObjectVisitors(a,n,`Rule`,ruleVisitor,wrapCustomAndUnknownAtRule),composeObjectVisitors(a,n,`RuleExit`,ruleVisitor,wrapCustomAndUnknownAtRule),composeObjectVisitors(a,n,`Declaration`,declarationVisitor,wrapCustomProperty),composeObjectVisitors(a,n,`DeclarationExit`,declarationVisitor,wrapCustomProperty),composeSimpleVisitors(a,n,`Url`),composeSimpleVisitors(a,n,`Color`),composeSimpleVisitors(a,n,`Image`),composeSimpleVisitors(a,n,`ImageExit`),composeSimpleVisitors(a,n,`Length`),composeSimpleVisitors(a,n,`Angle`),composeSimpleVisitors(a,n,`Ratio`),composeSimpleVisitors(a,n,`Resolution`),composeSimpleVisitors(a,n,`Time`),composeSimpleVisitors(a,n,`CustomIdent`),composeSimpleVisitors(a,n,`DashedIdent`),composeArrayFunctions(a,n,`MediaQuery`),composeArrayFunctions(a,n,`MediaQueryExit`),composeSimpleVisitors(a,n,`SupportsCondition`),composeSimpleVisitors(a,n,`SupportsConditionExit`),composeArrayFunctions(a,n,`Selector`),composeTokenVisitors(a,n,`Token`,`token`,!1),composeTokenVisitors(a,n,`Function`,`function`,!1),composeTokenVisitors(a,n,`FunctionExit`,`function`,!0),composeTokenVisitors(a,n,`Variable`,`var`,!1),composeTokenVisitors(a,n,`VariableExit`,`var`,!0),composeTokenVisitors(a,n,`EnvironmentVariable`,`env`,!1),composeTokenVisitors(a,n,`EnvironmentVariableExit`,`env`,!0),a}a.exports=composeVisitors;function wrapCustomAndUnknownAtRule(n,a){return n===`unknown`?(n=>a({type:`unknown`,value:n})):n===`custom`?(n=>a({type:`custom`,value:n})):a}function wrapCustomProperty(n,a){return n===`custom`?(n=>a({property:`custom`,value:n})):a}function ruleVisitor(n,a){if(typeof n==`object`){if(a.type===`unknown`){let S=n.unknown;return typeof S==`object`&&(S=S[a.value.name]),S?.(a.value)}if(a.type===`custom`){let S=n.custom;return typeof S==`object`&&(S=S[a.value.name]),S?.(a.value)}return n[a.type]?.(a)}return n?.(a)}function declarationVisitor(n,a){if(typeof n==`object`){let S=a.property;if(a.property===`unparsed`)S=a.value.propertyId.property;else if(a.property===`custom`){let S=n.custom;return typeof S==`object`&&(S=S[a.value.name]),S?.(a.value)}return n[S]?.(a)}return n?.(a)}function extractObjectsOrFunctions(n,a){let S=[],C=!1,N=new Set;for(let F of n){let n=F[a];if(n){if(typeof n==`function`)C=!0;else for(let a in n)N.add(a);S.push(n)}}return[S,C,N]}function composeObjectVisitors(n,a,S,C,N){let[F,I,H]=extractObjectsOrFunctions(a,S);if(F.length===0)return;if(F.length===1){n[S]=F[0];return}let W=createArrayVisitor(a,(n,a)=>C(n[S],a));if(I)n[S]=W;else{let a={};for(let n of H)a[n]=N(n,W);n[S]=a}}function composeTokenVisitors(n,a,S,C,N){let[F,I,H]=extractObjectsOrFunctions(a,S);if(F.length===0)return;if(F.length===1){n[S]=F[0];return}let W=createTokenVisitor(a,C,N);if(I)n[S]=W;else{let a={};for(let n of H)a[n]=W;n[S]=a}}function createTokenVisitor(n,a,S){let C=createArrayVisitor(n,(n,a)=>{let C;switch(a.type){case`token`:C=n.Token,typeof C==`object`&&(C=C[a.value.type]);break;case`function`:C=S?n.FunctionExit:n.Function,typeof C==`object`&&(C=C[a.value.name]);break;case`var`:C=S?n.VariableExit:n.Variable;break;case`env`:if(C=S?n.EnvironmentVariableExit:n.EnvironmentVariable,typeof C==`object`){let n;switch(a.value.name.type){case`ua`:case`unknown`:n=a.value.name.value;break;case`custom`:n=a.value.name.ident;break}C=C[n]}break;case`color`:C=n.Color;break;case`url`:C=n.Url;break;case`length`:C=n.Length;break;case`angle`:C=n.Angle;break;case`time`:C=n.Time;break;case`resolution`:C=n.Resolution;break;case`dashed-ident`:C=n.DashedIdent;break}if(!C)return;let N=C(a.value);switch(a.type){case`color`:case`url`:case`length`:case`angle`:case`time`:case`resolution`:case`dashed-ident`:Array.isArray(N)?N=N.map(n=>({type:a.type,value:n})):N&&={type:a.type,value:N};break}return N});return n=>C({type:a,value:n})}function extractFunctions(n,a){let S=[];for(let C of n){let n=C[a];n&&S.push(n)}return S}function composeSimpleVisitors(n,a,S){let C=extractFunctions(a,S);if(C.length!==0){if(C.length===1){n[S]=C[0];return}n[S]=n=>{let a=!1;for(let S of C){let C=S(n);C&&(n=C,a=!0)}return a?n:void 0}}}function composeArrayFunctions(n,a,S){let C=extractFunctions(a,S);if(C.length!==0){if(C.length===1){n[S]=C[0];return}n[S]=createArrayVisitor(C,(n,a)=>n(a))}}function createArrayVisitor(n,a){let S=new Bitset(n.length);return C=>{let N=[C],F=!1;S.clear();for(let C=0;C<N.length;C++)for(let I=0;I<n.length&&C<N.length;){if(S.get(I)){I++;continue}let H=N[C],W=n[I],K=a(W,H);Array.isArray(K)?(K.length===0?N.splice(C,1):K.length===1?N[C]=K[0]:N.splice(C,1,...K),F=!0,S.set(I),I=0):K?(N[C]=K,F=!0,S.set(I),I=0):I++}if(F)return N.length===1?N[0]:N}}var Bitset=class{constructor(n=32){this.bits=0,this.more=n>32?new Uint32Array(Math.ceil((n-32)/32)):null}get(n){if(n>=32&&this.more){let a=Math.floor((n-32)/32),S=n%32;return!!(this.more[a]&1<<S)}else return!!(this.bits&1<<n)}set(n){if(n>=32&&this.more){let a=Math.floor((n-32)/32),S=n%32;this.more[a]|=1<<S}else this.bits|=1<<n}clear(){this.bits=0,this.more&&this.more.fill(0)}}})),mT=__commonJSMin((n=>{n.Features={Nesting:1,NotSelectorList:2,DirSelector:4,LangSelectorList:8,IsSelector:16,TextDecorationThicknessPercent:32,MediaIntervalSyntax:64,MediaRangeSyntax:128,CustomMediaQueries:256,ClampFunction:512,ColorFunction:1024,OklabColors:2048,LabColors:4096,P3Colors:8192,HexAlphaColors:16384,SpaceSeparatedColorNotation:32768,FontFamilySystemUi:65536,DoublePositionGradients:131072,VendorPrefixes:262144,LogicalProperties:524288,LightDark:1048576,Selectors:31,MediaQueries:448,Colors:1113088}})),hT=__commonJSMin(((n,a)=>{let S=[process.platform,process.arch];if(process.platform===`linux`){let{MUSL:n,familySync:a}=dT();a()===n?S.push(`musl`):process.arch===`arm`?S.push(`gnueabihf`):S.push(`gnu`)}else process.platform===`win32`&&S.push(`msvc`);let C;try{C=K(`lightningcss-${S.join(`-`)}`)}catch{C=K(`../lightningcss.${S.join(`-`)}.node`)}a.exports.transform=wrap(C.transform),a.exports.transformStyleAttribute=wrap(C.transformStyleAttribute),a.exports.bundle=wrap(C.bundle),a.exports.bundleAsync=wrap(C.bundleAsync),a.exports.browserslistToTargets=fT(),a.exports.composeVisitors=pT(),a.exports.Features=mT().Features;function wrap(n){return a=>{if(typeof a.visitor==`function`){let S=[];a.visitor=a.visitor({addDependency(n){S.push(n)}});let C=n(a);return C instanceof Promise?C=C.then(n=>(S.length&&(n.dependencies??=[],n.dependencies.push(...S)),n)):S.length&&(C.dependencies??=[],C.dependencies.push(...S)),C}else return n(a)}}})),gT=__exportAll$3({Features:()=>wT,browserslistToTargets:()=>ST,bundle:()=>bT,bundleAsync:()=>xT,composeVisitors:()=>CT,transform:()=>vT,transformStyleAttribute:()=>yT}),_T,vT,yT,bT,xT,ST,CT,wT,TT=__esmMin(()=>{_T=__toESM(hT(),1),{transform:vT,transformStyleAttribute:yT,bundle:bT,bundleAsync:xT,browserslistToTargets:ST,composeVisitors:CT,Features:wT}=_T.default});_s(),Oc(),Jo(),nn();let ET=null;async function pickBundler(){let n=globalThis.process?.env?.GJSIFY_CSS_BACKEND;if(n===`npm`)return loadNpmBundler();if(n===`native`){let n=await tryLoadNativeBundler();if(!n)throw Error(`GJSIFY_CSS_BACKEND=native but @gjsify/lightningcss-native is not loadable`);return n}return await tryLoadNativeBundler()??loadNpmBundler()}async function tryLoadNativeBundler(){if(globalThis.imports?.gi===void 0)return null;try{let n=await import(`@gjsify/lightningcss-native`);return n.hasNativeLightningcss()?async(a,S)=>{let C=targetsToBrowserslist(S);return n.bundle({filename:a,targets:C,minify:!1,sourceMap:!1,errorRecovery:!0})}:null}catch{return null}}async function loadNpmBundler(){let{bundleAsync:n}=await Promise.resolve().then(()=>(TT(),gT));return async(a,S)=>({code:(await n({filename:a,targets:S,minify:!1,errorRecovery:!0,resolver:DT})).code})}const DT={resolve(n,a){return Io(n)?n:n.startsWith(`./`)||n.startsWith(`../`)?Po(Bo(a),n):createRequire(pathToFileURL(a).href).resolve(n)}};function targetsToBrowserslist(n){if(!n)return;let a=[];for(let[S,C]of Object.entries(n)){if(typeof C!=`number`)continue;let n=C>>>16&255;if(n===0)continue;let N=S===`ios_saf`?`ios`:S;a.push(`${N} >= ${n}`)}return a.length?a.join(`, `):void 0}function cssAsStringPlugin(n={}){let{targets:a,bundle:S=!0}=n;return{name:`gjsify-css-as-string`,load:{filter:{id:/\.css$/},async handler(n){let C=S?new TextDecoder(`utf-8`).decode(await loadAndBundleCss(n,a)):await readFile$1(n,`utf8`);return{code:`export default ${JSON.stringify(C)};`,moduleType:`js`}}}}}async function loadAndBundleCss(n,a){ET||=pickBundler();let{code:S}=await(await ET)(n,a);return S}const OT=/^#![^\n]*\n/;function inputShebangStripPlugin(){return{name:`gjsify-input-shebang-strip`,transform:{order:`pre`,handler(n){return n.startsWith(`#!`)?{code:n.replace(OT,``),map:null}:null}}}}function shebangPlugin(n={}){if(!n.enabled)return null;let a=n.line??`#!/usr/bin/env -S gjs -m`;return{name:`gjsify-shebang`,renderChunk:{order:`post`,handler(n,S){return!S.isEntry||n.startsWith(`#!`)?null:{code:a+`
740
740
  `+n,map:null}}}}}function expandEnvTemplate(n,a=process.env){return n.replace(/\$\{env:([A-Za-z_][A-Za-z0-9_]*)(?::-([^}]*))?\}/g,(n,S,C)=>{let N=a[S];return N!==void 0&&N!==``?N:C??``})}function resolveShebangLine(n){if(n===void 0||n===!1)return null;if(n===!0)return`#!/usr/bin/env -S gjs -m`;let a=expandEnvTemplate(n);return a.trim()?a.startsWith(`#!`)?a:`#!`+a:null}nn(),Jo();const kT=Bo(fileURLToPath(import.meta.url));function resolveConsoleShim(){let n=Po(kT,`../shims/console-gjs.js`),a=null;try{a=(zs(),__toCommonJS(Is))}catch{return n}if(a.existsSync(n))return n;try{return(Oc(),__toCommonJS(wc)).createRequire(import.meta.url).resolve(`@gjsify/rolldown-plugin-gjsify/shims/console-gjs`)}catch{return n}}const setupForGjs=async n=>{let a=[`cairo`,`gettext`,`system`,...n.userExternal??[]],external=n=>!!(n.startsWith(`gi://`)||a.includes(n)),S=n.pluginOptions.format??`esm`,C=n.pluginOptions.exclude??[],N=await globToEntryPoints(n.input,C),F=Po(kT,`../shims/unicorn-magic.js`),I={...getAliasesForGjs({external}),"unicorn-magic":F,...n.pluginOptions.aliases??{},...n.userAliases??{}},H=n.pluginOptions.consoleShim===!1?null:resolveConsoleShim(),W=[];n.pluginOptions.autoGlobalsInject&&W.push(n.pluginOptions.autoGlobalsInject);let K=wrapInputWithSideEffects(N,W),q={input:K.input,platform:`neutral`,external,resolve:{mainFields:S===`esm`?[`browser`,`module`,`main`]:[`browser`,`main`,`module`],conditionNames:S===`esm`?[`browser`,`import`]:[`browser`,`require`,`import`]},transform:{target:`firefox140`,define:{global:`globalThis`,window:`globalThis`,"process.env.READABLE_STREAM":`"disable"`},...H?{inject:{console:[H,`console`]}}:{}},output:{...n.output,format:S,sourcemap:!1,codeSplitting:!1},treeshake:!0},Y=getBundleDirFromOutput(n.output);return{options:q,plugins:[...K.plugin?[K.plugin]:[],inputShebangStripPlugin(),aliasPlugin({entries:{"random-access-file":`random-access-file/index.js`,...flattenAliases$3(I)}}),blueprintPlugin(),deepkitPlugin({reflection:n.pluginOptions.reflection}),cssAsStringPlugin({targets:{firefox:60<<16}}),nodeModulesPathRewritePlugin({bundleDir:Y}),processStubPlugin({userBanner:n.userBanner}),(()=>{let a=resolveShebangLine(n.shebang);return shebangPlugin({enabled:a!==null,line:a??void 0})})()]}};function wrapInputWithSideEffects(n,a){if(a.length===0||n===void 0)return{input:n,plugin:null};let S=new Map,C=`\0gjsify-entry:`;function wrap(n){let a=C+n;return S.set(a,n),a}let N;if(typeof n==`string`)N=wrap(n);else if(Array.isArray(n))N=n.map(wrap);else{let a={};for(let[S,C]of Object.entries(n))a[S]=wrap(C);N=a}let F=a.map(n=>`import ${JSON.stringify(n)};`).join(`
741
- `),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$3(n){let a={};for(let[S,C]of Object.entries(n))C&&(a[S]=C);return a}__name$1(flattenAliases$3,`flattenAliases`);const setupForNode=async n=>{let a=n.userExternal??[],S=[...Ih,`node-datachannel`,...a],external=n=>!!(n.startsWith(`gi://`)||n.startsWith(`@girs/`)||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,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:[aliasPlugin({entries:flattenAliases$2(I)}),deepkitPlugin({reflection:n.pluginOptions.reflection}),cssAsStringPlugin(),nodeModulesPathRewritePlugin({bundleDir:H})]}};function flattenAliases$2(n){let a={};for(let[S,C]of Object.entries(n))C&&(a[S]=C);return a}__name$1(flattenAliases$2,`flattenAliases`);const AT=`\0gjsify-empty-gjs-import`;function gjsImportsEmptyPlugin(){return{name:`gjsify-gjs-imports-empty`,resolveId:{order:`pre`,filter:{id:/^(@girs\/|gi:\/\/)/},handler(n){return{id:AT}}},load(n){return n===AT?{code:`export {}; export default {};`,moduleSideEffects:!1}:null}}}const setupForBrowser=async n=>{let a=[...n.userExternal??[]],S=n.pluginOptions.exclude??[],C=await globToEntryPoints(n.input,S),N={process:`@gjsify/empty`,"node:process":`@gjsify/empty`,assert:`@gjsify/assert`,"node:assert":`@gjsify/assert`,...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$1(N)}),blueprintPlugin(),deepkitPlugin({reflection:n.pluginOptions.reflection}),cssAsStringPlugin()]}};function flattenAliases$1(n){let a={};for(let[S,C]of Object.entries(n))C&&(a[S]=C);return a}__name$1(flattenAliases$1,`flattenAliases`);const 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??{}},external=n=>!(n.startsWith(`./`)||n.startsWith(`../`)||n.startsWith(`/`));return{options:{input:C,platform:`neutral`,external,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)}),cssAsStringPlugin()]}};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}_s();function textLoaderPlugin(n={}){let a=Object.entries(n.loaders??{}).filter(([,n])=>n===`text`).map(([n])=>n);if(a.length===0)return null;let S=a.map(n=>n.replace(/^\./,``).replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)),C=RegExp(`\\.(?:${S.join(`|`)})$`);return{name:`gjsify-text-loader`,async load(n){if(!C.test(n))return null;let a=await readFile$1(n,`utf8`);return{code:`export default ${JSON.stringify(a)};`,moduleType:`js`}}}}const 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});default:throw TypeError(`Unknown app platform: `+S)}};Oc(),Jo(),nn();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(Lo(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}Ve();const 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()}},jT=ay;function setsEqual(n,a){if(n.size!==a.size)return!1;for(let S of n)if(!a.has(S))return!1;return!0}async function applyExcludeGlobals(n,a,S,C){if(!C?.length)return{detected:n,injectPath:a};for(let a of C)n.delete(a);let N=detectedToRegisterPaths(n);for(let n of S)N.add(n);return{detected:n,injectPath:N.size>0?await writeRegisterInjectFile(N)??void 0:void 0}}function detectedToRegisterPaths(n){let a=new Set;for(let S of n){let n=jT[S];n&&a.add(n)}return a}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=new Set,K;I.size>0&&(K=await writeRegisterInjectFile(I)??void 0);let q=(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 Y=1;Y<=5;Y++){let X=await S({...a,autoGlobalsInject:K}),te=await F({rolldownInput:{input:K?appendInjectAsEntry(n.input,K):n.input,external:n.external,resolve:n.resolve,transform:n.transform,plugins:[...q,X],logLevel:`silent`},format:n.format??`esm`});if(te.length===0)return{detected:new Set,injectPath:K};let ne=new Set;for(let n=0;n<te.length;n++){let a=te[n]??``;try{for(let n of detectFreeGlobals(a))ne.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(()=>(zs(),Is))).writeFileSync(S,a),Be.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)ne.delete(n);if(setsEqual(W,ne)){if(C){let n=[...W].sort(),a=I.size>0?` (+ ${I.size} extra register module(s))`:``;Be.debug(`[gjsify] --globals auto: converged after ${Y-1} iteration(s), ${W.size} global(s)${n.length?`: `+n.join(`, `):``}${a}`)}return applyExcludeGlobals(W,K,I,N.excludeGlobals)}W=ne;let re=detectedToRegisterPaths(W);for(let n of I)re.add(n);if(re.size===0)return{detected:W,injectPath:void 0};if(K=await writeRegisterInjectFile(re)??void 0,C){let n=[...W].sort();Be.debug(`[gjsify] --globals auto: iteration ${Y}, ${W.size} global(s)${n.length?`: `+n.join(`, `):``}`)}}return C&&Be.debug(`[gjsify] --globals auto: hit max iterations (5), using last detected set`),applyExcludeGlobals(W,K,I,N.excludeGlobals)}function appendInjectAsEntry(n,a){return n===void 0?[a]:typeof n==`string`?[n,a]:Array.isArray(n)?[...n,a]:{...n,__gjsify_inject:a}}Oc(),nn(),Jo(),zs(),_s();function findPnpRoot(n){let a=n;for(;;){if(existsSync(Lo(a,`.pnp.cjs`)))return a;let n=Bo(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(!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`}Ve();let MT=!1;function normalizeBundlerOptions(n){let a=n.bundler??{};if(!n.esbuild)return a;MT||(MT=!0,Be.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 S=legacyEsbuildToRolldown(n.esbuild),C={...S,...a};return(S.output||a.output)&&(C.output={...S.output??{},...a.output??{}}),(S.transform||a.transform)&&(C.transform={...S.transform??{},...a.transform??{}},(S.transform?.define||a.transform?.define)&&(C.transform.define={...S.transform?.define??{},...a.transform?.define??{}})),(S.resolve||a.resolve)&&(C.resolve={...S.resolve??{},...a.resolve??{}}),C}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}Ve(),Jo(),_s();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})}var 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?Bo(F.module):void 0,W=F.main?Bo(F.main):void 0,K=F.module?Ho(F.module):`.js`,q=F.main?Ho(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?Ho(a):`.js`,W=I.output?.dir??(a?Bo(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&&Be.debug(`[gjsify] globals: injected ${C.size} register module(s) from --globals ${a}`),N??void 0}async applyShebang(n,a){if(!n){a&&Be.warn(`[gjsify] --shebang skipped: no single outfile (use --outfile for GJS executables)`);return}let S=resolveShebangLine(this.configData.shebang)??`#!/usr/bin/env -S gjs -m`,C=await readFile$1(n,`utf-8`);C.startsWith(`#!`)?a&&Be.debug(`[gjsify] --shebang skipped: ${n} already starts with a shebang`):await writeFile$1(n,S+`
742
- `+C),await chmod$1(n,493),a&&Be.debug(`[gjsify] --shebang: wrote ${S} + chmod 0o755 to ${n}`)}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=>(await gjsifyPlugin({input:W.input,output:{file:Y,dir:X},userExternal:re,userBanner:ie,userAliases:I,shebang:this.configData.shebang},n)).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},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`&&this.configData.shebang&&await this.applyShebang(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,Be.log(`
741
+ `),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$3(n){let a={};for(let[S,C]of Object.entries(n))C&&(a[S]=C);return a}__name$1(flattenAliases$3,`flattenAliases`);const setupForNode=async n=>{let a=n.userExternal??[],S=[...Ih,`node-datachannel`,...a],external=n=>!!(n.startsWith(`gi://`)||n.startsWith(`@girs/`)||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,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:[aliasPlugin({entries:flattenAliases$2(I)}),deepkitPlugin({reflection:n.pluginOptions.reflection}),cssAsStringPlugin(),nodeModulesPathRewritePlugin({bundleDir:H})]}};function flattenAliases$2(n){let a={};for(let[S,C]of Object.entries(n))C&&(a[S]=C);return a}__name$1(flattenAliases$2,`flattenAliases`);const AT=`\0gjsify-empty-gjs-import`;function gjsImportsEmptyPlugin(){return{name:`gjsify-gjs-imports-empty`,resolveId:{order:`pre`,filter:{id:/^(@girs\/|gi:\/\/)/},handler(n){return{id:AT}}},load(n){return n===AT?{code:`export {}; export default {};`,moduleSideEffects:!1}:null}}}const setupForBrowser=async n=>{let a=[...n.userExternal??[]],S=n.pluginOptions.exclude??[],C=await globToEntryPoints(n.input,S),N={process:`@gjsify/empty`,"node:process":`@gjsify/empty`,assert:`@gjsify/assert`,"node:assert":`@gjsify/assert`,...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$1(N)}),blueprintPlugin(),deepkitPlugin({reflection:n.pluginOptions.reflection}),cssAsStringPlugin()]}};function flattenAliases$1(n){let a={};for(let[S,C]of Object.entries(n))C&&(a[S]=C);return a}__name$1(flattenAliases$1,`flattenAliases`);const 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??{}},external=n=>!(n.startsWith(`./`)||n.startsWith(`../`)||n.startsWith(`/`));return{options:{input:C,platform:`neutral`,external,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)}),cssAsStringPlugin()]}};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}_s();function textLoaderPlugin(n={}){let a=Object.entries(n.loaders??{}).filter(([,n])=>n===`text`).map(([n])=>n);if(a.length===0)return null;let S=a.map(n=>n.replace(/^\./,``).replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)),C=RegExp(`\\.(?:${S.join(`|`)})$`);return{name:`gjsify-text-loader`,async load(n){if(!C.test(n))return null;let a=await readFile$1(n,`utf8`);return{code:`export default ${JSON.stringify(a)};`,moduleType:`js`}}}}const 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});default:throw TypeError(`Unknown app platform: `+S)}};Oc(),Jo(),nn();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(Lo(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}Ve();const 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()}},jT=ay;function setsEqual(n,a){if(n.size!==a.size)return!1;for(let S of n)if(!a.has(S))return!1;return!0}async function applyExcludeGlobals(n,a,S,C){if(!C?.length)return{detected:n,injectPath:a};for(let a of C)n.delete(a);let N=detectedToRegisterPaths(n);for(let n of S)N.add(n);return{detected:n,injectPath:N.size>0?await writeRegisterInjectFile(N)??void 0:void 0}}function detectedToRegisterPaths(n){let a=new Set;for(let S of n){let n=jT[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=new Set,K;I.size>0&&(K=await writeRegisterInjectFile(I)??void 0);let q=(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 Y=1;Y<=5;Y++){let X=await S({...a,autoGlobalsInject:K}),te,ne;isFullConfig(X)?(ne=X.options,te=X.plugins):te=X;let re=K?appendInjectAsEntry(n.input,K):n.input,ie=n.resolve??ne?.resolve,ae=n.external??ne?.external,oe=n.transform??ne?.transform,Z=ne?.treeshake,se=Array.isArray(te)?te:[te],ce=await F({rolldownInput:{input:re,external:ae,resolve:ie,transform:oe,plugins:[...q,...se],logLevel:`silent`,...Z===void 0?{}:{treeshake:Z}},format:n.format??`esm`});if(ce.length===0)return{detected:new Set,injectPath:K};let le=new Set;for(let n=0;n<ce.length;n++){let a=ce[n]??``;try{for(let n of detectFreeGlobals(a))le.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(()=>(zs(),Is))).writeFileSync(S,a),Be.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)le.delete(n);if(setsEqual(W,le)){if(C){let n=[...W].sort(),a=I.size>0?` (+ ${I.size} extra register module(s))`:``;Be.debug(`[gjsify] --globals auto: converged after ${Y-1} iteration(s), ${W.size} global(s)${n.length?`: `+n.join(`, `):``}${a}`)}return applyExcludeGlobals(W,K,I,N.excludeGlobals)}W=le;let ue=detectedToRegisterPaths(W);for(let n of I)ue.add(n);if(ue.size===0)return{detected:W,injectPath:void 0};if(K=await writeRegisterInjectFile(ue)??void 0,C){let n=[...W].sort();Be.debug(`[gjsify] --globals auto: iteration ${Y}, ${W.size} global(s)${n.length?`: `+n.join(`, `):``}`)}}return C&&Be.debug(`[gjsify] --globals auto: hit max iterations (5), using last detected set`),applyExcludeGlobals(W,K,I,N.excludeGlobals)}function appendInjectAsEntry(n,a){return n===void 0?[a]:typeof n==`string`?[n,a]:Array.isArray(n)?[...n,a]:{...n,__gjsify_inject:a}}Oc(),nn(),Jo(),zs(),_s();function findPnpRoot(n){let a=n;for(;;){if(existsSync(Lo(a,`.pnp.cjs`)))return a;let n=Bo(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(!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`}Ve();let MT=!1;function normalizeBundlerOptions(n){let a=n.bundler??{};if(!n.esbuild)return a;MT||(MT=!0,Be.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 S=legacyEsbuildToRolldown(n.esbuild),C={...S,...a};return(S.output||a.output)&&(C.output={...S.output??{},...a.output??{}}),(S.transform||a.transform)&&(C.transform={...S.transform??{},...a.transform??{}},(S.transform?.define||a.transform?.define)&&(C.transform.define={...S.transform?.define??{},...a.transform?.define??{}})),(S.resolve||a.resolve)&&(C.resolve={...S.resolve??{},...a.resolve??{}}),C}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}Ve(),Jo(),_s();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})}var 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?Bo(F.module):void 0,W=F.main?Bo(F.main):void 0,K=F.module?Ho(F.module):`.js`,q=F.main?Ho(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?Ho(a):`.js`,W=I.output?.dir??(a?Bo(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&&Be.debug(`[gjsify] globals: injected ${C.size} register module(s) from --globals ${a}`),N??void 0}async applyShebang(n,a){if(!n){a&&Be.warn(`[gjsify] --shebang skipped: no single outfile (use --outfile for GJS executables)`);return}let S=resolveShebangLine(this.configData.shebang)??`#!/usr/bin/env -S gjs -m`,C=await readFile$1(n,`utf-8`);C.startsWith(`#!`)?a&&Be.debug(`[gjsify] --shebang skipped: ${n} already starts with a shebang`):await writeFile$1(n,S+`
742
+ `+C),await chmod$1(n,493),a&&Be.debug(`[gjsify] --shebang: wrote ${S} + chmod 0o755 to ${n}`)}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},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`&&this.configData.shebang&&await this.applyShebang(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,Be.log(`
743
743
  [gjsify build --watch] stopping watcher…`);try{await N.close()}catch(n){Be.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&&Be.log(`[gjsify build --watch] rebuild start`);break;case`BUNDLE_START`:Be.log(`[gjsify build --watch] building…`);break;case`BUNDLE_END`:Be.log(`[gjsify build --watch] built in ${n.duration}ms`);try{a===`gjs`&&this.configData.shebang&&await this.applyShebang(S,C)}finally{await n.result.close()}break;case`END`:Be.log(`[gjsify build --watch] waiting for changes…`);break;case`ERROR`:Be.error(`[gjsify build --watch] build failed:`,n.error?.message??n.error),C&&n.error?.stack&&Be.error(n.error.stack);try{await n.result.close()}catch{}break}}),C&&N.on(`change`,(n,a)=>{Be.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})}};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]})}const NT={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`],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 `#!/usr/bin/env -S gjs -m` shebang to the output and mark it executable (chmod 755). Only applies to GJS 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. Repeat the flag or pass a comma-separated list (e.g. --external typedoc,prettier). Globs are forwarded to esbuild as-is. See https://esbuild.github.io/api/#external`,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})}};zs(),Jo();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}}__name$1(readPackageJson$3,`readPackageJson`);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=Lo(n,N),F;try{F=readdirSync(C)}catch{continue}for(let n of F){let F=checkPackage(Lo(C,n),`${N}/${n}`,a);F&&S.push(F)}}else{let C=checkPackage(Lo(n,N),N,a);C&&S.push(C)}return S}function checkPackage(n,a,S){let C=readPackageJson$3(Lo(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=Lo(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=Po(n);for(;;){let n=Lo(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=Po(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(`:`)}}Ve(),vx(),Jo();function computeNativeEnvForBundle(n,a=process.cwd()){let S=Po(n),C=detectNativePackages(a),N=detectNativePackages(Bo(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=[]){let{env:S,envPrefix:C}=computeNativeEnvForBundle(n),N={...process.env,...S},F=[`-m`,n,...a],I=[`gjs`,...F.map(n=>n.includes(` `)?`"${n}"`:n)].join(` `);Be.log(`$ ${C?`${C} `:``}${I}`);let H=spawn(`gjs`,F,{env:N,stdio:`inherit`});await new Promise((n,a)=>{H.on(`close`,S=>{S===0?n():a(Error(`gjs exited with code ${S}`))}),H.on(`error`,a)}).catch(n=>{Be.error(n.message),process.exit(1)})}Ve(),zs(),Jo(),vx();const PT={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=Po(a,n.entry??S.entry??`src/test.mts`),N=Po(a,n.outdir??S.outdir??`dist`);existsSync(C)||(Be.error(`[gjsify test] no test entry at ${Ro(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=Lo(N,`test.${S}.mjs`);if(n.build!==!1)if(n.rebuild||!isFresh(F,C,a)){let N=Date.now();n.verbose&&Be.log(`[gjsify test] building → ${Ro(a,F)} (—app ${S})`);try{await buildTestBundle(C,F,S,n.verbose),n.verbose&&Be.log(`[gjsify test] built ${S} in ${Date.now()-N}ms`)}catch(n){Be.error(`[gjsify test] build failed for ${S}:`,n.message),I.push({runtime:S,ok:!1,durationMs:0,error:`build failed`});continue}}else n.verbose&&Be.log(`[gjsify test] ${S}: bundle is up-to-date — skipping build (use --rebuild to force)`);else if(!existsSync(F)){Be.error(`[gjsify test] --no-build but ${Ro(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(` `);Be.log(`[gjsify test] ${H}`),I.some(n=>!n.ok)&&process.exit(1)}};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,S){if(!existsSync(n))return!1;let C=statSync(n).mtimeMs,N=Bo(a);try{return C>=newestMtimeUnder(existsSync(N)?N: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(Lo(n,a.name));C>S&&(S=C)}return S}zs();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}`)}}__name$1(readPackageJson$2,`readPackageJson`);function writePackageJson$1(n,a){let S=sortKnownDepFields(a);writeFileSync(n,JSON.stringify(S,null,2)+`
744
744
  `,`utf-8`)}__name$1(writePackageJson$1,`writePackageJson`);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)}}__name$1(parseSpec$2,`parseSpec`);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}zs(),Jo();function discoverWorkspaces(n,a={}){let S=Lo(n,`package.json`);if(!existsSync(S))throw Error(`@gjsify/workspace: no package.json at ${n}`);let C=JSON.parse(readFileSync(S,`utf-8`)),N=a.patterns??extractWorkspacePatterns(C),F=[];a.includeRoot&&C.name&&F.push({location:n,relativeLocation:`.`,name:C.name,version:C.version??`0.0.0`,manifest:C,private:C.private===!0});for(let a of N)for(let S of expandPattern(n,a)){let a=Lo(S,`package.json`);if(!existsSync(a))continue;let C;try{C=JSON.parse(readFileSync(a,`utf-8`))}catch{continue}C.name&&F.push({location:S,relativeLocation:Ro(n,S).split(Go).join(`/`),name:C.name,version:C.version??`0.0.0`,manifest:C,private:C.private===!0})}return F.sort((n,a)=>n.relativeLocation.localeCompare(a.relativeLocation)),F}function buildDependencyGraph(n,a={}){let S=a.includeDev??!1,C=a.includePeer??!1,N=a.includeOptional??!0,F=indexByName(n),I=new Map;for(let a of n){let n=new Set,H=a.manifest;for(let a of[H.dependencies,S?H.devDependencies:void 0,C?H.peerDependencies:void 0,N?H.optionalDependencies:void 0])if(a)for(let[S,C]of Object.entries(a))typeof C==`string`&&C.startsWith(`workspace:`)&&F.has(S)&&n.add(S);I.set(a.name,n)}return{edges:I,byName:F}}function topologicalSort(n){let a=new Map;for(let S of n.edges.keys())a.set(S,0);for(let S of n.edges.values())for(let n of S)a.has(n)&&a.set(n,(a.get(n)??0)+1);let S=new Map,C=new Map;for(let a of n.edges.keys())S.set(a,new Set),C.set(a,0);for(let[a,N]of n.edges)for(let n of N)S.has(n)&&(S.get(n).add(a),C.set(a,(C.get(a)??0)+1));let N=[];for(let[n,a]of C)a===0&&N.push(n);N.sort();let F=[];for(;N.length>0;){let a=N.shift(),I=n.byName.get(a);I&&F.push(I);let H=S.get(a);if(H){let n=[];for(let a of H){let S=(C.get(a)??1)-1;C.set(a,S),S===0&&n.push(a)}n.sort(),N.push(...n)}}if(F.length!==C.size){let n=[...C.entries()].filter(([,n])=>n>0).map(([n])=>n);throw Error(`@gjsify/workspace: dependency cycle detected involving ${n.join(`, `)}`)}return F}function filterWorkspaces(n,a){let S=a.include?.map(globToRegex$1),C=a.exclude?.map(globToRegex$1);return n.filter(n=>!(a.noPrivate&&n.private||S&&S.length>0&&!S.some(a=>a.test(n.name))||C&&C.length>0&&C.some(a=>a.test(n.name))))}function extractWorkspacePatterns(n){let a=n.workspaces;return a?Array.isArray(a)?a:a.packages??[]:[]}function expandPattern(n,a){let S=a.split(`/`).filter(Boolean),C=[Po(n)];for(let n of S){let a=[];for(let S of C)if(n===`*`){let n=[];try{n=readdirSync(S)}catch{continue}for(let C of n){if(C.startsWith(`.`))continue;let n=Lo(S,C);try{statSync(n).isDirectory()&&a.push(n)}catch{}}}else if(n.includes(`*`)){let C=globToRegex$1(n),N=[];try{N=readdirSync(S)}catch{continue}for(let n of N){if(n.startsWith(`.`)||!C.test(n))continue;let N=Lo(S,n);try{statSync(N).isDirectory()&&a.push(N)}catch{}}}else{let C=Lo(S,n);if(existsSync(C))try{statSync(C).isDirectory()&&a.push(C)}catch{}}C=a}return C}function globToRegex$1(n){let a=n.replace(/[.+?^${}()|[\]\\]/g,`\\$&`).replace(/\*/g,`[^/]*`);return RegExp(`^${a}$`)}__name$1(globToRegex$1,`globToRegex`);function indexByName(n){let a=new Map;for(let S of n)a.set(S.name,S);return a}zs(),Jo();function readPackageJson$1(n){try{return JSON.parse(readFileSync(n,`utf-8`))}catch{return null}}__name$1(readPackageJson$1,`readPackageJson`);function findWorkspaceRoot(n){let a=n;for(let S=0;S<12;S++){let S=Lo(a,`package.json`);if(existsSync(S)&&readPackageJson$1(S)?.workspaces!==void 0)try{let S=discoverWorkspaces(a);if(a===n||S.some(a=>a.location===n))return a}catch{}let C=Po(a,`..`);if(C===a)break;a=C}return null}Ve(),zs(),Jo(),vx();const FT={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:[]}),handler:async n=>{let a=n.target,S=n.args??[],C=readPackageJson$2(Lo(process.cwd(),`package.json`));if(!(C?.scripts&&typeof C.scripts[a]==`string`)&&looksLikeFile(a)){await runGjsBundle(Po(a),S);return}await runScript(a,S)}};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=Lo(S,`package.json`),N=readPackageJson$2(C);N||(Be.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>`;Be.error(`gjsify run: no script "${n}" in ${C} (available: ${a})`),process.exit(1)}let H=findWorkspaceRoot(S),W=[Lo(S,`node_modules`,`.bin`)];H&&H!==S&&W.push(Lo(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(Ko),npm_lifecycle_event:n,npm_package_name:N.name??``,npm_package_version:N.version??``},Y=a.length>0?`${I} ${a.map(shellEscape).join(` `)}`:I;await new Promise((a,C)=>{let N=spawn(Y,[],{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=>{Be.error(n.message),process.exit(1)}),process.exit(0)}function shellEscape(n){return/^[a-zA-Z0-9_\-./=:@,]+$/.test(n)?n:`'${n.replace(/'/g,`'\\''`)}'`}Ve(),Jo();const IT={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?Po(n.file):null,C=detectNativePackages(a),{LD_LIBRARY_PATH:N,GI_TYPELIB_PATH:F}=buildNativeEnv(C);if(n.export){Be.log(`export LD_LIBRARY_PATH="${N}"`),Be.log(`export GI_TYPELIB_PATH="${F}"`);return}if(C.length===0){Be.log(`No native gjsify packages detected in node_modules.`),Be.log(`Native packages declare "gjsify": { "prebuilds": "<dir>" } in their package.json.`);return}Be.log(`Native packages detected:`);for(let n of C)Be.log(` ${n.name} → ${n.prebuildsDir}`);Be.log(``),Be.log(`To run your app directly with gjs, set:`),Be.log(` export LD_LIBRARY_PATH="${N}"`),Be.log(` export GI_TYPELIB_PATH="${F}"`),S?Be.log(` gjs -m ${S}`):Be.log(` gjs -m <your-bundle.js>`),Be.log(``),Be.log(`Or use gjsify run to handle this automatically:`),S?Be.log(` gjsify run ${n.file}`):Be.log(` gjsify run <your-bundle.js>`)}};vx(),Jo(),Oc(),nn(),zs();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(`
745
745
  `)[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(`
@@ -239,6 +239,13 @@ export class BuildAction {
239
239
  }
240
240
  // --- Auto mode (with optional extras): iterative multi-pass build ---
241
241
  if (app === "gjs" && autoMode) {
242
+ // Return the full orchestrator config (options + plugins) so
243
+ // auto-globals can reuse the per-app `resolve.conditionNames` /
244
+ // `mainFields` / `external` / `treeshake` for the in-memory
245
+ // analysis bundle. Without these, native-rolldown defaults to
246
+ // a different module-resolution condition set than npm-rolldown
247
+ // and the detected free-global set diverges (see PR for the
248
+ // missing-URL case under the GJS-CLI self-host loop).
242
249
  const gjsifyPluginFactory = async (opts) => {
243
250
  const cfg = await gjsifyPlugin({
244
251
  input: userBundler.input,
@@ -248,7 +255,7 @@ export class BuildAction {
248
255
  userAliases: aliases,
249
256
  shebang: this.configData.shebang,
250
257
  }, opts);
251
- return cfg.plugins;
258
+ return { options: cfg.options, plugins: cfg.plugins };
252
259
  };
253
260
  const { injectPath } = await detectAutoGlobals({
254
261
  input: userBundler.input,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gjsify/cli",
3
- "version": "0.4.19",
3
+ "version": "0.4.20",
4
4
  "description": "CLI for Gjsify",
5
5
  "type": "module",
6
6
  "main": "lib/index.js",
@@ -37,18 +37,18 @@
37
37
  "cli"
38
38
  ],
39
39
  "dependencies": {
40
- "@gjsify/buffer": "^0.4.19",
41
- "@gjsify/create-app": "^0.4.19",
42
- "@gjsify/node-globals": "^0.4.19",
43
- "@gjsify/node-polyfills": "^0.4.19",
44
- "@gjsify/npm-registry": "^0.4.19",
45
- "@gjsify/resolve-npm": "^0.4.19",
46
- "@gjsify/rolldown-plugin-gjsify": "^0.4.19",
47
- "@gjsify/rolldown-plugin-pnp": "^0.4.19",
48
- "@gjsify/semver": "^0.4.19",
49
- "@gjsify/tar": "^0.4.19",
50
- "@gjsify/web-polyfills": "^0.4.19",
51
- "@gjsify/workspace": "^0.4.19",
40
+ "@gjsify/buffer": "^0.4.20",
41
+ "@gjsify/create-app": "^0.4.20",
42
+ "@gjsify/node-globals": "^0.4.20",
43
+ "@gjsify/node-polyfills": "^0.4.20",
44
+ "@gjsify/npm-registry": "^0.4.20",
45
+ "@gjsify/resolve-npm": "^0.4.20",
46
+ "@gjsify/rolldown-plugin-gjsify": "^0.4.20",
47
+ "@gjsify/rolldown-plugin-pnp": "^0.4.20",
48
+ "@gjsify/semver": "^0.4.20",
49
+ "@gjsify/tar": "^0.4.20",
50
+ "@gjsify/web-polyfills": "^0.4.20",
51
+ "@gjsify/workspace": "^0.4.20",
52
52
  "cosmiconfig": "^9.0.1",
53
53
  "get-tsconfig": "^4.14.0",
54
54
  "pkg-types": "^2.3.1",
@@ -56,12 +56,12 @@
56
56
  "yargs": "^18.0.0"
57
57
  },
58
58
  "devDependencies": {
59
- "@gjsify/unit": "^0.4.19",
59
+ "@gjsify/unit": "^0.4.20",
60
60
  "@types/yargs": "^17.0.35",
61
61
  "typescript": "^6.0.3"
62
62
  },
63
63
  "peerDependencies": {
64
- "@gjsify/rolldown-native": "^0.4.19"
64
+ "@gjsify/rolldown-native": "^0.4.20"
65
65
  },
66
66
  "peerDependenciesMeta": {
67
67
  "@gjsify/rolldown-native": {