# Cocy
The main Cocy package.
## Usage
```ts
const cocy = new Cocy(options?);
```
## Options
See [`CocyOptions.ts`](./src/types/CocyOptions.ts).
## Files
Files are stored as a map at `cocy.files`. You can for example get a file by its absolute path using `cocy.files.get(absolutePath)`.
The properties of each file object are described [here](./src/CocyFile.ts).
```ts
// it's a map - don't forget `values`
for (const file of cocy.files.values()) {
console.log(file.attributes.title);
}
```
## Methods
### `cocy.use()`
```ts
cocy.use(plugin, ...options?)
```
The plugin function will be invoked, allowing it to register hooks on the instance. The `cocy` instance will be passed as the first parameter, followed by all specified options.
### `cocy.find()`
Search for files and add them. Promise is fulfilled, once all files have been found and transformed by registered plugins.
### `cocy.resolveAsset()`
```ts
cocy.resolveAsset(asset, file, key?)
```
Resolve an asset using the asset resolver. If a key is specified, it will be added to the file's asset map and can be retrieved by using `file.assets.get(key)`. See Assets below for more.
### `cocy.startWatcher()`
Start watching for file-system changes.
### `cocy.stopWatcher()`
Stop watching for file-system changes.
## Events
You can hook into events on the instance. See the [Houk API docs](https://github.com/krmax44/houk#api) for more info on event listeners.
```ts
cocy.on('fileAdded', (file: CocyFile) => {
// we got a new file!
console.log(file.slug);
});
```
| Event | Parameters | Description |
| ------------- | --------------------------------------- | ------------------------------------------------- |
| `fileAdded` | `CocyFile` | A new file was added. |
| `fileRemoved` | `CocyFile` | A file was removed. |
| `fileUpdated` | `CocyFile` | A file's content was changed. |
| `fileChanged` | `CocyFile` | Any of the upper events occured to a file. |
| `assetAdded` | `CocyAsset`, `CocyFile`, `CocyAssetKey` | A new asset was added. See Assets below for more. |
## Assets
Allowing files to reference assets is often a basic requirement for content-based sites. For example, you might have a blog post like this in Markdown format:
```md
I went to Hamburg last summer:

```
Let's use the image tag as an example. By default, the file URLs will be kept, resulting in `
`. Depending on your environment, this might not be desirable. To transform the file URLs, you can listen for `assetAdded` events:
```js
import path from 'path';
cocy.on('assetAdded', async (resolve, asset, file) => {
// here, asset is "./hamburg.jpg"
// file is the Cocy File object
if (asset.startsWith('./')) {
// it's a relative file path!
// use the file's path as a base
const absolute = path.join(file.path.absolute, '..', asset);
// in this example, we might want to use an image cdn
const url = await myCdn.upload(absolute);
// url might be https://cdn.photos/hamburg.jpg
resolve(url);
}
});
```
This would result in `
`.