Dart - Brick Generator
A simple command-line application which allows to generate the template of a brick from a project which compiles.
With an entrypoint in bin/
, library code in lib/
.
How to use
- Add your app in
apps/
. - Add
brickgen.yaml
in you app folder and add this fields:
name: brick_name
description: An awesome brick
version: 0.1.0
vars:
bundle_id:
compilable: io.wyattapp.new
type: string
description: The bundle id used in Android and iOS
default: io.wyattapp.new
prompt: "What is the bundle id?"
flutter:
type: boolean
description: If this app is a Flutter or Dart project.
default: false
prompt: "Is it Flutter app ?"
brickgen:
path_to_brickify: brick_folder
ignore:
- .env
- node_modules/
hooks: true
boolean_file_system:
flutter:
folders:
on_true:
- android
- ios
on_false:
- bin
files:
on_true:
- l10n.yaml
- trapeze.yaml
Project structure must be like:
apps
├── brick_name
│ ├── brickgen.yaml
│ ├── hooks
│ │ └── pre_gen.dart
│ ├── brick_folder
│ │ └── ... compilable project
Then run command with project path
dart ./tools/brick_generator/bin/brickgen.dart ./apps/brick_name ./bricks/
Available options:
-h, --help Show this help dialog
-v, --verbose Show additional diagnostic info
-r, --remove-empty Remove empty folders (if not it creates .gitkeep in each empty folders)
TODO
- hooks
- post hooks
- pre hooks
- add partial hooks
- bool variables
- boolean file system
- boolean mapping
- enum variables
- array variables
Current specification
File Structure
apps
├── <brick_name>
│ ├── brickgen.yaml
│ ├── hooks
│ │ └── pre_gen.dart
│ ├── <brick_folder>
│ │ └── ... compilable project
Brick (Mason)
name: <brick_name>
description: <brick_description>
version: 0.1.0
vars:
...
- name: the brick name (will be in
brick.yaml
) - description: the brick description (will be in
brick.yaml
) - version: the brick version (will be in
brick.yaml
) - vars: the brick variables (will be in
brick.yaml
)
String variable
name:
compilable: <compilable>
type: string
description: <description>
default: <default>
prompt: <prompt>
formats:
- ...
- name: the variable name (will be in
brick.yaml
)- compilable: the variable compilable name used in brickgen project
- type: variable type, here string, (will be in
brick.yaml
) - default: default value (will be in
brick.yaml
) - prompt: the displayed prompt at the brick generation (will be in
brick.yaml
) - formats: optional list of formats that are detected.
- if no formats provided, all possible syntaxes are detected.
Boolean variable
name:
type: boolean
description: <description>
default: <default>
prompt: <prompt>
- name: the variable name (will be in
brick.yaml
)- type: variable type, here string, (will be in
brick.yaml
) - default: default value (will be in
brick.yaml
) - prompt: the displayed prompt at the brick generation (will be in
brick.yaml
)
- type: variable type, here string, (will be in
Identical to Mason
Brickgen
brickgen:
path_to_brickify: <brick_folder>
ignore:
- ...
hooks: true
boolean_file_system:
...
- path_to_brickify: the path of the compilable project that will be brickified
- ignore: list of the ignored files and folders.
- be sure to add an
/
at the end of the folders name.
- be sure to add an
- hooks: copy or not
hooks
folder - boolean_file_system: list of the boolean file system variables
Boolean File System
boolean_file_system:
boolean:
folders:
on_true:
- ...
on_false:
- ...
files:
on_true:
- ...
on_false:
- ...
- boolean: name of the
boolean
variable used. - folders
- on_true: list of the folders includes if the variable is
true
- on_true: list of the folders includes if the variable is
false
- on_true: list of the folders includes if the variable is
- files
- on_true: list of the files includes if the variable is
true
- on_true: list of the files includes if the variable is
false
- on_true: list of the files includes if the variable is
on_true
andon_false
are optionnal. (You are allowed to set one or two of them).
Specifications (WIP)
File structure:
apps
├── <brick_name>
│ ├── brickgen.yaml
│ ├── hooks
│ │ └── pre_gen.dart
│ ├── <brick_folder>
│ │ └── ... compilable project
Configuration: brickgen.yaml
name: <brick_name>
description: <brick_description>
version: 0.1.0
vars:
display_name:
compilable: Display Name
type: string
description: The display name
default: Display Name
prompt: "What is the display name?"
formats:
- title_case
project_name:
compilable: wyatt_app_template
type: string
description: The project name
default: wyatt_app
prompt: "What is the project name?"
formats:
- snake_case
bundle_id:
compilable: io.wyattapp.new
type: string
description: The bundle id used in Android and iOS
default: io.wyattapp.new
prompt: "What is the bundle id?"
formats:
- dot_case
flutter:
type: boolean
description: If this app is a Flutter or Dart project.
default: false
prompt: "Is it Flutter app ?"
brickgen:
path_to_brickify: <brick_folder>
ignore:
- .env
- node_modules/
hooks: true
boolean_mapping:
flutter:
folders:
- "test":
on_true: "test"
on_false: "test_dart"
files:
- "pubspec.yaml":
on_true: pubspec.yaml
on_false: pubspec.dart.yaml
boolean_file_system:
flutter:
folders:
on_true:
- android
- ios
on_false:
- bin
files:
on_true:
- l10n.yaml
- trapeze.yaml
Will generate:
bricks
├── <brick_name>
│ ├── brick.yaml
│ ├── hooks
│ │ └── pre_gen.dart
│ ├── __brick__
│ │ └── <brick_folder>
It creates a sub folder in brick
How copy works
- Case 1
apps
├── brick_1
│ ├── brickgen.yaml
│ ├── hooks
│ │ └── pre_gen.dart
│ ├── brick_1
│ │ ├── lib/
│ │ └── pubspec.yaml
...
name: awesome_brick_1
brickgen:
path_to_brickify: brick_1
hooks: true
...
dart ./tools/brick_generator/bin/brickgen.dart ./apps/brick_1 ./bricks/
Will generate:
bricks
├── awesome_brick_1
│ ├── brick.yaml
│ ├── hooks
│ │ └── pre_gen.dart
│ ├── __brick__
│ │ ├── lib/
│ │ └── pubspec.yaml
- Case 2
apps
├── brick_2
│ ├── brickgen.yaml
│ ├── hooks
│ │ └── pre_gen.dart
│ ├── brick_2
│ │ ├── lib
│ │ │ └── widget.dart
│ │ └── pubspec.yaml
...
name: awesome_brick_2
brickgen:
path_to_brickify: brick_2/lib
hooks: false
...
dart ./tools/brick_generator/bin/brickgen.dart ./apps/brick_2 ./bricks/
Will generate:
bricks
├── awesome_brick_2
│ ├── brick.yaml
│ ├── __brick__
│ │ └── widget.dart