From f251c6a8f392d66d37a93615d5abc4b1c111f236 Mon Sep 17 00:00:00 2001 From: Ivan <42812006+ivan-015@users.noreply.github.com> Date: Wed, 26 Jan 2022 17:25:17 -0700 Subject: [PATCH 01/23] Generate assets inside lib directory --- .../commands/add_dependency_command.dart | 4 +++- .../generators/visual-widgets/pb_bitmap_gen.dart | 7 +++++-- .../generators/visual-widgets/pb_shape_group_gen.dart | 3 ++- .../services/design_to_pbdl/figma_to_pbdl_service.dart | 3 ++- lib/main.dart | 2 +- 5 files changed, 13 insertions(+), 6 deletions(-) diff --git a/lib/generation/generators/value_objects/file_structure_strategy/commands/add_dependency_command.dart b/lib/generation/generators/value_objects/file_structure_strategy/commands/add_dependency_command.dart index a3ad3933..24e7723a 100644 --- a/lib/generation/generators/value_objects/file_structure_strategy/commands/add_dependency_command.dart +++ b/lib/generation/generators/value_objects/file_structure_strategy/commands/add_dependency_command.dart @@ -1,3 +1,4 @@ +import 'package:parabeac_core/controllers/main_info.dart'; import 'package:parabeac_core/generation/generators/value_objects/file_structure_strategy/commands/file_structure_command.dart'; import 'package:parabeac_core/generation/generators/value_objects/file_structure_strategy/pb_file_structure_strategy.dart'; @@ -6,7 +7,8 @@ class AddDependencyCommand extends FileStructureCommand { final _PUBSPEC_YAML_NAME = 'pubspec.yaml'; ///assets yaml decleration - final String _ASSET_DECLERATION = '\t\t- assets/images/'; + final String _ASSET_DECLERATION = + '\t\t- packages/${MainInfo().projectName}/assets/images/'; /// Name of the [package] String package; diff --git a/lib/generation/generators/visual-widgets/pb_bitmap_gen.dart b/lib/generation/generators/visual-widgets/pb_bitmap_gen.dart index a26ee4fa..77942a6d 100644 --- a/lib/generation/generators/visual-widgets/pb_bitmap_gen.dart +++ b/lib/generation/generators/visual-widgets/pb_bitmap_gen.dart @@ -40,8 +40,11 @@ class PBBitmapGenerator extends PBGenerator { ? 'assets/${source.referenceImage}' // Assuming PBDL will give us reference to image in the form of `image/.png` : ('assets/images/' + source.UUID + '.png'); - buffer.write( - '\'$imagePath\', ${_sizehelper.generate(source, generatorContext)} $boxFit)'); + buffer.write('\'$imagePath\', '); + // Point package to self (for component isolation support) + buffer.write('package: \'${MainInfo().projectName}\','); + buffer.write('${_sizehelper.generate(source, generatorContext)} $boxFit)'); + return buffer.toString(); } diff --git a/lib/generation/generators/visual-widgets/pb_shape_group_gen.dart b/lib/generation/generators/visual-widgets/pb_shape_group_gen.dart index d6261514..a3ad4f6e 100644 --- a/lib/generation/generators/visual-widgets/pb_shape_group_gen.dart +++ b/lib/generation/generators/visual-widgets/pb_shape_group_gen.dart @@ -1,3 +1,4 @@ +import 'package:parabeac_core/controllers/main_info.dart'; import 'package:parabeac_core/generation/generators/attribute-helper/pb_size_helper.dart'; import 'package:parabeac_core/generation/generators/pb_generator.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/inherited_shape_group.dart'; @@ -15,7 +16,7 @@ class PBShapeGroupGen extends PBGenerator { if (source is InheritedShapeGroup) { var buffer = StringBuffer(); buffer.write( - 'Image.asset(\'assets/images/${source.UUID}.png\', ${_sizehelper.generate(source)})'); + 'Image.asset(\'assets/images/${source.UUID}.png\', ${_sizehelper.generate(source)}), package: \'${MainInfo().projectName}\','); return buffer.toString(); } } diff --git a/lib/interpret_and_optimize/services/design_to_pbdl/figma_to_pbdl_service.dart b/lib/interpret_and_optimize/services/design_to_pbdl/figma_to_pbdl_service.dart index 64d97b35..f2be3f9e 100644 --- a/lib/interpret_and_optimize/services/design_to_pbdl/figma_to_pbdl_service.dart +++ b/lib/interpret_and_optimize/services/design_to_pbdl/figma_to_pbdl_service.dart @@ -12,7 +12,8 @@ class FigmaToPBDLService implements DesignToPBDLService { return PBDL.fromFigma( info.figmaProjectID, info.figmaKey, - outputPath: p.join(info.genProjectPath, 'assets'), + // Generating all assets inside lib folder for package isolation + outputPath: p.join(info.genProjectPath, 'lib', 'assets'), exportPbdlJson: info.exportPBDL, projectName: info.projectName, ); diff --git a/lib/main.dart b/lib/main.dart index c244f0f5..61881dca 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -285,7 +285,7 @@ void collectArguments(ArgResults arguments) { /// In the future when we are generating certain dart files only. /// At the moment we are only generating in the flutter project. - info.pngPath = p.join(info.genProjectPath, 'assets/images'); + info.pngPath = p.join(info.genProjectPath, 'lib/assets/images'); } /// Determine the [MainInfo.designType] from the [arguments] From b974a41512fc724825957575dfb734081f973c51 Mon Sep 17 00:00:00 2001 From: Ivan <42812006+ivan-015@users.noreply.github.com> Date: Wed, 26 Jan 2022 17:26:03 -0700 Subject: [PATCH 02/23] Add package images to pubspec.yaml --- .../flutter_project_builder.dart | 2 +- .../generators/writers/pb_flutter_writer.dart | 73 ++++++++++++++----- pubspec.yaml | 1 + 3 files changed, 55 insertions(+), 21 deletions(-) diff --git a/lib/generation/flutter_project_builder/flutter_project_builder.dart b/lib/generation/flutter_project_builder/flutter_project_builder.dart index e09b66d2..f82483d5 100644 --- a/lib/generation/flutter_project_builder/flutter_project_builder.dart +++ b/lib/generation/flutter_project_builder/flutter_project_builder.dart @@ -65,7 +65,7 @@ class FlutterProjectBuilder { static Future createFlutterProject(String flutterProjectName, {String projectDir, bool createAssetsDir = true, - String assetsDir = 'assets/images/'}) async { + String assetsDir = 'lib/assets/images/'}) async { try { var result = await Process.run('flutter', ['create', flutterProjectName], workingDirectory: projectDir, runInShell: true); diff --git a/lib/generation/generators/writers/pb_flutter_writer.dart b/lib/generation/generators/writers/pb_flutter_writer.dart index 7d952080..a845fec2 100644 --- a/lib/generation/generators/writers/pb_flutter_writer.dart +++ b/lib/generation/generators/writers/pb_flutter_writer.dart @@ -2,6 +2,8 @@ import 'dart:io'; import 'package:parabeac_core/controllers/main_info.dart'; import 'package:parabeac_core/generation/generators/import_generator.dart'; import 'package:parabeac_core/generation/generators/writers/pb_page_writer.dart'; +import 'package:yaml_modify/yaml_modify.dart'; +import 'package:path/path.dart' as p; ///Responsible for writing code into files in the desired folder structure class PBFlutterWriter implements PBPageWriter { @@ -11,7 +13,6 @@ class PBFlutterWriter implements PBPageWriter { factory PBFlutterWriter() => _instance; - ///[fileAbsPath] should be the absolute path of the file @override void write(String code, String fileAbsPath) { @@ -76,27 +77,59 @@ class MyApp extends StatelessWidget { } void submitDependencies( - String yamlAbsPath, Map dependencies) async { - var line = 0; - var readYaml = File(yamlAbsPath).readAsLinesSync(); - if (dependencies.isNotEmpty) { - line = readYaml.indexOf('dependencies:'); - if (line > 0) { - dependencies.forEach((packageName, version) { - if (!readYaml.contains(' $packageName: $version')) { - readYaml.insert(++line, ' $packageName: $version'); - } - }); - - dependencies.clear(); // Clear dependencies to prevent duplicates - } + String yamlAbsPath, Map dependencies) { + var yamlStr = File(yamlAbsPath).readAsStringSync(); + var modifiableyaml = getModifiableNode(loadYaml(yamlStr)) as Map; + + /// Add new dependencies to pubspec.yaml + if (dependencies.isNotEmpty && modifiableyaml.containsKey('dependencies')) { + var yamlDeps = modifiableyaml['dependencies'] as Map; + + /// Check if dependency already exists. + /// Add dependency if it does not exist already. + dependencies.forEach((name, version) { + if (!yamlDeps.containsKey(name)) { + yamlDeps[name] = version; + } + }); + + dependencies.clear(); } - line = readYaml.indexOf('flutter:'); - if (line > 0) { - if (!readYaml.contains(' assets:')) { - readYaml.insert(++line, ' assets:\n - assets/images/'); + + /// Add assets + if (modifiableyaml.containsKey('flutter')) { + /// Create `assets` entry if does not exist + if (!modifiableyaml['flutter'].containsKey('assets')) { + modifiableyaml['flutter']['assets'] = []; + } + + var yamlAssets = (modifiableyaml['flutter']['assets'] as List).cast(); + + var assets = _getAssetFileNames(); + + /// Add dependency for each asset + for (var assetName in assets) { + if (!yamlAssets.any((str) => str.endsWith(assetName))) { + yamlAssets.add( + 'packages/${MainInfo().projectName}/assets/images/$assetName'); + } } } - File(yamlAbsPath).writeAsStringSync(readYaml.join('\n')); + + /// Write the new yaml file + File(yamlAbsPath).writeAsStringSync(toYamlString(modifiableyaml)); + } + + /// Returns a [List] of all the `filenames` of `pngs` listed under `assets/images/` + List _getAssetFileNames() { + try { + return Directory(MainInfo().pngPath) + .listSync() + .where((element) => element.path.endsWith('.png')) + .map((file) => p.basename(file.path)) + .toList(); + } catch (e) { + return []; + } } } diff --git a/pubspec.yaml b/pubspec.yaml index 42b0be5f..bd88919d 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -26,6 +26,7 @@ dependencies: path: ./pbdl directed_graph: ^0.2.3 sentry: ^6.2.2 + yaml_modify: ^1.0.1 dev_dependencies: pedantic: ^1.8.0 From 2a4d6c4e23e1d4fb8dd364a26d9d4c1284019900 Mon Sep 17 00:00:00 2001 From: Ivan <42812006+ivan-015@users.noreply.github.com> Date: Wed, 26 Jan 2022 17:45:47 -0700 Subject: [PATCH 03/23] Separate outputPath and pngPath during PBDL call This was done because the generated PBDL should likely not be available to external developers, so it's best to keep it out of `lib` --- .../services/design_to_pbdl/figma_to_pbdl_service.dart | 3 ++- pbdl | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/interpret_and_optimize/services/design_to_pbdl/figma_to_pbdl_service.dart b/lib/interpret_and_optimize/services/design_to_pbdl/figma_to_pbdl_service.dart index f2be3f9e..405ddb7e 100644 --- a/lib/interpret_and_optimize/services/design_to_pbdl/figma_to_pbdl_service.dart +++ b/lib/interpret_and_optimize/services/design_to_pbdl/figma_to_pbdl_service.dart @@ -12,8 +12,9 @@ class FigmaToPBDLService implements DesignToPBDLService { return PBDL.fromFigma( info.figmaProjectID, info.figmaKey, + outputPath: p.join(info.genProjectPath, 'assets'), // Generating all assets inside lib folder for package isolation - outputPath: p.join(info.genProjectPath, 'lib', 'assets'), + pngPath: p.join(info.genProjectPath, 'lib', 'assets', 'images'), exportPbdlJson: info.exportPBDL, projectName: info.projectName, ); diff --git a/pbdl b/pbdl index 4d360857..02af300b 160000 --- a/pbdl +++ b/pbdl @@ -1 +1 @@ -Subproject commit 4d360857d1052c5ca87f1d033e55242e947aa6f1 +Subproject commit 02af300b434e1a6de1e5e8e836c92e9d62de5c47 From a3f9caca8f21d941b6d5ceada9a6fb993f724747 Mon Sep 17 00:00:00 2001 From: Ivan Vigliante Date: Wed, 26 Jan 2022 21:11:43 -0700 Subject: [PATCH 04/23] Update PBDL --- pbdl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pbdl b/pbdl index 02af300b..a04e2974 160000 --- a/pbdl +++ b/pbdl @@ -1 +1 @@ -Subproject commit 02af300b434e1a6de1e5e8e836c92e9d62de5c47 +Subproject commit a04e2974714714a00b147c0b9e892a4aac5fb7a1 From 24704794a1db405e4a665020a6182a76e302756f Mon Sep 17 00:00:00 2001 From: Bryan Figueroa Date: Mon, 31 Jan 2022 17:28:23 -0700 Subject: [PATCH 05/23] Split the method to avoid concurrent modification --- lib/controllers/interpret.dart | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/controllers/interpret.dart b/lib/controllers/interpret.dart index 41574627..9ba05e92 100644 --- a/lib/controllers/interpret.dart +++ b/lib/controllers/interpret.dart @@ -60,9 +60,11 @@ class Interpret { return Future.value(node); }, index: 0, id: 'Indexing ${tree.name}').addTransformation( (PBContext context, PBIntermediateTree tree) { - tree - .whereType() - .forEach((node) => tree.remove(node, keepChildren: true)); + // + var baseGroupList = tree.whereType(); + + baseGroupList.forEach((group) => tree.remove(group, keepChildren: true)); + return Future.value(tree); }, index: 1, id: 'Removing the $BaseGroup from ${tree.name}'); From afde2f78ce6ed08fcc808cbda7ee0b0c00d0964f Mon Sep 17 00:00:00 2001 From: Ivan <42812006+ivan-015@users.noreply.github.com> Date: Tue, 1 Feb 2022 10:57:52 -0700 Subject: [PATCH 06/23] Retrieving image names from ImageReferenceStorage --- .../generators/writers/pb_flutter_writer.dart | 13 +++++++------ .../entities/inherited_bitmap.dart | 7 ++++--- .../entities/inherited_shape_group.dart | 7 ++++--- 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/lib/generation/generators/writers/pb_flutter_writer.dart b/lib/generation/generators/writers/pb_flutter_writer.dart index a845fec2..22739ef1 100644 --- a/lib/generation/generators/writers/pb_flutter_writer.dart +++ b/lib/generation/generators/writers/pb_flutter_writer.dart @@ -2,8 +2,8 @@ import 'dart:io'; import 'package:parabeac_core/controllers/main_info.dart'; import 'package:parabeac_core/generation/generators/import_generator.dart'; import 'package:parabeac_core/generation/generators/writers/pb_page_writer.dart'; +import 'package:parabeac_core/interpret_and_optimize/helpers/pb_image_reference_storage.dart'; import 'package:yaml_modify/yaml_modify.dart'; -import 'package:path/path.dart' as p; ///Responsible for writing code into files in the desired folder structure class PBFlutterWriter implements PBPageWriter { @@ -103,7 +103,8 @@ class MyApp extends StatelessWidget { modifiableyaml['flutter']['assets'] = []; } - var yamlAssets = (modifiableyaml['flutter']['assets'] as List).cast(); + var yamlAssets = + (modifiableyaml['flutter']['assets'] as List).cast(); var assets = _getAssetFileNames(); @@ -123,10 +124,10 @@ class MyApp extends StatelessWidget { /// Returns a [List] of all the `filenames` of `pngs` listed under `assets/images/` List _getAssetFileNames() { try { - return Directory(MainInfo().pngPath) - .listSync() - .where((element) => element.path.endsWith('.png')) - .map((file) => p.basename(file.path)) + // Return names inside image reference storage + return ImageReferenceStorage() + .names + .map((imageName) => '${imageName.replaceAll(':', '_')}.png') .toList(); } catch (e) { return []; diff --git a/lib/interpret_and_optimize/entities/inherited_bitmap.dart b/lib/interpret_and_optimize/entities/inherited_bitmap.dart index d5bec916..1f37eae1 100644 --- a/lib/interpret_and_optimize/entities/inherited_bitmap.dart +++ b/lib/interpret_and_optimize/entities/inherited_bitmap.dart @@ -44,9 +44,10 @@ class InheritedBitmap extends PBVisualIntermediateNode }) : super(UUID, frame, name, constraints: constraints) { generator = PBBitmapGenerator(); childrenStrategy = NoChildStrategy(); - - ImageReferenceStorage() - .addReference(UUID, '${MainInfo().outputPath}assets/images'); + if (name != null && name.isNotEmpty) { + ImageReferenceStorage() + .addReference(UUID, '${MainInfo().outputPath}assets/images'); + } } static PBIntermediateNode fromJson(Map json) => diff --git a/lib/interpret_and_optimize/entities/inherited_shape_group.dart b/lib/interpret_and_optimize/entities/inherited_shape_group.dart index dcc59982..d4f53063 100644 --- a/lib/interpret_and_optimize/entities/inherited_shape_group.dart +++ b/lib/interpret_and_optimize/entities/inherited_shape_group.dart @@ -48,9 +48,10 @@ class InheritedShapeGroup extends PBVisualIntermediateNode }) : super(UUID, frame, name, constraints: constraints) { generator = PBBitmapGenerator(); childrenStrategy = NoChildStrategy(); - - ImageReferenceStorage().addReferenceAndWrite( - UUID, p.join(MainInfo().outputPath, 'assets/images'), image); + if (image != null) { + ImageReferenceStorage().addReferenceAndWrite( + UUID, p.join(MainInfo().outputPath, 'assets/images'), image); + } } static PBIntermediateNode fromJson(Map json) { From 733e12a28037e28a4abbb79935f82220d4576abc Mon Sep 17 00:00:00 2001 From: Bryan Figueroa Date: Tue, 1 Feb 2022 11:48:18 -0700 Subject: [PATCH 07/23] Added async --- lib/controllers/interpret.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/controllers/interpret.dart b/lib/controllers/interpret.dart index 9ba05e92..be5ddf62 100644 --- a/lib/controllers/interpret.dart +++ b/lib/controllers/interpret.dart @@ -59,7 +59,7 @@ class Interpret { elementStorage.elementToTree[node.UUID] = tree.UUID; return Future.value(node); }, index: 0, id: 'Indexing ${tree.name}').addTransformation( - (PBContext context, PBIntermediateTree tree) { + (PBContext context, PBIntermediateTree tree) async { // var baseGroupList = tree.whereType(); From 08639ef7e3324aa71cbc11564cad191b9f9b6658 Mon Sep 17 00:00:00 2001 From: Ivan <42812006+ivan-015@users.noreply.github.com> Date: Wed, 2 Feb 2022 12:28:19 -0700 Subject: [PATCH 08/23] Set output path of pbdl to lib --- .../services/design_to_pbdl/figma_to_pbdl_service.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/interpret_and_optimize/services/design_to_pbdl/figma_to_pbdl_service.dart b/lib/interpret_and_optimize/services/design_to_pbdl/figma_to_pbdl_service.dart index 405ddb7e..02a19b8c 100644 --- a/lib/interpret_and_optimize/services/design_to_pbdl/figma_to_pbdl_service.dart +++ b/lib/interpret_and_optimize/services/design_to_pbdl/figma_to_pbdl_service.dart @@ -12,7 +12,7 @@ class FigmaToPBDLService implements DesignToPBDLService { return PBDL.fromFigma( info.figmaProjectID, info.figmaKey, - outputPath: p.join(info.genProjectPath, 'assets'), + outputPath: p.join(info.genProjectPath, 'lib', 'assets'), // Generating all assets inside lib folder for package isolation pngPath: p.join(info.genProjectPath, 'lib', 'assets', 'images'), exportPbdlJson: info.exportPBDL, From ca4752ad1b995121690a9a7866d21ebf258ca3a4 Mon Sep 17 00:00:00 2001 From: Ivan <42812006+ivan-015@users.noreply.github.com> Date: Mon, 7 Feb 2022 08:49:33 -0700 Subject: [PATCH 09/23] Add copyWIth method to context Add cleanString method to PBTextGen --- .../visual-widgets/pb_text_gen.dart | 5 +-- .../helpers/pb_context.dart | 31 ++++++++++++++++--- 2 files changed, 29 insertions(+), 7 deletions(-) diff --git a/lib/generation/generators/visual-widgets/pb_text_gen.dart b/lib/generation/generators/visual-widgets/pb_text_gen.dart index 1379ca7c..c97a657e 100644 --- a/lib/generation/generators/visual-widgets/pb_text_gen.dart +++ b/lib/generation/generators/visual-widgets/pb_text_gen.dart @@ -9,11 +9,12 @@ import 'package:parabeac_core/interpret_and_optimize/helpers/pb_context.dart'; class PBTextGen extends PBGenerator { PBTextGen() : super(); + static String cleanString(String text) => + text.replaceAll('\n', ' ')?.replaceAll('\'', '\\\'') ?? ''; @override String generate(PBIntermediateNode source, PBContext context) { if (source is InheritedText) { - var cleanText = - source.text?.replaceAll('\n', ' ')?.replaceAll('\'', '\\\'') ?? ''; + var cleanText = cleanString(source.text); context.project.genProjectData.addDependencies('auto_size_text', '3.0.0'); context.managerData diff --git a/lib/interpret_and_optimize/helpers/pb_context.dart b/lib/interpret_and_optimize/helpers/pb_context.dart index 17d9f6f4..1dcadf2e 100644 --- a/lib/interpret_and_optimize/helpers/pb_context.dart +++ b/lib/interpret_and_optimize/helpers/pb_context.dart @@ -13,12 +13,11 @@ class PBContext { Rectangle3D _screenFrame; Rectangle3D get screenFrame => _screenFrame; - set screenFrame(Rectangle3D frame){ + set screenFrame(Rectangle3D frame) { canvasFrame ??= Rectangle3D.fromPoints(frame.topLeft, frame.bottomRight); _screenFrame = frame; } - /// These values represent the current "focus area" size as it travels down the /// tree. /// @@ -70,9 +69,7 @@ class PBContext { if (size == 0) { return size; } - return isHorizontal - ? size / screenFrame.width - : size / screenFrame.height; + return isHorizontal ? size / screenFrame.width : size / screenFrame.height; } PBContext clone() { @@ -86,6 +83,30 @@ class PBContext { context.screenFrame = _screenFrame; return context; } + + PBContext copyWith({ + PBConfiguration configuration, + PBIntermediateTree tree, + PBIntermediateConstraints contextConstraints, + PBSharedMasterNode masterNode, + PBProject project, + Rectangle3D canvasFrame, + PBGenerationManager generationManager, + SizingValueContext sizingContext, + Rectangle3D screenFrame, + }) { + return PBContext( + configuration ?? this.configuration, + tree: tree ?? this.tree, + contextConstraints: contextConstraints ?? this.contextConstraints, + masterNode: masterNode ?? this.masterNode, + project: project ?? this.project, + canvasFrame: canvasFrame ?? this.canvasFrame, + generationManager: generationManager ?? this.generationManager, + ) + ..sizingContext = sizingContext ?? this.sizingContext + ..screenFrame = screenFrame ?? this.screenFrame; + } } enum SizingValueContext { From 72f8a2b755b979f64fe1cc533c19f80a02005b51 Mon Sep 17 00:00:00 2001 From: Ivan <42812006+ivan-015@users.noreply.github.com> Date: Mon, 7 Feb 2022 12:38:38 -0700 Subject: [PATCH 10/23] Add findChild method to [PBIntermediateTree] This method searches for a child of a PBIntermediateNode with a specified name and type. --- .../helpers/pb_intermediate_node_tree.dart | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/lib/interpret_and_optimize/helpers/pb_intermediate_node_tree.dart b/lib/interpret_and_optimize/helpers/pb_intermediate_node_tree.dart index b412dbc7..d41752cc 100644 --- a/lib/interpret_and_optimize/helpers/pb_intermediate_node_tree.dart +++ b/lib/interpret_and_optimize/helpers/pb_intermediate_node_tree.dart @@ -125,6 +125,25 @@ class PBIntermediateTree extends DirectedGraph { _elementStorage = ElementStorage(); } + /// Finds a [PBIntermediateNode] that is a child of `parent` of `type` in the [PBIntermediateTree], containing `name`. + /// + /// Returns null if not found. + PBIntermediateNode findChild(PBIntermediateNode parent, String name, Type type) { + /// Check if the node is a match + if (parent.name.contains(name) && parent.runtimeType == type) { + return parent; + } + + /// Check if node's children are a match + for (var child in childrenOf(parent)) { + var result = findChild(child, name, type); + if (result != null) { + return result; + } + } + return null; + } + /// These are observers of [Vertex] that will be added into [this] void addChildrenObeserver(String UUID, ChildrenModEventHandler oberver) { var mods = _childrenModObservers[UUID] ?? []; From f717e71cbdf8015f619d2f0987e62af8507096b0 Mon Sep 17 00:00:00 2001 From: Ivan <42812006+ivan-015@users.noreply.github.com> Date: Mon, 14 Feb 2022 23:04:53 -0700 Subject: [PATCH 11/23] Delete oobsolete folder --- .../helper/sketch_constraint_to_pbdl.dart | 359 ------------------ 1 file changed, 359 deletions(-) delete mode 100644 lib/input/sketch/helper/sketch_constraint_to_pbdl.dart diff --git a/lib/input/sketch/helper/sketch_constraint_to_pbdl.dart b/lib/input/sketch/helper/sketch_constraint_to_pbdl.dart deleted file mode 100644 index 936fdfe6..00000000 --- a/lib/input/sketch/helper/sketch_constraint_to_pbdl.dart +++ /dev/null @@ -1,359 +0,0 @@ -// import 'package:parabeac_core/interpret_and_optimize/entities/subclasses/pbdl_constraints.dart'; - -// PBDLConstraints convertSketchConstraintToPBDLConstraint( -// int resizingConstraint) { -// var constraints = sketchConstraintBitFieldToPBDLMap[resizingConstraint]; -// if (constraints == null) { -// print( -// '[PBDL Conversion Error] We don\' support this `resizingConstraint` from Sketch.'); -// } -// return constraints; -// } - -// /// A map that references the Sketch Constraint Bitmap to PBDL Constraints. -// /// For reference: https://www.notion.so/parabeac/2ff2c018c44644d9bba6bc4567f249c2?v=5c9a4978c96b4ee1aab8b219e3a2c006 -// var sketchConstraintBitFieldToPBDLMap = { -// 63: PBDLConstraints( -// pinLeft: false, -// pinRight: false, -// pinTop: false, -// pinBottom: false, -// fixedHeight: false, -// fixedWidth: false), -// 18: PBDLConstraints( -// pinLeft: true, -// pinRight: true, -// pinTop: true, -// pinBottom: true, -// fixedHeight: false, -// fixedWidth: false), -// 31: PBDLConstraints( -// pinLeft: false, -// pinRight: false, -// pinTop: true, -// pinBottom: false, -// fixedHeight: false, -// fixedWidth: false), -// 27: PBDLConstraints( -// pinLeft: true, -// pinRight: false, -// pinTop: true, -// pinBottom: false, -// fixedHeight: false, -// fixedWidth: false), -// 19: PBDLConstraints( -// pinLeft: true, -// pinRight: false, -// pinTop: true, -// pinBottom: true, -// fixedHeight: false, -// fixedWidth: false), -// 22: PBDLConstraints( -// pinLeft: false, -// pinRight: true, -// pinTop: true, -// pinBottom: true, -// fixedHeight: false, -// fixedWidth: false), -// 30: PBDLConstraints( -// pinLeft: false, -// pinRight: true, -// pinTop: true, -// pinBottom: false, -// fixedHeight: false, -// fixedWidth: false), -// 26: PBDLConstraints( -// pinLeft: true, -// pinRight: true, -// pinTop: true, -// pinBottom: false, -// fixedHeight: false, -// fixedWidth: false), -// 23: PBDLConstraints( -// pinLeft: false, -// pinRight: false, -// pinTop: true, -// pinBottom: true, -// fixedHeight: false, -// fixedWidth: false), -// 59: PBDLConstraints( -// pinLeft: true, -// pinRight: false, -// pinTop: false, -// pinBottom: false, -// fixedHeight: false, -// fixedWidth: false), -// 51: PBDLConstraints( -// pinLeft: true, -// pinRight: false, -// pinTop: false, -// pinBottom: true, -// fixedHeight: false, -// fixedWidth: false), -// 50: PBDLConstraints( -// pinLeft: true, -// pinRight: true, -// pinTop: false, -// pinBottom: true, -// fixedHeight: false, -// fixedWidth: false), -// 58: PBDLConstraints( -// pinLeft: true, -// pinRight: true, -// pinTop: false, -// pinBottom: false, -// fixedHeight: false, -// fixedWidth: false), -// 55: PBDLConstraints( -// pinLeft: false, -// pinRight: false, -// pinTop: false, -// pinBottom: true, -// fixedHeight: false, -// fixedWidth: false), -// 54: PBDLConstraints( -// pinLeft: false, -// pinRight: true, -// pinTop: false, -// pinBottom: true, -// fixedHeight: false, -// fixedWidth: false), -// 62: PBDLConstraints( -// pinLeft: false, -// pinRight: true, -// pinTop: false, -// pinBottom: false, -// fixedHeight: false, -// fixedWidth: false), -// 61: PBDLConstraints( -// pinLeft: false, -// pinRight: false, -// pinTop: false, -// pinBottom: false, -// fixedHeight: false, -// fixedWidth: true), -// 29: PBDLConstraints( -// pinLeft: false, -// pinRight: false, -// pinTop: true, -// pinBottom: false, -// fixedHeight: false, -// fixedWidth: true), -// 25: PBDLConstraints( -// pinLeft: true, -// pinRight: false, -// pinTop: true, -// pinBottom: false, -// fixedHeight: false, -// fixedWidth: true), -// 17: PBDLConstraints( -// pinLeft: true, -// pinRight: false, -// pinTop: true, -// pinBottom: true, -// fixedHeight: false, -// fixedWidth: true), -// 57: PBDLConstraints( -// pinLeft: true, -// pinRight: false, -// pinTop: false, -// pinBottom: false, -// fixedHeight: false, -// fixedWidth: true), -// 49: PBDLConstraints( -// pinLeft: true, -// pinRight: false, -// pinTop: false, -// pinBottom: true, -// fixedHeight: false, -// fixedWidth: true), -// 53: PBDLConstraints( -// pinLeft: false, -// pinRight: false, -// pinTop: false, -// pinBottom: true, -// fixedHeight: false, -// fixedWidth: true), -// 52: PBDLConstraints( -// pinLeft: false, -// pinRight: true, -// pinTop: false, -// pinBottom: true, -// fixedHeight: false, -// fixedWidth: true), -// 20: PBDLConstraints( -// pinLeft: false, -// pinRight: true, -// pinTop: true, -// pinBottom: true, -// fixedHeight: false, -// fixedWidth: true), -// 60: PBDLConstraints( -// pinLeft: false, -// pinRight: true, -// pinTop: false, -// pinBottom: false, -// fixedHeight: false, -// fixedWidth: true), -// 28: PBDLConstraints( -// pinLeft: false, -// pinRight: true, -// pinTop: true, -// pinBottom: false, -// fixedHeight: false, -// fixedWidth: true), -// 21: PBDLConstraints( -// pinLeft: false, -// pinRight: false, -// pinTop: true, -// pinBottom: true, -// fixedHeight: false, -// fixedWidth: true), -// 47: PBDLConstraints( -// pinLeft: false, -// pinRight: false, -// pinTop: false, -// pinBottom: false, -// fixedHeight: true, -// fixedWidth: false), -// 15: PBDLConstraints( -// pinLeft: false, -// pinRight: false, -// pinTop: true, -// pinBottom: false, -// fixedHeight: true, -// fixedWidth: false), -// 11: PBDLConstraints( -// pinLeft: true, -// pinRight: false, -// pinTop: true, -// pinBottom: false, -// fixedHeight: true, -// fixedWidth: false), -// 43: PBDLConstraints( -// pinLeft: true, -// pinRight: false, -// pinTop: false, -// pinBottom: false, -// fixedHeight: true, -// fixedWidth: false), -// 35: PBDLConstraints( -// pinLeft: true, -// pinRight: false, -// pinTop: false, -// pinBottom: true, -// fixedHeight: true, -// fixedWidth: false), -// 34: PBDLConstraints( -// pinLeft: true, -// pinRight: true, -// pinTop: false, -// pinBottom: true, -// fixedHeight: true, -// fixedWidth: false), -// 39: PBDLConstraints( -// pinLeft: false, -// pinRight: false, -// pinTop: false, -// pinBottom: true, -// fixedHeight: true, -// fixedWidth: false), -// 38: PBDLConstraints( -// pinLeft: false, -// pinRight: true, -// pinTop: false, -// pinBottom: true, -// fixedHeight: true, -// fixedWidth: false), -// 46: PBDLConstraints( -// pinLeft: false, -// pinRight: true, -// pinTop: false, -// pinBottom: false, -// fixedHeight: true, -// fixedWidth: false), -// 14: PBDLConstraints( -// pinLeft: false, -// pinRight: true, -// pinTop: true, -// pinBottom: false, -// fixedHeight: true, -// fixedWidth: false), -// 10: PBDLConstraints( -// pinLeft: true, -// pinRight: true, -// pinTop: true, -// pinBottom: false, -// fixedHeight: true, -// fixedWidth: false), -// 42: PBDLConstraints( -// pinLeft: true, -// pinRight: true, -// pinTop: false, -// pinBottom: false, -// fixedHeight: true, -// fixedWidth: false), -// 45: PBDLConstraints( -// pinLeft: false, -// pinRight: false, -// pinTop: false, -// pinBottom: false, -// fixedHeight: true, -// fixedWidth: true), -// 13: PBDLConstraints( -// pinLeft: false, -// pinRight: false, -// pinTop: true, -// pinBottom: false, -// fixedHeight: true, -// fixedWidth: true), -// 9: PBDLConstraints( -// pinLeft: true, -// pinRight: false, -// pinTop: true, -// pinBottom: false, -// fixedHeight: true, -// fixedWidth: true), -// 41: PBDLConstraints( -// pinLeft: true, -// pinRight: false, -// pinTop: false, -// pinBottom: false, -// fixedHeight: true, -// fixedWidth: true), -// 33: PBDLConstraints( -// pinLeft: true, -// pinRight: false, -// pinTop: false, -// pinBottom: true, -// fixedHeight: true, -// fixedWidth: true), -// 37: PBDLConstraints( -// pinLeft: false, -// pinRight: false, -// pinTop: false, -// pinBottom: true, -// fixedHeight: true, -// fixedWidth: true), -// 36: PBDLConstraints( -// pinLeft: false, -// pinRight: true, -// pinTop: false, -// pinBottom: true, -// fixedHeight: true, -// fixedWidth: true), -// 44: PBDLConstraints( -// pinLeft: false, -// pinRight: true, -// pinTop: false, -// pinBottom: false, -// fixedHeight: true, -// fixedWidth: true), -// 12: PBDLConstraints( -// pinLeft: false, -// pinRight: true, -// pinTop: true, -// pinBottom: false, -// fixedHeight: true, -// fixedWidth: true) -// }; From 0b7995e1226c213359c7ff040b8a765db00b0237 Mon Sep 17 00:00:00 2001 From: Ivan <42812006+ivan-015@users.noreply.github.com> Date: Mon, 14 Feb 2022 23:07:36 -0700 Subject: [PATCH 12/23] Allow Handlers to be injected dynamically in interpreter. Add `componentIsolation` to configuration. --- lib/controllers/interpret.dart | 10 +++++++--- .../helpers/pb_configuration.dart | 4 ++++ .../helpers/pb_configuration.g.dart | 1 + 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/lib/controllers/interpret.dart b/lib/controllers/interpret.dart index be5ddf62..311270af 100644 --- a/lib/controllers/interpret.dart +++ b/lib/controllers/interpret.dart @@ -30,7 +30,7 @@ class Interpret { PBPrototypeLinkerService _pbPrototypeLinkerService; - final List aitHandlers = [ + List aitHandlers = [ StateManagementNodeInterpreter(), PBSymbolLinkerService(), // PBPluginControlService(), @@ -43,9 +43,13 @@ class Interpret { Future interpretAndOptimize( PBIntermediateTree tree, PBContext context, PBProject project, {List handlers, AITServiceBuilder aitServiceBuilder}) async { - handlers ??= aitHandlers; + if (handlers == null || handlers.isEmpty) { + handlers = aitHandlers; + } else { + handlers.addAll(aitHandlers); + } - aitServiceBuilder ??= AITServiceBuilder(aitHandlers); + aitServiceBuilder ??= AITServiceBuilder(handlers); var elementStorage = ElementStorage(); elementStorage.elementToTree[tree.rootNode.UUID] = tree.UUID; diff --git a/lib/interpret_and_optimize/helpers/pb_configuration.dart b/lib/interpret_and_optimize/helpers/pb_configuration.dart index 00180a39..aa1c8b5d 100644 --- a/lib/interpret_and_optimize/helpers/pb_configuration.dart +++ b/lib/interpret_and_optimize/helpers/pb_configuration.dart @@ -52,6 +52,9 @@ class PBConfiguration { @JsonKey(defaultValue: false) final bool enablePrototyping; + @JsonKey(defaultValue: 'None') + final String componentIsolation; + PBConfiguration( this.widgetStyle, this.widgetType, @@ -61,6 +64,7 @@ class PBConfiguration { this.breakpoints, this.scaling, this.enablePrototyping, + this.componentIsolation, ); /// Converting the [json] into a [PBConfiguration] object. diff --git a/lib/interpret_and_optimize/helpers/pb_configuration.g.dart b/lib/interpret_and_optimize/helpers/pb_configuration.g.dart index a0954c97..2927f498 100644 --- a/lib/interpret_and_optimize/helpers/pb_configuration.g.dart +++ b/lib/interpret_and_optimize/helpers/pb_configuration.g.dart @@ -17,6 +17,7 @@ PBConfiguration _$PBConfigurationFromJson(Map json) { json['breakpoints'] as Map, json['scaling'] as bool ?? true, json['enablePrototyping'] as bool ?? false, + json['componentIsolation'] as String ?? 'None', ); } From ffc89464fe8aa0c5c38fcecf94e5901150ce7681 Mon Sep 17 00:00:00 2001 From: Ivan <42812006+ivan-015@users.noreply.github.com> Date: Mon, 14 Feb 2022 23:09:19 -0700 Subject: [PATCH 13/23] Add IsolationNode and WidgetBook implementations --- .../comp_isolation/isolation_node.dart | 35 +++++++++++++++++++ .../entities/widgetbook_category.dart | 33 +++++++++++++++++ .../entities/widgetbook_folder.dart | 21 +++++++++++ .../entities/widgetbook_use_case.dart | 16 +++++++++ .../entities/widgetbook_widget.dart | 22 ++++++++++++ 5 files changed, 127 insertions(+) create mode 100644 lib/generation/flutter_project_builder/post_gen_tasks/comp_isolation/isolation_node.dart create mode 100644 lib/generation/flutter_project_builder/post_gen_tasks/comp_isolation/widgetbook/entities/widgetbook_category.dart create mode 100644 lib/generation/flutter_project_builder/post_gen_tasks/comp_isolation/widgetbook/entities/widgetbook_folder.dart create mode 100644 lib/generation/flutter_project_builder/post_gen_tasks/comp_isolation/widgetbook/entities/widgetbook_use_case.dart create mode 100644 lib/generation/flutter_project_builder/post_gen_tasks/comp_isolation/widgetbook/entities/widgetbook_widget.dart diff --git a/lib/generation/flutter_project_builder/post_gen_tasks/comp_isolation/isolation_node.dart b/lib/generation/flutter_project_builder/post_gen_tasks/comp_isolation/isolation_node.dart new file mode 100644 index 00000000..67d5b989 --- /dev/null +++ b/lib/generation/flutter_project_builder/post_gen_tasks/comp_isolation/isolation_node.dart @@ -0,0 +1,35 @@ +/// Class that represents a generic Component Isolation Node. +/// +/// For instance, Widgetbook may have Categories, Folders, etc., +/// while Dashbook has Stories and Chapters. This node can represent +/// these in a generic way. +abstract class IsolationNode { + String name; + + List children; + + /// Generates a string representation of how the + /// [IsolationNode] should be printed. + String generate(); + + IsolationNode({this.children, this.name}) { + children ??= []; + } + + /// Adds a child to the [IsolationNode]. + void addChild(IsolationNode child) { + children.add(child); + } + + List getType() => + children.whereType().toList(); + + /// Returns [IsolationNode] with type [T] and name [name]. + /// + /// Returns null if no such node exists. + IsolationNode getNamed(String name) => + children.whereType().firstWhere( + (element) => element.name == name, + orElse: () => null, + ); +} diff --git a/lib/generation/flutter_project_builder/post_gen_tasks/comp_isolation/widgetbook/entities/widgetbook_category.dart b/lib/generation/flutter_project_builder/post_gen_tasks/comp_isolation/widgetbook/entities/widgetbook_category.dart new file mode 100644 index 00000000..8f2615c3 --- /dev/null +++ b/lib/generation/flutter_project_builder/post_gen_tasks/comp_isolation/widgetbook/entities/widgetbook_category.dart @@ -0,0 +1,33 @@ +import 'package:parabeac_core/generation/flutter_project_builder/post_gen_tasks/comp_isolation/isolation_node.dart'; +import 'package:parabeac_core/generation/flutter_project_builder/post_gen_tasks/comp_isolation/widgetbook/entities/widgetbook_folder.dart'; +import 'package:parabeac_core/generation/flutter_project_builder/post_gen_tasks/comp_isolation/widgetbook/entities/widgetbook_widget.dart'; + +/// Class that represents a WidgetBook Category. +class WidgetBookCategory extends IsolationNode { + WidgetBookCategory({ + String name = 'Parabeac-Generated', + }) : super(name: name); + + @override + String generate() { + var folders = getType(); + var widgets = getType(); + + var folderGen = ''; + var widgetsGen = ''; + + if (folders != null && folders.isNotEmpty) { + folderGen = folders.map((f) => f.generate()).join('\n'); + } + if (widgets != null && widgets.isNotEmpty) { + widgetsGen = widgets.map((w) => w.generate()).join('\n'); + } + return ''' + WidgetbookCategory( + name: 'Parabeac-Generated', + ${folderGen.isNotEmpty ? 'folders: [\n$folderGen\n],\n' : ''} + ${widgetsGen.isNotEmpty ? 'widgets: [\n$widgetsGen\n],\n' : ''} + ) + '''; + } +} diff --git a/lib/generation/flutter_project_builder/post_gen_tasks/comp_isolation/widgetbook/entities/widgetbook_folder.dart b/lib/generation/flutter_project_builder/post_gen_tasks/comp_isolation/widgetbook/entities/widgetbook_folder.dart new file mode 100644 index 00000000..3bc52d52 --- /dev/null +++ b/lib/generation/flutter_project_builder/post_gen_tasks/comp_isolation/widgetbook/entities/widgetbook_folder.dart @@ -0,0 +1,21 @@ +import 'package:parabeac_core/generation/flutter_project_builder/post_gen_tasks/comp_isolation/isolation_node.dart'; +import 'package:parabeac_core/generation/flutter_project_builder/post_gen_tasks/comp_isolation/widgetbook/entities/widgetbook_widget.dart'; + +class WidgetBookFolder extends IsolationNode { + WidgetBookFolder(String name) : super(name: name); + + @override + String generate() { + var widgets = getType(); + var genWidgets = ''; + if (widgets != null && widgets.isNotEmpty) { + genWidgets = widgets.map((node) => node.generate()).join(',\n'); + } + return ''' + WidgetbookFolder( + name: '$name', + ${genWidgets.isNotEmpty ? 'widgets: [\n$genWidgets\n],\n' : ''} + ) + '''; + } +} diff --git a/lib/generation/flutter_project_builder/post_gen_tasks/comp_isolation/widgetbook/entities/widgetbook_use_case.dart b/lib/generation/flutter_project_builder/post_gen_tasks/comp_isolation/widgetbook/entities/widgetbook_use_case.dart new file mode 100644 index 00000000..479edc30 --- /dev/null +++ b/lib/generation/flutter_project_builder/post_gen_tasks/comp_isolation/widgetbook/entities/widgetbook_use_case.dart @@ -0,0 +1,16 @@ +import 'package:parabeac_core/generation/flutter_project_builder/post_gen_tasks/comp_isolation/isolation_node.dart'; + +class WidgetBookUseCase extends IsolationNode { + String builderCode; + WidgetBookUseCase(String name, this.builderCode) : super(name: name); + + @override + String generate() { + return ''' + WidgetbookUseCase( + name: '$name', + builder: (context) => Center(child: $builderCode), + ), + '''; + } +} diff --git a/lib/generation/flutter_project_builder/post_gen_tasks/comp_isolation/widgetbook/entities/widgetbook_widget.dart b/lib/generation/flutter_project_builder/post_gen_tasks/comp_isolation/widgetbook/entities/widgetbook_widget.dart new file mode 100644 index 00000000..6b6237cf --- /dev/null +++ b/lib/generation/flutter_project_builder/post_gen_tasks/comp_isolation/widgetbook/entities/widgetbook_widget.dart @@ -0,0 +1,22 @@ +import 'package:parabeac_core/generation/flutter_project_builder/post_gen_tasks/comp_isolation/isolation_node.dart'; +import 'package:parabeac_core/generation/flutter_project_builder/post_gen_tasks/comp_isolation/widgetbook/entities/widgetbook_use_case.dart'; + +/// Node that represents a Widgetbook component. +class WidgetBookWidget extends IsolationNode { + WidgetBookWidget(String name) : super(name: name); + + @override + String generate() { + var useCases = getType(); + var useCasesGen = ''; + if (useCases != null && useCases.isNotEmpty) { + useCasesGen = useCases.map((useCase) => useCase.generate()).join('\n'); + } + return ''' + WidgetbookWidget( + name: '$name', + ${useCasesGen.isNotEmpty ? 'useCases: [\n$useCasesGen\n],\n' : ''} + ) + '''; + } +} From 8a0a605e5ad1592c9e3b4f756932dfa2d0a036e2 Mon Sep 17 00:00:00 2001 From: Ivan <42812006+ivan-015@users.noreply.github.com> Date: Mon, 14 Feb 2022 23:11:23 -0700 Subject: [PATCH 14/23] Add Comp. Iso. Configuration and Comp. Iso. Service The ComponentIsolationService is an interpret service that examines trees and extracts information. The Configuration is in charge of coordinating and generating the component isolation code. --- .../component_isolation_configuration.dart | 13 +++ .../widgetbook/widgetbook_configuration.dart | 61 ++++++++++++++ .../component_isolation_service.dart | 24 ++++++ .../widgetbook_service.dart | 81 +++++++++++++++++++ 4 files changed, 179 insertions(+) create mode 100644 lib/generation/flutter_project_builder/post_gen_tasks/comp_isolation/component_isolation_configuration.dart create mode 100644 lib/generation/flutter_project_builder/post_gen_tasks/comp_isolation/widgetbook/widgetbook_configuration.dart create mode 100644 lib/interpret_and_optimize/services/component_isolation/component_isolation_service.dart create mode 100644 lib/interpret_and_optimize/services/component_isolation/widgetbook_service.dart diff --git a/lib/generation/flutter_project_builder/post_gen_tasks/comp_isolation/component_isolation_configuration.dart b/lib/generation/flutter_project_builder/post_gen_tasks/comp_isolation/component_isolation_configuration.dart new file mode 100644 index 00000000..14b5ecf9 --- /dev/null +++ b/lib/generation/flutter_project_builder/post_gen_tasks/comp_isolation/component_isolation_configuration.dart @@ -0,0 +1,13 @@ +import 'package:parabeac_core/generation/flutter_project_builder/import_helper.dart'; + +/// Class that represents a Component Isolation Configuration. +/// +/// This class sets up the Component Isolation Package (i.e. Widgetbook, Dashbook, etc.) +/// to create the necessary classes and generate the code at the end. +abstract class ComponentIsolationConfiguration { + /// Method that generates the code for this configuration. + String generateCode(ImportHelper importHelper); + + /// Path to the file to be written, relative to the `lib` directory. + String fileName; +} diff --git a/lib/generation/flutter_project_builder/post_gen_tasks/comp_isolation/widgetbook/widgetbook_configuration.dart b/lib/generation/flutter_project_builder/post_gen_tasks/comp_isolation/widgetbook/widgetbook_configuration.dart new file mode 100644 index 00000000..525c0de8 --- /dev/null +++ b/lib/generation/flutter_project_builder/post_gen_tasks/comp_isolation/widgetbook/widgetbook_configuration.dart @@ -0,0 +1,61 @@ +import 'package:parabeac_core/controllers/main_info.dart'; +import 'package:parabeac_core/generation/flutter_project_builder/import_helper.dart'; +import 'package:parabeac_core/generation/flutter_project_builder/post_gen_tasks/comp_isolation/component_isolation_configuration.dart'; +import 'package:parabeac_core/generation/generators/import_generator.dart'; +import 'package:parabeac_core/interpret_and_optimize/services/component_isolation/widgetbook_service.dart'; + +class WidgetbookConfiguration implements ComponentIsolationConfiguration { + @override + String fileName = 'main_widgetbook.dart'; + + @override + String generateCode(ImportHelper helper) { + var category = WidgetBookService.category; + var treeIds = WidgetBookService.treeIds; + var generatedCode = category.generate(); + + var imports = treeIds + .map( + (id) => helper + .getFormattedImports( + id, + importMapper: (import) => FlutterImport( + import, + MainInfo().projectName, + ), + ) + .join('\n'), + ) + .join(''); + return ''' + import 'package:widgetbook/widgetbook.dart'; + import 'package:flutter/material.dart'; + $imports + + void main() { + runApp(const MyApp()); + } + + class MyApp extends StatelessWidget { + const MyApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context){ + return Widgetbook( + themes: [ + WidgetbookTheme(name: 'Light', data: ThemeData.light()), + ], + devices: const [ + Apple.iPhone11ProMax, + Samsung.s10, + ], + categories: [ + $generatedCode, + ], + appInfo: AppInfo(name: 'MyApp'), + ); + } + } + '''; + } +} diff --git a/lib/interpret_and_optimize/services/component_isolation/component_isolation_service.dart b/lib/interpret_and_optimize/services/component_isolation/component_isolation_service.dart new file mode 100644 index 00000000..adf6afd9 --- /dev/null +++ b/lib/interpret_and_optimize/services/component_isolation/component_isolation_service.dart @@ -0,0 +1,24 @@ +import 'package:parabeac_core/controllers/interpret.dart'; +import 'package:parabeac_core/generation/flutter_project_builder/post_gen_tasks/comp_isolation/component_isolation_configuration.dart'; +import 'package:parabeac_core/generation/flutter_project_builder/post_gen_tasks/comp_isolation/widgetbook/widgetbook_configuration.dart'; +import 'package:parabeac_core/interpret_and_optimize/services/component_isolation/widgetbook_service.dart'; + +abstract class ComponentIsolationService extends AITHandler {} + +class ComponentIsolationFactory { + static final Map _isolationServices = { + 'widgetbook': + ComponentIsolationTuple(WidgetBookService(), WidgetbookConfiguration()), + }; + static ComponentIsolationTuple getTuple(String serviceName) => + _isolationServices[serviceName]; +} + +/// Class that holds a [ComponentIsolationService] and the [ComponentIsolationConfiguration] that +/// will be executed after the interpretation is complete. +class ComponentIsolationTuple { + final ComponentIsolationService service; + final ComponentIsolationConfiguration configuration; + + ComponentIsolationTuple(this.service, this.configuration); +} diff --git a/lib/interpret_and_optimize/services/component_isolation/widgetbook_service.dart b/lib/interpret_and_optimize/services/component_isolation/widgetbook_service.dart new file mode 100644 index 00000000..7523d357 --- /dev/null +++ b/lib/interpret_and_optimize/services/component_isolation/widgetbook_service.dart @@ -0,0 +1,81 @@ +import 'package:parabeac_core/generation/flutter_project_builder/post_gen_tasks/comp_isolation/widgetbook/entities/widgetbook_category.dart'; +import 'package:parabeac_core/generation/flutter_project_builder/post_gen_tasks/comp_isolation/widgetbook/entities/widgetbook_folder.dart'; +import 'package:parabeac_core/generation/flutter_project_builder/post_gen_tasks/comp_isolation/widgetbook/entities/widgetbook_use_case.dart'; +import 'package:parabeac_core/generation/flutter_project_builder/post_gen_tasks/comp_isolation/widgetbook/entities/widgetbook_widget.dart'; +import 'package:parabeac_core/generation/generators/attribute-helper/pb_size_helper.dart'; +import 'package:parabeac_core/generation/generators/symbols/pb_instancesym_gen.dart'; +import 'package:parabeac_core/interpret_and_optimize/entities/pb_shared_instance.dart'; +import 'package:parabeac_core/interpret_and_optimize/entities/pb_shared_master_node.dart'; +import 'package:parabeac_core/interpret_and_optimize/helpers/pb_intermediate_node_tree.dart'; +import 'package:parabeac_core/interpret_and_optimize/helpers/pb_context.dart'; +import 'package:parabeac_core/interpret_and_optimize/services/component_isolation/component_isolation_service.dart'; +import 'package:recase/recase.dart'; + +class WidgetBookService extends ComponentIsolationService { + /// Map that holds the name of the folder as its key, and the folder as its value. + + // FIXME: The reason these are static is because otherwise we'd need a service that can + // gather the folders, widgets, and categories to pass it to the ComponentIsolationService. + // The treeIds need to be gathered to generate the imports later on as well. + static Map _widgetBookFolders; + static Map _widgetBookWidgets; + static WidgetBookCategory category = WidgetBookCategory(); + static final treeIds = []; + WidgetBookService() { + _widgetBookFolders = {}; + _widgetBookWidgets = {}; + } + + @override + Future handleTree( + PBContext context, PBIntermediateTree tree) async { + /// Only process [PBSharedMasterNode]s. + if (tree.rootNode is PBSharedMasterNode) { + treeIds.add(tree.UUID); + + /// Create a new folder if it doesn't exist. + if (!_widgetBookFolders.containsKey(tree.name)) { + _widgetBookFolders[tree.name] = WidgetBookFolder(tree.name); + category.addChild(_widgetBookFolders[tree.name]); + } + + var component = tree.rootNode as PBSharedMasterNode; + var rootName = component.componentSetName ?? tree.rootNode.name; + + /// Create new Widget for this variation if it doesn't exist already + if (!_widgetBookWidgets.containsKey(rootName)) { + _widgetBookWidgets[rootName] = WidgetBookWidget(rootName); + _widgetBookFolders[tree.name].addChild(_widgetBookWidgets[rootName]); + } + + /// Create a fake instance in order to generate the Use Case. + // FIXME: Generating the code should happen somewhere in generate, not here. + var dummyInstance = PBSharedInstanceIntermediateNode( + null, + tree.rootNode.frame.copyWith(), + SYMBOL_ID: component.SYMBOL_ID, + name: rootName, + sharedNodeSetID: component.sharedNodeSetID, + ); + var sizeHelper = PBSizeHelper(); + + var generatedCode = ''' + SizedBox( + ${sizeHelper.generate(dummyInstance, context.copyWith(sizingContext: SizingValueContext.PointValue))} + child: ${(dummyInstance.generator as PBSymbolInstanceGenerator).generate( + dummyInstance, + context.copyWith(), + )}, + ), + '''; + + /// Create a use case for the current component and add it to the folder. + var useCase = WidgetBookUseCase( + (tree.rootNode as PBSharedMasterNode).name.pascalCase, + generatedCode, + ); + _widgetBookWidgets[rootName].addChild(useCase); + } + return tree; + } +} From 821d3106abf6317fd48754ba1c78398361b596ce Mon Sep 17 00:00:00 2001 From: Ivan <42812006+ivan-015@users.noreply.github.com> Date: Mon, 14 Feb 2022 23:12:12 -0700 Subject: [PATCH 15/23] Add Comp. Isolation PostGenTask The PostGenTasks are tasks that should be run after parabeac-core is done generating trees. --- .../isolation_post_gen_task.dart | 25 +++++++++++++++++++ .../post_gen_tasks/post_gen_task.dart | 5 ++++ 2 files changed, 30 insertions(+) create mode 100644 lib/generation/flutter_project_builder/post_gen_tasks/comp_isolation/isolation_post_gen_task.dart create mode 100644 lib/generation/flutter_project_builder/post_gen_tasks/post_gen_task.dart diff --git a/lib/generation/flutter_project_builder/post_gen_tasks/comp_isolation/isolation_post_gen_task.dart b/lib/generation/flutter_project_builder/post_gen_tasks/comp_isolation/isolation_post_gen_task.dart new file mode 100644 index 00000000..3074b321 --- /dev/null +++ b/lib/generation/flutter_project_builder/post_gen_tasks/comp_isolation/isolation_post_gen_task.dart @@ -0,0 +1,25 @@ +import 'package:parabeac_core/generation/flutter_project_builder/post_gen_tasks/comp_isolation/component_isolation_configuration.dart'; +import 'package:parabeac_core/generation/flutter_project_builder/post_gen_tasks/post_gen_task.dart'; +import 'package:parabeac_core/generation/generators/value_objects/file_structure_strategy/commands/write_symbol_command.dart'; +import 'package:parabeac_core/generation/generators/value_objects/generation_configuration/pb_generation_configuration.dart'; + +/// This class is responsible for coordinating the generation of the +/// component isolation code based on the given configuration. +class IsolationPostGenTask implements PostGenTask { + /// Specific instance of the configuration to execute + ComponentIsolationConfiguration compIsoConfiguration; + + /// GenerationConfiguration to get strategy and imports + GenerationConfiguration generationConfiguration; + IsolationPostGenTask(this.compIsoConfiguration, this.generationConfiguration); + @override + void execute() { + var isolationCode = compIsoConfiguration.generateCode( + generationConfiguration.generationManager.importProcessor); + var fileName = compIsoConfiguration.fileName; + + /// TODO: WriteSymbolCommand was used as a workaround. We should generate a command that generically writes any file + generationConfiguration.fileStructureStrategy.commandCreated( + WriteSymbolCommand(null, fileName, isolationCode, symbolPath: 'lib/')); + } +} diff --git a/lib/generation/flutter_project_builder/post_gen_tasks/post_gen_task.dart b/lib/generation/flutter_project_builder/post_gen_tasks/post_gen_task.dart new file mode 100644 index 00000000..2907985e --- /dev/null +++ b/lib/generation/flutter_project_builder/post_gen_tasks/post_gen_task.dart @@ -0,0 +1,5 @@ +/// Abstract class for Tasks that will run post-generation. +abstract class PostGenTask { + /// Executes the [PostGenTask]. + void execute(); +} From 5a3890a84301d4b6b046d02d0a76ce67c60bf677 Mon Sep 17 00:00:00 2001 From: Ivan <42812006+ivan-015@users.noreply.github.com> Date: Mon, 14 Feb 2022 23:13:23 -0700 Subject: [PATCH 16/23] Add postgen tasks to FlutterProjectBuilder and use in main.dart If the configuration for component isolation is present, we will add the service and post gen task. --- .../flutter_project_builder.dart | 9 +++++++++ lib/main.dart | 17 +++++++++++++++-- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/lib/generation/flutter_project_builder/flutter_project_builder.dart b/lib/generation/flutter_project_builder/flutter_project_builder.dart index f82483d5..733a062a 100644 --- a/lib/generation/flutter_project_builder/flutter_project_builder.dart +++ b/lib/generation/flutter_project_builder/flutter_project_builder.dart @@ -1,6 +1,7 @@ import 'dart:convert'; import 'dart:io'; import 'package:parabeac_core/generation/flutter_project_builder/file_system_analyzer.dart'; +import 'package:parabeac_core/generation/flutter_project_builder/post_gen_tasks/post_gen_task.dart'; import 'package:parabeac_core/generation/generators/writers/pb_flutter_writer.dart'; import 'package:parabeac_core/interpret_and_optimize/helpers/pb_context.dart'; import 'package:parabeac_core/interpret_and_optimize/helpers/pb_intermediate_node_tree.dart'; @@ -41,6 +42,9 @@ class FlutterProjectBuilder { bool _configured = false; + /// Tasks to be run after generation is complete. + List postGenTasks = []; + FlutterProjectBuilder( this.generationConfiguration, this.fileSystemAnalyzer, { @@ -123,6 +127,11 @@ class FlutterProjectBuilder { ; } + /// Runs all the tasks in + void executePostGenTasks() { + postGenTasks.forEach((task) => task.execute()); + } + Future genAITree( PBIntermediateTree tree, PBContext context, bool isDryRun) async { if (!_configured) { diff --git a/lib/main.dart b/lib/main.dart index 61881dca..282a5d6a 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,6 +1,7 @@ import 'dart:async'; import 'dart:convert'; import 'dart:io'; +import 'package:parabeac_core/generation/flutter_project_builder/post_gen_tasks/comp_isolation/isolation_post_gen_task.dart'; import 'package:parabeac_core/generation/generators/util/pb_generation_view_data.dart'; import 'package:parabeac_core/interpret_and_optimize/entities/pb_shared_master_node.dart'; import 'package:parabeac_core/controllers/main_info.dart'; @@ -11,6 +12,7 @@ import 'package:parabeac_core/interpret_and_optimize/helpers/pb_context.dart'; import 'package:parabeac_core/interpret_and_optimize/helpers/pb_intermediate_node_tree.dart'; import 'package:parabeac_core/interpret_and_optimize/helpers/pb_plugin_list_helper.dart'; import 'package:parabeac_core/interpret_and_optimize/helpers/pb_project.dart'; +import 'package:parabeac_core/interpret_and_optimize/services/component_isolation/component_isolation_service.dart'; import 'package:parabeac_core/interpret_and_optimize/services/design_to_pbdl/design_to_pbdl_service.dart'; import 'package:parabeac_core/interpret_and_optimize/services/design_to_pbdl/figma_to_pbdl_service.dart'; import 'package:parabeac_core/interpret_and_optimize/services/design_to_pbdl/json_to_pbdl_service.dart'; @@ -113,6 +115,7 @@ ${parser.usage} } collectArguments(argResults); + var processInfo = MainInfo(); if (processInfo.designType == DesignType.UNKNOWN) { throw UnsupportedError('We have yet to support this DesignType! '); @@ -160,12 +163,20 @@ ${parser.usage} pbProject.forest.addAll(tempForest); - /// - var fpb = FlutterProjectBuilder( MainInfo().configuration.generationConfiguration, fileSystemAnalyzer, project: pbProject); + await fpb.preGenTasks(); + + /// Get ComponentIsolationService (if any), and add it to the list of services + var isolationTuple = ComponentIsolationFactory.getTuple( + MainInfo().configuration.componentIsolation); + if (isolationTuple != null) { + interpretService.aitHandlers.add(isolationTuple.service); + fpb.postGenTasks.add(IsolationPostGenTask( + isolationTuple.configuration, fpb.generationConfiguration)); + } await indexFileFuture; var trees = []; @@ -201,6 +212,8 @@ ${parser.usage} await fpb.genAITree(tree, tree.context, false); } + fpb.executePostGenTasks(); + exitCode = 0; } From b53d8ef5b7d176e5b13e700bc3b6ae616cbeac8c Mon Sep 17 00:00:00 2001 From: Ivan <42812006+ivan-015@users.noreply.github.com> Date: Tue, 15 Feb 2022 18:40:00 -0700 Subject: [PATCH 17/23] Refactor Configuration and added Generators. This was made to simplify the factory that creates a ComponentIsolationConfiguration --- ...art => component_isolation_generator.dart} | 12 ++++++--- .../isolation_post_gen_task.dart | 4 +-- ...uration.dart => widgetbook_generator.dart} | 12 +++++++-- .../component_isolation_configuration.dart | 25 +++++++++++++++++++ .../component_isolation_service.dart | 24 ------------------ .../widgetbook_service.dart | 5 ++-- lib/main.dart | 14 ++++++----- 7 files changed, 56 insertions(+), 40 deletions(-) rename lib/generation/flutter_project_builder/post_gen_tasks/comp_isolation/{component_isolation_configuration.dart => component_isolation_generator.dart} (52%) rename lib/generation/flutter_project_builder/post_gen_tasks/comp_isolation/widgetbook/{widgetbook_configuration.dart => widgetbook_generator.dart} (81%) create mode 100644 lib/interpret_and_optimize/helpers/component_isolation_configuration.dart delete mode 100644 lib/interpret_and_optimize/services/component_isolation/component_isolation_service.dart diff --git a/lib/generation/flutter_project_builder/post_gen_tasks/comp_isolation/component_isolation_configuration.dart b/lib/generation/flutter_project_builder/post_gen_tasks/comp_isolation/component_isolation_generator.dart similarity index 52% rename from lib/generation/flutter_project_builder/post_gen_tasks/comp_isolation/component_isolation_configuration.dart rename to lib/generation/flutter_project_builder/post_gen_tasks/comp_isolation/component_isolation_generator.dart index 14b5ecf9..9ef05645 100644 --- a/lib/generation/flutter_project_builder/post_gen_tasks/comp_isolation/component_isolation_configuration.dart +++ b/lib/generation/flutter_project_builder/post_gen_tasks/comp_isolation/component_isolation_generator.dart @@ -1,13 +1,17 @@ import 'package:parabeac_core/generation/flutter_project_builder/import_helper.dart'; +import 'package:parabeac_core/generation/generators/util/pb_generation_project_data.dart'; -/// Class that represents a Component Isolation Configuration. -/// +/// Class that represents a Component Isolation Generator. +/// /// This class sets up the Component Isolation Package (i.e. Widgetbook, Dashbook, etc.) /// to create the necessary classes and generate the code at the end. -abstract class ComponentIsolationConfiguration { - /// Method that generates the code for this configuration. +abstract class ComponentIsolationGenerator { + /// Method that generates the code for this generator. String generateCode(ImportHelper importHelper); /// Path to the file to be written, relative to the `lib` directory. String fileName; + + /// projectData used to add dependencies to the project. + PBGenerationProjectData projectData; } diff --git a/lib/generation/flutter_project_builder/post_gen_tasks/comp_isolation/isolation_post_gen_task.dart b/lib/generation/flutter_project_builder/post_gen_tasks/comp_isolation/isolation_post_gen_task.dart index 3074b321..917fd058 100644 --- a/lib/generation/flutter_project_builder/post_gen_tasks/comp_isolation/isolation_post_gen_task.dart +++ b/lib/generation/flutter_project_builder/post_gen_tasks/comp_isolation/isolation_post_gen_task.dart @@ -1,4 +1,4 @@ -import 'package:parabeac_core/generation/flutter_project_builder/post_gen_tasks/comp_isolation/component_isolation_configuration.dart'; +import 'package:parabeac_core/generation/flutter_project_builder/post_gen_tasks/comp_isolation/component_isolation_generator.dart'; import 'package:parabeac_core/generation/flutter_project_builder/post_gen_tasks/post_gen_task.dart'; import 'package:parabeac_core/generation/generators/value_objects/file_structure_strategy/commands/write_symbol_command.dart'; import 'package:parabeac_core/generation/generators/value_objects/generation_configuration/pb_generation_configuration.dart'; @@ -7,7 +7,7 @@ import 'package:parabeac_core/generation/generators/value_objects/generation_con /// component isolation code based on the given configuration. class IsolationPostGenTask implements PostGenTask { /// Specific instance of the configuration to execute - ComponentIsolationConfiguration compIsoConfiguration; + ComponentIsolationGenerator compIsoConfiguration; /// GenerationConfiguration to get strategy and imports GenerationConfiguration generationConfiguration; diff --git a/lib/generation/flutter_project_builder/post_gen_tasks/comp_isolation/widgetbook/widgetbook_configuration.dart b/lib/generation/flutter_project_builder/post_gen_tasks/comp_isolation/widgetbook/widgetbook_generator.dart similarity index 81% rename from lib/generation/flutter_project_builder/post_gen_tasks/comp_isolation/widgetbook/widgetbook_configuration.dart rename to lib/generation/flutter_project_builder/post_gen_tasks/comp_isolation/widgetbook/widgetbook_generator.dart index 525c0de8..2d042572 100644 --- a/lib/generation/flutter_project_builder/post_gen_tasks/comp_isolation/widgetbook/widgetbook_configuration.dart +++ b/lib/generation/flutter_project_builder/post_gen_tasks/comp_isolation/widgetbook/widgetbook_generator.dart @@ -1,13 +1,21 @@ import 'package:parabeac_core/controllers/main_info.dart'; import 'package:parabeac_core/generation/flutter_project_builder/import_helper.dart'; -import 'package:parabeac_core/generation/flutter_project_builder/post_gen_tasks/comp_isolation/component_isolation_configuration.dart'; +import 'package:parabeac_core/generation/flutter_project_builder/post_gen_tasks/comp_isolation/component_isolation_generator.dart'; import 'package:parabeac_core/generation/generators/import_generator.dart'; +import 'package:parabeac_core/generation/generators/util/pb_generation_project_data.dart'; import 'package:parabeac_core/interpret_and_optimize/services/component_isolation/widgetbook_service.dart'; -class WidgetbookConfiguration implements ComponentIsolationConfiguration { +class WidgetbookGenerator implements ComponentIsolationGenerator { @override String fileName = 'main_widgetbook.dart'; + WidgetbookGenerator(this.projectData) { + projectData.addDependencies('widgetbook', '2.0.5-beta'); + } + + @override + PBGenerationProjectData projectData; + @override String generateCode(ImportHelper helper) { var category = WidgetBookService.category; diff --git a/lib/interpret_and_optimize/helpers/component_isolation_configuration.dart b/lib/interpret_and_optimize/helpers/component_isolation_configuration.dart new file mode 100644 index 00000000..71a43ae5 --- /dev/null +++ b/lib/interpret_and_optimize/helpers/component_isolation_configuration.dart @@ -0,0 +1,25 @@ +import 'package:parabeac_core/controllers/interpret.dart'; +import 'package:parabeac_core/generation/flutter_project_builder/post_gen_tasks/comp_isolation/component_isolation_generator.dart'; +import 'package:parabeac_core/generation/flutter_project_builder/post_gen_tasks/comp_isolation/widgetbook/widgetbook_generator.dart'; +import 'package:parabeac_core/generation/generators/util/pb_generation_project_data.dart'; +import 'package:parabeac_core/interpret_and_optimize/services/component_isolation/widgetbook_service.dart'; + +/// Class that bundles a ComponentIsolationGenerator and an AITHandler +/// to generate the component isolation package according to the type. +class ComponentIsolationConfiguration { + ComponentIsolationGenerator generator; + AITHandler service; + + ComponentIsolationConfiguration._internal(this.generator, this.service); + + factory ComponentIsolationConfiguration.getConfiguration( + String type, PBGenerationProjectData projectData) { + switch (type) { + case 'widgetbook': + return ComponentIsolationConfiguration._internal( + WidgetbookGenerator(projectData), WidgetBookService()); + default: + return null; + } + } +} diff --git a/lib/interpret_and_optimize/services/component_isolation/component_isolation_service.dart b/lib/interpret_and_optimize/services/component_isolation/component_isolation_service.dart deleted file mode 100644 index adf6afd9..00000000 --- a/lib/interpret_and_optimize/services/component_isolation/component_isolation_service.dart +++ /dev/null @@ -1,24 +0,0 @@ -import 'package:parabeac_core/controllers/interpret.dart'; -import 'package:parabeac_core/generation/flutter_project_builder/post_gen_tasks/comp_isolation/component_isolation_configuration.dart'; -import 'package:parabeac_core/generation/flutter_project_builder/post_gen_tasks/comp_isolation/widgetbook/widgetbook_configuration.dart'; -import 'package:parabeac_core/interpret_and_optimize/services/component_isolation/widgetbook_service.dart'; - -abstract class ComponentIsolationService extends AITHandler {} - -class ComponentIsolationFactory { - static final Map _isolationServices = { - 'widgetbook': - ComponentIsolationTuple(WidgetBookService(), WidgetbookConfiguration()), - }; - static ComponentIsolationTuple getTuple(String serviceName) => - _isolationServices[serviceName]; -} - -/// Class that holds a [ComponentIsolationService] and the [ComponentIsolationConfiguration] that -/// will be executed after the interpretation is complete. -class ComponentIsolationTuple { - final ComponentIsolationService service; - final ComponentIsolationConfiguration configuration; - - ComponentIsolationTuple(this.service, this.configuration); -} diff --git a/lib/interpret_and_optimize/services/component_isolation/widgetbook_service.dart b/lib/interpret_and_optimize/services/component_isolation/widgetbook_service.dart index 7523d357..e95baa73 100644 --- a/lib/interpret_and_optimize/services/component_isolation/widgetbook_service.dart +++ b/lib/interpret_and_optimize/services/component_isolation/widgetbook_service.dart @@ -1,3 +1,4 @@ +import 'package:parabeac_core/controllers/interpret.dart'; import 'package:parabeac_core/generation/flutter_project_builder/post_gen_tasks/comp_isolation/widgetbook/entities/widgetbook_category.dart'; import 'package:parabeac_core/generation/flutter_project_builder/post_gen_tasks/comp_isolation/widgetbook/entities/widgetbook_folder.dart'; import 'package:parabeac_core/generation/flutter_project_builder/post_gen_tasks/comp_isolation/widgetbook/entities/widgetbook_use_case.dart'; @@ -8,10 +9,9 @@ import 'package:parabeac_core/interpret_and_optimize/entities/pb_shared_instance import 'package:parabeac_core/interpret_and_optimize/entities/pb_shared_master_node.dart'; import 'package:parabeac_core/interpret_and_optimize/helpers/pb_intermediate_node_tree.dart'; import 'package:parabeac_core/interpret_and_optimize/helpers/pb_context.dart'; -import 'package:parabeac_core/interpret_and_optimize/services/component_isolation/component_isolation_service.dart'; import 'package:recase/recase.dart'; -class WidgetBookService extends ComponentIsolationService { +class WidgetBookService extends AITHandler { /// Map that holds the name of the folder as its key, and the folder as its value. // FIXME: The reason these are static is because otherwise we'd need a service that can @@ -21,6 +21,7 @@ class WidgetBookService extends ComponentIsolationService { static Map _widgetBookWidgets; static WidgetBookCategory category = WidgetBookCategory(); static final treeIds = []; + WidgetBookService() { _widgetBookFolders = {}; _widgetBookWidgets = {}; diff --git a/lib/main.dart b/lib/main.dart index 282a5d6a..46786b4f 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -7,12 +7,12 @@ import 'package:parabeac_core/interpret_and_optimize/entities/pb_shared_master_n import 'package:parabeac_core/controllers/main_info.dart'; import 'package:parabeac_core/generation/flutter_project_builder/file_system_analyzer.dart'; import 'package:parabeac_core/generation/flutter_project_builder/flutter_project_builder.dart'; +import 'package:parabeac_core/interpret_and_optimize/helpers/component_isolation_configuration.dart'; import 'package:parabeac_core/interpret_and_optimize/helpers/pb_configuration.dart'; import 'package:parabeac_core/interpret_and_optimize/helpers/pb_context.dart'; import 'package:parabeac_core/interpret_and_optimize/helpers/pb_intermediate_node_tree.dart'; import 'package:parabeac_core/interpret_and_optimize/helpers/pb_plugin_list_helper.dart'; import 'package:parabeac_core/interpret_and_optimize/helpers/pb_project.dart'; -import 'package:parabeac_core/interpret_and_optimize/services/component_isolation/component_isolation_service.dart'; import 'package:parabeac_core/interpret_and_optimize/services/design_to_pbdl/design_to_pbdl_service.dart'; import 'package:parabeac_core/interpret_and_optimize/services/design_to_pbdl/figma_to_pbdl_service.dart'; import 'package:parabeac_core/interpret_and_optimize/services/design_to_pbdl/json_to_pbdl_service.dart'; @@ -170,12 +170,14 @@ ${parser.usage} await fpb.preGenTasks(); /// Get ComponentIsolationService (if any), and add it to the list of services - var isolationTuple = ComponentIsolationFactory.getTuple( - MainInfo().configuration.componentIsolation); - if (isolationTuple != null) { - interpretService.aitHandlers.add(isolationTuple.service); + var isolationConfiguration = ComponentIsolationConfiguration.getConfiguration( + MainInfo().configuration.componentIsolation, + pbProject.genProjectData, + ); + if (isolationConfiguration != null) { + interpretService.aitHandlers.add(isolationConfiguration.service); fpb.postGenTasks.add(IsolationPostGenTask( - isolationTuple.configuration, fpb.generationConfiguration)); + isolationConfiguration.generator, fpb.generationConfiguration)); } await indexFileFuture; From fb667afb423589f6eccb361ec1b098cac37f301b Mon Sep 17 00:00:00 2001 From: Ivan <42812006+ivan-015@users.noreply.github.com> Date: Wed, 16 Feb 2022 15:33:22 -0700 Subject: [PATCH 18/23] Add OAuth option to core for figma If the user wants to use an OAuth token from figma, they can do so via the --oauth command argument. If both OAuth and Personal Access Tokens are given, OAuth will be used. --- lib/controllers/main_info.dart | 5 ++++- .../services/design_to_pbdl/figma_to_pbdl_service.dart | 3 ++- lib/main.dart | 10 +++++++--- pbdl | 2 +- 4 files changed, 14 insertions(+), 6 deletions(-) diff --git a/lib/controllers/main_info.dart b/lib/controllers/main_info.dart index 8178bcad..62c179a9 100644 --- a/lib/controllers/main_info.dart +++ b/lib/controllers/main_info.dart @@ -57,7 +57,10 @@ class MainInfo { String get projectName => _projectName ?? configuration?.projectName; set projectName(String name) => _projectName = name; - /// API needed to do API callls + /// OAuth Token to call Figma API + String figmaOauthToken; + + /// API key needed to do API calls String figmaKey; /// Project ID on Figma diff --git a/lib/interpret_and_optimize/services/design_to_pbdl/figma_to_pbdl_service.dart b/lib/interpret_and_optimize/services/design_to_pbdl/figma_to_pbdl_service.dart index 02a19b8c..e5a70fba 100644 --- a/lib/interpret_and_optimize/services/design_to_pbdl/figma_to_pbdl_service.dart +++ b/lib/interpret_and_optimize/services/design_to_pbdl/figma_to_pbdl_service.dart @@ -11,7 +11,8 @@ class FigmaToPBDLService implements DesignToPBDLService { Future callPBDL(MainInfo info) { return PBDL.fromFigma( info.figmaProjectID, - info.figmaKey, + key: info.figmaKey, + oauthKey: info.figmaOauthToken, outputPath: p.join(info.genProjectPath, 'lib', 'assets'), // Generating all assets inside lib folder for package isolation pngPath: p.join(info.genProjectPath, 'lib', 'assets', 'images'), diff --git a/lib/main.dart b/lib/main.dart index 61881dca..90297b9a 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -55,6 +55,7 @@ final parser = ArgParser() help: 'Takes in a Parabeac Design Logic (PBDL) JSON file and exports it to a project', ) + ..addOption('oauth', help: 'Figma OAuth Token') ..addFlag('help', help: 'Displays this help information.', abbr: 'h', negatable: false) ..addFlag('export-pbdl', @@ -265,6 +266,7 @@ void collectArguments(ArgResults arguments) { /// Detect platform info.platform = Platform.operatingSystem; + info.figmaOauthToken = arguments['oauth']; info.figmaKey = arguments['figKey']; info.figmaProjectID = arguments['fig']; @@ -296,7 +298,8 @@ void collectArguments(ArgResults arguments) { /// is [DesignType.PBDL].Finally, if none of the [DesignType] applies, its going to default /// to [DesignType.UNKNOWN]. DesignType determineDesignTypeFromArgs(ArgResults arguments) { - if (arguments['figKey'] != null && arguments['fig'] != null) { + if ((arguments['figKey'] != null || arguments['oauth'] != null) && + arguments['fig'] != null) { return DesignType.FIGMA; } else if (arguments['path'] != null) { return DesignType.SKETCH; @@ -383,7 +386,7 @@ void addToAmplitude() async { /// types of intake to parabeac-core bool hasTooManyArgs(ArgResults args) { var hasSketch = args['path'] != null; - var hasFigma = args['figKey'] != null || args['fig'] != null; + var hasFigma = args['figKey'] != null || args['fig'] != null || args['oauth']; var hasPbdl = args['pbdl-in'] != null; var hasAll = hasSketch && hasFigma && hasPbdl; @@ -395,7 +398,8 @@ bool hasTooManyArgs(ArgResults args) { /// to parabeac-core bool hasTooFewArgs(ArgResults args) { var hasSketch = args['path'] != null; - var hasFigma = args['figKey'] != null && args['fig'] != null; + var hasFigma = + (args['figKey'] != null || args['oauth'] != null) && args['fig'] != null; var hasPbdl = args['pbdl-in'] != null; return !(hasSketch || hasFigma || hasPbdl); diff --git a/pbdl b/pbdl index a04e2974..c3c4398f 160000 --- a/pbdl +++ b/pbdl @@ -1 +1 @@ -Subproject commit a04e2974714714a00b147c0b9e892a4aac5fb7a1 +Subproject commit c3c4398f24af0eb869da7ed5d162d4a868f5573d From 029ccdad9a2bc28b62b1193b128c1344a6b794bd Mon Sep 17 00:00:00 2001 From: Ivan <42812006+ivan-015@users.noreply.github.com> Date: Thu, 17 Feb 2022 22:33:53 -0700 Subject: [PATCH 19/23] Update PBDL Ref --- pbdl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pbdl b/pbdl index c3c4398f..39cb9497 160000 --- a/pbdl +++ b/pbdl @@ -1 +1 @@ -Subproject commit c3c4398f24af0eb869da7ed5d162d4a868f5573d +Subproject commit 39cb949751312d0e34a4a25c6b57949eef676ee1 From 804c328ced43b213c596c7750d2a52235af9779d Mon Sep 17 00:00:00 2001 From: Ivan <42812006+ivan-015@users.noreply.github.com> Date: Sun, 20 Feb 2022 13:05:44 -0700 Subject: [PATCH 20/23] Fix assets not showing up in pubspec.yaml --- lib/generation/generators/writers/pb_flutter_writer.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/generation/generators/writers/pb_flutter_writer.dart b/lib/generation/generators/writers/pb_flutter_writer.dart index 22739ef1..7cd10a1f 100644 --- a/lib/generation/generators/writers/pb_flutter_writer.dart +++ b/lib/generation/generators/writers/pb_flutter_writer.dart @@ -110,7 +110,7 @@ class MyApp extends StatelessWidget { /// Add dependency for each asset for (var assetName in assets) { - if (!yamlAssets.any((str) => str.endsWith(assetName))) { + if (!yamlAssets.any((str) => str.endsWith('/$assetName'))) { yamlAssets.add( 'packages/${MainInfo().projectName}/assets/images/$assetName'); } From 3c58239245150b8f937386d0fb3b1dce3cc95459 Mon Sep 17 00:00:00 2001 From: Ivan <42812006+ivan-015@users.noreply.github.com> Date: Mon, 21 Feb 2022 14:50:00 -0700 Subject: [PATCH 21/23] Add oauth option to parabeac.dart --- parabeac.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/parabeac.dart b/parabeac.dart index 0c9043a8..d35d55c9 100644 --- a/parabeac.dart +++ b/parabeac.dart @@ -35,6 +35,7 @@ main(List args) async { help: 'Takes in a Parabeac Design Logic (PBDL) JSON file and exports it to a project. The user should specify the absolute path of the location of the PBDL JSON file following this option. Example: `dart parabeac.dart --pbdl-in /path/to/pbdl.json -o /path/to/output/dir/`', ) + ..addOption('oauth', help: 'Figma OAuth Token') ..addFlag('export-pbdl', help: 'This flag outputs Parabeac Design Logic (PBDL) in JSON format. This flag is to be used along with Figma or Sketch conversion options.') From 57fd1c7077e6705ff1a33b0d3c415cb47b125650 Mon Sep 17 00:00:00 2001 From: Ivan <42812006+ivan-015@users.noreply.github.com> Date: Tue, 22 Feb 2022 00:21:24 -0700 Subject: [PATCH 22/23] Changed to version 2.4.0 --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index bd88919d..de9000ac 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: parabeac_core description: A starting point for Dart libraries or applications. -version: 2.3.0 +version: 2.4.0 # homepage: https://www.example.com environment: From c6bf10bd6860d18ae57825938a866bcb585f528a Mon Sep 17 00:00:00 2001 From: Ivan <42812006+ivan-015@users.noreply.github.com> Date: Tue, 22 Feb 2022 11:32:36 -0700 Subject: [PATCH 23/23] Add `componentIsolation` as an option in `configurations.json` --- lib/configurations/configurations.json | 3 ++- .../helpers/component_isolation_configuration.dart | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/configurations/configurations.json b/lib/configurations/configurations.json index d745b6e1..89102854 100644 --- a/lib/configurations/configurations.json +++ b/lib/configurations/configurations.json @@ -10,5 +10,6 @@ "desktop": 1280 }, "scaling": true, - "enablePrototyping": false + "enablePrototyping": false, + "componentIsolation": "none" } diff --git a/lib/interpret_and_optimize/helpers/component_isolation_configuration.dart b/lib/interpret_and_optimize/helpers/component_isolation_configuration.dart index 71a43ae5..1f48b56c 100644 --- a/lib/interpret_and_optimize/helpers/component_isolation_configuration.dart +++ b/lib/interpret_and_optimize/helpers/component_isolation_configuration.dart @@ -14,7 +14,7 @@ class ComponentIsolationConfiguration { factory ComponentIsolationConfiguration.getConfiguration( String type, PBGenerationProjectData projectData) { - switch (type) { + switch (type.toLowerCase()) { case 'widgetbook': return ComponentIsolationConfiguration._internal( WidgetbookGenerator(projectData), WidgetBookService());