Преглед изворни кода

chore(cli): Fix generation of schema literal

Michael Bromley пре 1 година
родитељ
комит
c3bdd55854

+ 30 - 17
packages/cli/src/commands/add/api-extension/add-api-extension.ts

@@ -263,21 +263,16 @@ function createSimpleApiExtension(project: Project, plugin: VendurePluginRef, se
         ],
     });
 
-    if (adminApiExtensionDocuments) {
-        const initializer = adminApiExtensionDocuments.getInitializer();
-        if (Node.isArrayLiteralExpression(initializer)) {
-            initializer.addElement(schemaVariableName);
-        }
-    }
-
     const adminApiExtensions = apiExtensionsFile.getVariableDeclaration('adminApiExtensions');
+    addSchemaToApiExtensionsTemplateLiteral(adminApiExtensions, schemaVariableName);
+
     return adminApiExtensions;
 }
 
 function createCrudApiExtension(project: Project, plugin: VendurePluginRef, serviceRef: ServiceRef) {
     const apiExtensionsFile = getOrCreateApiExtensionsFile(project, plugin);
-    const adminApiExtensionDocuments = apiExtensionsFile.getVariableDeclaration('adminApiExtensionDocuments');
-    const insertAtIndex = adminApiExtensionDocuments?.getParent().getParent().getChildIndex() ?? 2;
+    const adminApiExtensions = apiExtensionsFile.getVariableDeclaration('adminApiExtensions');
+    const insertAtIndex = adminApiExtensions?.getParent().getParent().getChildIndex() ?? 2;
     const schemaVariableName = `${serviceRef.nameCamelCase.replace(/Service$/, '')}AdminApiExtensions`;
     apiExtensionsFile.insertVariableStatement(insertAtIndex, {
         declarationKind: VariableDeclarationKind.Const,
@@ -296,7 +291,7 @@ function createCrudApiExtension(project: Project, plugin: VendurePluginRef, serv
                             for (const { name, type, nullable } of entityRef.getProps()) {
                                 const graphQlType = getGraphQLType(type);
                                 if (graphQlType) {
-                                    writer.writeLine(`  ${name}: ${graphQlType}${nullable ? '' : '!'}`);
+                                    writer.writeLine(`    ${name}: ${graphQlType}${nullable ? '' : '!'}`);
                                 }
                             }
                             writer.writeLine(`  }`);
@@ -383,17 +378,35 @@ function createCrudApiExtension(project: Project, plugin: VendurePluginRef, serv
         ],
     });
 
-    if (adminApiExtensionDocuments) {
-        const initializer = adminApiExtensionDocuments.getInitializer();
-        if (Node.isArrayLiteralExpression(initializer)) {
-            initializer.addElement(schemaVariableName);
-        }
-    }
+    addSchemaToApiExtensionsTemplateLiteral(adminApiExtensions, schemaVariableName);
 
-    const adminApiExtensions = apiExtensionsFile.getVariableDeclaration('adminApiExtensions');
     return adminApiExtensions;
 }
 
+function addSchemaToApiExtensionsTemplateLiteral(
+    adminApiExtensions: VariableDeclaration | undefined,
+    schemaVariableName: string,
+) {
+    if (adminApiExtensions) {
+        const apiExtensionsInitializer = adminApiExtensions.getInitializer();
+        if (Node.isTaggedTemplateExpression(apiExtensionsInitializer)) {
+            adminApiExtensions
+                .setInitializer(writer => {
+                    writer.writeLine(`gql\``);
+                    const template = apiExtensionsInitializer.getTemplate();
+                    if (Node.isNoSubstitutionTemplateLiteral(template)) {
+                        writer.write(`${template.getLiteralValue()}`);
+                    } else {
+                        writer.write(template.getText().replace(/^`/, '').replace(/`$/, ''));
+                    }
+                    writer.writeLine(`  \${${schemaVariableName}}`);
+                    writer.write(`\``);
+                })
+                .formatText();
+        }
+    }
+}
+
 function getGraphQLType(type: Type): string | undefined {
     if (type.isString()) {
         return 'String';

+ 1 - 6
packages/cli/src/commands/add/api-extension/templates/api-extensions.template.ts

@@ -1,8 +1,3 @@
-import { DocumentNode } from 'graphql/language/index';
 import gql from 'graphql-tag';
 
-const adminApiExtensionDocuments: DocumentNode[] = [];
-
-export const adminApiExtensions = gql`
-    ${adminApiExtensionDocuments.join('\n')}
-`;
+export const adminApiExtensions = gql``;

+ 28 - 11
packages/cli/src/shared/vendure-config-ref.ts

@@ -13,23 +13,22 @@ export class VendureConfigRef {
     readonly sourceFile: SourceFile;
     readonly configObject: ObjectLiteralExpression;
 
-    constructor(project: Project, options: { checkFileName?: boolean } = {}) {
+    constructor(
+        private project: Project,
+        options: { checkFileName?: boolean } = {},
+    ) {
         const checkFileName = options.checkFileName ?? true;
 
-        function isVendureConfigVariableDeclaration(v: VariableDeclaration) {
-            return v.getType().getText(v) === 'VendureConfig';
-        }
-
-        function getVendureConfigSourceFile(sourceFiles: SourceFile[]) {
+        const getVendureConfigSourceFile = (sourceFiles: SourceFile[]) => {
             return sourceFiles.find(sf => {
                 return (
                     (checkFileName ? sf.getFilePath().endsWith('vendure-config.ts') : true) &&
-                    sf.getVariableDeclarations().find(isVendureConfigVariableDeclaration)
+                    sf.getVariableDeclarations().find(v => this.isVendureConfigVariableDeclaration(v))
                 );
             });
-        }
+        };
 
-        function findAndAddVendureConfigToProject() {
+        const findAndAddVendureConfigToProject = () => {
             // If the project does not contain a vendure-config.ts file, we'll look for a vendure-config.ts file
             // in the src directory.
             const srcDir = project.getDirectory('src');
@@ -42,7 +41,7 @@ export class VendureConfigRef {
                     project.addSourceFileAtPath(path.join(srcDirPath, filePath));
                 }
             }
-        }
+        };
 
         let vendureConfigFile = getVendureConfigSourceFile(project.getSourceFiles());
         if (!vendureConfigFile) {
@@ -55,11 +54,25 @@ export class VendureConfigRef {
         this.sourceFile = vendureConfigFile;
         this.configObject = vendureConfigFile
             ?.getVariableDeclarations()
-            .find(isVendureConfigVariableDeclaration)
+            .find(v => this.isVendureConfigVariableDeclaration(v))
             ?.getChildren()
             .find(Node.isObjectLiteralExpression) as ObjectLiteralExpression;
     }
 
+    getPathRelativeToProjectRoot() {
+        return path.relative(
+            this.project.getRootDirectories()[0]?.getPath() ?? '',
+            this.sourceFile.getFilePath(),
+        );
+    }
+
+    getConfigObjectVariableName() {
+        return this.sourceFile
+            ?.getVariableDeclarations()
+            .find(v => this.isVendureConfigVariableDeclaration(v))
+            ?.getName();
+    }
+
     getPluginsArray() {
         return this.configObject
             .getProperty('plugins')
@@ -69,4 +82,8 @@ export class VendureConfigRef {
     addToPluginsArray(text: string) {
         this.getPluginsArray()?.addElement(text).formatText();
     }
+
+    private isVendureConfigVariableDeclaration(v: VariableDeclaration) {
+        return v.getType().getText(v) === 'VendureConfig';
+    }
 }