Let's Learn AdonisJS 6 Rocket

Let's Learn AdonisJS 6

82 Lessons
9h 48m

In this series, we'll learn AdonisJS 6 step-by-step in a beginner-friendly way. Covering topics like routing, controllers, services, EdgeJS, Lucid ORM, forms, filtering, authentication, etc.

Module 1 › Introduction (5 lessons)

Video preview
Introducing AdonisJS
Let's Learn AdonisJS 6 #1.0
・
Jan 24

Introducing AdonisJS

In this lesson, we'll introduce AdonisJS by giving a brief overview of what it is and what it offers. We'll also talk about some of its first-party and framework-agnostic packages.

Video preview
Before We Begin
Let's Learn AdonisJS 6 #1.1
・
Jan 24

What We'll Need Before We Begin

In this lesson, we'll talk about some prerequisites to AdonisJS and this series. These include installing NodeJS, VS Code, a database environment, and Redis.

Video preview
Creating A New AdonisJS Project
Let's Learn AdonisJS 6 #1.2
・
Jan 24

Creating A New AdonisJS 6 Project

In this lesson, we'll create our first AdonisJS 6 project and learn how we can boot it up and open it within VS Code.

Video preview
Project Structure
Let's Learn AdonisJS 6 #1.3
・
Jan 24

Project Structure

In this lesson, we'll learn how AdonisJS uses our project to boot up and which folders and files within our project matter as we get started with learning AdonisJS 6

Video preview
VS Code Extensions and Configuration
Let's Learn AdonisJS 6 #1.4
・
Jan 24

VS Code Extensions and Configuration

In this lesson, we'll install three extensions for VS Code from the AdonisJS Core Team to make our lives easier as we build applications. We'll also configure Prettier and ESLint with auto-formatting and lint fixing on save.

Module 2 › Fundamentals (18 lessons)

Video preview
Routes and How To Create Them
Let's Learn AdonisJS 6 #2.0
・
Jan 24

Routes and How To Create Them

In this lesson, we'll learn how to define routes within AdonisJS and how those routes work.

Video preview
Rendering a View for a Route
Let's Learn AdonisJS 6 #2.1
・
Jan 24

Rendering a View for a Route

In this lesson, we'll learn how we can use the EdgeJS Template Engine to render HTML views and send them back as the response for our routes. We'll also see how we can pass dynamic data into our views from our route handler.

Video preview
Linking Between Routes
Let's Learn AdonisJS 6 #2.2
・
Jan 24

Linking Between Routes

In this lesson, we'll learn how we can link between the routes we have defined in our application. We'll also learn about the importance of HTTP Method verbs and resources to standardize our route definitions.

Video preview
Loading A Movie Using Route Parameters
Let's Learn AdonisJS 6 #2.3
・
Jan 24

Loading A Movie Using Route Parameters

In this lesson, we'll learn how we can reuse a route definition using route parameters to show any item we have for our movie resource.

Video preview
Valdating Route Parameters
Let's Learn AdonisJS 6 #2.4
・
Jan 24

Validating Route Parameters

In this lesson, we'll learn how we can return a 404 Not Found exception when someone tries to view a movie that doesn't exist. We'll then learn how we can validate our route parameters using Regular Expressions or matchers.

Video preview
Vite and Our Assets
Let's Learn AdonisJS 6 #2.5
・
Jan 24

Vite and Our Assets

In this lesson, we'll learn how Vite is integrating into our EdgeJS views to serve our JavaScript and CSS files.

Video preview
Settings Up Tailwind CSS
Let's Learn AdonisJS 6 #2.6
・
Jan 24

Setting Up Tailwind CSS

In this lesson, we'll learn how to install and configure PostCSS and Tailwind CSS within our AdonisJS 6 project using Vite.

Video preview
Markdown Content
Let's Learn AdonisJS 6 #2.7
・
Jan 27

Reading and Supporting Markdown Content

In this lesson, we'll learn how we can support Markdown content by switching our movies from HTML to Markdown. To do this, we'll make use of the DimerApp Markdown package.

Video preview
Listing Movies from their Markdown Files
Let's Learn AdonisJS 6 #2.8
・
Jan 27

Listing Movies from their Markdown Files

In this lesson, we'll learn how we can list movies and their details directly from our movies directory using a YAML-based declaration called frontmatter.

