Browse Source

feat(cli): add option to generate api preview

metmirr 4 years ago
parent
commit
72724e9d8e

+ 2 - 0
.gitignore

@@ -25,6 +25,8 @@ yarn*
 
 # Warthog codegen
 **/generated/
+# Auto generated api preview
+apipreview.graphql
 
 # eslint cache
 **/.eslintcache

+ 30 - 1
query-node/substrate-query-framework/cli/src/commands/codegen.ts

@@ -22,7 +22,8 @@ export default class Codegen extends Command {
     // pass --no-indexer to skip indexer generation
     indexer: flags.boolean({ char: 'i', allowNo: true, description: 'Generate indexer', default: true }),
     // pass --no-graphql to skip graphql generation
-    graphql: flags.boolean({ char: 'g', allowNo: true, description: 'Generate GraphQL server', default: true})
+    graphql: flags.boolean({ char: 'g', allowNo: true, description: 'Generate GraphQL server', default: true }),
+    preview: flags.boolean({ char: 'p', allowNo: true, description: 'Generate GraphQL API preview', default: false }),
   };
 
   async run() {
@@ -31,11 +32,19 @@ export default class Codegen extends Command {
     const { flags } = this.parse(Codegen);
 
     const generatedFolderPath = path.resolve(process.cwd(), Codegen.generatedFolderName);
+    const isGeneratedFolderPathExists = fs.existsSync(generatedFolderPath);
+
     createDir(generatedFolderPath);
 
     // Change directory to generated
     process.chdir(generatedFolderPath);
 
+    if (flags.preview) {
+      debug('Generating GraphQL API preview');
+      await this.generateAPIPreview(flags.schema, generatedFolderPath, isGeneratedFolderPathExists);
+      return;
+    }
+
     // Create warthog graphql server
     if (flags.graphql) {
         debug("Generating GraphQL server");
@@ -105,4 +114,24 @@ export default class Codegen extends Command {
 
     process.chdir(goBackDir);
   }
+
+  async generateAPIPreview(schemaPath: string, generatedFolderPath: string, isExists: boolean): Promise<void> {
+    const warthogProjectPath = path.resolve(process.cwd(), 'api-preview');
+
+    createDir(warthogProjectPath);
+    process.chdir(warthogProjectPath);
+
+    await new WarthogWrapper(this, schemaPath).generateAPIPreview();
+
+    fs.copyFileSync(
+      path.resolve(warthogProjectPath, Codegen.generatedFolderName, 'schema.graphql'),
+      path.resolve('../../apipreview.graphql')
+    );
+    // if 'generated' folder was already there dont delete it otherwise delete
+    if (!isExists) {
+      debug('Removing unused files...');
+      fs.removeSync(generatedFolderPath);
+      this.log('Generated API Preview file -> apipreview.graphql');
+    }
+  }
 }

+ 9 - 0
query-node/substrate-query-framework/cli/src/helpers/WarthogWrapper.ts

@@ -43,6 +43,15 @@ export default class WarthogWrapper {
     await this.runMigrations();
   }
 
+  async generateAPIPreview(): Promise<void> {
+    // Order of calling functions is important!!!
+    await this.newProject();
+    this.installDependencies();
+    this.createModels();
+    this.codegen();
+    this.generateQueries();
+  }
+
   async newProject(projectName: string = 'query_node') {
     await warthogCli.run(`new ${projectName}`);