Skip to content

Commit 4c5a229

Browse files
authored
Merge pull request #366 from aws-amplify/master
Release Amplify Codegen V2.26.24
2 parents 779c71a + 1526d1e commit 4c5a229

14 files changed

+4619
-1025
lines changed

packages/amplify-codegen/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,4 +56,4 @@
5656
"devDependencies": {
5757
"mock-fs": "^4.13.0"
5858
}
59-
}
59+
}

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

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ const { FeatureFlags, pathManager } = require('amplify-cli-core');
66
const gqlCodeGen = require('@graphql-codegen/core');
77
const { getModelgenPackage } = require('../utils/getModelgenPackage');
88
const { validateDartSDK } = require('../utils/validateDartSDK');
9+
const { validateAmplifyFlutterCapableZeroThreeFeatures } = require('../utils/validateAmplifyFlutterCapableZeroThreeFeatures');
910

1011
const platformToLanguageMap = {
1112
android: 'java',
@@ -81,14 +82,14 @@ async function generateModels(context) {
8182
const modelgenPackageMigrationflag = 'codegen.useAppSyncModelgenPlugin';
8283
const appSyncDataStoreCodeGen = getModelgenPackage(FeatureFlags.getBoolean(modelgenPackageMigrationflag));
8384

84-
const isTimestampFieldsAdded = readFeatureFlag('codegen.addTimestampFields');
85-
8685
const generateIndexRules = readFeatureFlag('codegen.generateIndexRules');
8786
const emitAuthProvider = readFeatureFlag('codegen.emitAuthProvider');
8887
const usePipelinedTransformer = readFeatureFlag('graphQLTransformer.useExperimentalPipelinedTransformer')
8988
const transformerVersion = readNumericFeatureFlag('graphQLTransformer.transformerVersion');
9089

90+
let isTimestampFieldsAdded = readFeatureFlag('codegen.addTimestampFields');
9191
let enableDartNullSafety = readFeatureFlag('codegen.enableDartNullSafety');
92+
let enableDartZeroThreeFeatures = false;
9293

9394
if (projectConfig.frontend === 'flutter') {
9495
const isMinimumDartVersionSatisfied = validateDartSDK(context, projectRoot);
@@ -103,9 +104,12 @@ async function generateModels(context) {
103104
'Generating Dart Models without null safety. To generate null safe data models, turn on the “enableDartNullSafety” feature flag and set your Dart SDK version to “>= 2.12.0”. Learn more: https://docs.amplify.aws/lib/project-setup/null-safety/q/platform/flutter',
104105
);
105106
}
107+
// override isTimestampFieldsAdded to true when using amplify-flutter > 0.3.0 || > 0.3.0-rc.2
108+
isTimestampFieldsAdded = validateAmplifyFlutterCapableZeroThreeFeatures(projectRoot);
109+
enableDartZeroThreeFeatures = validateAmplifyFlutterCapableZeroThreeFeatures(projectRoot);
106110
}
107-
const handleListNullabilityTransparently = readFeatureFlag('codegen.handleListNullabilityTransparently');
108111

112+
const handleListNullabilityTransparently = readFeatureFlag('codegen.handleListNullabilityTransparently');
109113
const appsyncLocalConfig = await appSyncDataStoreCodeGen.preset.buildGeneratesSection({
110114
baseOutputDir: outputPath,
111115
schema,
@@ -118,6 +122,7 @@ async function generateModels(context) {
118122
enableDartNullSafety,
119123
handleListNullabilityTransparently,
120124
usePipelinedTransformer,
125+
enableDartZeroThreeFeatures,
121126
transformerVersion,
122127
},
123128
});
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
const yaml = require('js-yaml');
2+
const path = require('path');
3+
const fs = require('fs-extra');
4+
const semver = require('semver');
5+
const { printer } = require('amplify-prompts');
6+
7+
const PUBSPEC_LOCK_FILE_NAME = 'pubspec.lock';
8+
const MINIMUM_VERSION_CONSTRAIN = '>= 0.3.0 || >= 0.3.0-rc.2';
9+
10+
function validateAmplifyFlutterCapableZeroThreeFeatures(projectRoot) {
11+
try {
12+
const lockFile = yaml.load(fs.readFileSync(path.join(projectRoot, PUBSPEC_LOCK_FILE_NAME), 'utf8'));
13+
// check resolved dependency version written pubspec.lock file
14+
const { version } = lockFile.packages.amplify_flutter || {};
15+
// For this util function it check only if the amplify_flutter version is great than the minimum version
16+
// and it's not concerned with prerelease range, hence including prerelease to ensure
17+
// 0.4.0-rc.2 > 0.3.0-rc.2 is true
18+
if (semver.satisfies(version, MINIMUM_VERSION_CONSTRAIN, { includePrerelease: true })) {
19+
return true;
20+
}
21+
return false;
22+
} catch (e) {
23+
if (e.stack) {
24+
printer.error(e.stack);
25+
printer.error(e.message);
26+
}
27+
28+
printer.error('An error occurred while parsing ' + PUBSPEC_LOCK_FILE_NAME + '.');
29+
return false;
30+
}
31+
}
32+
33+
module.exports = { validateAmplifyFlutterCapableZeroThreeFeatures, PUBSPEC_LOCK_FILE_NAME, MINIMUM_VERSION_CONSTRAIN };
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
const {
2+
validateAmplifyFlutterCapableZeroThreeFeatures,
3+
PUBSPEC_LOCK_FILE_NAME,
4+
MINIMUM_VERSION_CONSTRAIN,
5+
} = require('../../src/utils/validateAmplifyFlutterCapableZeroThreeFeatures');
6+
const mockFs = require('mock-fs');
7+
const { join } = require('path');
8+
const yaml = require('js-yaml');
9+
const { printer } = require('amplify-prompts');
10+
11+
jest.mock('amplify-prompts', () => ({
12+
printer: {
13+
error: jest.fn()
14+
},
15+
}));
16+
17+
const MOCK_PROJECT_ROOT = 'project';
18+
const MOCK_PUBSPEC_FILE_PATH = join(MOCK_PROJECT_ROOT, PUBSPEC_LOCK_FILE_NAME);
19+
const mockErrorPrinter = printer.error;
20+
21+
describe('Validate amplify flutter version tests', () => {
22+
afterEach(() => {
23+
mockFs.restore();
24+
});
25+
26+
describe(`should return true if the resolved version meets the version constrain: ${MINIMUM_VERSION_CONSTRAIN}`, () => {
27+
['0.3.0', '0.3.1', '1.0.0', '0.3.0-rc.2', '0.4.0', '0.4.0-rc.2'].forEach(version => {
28+
test(`when the resolved version is ${version}`, () => {
29+
const lockFile = {
30+
packages: {
31+
amplify_flutter: {
32+
version,
33+
},
34+
},
35+
};
36+
mockFs({ [MOCK_PUBSPEC_FILE_PATH]: yaml.dump(lockFile) });
37+
expect(validateAmplifyFlutterCapableZeroThreeFeatures(MOCK_PROJECT_ROOT)).toBe(true);
38+
})
39+
});
40+
});
41+
42+
describe(`should return false if the resolved version does NOT meet the version constrain: ${MINIMUM_VERSION_CONSTRAIN}`, () => {
43+
['0.2.0', '0.2.9', '0.3.0-rc.1'].forEach(version => {
44+
test(`when the resolved version is ${version}`, () => {
45+
const lockFile = {
46+
packages: {
47+
amplify_flutter: {
48+
version,
49+
},
50+
},
51+
};
52+
mockFs({ [MOCK_PUBSPEC_FILE_PATH]: yaml.dump(lockFile) });
53+
expect(validateAmplifyFlutterCapableZeroThreeFeatures(MOCK_PROJECT_ROOT)).toBe(false);
54+
});
55+
});
56+
});
57+
58+
it('should return false if the sdk version cannot be found', () => {
59+
const lockFile = {};
60+
mockFs({ [MOCK_PUBSPEC_FILE_PATH]: yaml.dump(lockFile) });
61+
expect(validateAmplifyFlutterCapableZeroThreeFeatures(MOCK_PROJECT_ROOT)).toBe(false);
62+
});
63+
64+
describe('when yaml file cannot be correctly loaded', () => {
65+
let loadSpy;
66+
beforeAll(() => {
67+
mockErrorPrinter.mockClear();
68+
loadSpy = jest.spyOn(yaml, 'load');
69+
loadSpy.mockImplementation(() => {
70+
throw Error("Cannot read yaml file.");
71+
});
72+
});
73+
74+
afterAll(() => {
75+
loadSpy.mockClear();
76+
mockErrorPrinter.mockClear();
77+
})
78+
79+
it('should print error when error is thrown while loading yaml file', () => {
80+
const lockFile = {};
81+
mockFs({ [MOCK_PUBSPEC_FILE_PATH]: yaml.dump(lockFile) });
82+
83+
expect(validateAmplifyFlutterCapableZeroThreeFeatures(MOCK_PROJECT_ROOT)).toBe(false);
84+
expect(mockErrorPrinter).toHaveBeenCalledTimes(3);
85+
});
86+
});
87+
});

0 commit comments

Comments
 (0)