Video preview
Let's Learn AdonisJS 6 #2.9
・
Jan 27

Extracting Reusable Code with Services

In this lesson, we'll learn about services and how we can use them to extract reusable code in a way that makes it super simple to use throughout your project.

Video preview
Cleaning Up Routes with Controllers
Let's Learn AdonisJS 6 #2.10
・
Jan 31

Cleaning Up Routes with Controllers

In this lesson, we'll learn what controllers are and how they can be used to drastically simplify our route definitions by allowing us to move our route handlers off the route definition and into the controller.

Video preview
Structuring Data with Models
Let's Learn AdonisJS 6 #2.11
・
Jan 31

Defining A Structure for our Movie using Models

In this lesson, we'll introduce the concept of models by using one to define the properties our movies should contain. We'll then stub some methods that will mock calls we'll later be able to use to load data from our database.

Video preview
Singleton Services and the Idea of Caching
Let's Learn AdonisJS 6 #2.12
・
Jan 31

Singleton Services and the Idea of Caching

In this lesson, we'll learn about singleton services and how to use them as a store to hold temporary information throughout our server's life by building a simple in-memory caching service.

Video preview
Environment Variables
Let's Learn AdonisJS 6 #2.13
・
Feb 04

Environment Variables and their Validation

In this lesson, we'll learn how we can securely store sensitive and environment-based variables using our .env file. We'll also learn how AdonisJS adds type-safety to these variables using our env.ts file as validation.

Video preview
Improving Our Cache with Redis
Let's Learn AdonisJS 6 #2.14
・
Feb 04

Improved Caching with Redis

In this lesson, we'll install and configure the AdonisJS Redis package. We'll then swap out our singleton in-memory cache service with a Redis cache implementation.

Video preview
Deleting Items and Flushing our Redis Cache
Let's Learn AdonisJS 6 #2.15
・
Feb 04

Deleting Items and Flushing our Redis Cache

Not everyone is perfect, and one day you'll accidentally cache bad data and need a way to quickly clear it out. In this lesson, we'll learn how we can create two routes to clear a single Redis key or flush the entire database.

Video preview
Custom Starter Kits
Let's Learn AdonisJS 6 #2.16
・
Feb 06

Quick Start Apps with Custom Starter Kits

In this lesson, we'll take a look at AdonisJS' bring your own kit feature that allows us to use Git repositories as starter kits when creating a new AdonisJS application.

Video preview
NodeJS Subpath Imports
Let's Learn AdonisJS 6 #2.17
・
Feb 06

Easy Imports with NodeJS Subpath Imports

In this lesson, we'll learn about NodeJs Subpath Imports and how AdonisJS leverages them to help simplify our import paths throughout our application.

Module 3 › Building Views with EdgeJS (11 lessons)

Video preview
EdgeJS Templating Basics
Let's Learn AdonisJS 6 #3.0
・
Feb 10

EdgeJS Templating Basics

In this lesson, we'll learn the basics of AdonisJS's homegrown template engine EdgeJS. We'll cover interpolation, conditional statements, looping, variables, state, and more!

Video preview
EdgeJS HTML and ClassNames Utiltiies
Let's Learn AdonisJS 6 #3.1
・
Feb 10

HTML Attribute and Class Utilities

In this lesson, we'll take a look at a few powerful utilities provided by EdgeJS that make working with attributes and conditional classes a breeze.

Video preview
Making A Reusable Movie Card Component
Let's Learn AdonisJS 6 #3.2
・
Feb 10

Making A Reusable Movie Card Component

In this lesson, we'll learn how we can make a movie card component with EdgeJS that we can define once and easily use throughout our markup.

Video preview
Component Tags, State, and Props
Let's Learn AdonisJS 6 #3.3
・
Feb 13

Component Tags, State, and Props

In this lesson, we'll learn how to use EdgeJS components within AdonisJS as direct tags. We'll also learn about our component's state and props

Video preview
Making A Button Component Using Slots
Let's Learn AdonisJS 6 #3.4
・
Feb 13

Use Slots To Make A Button Component

In this lesson, we'll learn about EdgeJS component slots by making a versatile button component that can gracefully handle both links and button types.

Video preview
Extracting A Layout Component
Let's Learn AdonisJS 6 #3.5
・
Feb 13

