@gjsify/cli 0.4.34 → 0.4.35
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
|
@@ -617,8 +617,8 @@ Additional information: BADCLIENT: Bad error code, ${K} not found in range ${F}.
|
|
|
617
617
|
`+a.stack)}finally{this.performanceData=K}}parseMessage(n){return JSON.parse(n)}toStringMessage(n){return n}getFormatOptions(n){return this.projectService.getFormatCodeOptions(n)}getPreferences(n){return this.projectService.getPreferences(n)}getHostFormatOptions(){return this.projectService.getHostFormatCodeOptions()}getHostPreferences(){return this.projectService.getHostPreferences()}};function toProtocolPerformanceData(n){let a=n.diagnosticsDuration&&arrayFrom(n.diagnosticsDuration,([n,a])=>({...a,file:n}));return{...n,diagnosticsDuration:a}}function toProtocolTextSpan(n,a){return{start:a.positionToLineOffset(n.start),end:a.positionToLineOffset(textSpanEnd(n))}}function toProtocolTextSpanWithContext(n,a,S){let C=toProtocolTextSpan(n,S),N=a&&toProtocolTextSpan(a,S);return N?{...C,contextStart:N.start,contextEnd:N.end}:C}function convertTextChangeToCodeEdit(n,a){return{start:positionToLineOffset(a,n.span.start),end:positionToLineOffset(a,textSpanEnd(n.span)),newText:n.newText}}function positionToLineOffset(n,a){return isConfigFile(n)?locationFromLineAndCharacter(n.getLineAndCharacterOfPosition(a)):n.positionToLineOffset(a)}function convertLinkedEditInfoToRanges(n,a){let S=n.ranges.map(n=>({start:a.positionToLineOffset(n.start),end:a.positionToLineOffset(n.start+n.length)}));return n.wordPattern?{ranges:S,wordPattern:n.wordPattern}:{ranges:S}}function locationFromLineAndCharacter(n){return{line:n.line+1,offset:n.character+1}}function convertNewFileTextChangeToCodeEdit(n){Z.assert(n.textChanges.length===1);let a=first(n.textChanges);return Z.assert(a.span.start===0&&a.span.length===0),{fileName:n.fileName,textChanges:[{start:{line:0,offset:0},end:{line:0,offset:0},newText:a.newText}]}}function getLocationInNewDocument(n,a,S,C){let{line:N,character:F}=computeLineAndCharacterOfPosition(computeLineStarts(applyEdits(n,a,C)),S);return{line:N+1,offset:F+1}}function applyEdits(n,a,S){for(let{fileName:C,textChanges:N}of S)if(C===a)for(let a=N.length-1;a>=0;a--){let{newText:S,span:{start:C,length:F}}=N[a];n=n.slice(0,C)+S+n.slice(C+F)}return n}function referenceEntryToReferencesResponseItem(n,{fileName:a,textSpan:S,contextSpan:C,isWriteAccess:N,isDefinition:F},{disableLineTextInReferences:I}){let H=Z.checkDefined(n.getScriptInfo(a)),W=toProtocolTextSpanWithContext(S,C,H),K=I?void 0:getLineText(H,W);return{file:a,...W,lineText:K,isWriteAccess:N,isDefinition:F}}function getLineText(n,a){let S=n.lineToTextSpan(a.start.line-1);return n.getSnapshot().getText(S.start,textSpanEnd(S)).replace(/\r|\n/g,``)}function isCompletionEntryData(n){return n===void 0||n&&typeof n==`object`&&typeof n.exportName==`string`&&(n.fileName===void 0||typeof n.fileName==`string`)&&(n.ambientModuleName===void 0||typeof n.ambientModuleName==`string`&&(n.isPackageJsonImport===void 0||typeof n.isPackageJsonImport==`boolean`))}var yg=4,bg=(n=>(n[n.PreStart=0]=`PreStart`,n[n.Start=1]=`Start`,n[n.Entire=2]=`Entire`,n[n.Mid=3]=`Mid`,n[n.End=4]=`End`,n[n.PostEnd=5]=`PostEnd`,n))(bg||{}),EditWalker=class{constructor(){this.goSubtree=!0,this.lineIndex=new wg,this.endBranch=[],this.state=2,this.initialText=``,this.trailingText=``,this.lineIndex.root=new Tg,this.startPath=[this.lineIndex.root],this.stack=[this.lineIndex.root]}get done(){return!1}insertLines(n,a){a&&(this.trailingText=``),n=n?this.initialText+n+this.trailingText:this.initialText+this.trailingText;let S=wg.linesFromText(n).lines;S.length>1&&S[S.length-1]===``&&S.pop();let C,N;for(let n=this.endBranch.length-1;n>=0;n--)this.endBranch[n].updateCounts(),this.endBranch[n].charCount()===0&&(N=this.endBranch[n],C=n>0?this.endBranch[n-1]:this.branchNode);N&&C.remove(N);let F=this.startPath[this.startPath.length-1];if(S.length>0)if(F.text=S[0],S.length>1){let n=Array(S.length-1),a=F;for(let a=1;a<S.length;a++)n[a-1]=new LineLeaf(S[a]);let C=this.startPath.length-2;for(;C>=0;){let S=this.startPath[C];n=S.insertAt(a,n),C--,a=S}let N=n.length;for(;N>0;){let a=new Tg;a.add(this.lineIndex.root),n=a.insertAt(this.lineIndex.root,n),N=n.length,this.lineIndex.root=a}this.lineIndex.root.updateCounts()}else for(let n=this.startPath.length-2;n>=0;n--)this.startPath[n].updateCounts();else{this.startPath[this.startPath.length-2].remove(F);for(let n=this.startPath.length-2;n>=0;n--)this.startPath[n].updateCounts()}return this.lineIndex}post(n,a,S){S===this.lineCollectionAtBranch&&(this.state=4),this.stack.pop()}pre(n,a,S,C,N){let F=this.stack[this.stack.length-1];this.state===2&&N===1&&(this.state=1,this.branchNode=F,this.lineCollectionAtBranch=S);let I;function fresh(n){return n.isLeaf()?new LineLeaf(``):new Tg}switch(N){case 0:this.goSubtree=!1,this.state!==4&&F.add(S);break;case 1:this.state===4?this.goSubtree=!1:(I=fresh(S),F.add(I),this.startPath.push(I));break;case 2:this.state===4?S.isLeaf()||(I=fresh(S),F.add(I),this.endBranch.push(I)):(I=fresh(S),F.add(I),this.startPath.push(I));break;case 3:this.goSubtree=!1;break;case 4:this.state===4?S.isLeaf()||(I=fresh(S),F.add(I),this.endBranch.push(I)):this.goSubtree=!1;break;case 5:this.goSubtree=!1,this.state!==1&&F.add(S);break}this.goSubtree&&this.stack.push(I)}leaf(n,a,S){this.state===1?this.initialText=S.text.substring(0,n):(this.state===2&&(this.initialText=S.text.substring(0,n)),this.trailingText=S.text.substring(n+a))}},TextChange9=class{constructor(n,a,S){this.pos=n,this.deleteLen=a,this.insertedText=S}getTextChangeRange(){return createTextChangeRange(createTextSpan(this.pos,this.deleteLen),this.insertedText?this.insertedText.length:0)}},xg=class _ScriptVersionCache{constructor(){this.changes=[],this.versions=Array(_ScriptVersionCache.maxVersions),this.minVersion=0,this.currentVersion=0}versionToIndex(n){if(!(n<this.minVersion||n>this.currentVersion))return n%_ScriptVersionCache.maxVersions}currentVersionToIndex(){return this.currentVersion%_ScriptVersionCache.maxVersions}edit(n,a,S){this.changes.push(new TextChange9(n,a,S)),(this.changes.length>_ScriptVersionCache.changeNumberThreshold||a>_ScriptVersionCache.changeLengthThreshold||S&&S.length>_ScriptVersionCache.changeLengthThreshold)&&this.getSnapshot()}getSnapshot(){return this._getSnapshot()}_getSnapshot(){let n=this.versions[this.currentVersionToIndex()];if(this.changes.length>0){let a=n.index;for(let n of this.changes)a=a.edit(n.pos,n.deleteLen,n.insertedText);n=new Cg(this.currentVersion+1,this,a,this.changes),this.currentVersion=n.version,this.versions[this.currentVersionToIndex()]=n,this.changes=[],this.currentVersion-this.minVersion>=_ScriptVersionCache.maxVersions&&(this.minVersion=this.currentVersion-_ScriptVersionCache.maxVersions+1)}return n}getSnapshotVersion(){return this._getSnapshot().version}getAbsolutePositionAndLineText(n){return this._getSnapshot().index.lineNumberToInfo(n)}lineOffsetToPosition(n,a){return this._getSnapshot().index.absolutePositionOfStartOfLine(n)+(a-1)}positionToLineOffset(n){return this._getSnapshot().index.positionToLineOffset(n)}lineToTextSpan(n){let a=this._getSnapshot().index,{lineText:S,absolutePosition:C}=a.lineNumberToInfo(n+1);return createTextSpan(C,S===void 0?a.absolutePositionOfStartOfLine(n+2)-C:S.length)}getTextChangesBetweenVersions(n,a){if(n<a)if(n>=this.minVersion){let S=[];for(let C=n+1;C<=a;C++){let n=this.versions[this.versionToIndex(C)];for(let a of n.changesSincePreviousVersion)S.push(a.getTextChangeRange())}return collapseTextChangeRangesAcrossMultipleVersions(S)}else return;else return Yn}getLineCount(){return this._getSnapshot().index.getLineCount()}static fromString(n){let a=new _ScriptVersionCache,S=new Cg(0,a,new wg);a.versions[a.currentVersion]=S;let C=wg.linesFromText(n);return S.index.load(C.lines),a}};xg.changeNumberThreshold=8,xg.changeLengthThreshold=256,xg.maxVersions=8;var Sg=xg,Cg=class _LineIndexSnapshot{constructor(n,a,S,C=Ch){this.version=n,this.cache=a,this.index=S,this.changesSincePreviousVersion=C}getText(n,a){return this.index.getText(n,a-n)}getLength(){return this.index.getLength()}getChangeRange(n){if(n instanceof _LineIndexSnapshot&&this.cache===n.cache)return this.version<=n.version?Yn:this.cache.getTextChangesBetweenVersions(n.version,this.version)}},wg=class _LineIndex{constructor(){this.checkEdits=!1}absolutePositionOfStartOfLine(n){return this.lineNumberToInfo(n).absolutePosition}positionToLineOffset(n){let{oneBasedLine:a,zeroBasedColumn:S}=this.root.charOffsetToLineInfo(1,n);return{line:a,offset:S+1}}positionToColumnAndLineText(n){return this.root.charOffsetToLineInfo(1,n)}getLineCount(){return this.root.lineCount()}lineNumberToInfo(n){if(n<=this.getLineCount()){let{position:a,leaf:S}=this.root.lineNumberToInfo(n,0);return{absolutePosition:a,lineText:S&&S.text}}else return{absolutePosition:this.root.charCount(),lineText:void 0}}load(n){if(n.length>0){let a=[];for(let S=0;S<n.length;S++)a[S]=new LineLeaf(n[S]);this.root=_LineIndex.buildTreeFromBottom(a)}else this.root=new Tg}walk(n,a,S){this.root.walk(n,a,S)}getText(n,a){let S=``;return a>0&&n<this.root.charCount()&&this.walk(n,a,{goSubtree:!0,done:!1,leaf:(n,a,C)=>{S=S.concat(C.text.substring(n,n+a))}}),S}getLength(){return this.root.charCount()}every(n,a,S){S||=this.root.charCount();let C={goSubtree:!0,done:!1,leaf(a,S,C){n(C,a,S)||(this.done=!0)}};return this.walk(a,S-a,C),!C.done}edit(n,a,S){if(this.root.charCount()===0)return Z.assert(a===0),S===void 0?void 0:(this.load(_LineIndex.linesFromText(S).lines),this);{let C;if(this.checkEdits){let N=this.getText(0,this.root.charCount());C=N.slice(0,n)+S+N.slice(n+a)}let N=new EditWalker,F=!1;if(n>=this.root.charCount()){n=this.root.charCount()-1;let C=this.getText(n,1);S=S?C+S:C,a=0,F=!0}else if(a>0){let C=n+a,{zeroBasedColumn:N,lineText:F}=this.positionToColumnAndLineText(C);N===0&&(a+=F.length,S=S?S+F:F)}if(this.root.walk(n,a,N),N.insertLines(S,F),this.checkEdits){let n=N.lineIndex.getText(0,N.lineIndex.getLength());Z.assert(C===n,`buffer edit mismatch`)}return N.lineIndex}}static buildTreeFromBottom(n){if(n.length<yg)return new Tg(n);let a=Array(Math.ceil(n.length/yg)),S=0;for(let C=0;C<a.length;C++){let N=Math.min(S+yg,n.length);a[C]=new Tg(n.slice(S,N)),S=N}return this.buildTreeFromBottom(a)}static linesFromText(n){let a=computeLineStarts(n);if(a.length===0)return{lines:[],lineMap:a};let S=Array(a.length),C=a.length-1;for(let N=0;N<C;N++)S[N]=n.substring(a[N],a[N+1]);let N=n.substring(a[C]);return N.length>0?S[C]=N:S.pop(),{lines:S,lineMap:a}}},Tg=class _LineNode{constructor(n=[]){this.children=n,this.totalChars=0,this.totalLines=0,n.length&&this.updateCounts()}isLeaf(){return!1}updateCounts(){this.totalChars=0,this.totalLines=0;for(let n of this.children)this.totalChars+=n.charCount(),this.totalLines+=n.lineCount()}execWalk(n,a,S,C,N){return S.pre&&S.pre(n,a,this.children[C],this,N),S.goSubtree?(this.children[C].walk(n,a,S),S.post&&S.post(n,a,this.children[C],this,N)):S.goSubtree=!0,S.done}skipChild(n,a,S,C,N){C.pre&&!C.done&&(C.pre(n,a,this.children[S],this,N),C.goSubtree=!0)}walk(n,a,S){if(this.children.length===0)return;let C=0,N=this.children[C].charCount(),F=n;for(;F>=N;)this.skipChild(F,a,C,S,0),F-=N,C++,N=this.children[C].charCount();if(F+a<=N){if(this.execWalk(F,a,S,C,2))return}else{if(this.execWalk(F,N-F,S,C,1))return;let n=a-(N-F);for(C++,N=this.children[C].charCount();n>N;){if(this.execWalk(0,N,S,C,3))return;n-=N,C++,N=this.children[C].charCount()}if(n>0&&this.execWalk(0,n,S,C,4))return}if(S.pre){let n=this.children.length;if(C<n-1)for(let a=C+1;a<n;a++)this.skipChild(0,0,a,S,5)}}charOffsetToLineInfo(n,a){if(this.children.length===0)return{oneBasedLine:n,zeroBasedColumn:a,lineText:void 0};for(let S of this.children)if(S.charCount()>a)return S.isLeaf()?{oneBasedLine:n,zeroBasedColumn:a,lineText:S.text}:S.charOffsetToLineInfo(n,a);else a-=S.charCount(),n+=S.lineCount();let S=this.lineCount();return S===0?{oneBasedLine:1,zeroBasedColumn:0,lineText:void 0}:{oneBasedLine:S,zeroBasedColumn:Z.checkDefined(this.lineNumberToInfo(S,0).leaf).charCount(),lineText:void 0}}lineNumberToInfo(n,a){for(let S of this.children){let C=S.lineCount();if(C>=n)return S.isLeaf()?{position:a,leaf:S}:S.lineNumberToInfo(n,a);n-=C,a+=S.charCount()}return{position:a,leaf:void 0}}splitAfter(n){let a,S=this.children.length;n++;let C=n;if(n<S){for(a=new _LineNode;n<S;)a.add(this.children[n]),n++;a.updateCounts()}return this.children.length=C,a}remove(n){let a=this.findChildIndex(n),S=this.children.length;if(a<S-1)for(let n=a;n<S-1;n++)this.children[n]=this.children[n+1];this.children.pop()}findChildIndex(n){let a=this.children.indexOf(n);return Z.assert(a!==-1),a}insertAt(n,a){let S=this.findChildIndex(n),C=this.children.length,N=a.length;if(C<yg&&S===C-1&&N===1)return this.add(a[0]),this.updateCounts(),[];{let n=this.splitAfter(S),C=0;for(S++;S<yg&&C<N;)this.children[S]=a[C],S++,C++;let F=[],I=0;if(C<N){I=Math.ceil((N-C)/yg),F=Array(I);let n=0;for(let n=0;n<I;n++)F[n]=new _LineNode;let S=F[0];for(;C<N;)S.add(a[C]),C++,S.children.length===yg&&(n++,S=F[n]);for(let n=F.length-1;n>=0;n--)F[n].children.length===0&&F.pop()}n&&F.push(n),this.updateCounts();for(let n=0;n<I;n++)F[n].updateCounts();return F}}add(n){this.children.push(n),Z.assert(this.children.length<=yg)}charCount(){return this.totalChars}lineCount(){return this.totalLines}},LineLeaf=class{constructor(n){this.text=n}isLeaf(){return!0}walk(n,a,S){S.leaf(n,a,this)}charCount(){return this.text.length}lineCount(){return 1}},Eg=class _TypingsInstallerAdapter{constructor(n,a,S,C,N,F){this.telemetryEnabled=n,this.logger=a,this.host=S,this.globalTypingsCacheLocation=C,this.event=N,this.maxActiveRequestCount=F,this.activeRequestCount=0,this.requestQueue=createQueue(),this.requestMap=new Map,this.requestedRegistry=!1,this.packageInstallId=0}isKnownTypesPackageName(n){return nc.validatePackageName(n)===nc.NameValidationResult.Ok?(this.requestedRegistry||(this.requestedRegistry=!0,this.installer.send({kind:`typesRegistry`})),!!this.typesRegistryCache?.has(n)):!1}installPackage(n){this.packageInstallId++;let a={kind:`installPackage`,...n,id:this.packageInstallId},S=new Promise((n,a)=>{(this.packageInstalledPromise??=new Map).set(this.packageInstallId,{resolve:n,reject:a})});return this.installer.send(a),S}attach(n){this.projectService=n,this.installer=this.createInstallerProcess()}onProjectClosed(n){this.installer.send({projectName:n.getProjectName(),kind:`closeProject`})}enqueueInstallTypingsRequest(n,a,S){let C=createInstallTypingsRequest(n,a,S);this.logger.hasLevel(3)&&this.logger.info(`TIAdapter:: Scheduling throttled operation:${stringifyIndented(C)}`),this.activeRequestCount<this.maxActiveRequestCount?this.scheduleRequest(C):(this.logger.hasLevel(3)&&this.logger.info(`TIAdapter:: Deferring request for: ${C.projectName}`),this.requestQueue.enqueue(C),this.requestMap.set(C.projectName,C))}handleMessage(n){var a;switch(this.logger.hasLevel(3)&&this.logger.info(`TIAdapter:: Received response:${stringifyIndented(n)}`),n.kind){case oc:this.typesRegistryCache=new Map(Object.entries(n.typesRegistry));break;case ac:{let S=this.packageInstalledPromise?.get(n.id);Z.assertIsDefined(S,`Should find the promise for package install`),(a=this.packageInstalledPromise)==null||a.delete(n.id),n.success?S.resolve({successMessage:n.message}):S.reject(n.message),this.projectService.updateTypingsForProject(n),this.event(n,`setTypings`);break}case lc:{let a={message:n.message};this.event(a,`typesInstallerInitializationFailed`);break}case sc:{let a={eventId:n.eventId,packages:n.packagesToInstall};this.event(a,`beginInstallTypes`);break}case cc:{if(this.telemetryEnabled){let a={telemetryEventName:`typingsInstalled`,payload:{installedPackages:n.packagesToInstall.join(`,`),installSuccess:n.installSuccess,typingsInstallerVersion:n.typingsInstallerVersion}};this.event(a,`telemetry`)}let a={eventId:n.eventId,packages:n.packagesToInstall,success:n.installSuccess};this.event(a,`endInstallTypes`);break}case ic:this.projectService.updateTypingsForProject(n);break;case rc:for(this.activeRequestCount>0?this.activeRequestCount--:Z.fail(`TIAdapter:: Received too many responses`);!this.requestQueue.isEmpty();){let n=this.requestQueue.dequeue();if(this.requestMap.get(n.projectName)===n){this.requestMap.delete(n.projectName),this.scheduleRequest(n);break}this.logger.hasLevel(3)&&this.logger.info(`TIAdapter:: Skipping defunct request for: ${n.projectName}`)}this.projectService.updateTypingsForProject(n),this.event(n,`setTypings`);break;case uc:this.projectService.watchTypingLocations(n);break;default:}}scheduleRequest(n){this.logger.hasLevel(3)&&this.logger.info(`TIAdapter:: Scheduling request for: ${n.projectName}`),this.activeRequestCount++,this.host.setTimeout(()=>{this.logger.hasLevel(3)&&this.logger.info(`TIAdapter:: Sending request:${stringifyIndented(n)}`),this.installer.send(n)},_TypingsInstallerAdapter.requestDelayMillis,`${n.projectName}::${n.kind}`)}};Eg.requestDelayMillis=100;var Dg=Eg,Og={};__export(Og,{ActionInvalidate:()=>ic,ActionPackageInstalled:()=>ac,ActionSet:()=>rc,ActionWatchTypingLocations:()=>uc,Arguments:()=>dc,AutoImportProviderProject:()=>Hh,AuxiliaryProject:()=>AuxiliaryProject,CharRangeSection:()=>bg,CloseFileWatcherEvent:()=>tg,CommandNames:()=>hg,ConfigFileDiagEvent:()=>Yh,ConfiguredProject:()=>ConfiguredProject2,ConfiguredProjectLoadKind:()=>dg,CreateDirectoryWatcherEvent:()=>eg,CreateFileWatcherEvent:()=>$h,Errors:()=>Th,EventBeginInstallTypes:()=>sc,EventEndInstallTypes:()=>cc,EventInitializationFailed:()=>lc,EventTypesRegistry:()=>oc,ExternalProject:()=>ExternalProject,GcTimer:()=>Dh,InferredProject:()=>InferredProject2,LargeFileReferencedEvent:()=>Jh,LineIndex:()=>wg,LineLeaf:()=>LineLeaf,LineNode:()=>Tg,LogLevel:()=>Sh,Msg:()=>wh,OpenFileInfoTelemetryEvent:()=>Qh,Project:()=>Bh,ProjectInfoTelemetryEvent:()=>Zh,ProjectKind:()=>zh,ProjectLanguageServiceStateEvent:()=>Xh,ProjectLoadingFinishEvent:()=>qh,ProjectLoadingStartEvent:()=>Kh,ProjectService:()=>pg,ProjectsUpdatedInBackgroundEvent:()=>Gh,ScriptInfo:()=>ScriptInfo,ScriptVersionCache:()=>Sg,Session:()=>vg,TextStorage:()=>TextStorage,ThrottledOperations:()=>Eh,TypingsInstallerAdapter:()=>Dg,allFilesAreJsOrDts:()=>allFilesAreJsOrDts,allRootFilesAreJsOrDts:()=>allRootFilesAreJsOrDts,asNormalizedPath:()=>asNormalizedPath,convertCompilerOptions:()=>convertCompilerOptions,convertFormatOptions:()=>convertFormatOptions,convertScriptKindName:()=>convertScriptKindName,convertTypeAcquisition:()=>convertTypeAcquisition,convertUserPreferences:()=>convertUserPreferences,convertWatchOptions:()=>convertWatchOptions,countEachFileTypes:()=>countEachFileTypes,createInstallTypingsRequest:()=>createInstallTypingsRequest,createModuleSpecifierCache:()=>createModuleSpecifierCache,createNormalizedPathMap:()=>createNormalizedPathMap,createPackageJsonCache:()=>createPackageJsonCache,createSortedArray:()=>createSortedArray2,emptyArray:()=>Ch,findArgument:()=>findArgument,formatDiagnosticToProtocol:()=>formatDiagnosticToProtocol,formatMessage:()=>formatMessage2,getBaseConfigFileName:()=>getBaseConfigFileName,getDetailWatchInfo:()=>getDetailWatchInfo,getLocationInNewDocument:()=>getLocationInNewDocument,hasArgument:()=>hasArgument,hasNoTypeScriptSource:()=>hasNoTypeScriptSource,indent:()=>indent2,isBackgroundProject:()=>isBackgroundProject,isConfigFile:()=>isConfigFile,isConfiguredProject:()=>isConfiguredProject,isDynamicFileName:()=>isDynamicFileName,isExternalProject:()=>isExternalProject,isInferredProject:()=>isInferredProject,isInferredProjectName:()=>isInferredProjectName,isProjectDeferredClose:()=>isProjectDeferredClose,makeAutoImportProviderProjectName:()=>makeAutoImportProviderProjectName,makeAuxiliaryProjectName:()=>makeAuxiliaryProjectName,makeInferredProjectName:()=>makeInferredProjectName,maxFileSize:()=>Wh,maxProgramSizeForNonTsFiles:()=>Uh,normalizedPathToPath:()=>normalizedPathToPath,nowString:()=>nowString,nullCancellationToken:()=>mg,nullTypingsInstaller:()=>lg,protocol:()=>Oh,scriptInfoIsContainedByBackgroundProject:()=>scriptInfoIsContainedByBackgroundProject,scriptInfoIsContainedByDeferredClosedProject:()=>scriptInfoIsContainedByDeferredClosedProject,stringifyIndented:()=>stringifyIndented,toEvent:()=>toEvent,toNormalizedPath:()=>toNormalizedPath,tryConvertScriptKindName:()=>tryConvertScriptKindName,typingsInstaller:()=>bh,updateProjectIfDirty:()=>updateProjectIfDirty}),Ae!==void 0&&(Z.loggingHost={log(n,a){switch(n){case 1:return Ae.error(a);case 2:return Ae.warn(a);case 3:return Ae.log(a);case 4:return Ae.log(a)}}})})({get exports(){return N},set exports(n){N=n,a!==void 0&&a.exports&&(a.exports=n)}})})),Mp=__commonJSMin((n=>{var a=n&&n.__importDefault||function(n){return n&&n.__esModule?n:{default:n}};Object.defineProperty(n,"__esModule",{value:!0}),n.loadTs=n.loadTsSync=n.loadYaml=n.loadJson=n.loadJs=n.loadJsSync=void 0;let S=(Os(),__toCommonJS(Ts)),C=(as(),__toCommonJS(ns)),N=a((Bo(),__toCommonJS(To))),F=(en(),__toCommonJS(Yt)),I=(Ua(),__toCommonJS(Va)),H;n.loadJsSync=function loadJsSync(n){return H===void 0&&(H=Iu()),H(n)},n.loadJs=async function loadJs(a){try{let{href:n}=(0,F.pathToFileURL)(await(0,C.realpath)(a));return(await import(n)).default}catch(S){try{return(0,n.loadJsSync)(a,``)}catch(n){throw n.code===`ERR_REQUIRE_ESM`||n instanceof SyntaxError&&n.toString().includes(`Cannot use import statement outside a module`)?S:n}}};let W;n.loadJson=function loadJson(n,a){W===void 0&&(W=qu());try{return W(a)}catch(a){throw a.message=`JSON Error in ${n}:\n${a.message}`,a}};let K;n.loadYaml=function loadYaml(n,a){K===void 0&&(K=(Kf(),__toCommonJS(Ju)));try{return K.load(a)}catch(a){throw a.message=`YAML Error in ${n}:\n${a.message}`,a}};let q;n.loadTsSync=function loadTsSync(a,C){q===void 0&&(q=jp());let F=`${a}.${(0,I.randomUUID)()}.cjs`;try{let I=resolveTsConfig(N.default.dirname(a))??{};return I.compilerOptions={...I.compilerOptions,module:q.ModuleKind.NodeNext,moduleResolution:q.ModuleResolutionKind.NodeNext,target:q.ScriptTarget.ES2022,noEmit:!1},C=q.transpileModule(C,I).outputText,(0,S.writeFileSync)(F,C),(0,n.loadJsSync)(F,C).default}catch(n){throw n.message=`TypeScript Error in ${a}:\n${n.message}`,n}finally{(0,S.existsSync)(F)&&(0,S.rmSync)(F)}},n.loadTs=async function loadTs(a,F){q===void 0&&(q=(await Promise.resolve().then(()=>__toESM(jp()))).default);let H=`${a}.${(0,I.randomUUID)()}.mjs`,W;try{try{let n=resolveTsConfig(N.default.dirname(a))??{};n.compilerOptions={...n.compilerOptions,module:q.ModuleKind.ES2022,moduleResolution:q.ModuleResolutionKind.Bundler,target:q.ScriptTarget.ES2022,noEmit:!1},W=q.transpileModule(F,n).outputText,await(0,C.writeFile)(H,W)}catch(n){throw n.message=`TypeScript Error in ${a}:\n${n.message}`,n}return await(0,n.loadJs)(H,W)}finally{(0,S.existsSync)(H)&&await(0,C.rm)(H)}};function resolveTsConfig(n){let a=q.findConfigFile(n,n=>q.sys.fileExists(n));if(a!==void 0){let{config:n,error:S}=q.readConfigFile(a,n=>q.sys.readFile(n));if(S)throw Error(`Error in ${a}: ${S.messageText.toString()}`);return n}}})),Np=__commonJSMin((n=>{Object.defineProperty(n,"__esModule",{value:!0}),n.defaultLoadersSync=n.defaultLoaders=n.metaSearchPlaces=n.globalConfigSearchPlacesSync=n.globalConfigSearchPlaces=n.getDefaultSearchPlacesSync=n.getDefaultSearchPlaces=void 0;let a=Mp();function getDefaultSearchPlaces(n){return[`package.json`,`.${n}rc`,`.${n}rc.json`,`.${n}rc.yaml`,`.${n}rc.yml`,`.${n}rc.js`,`.${n}rc.ts`,`.${n}rc.cjs`,`.${n}rc.mjs`,`.config/${n}rc`,`.config/${n}rc.json`,`.config/${n}rc.yaml`,`.config/${n}rc.yml`,`.config/${n}rc.js`,`.config/${n}rc.ts`,`.config/${n}rc.cjs`,`.config/${n}rc.mjs`,`${n}.config.js`,`${n}.config.ts`,`${n}.config.cjs`,`${n}.config.mjs`]}n.getDefaultSearchPlaces=getDefaultSearchPlaces;function getDefaultSearchPlacesSync(n){return[`package.json`,`.${n}rc`,`.${n}rc.json`,`.${n}rc.yaml`,`.${n}rc.yml`,`.${n}rc.js`,`.${n}rc.ts`,`.${n}rc.cjs`,`.config/${n}rc`,`.config/${n}rc.json`,`.config/${n}rc.yaml`,`.config/${n}rc.yml`,`.config/${n}rc.js`,`.config/${n}rc.ts`,`.config/${n}rc.cjs`,`${n}.config.js`,`${n}.config.ts`,`${n}.config.cjs`]}n.getDefaultSearchPlacesSync=getDefaultSearchPlacesSync,n.globalConfigSearchPlaces=[`config`,`config.json`,`config.yaml`,`config.yml`,`config.js`,`config.ts`,`config.cjs`,`config.mjs`],n.globalConfigSearchPlacesSync=[`config`,`config.json`,`config.yaml`,`config.yml`,`config.js`,`config.ts`,`config.cjs`],n.metaSearchPlaces=[`package.json`,`package.yaml`,`.config/config.json`,`.config/config.yaml`,`.config/config.yml`,`.config/config.js`,`.config/config.ts`,`.config/config.cjs`,`.config/config.mjs`],n.defaultLoaders=Object.freeze({".mjs":a.loadJs,".cjs":a.loadJs,".js":a.loadJs,".ts":a.loadTs,".json":a.loadJson,".yaml":a.loadYaml,".yml":a.loadYaml,noExt:a.loadYaml}),n.defaultLoadersSync=Object.freeze({".cjs":a.loadJsSync,".js":a.loadJsSync,".ts":a.loadTsSync,".json":a.loadJson,".yaml":a.loadYaml,".yml":a.loadYaml,noExt:a.loadYaml})})),Pp=__commonJSMin(((n,a)=>{let S=(Bo(),__toCommonJS(To)),C=(Ep(),__toCommonJS(yp)),N=C.homedir(),F=C.tmpdir(),{env:I}=process,macos=n=>{let a=S.join(N,`Library`);return{data:S.join(a,`Application Support`,n),config:S.join(a,`Preferences`,n),cache:S.join(a,`Caches`,n),log:S.join(a,`Logs`,n),temp:S.join(F,n)}},windows=n=>{let a=I.APPDATA||S.join(N,`AppData`,`Roaming`),C=I.LOCALAPPDATA||S.join(N,`AppData`,`Local`);return{data:S.join(C,n,`Data`),config:S.join(a,n,`Config`),cache:S.join(C,n,`Cache`),log:S.join(C,n,`Log`),temp:S.join(F,n)}},linux=n=>{let a=S.basename(N);return{data:S.join(I.XDG_DATA_HOME||S.join(N,`.local`,`share`),n),config:S.join(I.XDG_CONFIG_HOME||S.join(N,`.config`),n),cache:S.join(I.XDG_CACHE_HOME||S.join(N,`.cache`),n),log:S.join(I.XDG_STATE_HOME||S.join(N,`.local`,`state`),n),temp:S.join(F,a,n)}},envPaths=(n,a)=>{if(typeof n!=`string`)throw TypeError(`Expected string, got ${typeof n}`);return a=Object.assign({suffix:`nodejs`},a),a.suffix&&(n+=`-${a.suffix}`),process.platform===`darwin`?macos(n):process.platform===`win32`?windows(n):linux(n)};a.exports=envPaths,a.exports.default=envPaths})),Fp=__commonJSMin((n=>{var a=n&&n.__createBinding||(Object.create?(function(n,a,S,C){C===void 0&&(C=S);var N=Object.getOwnPropertyDescriptor(a,S);(!N||(`get`in N?!a.__esModule:N.writable||N.configurable))&&(N={enumerable:!0,get:function(){return a[S]}}),Object.defineProperty(n,C,N)}):(function(n,a,S,C){C===void 0&&(C=S),n[C]=a[S]})),S=n&&n.__setModuleDefault||(Object.create?(function(n,a){Object.defineProperty(n,"default",{enumerable:!0,value:a})}):function(n,a){n.default=a}),C=n&&n.__importStar||function(n){if(n&&n.__esModule)return n;var C={};if(n!=null)for(var N in n)N!=="default"&&Object.prototype.hasOwnProperty.call(n,N)&&a(C,n,N);return S(C,n),C};Object.defineProperty(n,"__esModule",{value:!0}),n.isDirectorySync=n.isDirectory=n.removeUndefinedValuesFromObject=n.getPropertyByPath=n.emplace=void 0;let N=C((Os(),__toCommonJS(Ts)));function emplace(n,a,S){let C=n.get(a);if(C!==void 0)return C;let N=S();return n.set(a,N),N}n.emplace=emplace;function getPropertyByPath(n,a){return typeof a==`string`&&Object.prototype.hasOwnProperty.call(n,a)?n[a]:(typeof a==`string`?a.split(`.`):a).reduce((n,a)=>n===void 0?n:n[a],n)}n.getPropertyByPath=getPropertyByPath;function removeUndefinedValuesFromObject(n){return Object.fromEntries(Object.entries(n).filter(([,n])=>n!==void 0))}n.removeUndefinedValuesFromObject=removeUndefinedValuesFromObject;async function isDirectory(n){try{return(await N.promises.stat(n)).isDirectory()}catch(n){if(n.code===`ENOENT`)return!1;throw n}}n.isDirectory=isDirectory;function isDirectorySync(n){try{return N.default.statSync(n).isDirectory()}catch(n){if(n.code===`ENOENT`)return!1;throw n}}n.isDirectorySync=isDirectorySync})),Ip=__commonJSMin((n=>{var a=n&&n.__importDefault||function(n){return n&&n.__esModule?n:{default:n}};Object.defineProperty(n,"__esModule",{value:!0}),n.getExtensionDescription=n.ExplorerBase=void 0;let S=a(Pp()),C=a((Ep(),__toCommonJS(yp))),N=a((Bo(),__toCommonJS(To))),F=Fp();var ExplorerBase=class{#e=!1;config;loadCache;searchCache;constructor(n){this.config=n,n.cache&&(this.loadCache=new Map,this.searchCache=new Map),this.#t()}set loadingMetaConfig(n){this.#e=n}#t(){let n=this.config;for(let a of n.searchPlaces){let n=N.default.extname(a),S=this.config.loaders[n||`noExt`]??this.config.loaders.default;if(S===void 0)throw Error(`Missing loader for ${getExtensionDescription(a)}.`);if(typeof S!=`function`)throw Error(`Loader for ${getExtensionDescription(a)} is not a function: Received ${typeof S}.`)}}clearLoadCache(){this.loadCache&&this.loadCache.clear()}clearSearchCache(){this.searchCache&&this.searchCache.clear()}clearCaches(){this.clearLoadCache(),this.clearSearchCache()}toCosmiconfigResult(n,a){if(a===null)return null;if(a===void 0)return{filepath:n,config:void 0,isEmpty:!0};if(this.config.applyPackagePropertyPathToConfiguration||this.#e){let n=this.config.packageProp??this.config.moduleName;a=(0,F.getPropertyByPath)(a,n)}return a===void 0?{filepath:n,config:void 0,isEmpty:!0}:{config:a,filepath:n}}validateImports(n,a,S){let C=N.default.dirname(n);for(let F of a){if(typeof F!=`string`)throw Error(`${n}: Key $import must contain a string or a list of strings`);let a=N.default.resolve(C,F);if(a===n)throw Error(`Self-import detected in ${n}`);let I=S.indexOf(a);if(I!==-1)throw Error(`Circular import detected:
|
|
618
618
|
${[...S,a].map((n,a)=>`${a+1}. ${n}`).join(`
|
|
619
619
|
`)} (same as ${I+1}.)`)}}getSearchPlacesForDir(n,a){return(n.isGlobalConfig?a:this.config.searchPlaces).map(a=>N.default.join(n.path,a))}getGlobalConfigDir(){return(0,S.default)(this.config.moduleName,{suffix:``}).config}*getGlobalDirs(n){let a=N.default.resolve(this.config.stopDir??C.default.homedir());yield{path:n,isGlobalConfig:!1};let S=n;for(;S!==a;){let n=N.default.dirname(S);if(n===S)break;yield{path:n,isGlobalConfig:!1},S=n}yield{path:this.getGlobalConfigDir(),isGlobalConfig:!0}}};n.ExplorerBase=ExplorerBase;function getExtensionDescription(n){return n?`extension "${n}"`:`files without extensions`}n.getExtensionDescription=getExtensionDescription})),Lp=__commonJSMin((n=>{Object.defineProperty(n,"__esModule",{value:!0}),n.mergeAll=n.hasOwn=void 0,n.hasOwn=Function.prototype.call.bind(Object.prototype.hasOwnProperty);let a=Function.prototype.call.bind(Object.prototype.toString);function isPlainObject(n){return a(n)===`[object Object]`}function merge(a,S,C){for(let N of Object.keys(S)){let F=S[N];if((0,n.hasOwn)(a,N)){if(Array.isArray(a[N])&&Array.isArray(F)){if(C.mergeArrays){a[N].push(...F);continue}}else if(isPlainObject(a[N])&&isPlainObject(F)){a[N]=merge(a[N],F,C);continue}}a[N]=F}return a}function mergeAll(n,a){return n.reduce((n,S)=>merge(n,S,a),{})}n.mergeAll=mergeAll})),Rp=__commonJSMin((n=>{var a=n&&n.__importDefault||function(n){return n&&n.__esModule?n:{default:n}};Object.defineProperty(n,"__esModule",{value:!0}),n.Explorer=void 0;let S=a((as(),__toCommonJS(ns))),C=a((Bo(),__toCommonJS(To))),N=Np(),F=Ip(),I=Lp(),H=Fp();var Explorer=class extends F.ExplorerBase{async load(n){n=C.default.resolve(n);let load=async()=>await this.config.transform(await this.#e(n));return this.loadCache?await(0,H.emplace)(this.loadCache,n,load):await load()}async search(n=``){if(this.config.metaConfigFilePath){this.loadingMetaConfig=!0;let n=await this.load(this.config.metaConfigFilePath);if(this.loadingMetaConfig=!1,n&&!n.isEmpty)return n}n=C.default.resolve(n);let a=this.#i(n),S=await a.next();if(S.done)throw Error(`Could not find any folders to iterate through (start from ${n})`);let F=S.value,search=async()=>{if(await(0,H.isDirectory)(F.path))for(let n of this.getSearchPlacesForDir(F,N.globalConfigSearchPlaces))try{let a=await this.#e(n);if(a!==null&&!(a.isEmpty&&this.config.ignoreEmptySearchPlaces))return await this.config.transform(a)}catch(n){if(n.code===`ENOENT`||n.code===`EISDIR`||n.code===`ENOTDIR`||n.code===`EACCES`)continue;throw n}let n=await a.next();return n.done?await this.config.transform(null):(F=n.value,this.searchCache?await(0,H.emplace)(this.searchCache,F.path,search):await search())};return this.searchCache?await(0,H.emplace)(this.searchCache,n,search):await search()}async#e(n,a=[]){let C=await S.default.readFile(n,{encoding:`utf-8`});return this.toCosmiconfigResult(n,await this.#t(n,C,a))}async#t(n,a,S){let N=await this.#n(n,a);if(!N||!(0,I.hasOwn)(N,`$import`))return N;let F=C.default.dirname(n),{$import:H,...W}=N,K=Array.isArray(H)?H:[H],q=[...S,n];this.validateImports(n,K,q);let Y=await Promise.all(K.map(async n=>{let a=C.default.resolve(F,n);return(await this.#e(a,q))?.config}));return(0,I.mergeAll)([...Y,W],{mergeArrays:this.config.mergeImportArrays})}async#n(n,a){if(a.trim()===``)return;let S=C.default.extname(n),N=this.config.loaders[S||`noExt`]??this.config.loaders.default;if(!N)throw Error(`No loader specified for ${(0,F.getExtensionDescription)(S)}`);try{let F=await N(n,a);return C.default.basename(n,S)===`package`?(0,H.getPropertyByPath)(F,this.config.packageProp??this.config.moduleName)??null:F}catch(a){throw a.filepath=n,a}}async#r(n){try{return await S.default.stat(n),!0}catch{return!1}}async*#i(n){switch(this.config.searchStrategy){case`none`:yield{path:n,isGlobalConfig:!1};return;case`project`:{let a=n;for(;;){yield{path:a,isGlobalConfig:!1};for(let n of[`json`,`yaml`]){let S=C.default.join(a,`package.${n}`);if(await this.#r(S))break}let n=C.default.dirname(a);if(n===a)break;a=n}return}case`global`:yield*this.getGlobalDirs(n)}}};n.Explorer=Explorer})),zp=__commonJSMin((n=>{var a=n&&n.__importDefault||function(n){return n&&n.__esModule?n:{default:n}};Object.defineProperty(n,"__esModule",{value:!0}),n.ExplorerSync=void 0;let S=a((Os(),__toCommonJS(Ts))),C=a((Bo(),__toCommonJS(To))),N=Np(),F=Ip(),I=Lp(),H=Fp();var ExplorerSync=class extends F.ExplorerBase{load(n){n=C.default.resolve(n);let load=()=>this.config.transform(this.#e(n));return this.loadCache?(0,H.emplace)(this.loadCache,n,load):load()}search(n=``){if(this.config.metaConfigFilePath){this.loadingMetaConfig=!0;let n=this.load(this.config.metaConfigFilePath);if(this.loadingMetaConfig=!1,n&&!n.isEmpty)return n}n=C.default.resolve(n);let a=this.#i(n),S=a.next();if(S.done)throw Error(`Could not find any folders to iterate through (start from ${n})`);let F=S.value,search=()=>{if((0,H.isDirectorySync)(F.path))for(let n of this.getSearchPlacesForDir(F,N.globalConfigSearchPlacesSync))try{let a=this.#e(n);if(a!==null&&!(a.isEmpty&&this.config.ignoreEmptySearchPlaces))return this.config.transform(a)}catch(n){if(n.code===`ENOENT`||n.code===`EISDIR`||n.code===`ENOTDIR`||n.code===`EACCES`)continue;throw n}let n=a.next();return n.done?this.config.transform(null):(F=n.value,this.searchCache?(0,H.emplace)(this.searchCache,F.path,search):search())};return this.searchCache?(0,H.emplace)(this.searchCache,n,search):search()}#e(n,a=[]){let C=S.default.readFileSync(n,`utf8`);return this.toCosmiconfigResult(n,this.#t(n,C,a))}#t(n,a,S){let N=this.#n(n,a);if(!N||!(0,I.hasOwn)(N,`$import`))return N;let F=C.default.dirname(n),{$import:H,...W}=N,K=Array.isArray(H)?H:[H],q=[...S,n];this.validateImports(n,K,q);let Y=K.map(n=>{let a=C.default.resolve(F,n);return this.#e(a,q)?.config});return(0,I.mergeAll)([...Y,W],{mergeArrays:this.config.mergeImportArrays})}#n(n,a){if(a.trim()===``)return;let S=C.default.extname(n),N=this.config.loaders[S||`noExt`]??this.config.loaders.default;if(!N)throw Error(`No loader specified for ${(0,F.getExtensionDescription)(S)}`);try{let F=N(n,a);return C.default.basename(n,S)===`package`?(0,H.getPropertyByPath)(F,this.config.packageProp??this.config.moduleName)??null:F}catch(a){throw a.filepath=n,a}}#r(n){try{return S.default.statSync(n),!0}catch{return!1}}*#i(n){switch(this.config.searchStrategy){case`none`:yield{path:n,isGlobalConfig:!1};return;case`project`:{let a=n;for(;;){yield{path:a,isGlobalConfig:!1};for(let n of[`json`,`yaml`]){let S=C.default.join(a,`package.${n}`);if(this.#r(S))break}let n=C.default.dirname(a);if(n===a)break;a=n}return}case`global`:yield*this.getGlobalDirs(n)}}loadSync(n){return this.load(n)}searchSync(n=``){return this.search(n)}};n.ExplorerSync=ExplorerSync})),Bp=__commonJSMin((n=>{Object.defineProperty(n,"__esModule",{value:!0}),n.defaultLoadersSync=n.defaultLoaders=n.globalConfigSearchPlacesSync=n.globalConfigSearchPlaces=n.getDefaultSearchPlacesSync=n.getDefaultSearchPlaces=n.cosmiconfigSync=n.cosmiconfig=void 0;let a=Np();Object.defineProperty(n,"defaultLoaders",{enumerable:!0,get:function(){return a.defaultLoaders}}),Object.defineProperty(n,"defaultLoadersSync",{enumerable:!0,get:function(){return a.defaultLoadersSync}}),Object.defineProperty(n,"getDefaultSearchPlaces",{enumerable:!0,get:function(){return a.getDefaultSearchPlaces}}),Object.defineProperty(n,"getDefaultSearchPlacesSync",{enumerable:!0,get:function(){return a.getDefaultSearchPlacesSync}}),Object.defineProperty(n,"globalConfigSearchPlaces",{enumerable:!0,get:function(){return a.globalConfigSearchPlaces}}),Object.defineProperty(n,"globalConfigSearchPlacesSync",{enumerable:!0,get:function(){return a.globalConfigSearchPlacesSync}});let S=Rp(),C=zp(),N=Fp(),F=function identity(n){return n};function getUserDefinedOptionsFromMetaConfig(){let n=new C.ExplorerSync({moduleName:`cosmiconfig`,stopDir:process.cwd(),searchPlaces:a.metaSearchPlaces,ignoreEmptySearchPlaces:!1,applyPackagePropertyPathToConfiguration:!0,loaders:a.defaultLoaders,transform:F,cache:!0,metaConfigFilePath:null,mergeImportArrays:!0,mergeSearchPlaces:!0,searchStrategy:`none`}).search();if(!n)return null;if(n.config?.loaders)throw Error(`Can not specify loaders in meta config file`);if(n.config?.searchStrategy)throw Error(`Can not specify searchStrategy in meta config file`);let S={mergeSearchPlaces:!0,...n.config??{}};return{config:(0,N.removeUndefinedValuesFromObject)(S),filepath:n.filepath}}function getResolvedSearchPlaces(n,a,S){let C=S.searchPlaces?.map(a=>a.replace(`{name}`,n));return S.mergeSearchPlaces?[...C??[],...a]:C??a}function mergeOptionsBase(n,a,S){let C=getUserDefinedOptionsFromMetaConfig();if(!C)return{...a,...(0,N.removeUndefinedValuesFromObject)(S),loaders:{...a.loaders,...S.loaders}};let F=C.config,I=S.searchPlaces??a.searchPlaces;return{...a,...(0,N.removeUndefinedValuesFromObject)(S),metaConfigFilePath:C.filepath,...F,searchPlaces:getResolvedSearchPlaces(n,I,F),loaders:{...a.loaders,...S.loaders}}}function validateOptions(n){if(n.searchStrategy!=null&&n.searchStrategy!==`global`&&n.stopDir)throw Error('Can not supply `stopDir` option with `searchStrategy` other than "global"')}function mergeOptions(n,S){return validateOptions(S),mergeOptionsBase(n,{moduleName:n,searchPlaces:(0,a.getDefaultSearchPlaces)(n),ignoreEmptySearchPlaces:!0,cache:!0,transform:F,loaders:a.defaultLoaders,metaConfigFilePath:null,mergeImportArrays:!0,mergeSearchPlaces:!0,searchStrategy:S.stopDir?`global`:`none`},S)}function mergeOptionsSync(n,S){return validateOptions(S),mergeOptionsBase(n,{moduleName:n,searchPlaces:(0,a.getDefaultSearchPlacesSync)(n),ignoreEmptySearchPlaces:!0,cache:!0,transform:F,loaders:a.defaultLoadersSync,metaConfigFilePath:null,mergeImportArrays:!0,mergeSearchPlaces:!0,searchStrategy:S.stopDir?`global`:`none`},S)}function cosmiconfig(n,a={}){let C=mergeOptions(n,a),N=new S.Explorer(C);return{search:N.search.bind(N),load:N.load.bind(N),clearLoadCache:N.clearLoadCache.bind(N),clearSearchCache:N.clearSearchCache.bind(N),clearCaches:N.clearCaches.bind(N)}}n.cosmiconfig=cosmiconfig;function cosmiconfigSync(n,a={}){let S=mergeOptionsSync(n,a),N=new C.ExplorerSync(S);return{search:N.search.bind(N),load:N.load.bind(N),clearLoadCache:N.clearLoadCache.bind(N),clearSearchCache:N.clearSearchCache.bind(N),clearCaches:N.clearCaches.bind(N)}}n.cosmiconfigSync=cosmiconfigSync}));const Vp=/^[A-Za-z]:\//;function normalizeWindowsPath(n=``){return n&&n.replace(/\\/g,`/`).replace(Vp,n=>n.toUpperCase())}const Hp=/^[/\\]{2}/,Up=/^[/\\](?![/\\])|^[/\\]{2}(?!\.)|^[A-Za-z]:[/\\]/,Wp=/^[A-Za-z]:$/,normalize=function(n){if(n.length===0)return`.`;n=normalizeWindowsPath(n);let a=n.match(Hp),S=isAbsolute(n),C=n[n.length-1]===`/`;return n=normalizeString(n,!S),n.length===0?S?`/`:C?`./`:`.`:(C&&(n+=`/`),Wp.test(n)&&(n+=`/`),a?S?`//${n}`:`//./${n}`:S&&!isAbsolute(n)?`/${n}`:n)},join=function(...n){let a=``;for(let S of n)if(S)if(a.length>0){let n=a[a.length-1]===`/`,C=S[0]===`/`;n&&C?a+=S.slice(1):a+=n||C?S:`/${S}`}else a+=S;return normalize(a)};function cwd(){return typeof process<`u`&&typeof process.cwd==`function`?process.cwd().replace(/\\/g,`/`):`/`}const resolve=function(...n){n=n.map(n=>normalizeWindowsPath(n));let a=``,S=!1;for(let C=n.length-1;C>=-1&&!S;C--){let N=C>=0?n[C]:cwd();!N||N.length===0||(a=`${N}/${a}`,S=isAbsolute(N))}return a=normalizeString(a,!S),S&&!isAbsolute(a)?`/${a}`:a.length>0?a:`.`};function normalizeString(n,a){let S=``,C=0,N=-1,F=0,I=null;for(let H=0;H<=n.length;++H){if(H<n.length)I=n[H];else if(I===`/`)break;else I=`/`;if(I===`/`){if(!(N===H-1||F===1))if(F===2){if(S.length<2||C!==2||S[S.length-1]!==`.`||S[S.length-2]!==`.`){if(S.length>2){let n=S.lastIndexOf(`/`);n===-1?(S=``,C=0):(S=S.slice(0,n),C=S.length-1-S.lastIndexOf(`/`)),N=H,F=0;continue}else if(S.length>0){S=``,C=0,N=H,F=0;continue}}a&&(S+=S.length>0?`/..`:`..`,C=2)}else S.length>0?S+=`/${n.slice(N+1,H)}`:S=n.slice(N+1,H),C=H-N-1;N=H,F=0}else I===`.`&&F!==-1?++F:F=-1}return S}const isAbsolute=function(n){return Up.test(n)},Gp=Symbol.for(`__confbox_fmt__`),Kp=/^(\s+)/,qp=/(\s+)$/;function i$4(n,a={}){return{sample:a.indent===void 0&&a.preserveIndentation!==!1&&n.slice(0,a?.sampleSize||1024),whiteSpace:a.preserveWhitespace===!1?void 0:{start:Kp.exec(n)?.[0]||``,end:qp.exec(n)?.[0]||``}}}__name$1(i$4,`i`);function a$4(n,a,S){!a||typeof a!=`object`||Object.defineProperty(a,Gp,{enumerable:!1,configurable:!0,writable:!0,value:i$4(n,S)})}__name$1(a$4,`a`);function e$2(n,a=!1){let S=n.length,C=0,N=``,F=0,I=16,H=0,W=0,K=0,q=0,Y=0;function h(a,S){let N=0,F=0;for(;N<a||!S;){let a=n.charCodeAt(C);if(a>=48&&a<=57)F=F*16+a-48;else if(a>=65&&a<=70)F=F*16+a-65+10;else if(a>=97&&a<=102)F=F*16+a-97+10;else break;C++,N++}return N<a&&(F=-1),F}function g(n){C=n,N=``,F=0,I=16,Y=0}function _(){let a=C;if(n.charCodeAt(C)===48)C++;else for(C++;C<n.length&&r$2(n.charCodeAt(C));)C++;if(C<n.length&&n.charCodeAt(C)===46)if(C++,C<n.length&&r$2(n.charCodeAt(C)))for(C++;C<n.length&&r$2(n.charCodeAt(C));)C++;else return Y=3,n.substring(a,C);let S=C;if(C<n.length&&(n.charCodeAt(C)===69||n.charCodeAt(C)===101))if(C++,(C<n.length&&n.charCodeAt(C)===43||n.charCodeAt(C)===45)&&C++,C<n.length&&r$2(n.charCodeAt(C))){for(C++;C<n.length&&r$2(n.charCodeAt(C));)C++;S=C}else Y=3;return n.substring(a,S)}function v(){let a=``,N=C;for(;;){if(C>=S){a+=n.substring(N,C),Y=2;break}let F=n.charCodeAt(C);if(F===34){a+=n.substring(N,C),C++;break}if(F===92){if(a+=n.substring(N,C),C++,C>=S){Y=2;break}switch(n.charCodeAt(C++)){case 34:a+=`"`;break;case 92:a+=`\\`;break;case 47:a+=`/`;break;case 98:a+=`\b`;break;case 102:a+=`\f`;break;case 110:a+=`
|
|
620
|
-
`;break;case 114:a+=`\r`;break;case 116:a+=` `;break;case 117:let n=h(4,!0);n>=0?a+=String.fromCharCode(n):Y=4;break;default:Y=5}N=C;continue}if(F>=0&&F<=31)if(n$3(F)){a+=n.substring(N,C),Y=2;break}else Y=6;C++}return a}function y(){if(N=``,Y=0,F=C,W=H,q=K,C>=S)return F=S,I=17;let a=n.charCodeAt(C);if(t$
|
|
621
|
-
`),H++,K=C,I=14;switch(a){case 123:return C++,I=1;case 125:return C++,I=2;case 91:return C++,I=3;case 93:return C++,I=4;case 58:return C++,I=6;case 44:return C++,I=5;case 34:return C++,N=v(),I=10;case 47:let W=C-1;if(n.charCodeAt(C+1)===47){for(C+=2;C<S&&!n$3(n.charCodeAt(C));)C++;return N=n.substring(W,C),I=12}if(n.charCodeAt(C+1)===42){C+=2;let a=S-1,F=!1;for(;C<a;){let a=n.charCodeAt(C);if(a===42&&n.charCodeAt(C+1)===47){C+=2,F=!0;break}C++,n$3(a)&&(a===13&&n.charCodeAt(C)===10&&C++,H++,K=C)}return F||(C++,Y=1),N=n.substring(W,C),I=13}return N+=String.fromCharCode(a),C++,I=16;case 45:if(N+=String.fromCharCode(a),C++,C===S||!r$2(n.charCodeAt(C)))return I=16;case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:return N+=_(),I=11;default:for(;C<S&&b(a);)C++,a=n.charCodeAt(C);if(F!==C){switch(N=n.substring(F,C),N){case`true`:return I=8;case`false`:return I=9;case`null`:return I=7}return I=16}return N+=String.fromCharCode(a),C++,I=16}}function b(n){if(t$
|
|
620
|
+
`;break;case 114:a+=`\r`;break;case 116:a+=` `;break;case 117:let n=h(4,!0);n>=0?a+=String.fromCharCode(n):Y=4;break;default:Y=5}N=C;continue}if(F>=0&&F<=31)if(n$3(F)){a+=n.substring(N,C),Y=2;break}else Y=6;C++}return a}function y(){if(N=``,Y=0,F=C,W=H,q=K,C>=S)return F=S,I=17;let a=n.charCodeAt(C);if(t$2(a)){do C++,N+=String.fromCharCode(a),a=n.charCodeAt(C);while(t$2(a));return I=15}if(n$3(a))return C++,N+=String.fromCharCode(a),a===13&&n.charCodeAt(C)===10&&(C++,N+=`
|
|
621
|
+
`),H++,K=C,I=14;switch(a){case 123:return C++,I=1;case 125:return C++,I=2;case 91:return C++,I=3;case 93:return C++,I=4;case 58:return C++,I=6;case 44:return C++,I=5;case 34:return C++,N=v(),I=10;case 47:let W=C-1;if(n.charCodeAt(C+1)===47){for(C+=2;C<S&&!n$3(n.charCodeAt(C));)C++;return N=n.substring(W,C),I=12}if(n.charCodeAt(C+1)===42){C+=2;let a=S-1,F=!1;for(;C<a;){let a=n.charCodeAt(C);if(a===42&&n.charCodeAt(C+1)===47){C+=2,F=!0;break}C++,n$3(a)&&(a===13&&n.charCodeAt(C)===10&&C++,H++,K=C)}return F||(C++,Y=1),N=n.substring(W,C),I=13}return N+=String.fromCharCode(a),C++,I=16;case 45:if(N+=String.fromCharCode(a),C++,C===S||!r$2(n.charCodeAt(C)))return I=16;case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:return N+=_(),I=11;default:for(;C<S&&b(a);)C++,a=n.charCodeAt(C);if(F!==C){switch(N=n.substring(F,C),N){case`true`:return I=8;case`false`:return I=9;case`null`:return I=7}return I=16}return N+=String.fromCharCode(a),C++,I=16}}function b(n){if(t$2(n)||n$3(n))return!1;switch(n){case 125:case 93:case 123:case 91:case 34:case 58:case 44:case 47:return!1}return!0}function x(){let n;do n=y();while(n>=12&&n<=15);return n}return{setPosition:g,getPosition:()=>C,scan:a?x:y,getToken:()=>I,getTokenValue:()=>N,getTokenOffset:()=>F,getTokenLength:()=>C-F,getTokenStartLine:()=>W,getTokenStartCharacter:()=>F-q,getTokenError:()=>Y}}__name$1(e$2,`e`);function t$2(n){return n===32||n===9}__name$1(t$2,`t`);function n$3(n){return n===10||n===13}__name$1(n$3,`n`);function r$2(n){return n>=48&&n<=57}__name$1(r$2,`r`);var Jp;(function(n){n[n.lineFeed=10]=`lineFeed`,n[n.carriageReturn=13]=`carriageReturn`,n[n.space=32]=`space`,n[n._0=48]=`_0`,n[n._1=49]=`_1`,n[n._2=50]=`_2`,n[n._3=51]=`_3`,n[n._4=52]=`_4`,n[n._5=53]=`_5`,n[n._6=54]=`_6`,n[n._7=55]=`_7`,n[n._8=56]=`_8`,n[n._9=57]=`_9`,n[n.a=97]=`a`,n[n.b=98]=`b`,n[n.c=99]=`c`,n[n.d=100]=`d`,n[n.e=101]=`e`,n[n.f=102]=`f`,n[n.g=103]=`g`,n[n.h=104]=`h`,n[n.i=105]=`i`,n[n.j=106]=`j`,n[n.k=107]=`k`,n[n.l=108]=`l`,n[n.m=109]=`m`,n[n.n=110]=`n`,n[n.o=111]=`o`,n[n.p=112]=`p`,n[n.q=113]=`q`,n[n.r=114]=`r`,n[n.s=115]=`s`,n[n.t=116]=`t`,n[n.u=117]=`u`,n[n.v=118]=`v`,n[n.w=119]=`w`,n[n.x=120]=`x`,n[n.y=121]=`y`,n[n.z=122]=`z`,n[n.A=65]=`A`,n[n.B=66]=`B`,n[n.C=67]=`C`,n[n.D=68]=`D`,n[n.E=69]=`E`,n[n.F=70]=`F`,n[n.G=71]=`G`,n[n.H=72]=`H`,n[n.I=73]=`I`,n[n.J=74]=`J`,n[n.K=75]=`K`,n[n.L=76]=`L`,n[n.M=77]=`M`,n[n.N=78]=`N`,n[n.O=79]=`O`,n[n.P=80]=`P`,n[n.Q=81]=`Q`,n[n.R=82]=`R`,n[n.S=83]=`S`,n[n.T=84]=`T`,n[n.U=85]=`U`,n[n.V=86]=`V`,n[n.W=87]=`W`,n[n.X=88]=`X`,n[n.Y=89]=`Y`,n[n.Z=90]=`Z`,n[n.asterisk=42]=`asterisk`,n[n.backslash=92]=`backslash`,n[n.closeBrace=125]=`closeBrace`,n[n.closeBracket=93]=`closeBracket`,n[n.colon=58]=`colon`,n[n.comma=44]=`comma`,n[n.dot=46]=`dot`,n[n.doubleQuote=34]=`doubleQuote`,n[n.minus=45]=`minus`,n[n.openBrace=123]=`openBrace`,n[n.openBracket=91]=`openBracket`,n[n.plus=43]=`plus`,n[n.slash=47]=`slash`,n[n.formFeed=12]=`formFeed`,n[n.tab=9]=`tab`})(Jp||={}),Array(20).fill(0).map((n,a)=>` `.repeat(a)),Array(200).fill(0).map((n,a)=>`
|
|
622
622
|
`+` `.repeat(a)),Array(200).fill(0).map((n,a)=>`\r`+` `.repeat(a)),Array(200).fill(0).map((n,a)=>`\r
|
|
623
623
|
`+` `.repeat(a)),Array(200).fill(0).map((n,a)=>`
|
|
624
624
|
`+` `.repeat(a)),Array(200).fill(0).map((n,a)=>`\r`+` `.repeat(a)),Array(200).fill(0).map((n,a)=>`\r
|
|
@@ -752,7 +752,7 @@ No install command available for your package manager. Install manually.`),proce
|
|
|
752
752
|
`))a.length>0&&S.write(`${n}${a}\n`)})};forward(C.stdout,process.stdout),forward(C.stderr,process.stderr)}C.on(`close`,n=>S(n??1)),C.on(`error`,()=>S(1))})}const gE={command:`check`,description:"Run `npm run check` (TypeScript type-check) across the current workspace. In a workspace root: walks every package with a `check` script (excludes @girs/*; honours --include/--exclude). In a single package: runs the local `check` script directly. Symmetric peer of `gjsify format` / `lint` / `fix`. (Legacy system-dep `gjsify check` is now `gjsify system-check` — see #254.)",builder:n=>n.option(`include`,{description:`Only run in workspaces matching these glob patterns (repeatable).`,type:`string`,array:!0}).option(`exclude`,{description:`Skip workspaces matching these glob patterns (repeatable). Always excludes @girs/*.`,type:`string`,array:!0}).option(`parallel`,{description:`Run workspace checks in parallel (default). Use --no-parallel to run them sequentially with full per-workspace output.`,type:`boolean`,alias:`p`,default:!0}).option(`jobs`,{description:`Max parallel workers (when --parallel). Default: os.cpus().length.`,type:`number`,alias:`j`}).option(`verbose`,{description:`Log the per-workspace command before spawning.`,type:`boolean`,default:!1}),handler:async n=>{let a=process.cwd(),S=findWorkspaceRoot(a);if(S&&a!==S&&readPackageJson$1(a)?.scripts?.check){n.verbose&&Ae.log(`[check] cwd=${a} → npm run check`);let S=spawnSync(`npm`,[`run`,`check`],{cwd:a,stdio:`inherit`});process.exit(S.status??1)}S||(Ae.error("gjsify check: no workspace root found from cwd. Run inside a workspace (or a package within one) with `npm run check` defined."),process.exit(1));let C=discoverWorkspaces(S),N=[`@girs/*`,...n.exclude??[]],F=filterWorkspaces(C,{include:n.include,exclude:N}).filter(n=>n.manifest.scripts?.check!==void 0);if(F.length===0&&(Ae.error("gjsify check: no workspaces with a `check` script found."),process.exit(1)),n.verbose&&Ae.log(`[check] root=${S} workspaces=${F.length} parallel=${n.parallel?`yes`:`no`}`),!n.parallel){let a=0;for(let S of F){n.verbose&&Ae.log(`[check] → ${S.name}`);let C=await runCheck(S,null);C!==0&&a===0&&(a=C)}a!==0&&Ae.error(`gjsify check: failures in ${F.filter(async n=>await runCheck(n,null)!==0).length}+ workspaces`),process.exit(a)}let I=n.jobs??Math.max(1,cpus().length),H=[],W=0,K=[];for(let n=0;n<I;n++)K.push((async()=>{for(;;){let n=W++;if(n>=F.length)return;let a=F[n],S=await runCheck(a,a.name);S!==0&&H.push({name:a.name,code:S})}})());if(await Promise.all(K),H.length>0){Ae.error(`\ngjsify check: ${H.length} of ${F.length} workspace(s) failed:`);for(let n of H)Ae.error(` ✗ ${n.name} (exit ${n.code})`);process.exit(1)}n.verbose&&Ae.log(`\ngjsify check: ${F.length} workspace(s) green.`),process.exit(0)}};Os(),Bo(),en();function manifestPath(){return ko(Mo(fileURLToPath(import.meta.url)),`..`,`..`,`showcases.json`)}function discoverShowcases(){let n=manifestPath();if(!existsSync(n))return[];let a;try{a=JSON.parse(readFileSync(n,`utf-8`))}catch{return[]}if(!Array.isArray(a.showcases))return[];let S=a.showcases.map(n=>({name:n.name,packageName:n.package,category:n.category,description:n.description??``,needsWebgl:!!n.needsWebgl}));return S.sort((n,a)=>n.category.localeCompare(a.category)||n.name.localeCompare(a.name)),S}function findShowcase(n){return discoverShowcases().find(a=>a.name===n)}je(),Ux(),en(),Os();function readCliVersion(){try{let n=new URL(`../../package.json`,import.meta.url),a=JSON.parse(readFileSync(n,`utf8`));return typeof a.version==`string`?a.version:void 0}catch{return}}const _E={command:`showcase [name]`,description:`List or run curated gjsify showcase applications.`,builder:n=>n.positional(`name`,{description:`Showcase name to run (omit to list all)`,type:`string`}).option(`json`,{description:`Output as JSON`,type:`boolean`,default:!1}).option(`list`,{description:`List available showcases`,type:`boolean`,default:!1}),handler:async n=>{if(!n.name||n.list){let a=discoverShowcases();if(n.json){Ae.log(JSON.stringify(a,null,2));return}if(a.length===0){Ae.log("No showcases found. The CLI ships a curated list in `showcases.json`; if it is missing the CLI install is incomplete.");return}let S=new Map;for(let n of a){let a=S.get(n.category)??[];a.push(n),S.set(n.category,a)}Ae.log(`Available gjsify showcases:
|
|
753
753
|
`);for(let[n,a]of S){Ae.log(` ${n.toUpperCase()}:`);let S=Math.max(...a.map(n=>n.name.length));for(let n of a){let a=` `.repeat(S-n.name.length+2),C=n.description?`${a}${n.description}`:``;Ae.log(` ${n.name}${C}`)}Ae.log(``)}Ae.log(`Run a showcase: gjsify showcase <name>`);return}let a=findShowcase(n.name);a||(Ae.error(`Unknown showcase: "${n.name}"`),Ae.error(`Run "gjsify showcase" to list available showcases.`),process.exit(1));let S=runMinimalChecks().filter(n=>!n.found&&n.severity===`required`);if(S.length>0){Ae.error(`Missing system dependencies:
|
|
754
754
|
`);for(let n of S)Ae.error(` ✗ ${n.name}`);let n=buildInstallCommand(detectPackageManager$2(),S);n&&Ae.error(`\nInstall with:\n ${n}`),process.exit(1)}let C=readCliVersion(),N=C?`${a.packageName}@${C}`:a.packageName;Ae.log(`Running showcase: ${a.name} (via gjsify dlx ${N})\n`);let F=fileURLToPath(new URL(`../index.js`,import.meta.url)),I=spawn(process.execPath,[F,`dlx`,N],{stdio:`inherit`});await new Promise((n,a)=>{I.on(`close`,S=>{S===0?n():a(Error(`gjsify dlx exited with code ${S}`))}),I.on(`error`,a)}).catch(n=>{Ae.error(n.message),process.exit(1)})}};Os(),Bo(),en();const vE={"gtk-minimal":`Minimal GTK4 app — Gtk.Window + Gtk.Label (no Adwaita, no Blueprint).`,cli:`Command-line tool using yargs (Node.js + GJS).`,"adw-canvas2d":`Adwaita app with HTML Canvas 2D rendering (Blueprint UI).`,"adw-webgl":`Adwaita app with WebGL + three.js (Blueprint UI).`,"adw-game":`Adwaita game shell using Excalibur.js, WebGL → Canvas2D fallback.`,"web-server-hono":`HTTP server using Hono (Web-standard fetch-style API).`,"web-server-express":`HTTP server using Express (familiar Node.js stack).`};function discoverTemplates(){let n=ko(ko(Mo(fileURLToPath(import.meta.url)),`..`),`dist-templates`);if(!existsSync(n))return[];let a=[];for(let S of readdirSync(n)){let C=ko(n,S),N=ko(C,`package.json`);if(!statSync(C).isDirectory()||!existsSync(N))continue;let F=vE[S]??``;try{let n=JSON.parse(readFileSync(N,`utf-8`));typeof n.description==`string`&&n.description.trim()&&(F=n.description)}catch{}a.push({name:S,description:F,path:C})}return a.sort((n,a)=>n.name.localeCompare(a.name)),a}function findTemplate(n){return discoverTemplates().find(a=>a.name===n)}je(),Ux(),Os(),Bo();const yE=`new-gjsify-app`,bE=new Set([`.json`,`.md`,`.ts`,`.tsx`,`.js`,`.mjs`,`.cjs`,`.blp`,`.html`,`.css`,`.scss`,`.xml`,`.ui`,`.txt`]);function sanitizeProjectName(n){let a=n.trim();if(!a)throw Error(`Project name cannot be empty.`);let S=a.toLowerCase().replace(/[^a-z0-9._-]+/g,`-`).replace(/^[._-]+/,``).replace(/[._-]+$/,``);if(!S)throw Error(`"${n}" is not a valid npm package name.`);return S}function isDirEmpty(n){return existsSync(n)?readdirSync(n).length===0:!0}async function createProject(n){let a=sanitizeProjectName(n.projectName),{template:S,force:C=!1,install:N=!1}=n,F=findTemplate(S);if(!F){let n=discoverTemplates().map(n=>n.name).join(`, `);throw Error(`Unknown template "${S}". Available templates: ${n||`(none — run "yarn build" first)`}`)}let I=Eo(process.cwd(),a);existsSync(I)&&!isDirEmpty(I)&&!C&&(Ae.error(`Error: Directory "${a}" exists and is not empty. Use --force to scaffold into it anyway.`),process.exit(1)),Ae.log(`Creating new Gjsify project in ${I} (template: ${F.name})...`),mkdirSync(I,{recursive:!0}),cpSync(F.path,I,{recursive:!0}),substituteProjectName(I,a),N&&(Ae.log(`Running npm install...`),spawnSync(`npm`,[`install`,`--no-audit`,`--no-fund`],{cwd:I,stdio:`inherit`}).status!==0&&Ae.warn(`npm install failed; re-run it manually in the project directory.`)),printNextSteps(a,F,N)}function substituteProjectName(n,a){let S=new Set([`node_modules`,`dist`,`lib`]),C=[n];for(;C.length>0;){let n=C.pop();for(let N of readdirSync(n,{withFileTypes:!0})){let F=ko(n,N.name);if(N.isDirectory()){S.has(N.name)||C.push(F);continue}if(!N.isFile())continue;let I=N.name.lastIndexOf(`.`),H=I>=0?N.name.slice(I):``;if(!bE.has(H))continue;let W=readFileSync(F,`utf-8`);W.includes(yE)&&writeFileSync(F,W.replaceAll(yE,a))}}}function printNextSteps(n,a,S){Ae.log(``),Ae.log(`Project created from template "${a.name}".`),Ae.log(``),Ae.log(`Next steps:`),Ae.log(` cd ${n}`),S||Ae.log(` npm install`),Ae.log(` npm run dev`),Ae.log(``)}gs();const xE={reset:`\x1B[0m`,bold:`\x1B[1m`,dim:`\x1B[2m`,cyan:`\x1B[36m`,green:`\x1B[32m`};function render(n,a,S){S||Kt.write(`\x1b[${n.length}A`);for(let S=0;S<n.length;S++){let C=n[S],N=S===a?`${xE.cyan}❯${xE.reset}`:` `,F=S===a?`${xE.bold}${xE.green}${C.name}${xE.reset}`:C.name;Kt.write(`\x1b[2K\r ${N} ${F} ${xE.dim}${C.description}${xE.reset}\n`)}}function promptTemplate(n){return n.length===0?Promise.reject(Error(`No templates available.`)):new Promise((a,S)=>{let C=0;Kt.write(`${xE.bold}Select a template${xE.reset} ${xE.dim}(↑/↓ to navigate, Enter to confirm, Ctrl+C to cancel)${xE.reset}\n`),render(n,C,!0),emitKeypressEvents(qt),qt.isTTY&&qt.setRawMode(!0),qt.resume();let cleanup=()=>{qt.removeListener(`keypress`,onKeypress),qt.isTTY&&qt.setRawMode(!1),qt.pause()},onKeypress=(N,F)=>{if(F){if(F.ctrl&&F.name===`c`){cleanup(),Kt.write(`
|
|
755
|
-
`),S(Error(`Cancelled by user`));return}F.name===`up`||F.name===`k`?(C=(C-1+n.length)%n.length,render(n,C,!1)):F.name===`down`||F.name===`j`?(C=(C+1)%n.length,render(n,C,!1)):(F.name===`return`||F.name===`enter`)&&(cleanup(),a(n[C]))}};qt.on(`keypress`,onKeypress)})}je();const SE={command:`create [project-name]`,description:`Scaffold a new Gjsify project in a new directory.`,builder:n=>{let a=discoverTemplates().map(n=>n.name);return n.positional(`project-name`,{describe:`Name of the project directory to create`,type:`string`,default:`my-gjs-app`}).option(`template`,{alias:`t`,describe:`Template to scaffold from`,type:`string`,choices:a.length>0?a:void 0}).option(`force`,{alias:`f`,describe:`Scaffold into a non-empty directory`,type:`boolean`,default:!1}).option(`install`,{describe:`Run npm install after scaffolding`,type:`boolean`,default:!1})},handler:async n=>{let a=n.template;if(!a){let n=discoverTemplates();if(!process.stdin.isTTY){let a=n.map(n=>n.name).join(`, `);Ae.error(`Error: --template is required in non-interactive mode. Available templates: ${a||`(none)`}`),process.exit(1)}a=(await promptTemplate(n)).name}await createProject({projectName:n[`project-name`],template:a,force:n.force,install:n.install})}};je(),Ux(),as(),Bo(),Gc();const CE=promisify(execFile);function defaultTargetFor(n){let a=No(n,Po(n));return Eo(Mo(n),a)}const wE={command:`gresource <xml>`,description:"Compile a GResource XML descriptor into a binary .gresource bundle (wraps `glib-compile-resources`).",builder:n=>n.positional(`xml`,{description:`Path to the .gresource.xml descriptor`,type:`string`,normalize:!0,demandOption:!0}).option(`sourcedir`,{description:`Directory containing the resource files referenced by <xml>`,type:`string`,normalize:!0}).option(`target`,{alias:`t`,description:`Output .gresource file (default: <xml-without-.xml> next to <xml>)`,type:`string`,normalize:!0}).option(`verbose`,{description:`Print the underlying glib-compile-resources invocation`,type:`boolean`,default:!1}),handler:async n=>{let a=Eo(n.xml),S=n.target?Eo(n.target):defaultTargetFor(a),C=[`--sourcedir=${n.sourcedir?Eo(n.sourcedir):Mo(a)}`,`--target=${S}`,a];n.verbose&&Ae.log(`[gjsify gresource] glib-compile-resources ${C.join(` `)}`),await mkdir$1(Mo(S),{recursive:!0});try{let{stdout:a,stderr:N}=await CE(`glib-compile-resources`,C);a&&process.stdout.write(a),N&&process.stderr.write(N),n.verbose&&Ae.log(`[gjsify gresource] wrote ${S}`)}catch(n){let a=n;a?.code===`ENOENT`?Ae.error(`[gjsify gresource] glib-compile-resources not found. Install it via your distro (package: glib2-devel / libglib2.0-dev).`):(a?.stderr&&process.stderr.write(a.stderr),Ae.error(`[gjsify gresource] glib-compile-resources failed${a?.code===void 0?``:` (exit ${a.code})`}`)),process.exitCode=typeof a?.code==`number`?a.code:1}}};je(),Ux(),as(),Bo(),Gc();const TE=promisify(execFile);async function listLanguages(n){return(await readdir$1(n)).filter(n=>n.endsWith(`.po`)&&!n.startsWith(`.`)).map(n=>n.slice(0,-3)).sort()}function stripXmlComments(n){return n.replace(/<!--[\s\S]*?-->/g,``)}async function ensureDir(n){await mkdir$1(n,{recursive:!0})}async function fileExists(n){try{return await stat$1(n),!0}catch{return!1}}async function compileBulkXml(n){let a=ko(n.outDir,n.filename);await ensureDir(n.outDir);let S=[`--output-file=${a}`,`--xml`,`--template=${n.template}`,`-d`,n.poDir];n.verbose&&Ae.log(`[gjsify gettext] msgfmt ${S.join(` `)}`),await TE(`msgfmt`,S),n.removeXmlComments&&await writeFile$1(a,stripXmlComments(await readFile$1(a,`utf-8`))),n.verbose&&Ae.log(`[gjsify gettext] wrote ${a}`)}async function compilePerLanguage(n){let a=await listLanguages(n.poDir);if(a.length===0){Ae.warn(`[gjsify gettext] no .po files found in ${n.poDir}`);return}for(let S of a){let a=ko(n.poDir,`${S}.po`),C=n.format===`mo`?ko(n.outDir,S,`LC_MESSAGES`):ko(n.outDir,S);await ensureDir(C);let N=[`--output-file=${ko(C,n.filename)}`];n.format!==`mo`&&N.push(`--${n.format}`),N.push(a),n.verbose&&Ae.log(`[gjsify gettext] msgfmt ${N.join(` `)}`),await TE(`msgfmt`,N)}n.verbose&&Ae.log(`[gjsify gettext] compiled ${a.length} language(s) into ${n.outDir}`)}function defaultFilename(n,a,S){switch(a){case`mo`:return`${n}.mo`;case`json`:return`${n}.json`;case`desktop`:return`${n}.desktop`;case`xml`:if(S){let n=S.replace(/\.in$/,``),a=n.lastIndexOf(`/`);return a>=0?n.slice(a+1):n}return`${n}.xml`}}const EE={command:`gettext <poDir> <outDir>`,description:`Compile gettext .po files to .mo (per-language locale tree) or substitute a metainfo template via msgfmt --xml.`,builder:n=>n.positional(`poDir`,{description:`Directory containing <lang>.po files`,type:`string`,normalize:!0,demandOption:!0}).positional(`outDir`,{description:`Output directory (locale tree for --format=mo, plain dir for xml/desktop/json)`,type:`string`,normalize:!0,demandOption:!0}).option(`domain`,{description:"Text domain / application ID (e.g. `org.pixelrpg.maker`)",type:`string`,normalize:!0,demandOption:!0}).option(`format`,{description:`Output format`,type:`string`,choices:[`mo`,`xml`,`desktop`,`json`],default:`mo`}).option(`metainfo`,{description:"For --format=xml: path to the template (`.metainfo.xml.in`) used as msgfmt --template",type:`string`,normalize:!0}).option(`filename`,{description:`Override the output filename (defaults to <domain>.<ext>)`,type:`string`,normalize:!0}).option(`remove-xml-comments`,{description:`For --format=xml: strip XML comments from the compiled output`,type:`boolean`,default:!0}).option(`verbose`,{description:`Print each msgfmt invocation`,type:`boolean`,default:!1}),handler:async n=>{let a=Eo(n.poDir),S=Eo(n.outDir),C=n.domain,N=n.format??`mo`,F=n.metainfo?Eo(n.metainfo):void 0,I=n.filename??defaultFilename(C,N,F),H=!!n.verbose,W=!!n[`remove-xml-comments`];if(!await fileExists(a)){Ae.error(`[gjsify gettext] PO directory does not exist: ${a}`),process.exitCode=1;return}try{N===`xml`&&F?await compileBulkXml({poDir:a,outDir:S,domain:C,template:F,filename:I,removeXmlComments:W,verbose:H}):(N===`xml`&&Ae.warn(`[gjsify gettext] --format=xml without --metainfo: falling back to per-language XML files`),await compilePerLanguage({poDir:a,outDir:S,domain:C,format:N,filename:I,verbose:H}))}catch(n){let a=n;a?.code===`ENOENT`?Ae.error(`[gjsify gettext] msgfmt not found. Install it via your distro (package: gettext).`):(a?.stderr&&process.stderr.write(a.stderr),Ae.error(`[gjsify gettext] msgfmt failed${a?.code===void 0?``:` (exit ${a.code})`}`)),process.exitCode=typeof a?.code==`number`?a.code:1}}};je(),Ux(),as(),Bo(),Gc();const DE=promisify(execFile),OE={command:`gsettings <schemadir>`,description:"Compile GSettings schema XML files into a binary gschemas.compiled (wraps `glib-compile-schemas`).",builder:n=>n.positional(`schemadir`,{description:`Directory containing *.gschema.xml descriptors`,type:`string`,normalize:!0,demandOption:!0}).option(`targetdir`,{alias:`t`,description:`Directory to write gschemas.compiled (default: <schemadir>)`,type:`string`,normalize:!0}).option(`strict`,{description:`Abort on any schema warning (passes --strict to glib-compile-schemas)`,type:`boolean`,default:!0}).option(`verbose`,{description:`Print the underlying glib-compile-schemas invocation`,type:`boolean`,default:!1}),handler:async n=>{let a=Eo(n.schemadir),S=n.targetdir?Eo(n.targetdir):a,C=[];n.strict&&C.push(`--strict`),C.push(`--targetdir=${S}`),C.push(a),n.verbose&&Ae.log(`[gjsify gsettings] glib-compile-schemas ${C.join(` `)}`),await mkdir$1(S,{recursive:!0});try{let{stdout:a,stderr:N}=await DE(`glib-compile-schemas`,C);a&&process.stdout.write(a),N&&process.stderr.write(N),n.verbose&&Ae.log(`[gjsify gsettings] wrote ${S}/gschemas.compiled`)}catch(n){let a=n;a?.code===`ENOENT`?Ae.error(`[gjsify gsettings] glib-compile-schemas not found. Install it via your distro (package: glib2-devel / libglib2.0-dev).`):(a?.stderr&&process.stderr.write(a.stderr),Ae.error(`[gjsify gsettings] glib-compile-schemas failed${a?.code===void 0?``:` (exit ${a.code})`}`)),process.exitCode=typeof a?.code==`number`?a.code:1}}};Os(),Bo();const kE=[`--device=dri`,`--share=ipc`,`--socket=fallback-x11`,`--socket=wayland`],AE=[];function readPackageJson(n){let a=Eo(n,`package.json`),S;try{S=readFileSync(a,`utf-8`)}catch{throw Error(`gjsify flatpak: no package.json found at ${a}`)}try{return JSON.parse(S)}catch(n){throw Error(`gjsify flatpak: package.json at ${a} is not valid JSON: ${n.message}`)}}function looksLikeAppId(n){return typeof n==`string`&&/^[A-Za-z][A-Za-z0-9_-]*(\.[A-Za-z][A-Za-z0-9_-]*){2,}$/.test(n)}function resolveRuntime(n,a){let S=a.runtime??n?.runtime??`gnome`;if(S!==`gnome`&&S!==`freedesktop`)throw Error(`gjsify flatpak: unknown runtime "${S}" (expected "gnome" or "freedesktop")`);let C=a.runtimeVersion??n?.runtimeVersion??(S===`gnome`?`50`:`24.08`);return S===`gnome`?{runtime:S,runtimeId:`org.gnome.Platform`,sdk:`org.gnome.Sdk`,runtimeVersion:C}:{runtime:S,runtimeId:`org.freedesktop.Platform`,sdk:`org.freedesktop.Sdk`,runtimeVersion:C}}function defaultCiContainer(n,a){return`ghcr.io/flathub-infra/flatpak-github-actions:${`${n}-${a}`}`}Os();function loadDesktopTemplate(){return readFileSync(new URL(`../../templates/flatpak/desktop.tmpl`,import.meta.url),`utf-8`)}function loadFlathubAppTemplate(){return readFileSync(new URL(`../../templates/flatpak/flathub-app.json.tmpl`,import.meta.url),`utf-8`)}function loadFlathubCliTemplate(){return readFileSync(new URL(`../../templates/flatpak/flathub-cli.json.tmpl`,import.meta.url),`utf-8`)}function validateScaffoldInputs(n){let a=n.flatpak,S=[];return(!a.developer?.id||!a.developer?.name)&&S.push({field:`gjsify.flatpak.developer`,hint:'Set `gjsify.flatpak.developer = { "id": "io.github.you", "name": "Your Name" }` in package.json. The id is reverse-DNS.'}),a.summary||S.push({field:`gjsify.flatpak.summary`,hint:`One-line app summary, ≤80 chars, no trailing period. Example: "Learn 6502 assembly language".`}),a.description||S.push({field:`gjsify.flatpak.description`,hint:`Plain text (split on blank lines) or DescriptionBlock[] for rich content with bullet lists + translator hints.`}),a.license?.project||S.push({field:`gjsify.flatpak.license.project`,hint:`SPDX identifier of the project license, e.g. "MIT", "GPL-3.0-or-later".`}),a.homepageUrl||S.push({field:`gjsify.flatpak.homepageUrl`,hint:`Required by Flathub. Example: "https://github.com/you/your-repo".`}),S}function renderMetainfoApp(n){return renderMetainfo(n,`desktop-application`)}function renderMetainfoCli(n){return renderMetainfo(n,`console-application`)}function renderDesktop(n){let a=n.flatpak,S=(a.categories??[`Utility`]).join(`;`)+`;`,C=a.keywords?.length?`Keywords=${a.keywords.join(`;`)};\n`:``;return substitute(loadDesktopTemplate(),{NAME:n.name,SUMMARY:a.summary??n.name,COMMAND:n.command,APP_ID:n.appId,CATEGORIES_LINE:S,KEYWORDS_LINE:C})}function renderFlathubJson(n){return n===`cli`?loadFlathubCliTemplate():loadFlathubAppTemplate()}function renderMetainfo(n,a){let S=n.flatpak,C=new Date().getFullYear(),N=S.developer?.name??``,F=[];F.push(`<?xml version="1.0" encoding="UTF-8"?>`),F.push(`<!-- Copyright ${C} ${escapeXml(N)} -->`),F.push(`<component type="${a}">`),F.push(` <id>${escapeXml(n.appId)}</id>`),F.push(` <metadata_license>${escapeXml(S.license?.metadata??`CC0-1.0`)}</metadata_license>`),F.push(` <project_license>${escapeXml(S.license?.project??``)}</project_license>`),F.push(` <name>${escapeXml(n.name)}</name>`),pushTranslatorHint(F,S.summaryTranslatorHint,` `),F.push(` <summary>${escapeXml(S.summary??n.name)}</summary>`),S.iconRemote&&F.push(` <icon type="remote">${escapeXml(S.iconRemote)}</icon>`),F.push(` <description>`);for(let n of renderDescriptionBlocks(S.description??``,` `))F.push(n);if(F.push(` </description>`),S.developer?.id&&S.developer?.name){F.push(` <developer id="${escapeXml(S.developer.id)}">`);let n=S.developer.nameTranslatable===!0?``:` translate="no"`;F.push(` <name${n}>${escapeXml(S.developer.name)}</name>`),S.developer.email&&F.push(` <email>${escapeXml(S.developer.email)}</email>`),F.push(` </developer>`)}a===`desktop-application`&&F.push(` <launchable type="desktop-id">${escapeXml(n.appId)}.desktop</launchable>`),S.screenshots?.length&&(F.push(` <screenshots>`),S.screenshots.forEach((n,a)=>{let S=n.type??(a===0?`default`:void 0),C=S?` type="${escapeXml(S)}"`:``,N=n.environment?` environment="${escapeXml(n.environment)}"`:``;F.push(` <screenshot${C}${N}>`),F.push(` <image>${escapeXml(n.url)}</image>`),n.caption&&(pushTranslatorHint(F,n.captionTranslatorHint,` `),F.push(` <caption>${escapeXml(n.caption)}</caption>`)),F.push(` </screenshot>`)}),F.push(` </screenshots>`)),S.homepageUrl&&F.push(` <url type="homepage">${escapeXml(S.homepageUrl)}</url>`),S.bugtrackerUrl&&F.push(` <url type="bugtracker">${escapeXml(S.bugtrackerUrl)}</url>`),S.vcsBrowserUrl&&F.push(` <url type="vcs-browser">${escapeXml(S.vcsBrowserUrl)}</url>`),S.donationUrl&&F.push(` <url type="donation">${escapeXml(S.donationUrl)}</url>`),S.translateUrl&&F.push(` <url type="translate">${escapeXml(S.translateUrl)}</url>`);let I=normaliseContentRating(S.contentRating);if(I.attributes&&Object.keys(I.attributes).length>0){F.push(` <content_rating type="${escapeXml(I.type)}">`);for(let[n,a]of Object.entries(I.attributes))F.push(` <content_attribute id="${escapeXml(n)}">${escapeXml(a)}</content_attribute>`);F.push(` </content_rating>`)}else F.push(` <content_rating type="${escapeXml(I.type)}" />`);if(S.releases?.length){F.push(` <releases>`);for(let n of S.releases)if(n.description===void 0)F.push(` <release version="${escapeXml(n.version)}" date="${escapeXml(n.date)}" />`);else{F.push(` <release version="${escapeXml(n.version)}" date="${escapeXml(n.date)}">`),F.push(` <description>`);for(let a of renderDescriptionBlocks(n.description,` `))F.push(a);F.push(` </description>`),F.push(` </release>`)}F.push(` </releases>`)}if(S.categories?.length){F.push(` <categories>`);for(let n of S.categories)F.push(` <category>${escapeXml(n)}</category>`);F.push(` </categories>`)}if(S.keywords?.length){F.push(` <keywords>`);for(let n of S.keywords)F.push(` <keyword>${escapeXml(n)}</keyword>`);F.push(` </keywords>`)}if(a===`desktop-application`&&S.branding&&(F.push(` <branding>`),F.push(` <color type="primary" scheme_preference="light">${escapeXml(S.branding.accentLight)}</color>`),F.push(` <color type="primary" scheme_preference="dark">${escapeXml(S.branding.accentDark)}</color>`),F.push(` </branding>`)),S.kudos?.length){F.push(` <kudos>`);for(let n of S.kudos)F.push(` <kudo>${escapeXml(n)}</kudo>`);F.push(` </kudos>`)}let H=S.provides?.binaries??[n.command],W=S.provides?.mimetypes??[],K=S.provides?.dbus??[];if(H.length||W.length||K.length){F.push(` <provides>`);for(let n of H)F.push(` <binary>${escapeXml(n)}</binary>`);for(let n of W)F.push(` <mediatype>${escapeXml(n)}</mediatype>`);for(let n of K)F.push(` <dbus type="${escapeXml(n.type)}">${escapeXml(n.id)}</dbus>`);F.push(` </provides>`)}if(S.supports?.controls?.length||S.supports?.internet){F.push(` <supports>`);for(let n of S.supports.controls??[])F.push(` <control>${escapeXml(n)}</control>`);S.supports.internet&&F.push(` <internet>${escapeXml(S.supports.internet)}</internet>`),F.push(` </supports>`)}if(S.requires?.displayLengthMin||S.requires?.controls?.length||S.requires?.internet){F.push(` <requires>`),S.requires.displayLengthMin&&F.push(` <display_length compare="ge">${S.requires.displayLengthMin}</display_length>`);for(let n of S.requires.controls??[])F.push(` <control>${escapeXml(n)}</control>`);S.requires.internet&&F.push(` <internet>${escapeXml(S.requires.internet)}</internet>`),F.push(` </requires>`)}if(S.recommends?.displayLengthMin||S.recommends?.controls?.length){F.push(` <recommends>`),S.recommends.displayLengthMin&&F.push(` <display_length compare="ge">${S.recommends.displayLengthMin}</display_length>`);for(let n of S.recommends.controls??[])F.push(` <control>${escapeXml(n)}</control>`);F.push(` </recommends>`)}return F.push(`</component>`),F.join(`
|
|
755
|
+
`),S(Error(`Cancelled by user`));return}F.name===`up`||F.name===`k`?(C=(C-1+n.length)%n.length,render(n,C,!1)):F.name===`down`||F.name===`j`?(C=(C+1)%n.length,render(n,C,!1)):(F.name===`return`||F.name===`enter`)&&(cleanup(),a(n[C]))}};qt.on(`keypress`,onKeypress)})}je();const SE={command:`create [project-name]`,description:`Scaffold a new Gjsify project in a new directory.`,builder:n=>{let a=discoverTemplates().map(n=>n.name);return n.positional(`project-name`,{describe:`Name of the project directory to create`,type:`string`,default:`my-gjs-app`}).option(`template`,{alias:`t`,describe:`Template to scaffold from`,type:`string`,choices:a.length>0?a:void 0}).option(`force`,{alias:`f`,describe:`Scaffold into a non-empty directory`,type:`boolean`,default:!1}).option(`install`,{describe:`Run npm install after scaffolding`,type:`boolean`,default:!1})},handler:async n=>{let a=n.template;if(!a){let n=discoverTemplates();if(!process.stdin.isTTY){let a=n.map(n=>n.name).join(`, `);Ae.error(`Error: --template is required in non-interactive mode. Available templates: ${a||`(none)`}`),process.exit(1)}a=(await promptTemplate(n)).name}await createProject({projectName:n[`project-name`],template:a,force:n.force,install:n.install})}};je(),Ux(),as(),Bo(),Gc();const CE=promisify(execFile);function defaultTargetFor(n){let a=No(n,Po(n));return Eo(Mo(n),a)}const wE={command:`gresource <xml>`,description:"Compile a GResource XML descriptor into a binary .gresource bundle (wraps `glib-compile-resources`).",builder:n=>n.positional(`xml`,{description:`Path to the .gresource.xml descriptor`,type:`string`,normalize:!0,demandOption:!0}).option(`sourcedir`,{description:`Directory containing the resource files referenced by <xml>`,type:`string`,normalize:!0}).option(`target`,{alias:`t`,description:`Output .gresource file (default: <xml-without-.xml> next to <xml>)`,type:`string`,normalize:!0}).option(`verbose`,{description:`Print the underlying glib-compile-resources invocation`,type:`boolean`,default:!1}),handler:async n=>{let a=Eo(n.xml),S=n.target?Eo(n.target):defaultTargetFor(a),C=[`--sourcedir=${n.sourcedir?Eo(n.sourcedir):Mo(a)}`,`--target=${S}`,a];n.verbose&&Ae.log(`[gjsify gresource] glib-compile-resources ${C.join(` `)}`),await mkdir$1(Mo(S),{recursive:!0});try{let{stdout:a,stderr:N}=await CE(`glib-compile-resources`,C);a&&process.stdout.write(a),N&&process.stderr.write(N),n.verbose&&Ae.log(`[gjsify gresource] wrote ${S}`)}catch(n){let a=n;a?.code===`ENOENT`?Ae.error(`[gjsify gresource] glib-compile-resources not found. Install it via your distro (package: glib2-devel / libglib2.0-dev).`):(a?.stderr&&process.stderr.write(a.stderr),Ae.error(`[gjsify gresource] glib-compile-resources failed${a?.code===void 0?``:` (exit ${a.code})`}`)),process.exitCode=typeof a?.code==`number`?a.code:1}}};je(),Ux(),as(),Bo(),Gc();const TE=promisify(execFile);async function listLanguages(n){return(await readdir$1(n)).filter(n=>n.endsWith(`.po`)&&!n.startsWith(`.`)).map(n=>n.slice(0,-3)).sort()}function stripXmlComments(n){return n.replace(/<!--[\s\S]*?-->/g,``)}async function ensureDir(n){await mkdir$1(n,{recursive:!0})}async function fileExists(n){try{return await stat$1(n),!0}catch{return!1}}async function compileBulkXml(n){let a=ko(n.outDir,n.filename);await ensureDir(n.outDir);let S=[`--output-file=${a}`,`--xml`,`--template=${n.template}`,`-d`,n.poDir];n.verbose&&Ae.log(`[gjsify gettext] msgfmt ${S.join(` `)}`),await TE(`msgfmt`,S),n.removeXmlComments&&await writeFile$1(a,stripXmlComments(await readFile$1(a,`utf-8`))),n.verbose&&Ae.log(`[gjsify gettext] wrote ${a}`)}async function compilePerLanguage(n){let a=await listLanguages(n.poDir);if(a.length===0){Ae.warn(`[gjsify gettext] no .po files found in ${n.poDir}`);return}for(let S of a){let a=ko(n.poDir,`${S}.po`),C=n.format===`mo`?ko(n.outDir,S,`LC_MESSAGES`):ko(n.outDir,S);await ensureDir(C);let N=[`--output-file=${ko(C,n.filename)}`];n.format!==`mo`&&N.push(`--${n.format}`),N.push(a),n.verbose&&Ae.log(`[gjsify gettext] msgfmt ${N.join(` `)}`),await TE(`msgfmt`,N)}n.verbose&&Ae.log(`[gjsify gettext] compiled ${a.length} language(s) into ${n.outDir}`)}function defaultFilename(n,a,S){switch(a){case`mo`:return`${n}.mo`;case`json`:return`${n}.json`;case`desktop`:return`${n}.desktop`;case`xml`:if(S){let n=S.replace(/\.in$/,``),a=n.lastIndexOf(`/`);return a>=0?n.slice(a+1):n}return`${n}.xml`}}const EE={command:`gettext <poDir> <outDir>`,description:`Compile gettext .po files to .mo (per-language locale tree) or substitute a metainfo template via msgfmt --xml.`,builder:n=>n.positional(`poDir`,{description:`Directory containing <lang>.po files`,type:`string`,normalize:!0,demandOption:!0}).positional(`outDir`,{description:`Output directory (locale tree for --format=mo, plain dir for xml/desktop/json)`,type:`string`,normalize:!0,demandOption:!0}).option(`domain`,{description:"Text domain / application ID (e.g. `org.pixelrpg.maker`)",type:`string`,normalize:!0,demandOption:!0}).option(`format`,{description:`Output format`,type:`string`,choices:[`mo`,`xml`,`desktop`,`json`],default:`mo`}).option(`metainfo`,{description:"For --format=xml: path to the template (`.metainfo.xml.in`) used as msgfmt --template",type:`string`,normalize:!0}).option(`filename`,{description:`Override the output filename (defaults to <domain>.<ext>)`,type:`string`,normalize:!0}).option(`remove-xml-comments`,{description:`For --format=xml: strip XML comments from the compiled output`,type:`boolean`,default:!0}).option(`verbose`,{description:`Print each msgfmt invocation`,type:`boolean`,default:!1}),handler:async n=>{let a=Eo(n.poDir),S=Eo(n.outDir),C=n.domain,N=n.format??`mo`,F=n.metainfo?Eo(n.metainfo):void 0,I=n.filename??defaultFilename(C,N,F),H=!!n.verbose,W=!!n[`remove-xml-comments`];if(!await fileExists(a)){Ae.error(`[gjsify gettext] PO directory does not exist: ${a}`),process.exitCode=1;return}try{N===`xml`&&F?await compileBulkXml({poDir:a,outDir:S,domain:C,template:F,filename:I,removeXmlComments:W,verbose:H}):(N===`xml`&&Ae.warn(`[gjsify gettext] --format=xml without --metainfo: falling back to per-language XML files`),await compilePerLanguage({poDir:a,outDir:S,domain:C,format:N,filename:I,verbose:H}))}catch(n){let a=n;a?.code===`ENOENT`?Ae.error(`[gjsify gettext] msgfmt not found. Install it via your distro (package: gettext).`):(a?.stderr&&process.stderr.write(a.stderr),Ae.error(`[gjsify gettext] msgfmt failed${a?.code===void 0?``:` (exit ${a.code})`}`)),process.exitCode=typeof a?.code==`number`?a.code:1}}};je(),Ux(),as(),Bo(),Gc();const DE=promisify(execFile),OE={command:`gsettings <schemadir>`,description:"Compile GSettings schema XML files into a binary gschemas.compiled (wraps `glib-compile-schemas`).",builder:n=>n.positional(`schemadir`,{description:`Directory containing *.gschema.xml descriptors`,type:`string`,normalize:!0,demandOption:!0}).option(`targetdir`,{alias:`t`,description:`Directory to write gschemas.compiled (default: <schemadir>)`,type:`string`,normalize:!0}).option(`strict`,{description:`Abort on any schema warning (passes --strict to glib-compile-schemas)`,type:`boolean`,default:!0}).option(`verbose`,{description:`Print the underlying glib-compile-schemas invocation`,type:`boolean`,default:!1}),handler:async n=>{let a=Eo(n.schemadir),S=n.targetdir?Eo(n.targetdir):a,C=[];n.strict&&C.push(`--strict`),C.push(`--targetdir=${S}`),C.push(a),n.verbose&&Ae.log(`[gjsify gsettings] glib-compile-schemas ${C.join(` `)}`),await mkdir$1(S,{recursive:!0});try{let{stdout:a,stderr:N}=await DE(`glib-compile-schemas`,C);a&&process.stdout.write(a),N&&process.stderr.write(N),n.verbose&&Ae.log(`[gjsify gsettings] wrote ${S}/gschemas.compiled`)}catch(n){let a=n;a?.code===`ENOENT`?Ae.error(`[gjsify gsettings] glib-compile-schemas not found. Install it via your distro (package: glib2-devel / libglib2.0-dev).`):(a?.stderr&&process.stderr.write(a.stderr),Ae.error(`[gjsify gsettings] glib-compile-schemas failed${a?.code===void 0?``:` (exit ${a.code})`}`)),process.exitCode=typeof a?.code==`number`?a.code:1}}};Os(),Bo();const kE=[`--device=dri`,`--share=ipc`,`--socket=fallback-x11`,`--socket=wayland`],AE=[];function readPackageJson(n){let a=Eo(n,`package.json`),S;try{S=readFileSync(a,`utf-8`)}catch{throw Error(`gjsify flatpak: no package.json found at ${a}`)}try{return JSON.parse(S)}catch(n){throw Error(`gjsify flatpak: package.json at ${a} is not valid JSON: ${n.message}`)}}function looksLikeAppId(n){return typeof n==`string`&&/^[A-Za-z][A-Za-z0-9_-]*(\.[A-Za-z][A-Za-z0-9_-]*){2,}$/.test(n)}function resolveRuntime(n,a){let S=a.runtime??n?.runtime??`gnome`;if(S!==`gnome`&&S!==`freedesktop`)throw Error(`gjsify flatpak: unknown runtime "${S}" (expected "gnome" or "freedesktop")`);let C=a.runtimeVersion??n?.runtimeVersion??(S===`gnome`?`50`:`24.08`);return S===`gnome`?{runtime:S,runtimeId:`org.gnome.Platform`,sdk:`org.gnome.Sdk`,runtimeVersion:C}:{runtime:S,runtimeId:`org.freedesktop.Platform`,sdk:`org.freedesktop.Sdk`,runtimeVersion:C}}function defaultCiContainer(n,a){return`ghcr.io/flathub-infra/flatpak-github-actions:${`${n}-${a}`}`}Os();function loadDesktopTemplate(){return readFileSync(new URL(`../../templates/flatpak/desktop.tmpl`,import.meta.url),`utf-8`)}function loadFlathubAppTemplate(){return readFileSync(new URL(`../../templates/flatpak/flathub-app.json.tmpl`,import.meta.url),`utf-8`)}function loadFlathubCliTemplate(){return readFileSync(new URL(`../../templates/flatpak/flathub-cli.json.tmpl`,import.meta.url),`utf-8`)}function validateScaffoldInputs(n){let a=n.flatpak,S=[];return(!a.developer?.id||!a.developer?.name)&&S.push({field:`gjsify.flatpak.developer`,hint:'Set `gjsify.flatpak.developer = { "id": "io.github.you", "name": "Your Name" }` in package.json. The id is reverse-DNS.'}),a.summary||S.push({field:`gjsify.flatpak.summary`,hint:`One-line app summary, ≤80 chars, no trailing period. Example: "Learn 6502 assembly language".`}),a.description||S.push({field:`gjsify.flatpak.description`,hint:`Plain text (split on blank lines) or DescriptionBlock[] for rich content with bullet lists + translator hints.`}),a.license?.project||S.push({field:`gjsify.flatpak.license.project`,hint:`SPDX identifier of the project license, e.g. "MIT", "GPL-3.0-or-later".`}),a.homepageUrl||S.push({field:`gjsify.flatpak.homepageUrl`,hint:`Required by Flathub. Example: "https://github.com/you/your-repo".`}),S}function renderMetainfoApp(n){return renderMetainfo(n,`desktop-application`)}function renderMetainfoCli(n){return renderMetainfo(n,`console-application`)}function renderDesktop(n){let a=n.flatpak,S=(a.categories??[`Utility`]).join(`;`)+`;`,C=a.keywords?.length?`Keywords=${a.keywords.join(`;`)};\n`:``,N=a.provides?.mimetypes??[],F=N.length?`MimeType=${N.join(`;`)};\n`:``;return substitute(loadDesktopTemplate(),{NAME:n.name,SUMMARY:a.summary??n.name,COMMAND:n.command,APP_ID:n.appId,CATEGORIES_LINE:S,KEYWORDS_LINE:C,MIMETYPES_LINE:F})}function renderFlathubJson(n){return n===`cli`?loadFlathubCliTemplate():loadFlathubAppTemplate()}function renderMetainfo(n,a){let S=n.flatpak,C=new Date().getFullYear(),N=S.developer?.name??``,F=[];F.push(`<?xml version="1.0" encoding="UTF-8"?>`),F.push(`<!-- Copyright ${C} ${escapeXml(N)} -->`),F.push(`<component type="${a}">`),F.push(` <id>${escapeXml(n.appId)}</id>`),F.push(` <metadata_license>${escapeXml(S.license?.metadata??`CC0-1.0`)}</metadata_license>`),F.push(` <project_license>${escapeXml(S.license?.project??``)}</project_license>`),F.push(` <name>${escapeXml(n.name)}</name>`),pushTranslatorHint(F,S.summaryTranslatorHint,` `),F.push(` <summary>${escapeXml(S.summary??n.name)}</summary>`),S.iconRemote&&F.push(` <icon type="remote">${escapeXml(S.iconRemote)}</icon>`),F.push(` <description>`);for(let n of renderDescriptionBlocks(S.description??``,` `))F.push(n);if(F.push(` </description>`),S.developer?.id&&S.developer?.name){F.push(` <developer id="${escapeXml(S.developer.id)}">`);let n=S.developer.nameTranslatable===!0?``:` translate="no"`;F.push(` <name${n}>${escapeXml(S.developer.name)}</name>`),S.developer.email&&F.push(` <email>${escapeXml(S.developer.email)}</email>`),F.push(` </developer>`)}a===`desktop-application`&&F.push(` <launchable type="desktop-id">${escapeXml(n.appId)}.desktop</launchable>`),S.screenshots?.length&&(F.push(` <screenshots>`),S.screenshots.forEach((n,a)=>{let S=n.type??(a===0?`default`:void 0),C=S?` type="${escapeXml(S)}"`:``,N=n.environment?` environment="${escapeXml(n.environment)}"`:``;F.push(` <screenshot${C}${N}>`),F.push(` <image>${escapeXml(n.url)}</image>`),n.caption&&(pushTranslatorHint(F,n.captionTranslatorHint,` `),F.push(` <caption>${escapeXml(n.caption)}</caption>`)),F.push(` </screenshot>`)}),F.push(` </screenshots>`)),S.homepageUrl&&F.push(` <url type="homepage">${escapeXml(S.homepageUrl)}</url>`),S.bugtrackerUrl&&F.push(` <url type="bugtracker">${escapeXml(S.bugtrackerUrl)}</url>`),S.vcsBrowserUrl&&F.push(` <url type="vcs-browser">${escapeXml(S.vcsBrowserUrl)}</url>`),S.donationUrl&&F.push(` <url type="donation">${escapeXml(S.donationUrl)}</url>`),S.translateUrl&&F.push(` <url type="translate">${escapeXml(S.translateUrl)}</url>`);let I=normaliseContentRating(S.contentRating);if(I.attributes&&Object.keys(I.attributes).length>0){F.push(` <content_rating type="${escapeXml(I.type)}">`);for(let[n,a]of Object.entries(I.attributes))F.push(` <content_attribute id="${escapeXml(n)}">${escapeXml(a)}</content_attribute>`);F.push(` </content_rating>`)}else F.push(` <content_rating type="${escapeXml(I.type)}" />`);if(S.releases?.length){F.push(` <releases>`);for(let n of S.releases)if(n.description===void 0)F.push(` <release version="${escapeXml(n.version)}" date="${escapeXml(n.date)}" />`);else{F.push(` <release version="${escapeXml(n.version)}" date="${escapeXml(n.date)}">`),F.push(` <description>`);for(let a of renderDescriptionBlocks(n.description,` `))F.push(a);F.push(` </description>`),F.push(` </release>`)}F.push(` </releases>`)}if(S.categories?.length){F.push(` <categories>`);for(let n of S.categories)F.push(` <category>${escapeXml(n)}</category>`);F.push(` </categories>`)}if(S.keywords?.length){F.push(` <keywords>`);for(let n of S.keywords)F.push(` <keyword>${escapeXml(n)}</keyword>`);F.push(` </keywords>`)}if(a===`desktop-application`&&S.branding&&(F.push(` <branding>`),F.push(` <color type="primary" scheme_preference="light">${escapeXml(S.branding.accentLight)}</color>`),F.push(` <color type="primary" scheme_preference="dark">${escapeXml(S.branding.accentDark)}</color>`),F.push(` </branding>`)),S.kudos?.length){F.push(` <kudos>`);for(let n of S.kudos)F.push(` <kudo>${escapeXml(n)}</kudo>`);F.push(` </kudos>`)}let H=S.provides?.binaries??[n.command],W=S.provides?.mimetypes??[],K=S.provides?.dbus??[];if(H.length||W.length||K.length){F.push(` <provides>`);for(let n of H)F.push(` <binary>${escapeXml(n)}</binary>`);for(let n of W)F.push(` <mediatype>${escapeXml(n)}</mediatype>`);for(let n of K)F.push(` <dbus type="${escapeXml(n.type)}">${escapeXml(n.id)}</dbus>`);F.push(` </provides>`)}if(S.supports?.controls?.length||S.supports?.internet){F.push(` <supports>`);for(let n of S.supports.controls??[])F.push(` <control>${escapeXml(n)}</control>`);S.supports.internet&&F.push(` <internet>${escapeXml(S.supports.internet)}</internet>`),F.push(` </supports>`)}if(S.requires?.displayLengthMin||S.requires?.controls?.length||S.requires?.internet){F.push(` <requires>`),S.requires.displayLengthMin&&F.push(` <display_length compare="ge">${S.requires.displayLengthMin}</display_length>`);for(let n of S.requires.controls??[])F.push(` <control>${escapeXml(n)}</control>`);S.requires.internet&&F.push(` <internet>${escapeXml(S.requires.internet)}</internet>`),F.push(` </requires>`)}if(S.recommends?.displayLengthMin||S.recommends?.controls?.length){F.push(` <recommends>`),S.recommends.displayLengthMin&&F.push(` <display_length compare="ge">${S.recommends.displayLengthMin}</display_length>`);for(let n of S.recommends.controls??[])F.push(` <control>${escapeXml(n)}</control>`);F.push(` </recommends>`)}return F.push(`</component>`),F.join(`
|
|
756
756
|
`)+`
|
|
757
757
|
`}function renderDescriptionBlocks(n,a){let S=typeof n==`string`?stringToBlocks(n):n,C=[];for(let n of S)if(`p`in n)pushTranslatorHint(C,n.translatorHint,a),C.push(`${a}<p>${escapeXml(n.p.trim().replace(/\s+/g,` `))}</p>`);else{pushTranslatorHint(C,n.translatorHint,a),C.push(`${a}<ul>`);for(let S of n.ul)typeof S==`string`?C.push(`${a} <li>${escapeXml(S)}</li>`):(pushTranslatorHint(C,S.translatorHint,`${a} `),C.push(`${a} <li>${escapeXml(S.item)}</li>`));C.push(`${a}</ul>`)}return C}function stringToBlocks(n){return n.trim().split(/\n\n+/).map(n=>({p:n.trim().replace(/\s+/g,` `)}))}function pushTranslatorHint(n,a,S){a&&n.push(`${S}<!-- TRANSLATORS: ${a} -->`)}function normaliseContentRating(n){return n===void 0?{type:`oars-1.1`}:typeof n==`string`?{type:n}:{type:n.type??`oars-1.1`,attributes:n.attributes}}function substitute(n,a){let S=n;for(let[n,C]of Object.entries(a))S=S.split(`{{${n}}}`).join(C);return S}function escapeXml(n){return n.replace(/&/g,`&`).replace(/</g,`<`).replace(/>/g,`>`).replace(/"/g,`"`)}je(),Os(),Bo(),Ux();function oxcBindingSuffix(){let n=process.platform,a=process.arch,S;if(n===`linux`)S=`linux`;else if(n===`darwin`)S=`darwin`;else if(n===`win32`)S=`win32`;else throw Error(`[gjsify oxc] Unsupported platform: ${n}`);let C;if(a===`x64`)C=`x64`;else if(a===`arm64`)C=`arm64`;else throw Error(`[gjsify oxc] Unsupported arch on ${S}: ${a}`);if(S===`linux`){let n=`gnu`;try{let{readdirSync:a}=(Os(),__toCommonJS(Ts));a(`/lib`).some(n=>n.startsWith(`ld-musl-`))&&(n=`musl`)}catch{}return`${S}-${C}-${n}`}return S===`win32`?`${S}-${C}-msvc`:`${S}-${C}`}function bindingPackageName(n){return`${n===`oxlint`?`@oxlint`:`@oxfmt`}/binding-${oxcBindingSuffix()}`}function probeNodeModules(n,a,S){let C=ko(n,`node_modules`,a,S);return existsSync(C)?C:null}function findOxcLauncher(n,a=process.cwd()){let S=ko(`bin`,n),C=probeNodeModules(a,n,S);if(C)return C;let N=findWorkspaceRoot(a);if(N&&N!==a){let a=probeNodeModules(N,n,S);if(a)return a}let F=Eo(a,`..`);for(let a=0;a<6;a++){let a=probeNodeModules(F,n,S);if(a)return a;let C=Eo(F,`..`);if(C===F)break;F=C}throw new OxcNotFoundError(n,a)}var OxcNotFoundError=class extends Error{tool;cwd;constructor(n,a){let S=(()=>{try{return bindingPackageName(n)}catch{return`@${n===`oxlint`?`oxlint`:`oxfmt`}/binding-<platform>`}})();super(`[gjsify oxc] ${n} not found.\n Expected: ${n}/bin/${n} in node_modules of ${a} or any workspace root above it.\n Install it via: gjsify install -D ${n}\n (this adds ${n} to devDependencies; the matching ${S} napi binding lands automatically as an optionalDependency.)`),this.tool=n,this.cwd=a,this.name=`OxcNotFoundError`}};function findOxlintConfig(n=process.cwd()){return findConfigFile(n,[`.oxlintrc.json`])}function findOxfmtConfig(n=process.cwd()){return findConfigFile(n,[`.oxfmtrc`,`.oxfmtrc.json`])}function findConfigFile(n,a){let S=n;for(let n=0;n<12;n++){for(let n of a){let a=ko(S,n);if(existsSync(a))return a}let n=Eo(S,`..`);if(n===S)break;S=n}return null}function runOxc(n,a,S={}){let C=S.cwd??process.cwd(),N=findOxcLauncher(n,C),F=process.execPath||`node`;return S.verbose&&Ae.log(`[gjsify oxc] ${F} ${N} ${a.join(` `)}`),new Promise((S,I)=>{let H={stdio:`inherit`,cwd:C},W=spawn(F,[N,...a],H);W.on(`error`,a=>{a.code===`ENOENT`?I(new OxcNotFoundError(n,C)):I(a)}),W.on(`exit`,(a,C)=>{if(C){Ae.error(`[gjsify oxc] ${n} terminated by signal ${C}`),S(1);return}S(a??0)})})}function runOxlint(n,a={}){return runOxc(`oxlint`,n,a)}function runOxfmt(n,a={}){return runOxc(`oxfmt`,n,a)}function loadOxlintTemplate(){return readFileSync(new URL(`../templates/oxlintrc.json.tmpl`,import.meta.url),`utf-8`)}function loadOxfmtTemplate(){return readFileSync(new URL(`../templates/oxfmtrc.tmpl`,import.meta.url),`utf-8`)}function printOxcNotFound(n){Ae.error(n.message)}function hasOxcDevDep(n=process.cwd(),a=`oxfmt`){let S=ko(n,`package.json`);if(!existsSync(S))return!1;try{let n=JSON.parse(readFileSync(S,`utf-8`));return!!(n?.devDependencies?.[a]||n?.dependencies?.[a])}catch{return!1}}je(),Os(),Bo();const jE={command:`init`,description:"Generate Flatpak manifest + MetaInfo XML + .desktop + flathub.json from `gjsify.flatpak` config.",builder:n=>n.option(`app-id`,{description:"Reverse-DNS app id (default: `gjsify.flatpak.appId` or package.json#name)",type:`string`}).option(`runtime`,{description:`Runtime family`,choices:[`gnome`,`freedesktop`]}).option(`runtime-version`,{description:`Runtime version (default: gnome -> 50, freedesktop -> 24.08)`,type:`string`}).option(`kind`,{description:`App kind: "app" (default, desktop) or "cli" (console-application MetaInfo, no .desktop)`,choices:[`app`,`cli`]}).option(`cli-only`,{description:"(Deprecated) Alias for `--kind cli`. Use --kind instead.",type:`boolean`,default:!1}).option(`manifest`,{description:"Output path for the manifest. Default: `<app-id>.json` in cwd.",type:`string`,normalize:!0}).option(`metainfo`,{description:"Output path for the MetaInfo XML. Default: `data/<app-id>.metainfo.xml.in` in cwd.",type:`string`,normalize:!0}).option(`desktop`,{description:"Output path for the .desktop entry (app kind only). Default: `data/<app-id>.desktop.in`.",type:`string`,normalize:!0}).option(`flathub-json`,{description:"Output path for the flathub.json policy stub. Default: `flathub.json` in cwd.",type:`string`,normalize:!0}).option(`command`,{description:`Binary name in /app/bin (default: app id)`,type:`string`}).option(`sdk-extension`,{description:`Extra SDK extension (repeatable)`,type:`string`,array:!0}).option(`finish-arg`,{description:`Extra finish-arg (repeatable). Override defaults entirely with multiple --finish-arg.`,type:`string`,array:!0}).option(`force`,{description:`Overwrite existing output files (manifest, metainfo, desktop, flathub.json)`,type:`boolean`,default:!1}).option(`verbose`,{description:`Print the resolved manifest fields before writing`,type:`boolean`,default:!1}).option(`format`,{description:"Run `oxfmt --write` on the generated JS/TS files when `oxfmt` is detected in the project. Default: true. Pass --no-format to skip. Note: oxfmt formats JS/TS only — the JSON/XML/.desktop manifests generated here are not reformatted (CSS/JSON formatting was dropped in the oxc migration).",type:`boolean`,default:!0}),handler:async n=>{let a=(await new Config().forBuild({}).catch(()=>({}))).flatpak??{},S=process.cwd(),C=readPackageJson(S),N=n.appId??a.appId??(looksLikeAppId(C.name)?C.name:void 0);if(!N)throw Error(`gjsify flatpak init: no app id available. Pass --app-id, set gjsify.flatpak.appId in package.json, or rename the package to a reverse-DNS id like org.example.MyApp.`);let F=n.kind??a.kind??(n.cliOnly?`cli`:`app`),{runtime:I,runtimeId:H,sdk:W,runtimeVersion:K}=resolveRuntime(a,{runtime:n.runtime,runtimeVersion:n.runtimeVersion}),q=mergeArrays(a.sdkExtensions,n.sdkExtension),Y=a.appendPath??(q?.length?deriveAppendPath(q):void 0),X=n.command??a.command??N,te=n.finishArg,ne=te===void 0?a.finishArgs??(F===`cli`?AE:kE):te,re={id:N,runtime:H,"runtime-version":K,sdk:W};q?.length&&(re[`sdk-extensions`]=q),Y?.length&&(re[`build-options`]={"append-path":Y.join(`:`)}),re.command=X,re[`finish-args`]=ne;let ie=a.cleanup;ie?.length&&(re.cleanup=ie);let ae=[];a.modules?.length?ae.push(...a.modules):(a.extraModules?.length&&ae.push(...a.extraModules),ae.push({name:deriveModuleName(N),buildsystem:`meson`,sources:[{type:`dir`,path:`.`}]})),re.modules=ae;let oe=[],trackWrite=n=>{n&&oe.push(n)};trackWrite(writeIfFresh(Eo(S,n.manifest??`${N}.json`),JSON.stringify(re,null,2)+`
|
|
758
758
|
`,n.force??!1,`manifest`));let Z=C.name??N,se={appId:N,name:a.name??friendlyName(Z,N),command:X,kind:F,flatpak:a},ce=validateScaffoldInputs(se);if(ce.length>0){Ae.warn(`[gjsify flatpak init] Manifest written, but MetaInfo / .desktop are skipped — config gaps:`);for(let n of ce)Ae.warn(` - ${n.field}: ${n.hint}`);Ae.warn(`
|
|
@@ -76,6 +76,14 @@ export function renderDesktop(inputs) {
|
|
|
76
76
|
const f = inputs.flatpak;
|
|
77
77
|
const categoriesLine = (f.categories ?? ['Utility']).join(';') + ';';
|
|
78
78
|
const keywordsLine = f.keywords?.length ? `Keywords=${f.keywords.join(';')};\n` : '';
|
|
79
|
+
// `MimeType=` is sourced from `gjsify.flatpak.provides.mimetypes` —
|
|
80
|
+
// the same field already populates `<mediatype>` entries in the
|
|
81
|
+
// MetaInfo XML, so callers configure both with one knob. Typical
|
|
82
|
+
// entries: `x-scheme-handler/<scheme>` for URL-scheme handlers
|
|
83
|
+
// (Flatpak portal: chats / browsers can launch the app via a
|
|
84
|
+
// custom URL), or `application/<mime>` for file-type handlers.
|
|
85
|
+
const mimetypes = f.provides?.mimetypes ?? [];
|
|
86
|
+
const mimetypesLine = mimetypes.length ? `MimeType=${mimetypes.join(';')};\n` : '';
|
|
79
87
|
return substitute(loadDesktopTemplate(), {
|
|
80
88
|
NAME: inputs.name,
|
|
81
89
|
SUMMARY: f.summary ?? inputs.name,
|
|
@@ -83,6 +91,7 @@ export function renderDesktop(inputs) {
|
|
|
83
91
|
APP_ID: inputs.appId,
|
|
84
92
|
CATEGORIES_LINE: categoriesLine,
|
|
85
93
|
KEYWORDS_LINE: keywordsLine,
|
|
94
|
+
MIMETYPES_LINE: mimetypesLine,
|
|
86
95
|
});
|
|
87
96
|
}
|
|
88
97
|
/** Render the flathub.json policy file. */
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gjsify/cli",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.35",
|
|
4
4
|
"description": "CLI for Gjsify",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "lib/index.js",
|
|
@@ -120,18 +120,18 @@
|
|
|
120
120
|
"cli"
|
|
121
121
|
],
|
|
122
122
|
"dependencies": {
|
|
123
|
-
"@gjsify/buffer": "^0.4.
|
|
124
|
-
"@gjsify/create-app": "^0.4.
|
|
125
|
-
"@gjsify/node-globals": "^0.4.
|
|
126
|
-
"@gjsify/node-polyfills": "^0.4.
|
|
127
|
-
"@gjsify/npm-registry": "^0.4.
|
|
128
|
-
"@gjsify/resolve-npm": "^0.4.
|
|
129
|
-
"@gjsify/rolldown-plugin-gjsify": "^0.4.
|
|
130
|
-
"@gjsify/rolldown-plugin-pnp": "^0.4.
|
|
131
|
-
"@gjsify/semver": "^0.4.
|
|
132
|
-
"@gjsify/tar": "^0.4.
|
|
133
|
-
"@gjsify/web-polyfills": "^0.4.
|
|
134
|
-
"@gjsify/workspace": "^0.4.
|
|
123
|
+
"@gjsify/buffer": "^0.4.35",
|
|
124
|
+
"@gjsify/create-app": "^0.4.35",
|
|
125
|
+
"@gjsify/node-globals": "^0.4.35",
|
|
126
|
+
"@gjsify/node-polyfills": "^0.4.35",
|
|
127
|
+
"@gjsify/npm-registry": "^0.4.35",
|
|
128
|
+
"@gjsify/resolve-npm": "^0.4.35",
|
|
129
|
+
"@gjsify/rolldown-plugin-gjsify": "^0.4.35",
|
|
130
|
+
"@gjsify/rolldown-plugin-pnp": "^0.4.35",
|
|
131
|
+
"@gjsify/semver": "^0.4.35",
|
|
132
|
+
"@gjsify/tar": "^0.4.35",
|
|
133
|
+
"@gjsify/web-polyfills": "^0.4.35",
|
|
134
|
+
"@gjsify/workspace": "^0.4.35",
|
|
135
135
|
"cosmiconfig": "^9.0.1",
|
|
136
136
|
"get-tsconfig": "^4.14.0",
|
|
137
137
|
"pkg-types": "^2.3.1",
|
|
@@ -139,12 +139,12 @@
|
|
|
139
139
|
"yargs": "^18.0.0"
|
|
140
140
|
},
|
|
141
141
|
"devDependencies": {
|
|
142
|
-
"@gjsify/unit": "^0.4.
|
|
142
|
+
"@gjsify/unit": "^0.4.35",
|
|
143
143
|
"@types/yargs": "^17.0.35",
|
|
144
144
|
"typescript": "^6.0.3"
|
|
145
145
|
},
|
|
146
146
|
"peerDependencies": {
|
|
147
|
-
"@gjsify/rolldown-native": "^0.4.
|
|
147
|
+
"@gjsify/rolldown-native": "^0.4.35"
|
|
148
148
|
},
|
|
149
149
|
"peerDependenciesMeta": {
|
|
150
150
|
"@gjsify/rolldown-native": {
|