Skip to content

Commit

Permalink
fix: graphql-transformer-migrator add modelgen flag after v2 migrate (#…
Browse files Browse the repository at this point in the history
…9565)

Sets the modelgen plugin flag on migration to true so that erroneous warnings are not thrown about missing connections
Co-authored-by: Colin Ihrig <cjihrig@gmail.com>
  • Loading branch information
marcvberg committed Feb 11, 2022
1 parent 943c7ed commit 9bff4ae
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 9 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ describe('attemptV2TransformerMigration', () => {
expect(cliJsonFile.features.graphqltransformer.useexperimentalpipelinedtransformer).toBe(true);
expect(cliJsonFile.features.graphqltransformer.transformerversion).toBe(2);
expect(cliJsonFile.features.graphqltransformer.suppressschemamigrationprompt).toBe(true);
expect(cliJsonFile.features.codegen.useappsyncmodelgenplugin).toBe(true);
});

it('leaves project unchanged when migrating and rolling back', async () => {
Expand Down Expand Up @@ -86,6 +87,7 @@ describe('attemptV2TransformerMigration', () => {
expect(cliJsonFile.features.graphqltransformer.useexperimentalpipelinedtransformer).toBe(true);
expect(cliJsonFile.features.graphqltransformer.transformerversion).toBe(2);
expect(cliJsonFile.features.graphqltransformer.suppressschemamigrationprompt).toBe(true);
expect(cliJsonFile.features.codegen.useappsyncmodelgenplugin).toBe(true);
});

it('succeeds but warns when custom roots/resolvers are detected', async () => {
Expand All @@ -102,6 +104,7 @@ describe('attemptV2TransformerMigration', () => {
expect(cliJsonFile.features.graphqltransformer.useexperimentalpipelinedtransformer).toBe(true);
expect(cliJsonFile.features.graphqltransformer.transformerversion).toBe(2);
expect(cliJsonFile.features.graphqltransformer.suppressschemamigrationprompt).toBe(true);
expect(cliJsonFile.features.codegen.useappsyncmodelgenplugin).toBe(true);
});

it('succeeds but warns when improvePluralization FF is false', async () => {
Expand All @@ -118,6 +121,7 @@ describe('attemptV2TransformerMigration', () => {
expect(cliJsonFile.features.graphqltransformer.useexperimentalpipelinedtransformer).toBe(true);
expect(cliJsonFile.features.graphqltransformer.transformerversion).toBe(2);
expect(cliJsonFile.features.graphqltransformer.suppressschemamigrationprompt).toBe(true);
expect(cliJsonFile.features.codegen.useappsyncmodelgenplugin).toBe(true);
});

it('fails if GQL API is configured to use SQL', async () => {
Expand Down Expand Up @@ -159,4 +163,29 @@ describe('attemptV2TransformerMigration', () => {
expect(cliJsonFile.features.graphqltransformer.transformerversion).toBe(1);
expect(cliJsonFile.features.graphqltransformer.suppressschemamigrationprompt).toBe(false);
});

it('Correctly returns the codegen useappsyncmodelgenplugin flag to empty state after @auth queries failure', async () => {
const apiResourceDir = resourceDir(tempProjectDir);
const schemaPath = path.join(apiResourceDir, 'schema', 'schema.graphql');

fs.writeFileSync(
schemaPath,
`
type Post @model @auth(rules: [{allow: groups, groups: ["Admin", "Dev"], queries: [get, list], operations: [create, update, delete]}]) {
id: ID!
title: String!
createdAt: String
updatedAt: String
}
`,
);
await attemptV2TransformerMigration(apiResourceDir, apiName, envName);
expect(printer.info).toHaveBeenCalledWith(expect.stringMatching('You are using queries or mutations in at least one @auth rule.'));

const cliJsonFile = await fs.readJSON(cliJsonPath(tempProjectDir), { encoding: 'utf8' });
expect(cliJsonFile.features.graphqltransformer.useexperimentalpipelinedtransformer).toBe(false);
expect(cliJsonFile.features.graphqltransformer.transformerversion).toBe(1);
expect(cliJsonFile.features.graphqltransformer.suppressschemamigrationprompt).toBe(false);
expect(cliJsonFile.features?.codegen?.useappsyncmodelgenplugin).toBeUndefined();
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ import {
isTransformerV2Enabled,
} from './schema-inspector';
import { validateModelSchema, SchemaValidationError } from '@aws-amplify/graphql-transformer-core';
import { revertTransformerVersion, updateTransformerVersion } from './state-migrator';
import { backupCliJson, revertTransformerVersion, updateTransformerVersion } from './state-migrator';
import { GRAPHQL_DIRECTIVES_SCHEMA } from './constants/graphql-directives';
import * as os from 'os';
import { backupLocation, backupSchemas, doesBackupExist, restoreSchemas } from './schema-backup';
Expand Down Expand Up @@ -60,6 +60,7 @@ export async function attemptV2TransformerMigration(resourceDir: string, apiName

try {
await backupSchemas(resourceDir);
await backupCliJson(resourceDir, envName);
await runMigration(schemaDocs, authMode);
await updateTransformerVersion(envName);
} catch (error) {
Expand Down Expand Up @@ -131,7 +132,7 @@ export function migrateGraphQLSchema(schema: string, authMode: string, massSchem

async function runRevert(resourceDir: string, envName?: string) {
await restoreSchemas(resourceDir);
await revertTransformerVersion(envName);
await revertTransformerVersion(resourceDir, envName);
}

function doSchemaValidation(schema: string) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,22 +1,34 @@
import { $TSAny, FeatureFlags, pathManager, stateManager } from 'amplify-cli-core';
import * as path from 'path';
import * as fs from 'fs-extra';
import _ from 'lodash';
import { $TSAny, FeatureFlags, pathManager, stateManager, JSONUtilities } from 'amplify-cli-core';

export const backupLocation = (resourceDir: string) => path.join(resourceDir, '.migration-config-backup');

export const updateTransformerVersion = async (env?: string): Promise<void> => {
const mutation = (cliJSON: $TSAny) => {
_.set(cliJSON, ['features', 'graphqltransformer', 'useexperimentalpipelinedtransformer'], true);
_.set(cliJSON, ['features', 'graphqltransformer', 'transformerversion'], 2);
_.set(cliJSON, ['features', 'graphqltransformer', 'suppressschemamigrationprompt'], true);
_.set(cliJSON, ['features', 'codegen', 'useappsyncmodelgenplugin'], true);
};
await mutateCliJsonFile(mutation, env);
};

export const revertTransformerVersion = async (env?: string): Promise<void> => {
const mutation = (cliJSON: $TSAny) => {
_.set(cliJSON, ['features', 'graphqltransformer', 'useexperimentalpipelinedtransformer'], false);
_.set(cliJSON, ['features', 'graphqltransformer', 'transformerversion'], 1);
_.set(cliJSON, ['features', 'graphqltransformer', 'suppressschemamigrationprompt'], false);
};
export const backupCliJson = async (resourceDir: string, env? :string): Promise<void> => {
const cliJson = getCliJsonFile(env);
const backupPath = path.join(backupLocation(resourceDir), 'cli.json');
JSONUtilities.writeJson(backupPath, cliJson);
};

export const revertTransformerVersion = async (resourceDir: string, env?: string): Promise<void> => {
const backupPath = path.join(backupLocation(resourceDir), 'cli.json');
const backupJson: $TSAny = JSONUtilities.readJson(backupPath);
const mutation = (cliJson: $TSAny) => {
_.set(cliJson, ['features'], backupJson['features']);
}
await mutateCliJsonFile(mutation, env);
fs.removeSync(backupLocation(resourceDir));
};

const mutateCliJsonFile = async (mutation: (cliObj: $TSAny) => void, env?: string): Promise<void> => {
Expand All @@ -34,3 +46,12 @@ const mutateCliJsonFile = async (mutation: (cliObj: $TSAny) => void, env?: strin
stateManager.setCLIJSON(projectPath, cliJSON, envCLI ? env : undefined);
await FeatureFlags.reloadValues();
};

const getCliJsonFile = (env?: string): Promise<$TSAny> => {
const projectPath = pathManager.findProjectRoot() ?? process.cwd();
let cliJSON;
if (env) {
cliJSON = stateManager.getCLIJSON(projectPath, env, { throwIfNotExist: false });
}
return cliJSON ?? stateManager.getCLIJSON(projectPath);
}

0 comments on commit 9bff4ae

Please sign in to comment.