Extracting A Layout Component

In this lesson, we'll learn how we can create EdgeJS layouts using components so that we don't have to redefine or HTML structure for every page in our application.

Video preview
State vs Share Data Flow
Let's Learn AdonisJS 6 #3.6
・
Feb 17

State vs Share Data Flow

In this lesson, we'll learn about the difference between passing information directly into EdgeJS' state and sharing information with EdgeJS.

Video preview
Share vs Global Data Flow
Let's Learn AdonisJS 6 #3.7
・
Feb 17

Share vs Global Data Flow

In this lesson, we'll compare the difference between sharing information with an EdgeJS instance and defining a Global within EdgeJS.

Video preview
Form Basics and CSRF Protection
Let's Learn AdonisJS 6 #3.8
・
Feb 17

Form Basics and CSRF Protection

In this lesson, we'll cover the basics of working with HTML forms in AdonisJS and how they incorporate Cross-Site Request Forgery (CSRF) protection via AdonisJS Shield.

Video preview
HTTP Method Spoofing HTML Forms
Let's Learn AdonisJS 6 #3.9
・
Feb 17

HTTP Method Spoofing HTML Forms

In this lesson, we'll learn how we can enable HTTP Method Spoofing to allow AdonisJS to spoof intended HTTP Verbs for basic HTML form POST requests.

Video preview
Easy SVG Icons with Edge Iconify
Let's Learn AdonisJS 6 #3.10
・
Feb 21

Easy SVG Icons with Edge Iconify

In this lesson, we'll learn how we can install and use the edge-iconify package giving us super easy access within our EdgeJS files to any of the SVG icon packages available through Iconify.

Module 4 › Database and Lucid ORM Basics (18 lessons)

Video preview
Configuring Lucid and our Database Connection
Let's Learn AdonisJS 6 #4.0
・
Feb 21

Configuring Lucid and our Database Connection

In this lesson, we'll learn how we can configure Lucid to use a different driver other than SQLite; PostgreSQL is shown but MySQL and MSSQL are much the same. Then, we'll set up our connection details so that we can successfully connect to our database.

Video preview
Let's Learn AdonisJS 6 #4.1
・
Feb 21

Understanding our Database Schema

In this lesson, we'll walk through how to understand a database schema diagram. We'll then discuss the schema we'll be working with throughout this series; describing the tables, columns, data types, and relationships.

Video preview
Let's Learn AdonisJS 6 #4.2
・
Feb 24

Introducing and Defining Database Migrations

In this lesson, we'll introduce database migrations. We'll learn what they are, why they're great to have, and how we can create and use them to define our database tables and their columns.

Video preview
The Flow of Migrations
Let's Learn AdonisJS 6 #4.3
・
Feb 24

The Flow of Migrations

In this lesson, we'll learn about the various migration-based commands made available by the Ace CLI and how they interact with our migration files. We'll use these commands to run, rollback, and refresh our migrations against our database.

Video preview
Introducing Lucid Models
Let's Learn AdonisJS 6 #4.4
・
Feb 28

Introducing Lucid Models

In this lesson, we'll introduce models using the Lucid ORM. We'll learn how we can map database columns to our model properties and specify special behavior for our date time columns.

Video preview
Defining Our Models
Let's Learn AdonisJS 6 #4.5
・
Feb 28

Defining Our Models

In this lesson, we'll walk through the process of defining all our database tables and columns as models and properties within our application.

Video preview
The Basics of CRUD
Let's Learn AdonisJS 6 #4.6
・
Mar 02

The Basics of CRUD

In this lesson, we'll walk through the basics of creating, reading, updating, and deleting (CRUD) data from our database using our Lucid Models.

Video preview
Defining Required Data with Seeders
Let's Learn AdonisJS 6 #4.7
・
Mar 02

Defining Required Data with Seeders

Our database will have specific, non-changing, roles and movie statuses. In this lesson, we'll learn how we can quickly and easily create these records inside of our database using seeders.

Video preview
Fake Data Factories
Let's Learn AdonisJS 6 #4.8
・
Mar 02

Stubbing Fake Data with Model Factories

In this lesson, we'll learn how we can quickly and easily bulk-create dummy/fake data within our database for each of our Lucid Models using Model Factories

Video preview
Querying Our Movies with the Query Builder
Let's Learn AdonisJS 6 #4.9
・
Mar 05

