couchdb-compile
Version:
Build CouchDB documents from fs.
152 lines (114 loc) • 3.33 kB
Markdown
# couchdb-compile
Build CouchDB documents from directory, JSON or module.
## API
`compile(source[, options], callback)`
* `source` - Can be an object, a [CouchDB Directory Tree](#the-couchdb-directory-tree) (see below), a JSON file or a CommonJS module
* `options.index` - When set to `true`, folders are searched for `index.js`, which, if present, is treated as CommonJS module. Default is `false`.
* `options.multipart` - When set to `true`, attachments are handled as multipart. Default is `false`.
* `callback` - called when done with two arguments: `error` and `doc`.
In case `options.multipart` is set, `callback` is called with a third argument:
`attachments`. This is a multipart attachments array as required by [nanos
`db.multipart.insert`](https://github.com/dscape/nano#dbmultipartinsertdoc-attachments-params-callback):
```js
{
name: 'rabbit.png',
content_type: 'image/png',
data: <Buffer>
}
```
`data` can be a `Buffer` or a `String`.
### Example
```js
var compile = require('couchdb-compile');
compile('project/couchdb', function(error, doc) {
// doc is a compile object now
});
```
## CLI
```sh
couchdb-compile [SOURCE] [OPTIONS]
```
When `SOURCE` is omitted, the current directory will be used.
`OPTIONS` can be `--index` and `--pretty`, see above.
Use `--pretty` to get a pretty printed json output.
### Example
```sh
couchdb-compile project/couchdb
couchdb-compile project/couchdb --pretty
```
## Stringifying Functions
If there is a function inside source (passed as object or path to CommonJS
module), functions get stringified by calling `toString` on them.
eg:
```js
compile({
foo: function () {
return 42
}
}, (error, result) => {
// {
// foo: 'function () {\n return 42\n}'
// }
})
```
## The CouchDB Directory Tree
`couchdb-compile` uses a filesystem mapping similar to [Couchapp python
tool](https://github.com/couchapp/couchapp) and
[Erica](https://github.com/benoitc/erica):
[The Couchapp Filesystem
Mapping](https://github.com/couchapp/couchapp/wiki/Complete-Filesystem-to-Design-Doc-Mapping-Example).
It is quite self-explanatory. For example:
```sh
myapp
├── _id
├── language
└── views
└── numbers
├── map.js
└── reduce.js
```
becomes:
```json
{
"_id": "_design/myapp",
"language": "javascript",
"views": {
"numbers": {
"map": "function...",
"reduce": "function..."
}
}
}
```
See `test/fixtures` and `test/expected` for usage examples.
### IDs
If you do not include an `_id` property, the filename will be used.
### File Extensions
For property names file extensions will be stripped:
```js
{
"validate_doc_update": "content of validate_doc_update.js",
}
```
### Attachments
Files inside the `_attachments` directory are handled special:
They become attachment entries of the form
```js
{
"a/file.txt": {
"data": "SGVsbG8gV29ybGQhCg==",
"content_type": "text/plain"
}
}
```
The `content_type` is computed using
[mime](https://github.com/broofa/node-mime), with a fallback to
`application/octet-stream`. `data` is the base64 encoded value of the file.
Read more about [Inline
Attachments](http://wiki.apache.org/couchdb/HTTP_Document_API#Inline_Attachments).
## Tests
```sh
npm test
```
(c) 2014-2018 Johannes J. Schmidt
Apache 2.0 License