diff --git a/monarch/lib/src/builders/builder_helper.dart b/monarch/lib/src/builders/builder_helper.dart index 25ba1eee..25c2500a 100644 --- a/monarch/lib/src/builders/builder_helper.dart +++ b/monarch/lib/src/builders/builder_helper.dart @@ -2,13 +2,16 @@ import 'package:build/build.dart'; // import 'package:build_runner_core/build_runner_core.dart'; import 'package:path/path.dart' as p; -const generatedOutputDirectory = '.dart_tool/build/generated'; +String generatedOutputDirectory = p.join('.dart_tool','build','generated'); String getOuputPathInGeneratedOutputDirectory(AssetId inputId) { - return '$generatedOutputDirectory/${inputId.package}/${p.dirname(inputId.path)}'; + return p.join(generatedOutputDirectory, inputId.package, p.dirname(inputId.path)); } String getRelativePathFromOutputToInput(AssetId inputId) { final outputPath = getOuputPathInGeneratedOutputDirectory(inputId); - return p.relative(inputId.path, from: outputPath); + return normalizeAssetPath(p.relative(inputId.path, from: outputPath)); } + +/// Asset paths always have forward slashes regardless of platform. +String normalizeAssetPath(String path) => path.replaceAll(r'\', '/'); diff --git a/monarch/lib/src/builders/main_builder.dart b/monarch/lib/src/builders/main_builder.dart index 05d9b8c6..e5ebb4c9 100644 --- a/monarch/lib/src/builders/main_builder.dart +++ b/monarch/lib/src/builders/main_builder.dart @@ -3,6 +3,9 @@ import 'dart:async'; import 'package:build/build.dart'; import 'package:glob/glob.dart'; import 'package:dart_style/dart_style.dart'; +import 'package:path/path.dart' as p; + +import 'builder_helper.dart'; class MainBuilder implements Builder { @override @@ -60,7 +63,11 @@ class MainBuilder implements Builder { Iterable _getImportStatements(Map map) { return map.entries.map((item) { final libraryPrefix = item.key; - return "import '../${item.value.path}' as $libraryPrefix;"; + final targetPath = item.value.path; + + final relativePath = + normalizeAssetPath(p.relative(targetPath, from: 'lib')); + return "import r'$relativePath' as $libraryPrefix;"; }); } diff --git a/monarch/lib/src/builders/meta_stories_generator.dart b/monarch/lib/src/builders/meta_stories_generator.dart index b58bcf46..7110db84 100644 --- a/monarch/lib/src/builders/meta_stories_generator.dart +++ b/monarch/lib/src/builders/meta_stories_generator.dart @@ -57,7 +57,7 @@ class MetaStoriesGenerator extends Generator { List storiesNames, Map storiesMap) { return ''' import 'package:monarch/monarch.dart'; -import '$pathToStoriesFile'; +import r'$pathToStoriesFile'; const metaStories = MetaStories('${storiesAssetId.package}', '${storiesAssetId.path}', [${storiesNames.join(', ')}], $storiesMap); diff --git a/monarch/lib/src/builders/meta_themes_generator.dart b/monarch/lib/src/builders/meta_themes_generator.dart index 69900787..c2babdbf 100644 --- a/monarch/lib/src/builders/meta_themes_generator.dart +++ b/monarch/lib/src/builders/meta_themes_generator.dart @@ -52,7 +52,7 @@ Element name: ${element.name} String pathToThemeFile, List metaThemeExpressions) { return ''' import 'package:monarch/monarch.dart'; -import '$pathToThemeFile'; +import r'$pathToThemeFile'; final metaThemeItems = [ ${metaThemeExpressions.join(', ')} diff --git a/monarch/lib/src/monarch_app/active_locale.dart b/monarch/lib/src/monarch_app/active_locale.dart index 263cfd85..3da6cdc1 100644 --- a/monarch/lib/src/monarch_app/active_locale.dart +++ b/monarch/lib/src/monarch_app/active_locale.dart @@ -39,6 +39,11 @@ class ActiveLocale with Log { } } + void resetActiveLocale() { + _activeLocale = null; + log.fine('active locale reset'); + } + void assertIsLoaded() { if (locale == null) { throw StateError('Expected activeLocale to be set'); @@ -54,7 +59,16 @@ class ActiveLocale with Log { } void setActiveLocaleTag(String localeTag) { - setActiveLocale(parseLocale(localeTag)); + if (localeTag == 'System Locale') { + // As of 2020-10-08, the platform apps send 'System Locale' when there aren't + // any user-defined locales, in which case the StoryApp will create a MaterialApp + // without any localization data. In this case, Flutter's default behavior is to + // use the only supported locale which is en-US. + resetActiveLocale(); + } + else { + setActiveLocale(parseLocale(localeTag)); + } } void close() { @@ -62,8 +76,6 @@ class ActiveLocale with Log { } } -const defaultLocale = Locale('en', 'US'); - Locale parseLocale(String localeTag) { ArgumentError.checkNotNull(localeTag, 'localeTag'); if (localeTag.isEmpty) { diff --git a/monarch/lib/src/monarch_app/stories_errors.dart b/monarch/lib/src/monarch_app/stories_errors.dart index d2465a30..1cf800af 100644 --- a/monarch/lib/src/monarch_app/stories_errors.dart +++ b/monarch/lib/src/monarch_app/stories_errors.dart @@ -51,6 +51,9 @@ String _getActiveStoryErrorMessage() { return 'There was no active story selected.'; } else { final metaStories = _monarchData.metaStoriesMap[activeStoryId.pathKey]; + if (metaStories == null) { + return 'Unexpected - Could not find meta stories for ${activeStoryId.pathKey}'; + } return ''' The relevant story is: ${metaStories.path} > ${activeStoryId.name}''';