# Function: collection()

```ts
function collection<N, S, L, M>(definition): CollectionDefinition<N, S, L, M>;
```

Defined in: [packages/core/src/schema/collection-def.ts:115](https://github.com/leifriksheim/minca/blob/main/core/src/schema/collection-def.ts#L115)

A collection definition, kept as written: its validator's type comes along,
so querying or writing with it is typed, and its computed fields and
contract are typed from its schema, its name and the collections they read.

```ts
const todo = collection({
  name: 'app.todo',
  schema: z.object({ text: z.string() }),
  computed: ({ linked }) => {
    const thumbs = linked(reaction, 'on').where((r) => r.body.emoji.eq('👍')).count();
    return { thumbs, done: thumbs.gte(2) };
  },
});
await node.collections.define(space.id, todo);
const { records } = await node.records.query(space.id, { collection: todo });
records[0]?.computed.done; // boolean | null
```

## Type Parameters

| Type Parameter | Default type |
| ------ | ------ |
| <a id="type-parameter-n"></a> `N` *extends* `string` | - |
| <a id="type-parameter-s"></a> `S` *extends* \| [`JsonSchema`](https://minca.dev/api/core/type-aliases/JsonSchema.md) \| [`StandardJSONSchemaV1`](https://minca.dev/api/core/interfaces/StandardJSONSchemaV1.md)\<`unknown`, `unknown`\> | - |
| <a id="type-parameter-l"></a> `L` *extends* `Readonly`\<`Record`\<`string`, `LinkDeclaration`\>\> | `Record`\<`never`, `never`\> |
| <a id="type-parameter-m"></a> `M` *extends* `Readonly`\<`Record`\<`string`, [`CelExpr`](https://minca.dev/api/core/interfaces/CelExpr.md)\<`unknown`\> \| `Literal`\>\> | `Record`\<`never`, `never`\> |

## Parameters

| Parameter | Type |
| ------ | ------ |
| `definition` | [`CollectionDefinition`](https://minca.dev/api/core/interfaces/CollectionDefinition.md)\<`N`, `S`, `L`, `M`\> & `NoClash`\<`S`, `M`\> |

## Returns

[`CollectionDefinition`](https://minca.dev/api/core/interfaces/CollectionDefinition.md)\<`N`, `S`, `L`, `M`\>
