Skip to content

Commit b83fa8b

Browse files
author
Dane Pilcher
authored
Merge pull request #716 from aws-amplify/main
Release fix: relative types path in same dir as documents (#714)
2 parents fdd7210 + 73d3877 commit b83fa8b

File tree

5 files changed

+77
-8
lines changed

5 files changed

+77
-8
lines changed

packages/amplify-codegen/src/commands/statements.js

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ const {
1010
getAppSyncAPIDetails,
1111
readSchemaFromFile,
1212
getAppSyncAPIInfoFromProject,
13+
getRelativeTypesPath,
1314
} = require('../utils');
1415
const { generateGraphQLDocuments } = require('@aws-amplify/graphql-docs-generator');
1516
const { generateStatements: generateStatementsHelper } = require('@aws-amplify/graphql-generator');
@@ -64,9 +65,6 @@ async function generateStatements(context, forceDownloadSchema, maxDepth, withou
6465

6566
try {
6667
const schemaData = readSchemaFromFile(schemaPath);
67-
const relativeTypesPath = cfg.amplifyExtension.generatedFileName
68-
? path.relative(opsGenDirectory, cfg.amplifyExtension.generatedFileName)
69-
: null;
7068
const generatedOps = generateStatementsHelper({
7169
schema: schemaData,
7270
target: language,
@@ -75,7 +73,7 @@ async function generateStatements(context, forceDownloadSchema, maxDepth, withou
7573
// default typenameIntrospection to true when not set
7674
typenameIntrospection:
7775
cfg.amplifyExtension.typenameIntrospection === undefined ? true : !!cfg.amplifyExtension.typenameIntrospection,
78-
relativeTypesPath,
76+
relativeTypesPath: getRelativeTypesPath(opsGenDirectory, cfg.amplifyExtension.generatedFileName),
7977
});
8078
if (!generatedOps) {
8179
context.print.warning('No GraphQL statements are generated. Check if the introspection schema has GraphQL operations defined.');
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
const path = require('path');
2+
3+
function getRelativeTypesPath(opsGenDirectory, generatedFileName) {
4+
if (generatedFileName) {
5+
const relativePath = path.relative(opsGenDirectory, generatedFileName);
6+
7+
// generatedFileName is in same directory as opsGenDirectory
8+
// i.e. generatedFileName: src/graphql/API.ts, opsGenDirectory: src/graphql
9+
if (!relativePath.startsWith('.')) {
10+
// path.join will strip prefixed ./
11+
return `./${relativePath}`;
12+
}
13+
14+
return relativePath;
15+
}
16+
return null;
17+
}
18+
19+
module.exports = getRelativeTypesPath;

packages/amplify-codegen/src/utils/index.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ const switchToSDLSchema = require('./switchToSDLSchema');
1717
const ensureIntrospectionSchema = require('./ensureIntrospectionSchema');
1818
const { readSchemaFromFile } = require('./readSchemaFromFile');
1919
const defaultDirectiveDefinitions = require('./defaultDirectiveDefinitions');
20+
const getRelativeTypesPath = require('./getRelativeTypesPath');
2021
module.exports = {
2122
getAppSyncAPIDetails,
2223
getFrontEndHandler,
@@ -37,4 +38,5 @@ module.exports = {
3738
ensureIntrospectionSchema,
3839
readSchemaFromFile,
3940
defaultDirectiveDefinitions,
41+
getRelativeTypesPath,
4042
};

packages/amplify-codegen/tests/commands/statements.test.js

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,15 @@ const fs = require('fs-extra');
33

44
const { loadConfig } = require('../../src/codegen-config');
55
const generateStatements = require('../../src/commands/statements');
6+
const { generateStatements: generateStatementsHelper } = require('@aws-amplify/graphql-generator');
67
const constants = require('../../src/constants');
7-
const { ensureIntrospectionSchema, getFrontEndHandler, getAppSyncAPIDetails, readSchemaFromFile } = require('../../src/utils');
8+
const {
9+
ensureIntrospectionSchema,
10+
getFrontEndHandler,
11+
getAppSyncAPIDetails,
12+
readSchemaFromFile,
13+
getRelativeTypesPath,
14+
} = require('../../src/utils');
815

916
const MOCK_CONTEXT = {
1017
print: {
@@ -16,6 +23,7 @@ const MOCK_CONTEXT = {
1623
},
1724
};
1825

26+
jest.mock('@aws-amplify/graphql-generator');
1927
jest.mock('../../src/codegen-config');
2028
jest.mock('../../src/utils');
2129
jest.mock('fs-extra');
@@ -67,21 +75,32 @@ describe('command - statements', () => {
6775
MOCK_CONTEXT.amplify.getEnvInfo.mockReturnValue({ projectPath: MOCK_PROJECT_ROOT });
6876
getAppSyncAPIDetails.mockReturnValue(MOCK_APIS);
6977
readSchemaFromFile.mockReturnValue(MOCK_SCHEMA);
78+
generateStatementsHelper.mockReturnValue({
79+
'queries.js': 'queries',
80+
});
7081
});
7182

7283
it('should generate statements', async () => {
7384
const forceDownload = false;
85+
const relativePath = './relative_path';
86+
getRelativeTypesPath.mockReturnValueOnce(relativePath);
7487
await generateStatements(MOCK_CONTEXT, forceDownload);
7588
expect(getFrontEndHandler).toHaveBeenCalledWith(MOCK_CONTEXT);
7689
expect(loadConfig).toHaveBeenCalledWith(MOCK_CONTEXT, false);
90+
expect(getRelativeTypesPath).toHaveBeenCalledWith('MOCK_PROJECT_ROOT/MOCK_STATEMENTS_PATH', 'API.TS');
91+
expect(generateStatementsHelper).toHaveBeenCalledWith({
92+
relativeTypesPath: relativePath,
93+
schema: MOCK_SCHEMA,
94+
target: MOCK_TARGET_LANGUAGE,
95+
typenameIntrospection: true,
96+
useExternalFragmentForS3Object: false,
97+
});
7798
});
7899

79100
it('should generate graphql statements for non JS projects', async () => {
80101
getFrontEndHandler.mockReturnValue('ios');
81102
loadConfig.mockReturnValue({
82-
getProjects: jest.fn().mockReturnValue([
83-
{ ...MOCK_PROJECT, ...{ amplifyExtension: { codeGenTarget: 'javascript' }} }
84-
]),
103+
getProjects: jest.fn().mockReturnValue([{ ...MOCK_PROJECT, ...{ amplifyExtension: { codeGenTarget: 'javascript' } } }]),
85104
});
86105
const forceDownload = false;
87106
await generateStatements(MOCK_CONTEXT, forceDownload);
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
const getRelativeTypesPath = require('../../src/utils/getRelativeTypesPath');
2+
3+
describe('getRelativeTypesPath', () => {
4+
test('in same directory', () => {
5+
expect(getRelativeTypesPath('src/graphql', 'src/graphql/API.ts')).toEqual('./API.ts');
6+
});
7+
8+
test('one dir up', () => {
9+
expect(getRelativeTypesPath('src/graphql', 'src/API.ts')).toEqual('../API.ts');
10+
});
11+
12+
test('two dir up', () => {
13+
expect(getRelativeTypesPath('src/graphql', 'API.ts')).toEqual('../../API.ts');
14+
});
15+
16+
test('one dir down', () => {
17+
expect(getRelativeTypesPath('src/graphql', 'src/graphql/types/API.ts')).toEqual('./types/API.ts');
18+
});
19+
20+
test('two dir down', () => {
21+
expect(getRelativeTypesPath('src/graphql', 'src/graphql/types/foo/API.ts')).toEqual('./types/foo/API.ts');
22+
});
23+
24+
test('sibling dirs', () => {
25+
expect(getRelativeTypesPath('src/graphql', 'src/types/API.ts')).toEqual('../types/API.ts');
26+
});
27+
28+
test('no types file', () => {
29+
expect(getRelativeTypesPath('src/graphql', null)).toEqual(null);
30+
});
31+
});

0 commit comments

Comments
 (0)