# Autocompletion & Typings

{% hint style="success" %}
This is the official documentation of the `@forestadmin/agent` Node.js agent.
{% endhint %}

Since the Forest Admin agent is fully written in TypeScript, every function has autocompletion capabilities. The agent can generate typing files based on your models.

This allows:

* Autocompletion of collection names and fields
* Typing validation on all your handlers (when using TypeScript)

### Generate a typing file

The typing file generated by Forest Admin will allow you to autocomplete any given fields of a collection. This is an auto-generated file, so we highly suggest not editing it manually.

In the following sections, you can see that two options are given to the `createAgent` function:

* `typingsPath`: The location you want your typing file to be created.
* `typingsMaxDepth`: The maximum depth of introspection for relationships.

### Using the typing file in a TypeScript context

In a TypeScript context, the usage of the typing file is pretty straightforward. You can simply import the typing file and template your `createAgent` with the schema to use it.

{% tabs %}
{% tab title="agent.ts" %}

```typescript
import { createAgent } from '@forestadmin/agent';
import { Schema } from './typings';
import transactions from './customization/transactions';

await createAgent<Schema>({
  // ...
  typingsPath: './typings.ts',
  typingsMaxDepth: 5,
})
  .customizeCollection('transactions', transactions)
  .mountOnStandaloneServer(3000)
  .start();
```

{% endtab %}

{% tab title="customization/transactions.ts" %}

```typescript
import { CollectionCustomizer } from '@forestadmin/agent';
import { Schema } from '../typings';

export default (transactions: CollectionCustomizer<Schema, 'transactions'>) =>
  transactions.removeField('amountInEur');
```

{% endtab %}
{% endtabs %}

You should be able to see that the `customizeCollection` method is strongly typed, as well as the `transactions` handler.

### Using the typing file in a JavaScript context

You can still benefit from it in a JavaScript environment by using the JSDoc syntax.

If you choose to split your `customizeCollection` handler in a dedicated file (That's the project scaffolding we usually use at Forest Admin), you can use the following JSDoc example to keep the autocomplete experience intact.

{% tabs %}
{% tab title="agent.js" %}

```javascript
const { createAgent } = require('@forestadmin/agent');
const transactions = require('./customization/transactions');

/**
 * Importing the typing file to keep the autocompletion
 * @typedef {import('@forestadmin/agent').Agent} Agent
 * @typedef {import('../typings').Schema} Schema
 */

/**
 * @type {Agent<Schema>}
 */
const agent = createAgent({
  //...
  typingsPath: './typings.ts',
  typingsMaxDepth: 5,
});

await agent
  .customizeCollection('transactions', transactions)
  .mountOnStandaloneServer(3000)
  .start();
```

{% endtab %}

{% tab title="customization/transactions.js" %}

```javascript
/**
 * Importing the typing file to keep the autocompletion
 * @typedef {import('@forestadmin/agent').CollectionCustomizer} CollectionCustomizer
 * @typedef {import('../typings').Schema} Schema
 */

/**
 * @param {CollectionCustomizer<Schema, 'transactions'>} transactions
 */
module.exports = transactions => {
  // Autocompletion should be available here
  transactions.removeField('amountInEur');
};
```

{% endtab %}
{% endtabs %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.forestadmin.com/developer-guide-agents-nodejs/getting-started/install/autocompletion-and-typings.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