Querying Our Movies with the Query Builder

In this lesson, we'll introduce both the database and model query builder. We'll learn the differences between the two and the basics of how to use them.

Video preview
Umapped and Computed Model Properties
Let's Learn AdonisJS 6 #4.10
・
Mar 05

Unmapped and Computed Model Properties

In this lesson, we'll learn how to add unmapped and computed properties to our Lucid Models. We'll discuss the differences between a model column, unmapped property, and a computed property.

Video preview
Altering Tables with Migrations
Let's Learn AdonisJS 6 #4.11
・
Mar 05

Altering Tables with Migrations

In this lesson, we'll learn how to alter our database tables using migrations both while in development, where we can delete our data, and once our data has already hit production where we need to persist all data.

Video preview
Adding A User Profile Model, Migration, Factory, and Controller
Let's Learn AdonisJS 6 #4.12
・
Mar 11

Adding A Profile Model, Migration, Factory, and Controller

Uh oh, a new requirement has come in and now we also need to account for user profiles! In this lesson, we'll learn how we can easily create a new model, migration, factory, and controller for an entity in one fell swoop!

Video preview
SQL Parameters and Injection Protection
Let's Learn AdonisJS 6 #4.13
・
Mar 11

SQL Parameters and Injection Protection

In this lesson, we'll learn about SQL Parameters, also called query bindings, and how using them helps safeguard our database from malicious attacks attempting to perform SQL Injection.

Video preview
Reusable Query Statements with Model Query Scopes
Let's Learn AdonisJS 6 #4.14
・
Mar 11

Reusable Query Statements with Model Query Scopes

In this lesson, we'll learn about Model Query Scopes and how we can use them to create easily reusable query statements that we can apply using the Model Query Builder.

Video preview
Altering Factory States
Let's Learn AdonisJS 6 #4.15
・
Mar 15

Tapping into Model Factory States

In this lesson, we'll dive a little bit deeper into Model Factories by introducing factory states. We'll also learn how we can use the tap method to alter a factory result prior to it persisting into the database

Video preview
Querying Recently Released and Releasing Soon Movies
Let's Learn AdonisJS 6 #4.16
・
Mar 15

Querying Recently Released and Coming Soon Movies

In this lesson, we'll learn how to use the Model Query Builder to query our movies that have been recently released. We'll then do a separate query to get movies that are coming soon.

Video preview
Generating A Movie Slug Using Model Hooks
Let's Learn AdonisJS 6 #4.17
・
Mar 15

Generating A Unique Movie Slug With Model Hooks

In this lesson, we'll learn how we can use Model Hooks to generate a unique URL-safe slug based on the movie's title.

Module 5 › Lucid ORM Relationships (14 lessons)

Video preview
Defining One to One Relationships
Let's Learn AdonisJS 6 #5.0
・
Mar 18

Defining One to One Relationships Within Lucid Models

In this lesson, we'll learn how to define one-to-one relationships within our Lucid Models. We'll learn about the belongs to and has one decorators, their options, and types that make this possible.

Video preview
Factory Relationships
Let's Learn AdonisJS 6 #5.1
・
Mar 18

Model Factory Relationships

In this lesson, we'll learn how to use relationships with our Model Factories; easing our capabilities to quickly generate fake data with relationships.

Video preview
Querying Relationships and Eager Vs Lazy Loading
Let's Learn AdonisJS 6 #5.2
・
Mar 18

Querying Relationships and Eager Vs Lazy Loading

In this lesson, we'll learn how we can query our relationships using our Lucid Models. We'll then learn what the difference is between eagerly loading a relationship (load) and lazily loading a relationship (preload).

Video preview
Cascading and Deleting Model Relationships
Let's Learn AdonisJS 6 #5.3
・
Mar 22

Cascading and Deleting Model Relationships

In this lesson, we'll learn how to account for foreign key constraints when deleting relationships using our Lucid Models. We'll then learn how we can automatically cascade deletions through to relationships.

Video preview
Defining One to Many Relationships with Lucid Models
Let's Learn AdonisJS 6 #5.4
・
Mar 22

Defining One to Many Relationships with Lucid Models

In this lesson, we'll learn how to define one-to-many and many-to-one relationships using Lucid Models. We'll also learn how we can specify the columns that should be used for a relationship, allowing us to use one model for multiple relationships.

