Skip to content

Commit f6b1943

Browse files
authored
Handle schema errors (#2036)
1 parent e325044 commit f6b1943

File tree

3 files changed

+77
-1
lines changed

3 files changed

+77
-1
lines changed

.changeset/spicy-toys-scream.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@aws-amplify/schema-generator': patch
3+
---
4+
5+
Handle schema errors

packages/schema-generator/src/generate_schema.test.ts

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,13 @@ import { beforeEach, describe, it, mock } from 'node:test';
22
import { SchemaGenerator, parseDatabaseUrl } from './generate_schema.js';
33
import assert from 'node:assert';
44
import {
5+
EmptySchemaError,
6+
InvalidSchemaError,
57
TypescriptDataSchemaGenerator,
68
TypescriptDataSchemaGeneratorConfig,
79
} from '@aws-amplify/graphql-schema-generator';
810
import fs from 'fs/promises';
11+
import { AmplifyUserError } from '@aws-amplify/platform-core';
912

1013
const mockGenerateMethod =
1114
mock.fn<(config: TypescriptDataSchemaGeneratorConfig) => Promise<string>>();
@@ -164,4 +167,53 @@ void describe('SchemaGenerator', () => {
164167
'Unable to parse the database URL. Unsupported database engine: incorrect',
165168
});
166169
});
170+
171+
void it('should throw error if database schema is incorrect', async () => {
172+
mockGenerateMethod.mock.mockImplementationOnce(() => {
173+
throw new InvalidSchemaError([{}], ['missingColumn']);
174+
});
175+
const schemaGenerator = new SchemaGenerator();
176+
await assert.rejects(
177+
() =>
178+
schemaGenerator.generate({
179+
connectionUri: {
180+
secretName: 'FAKE_SECRET_NAME',
181+
value: 'mysql://user:password@hostname:3306/db',
182+
},
183+
out: 'schema.ts',
184+
}),
185+
(error: AmplifyUserError) => {
186+
assert.strictEqual(error.name, 'DatabaseSchemaError');
187+
assert.strictEqual(
188+
error.message,
189+
'Imported SQL schema is invalid. Imported schema is missing columns: missingColumn'
190+
);
191+
assert.strictEqual(error.resolution, 'Check the database schema.');
192+
return true;
193+
}
194+
);
195+
});
196+
197+
void it('should throw error if database schema is empty', async () => {
198+
mockGenerateMethod.mock.mockImplementationOnce(() => {
199+
throw new EmptySchemaError();
200+
});
201+
const schemaGenerator = new SchemaGenerator();
202+
await assert.rejects(
203+
() =>
204+
schemaGenerator.generate({
205+
connectionUri: {
206+
secretName: 'FAKE_SECRET_NAME',
207+
value: 'mysql://user:password@hostname:3306/db',
208+
},
209+
out: 'schema.ts',
210+
}),
211+
(error: AmplifyUserError) => {
212+
assert.strictEqual(error.name, 'DatabaseSchemaError');
213+
assert.strictEqual(error.message, 'Imported SQL schema is empty.');
214+
assert.strictEqual(error.resolution, 'Check the database schema.');
215+
return true;
216+
}
217+
);
218+
});
167219
});

packages/schema-generator/src/generate_schema.ts

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1-
import { TypescriptDataSchemaGenerator } from '@aws-amplify/graphql-schema-generator';
1+
import {
2+
EmptySchemaError,
3+
InvalidSchemaError,
4+
TypescriptDataSchemaGenerator,
5+
} from '@aws-amplify/graphql-schema-generator';
26
import fs from 'fs/promises';
37
import { AmplifyUserError } from '@aws-amplify/platform-core';
48

@@ -16,6 +20,7 @@ export type SchemaGeneratorConfig = {
1620

1721
type AmplifyGenerateSchemaError =
1822
| 'DatabaseConnectionError'
23+
| 'DatabaseSchemaError'
1924
| 'DatabaseUnsupportedEngineError'
2025
| 'DatabaseUrlParseError';
2126

@@ -38,6 +43,20 @@ export class SchemaGenerator {
3843
});
3944
await fs.writeFile(props.out, schema);
4045
} catch (err) {
46+
if (
47+
err instanceof EmptySchemaError ||
48+
err instanceof InvalidSchemaError
49+
) {
50+
throw new AmplifyUserError<AmplifyGenerateSchemaError>(
51+
'DatabaseSchemaError',
52+
{
53+
// the message already contains descriptive error.
54+
message: err.message,
55+
resolution: 'Check the database schema.',
56+
},
57+
err
58+
);
59+
}
4160
const databaseError = err as DatabaseConnectError;
4261
if (databaseError.code === 'ETIMEDOUT') {
4362
throw new AmplifyUserError<AmplifyGenerateSchemaError>(

0 commit comments

Comments
 (0)