# 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: ```yaml 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 ```sh dart ./tools/brick_generator/bin/brickgen.dart ./apps/brick_name ./bricks/ ``` Available options: ```text -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 - [x] post hooks - [x] pre hooks - [ ] add partial hooks * [ ] bool variables - [x] boolean file system - [ ] boolean mapping * [ ] enum variables * [ ] array variables ## Current specification ### File Structure ``` apps ├── │ ├── brickgen.yaml │ ├── hooks │ │ └── pre_gen.dart │ ├── │ │ └── ... compilable project ``` ### Brick (Mason) ```yaml name: 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 ```yaml name: compilable: type: string description: default: 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 ```yaml name: type: boolean description: default: 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`) > Identical to Mason ### Brickgen ```yaml brickgen: path_to_brickify: 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. - hooks: copy or not `hooks` folder - boolean_file_system: list of the boolean file system variables #### Boolean File System ```yaml 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` - 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` and `on_false` are optionnal. (You are allowed to set one or two of them). ## Specifications (WIP) File structure: ``` apps ├── │ ├── brickgen.yaml │ ├── hooks │ │ └── pre_gen.dart │ ├── │ │ └── ... compilable project ``` Configuration: `brickgen.yaml` ```yaml name: 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: 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.yaml │ ├── hooks │ │ └── pre_gen.dart │ ├── __brick__ │ │ └── ``` > 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 ``` ```yaml ... name: awesome_brick_1 brickgen: path_to_brickify: brick_1 hooks: true ... ``` ```sh 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 ``` ```yaml ... name: awesome_brick_2 brickgen: path_to_brickify: brick_2/lib hooks: false ... ``` ```sh dart ./tools/brick_generator/bin/brickgen.dart ./apps/brick_2 ./bricks/ ``` Will generate: ``` bricks ├── awesome_brick_2 │ ├── brick.yaml │ ├── __brick__ │ │ └── widget.dart ```