Skip to content

Commit c0abd86

Browse files
authored
Merge pull request #196 from aws-amplify/master
Release Features for iOS, Flutter Datastore Models Generation
2 parents bdde4bd + 1d8ca04 commit c0abd86

File tree

15 files changed

+1518
-505
lines changed

15 files changed

+1518
-505
lines changed

.circleci/config.base.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,7 @@ workflows:
235235
only:
236236
- master
237237
- e2e-testing
238+
- dart-modelgen-null-safety
238239
- e2e-test:
239240
context:
240241
- cleanup-resources
@@ -248,6 +249,7 @@ workflows:
248249
only:
249250
- master
250251
- e2e-testing
252+
- dart-modelgen-null-safety
251253
- deploy:
252254
os: linux_node12
253255
requires:
@@ -259,6 +261,7 @@ workflows:
259261
only:
260262
- release
261263
- master
264+
- dart-modelgen-null-safety
262265
- done_with_node_e2e_tests:
263266
os: linux_node12
264267
requires:

.circleci/config.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -420,6 +420,7 @@ workflows:
420420
only:
421421
- master
422422
- e2e-testing
423+
- dart-modelgen-null-safety
423424
- deploy:
424425
os: linux_node12
425426
requires:
@@ -431,6 +432,7 @@ workflows:
431432
only:
432433
- release
433434
- master
435+
- dart-modelgen-null-safety
434436
- done_with_node_e2e_tests:
435437
os: linux_node12
436438
requires:
@@ -469,6 +471,7 @@ workflows:
469471
only:
470472
- master
471473
- e2e-testing
474+
- dart-modelgen-null-safety
472475
- add-codegen-android-e2e-test:
473476
context: *ref_8
474477
os: linux_node12

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
"production-build": "yarn && lerna run build --concurrency 3 --stream",
1414
"publish:master": "lerna publish --canary --exact --force-publish --preid=dev --dist-tag=dev --include-merged-tags --conventional-prerelease --yes",
1515
"publish:release": "lerna publish --exact --conventional-commits --message 'chore(release): Publish [ci skip]' --yes",
16+
"publish:dart-modelgen-null-safety": "lerna publish --canary --exact --force-publish --preid=flutter-preview --dist-tag=flutter-preview --include-merged-tags --conventional-prerelease --yes",
1617
"postpublish:release": "git fetch . release:master && git push origin master",
1718
"yarn-use-bash": "yarn config set script-shell /bin/bash",
1819
"verdaccio-start": "yarn yarn-use-bash && source .circleci/local_publish_helpers.sh && startLocalRegistry \"$(pwd)/.circleci/verdaccio.yaml\"",

packages/amplify-codegen-e2e-tests/src/__tests__/feature-flags.test.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@ const codegenFeatureFlags = {
99
"usedocsgeneratorplugin": true,
1010
"usetypesgeneratorplugin": true,
1111
"cleangeneratedmodelsdirectory": true,
12-
"retaincasestyle": true
12+
"retaincasestyle": true,
13+
"generateindexrules": true,
14+
"emitauthprovider": true,
1315
};
1416

