# Node Tutorial - Part 3: Task-Running Common tasks include: - Building an application - Serving an application locally for development purposes - Running your unit tests - Linting your code When you ran your generators in Part 1, you already set up these more common tasks for each project. ## Defining Targets Here's the `project.json` file for your `products-data-client` project: ```json {% fileName="libs/products-data-client/project.json" %} { "name": "products-data-client", "$schema": "../../node_modules/nx/schemas/project-schema.json", "sourceRoot": "libs/products-data-client/src", "projectType": "library", "targets": { "build": { "executor": "@nrwl/js:tsc", "outputs": ["{options.outputPath}"], "options": { "outputPath": "dist/libs/products-data-client", "main": "libs/products-data-client/src/index.ts", "tsConfig": "libs/products-data-client/tsconfig.lib.json", "assets": ["libs/products-data-client/*.md"] } }, "lint": { "executor": "@nrwl/linter:eslint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["libs/products-data-client/**/*.ts"] } }, "test": { "executor": "@nrwl/jest:jest", "outputs": ["{workspaceRoot}/coverage/libs/products-data-client"], "options": { "jestConfig": "libs/products-data-client/jest.config.ts", "passWithNoTests": true } } }, "tags": [] } ``` You can see that three targets are defined here: `build`, `lint` and `test`. The properties inside each of these these targets is defined as follows: - `executor` - which Nx executor to run. The syntax here is: `:` - `outputs` - this is an array of files that would be created by running this target. (This informs Nx on what to save for it's caching mechanisms you'll learn about in [4 - Workspace Optimizations](/node-tutorial/4-workspace-optimization)). - `options` - this is an object defining which executor options to use for the given target. Every Nx executor allows for options as a way to parameterize it's functionality. ## Running Tasks ![Syntax for Running Tasks in Nx](/shared/node-tutorial/run-target-syntax.svg) Run the `build` target for your `products-data-client` project: ```{% command="npx nx build products-data-client" path="~/my-products" %} > nx run products-data-client:build Compiling TypeScript files for project "products-data-client"... Done compiling TypeScript files for project "products-data-client". ——————————————————————————————————————————————————————————————————————————————————————————————— > NX Successfully ran target build for project products-data-client (780ms) ``` You can now find your built `products-data-client` distributable in your `dist/libs/products-data-client` directory, as specified in the `outputPath` property of the `build` target options in your `project.json` file. Next, run a lint check on `products-data-client`: ```{% command="npx nx lint products-data-client" path="~/my-products" %} > nx run products-data-client:lint Linting "products-data-client"... All files pass linting. ——————————————————————————————————————————————————————————————————————————————————————————————— > NX Successfully ran target lint for project products-data-client (777ms) ``` Next, add some tests to your data client in the `products-data-client.spec.ts` file: ```typescript {% fileName="libs/products-data-client/src/lib/products-data-client.spec.ts" %} import { createProductsDataClient, exampleProducts, } from './products-data-client'; describe('productsDataClient', () => { it('should get all example products', async () => { const productsDataClient = createProductsDataClient(); const products = await productsDataClient.getProducts(); expect(products).toEqual(Object.values(exampleProducts)); }); it('should get example product by id', async () => { const productsDataClient = createProductsDataClient(); const product = await productsDataClient.getProductById('1'); expect(product).toEqual(exampleProducts['1']); }); }); ``` And then run your `test` target: ```{% command="npx nx test products-data-client" path="~/my-products" %} > nx run products-data-client:test PASS products-data-client libs/products-data-client/src/lib/products-data-client.spec.ts productsDataClient ✓ should get all example products (1 ms) ✓ should get example product by id Test Suites: 1 passed, 1 total Tests: 2 passed, 2 total Snapshots: 0 total Time: 0.843 s Ran all test suites. ——————————————————————————————————————————————————————————————————————————————————————————————— > NX Successfully ran target test for project products-data-client (2s) ``` ## What's Next - Continue to [4: Workspace Optimization](/node-tutorial/4-workspace-optimization)