Skip to content

maxlath/couch-init2

Repository files navigation

couch-init2

npm package node

An opiniated CouchDB databases initializer

Takes a list of databases to initialise and their design docs, and make sure that everything is up and running and in sync.

Installation

in a terminal, at the root of your project

# ESM
npm install couch-init2
# CommonJS
npm install couch-init2@5

How To

import couchInit from 'couch-init2'

const dbUrl = 'http://username:password@localhost:5984'
const dbsList = [
   {
     name: 'dbname1',
     designDocs: ['designdoc1']
   },
   {
     name: 'dbname2',
     designDocs: ['designdoc2', 'designdoc3']
   },
   {
     name: 'dbname3',
     designDocs: []
   }
 ]
// Path to the folder where design docs can be found on the model `${designDocName}.json`
// If a design doc file from the list is missing, it will be created with a basic design doc structure
// If a design doc file changed, the database design doc will be updated
const designDocFolder = '/path/to/your/design/docs/folder'

const { ok, operations } = await couchInit(dbUrl, dbsList, designDocFolder)
console.log('ok', res.ok)
console.log('operations', res.operations)
// dbs were successfully initialized!
// time to start your server or whatever crazy thing you're building :)

Design docs formats

json

The JSON format is identical to the document in database, minus the _rev id.

{
  "_id": "_design/example",
  "language": "javascript",
  "views": {
    "byFoo": {
      "map": "function (doc) {\n  if (doc.foo) emit(doc.foo, 1)\n}"
    }
  }
}

js

The JS format allows to use a JS module that exports just the views object, the _id being deduced from the filename (ex: if the file is named foo.js, the _id will be _design/foo)

export default {
  byFoo: {
    map: function (doc) {
      if (doc.foo) emit(doc.foo, 1)
    },
    reduce: function(keys, values) {
      return values.reduce((a, b) => a + b, 0)
    },
  },
  byBar: {
    // The function stringification won't be able to detect variables in scope.
    // In this case, you have to pass the function and its dependencies as a string.
    map: `
      const double = num => num * 2

      function (doc) {
        if (doc.foo) emit(doc.foo, double(1))
      }`,
  },
  byBuzz: {
    // Alternatively, an array of functions can be passed to preserve text editor
    // features such as syntax highlighting or linting
    map: [
      function double (num) { num * 2 },
      function (doc) {
        if (doc.example) emit(doc.example, double(1))
      }
    ]
  },
}

What it does

  • create databases if missing
  • create or update design documents if not up-to-date
  • create security documents if missing

See also

  • couchdb-bootstrap: Bootstrap CouchDB projects: configure, setup security, deploy ddocs and create users.

About

Opiniated CouchDB databases initializer

Topics

Resources

Stars

Watchers

Forks

Packages

No packages published