1517
describe('codegen related feature flags - new project', () => {

packages/amplify-codegen/package.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,9 @@
3535
"graphql-config": "^2.2.1",
3636
"inquirer": "^7.3.3",
3737
"ora": "^4.0.3",
38-
"slash": "^3.0.0"
38+
"slash": "^3.0.0",
39+
"js-yaml": "^4.0.0",
40+
"semver": "^7.3.5"
3941
},
4042
"peerDependencies": {
4143
"amplify-cli-core": "^1.17.2",

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

Lines changed: 40 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ const glob = require('glob-all');
55
const { FeatureFlags, pathManager } = require('amplify-cli-core');
66
const gqlCodeGen = require('@graphql-codegen/core');
77
const { getModelgenPackage } = require('../utils/getModelgenPackage');
8+
const { validateDartSDK } = require('../utils/validateDartSDK');
89

910
const platformToLanguageMap = {
1011
android: 'java',
@@ -13,6 +14,21 @@ const platformToLanguageMap = {
1314
javascript: 'javascript',
1415
};
1516

17+
/**
18+
* Returns feature flag value, default to `false`
19+
* @param {string} key feature flag id
20+
* @returns
21+
*/
22+
const readFeatureFlag = key => {
23+
let flagValue = false;
24+
try {
25+
flagValue = FeatureFlags.getBoolean(key);
26+
} catch (err) {
27+
flagValue = false;
28+
}
29+
return flagValue;
30+
};
31+
1632
async function generateModels(context) {
1733
// steps:
1834
// 1. Load the schema and validate using transformer
@@ -51,21 +67,38 @@ async function generateModels(context) {
5167
//get modelgen package
5268
const modelgenPackageMigrationflag = 'codegen.useAppSyncModelgenPlugin';
5369
const appSyncDataStoreCodeGen = getModelgenPackage(FeatureFlags.getBoolean(modelgenPackageMigrationflag));
54-
//get timestamp config value
55-
let isTimestampFieldsAdded = false;
56-
try {
57-
isTimestampFieldsAdded = FeatureFlags.getBoolean('codegen.addTimestampFields');
58-
} catch (err) {
59-
isTimestampFieldsAdded = false;
60-
}
6170

71+
const isTimestampFieldsAdded = readFeatureFlag('codegen.addTimestampFields');
72+
73+
const generateIndexRules = readFeatureFlag('codegen.generateIndexRules');
74+
const emitAuthProvider = readFeatureFlag('codegen.emitAuthProvider');
75+
76+
let enableDartNullSafety = readFeatureFlag('codegen.enableDartNullSafety');
77+
78+
if (projectConfig.frontend === 'flutter') {
79+
const isMinimumDartVersionSatisfied = validateDartSDK(context, projectRoot);
80+
context.print.warning(`Detected feature flag: “enableDartNullSafety : ${enableDartNullSafety}”`);
81+
if (isMinimumDartVersionSatisfied && enableDartNullSafety) {
82+
context.print.warning(
83+
'Generating Dart Models with null safety. To opt out of null safe models, turn off the “enableDartNullSafety” feature flag. Learn more: https://docs.amplify.aws/lib/project-setup/null-safety/q/platform/flutter',
84+
);
85+
} else {
86+
enableDartNullSafety = false;
87+
context.print.warning(
88+
'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',
89+
);
90+
}
91+
}
6292
const appsyncLocalConfig = await appSyncDataStoreCodeGen.preset.buildGeneratesSection({
6393
baseOutputDir: outputPath,
6494
schema,
6595
config: {
6696
target: platformToLanguageMap[projectConfig.frontend] || projectConfig.frontend,
6797
directives: directiveDefinitions,
6898
isTimestampFieldsAdded,
99+
emitAuthProvider,
100+
generateIndexRules,
101+
enableDartNullSafety,
69102
},
70103
});
71104

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
const yaml = require('js-yaml');
2+
const path = require('path');
3+
const fs = require('fs-extra');
4+
const semver = require('semver');
5+
6+
const PUBSPEC_FILE_NAME = 'pubspec.yaml';
7+
8+
function validateDartSDK(context, projectRoot) {
9+
try {
10+
const config = yaml.load(fs.readFileSync(path.join(projectRoot, PUBSPEC_FILE_NAME), 'utf8'));
11+
const version = semver.minVersion(config.environment.sdk);
12+
if (semver.satisfies(version, '>= 2.12.0')) {
13+
context.print.warning('\nDetected Dart SDK version 2.12.0 or above');
14+
return true;
15+
}
16+
context.print.warning('\nDetected Dart SDK version below 2.12.0');
17+
return false;
18+
} catch (e) {
19+
context.print.warning('\nCould not detect Dart SDK version, defaulting to 2.12.0');
20+
return true;
21+
}
22+
}
23+
24+
module.exports = { PUBSPEC_FILE_NAME, validateDartSDK };

0 commit comments

Comments
 (0)