11import { mkdir , writeFile } from "fs-extra" ;
22import { dump } from "js-yaml" ;
3- import { join } from "path" ;
3+ import { dirname , join } from "path" ;
44import { Uri } from "vscode" ;
55import { CodeQLCliServer } from "../codeql-cli/cli" ;
66import { QueryLanguage } from "../common/query-language" ;
7+ import { getOnDiskWorkspaceFolders } from "../common/vscode/workspace-folders" ;
8+ import { basename } from "../common/path" ;
79
810export class QlPackGenerator {
9- private readonly qlpackName : string ;
11+ private qlpackName : string | undefined ;
1012 private readonly qlpackVersion : string ;
1113 private readonly header : string ;
1214 private readonly qlpackFileName : string ;
@@ -16,8 +18,9 @@ export class QlPackGenerator {
1618 private readonly queryLanguage : QueryLanguage ,
1719 private readonly cliServer : CodeQLCliServer ,
1820 private readonly storagePath : string ,
21+ private readonly queryStoragePath : string ,
22+ private readonly includeFolderNameInQlpackName : boolean = false ,
1923 ) {
20- this . qlpackName = `getting-started/codeql-extra-queries-${ this . queryLanguage } ` ;
2124 this . qlpackVersion = "1.0.0" ;
2225 this . header = "# This is an automatically generated file.\n\n" ;
2326
@@ -26,6 +29,8 @@ export class QlPackGenerator {
2629 }
2730
2831 public async generate ( ) {
32+ this . qlpackName = await this . determineQlpackName ( ) ;
33+
2934 // create QL pack folder and add to workspace
3035 await this . createWorkspaceFolder ( ) ;
3136
@@ -39,6 +44,37 @@ export class QlPackGenerator {
3944 await this . createCodeqlPackLockYaml ( ) ;
4045 }
4146
47+ private async determineQlpackName ( ) : Promise < string > {
48+ let qlpackBaseName = `getting-started/codeql-extra-queries-${ this . queryLanguage } ` ;
49+ if ( this . includeFolderNameInQlpackName ) {
50+ const folderBasename = basename ( dirname ( this . folderUri . fsPath ) ) ;
51+ if (
52+ folderBasename . includes ( "codeql" ) ||
53+ folderBasename . includes ( "queries" )
54+ ) {
55+ // If the user has already included "codeql" or "queries" in the folder name, don't include it twice
56+ qlpackBaseName = `getting-started/${ folderBasename } -${ this . queryLanguage } ` ;
57+ } else {
58+ qlpackBaseName = `getting-started/codeql-extra-queries-${ folderBasename } -${ this . queryLanguage } ` ;
59+ }
60+ }
61+
62+ const existingQlPacks = await this . cliServer . resolveQlpacks (
63+ getOnDiskWorkspaceFolders ( ) ,
64+ ) ;
65+ const existingQlPackNames = Object . keys ( existingQlPacks ) ;
66+
67+ let qlpackName = qlpackBaseName ;
68+ let i = 0 ;
69+ while ( existingQlPackNames . includes ( qlpackName ) ) {
70+ i ++ ;
71+
72+ qlpackName = `${ qlpackBaseName } -${ i } ` ;
73+ }
74+
75+ return qlpackName ;
76+ }
77+
4278 private async createWorkspaceFolder ( ) {
4379 await mkdir ( this . folderUri . fsPath ) ;
4480 }
@@ -56,7 +92,7 @@ export class QlPackGenerator {
5692 }
5793
5894 public async createExampleQlFile ( fileName = "example.ql" ) {
59- const exampleQlFilePath = join ( this . folderUri . fsPath , fileName ) ;
95+ const exampleQlFilePath = join ( this . queryStoragePath , fileName ) ;
6096
6197 const exampleQl = `
6298/**
0 commit comments