Video preview
One to Many Factory Relationships
Let's Learn AdonisJS 6 #5.5
・
Mar 22

Seeding Movies with One to Many Model Factory Relationships

In this lesson, we'll learn how we can use Model Factory Relationships to create a pool of cineasts to bind to our movies. This will create cineasts bound to many movies as a writer, director, or both.

Video preview
Listing A Director's Movies with Relationship Existance Queries
Let's Learn AdonisJS 6 #5.6
・
Mar 26

Listing A Director's Movies with Relationship Existence Queries

In this lesson, we'll learn how we can perform a relationship existence check to grab a list of our cineasts who have directed one or more movies. We'll then create a show page for that director, listing the movies that they directed.

Video preview
Listing and Counting a Writer's Movies
Let's Learn AdonisJS 6 #5.7
・
Mar 26

Listing and Counting a Writer's Movies

In this lesson, we'll learn how we can perform multiple different relationship counts with the same relationship using the Model Query Builder. We'll count our writer's total number of released and not-released movies.

Video preview
Using Eager and Lazy Loading to Load A Movie's Writer and Director
Let's Learn AdonisJS 6 #5.8
・
Mar 26

Using Eager and Lazy Loading to Load A Movie's Writer and Director

In this lesson, we'll learn how we can use eager loading to preload our writer and director onto our movie's details. We'll then, learn how we can load our writer and director onto our movie's details using lazy loading.

Video preview
Defining Many to Many Relationships
Let's Learn AdonisJS 6 #5.9
・
Apr 02

Defining Many-To-Many Relationships and Pivot Columns

In this lesson, we'll learn how you can define many-to-many relationships within your Lucid ORM Models. We'll also discuss the relationship options, and how you can automatically include pivot table data with all queries.

Video preview
Many to Many Relationship Model Factories
Let's Learn AdonisJS 6 #5.10
・
Apr 02

Many-To-Many Model Factory Relationships

In this lesson, we'll learn how we can define and use many-to-many relationships with Model Factories, including how we can define pivot table data when creating our fake records.

Video preview
Relationship CRUD
Let's Learn AdonisJS 6 #5.11
・
Apr 02

A Deep Dive Into Relationship CRUD with Models

In this lesson, we'll take a deep look at how we can perform CRUD operations with one-to-one, one-to-many, many-to-one, and many-to-many relationships using our Lucid Models.

Video preview
Data Pools
Let's Learn AdonisJS 6 #5.12
・
Apr 05

How To Create Factory Relationships from a Pool of Data

In this lesson, we'll learn how we can refactor our fake data seeder to allow us to assign cast members and crew members to our movies via our many-to-many relationships from a single pool of cineast records.

Video preview
Sorting and Filtering Pivot Table Data
Let's Learn AdonisJS 6 #5.13
・
Apr 05

How To Query, Sort, and Filter by Pivot Table Data

In this lesson, we'll learn how we can query pivot table data. We'll then learn how we can also sort and filter our results by those pivot table columns as well.

Module 6 › Working With Forms (7 lessons)

Video preview
Accepting Form Data
Let's Learn AdonisJS 6 #6.0
・
Apr 05

Accepting Form Data

In this lesson, we'll take a look at how we can create a register form and accept data from that form within our route handler.

Video preview
Validating Form Data with VineJS
Let's Learn AdonisJS 6 #6.1
・
Apr 09

Validating Form Data with VineJS

In this lesson, we'll learn how to validate form data using AdonisJS homegrown validation library, VineJS. With VineJS we can easily ensure our request body consists of properties we need, in the types we need them, with valid values.

Video preview
Displaying Validation Errors
Let's Learn AdonisJS 6 #6.2
・
Apr 09

Displaying Validation Errors and Validating from our Request

In this lesson, we'll learn how we can display feedback for invalid fields noted by errors from our VineJS validators. We'll also see how we can validate directly from our request using request data.

Video preview
Reusing Old Form Value After A Validation Error
Let's Learn AdonisJS 6 #6.3
・
Apr 09

Reusing Old Form Values After A Validation Error

In this lesson, we'll learn how we can easily repopulate our form input values with their previously submitted values when our VineJS validator finds and sends back an error.

