Skip to content

Commit 1d8ca04

Browse files
authored
Dart modelgen null safety (#195)
* feat(appsync-modelgen-plugin): add null safety support in dart
1 parent abb966c commit 1d8ca04

File tree

13 files changed

+1358
-481
lines changed

13 files changed

+1358
-481
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 & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,13 @@ import { pathManager } from 'amplify-cli-core';
55
const codegenFeatureFlags = {
66
"handlelistnullabilitytransparently": true,
77
"addtimestampfields": true,
8-
"generateIndexRules": true,
98
"useappsyncmodelgenplugin": true,
109
"usedocsgeneratorplugin": true,
1110
"usetypesgeneratorplugin": true,
1211
"cleangeneratedmodelsdirectory": true,
13-
"retaincasestyle": true
12+
"retaincasestyle": true,
13+
"generateindexrules": true,
14+
"emitauthprovider": true,
1415
};
1516

1617
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: 20 additions & 2 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',
@@ -18,15 +19,15 @@ const platformToLanguageMap = {
1819
* @param {string} key feature flag id
1920
* @returns
2021
*/
21-
const readFeatureFlag = (key) => {
22+
const readFeatureFlag = key => {
2223
let flagValue = false;
2324
try {
2425
flagValue = FeatureFlags.getBoolean(key);
2526
} catch (err) {
2627
flagValue = false;
2728
}
2829
return flagValue;
29-
}
30+
};
3031

3132
async function generateModels(context) {
3233
// steps:
@@ -72,6 +73,22 @@ async function generateModels(context) {
7273
const generateIndexRules = readFeatureFlag('codegen.generateIndexRules');
7374
const emitAuthProvider = readFeatureFlag('codegen.emitAuthProvider');
7475

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+
}
7592
const appsyncLocalConfig = await appSyncDataStoreCodeGen.preset.buildGeneratesSection({
7693
baseOutputDir: outputPath,
7794
schema,
@@ -81,6 +98,7 @@ async function generateModels(context) {
8198
isTimestampFieldsAdded,
8299
emitAuthProvider,
83100
generateIndexRules,
101+
enableDartNullSafety,
84102
},
85103
});
86104

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)