# fx create

The `fx create` command generates scaffolding for new projects. See `fx create --help` for
usage details.

## Running tests

The tests should be included in the build along with the `//tools/create` target.

* Run all tests: `fx test //tools/create`
* Run only golden tests: `fx test //tools/create/goldens`

The golden projects have their unit tests run as well. To only run host tests,
pass the `--host` flag to `fx test`.

## Adding a new project type

1. Add a new directory with the project type name under `//tools/create/templates/`.
2. Populate the directory with the intended project structure
    * Name all template files with the `.tmpl` extension or `.tmpl-<lang>` for
      language-specific template files.
    * Use `{{PROJECT_NAME}}` in a file/directory name to substitute the user's `PROJECT_NAME`.
3. Edit the `templates` target in `//tools/create/templates/BUILD.gn` to include all your new
   template files.
4. Add the project type to the help doc-string in `CreateArgs` in `//tools/create/src/main.rs`.
5. Create a golden project in `//tools/create/goldens`.
    * Use the `fx create` command to create a golden project, using the `--override-copyright-year 2020`
      flag. This makes sure that tests don't start failing in 2021+.
6. Add a test target to `//tools/create/goldens/BUILD.gn`.
    * See the existing tests for examples. Use the template in `//tools/create/goldens/golden_test.gni`.
    * The test will generate a project and compare it with your golden project.
    * Execute the test with `fx test //tools/create/goldens`.

## Templates

### Layout

Each top-level directory in `//tools/create/templates` corresponds to a project type
of the same name.

Files with the `.tmpl` and `.tmpl-*` extensions in these directories are [handlebars] templates.
Template expansion is performed on the templates and the directory structure is replicated in
the new project directory.

Templates with the `.tmpl` extension are language agnostic.

Templates with the `.tmpl-<lang>` extension are expanded only when the user supplies the
`--lang=<lang>` flag.

Multiple languages can be supported in the same template directory. For instance, the
`component-v2` command supports `cpp` and `rust` languages by having both a `BUILD.gn.tmpl-cpp`
and `BUILD.gn.tmpl-rust` file.

Partial templates are fragments of template files that can be included by other templates.
Partial templates begin with `_` and can be included in a template with the `{{>name_of_partial}}`
without the leading `_`.

Only partial templates at the root or within the project type directory being executed are
available to a template.

E.g. file layout:

* `templates/`
  - `_copyright.tmpl`
  - `component-v2/`
    * `_common.tmpl`

When creating a project of type `component-v2`, the partial templates `_copyright.tmpl` and
`component-v2/_header.tmpl` are visible and can be executed with `{{>copyright}}` and
`{{>component-v2/header}}`.

### Variables

The template expansion uses [handlebars] syntax. Expand a variable with the syntax `{{VAR_NAME}}`.

The available variable names are:

* `COPYRIGHT_YEAR`: Today's year, eg. 2020, for use in copyright headers,
* `PROJECT_NAME`: The user-specified project name,
* `PROJECT_PATH`: The path from the fuchsia root directory to the new project,
* `PROJECT_TYPE`: The project-type as specified on the command line, e.g: 'component-v2'.
* `TEMPLATE_PATH`: The path to the source template being executed.

Path names are also treated as template strings and can contain [handlebars] syntax.

Eg. `component/meta/{{PROJECT_NAME}}.cml.tmpl` with `PROJECT_NAME="foo"` expands to `meta/foo.cml`.

#### Adding a new variable

To make a new variable accessible to templates, add it to `TemplateArgs` in
`//tools/create/src/main.rs`.

### Helpers

Helper functions can be invoked with the syntax `{{helper VAR_NAME}}`.

The available helper functions are:

* `pascal_case`: Converts a string argument into *P*ascal*C*ase,
* `snake_case`: Converts a string argument into snake*_*case,
* `screaming_snake_case`: Converts a string argument into SCREAMING_SNAKE_CASE,

#### Adding a new helper

To make a new helper function accessible to templates, follow instructions in
`//tools/create/src/template_helpers.rs`.

[handlebars]: https://docs.rs/handlebars