Video preview
Creating An EdgeJS Form Input Component
Let's Learn AdonisJS 6 #6.4
・
Apr 12

Creating An EdgeJS Form Input Component

In this lesson, we'll create a form input component with EdgeJS to simplify adding inputs throughout our application and to extract away old value and validation error logic.

Video preview
Creating A Login Form and Validator
Let's Learn AdonisJS 6 #6.5
・
Apr 12

Creating A Login Form and Validator

In this lesson, we'll apply what we've learned to create a login page as well as a validator for our login form.

Video preview
How To Create A Custom VineJS Validation Rule
Let's Learn AdonisJS 6 #6.6
・
Apr 12

How To Create A Custom VineJS Validation Rule

In this lesson, we'll learn how to make a custom validation rule with VineJS that requires a value to be unique for the provided table and column. We'll learn how we can register this rule for both strings and number types.

Module 7 › Authentication & Middleware (7 lessons)

Video preview
Adocasts Plus Exclusive
Free in 5 days
The Flow of Middleware
Let's Learn AdonisJS 6 #7.0
・
Apr 20

The Flow of Middleware

In this lesson, we'll learn about the middleware that comes preinstalled within AdonisJS and the flow of this middleware during an HTTP Request at both a global and route-specific scale.

Video preview
Adocasts Plus Exclusive
Free in 5 days
Authenticating A Newly Registered User
Let's Learn AdonisJS 6 #7.1
・
Apr 20

Authenticating A Newly Registered User

In this lesson, we'll learn how we can authenticate, or login, a new user who just registered with our application. We'll then see how we can populate the authenticated user's details on subsequent requests.

Video preview
Adocasts Plus Exclusive
Free in 5 days
Checking For and Populating an Authenticated User
Let's Learn AdonisJS 6 #7.2
・
Apr 20

Checking For and Populating an Authenticated User

In this lesson, we'll create a silent auth middleware that will automatically check whether a request has an authenticated user attached to it, and populate that user's details if one is found.

Video preview
Adocasts Plus Exclusive
Free in 9 days
Logging Out An Authenticated User
Let's Learn AdonisJS 6 #7.3
・
Apr 24

Logging Out An Authenticated User

In this lesson, we'll learn how to logout an authenticated user using a POST request with CSRF protection.

Video preview
Adocasts Plus Exclusive
Free in 9 days
Logging In An Existing User
Let's Learn AdonisJS 6 #7.4
・
Apr 24

Logging In An Existing User

In this lesson, we'll learn how we can login an existing user using just their email and password. We'll discuss how the AuthFinder mixin protects us from timing attacks, and how we can use it to verify the accuracy of a user's password.

Video preview
Adocasts Plus Exclusive
Free in 9 days
Remembering A User's Authenticated Session
Let's Learn AdonisJS 6 #7.5
・
Apr 24

Remembering A User's Authenticated Session

In this lesson, we'll learn how we can use AdonisJS' Remember Me Tokens feature to allow a user to specify they'd like their authentication state to be remembered for a long time across sessions.

Video preview
Adocasts Plus Exclusive
Free in 12 days
Protecting Routes with Auth, Guest, and Admin Middleware
Let's Learn AdonisJS 6 #7.6
・
Apr 27

Protecting Routes with Auth, Guest, and Admin Middleware

In this lesson, we'll learn about the auth and guest middleware included when we created our AdonisJS 6 project. Then, we'll create our own named middleware that will allow us to restrict page access to only users with the admin role.

Module 8 › Filtering and Paginating Queries (2 lessons)

Video preview
Adocasts Plus Exclusive
Free in 12 days
Creating A Movie List Page
Let's Learn AdonisJS 6 #8.0
・
Apr 27

Creating A Movie List Page

In this lesson, we'll create a page to list all of our movies. Since we have a lot of movies, in this module, we'll focus on adding filters and pagination to this list.

Video preview
Adocasts Plus Exclusive
Free in 12 days
Filtering A Query By Pattern Likeness
Let's Learn AdonisJS 6 #8.1
・
Apr 27

Filtering A Query By Pattern Likeness

In this lesson, we'll learn how to add a pattern filter to our movies.index page that will allow us to filter our movies list by title using a case-insensitive pattern search.

excited robot

More in the works!

Add to your watchlist to get notified when new lessons are added

Sign in or sign up to add to your watchlist