# CLI Tool

The Nodewood CLI Tool (opens new window) is designed to help you easily build, develop, and maintain your Nodewood project. It wraps common functionality, meaning you don't have to learn the ins and outs of other command-line tools (like Knex or Docker), and performs advanced tasks (like synchronizing your subscription configuration with Stripe's servers).

Install the CLI tool globally to help you develop inside your Nodewood project:

yarn global add @nodewood/cli

Current version: 0.14.1

# Creating a new project

To create a new Nodewood project, consult the Create a project section of the Installation page of the documentation.

# Running/Rolling back migrations

While Nodewood uses MassiveJS (opens new window) for database access, it doesn't come with a built-in migrations library. So for this purpose, we use the excellent migrations capabilities of Knex.JS (opens new window). To run existing migrations, run:

nodewood migrate

This will run all migrations from the app/migrations and wood/migrations folders. You can optionally add --test to the end of the command (nodewood migrate --test) to run migrations against the test database.

To rollback the most-recent set of changes, run:

nodewood rollback

Again, you can add --test to the end of the command (nodewood rollback --test) to rollback the most recent set of changes from the test database.

This should handle the vast majority of cases you'll encounter for migrations, but should you require anything more complex, you should consult the Knex.JS migrations documentation (opens new window).

# Starting the Nodewood development server/watchers

From the root of your Nodewood project, you can start the development server processes with:

nodewood dev

This will use docker-compose to start a PostgreSQL process, an Nginx process, the Express API process, and the Webpack UI process. The API and UI processes will be running in "watch mode", and will automatically restart when relevant changes are detected.

You can tell when the API process has finished loading/reloading when you see the following line:

api_1       | [1604162327094] INFO  (95 on 94cc2d49b5a7): Express app listening on port port 3000. 🌲

You can tell when the UI process has finished loading/reloading when you see the following line:

ui_1        |  DONE  Build complete. Watching for changes...

When you start the development server the first time, you will need to wait until both log lines have been emitted before accessing the server, though the UI one will be the last to log in nearly ever case.

Provided you are not running a web server on your host machine, it will bind to standard http/https (80/443) ports, and you can visit your site by going to your browser and entering https://localhost. You will need to accept a certificate exception, since the development server runs using a self-signed certificate, but since this server is for development only and is completely under your control, this does not actually pose any risks.

If you are running a web server on your host machine, you will either have to shut it down while developing with Nodewood, or modify the Nodewood docker files to run on non-standard ports.

# Adding new files to your project from a template

You can always add a new file to your project by creating a blank file in the correct location, but if you want a template to start from, you can use the nodewood add command.

For more information on how this command works, refer to the documentation on the different file types, as they will have detailed information on how to add templates there.

# Ejecting files from the wood folder

Since a file in the app folder will supercede a file in the same location in the wood folder, you will occasionally want to add and modify your own versions of these files. You can use the eject command to copy a file from the wood folder to the correct location in the app folder automatically. The easiest way to do this is to find the include/require statement in your files, copy the location, and paste it into your terminal. So from:

import LoadingSpinner from '#ui/components/LoadingSpinner';

You would run the following command:

nodewood eject ui/components/LoadingSpinner

This will copy the file from wood/ui/components/LoadingSpinner.vue to app/ui/components/LoadingSpinner.vue. This file will now be used every time you import #ui/components/LoadingSpinner, including all the changes you make to it.

If you eject a file and then get an error about a module cannot be found, see this note about eject and workspaces.

# Upgrading your Nodewood installation

To upgrade your local Nodewood installation (the wood folder), run:

nodewood up

This will first check what upgrade version your license gives you access to, present the migration notes for all versions between yours and that version, and confirm that you wish to upgrade. Then, it will replace the contents of the wood folder in your project with the upgraded contents.

For this reason, it is strongly recommended to never change the contents of the wood folder, as it could be removed at any point.

Occasionally, you may find that the Upgrade command will require you to have a more-recent version of the Nodewood CLI tool, which you can get by running:

yarn global add @nodewood/cli

This will ensure you have the latest version of the nodewood tool, and access to all the updated commands detailed in this documentation.

# Running tests

In order to run your project's tests, run:

nodewood test

This will spin up a temporary docker container, run any files with .test.js or .spec.js as their extension, then remove that container.

To run a specific test file (or pattern), you can append that filename (or pattern) to the command, like nodewood test app/features/foo/api/controllers/__tests__/BarsController.test.js.

# Adding a Prefix to your Tailwind CSS classes

Certain CSS frameworks use classes that can conflict with Tailwind's. Thankfully, Tailwind comes with the option to define a prefix (opens new window) to avoid these conflicts. Nodewood is developed using the base class names, but you can rename these classes to use your chosen prefix with the following command:

nodewood tailwind:prefix

This will request a prefix from you, ensure it ends in a hyphen, and update all .vue files in app and wood with the provided prefix.

Note: If your app/tailwind.config.js file contains a prefix entry, this entry will automatically be prepended to Tailwind classes in wood whenever you run nodewood up.